refactor: Overhaul Plugin Architecture & Playground UI (#1846)

* refactor: Move Plugins Out and Consolidate with Multisrc

* feat: Overhaul Playground UI

* feat: Add Filters to New UI

* feat: Persist Selected Plugin

* feat: Add Direct Parse Novel/Chapter Options and Feedback Toasts

[skip ci]

* feat: UX Improvements

* chore: Update Plugin Path in Publish Workflow

* fix: Add Backward Compatibility

* chore: Update Plugin Publishing Script
This commit is contained in:
Rajarshee Chatterjee
2025-10-20 22:54:08 +05:30
committed by GitHub
parent 252beff0bf
commit 20c2b75b01
363 changed files with 6848 additions and 3007 deletions
+288
View File
@@ -0,0 +1,288 @@
[
{
"id": "lightnovelfr",
"sourceSite": "https://lightnovelfr.com/",
"sourceName": "Ligh Novel FR",
"options": {
"lang": "French",
"reverseChapters": true
}
},
{
"id": "kolnovel",
"sourceSite": "https://kolnovel.site/",
"sourceName": "Kol Novel",
"options": {
"lang": "Arabic",
"reverseChapters": true,
"customJs": "$('article > style').text().match(/\\.\\w+(?=\\s*[,{])/g)?.forEach(tag => $(`p${tag}`).remove());$('.epcontent .code-block').remove();",
"versionIncrements": 9
}
},
{
"id": "knoxt",
"sourceSite": "https://knoxt.space/",
"sourceName": "KnoxT",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "bacalightnovel",
"sourceSite": "https://bacalightnovel.co/",
"sourceName": "Baca Light Novel",
"options": {
"lang": "Indonesian",
"reverseChapters": true
}
},
{
"id": "allnovelread",
"sourceSite": "https://allnovelread.com/",
"sourceName": "AllNovelRead",
"options": {
"lang": "Spanish",
"reverseChapters": true
}
},
{
"id": "daotranslate",
"sourceSite": "https://daotranslate.com/",
"sourceName": "DaoTranslate",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "novelsparadise",
"sourceSite": "https://novelsparadise.site/",
"sourceName": "Novels Paradise",
"options": {
"lang": "Arabic",
"reverseChapters": true
}
},
{
"id": "universalnovel",
"sourceSite": "https://universalnovel.com/",
"sourceName": "Universal Novel",
"options": {
"lang": "English",
"reverseChapters": false
}
},
{
"id": "noveltr",
"sourceSite": "https://noveltr.com/",
"sourceName": "NovelTR",
"options": {
"lang": "Turkish"
}
},
{
"id": "noblemtl",
"sourceSite": "https://noblemtl.com/",
"sourceName": "NobleMTL",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "pandamtl",
"sourceSite": "https://pandamtl.com/",
"sourceName": "Panda Machine Translations",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "novelsknight",
"sourceSite": "https://novelsknight.punchmanga.online/",
"sourceName": "NovelsKnight",
"options": {
"lang": "English",
"reverseChapters": true,
"versionIncrements": 2,
"customJs": "$('.announ').remove(); return $('.epcontent').eq(-1).find('p').map(function (i, el) { return '<p>' + $(this).text() + '</p>'; }).toArray().join('\\n') || '';"
}
},
{
"id": "centralnovel",
"sourceSite": "https://centralnovel.com/",
"sourceName": "Central Novel",
"options": {
"lang": "Portuguese",
"reverseChapters": true
}
},
{
"id": "whitemoonlightnovels",
"sourceSite": "https://whitemoonlightnovels.com/",
"sourceName": "White Moonlight Novels",
"options": {
"lang": "English",
"reverseChapters": false
}
},
{
"id": "sektenovel",
"sourceSite": "https://sektenovel.web.id/",
"sourceName": "Sekte Novel",
"options": {
"lang": "Indonesian",
"reverseChapters": true
}
},
{
"id": "systemtranslation",
"sourceSite": "https://systemtranslation.com/",
"sourceName": "System Translation",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "moonlightnovel",
"sourceSite": "https://moonlightnovel.com/",
"sourceName": "Moonlight Novels",
"options": {
"versionIncrements": 1,
"lang": "English",
"reverseChapters": true
}
},
{
"id": "lightnovelbrasil",
"sourceSite": "https://lightnovelbrasil.com/",
"sourceName": "Light Novel Brasil",
"options": {
"lang": "Portuguese",
"reverseChapters": true
}
},
{
"id": "ellotl",
"sourceSite": "https://ellotl.com/",
"sourceName": "ElloTL",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "ippotranslations",
"sourceSite": "https://ippotranslations.com/",
"sourceName": "Ippotranslations",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "cpunovel",
"sourceSite": "https://cpunovel.com/",
"sourceName": "CPUnovel",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "requiemtls",
"sourceSite": "https://requiemtls.com/",
"sourceName": "Requiem Translations",
"options": {
"lang": "English",
"reverseChapters": true,
"customJs": "\n $('div.entry-content script').remove();\n\n const url = this.site + chapterPath.slice(0, -1);\n const offsets = [[0, 12368, 12462], [1, 6960, 7054], [2, 4176, 4270]];\n const idx = url.length * url.charCodeAt(url.length - 1) * 2 % 3;\n const [_, offsetLower, offsetCap] = offsets[idx] ?? offsets[0];\n\n const asciiA = 'A'.charCodeAt(0);\n const asciiz = 'z'.charCodeAt(0);\n\n $('div.entry-content > p').text((_, txt) =>\n txt.split('').map(char => {\n const code = char.charCodeAt(0);\n const offset = (code >= offsetLower + asciiA && code <= offsetLower + asciiz)\n ? offsetLower\n : offsetCap;\n const decoded = code - offset;\n return (decoded >= 32 && decoded <= 126) ? String.fromCharCode(decoded) : char;\n }).join('')\n );\n",
"versionIncrements": 4
}
},
{
"id": "betternovels",
"sourceSite": "https://betternovels.net/",
"sourceName": "Better Novels",
"options": {
"lang": "Portuguese"
}
},
{
"id": "arcane",
"sourceSite": "https://arcanetranslations.com/",
"sourceName": "Arcane Translations",
"options": {
"reverseChapters": true,
"lang": "English",
"hasLocked": true
}
},
{
"id": "namevt",
"sourceSite": "https://namevt.com/",
"sourceName": "Namevt",
"options": {
"reverseChapters": true,
"seriesPath": "seri",
"lang": "Turkish"
}
},
{
"id": "kodekslibrary",
"sourceSite": "https://www.kodekslibrary.com/",
"sourceName": "Kodeks Library",
"options": {
"reverseChapters": true,
"lang": "Turkish"
}
},
{
"id": "vandytranslate",
"sourceSite": "https://vandytranslate.com",
"sourceName": "Vandy Translate",
"options": {
"reverseChapters": true,
"lang": "English"
}
},
{
"id": "lazygirltranslations",
"sourceSite": "https://lazygirltranslations.com",
"sourceName": "Lazy Girl Translations",
"options": {
"reverseChapters": false,
"lang": "English"
}
},
{
"id": "keopi",
"sourceSite": "https://keopitranslations.com",
"sourceName": "Keopi Translations",
"options": {
"lang": "English",
"reverseChapters": true
}
},
{
"id": "TCSega",
"sourceSite": "https://teamchmantranslations.com",
"sourceName": "TC & Sega",
"options": {
"lang": "Spanish",
"reverseChapters": true
}
},
{
"id": "transweaver",
"sourceSite": "https://transweaver.com/",
"sourceName": "Translation Weaver",
"options": {
"lang": "English",
"reverseChapters": true
}
}
]