diff --git a/.dist/nyagami/plugins.json b/.dist/nyagami/plugins.json new file mode 100644 index 0000000..d1f02eb --- /dev/null +++ b/.dist/nyagami/plugins.json @@ -0,0 +1,973 @@ +{ + "العربية": [ + { + "id": "ar-mtl", + "name": "ArMTL[madara]", + "site": "https://ar-mtl.club/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/ArMTL[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/armtl.png" + }, + { + "id": "arnovel", + "name": "ArNovel[madara]", + "site": "https://arnovel.me/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/ArNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/arnovel.png" + }, + { + "id": "hizomanga", + "name": "HizoManga[madara]", + "site": "https://hizomanga.com/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/HizoManga[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/hizomanga.png" + }, + { + "id": "kol-novel", + "name": "Kol Novel[wpmangastream]", + "site": "https://kolnovel.com/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/KolNovel[wpmangastream].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/kol-novel.png" + }, + { + "id": "kolnovel", + "name": "KolNovel", + "site": "https://kolnovel.lol/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/kolnovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/kolnovel.png" + }, + { + "id": "novel4up", + "name": "Novel4Up[madara]", + "site": "https://novel4up.com/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/Novel4Up[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novel4up.png" + }, + { + "id": "riwyat", + "name": "Riwyat[madara]", + "site": "https://riwyat.com/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/Riwyat[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/riwyat.png" + }, + { + "id": "teamxnovel", + "name": "TeamXNovel[madara]", + "site": "https://teamxnovel.com/", + "lang": "العربية", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/TeamXNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/teamxnovel.png" + } + ], + "中文, 汉语, 漢語": [ + { + "id": "linovelib", + "name": "Linovelib", + "site": "https://w.linovelib.com", + "lang": "中文, 汉语, 漢語", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/chinese/linovelib.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/cn/linovelib/icon.png" + } + ], + "English": [ + { + "id": "1stkissnovel", + "name": "FirstKissNovel[madara]", + "site": "https://1stkissnovel.org/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/FirstKissNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/firstkissnovel.png" + }, + { + "id": "anf.net", + "name": "AllNovelFull", + "site": "https://allnovelfull.net", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/allnovelfull.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/allnovelfull/icon.png" + }, + { + "id": "BLN.com", + "name": "BestLightNovel", + "site": "https://bestlightnovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/bestlightnovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/bestlightnovel/icon.png" + }, + { + "id": "boxnovel", + "name": "BoxNovel[madara]", + "site": "https://boxnovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/BoxNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/boxnovel.png" + }, + { + "id": "clicknovel", + "name": "ClickNovel[madara]", + "site": "https://clicknovel.net/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ClickNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/clicknovel.png" + }, + { + "id": "comrademao", + "name": "Comrade Mao", + "site": "https://comrademao.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/comrademao.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/comrademao/icon.png" + }, + { + "id": "cratenovel", + "name": "CrateNovel[madara]", + "site": "https://cratenovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/CrateNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/cratenovel.png" + }, + { + "id": "daonovel", + "name": "DaoNovel[madara]", + "site": "https://daonovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/DaoNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/daonovel.png" + }, + { + "id": "DDL.com", + "name": "Divine Dao Library", + "site": "https://www.divinedaolibrary.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/divinedaolibrary.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/divinedaolibrary/icon.png" + }, + { + "id": "earlynovel", + "name": "Early Novel", + "site": "https://earlynovel.net/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/earlynovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/latestnovel.png" + }, + { + "id": "fanTLS", + "name": "Fans Translations[madara]", + "site": "https://fanstranslations.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/FansTranslations[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/fanstranslations.png" + }, + { + "id": "foxaholic", + "name": "Foxaholic", + "site": "https://www.foxaholic.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/foxaholic.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/foxaholic/icon.png" + }, + { + "id": "freenovel.me", + "name": "FreeNovelMe[madara]", + "site": "https://freenovel.me/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/FreeNovelMe[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/freenovelme.png" + }, + { + "id": "FWN.com", + "name": "Web NOVEL", + "site": "https://freewebnovel.com", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/freewebnovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/freewebnovel/icon.png" + }, + { + "id": "guavaread", + "name": "Guavaread[madara]", + "site": "https://guavaread.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Guavaread[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/guavaread.png" + }, + { + "id": "lightnovelpub", + "name": "LightNovelPub", + "site": "https://www.lightnovelpub.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/lightnovelpub.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/lightnovelpub/icon.png" + }, + { + "id": "LightNovelUpdates", + "name": "Light Novel Updates", + "site": "https://www.lightnovelupdates.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/lightnovelupdates.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/lightnovelupdates/icon.png" + }, + { + "id": "lightnovelworld", + "name": "LightNovelWorld", + "site": "https://www.webnovelworld.org/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/lightnovelworld.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/lightnovelworld/icon.png" + }, + { + "id": "lnheaven", + "name": "LightNovelHeaven[madara]", + "site": "https://lightnovelheaven.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/LightNovelHeaven[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/lightnovelheaven.png" + }, + { + "id": "Ltnovel.com", + "name": "Ltnovel[readwn]", + "site": "https://www.ltnovel.com", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Ltnovel[readwn].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/readwn/icons/ltnovel.png" + }, + { + "id": "lunarletters", + "name": "LunarLetters[madara]", + "site": "https://www.lunarletters.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/LunarLetters[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/lunarletters.png" + }, + { + "id": "mostnovel", + "name": "MostNovel[madara]", + "site": "https://mostnovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MostNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mostnovel.png" + }, + { + "id": "mtl-novel", + "name": "MTL-Novel[madara]", + "site": "https://mtl-novel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MTLNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mtl-novel.png" + }, + { + "id": "mtlnovel", + "name": "MTL Novel", + "site": "https://www.mtlnovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/mtlnovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/mtlnovel/icon.png" + }, + { + "id": "mtlnovel.club", + "name": "MTLNovel.Club[madara]", + "site": "https://mtlnovel.club/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MTLNovelClub[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mtlnovel.club.png" + }, + { + "id": "mtlreader", + "name": "MTL Reader", + "site": "https://mtlreader.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/mtlreader.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/mtlreader/icon.png" + }, + { + "id": "mysticalmerries", + "name": "MysticalSeries[madara]", + "site": "https://mysticalmerries.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MysticalSeries[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mysticalseries.png" + }, + { + "id": "neosekaiTLS", + "name": "NeoSekai Translations[madara]", + "site": "https://www.neosekaitranslations.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NeoSekaiTranslations[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/neosekaitranslations.png" + }, + { + "id": "NF.me", + "name": "NovelFullMe", + "site": "https://novelfull.me/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelFullMe.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelfullme/icon.png" + }, + { + "id": "nitromanga", + "name": "Nitro Manga", + "site": "https://nitromanga.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/nitromanga.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/nitromanga/icon.png" + }, + { + "id": "NO.net", + "name": "novelsOnline", + "site": "https://novelsonline.net", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelOnline.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/coverNotAvailable.jpg" + }, + { + "id": "noblemtl", + "name": "NobleMTL", + "site": "https://noblemtl.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/nobleMTL.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/noblemtl/icon.png" + }, + { + "id": "nocturneTLS", + "name": "Nocturne Translations[madara]", + "site": "https://nocturnetls.net/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NocturneTranslations[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/nocturnetranslations.png" + }, + { + "id": "noobchanTL", + "name": "Noobchan Translation[madara]", + "site": "https://noobchan.xyz/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NoobchanTranslation[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/noobchantranslation.png" + }, + { + "id": "novelbin", + "name": "Novel Bin", + "site": "https://novelmax.net/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelbin.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelbin/icon.png" + }, + { + "id": "novelfull", + "name": "NovelFull", + "site": "https://novelfull.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelfull.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelfull/icon.png" + }, + { + "id": "novelhall", + "name": "Novel Hall", + "site": "https://novelhall.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelhall.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelhall/icon.png" + }, + { + "id": "novelmultiverse", + "name": "NovelMultiverse[madara]", + "site": "https://www.novelmultiverse.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelMultiverse[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelmultiverse.png" + }, + { + "id": "novelr18", + "name": "NovelR18[madara]", + "site": "https://novelr18.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelR18[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelr18.png" + }, + { + "id": "novelroom", + "name": "Novelroom.net[madara]", + "site": "https://novelroom.net/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Novelroomnet[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelroom.net.png" + }, + { + "id": "novelstic", + "name": "Novelstic[madara]", + "site": "https://novelstic.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Novelstic[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelstic.png" + }, + { + "id": "novelTL", + "name": "NovelTranslate[madara]", + "site": "https://noveltranslate.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelTranslate[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/noveltranslate.png" + }, + { + "id": "novelupdates", + "name": "Novel Updates", + "site": "https://www.novelupdates.com/", + "lang": "English", + "version": "0.5.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelupdates.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelupdates/icon.png" + }, + { + "id": "onlymtl", + "name": "OnlyMTL[madara]", + "site": "https://www.onlymtl.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/OnlyMTL[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/onlymtl.png" + }, + { + "id": "pandamtl", + "name": "PandaMTL", + "site": "https://pandamtl.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/pandaMTL.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/wordpress/icon.png" + }, + { + "id": "readwebnovels", + "name": "ReadWebNovels[madara]", + "site": "https://readwebnovels.net/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ReadWebNovels[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/readwebnovels.png" + }, + { + "id": "sleeptTLS", + "name": "SleepyTranslations[madara]", + "site": "https://sleepytranslations.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SleepyTranslations[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sleepytranslations.png" + }, + { + "id": "sonicmtl", + "name": "SonicMTL[madara]", + "site": "https://www.sonicmtl.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SonicMTL[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sonicmtl.png" + }, + { + "id": "sugarbbscan", + "name": "Sugar Babies[madara]", + "site": "https://sugarbbscan.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SugarBabies[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sugarbabies.png" + }, + { + "id": "sweetEscapeTL", + "name": "Sweet Escape Translations[madara]", + "site": "https://sweetescapetranslations.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SweetEscapeTranslations[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sweetescapetranslations.png" + }, + { + "id": "webnovelover", + "name": "WebNovelLover[madara]", + "site": "https://www.webnovelover.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/WebNovelLover[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/webnovellover.png" + }, + { + "id": "wuxiacity", + "name": "Wuxiacity[readwn]", + "site": "https://www.wuxiacity.com", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Wuxiacity[readwn].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/readwn/icons/wuxiacity.png" + }, + { + "id": "wuxiap", + "name": "Wuxiap[readwn]", + "site": "https://www.wuxiap.com", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Wuxiap[readwn].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/readwn/icons/wuxiap.png" + }, + { + "id": "wuxiaworld", + "name": "Wuxia World", + "site": "https://www.wuxiaworld.com/", + "lang": "English", + "version": "0.5.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/wuxiaworld.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/wuxiaworld/icon.png" + }, + { + "id": "wuxiaworld.site", + "name": "WuxiaWorld.Site[madara]", + "site": "https://wuxiaworld.site/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/WuxiaWorldSite[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/wuxiaworld.site.png" + }, + { + "id": "zetroTL", + "name": "Zetro Translation[madara]", + "site": "https://zetrotranslation.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ZetroTranslation[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/zetrotranslation.png" + }, + { + "id": "zinnovel", + "name": "ZinnNovel[madara]", + "site": "https://zinnovel.com/", + "lang": "English", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ZinnNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/zinnnovel.png" + } + ], + "français, française": [ + { + "id": "chireads.com", + "name": "Chireads", + "site": "https://chireads.com", + "lang": "français, française", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/french/chireads.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/fr/chireads/icon.png" + }, + { + "id": "lightnovelfr", + "name": "Ligh Novel FR[wpmangastream]", + "site": "https://lightnovelfr.com/", + "lang": "français, française", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/french/LighNovelFR[wpmangastream].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/lightnovelfr.png" + }, + { + "id": "NDG.com", + "name": "NovelDeGlace", + "site": "https://noveldeglace.com/", + "lang": "français, française", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/french/noveldeglace.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/fr/noveldeglace/icon.png" + } + ], + "Bahasa Indonesia": [ + { + "id": "IDWN.id", + "name": "IndoWebNovel", + "site": "https://indowebnovel.id/id/", + "lang": "Bahasa Indonesia", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/indowebnovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/id/indowebnovel/icon.png" + }, + { + "id": "meionovel", + "name": "MeioNovel[madara]", + "site": "https://meionovel.id/", + "lang": "Bahasa Indonesia", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/MeioNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/meionovel.png" + }, + { + "id": "morenovel", + "name": "MoreNovel[madara]", + "site": "https://morenovel.net/", + "lang": "Bahasa Indonesia", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/MoreNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/morenovel.png" + }, + { + "id": "novelringan.com", + "name": "NovelRingan", + "site": "https://novelringan.com/", + "lang": "Bahasa Indonesia", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/novelringan.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/id/novelringan/icon.png" + }, + { + "id": "sakura.id", + "name": "SakuraNovel", + "site": "https://sakuranovel.id/", + "lang": "Bahasa Indonesia", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/sakuranovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/id/sakuranovel/icon.png" + }, + { + "id": "wbnovel", + "name": "WBNovel[madara]", + "site": "https://wbnovel.com/", + "lang": "Bahasa Indonesia", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/WBNovel[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/wbnovel.png" + } + ], + "日本語": [ + { + "id": "yomou.syosetu", + "name": "Syosetu", + "site": "https://yomou.syosetu.com/", + "lang": "日本語", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/japanese/Syosetu.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/jp/syosetu/icon.png" + } + ], + "한국어, 조선말": [ + { + "id": "agit.xyz", + "name": "Agitoon", + "site": "https://agit501.xyz/", + "lang": "한국어, 조선말", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/korean/Agitoon.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/kr/agitoon/agit.png" + } + ], + "Português": [ + { + "id": "lightnovelbrasil", + "name": "Light Novel Brasil", + "site": "https://lightnovelbrasil.com/", + "lang": "Português", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/portuguese/lightnovelbrasil.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/lightnovelbrasil.png" + } + ], + "русский язык": [ + { + "id": "AT", + "name": "Автор Тудей", + "site": "https://author.today", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/authortoday.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/authortoday/icon.png" + }, + { + "id": "bookhamster", + "name": "Bookhamster[ifreedom]", + "site": "https://bookhamster.ru", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/Bookhamster[ifreedom].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/ifreedom/icons/bookhamster.png" + }, + { + "id": "bookriver", + "name": "Bookriver", + "site": "https://bookriver.ru", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/bookriver.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/bookriver/icon.png" + }, + { + "id": "erolate", + "name": "Erolate[rulate]", + "site": "https://erolate.com", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/Erolate[rulate].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/rulate/icons/erolate.png" + }, + { + "id": "ficbook", + "name": "ficbook", + "site": "https://ficbook.net", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ficbook.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ficbook/icon.png" + }, + { + "id": "freedlit.space", + "name": "LitSpace", + "site": "https://freedlit.space", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/LitSpace.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/freedlit/icon.png" + }, + { + "id": "ifreedom", + "name": "Свободный Мир Ранобэ[ifreedom]", + "site": "https://ifreedom.su", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/СвободныйМирРанобэ[ifreedom].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/ifreedom/icons/ifreedom.png" + }, + { + "id": "jaomix.ru", + "name": "Jaomix", + "site": "https://jaomix.ru", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/jaomix.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/jaomix/icon.png" + }, + { + "id": "ReN", + "name": "Renovels", + "site": "https://renovels.org", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/renovels.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/renovels/icon.png" + }, + { + "id": "RLIB", + "name": "RanobeLib", + "site": "https://ranobelib.me", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ranobelib.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ranobelib/icon.png" + }, + { + "id": "RNBH.org", + "name": "RanobeHub", + "site": "https://ranobehub.org/", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ranobehub.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ranobehub/icon.png" + }, + { + "id": "RNRF", + "name": "РанобэРФ", + "site": "https://ранобэ.рф", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ranoberf.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ranoberf/icon.png" + }, + { + "id": "TL", + "name": "NovelTL", + "site": "https://novel.tl", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/novelTL.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/noveltl/icon.png" + }, + { + "id": "tl.rulate", + "name": "Rulate[rulate]", + "site": "https://tl.rulate.ru", + "lang": "русский язык", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/Rulate[rulate].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/rulate/icons/rulate.png" + } + ], + "español, castellano": [ + { + "id": "awuxia.com", + "name": "ReinoWuxia", + "site": "http://www.reinowuxia.com/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/novelawuxia.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/novelawuxia/icon.png" + }, + { + "id": "HasuTL", + "name": "Hasu Translations", + "site": "https://hasutl.wordpress.com/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/hasutl.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/hasutl/icon.png" + }, + { + "id": "ligera.com", + "name": "Novelas Ligera", + "site": "https://novelasligera.com/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/novelasligera.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/novelasligera/icon.png" + }, + { + "id": "oasisTL.wp", + "name": "Oasis Translations", + "site": "https://oasistranslations.wordpress.com/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/oasistranslations.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/oasistranslations/icon.png" + }, + { + "id": "skynovels.net", + "name": "SkyNovels", + "site": "https://www.skynovels.net/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/skynovels.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/skynovels/icon.png" + }, + { + "id": "tunovelaligera", + "name": "TuNovelaLigera", + "site": "https://tunovelaligera.com/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/tunovelaligera.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/tunovelaligera/icon.png" + }, + { + "id": "yuukitls.com", + "name": "Yuuki Tls", + "site": "https://yuukitls.com/", + "lang": "español, castellano", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/yukitls.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/yuukitls/icon.png" + } + ], + "Türkçe": [ + { + "id": "epiknovel.com", + "name": "EpikNovel", + "site": "https://www.epiknovel.com/", + "lang": "Türkçe", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/epiknovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/tr/epiknovel/icon.png" + }, + { + "id": "lshnovel", + "name": "Liebe Schnee Hiver Novel", + "site": "https://lshnovel.com/", + "lang": "Türkçe", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/lshnovel.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/lshnovel.png" + }, + { + "id": "turkcelightnovels", + "name": "TurkceLightNovels[madara]", + "site": "https://turkcelightnovels.com/", + "lang": "Türkçe", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/TurkceLightNovels[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/turkcelightnovels.png" + }, + { + "id": "webnoveloku", + "name": "WebNovelOku [madara]", + "site": "https://www.webnoveloku.com/", + "lang": "Türkçe", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/WebNovelOku[madara].js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/webnoveloku.png" + } + ], + "Україна": [ + { + "id": "smakolykytl", + "name": "Смаколики", + "site": "https://smakolykytl.site/", + "lang": "Україна", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/ukraine/smakolykytl.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ua/smakolykytl/icon.png" + } + ], + "Tiếng Việt": [ + { + "id": "ln.hako", + "name": "Hako", + "site": "https://ln.hako.vn", + "lang": "Tiếng Việt", + "version": "1.0.0", + "url": "https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/vietnamese/LNHako.js", + "iconUrl": "https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/vi/hakolightnovel/icon.png" + } + ] +} \ No newline at end of file diff --git a/.dist/nyagami/plugins.min.json b/.dist/nyagami/plugins.min.json new file mode 100644 index 0000000..e589995 --- /dev/null +++ b/.dist/nyagami/plugins.min.json @@ -0,0 +1 @@ +{"العربية":[{"id":"ar-mtl","name":"ArMTL[madara]","site":"https://ar-mtl.club/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/ArMTL[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/armtl.png"},{"id":"arnovel","name":"ArNovel[madara]","site":"https://arnovel.me/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/ArNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/arnovel.png"},{"id":"hizomanga","name":"HizoManga[madara]","site":"https://hizomanga.com/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/HizoManga[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/hizomanga.png"},{"id":"kol-novel","name":"Kol Novel[wpmangastream]","site":"https://kolnovel.com/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/KolNovel[wpmangastream].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/kol-novel.png"},{"id":"kolnovel","name":"KolNovel","site":"https://kolnovel.lol/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/kolnovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/kolnovel.png"},{"id":"novel4up","name":"Novel4Up[madara]","site":"https://novel4up.com/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/Novel4Up[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novel4up.png"},{"id":"riwyat","name":"Riwyat[madara]","site":"https://riwyat.com/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/Riwyat[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/riwyat.png"},{"id":"teamxnovel","name":"TeamXNovel[madara]","site":"https://teamxnovel.com/","lang":"العربية","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/arabic/TeamXNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/teamxnovel.png"}],"中文, 汉语, 漢語":[{"id":"linovelib","name":"Linovelib","site":"https://w.linovelib.com","lang":"中文, 汉语, 漢語","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/chinese/linovelib.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/cn/linovelib/icon.png"}],"English":[{"id":"1stkissnovel","name":"FirstKissNovel[madara]","site":"https://1stkissnovel.org/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/FirstKissNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/firstkissnovel.png"},{"id":"anf.net","name":"AllNovelFull","site":"https://allnovelfull.net","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/allnovelfull.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/allnovelfull/icon.png"},{"id":"BLN.com","name":"BestLightNovel","site":"https://bestlightnovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/bestlightnovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/bestlightnovel/icon.png"},{"id":"boxnovel","name":"BoxNovel[madara]","site":"https://boxnovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/BoxNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/boxnovel.png"},{"id":"clicknovel","name":"ClickNovel[madara]","site":"https://clicknovel.net/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ClickNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/clicknovel.png"},{"id":"comrademao","name":"Comrade Mao","site":"https://comrademao.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/comrademao.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/comrademao/icon.png"},{"id":"cratenovel","name":"CrateNovel[madara]","site":"https://cratenovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/CrateNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/cratenovel.png"},{"id":"daonovel","name":"DaoNovel[madara]","site":"https://daonovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/DaoNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/daonovel.png"},{"id":"DDL.com","name":"Divine Dao Library","site":"https://www.divinedaolibrary.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/divinedaolibrary.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/divinedaolibrary/icon.png"},{"id":"earlynovel","name":"Early Novel","site":"https://earlynovel.net/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/earlynovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/latestnovel.png"},{"id":"fanTLS","name":"Fans Translations[madara]","site":"https://fanstranslations.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/FansTranslations[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/fanstranslations.png"},{"id":"foxaholic","name":"Foxaholic","site":"https://www.foxaholic.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/foxaholic.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/foxaholic/icon.png"},{"id":"freenovel.me","name":"FreeNovelMe[madara]","site":"https://freenovel.me/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/FreeNovelMe[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/freenovelme.png"},{"id":"FWN.com","name":"Web NOVEL","site":"https://freewebnovel.com","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/freewebnovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/freewebnovel/icon.png"},{"id":"guavaread","name":"Guavaread[madara]","site":"https://guavaread.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Guavaread[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/guavaread.png"},{"id":"lightnovelpub","name":"LightNovelPub","site":"https://www.lightnovelpub.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/lightnovelpub.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/lightnovelpub/icon.png"},{"id":"LightNovelUpdates","name":"Light Novel Updates","site":"https://www.lightnovelupdates.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/lightnovelupdates.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/lightnovelupdates/icon.png"},{"id":"lightnovelworld","name":"LightNovelWorld","site":"https://www.webnovelworld.org/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/lightnovelworld.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/lightnovelworld/icon.png"},{"id":"lnheaven","name":"LightNovelHeaven[madara]","site":"https://lightnovelheaven.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/LightNovelHeaven[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/lightnovelheaven.png"},{"id":"Ltnovel.com","name":"Ltnovel[readwn]","site":"https://www.ltnovel.com","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Ltnovel[readwn].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/readwn/icons/ltnovel.png"},{"id":"lunarletters","name":"LunarLetters[madara]","site":"https://www.lunarletters.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/LunarLetters[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/lunarletters.png"},{"id":"mostnovel","name":"MostNovel[madara]","site":"https://mostnovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MostNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mostnovel.png"},{"id":"mtl-novel","name":"MTL-Novel[madara]","site":"https://mtl-novel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MTLNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mtl-novel.png"},{"id":"mtlnovel","name":"MTL Novel","site":"https://www.mtlnovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/mtlnovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/mtlnovel/icon.png"},{"id":"mtlnovel.club","name":"MTLNovel.Club[madara]","site":"https://mtlnovel.club/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MTLNovelClub[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mtlnovel.club.png"},{"id":"mtlreader","name":"MTL Reader","site":"https://mtlreader.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/mtlreader.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/mtlreader/icon.png"},{"id":"mysticalmerries","name":"MysticalSeries[madara]","site":"https://mysticalmerries.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/MysticalSeries[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/mysticalseries.png"},{"id":"neosekaiTLS","name":"NeoSekai Translations[madara]","site":"https://www.neosekaitranslations.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NeoSekaiTranslations[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/neosekaitranslations.png"},{"id":"NF.me","name":"NovelFullMe","site":"https://novelfull.me/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelFullMe.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelfullme/icon.png"},{"id":"nitromanga","name":"Nitro Manga","site":"https://nitromanga.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/nitromanga.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/nitromanga/icon.png"},{"id":"NO.net","name":"novelsOnline","site":"https://novelsonline.net","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelOnline.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/coverNotAvailable.jpg"},{"id":"noblemtl","name":"NobleMTL","site":"https://noblemtl.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/nobleMTL.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/noblemtl/icon.png"},{"id":"nocturneTLS","name":"Nocturne Translations[madara]","site":"https://nocturnetls.net/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NocturneTranslations[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/nocturnetranslations.png"},{"id":"noobchanTL","name":"Noobchan Translation[madara]","site":"https://noobchan.xyz/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NoobchanTranslation[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/noobchantranslation.png"},{"id":"novelbin","name":"Novel Bin","site":"https://novelmax.net/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelbin.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelbin/icon.png"},{"id":"novelfull","name":"NovelFull","site":"https://novelfull.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelfull.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelfull/icon.png"},{"id":"novelhall","name":"Novel Hall","site":"https://novelhall.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelhall.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelhall/icon.png"},{"id":"novelmultiverse","name":"NovelMultiverse[madara]","site":"https://www.novelmultiverse.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelMultiverse[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelmultiverse.png"},{"id":"novelr18","name":"NovelR18[madara]","site":"https://novelr18.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelR18[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelr18.png"},{"id":"novelroom","name":"Novelroom.net[madara]","site":"https://novelroom.net/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Novelroomnet[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelroom.net.png"},{"id":"novelstic","name":"Novelstic[madara]","site":"https://novelstic.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Novelstic[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/novelstic.png"},{"id":"novelTL","name":"NovelTranslate[madara]","site":"https://noveltranslate.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/NovelTranslate[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/noveltranslate.png"},{"id":"novelupdates","name":"Novel Updates","site":"https://www.novelupdates.com/","lang":"English","version":"0.5.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/novelupdates.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/novelupdates/icon.png"},{"id":"onlymtl","name":"OnlyMTL[madara]","site":"https://www.onlymtl.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/OnlyMTL[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/onlymtl.png"},{"id":"pandamtl","name":"PandaMTL","site":"https://pandamtl.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/pandaMTL.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/wordpress/icon.png"},{"id":"readwebnovels","name":"ReadWebNovels[madara]","site":"https://readwebnovels.net/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ReadWebNovels[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/readwebnovels.png"},{"id":"sleeptTLS","name":"SleepyTranslations[madara]","site":"https://sleepytranslations.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SleepyTranslations[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sleepytranslations.png"},{"id":"sonicmtl","name":"SonicMTL[madara]","site":"https://www.sonicmtl.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SonicMTL[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sonicmtl.png"},{"id":"sugarbbscan","name":"Sugar Babies[madara]","site":"https://sugarbbscan.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SugarBabies[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sugarbabies.png"},{"id":"sweetEscapeTL","name":"Sweet Escape Translations[madara]","site":"https://sweetescapetranslations.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/SweetEscapeTranslations[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/sweetescapetranslations.png"},{"id":"webnovelover","name":"WebNovelLover[madara]","site":"https://www.webnovelover.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/WebNovelLover[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/webnovellover.png"},{"id":"wuxiacity","name":"Wuxiacity[readwn]","site":"https://www.wuxiacity.com","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Wuxiacity[readwn].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/readwn/icons/wuxiacity.png"},{"id":"wuxiap","name":"Wuxiap[readwn]","site":"https://www.wuxiap.com","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/Wuxiap[readwn].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/readwn/icons/wuxiap.png"},{"id":"wuxiaworld","name":"Wuxia World","site":"https://www.wuxiaworld.com/","lang":"English","version":"0.5.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/wuxiaworld.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/en/wuxiaworld/icon.png"},{"id":"wuxiaworld.site","name":"WuxiaWorld.Site[madara]","site":"https://wuxiaworld.site/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/WuxiaWorldSite[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/wuxiaworld.site.png"},{"id":"zetroTL","name":"Zetro Translation[madara]","site":"https://zetrotranslation.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ZetroTranslation[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/zetrotranslation.png"},{"id":"zinnovel","name":"ZinnNovel[madara]","site":"https://zinnovel.com/","lang":"English","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/english/ZinnNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/zinnnovel.png"}],"français, française":[{"id":"chireads.com","name":"Chireads","site":"https://chireads.com","lang":"français, française","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/french/chireads.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/fr/chireads/icon.png"},{"id":"lightnovelfr","name":"Ligh Novel FR[wpmangastream]","site":"https://lightnovelfr.com/","lang":"français, française","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/french/LighNovelFR[wpmangastream].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/lightnovelfr.png"},{"id":"NDG.com","name":"NovelDeGlace","site":"https://noveldeglace.com/","lang":"français, française","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/french/noveldeglace.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/fr/noveldeglace/icon.png"}],"Bahasa Indonesia":[{"id":"IDWN.id","name":"IndoWebNovel","site":"https://indowebnovel.id/id/","lang":"Bahasa Indonesia","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/indowebnovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/id/indowebnovel/icon.png"},{"id":"meionovel","name":"MeioNovel[madara]","site":"https://meionovel.id/","lang":"Bahasa Indonesia","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/MeioNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/meionovel.png"},{"id":"morenovel","name":"MoreNovel[madara]","site":"https://morenovel.net/","lang":"Bahasa Indonesia","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/MoreNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/morenovel.png"},{"id":"novelringan.com","name":"NovelRingan","site":"https://novelringan.com/","lang":"Bahasa Indonesia","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/novelringan.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/id/novelringan/icon.png"},{"id":"sakura.id","name":"SakuraNovel","site":"https://sakuranovel.id/","lang":"Bahasa Indonesia","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/sakuranovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/id/sakuranovel/icon.png"},{"id":"wbnovel","name":"WBNovel[madara]","site":"https://wbnovel.com/","lang":"Bahasa Indonesia","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/indonesian/WBNovel[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/wbnovel.png"}],"日本語":[{"id":"yomou.syosetu","name":"Syosetu","site":"https://yomou.syosetu.com/","lang":"日本語","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/japanese/Syosetu.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/jp/syosetu/icon.png"}],"한국어, 조선말":[{"id":"agit.xyz","name":"Agitoon","site":"https://agit501.xyz/","lang":"한국어, 조선말","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/korean/Agitoon.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/kr/agitoon/agit.png"}],"Português":[{"id":"lightnovelbrasil","name":"Light Novel Brasil","site":"https://lightnovelbrasil.com/","lang":"Português","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/portuguese/lightnovelbrasil.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/lightnovelbrasil.png"}],"русский язык":[{"id":"AT","name":"Автор Тудей","site":"https://author.today","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/authortoday.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/authortoday/icon.png"},{"id":"bookhamster","name":"Bookhamster[ifreedom]","site":"https://bookhamster.ru","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/Bookhamster[ifreedom].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/ifreedom/icons/bookhamster.png"},{"id":"bookriver","name":"Bookriver","site":"https://bookriver.ru","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/bookriver.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/bookriver/icon.png"},{"id":"erolate","name":"Erolate[rulate]","site":"https://erolate.com","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/Erolate[rulate].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/rulate/icons/erolate.png"},{"id":"ficbook","name":"ficbook","site":"https://ficbook.net","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ficbook.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ficbook/icon.png"},{"id":"freedlit.space","name":"LitSpace","site":"https://freedlit.space","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/LitSpace.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/freedlit/icon.png"},{"id":"ifreedom","name":"Свободный Мир Ранобэ[ifreedom]","site":"https://ifreedom.su","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/СвободныйМирРанобэ[ifreedom].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/ifreedom/icons/ifreedom.png"},{"id":"jaomix.ru","name":"Jaomix","site":"https://jaomix.ru","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/jaomix.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/jaomix/icon.png"},{"id":"ReN","name":"Renovels","site":"https://renovels.org","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/renovels.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/renovels/icon.png"},{"id":"RLIB","name":"RanobeLib","site":"https://ranobelib.me","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ranobelib.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ranobelib/icon.png"},{"id":"RNBH.org","name":"RanobeHub","site":"https://ranobehub.org/","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ranobehub.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ranobehub/icon.png"},{"id":"RNRF","name":"РанобэРФ","site":"https://ранобэ.рф","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/ranoberf.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/ranoberf/icon.png"},{"id":"TL","name":"NovelTL","site":"https://novel.tl","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/novelTL.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ru/noveltl/icon.png"},{"id":"tl.rulate","name":"Rulate[rulate]","site":"https://tl.rulate.ru","lang":"русский язык","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/russian/Rulate[rulate].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/rulate/icons/rulate.png"}],"español, castellano":[{"id":"awuxia.com","name":"ReinoWuxia","site":"http://www.reinowuxia.com/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/novelawuxia.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/novelawuxia/icon.png"},{"id":"HasuTL","name":"Hasu Translations","site":"https://hasutl.wordpress.com/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/hasutl.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/hasutl/icon.png"},{"id":"ligera.com","name":"Novelas Ligera","site":"https://novelasligera.com/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/novelasligera.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/novelasligera/icon.png"},{"id":"oasisTL.wp","name":"Oasis Translations","site":"https://oasistranslations.wordpress.com/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/oasistranslations.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/oasistranslations/icon.png"},{"id":"skynovels.net","name":"SkyNovels","site":"https://www.skynovels.net/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/skynovels.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/skynovels/icon.png"},{"id":"tunovelaligera","name":"TuNovelaLigera","site":"https://tunovelaligera.com/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/tunovelaligera.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/tunovelaligera/icon.png"},{"id":"yuukitls.com","name":"Yuuki Tls","site":"https://yuukitls.com/","lang":"español, castellano","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/spanish/yukitls.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/es/yuukitls/icon.png"}],"Türkçe":[{"id":"epiknovel.com","name":"EpikNovel","site":"https://www.epiknovel.com/","lang":"Türkçe","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/epiknovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/tr/epiknovel/icon.png"},{"id":"lshnovel","name":"Liebe Schnee Hiver Novel","site":"https://lshnovel.com/","lang":"Türkçe","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/lshnovel.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/wpmangastream/icons/lshnovel.png"},{"id":"turkcelightnovels","name":"TurkceLightNovels[madara]","site":"https://turkcelightnovels.com/","lang":"Türkçe","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/TurkceLightNovels[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/turkcelightnovels.png"},{"id":"webnoveloku","name":"WebNovelOku [madara]","site":"https://www.webnoveloku.com/","lang":"Türkçe","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/turkish/WebNovelOku[madara].js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/multisrc/madara/icons/webnoveloku.png"}],"Україна":[{"id":"smakolykytl","name":"Смаколики","site":"https://smakolykytl.site/","lang":"Україна","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/ukraine/smakolykytl.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/ua/smakolykytl/icon.png"}],"Tiếng Việt":[{"id":"ln.hako","name":"Hako","site":"https://ln.hako.vn","lang":"Tiếng Việt","version":"1.0.0","url":"https://raw.githubusercontent.com/nyagami/plugins/last-step/.js/plugins/vietnamese/LNHako.js","iconUrl":"https://raw.githubusercontent.com/nyagami/plugins/last-step/icons/src/vi/hakolightnovel/icon.png"}]} \ No newline at end of file diff --git a/.github/workflows/typechecking.yml b/.github/workflows/typechecking.yml index 1148191..a229795 100644 --- a/.github/workflows/typechecking.yml +++ b/.github/workflows/typechecking.yml @@ -3,7 +3,7 @@ name: Update json files on: pull_request: branches: - - plugins + - master jobs: typechecking: @@ -23,7 +23,7 @@ jobs: { "githubUsername": "LNReader", "githubRepository": "lnreader-sources", - "githubBranch": "plugins" + "githubBranch": "master" } EOF tsc diff --git a/.github/workflows/updatejson.yml b/.github/workflows/updatejson.yml index 7184e26..4837824 100644 --- a/.github/workflows/updatejson.yml +++ b/.github/workflows/updatejson.yml @@ -3,7 +3,7 @@ name: Update json files on: push: branches: - - plugins + - master jobs: updatejson: @@ -25,7 +25,7 @@ jobs: { "githubUsername": "LNReader", "githubRepository": "lnreader-sources", - "githubBranch": "plugins" + "githubBranch": "master" } EOF - name: Update json files diff --git a/.js/plugins/chinese/linovelib.js b/.js/plugins/chinese/linovelib.js index 4aecc92..30c6b44 100644 --- a/.js/plugins/chinese/linovelib.js +++ b/.js/plugins/chinese/linovelib.js @@ -39,7 +39,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); var cheerio_1 = require("cheerio"); var fetch_1 = require("@libs/fetch"); var filterInputs_1 = require("@libs/filterInputs"); -var showToast_1 = require("@libs/showToast"); var Linovelib = /** @class */ (function () { function Linovelib() { this.id = "linovelib"; @@ -433,7 +432,6 @@ var Linovelib = /** @class */ (function () { }; novelResults = pageCheerio(".book-ol a.book-layout"); if (novelResults.length === 0) { - (0, showToast_1.showToast)("Bypass check by searching in Webview"); } else { loadSearchResults(); diff --git a/.js/plugins/english/earlynovel.js b/.js/plugins/english/earlynovel.js index b7d24b7..eaafa26 100644 --- a/.js/plugins/english/earlynovel.js +++ b/.js/plugins/english/earlynovel.js @@ -39,7 +39,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); var cheerio_1 = require("cheerio"); var fetch_1 = require("@libs/fetch"); var filterInputs_1 = require("@libs/filterInputs"); -var showToast_1 = require("@libs/showToast"); var EarlyNovelPlugin = /** @class */ (function () { function EarlyNovelPlugin() { this.id = "earlynovel"; @@ -161,7 +160,6 @@ var EarlyNovelPlugin = /** @class */ (function () { return __generator(this, function (_c) { switch (_c.label) { case 0: - (0, showToast_1.showToast)("Early Novel may take 20-30 seconds"); url = novelUrl; headers = new Headers(); return [4 /*yield*/, (0, fetch_1.fetchApi)(url, { headers: headers })]; diff --git a/.js/plugins/english/novelhall.js b/.js/plugins/english/novelhall.js index f90d559..29ecffb 100644 --- a/.js/plugins/english/novelhall.js +++ b/.js/plugins/english/novelhall.js @@ -40,7 +40,7 @@ var cheerio_1 = require("cheerio"); var fetch_1 = require("@libs/fetch"); var NovelHall = /** @class */ (function () { function NovelHall() { - this.id = "novelhold"; + this.id = "novelhall"; this.name = "Novel Hall"; this.version = "1.0.0"; this.icon = "src/en/novelhall/icon.png"; diff --git a/.js/plugins/spanish/tunovelaligera.js b/.js/plugins/spanish/tunovelaligera.js index 5d82f9d..5aac9ca 100644 --- a/.js/plugins/spanish/tunovelaligera.js +++ b/.js/plugins/spanish/tunovelaligera.js @@ -39,7 +39,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); var cheerio_1 = require("cheerio"); var fetch_1 = require("@libs/fetch"); var filterInputs_1 = require("@libs/filterInputs"); -var showToast_1 = require("@libs/showToast"); var defaultCover_1 = require("@libs/defaultCover"); var novelStatus_1 = require("@libs/novelStatus"); var TuNovelaLigera = /** @class */ (function () { @@ -226,7 +225,6 @@ var TuNovelaLigera = /** @class */ (function () { case 0: n = url.split("/"); novelName = n[4]; - (0, showToast_1.showToast)("Cargando desde Archivo..."); formData = new FormData(); formData.append("action", "madara_load_more"); formData.append("page", "0"); @@ -272,7 +270,6 @@ var TuNovelaLigera = /** @class */ (function () { switch (_b.label) { case 0: chaptersUrl = "".concat(novelUrl, "?lcp_page0=").concat(i); - (0, showToast_1.showToast)("Cargando desde la p\u00E1gina ".concat(i, "/").concat(lastPage, "...")); return [4 /*yield*/, (0, fetch_1.fetchApi)(chaptersUrl, { headers: headers })]; case 1: result_1 = _b.sent(); @@ -324,7 +321,6 @@ var TuNovelaLigera = /** @class */ (function () { case 3: _a.chapters = _c.sent(); if (!!novel.chapters.length) return [3 /*break*/, 6]; - (0, showToast_1.showToast)("¡Archivo no encontrado!"); return [4 /*yield*/, delay(1000)]; case 4: _c.sent(); diff --git a/README.md b/README.md index 6f42a30..55432a3 100644 --- a/README.md +++ b/README.md @@ -2,82 +2,85 @@ # LNReader Plugins + +

+ + GitHub issues by-label + + GitHub issues by-label + +

+ + Repository to host plugins and related issues, and requests for [LNReader](https://github.com/LNReader/lnreader). -## Prerequisites -- Nodejs >= 18 -## Contributing -1. Choose your language in [plugins/](./plugins) +## Installing -+ If your language doenst exist or you need some other packages, please request us. We will add it soon. - -2. Write your scripts - -+ See example: [Hako](./plugins/vietnamese/LNHako.ts) - -Multisrc: [multisrc](./scripts/multisrc) - -## Test your script - -We use expressjs to make an UI web for testing. - -1. Installing +- Prerequisites: Nodejs >= 18 +1. `npm install` +2. Create `config.json` file in root dir +```json +{ + "githubUsername": "", + "githubRepository": "", + "githubBranch": "" +} ``` -npm install -``` - -2. Running - -``` -npm start -``` - -+ Then open http://localhost:3000 - -3. Testing - -+ Find you plugin - -+ Check if all functions of your plugin work properly - -#### No need to reload webpage after changing your plugin script. - ----------- - -If you want to test plugin in app side, remember to config these things. - - -1. Create `config.json` file in root dir -2. Add your github infomation. Here is an example. +Example ```json { "githubUsername": "LNReader", "githubRepository": "lnreader-sources", - "githubBranch": "plugins" + "githubBranch": "master" } ``` -3. Just commit and push it. And you will see your own json files in github fork: dist/`username`/ +## Contributing -also in [pluginManager.ts](https://github.com/LNReader/lnreader/blob/plugins/src/plugins/pluginManager.ts) (app repo) +1. Choose your language in [plugins](./plugins) +2. Write your scripts + + + +## Examples: ++ [Hako](./plugins/vietnamese/LNHako.ts) ++ Multisrc: [multisrc](./scripts/multisrc) + +## Testing +- If you are making a [multisrc](./scripts/multisrc): `npm run generate` +- `npm start` +- Open http://localhost:3000 and test + +### If you want to test in app side. + +- Commit and push changes. Check your own json files in github fork: `.dist//` + +- Change these in [pluginManager.ts](https://github.com/LNReader/lnreader/blob/master/src/plugins/pluginManager.ts) (app repo) to yours + + ```ts -const githubUsername = 'LNReader'; -const githubRepository = 'lnreader-sources'; -const githubBranch = 'plugins'; +const githubUsername = 'LNReader'; +const githubRepository = 'lnreader-sources'; +const githubBranch = 'master'; ``` -- Note: You dont have to remove your own json files when creating a PR. -- Note: You dont have to modify the .dist/LNReader when PR. There's already action for that job. + + +- Note: No need to modify `.dist` folder when opening PR. There's already action for that job. + + ---------- + + The developer of this application does not have any affiliation with the content providers available. diff --git a/libs/showToast.ts b/libs/showToast.ts deleted file mode 100644 index e6b12e5..0000000 --- a/libs/showToast.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function showToast(...message: Parameters<(typeof console)["log"]>) { - console.log(...message); -} diff --git a/plugins/chinese/linovelib.ts b/plugins/chinese/linovelib.ts index d79f73b..0bd97f9 100644 --- a/plugins/chinese/linovelib.ts +++ b/plugins/chinese/linovelib.ts @@ -1,574 +1,573 @@ -import { CheerioAPI, load as parseHTML } from "cheerio"; -import { fetchApi, fetchFile } from "@libs/fetch"; -import { FilterTypes, Filters } from "@libs/filterInputs"; -import { Plugin } from "@typings/plugin"; -import { showToast } from "@libs/showToast"; - -class Linovelib implements Plugin.PluginBase { - id = "linovelib"; - name = "Linovelib"; - icon = "src/cn/linovelib/icon.png"; - site = "https://w.linovelib.com"; - version = "1.0.0"; - - async popularNovels( - pageNo: number, - { filters }: Plugin.PopularNovelsOptions - ): Promise { - let link = `${this.site}/top/`; - - link += filters.sort; - - link += `/${pageNo}.html`; - - const headers = new Headers(); - const body = await fetchApi(link, { headers }).then((result) => - result.text() - ); - - const loadedCheerio = parseHTML(body); - - const novels: Plugin.NovelItem[] = []; - - loadedCheerio(".module-rank-booklist .book-layout").each((i, el) => { - let url = loadedCheerio(el).attr("href"); - - const novelName = loadedCheerio(el).find(".book-title").text(); - const novelCover = loadedCheerio(el) - .find("img.book-cover") - .attr("data-src"); - const novelUrl = this.site + url; - - if (!url) return; - - const novel = { - name: novelName, - cover: novelCover, - url: novelUrl, - }; - - novels.push(novel); - }); - - return novels; - } - - async parseNovelAndChapters(novelUrl: string): Promise { - const url = novelUrl; - const headers = new Headers(); - const result = await fetchApi(url, { headers }); - const body = await result.text(); - - let loadedCheerio = parseHTML(body); - - const novel: Plugin.SourceNovel = { - url, - chapters: [], - }; - - novel.name = loadedCheerio("#bookDetailWrapper .book-title").text(); - - novel.cover = loadedCheerio("#bookDetailWrapper img.book-cover").attr( - "src" - ); - - novel.summary = loadedCheerio("#bookSummary content").text(); - - novel.author = loadedCheerio( - "#bookDetailWrapper .book-rand-a a" - ).text(); - - // TODO: Need some regex and dirty selector to get it - // Need to look into how to translate that message - novel.status = undefined; - - novel.genres = loadedCheerio(".tag-small.red") - .children("a") - .map((i, el) => loadedCheerio(el).text()) - .toArray() - .join(","); - - // Table of Content is on a different page than the summary page - let chapter: Plugin.ChapterItem[] = []; - - const idPattern = /\/(\d+)\.html/; - const novelId = url.match(idPattern)?.[1]; - - const chaptersUrl = - this.site + loadedCheerio("#btnReadBook").attr("href"); - const chaptersResult = await fetchApi(chaptersUrl, { headers }); - const chaptersBody = await chaptersResult.text(); - - const chaptersLoadedCheerio = parseHTML(chaptersBody); - - let volumeName: string, chapterId: number; - - chaptersLoadedCheerio("#volumes .chapter-li").each((i, el) => { - if (chaptersLoadedCheerio(el).hasClass("chapter-bar")) { - volumeName = chaptersLoadedCheerio(el).text(); - } else { - const urlPart = chaptersLoadedCheerio(el) - .find(".chapter-li-a") - .attr("href"); - const chapterIdMatch = urlPart?.match(idPattern); - - // Sometimes the href attribute does not contain the url, but javascript:cid(0). - // Increment the previous chapter ID should result in the right URL - if (chapterIdMatch) { - chapterId = +chapterIdMatch[1]; - } else { - chapterId++; - } - } - - const chapterUrl = `${this.site}/novel/${novelId}/${chapterId}.html`; - const chapterName = - volumeName + - " — " + - chaptersLoadedCheerio(el).find(".chapter-index").text().trim(); - const releaseDate = null; - - if (!chapterId) return; - - chapter.push({ - name: chapterName, - releaseTime: releaseDate, - url: chapterUrl, - }); - }); - - novel.chapters = chapter; - - return novel; - } - - async parseChapter(chapterUrl: string): Promise { - const headers = new Headers(); - let chapterName, - chapterText = "", - hasNextPage, - pageHasNextPage, - pageText = ""; - let pageNumber = 1; - - /* - * TODO: Maybe there are other ways to get the translation table - * It is embed and encrypted inside readtool.js - * UPDATE: Decrypted, see skillgg - */ - // const mapping_dict = { - // '“': '「', - // '’': '』', - // '': '是', - // '': '不', - // '': '好', - // '': '个', - // '': '开', - // '': '样', - // '': '想', - // '': '说', - // '': '年', - // '': '那', - // '': '她', - // '': '美', - // '': '自', - // '': '家', - // '': '而', - // '': '去', - // '': '都', - // '': '于', - // '': '舔', - // '': '他', - // '': '只', - // '': '看', - // '': '来', - // '': '用', - // '': '道', - // '': '得', - // '': '乳', - // '': '茎', - // '': '肉', - // '': '胸', - // '': '淫', - // '': '性', - // '': '骚', - // '”': '」', - // '': '的', - // '': '当', - // '': '人', - // '': '有', - // '': '上', - // '': '到', - // '': '地', - // '': '中', - // '': '生', - // '': '着', - // '': '和', - // '': '起', - // '': '交', - // '': '以', - // '': '可', - // '': '过', - // '': '能', - // '': '多', - // '': '心', - // '': '小', - // '': '成', - // '': '了', - // '': '把', - // '': '发', - // '': '第', - // '': '子', - // '': '事', - // '': '阴', - // '': '欲', - // '': '里', - // '': '私', - // '': '臀', - // '': '脱', - // '': '唇', - // '‘': '『', - // '': '一', - // '': '我', - // '': '在', - // '': '这', - // '': '们', - // '': '时', - // '': '为', - // '': '你', - // '': '国', - // '': '就', - // '': '要', - // '': '也', - // '': '后', - // '': '没', - // '': '下', - // '': '天', - // '': '对', - // '': '然', - // '': '学', - // '': '之', - // '': '出', - // '': '没', - // '': '如', - // '': '还', - // '': '大', - // '': '作', - // '': '种', - // '': '液', - // '': '呻', - // '': '射', - // '': '穴', - // '': '么', - // '': '裸', - // }; - const skillgg: Record = { - "\u201c": "\u300c", - "\u201d": "\u300d", - "\u2018": "\u300e", - "\u2019": "\u300f", - "\ue82c": "\u7684", - "\ue852": "\u4e00", - "\ue82d": "\u662f", - "\ue819": "\u4e86", - "\ue856": "\u6211", - "\ue857": "\u4e0d", - "\ue816": "\u4eba", - "\ue83c": "\u5728", - "\ue830": "\u4ed6", - "\ue82e": "\u6709", - "\ue836": "\u8fd9", - "\ue859": "\u4e2a", - "\ue80a": "\u4e0a", - "\ue855": "\u4eec", - "\ue842": "\u6765", - "\ue858": "\u5230", - "\ue80b": "\u65f6", - "\ue81f": "\u5927", - "\ue84a": "\u5730", - "\ue853": "\u4e3a", - "\ue81e": "\u5b50", - "\ue822": "\u4e2d", - "\ue813": "\u4f60", - "\ue85b": "\u8bf4", - "\ue807": "\u751f", - "\ue818": "\u56fd", - "\ue810": "\u5e74", - "\ue812": "\u7740", - "\ue851": "\u5c31", - "\ue801": "\u90a3", - "\ue80c": "\u548c", - "\ue815": "\u8981", - "\ue84c": "\u5979", - "\ue840": "\u51fa", - "\ue848": "\u4e5f", - "\ue835": "\u5f97", - "\ue800": "\u91cc", - "\ue826": "\u540e", - "\ue863": "\u81ea", - "\ue861": "\u4ee5", - "\ue854": "\u4f1a", - "\ue827": "\u5bb6", - "\ue83b": "\u53ef", - "\ue85d": "\u4e0b", - "\ue84d": "\u800c", - "\ue862": "\u8fc7", - "\ue81c": "\u5929", - "\ue81d": "\u53bb", - "\ue860": "\u80fd", - "\ue843": "\u5bf9", - "\ue82f": "\u5c0f", - "\ue802": "\u591a", - "\ue831": "\u7136", - "\ue84b": "\u4e8e", - "\ue837": "\u5fc3", - "\ue829": "\u5b66", - "\ue85e": "\u4e48", - "\ue83a": "\u4e4b", - "\ue832": "\u90fd", - "\ue808": "\u597d", - "\ue841": "\u770b", - "\ue821": "\u8d77", - "\ue845": "\u53d1", - "\ue803": "\u5f53", - "\ue828": "\u6ca1", - "\ue81b": "\u6210", - "\ue83e": "\u53ea", - "\ue820": "\u5982", - "\ue84e": "\u4e8b", - "\ue85a": "\u628a", - "\ue806": "\u8fd8", - "\ue83f": "\u7528", - "\ue833": "\u7b2c", - "\ue811": "\u6837", - "\ue804": "\u9053", - "\ue814": "\u60f3", - "\ue80f": "\u4f5c", - "\ue84f": "\u79cd", - "\ue80e": "\u5f00", - "\ue823": "\u7f8e", - "\ue849": "\u4e73", - "\ue805": "\u9634", - "\ue809": "\u6db2", - "\ue81a": "\u830e", - "\ue844": "\u6b32", - "\ue847": "\u547b", - "\ue850": "\u8089", - "\ue824": "\u4ea4", - "\ue85f": "\u6027", - "\ue817": "\u80f8", - "\ue85c": "\u79c1", - "\ue838": "\u7a74", - "\ue82a": "\u6deb", - "\ue83d": "\u81c0", - "\ue82b": "\u8214", - "\ue80d": "\u5c04", - "\ue839": "\u8131", - "\ue834": "\u88f8", - "\ue846": "\u9a9a", - "\ue825": "\u5507", - }; - const addPage = async (pageCheerio: CheerioAPI) => { - const formatPage = async () => { - // Remove JS - pageCheerio("#ccacontent .cgo").remove(); - - // Load lazyloaded images - pageCheerio("#ccacontent img.imagecontent").each((i, el) => { - // Sometimes images are either in data-src or src - const imgSrc = - pageCheerio(el).attr("data-src") || - pageCheerio(el).attr("src"); - if (imgSrc) { - // The original CDN URL is locked behind a CF-like challenge, switch the URL to bypass that - // There are no react-native-url-polyfill lib, can't use URL API - const regex = /\/\/.+\.com\//; - const imgUrl = imgSrc.replace( - regex, - "//img.linovelib.com/" - ); - // Clean up img element - pageCheerio(el) - .attr("src", imgUrl) - .removeAttr("data-src") - .removeClass("lazyload"); - } - }); - - // Recover the original character - pageText = pageCheerio("#ccacontent").html() || ""; - pageText = pageText.replace( - /./g, - (char) => skillgg[char] || char - ); - - return Promise.resolve(); - }; - - await formatPage(); - chapterName = - pageCheerio("#atitle + h3").text() + - " — " + - pageCheerio("#atitle").text(); - if (chapterText === "") { - chapterText = "

" + chapterName + "

"; - } - chapterText += pageText; - }; - - const loadPage = async (url: string) => { - const result = await fetchApi(url, { headers }); - const body = await result.text(); - const pageCheerio = parseHTML(body); - await addPage(pageCheerio); - pageHasNextPage = - pageCheerio("#footlink a:last").text() === "下一页" - ? true - : false; - return { pageCheerio, pageHasNextPage }; - }; - - let url = chapterUrl; - do { - const page = await loadPage(url); - hasNextPage = page.pageHasNextPage; - if (hasNextPage === true) { - pageNumber++; - url = chapterUrl.replace( - /\.html/gi, - `_${pageNumber}` + ".html" - ); - } - } while (hasNextPage === true); - - return chapterText; - } - - async searchNovels( - searchTerm: string, - pageNo?: number | undefined - ): Promise { - const searchUrl = `${this.site}/search/`; - const Term = encodeURI(searchTerm); - const headers = new Headers(); - let NextPage, NoNextPage: boolean, DeadEnd; - pageNo = 1; - const novels: Plugin.NovelItem[] = []; - - const addPage = async (pageCheerio: CheerioAPI, redirect: string) => { - const loadSearchResults = () => { - pageCheerio(".book-ol .book-layout").each((i, el) => { - let nUrl = pageCheerio(el).attr("href"); - - const novelName = pageCheerio(el) - .find(".book-title") - .text(); - const novelCover = pageCheerio(el) - .find("img.book-cover") - .attr("data-src"); - const novelUrl = this.site + nUrl; - - if (!nUrl) return; - - novels.push({ - name: novelName, - url: novelUrl, - cover: novelCover, - }); - }); - }; - - const novelResults = pageCheerio(".book-ol a.book-layout"); - if (novelResults.length === 0) { - showToast("Bypass check by searching in Webview"); - } else { - loadSearchResults(); - } - - if (redirect.length) { - novels.length = 0; - const novelName = pageCheerio( - "#bookDetailWrapper .book-title" - ).text(); - - const novelCover = pageCheerio( - "#bookDetailWrapper img.book-cover" - ).attr("src"); - const novelUrl = - this.site + - pageCheerio("#btnReadBook").attr("href")?.slice(0, -8) + - ".html"; - novels.push({ - name: novelName, - url: novelUrl, - cover: novelCover, - }); - } - }; - - const loadPage = async (url: string) => { - const result = await fetchApi(url, { headers }); - const body = await result.text(); - const pageCheerio = parseHTML(body); - const redirect = pageCheerio("div.book-layout").text(); - await addPage(pageCheerio, redirect); - NextPage = pageCheerio(".next").attr("href"); - if (!NextPage) { - NoNextPage === true; - } else { - NoNextPage = NextPage === "#" ? true : false; - } - return { pageCheerio, NoNextPage }; - }; - - let url = `${searchUrl}${Term}_${pageNo}.html`; - do { - const page = await loadPage(url); - DeadEnd = page.NoNextPage; - if (DeadEnd === false) { - pageNo++; - url = `${searchUrl}${Term}_${pageNo}.html`; - } - } while (DeadEnd === false); - - return novels; - } - - async fetchImage(url: string): Promise { - return await fetchFile(url); - } - filters = { - sort: { - label: "Sort By", - value: "monthvisit", - options: [ - { label: "月点击榜", value: "monthvisit" }, - - { label: "周点击榜", value: "weekvisit" }, - - { label: "月推荐榜", value: "monthvote" }, - - { label: "周推荐榜", value: "weekvote" }, - - { label: "月鲜花榜", value: "monthflower" }, - - { label: "周鲜花榜", value: "weekflower" }, - - { label: "月鸡蛋榜", value: "monthegg" }, - - { label: "周鸡蛋榜", value: "weekegg" }, - - { label: "最近更新", value: "lastupdate" }, - - { label: "最新入库", value: "postdate" }, - - { label: "收藏榜", value: "goodnum" }, - - { label: "新书榜", value: "newhot" }, - ], - type: FilterTypes.Picker, - }, - } satisfies Filters; -} - -export default new Linovelib(); +import { CheerioAPI, load as parseHTML } from "cheerio"; +import { fetchApi, fetchFile } from "@libs/fetch"; +import { FilterTypes, Filters } from "@libs/filterInputs"; +import { Plugin } from "@typings/plugin"; + +class Linovelib implements Plugin.PluginBase { + id = "linovelib"; + name = "Linovelib"; + icon = "src/cn/linovelib/icon.png"; + site = "https://w.linovelib.com"; + version = "1.0.0"; + + + async popularNovels( + pageNo: number, + { filters }: Plugin.PopularNovelsOptions + ): Promise { + let link = `${this.site}/top/`; + + link += filters.sort; + + link += `/${pageNo}.html`; + + const headers = new Headers(); + const body = await fetchApi(link, { headers }).then((result) => + result.text() + ); + + const loadedCheerio = parseHTML(body); + + const novels: Plugin.NovelItem[] = []; + + loadedCheerio(".module-rank-booklist .book-layout").each((i, el) => { + let url = loadedCheerio(el).attr("href"); + + const novelName = loadedCheerio(el).find(".book-title").text(); + const novelCover = loadedCheerio(el) + .find("img.book-cover") + .attr("data-src"); + const novelUrl = this.site + url; + + if (!url) return; + + const novel = { + name: novelName, + cover: novelCover, + url: novelUrl, + }; + + novels.push(novel); + }); + + return novels; + } + + async parseNovelAndChapters(novelUrl: string): Promise { + const url = novelUrl; + const headers = new Headers(); + const result = await fetchApi(url, { headers }); + const body = await result.text(); + + let loadedCheerio = parseHTML(body); + + const novel: Plugin.SourceNovel = { + url, + chapters: [], + }; + + novel.name = loadedCheerio("#bookDetailWrapper .book-title").text(); + + novel.cover = loadedCheerio("#bookDetailWrapper img.book-cover").attr( + "src" + ); + + novel.summary = loadedCheerio("#bookSummary content").text(); + + novel.author = loadedCheerio( + "#bookDetailWrapper .book-rand-a a" + ).text(); + + // TODO: Need some regex and dirty selector to get it + // Need to look into how to translate that message + novel.status = undefined; + + novel.genres = loadedCheerio(".tag-small.red") + .children("a") + .map((i, el) => loadedCheerio(el).text()) + .toArray() + .join(","); + + // Table of Content is on a different page than the summary page + let chapter: Plugin.ChapterItem[] = []; + + const idPattern = /\/(\d+)\.html/; + const novelId = url.match(idPattern)?.[1]; + + const chaptersUrl = + this.site + loadedCheerio("#btnReadBook").attr("href"); + const chaptersResult = await fetchApi(chaptersUrl, { headers }); + const chaptersBody = await chaptersResult.text(); + + const chaptersLoadedCheerio = parseHTML(chaptersBody); + + let volumeName: string, chapterId: number; + + chaptersLoadedCheerio("#volumes .chapter-li").each((i, el) => { + if (chaptersLoadedCheerio(el).hasClass("chapter-bar")) { + volumeName = chaptersLoadedCheerio(el).text(); + } else { + const urlPart = chaptersLoadedCheerio(el) + .find(".chapter-li-a") + .attr("href"); + const chapterIdMatch = urlPart?.match(idPattern); + + // Sometimes the href attribute does not contain the url, but javascript:cid(0). + // Increment the previous chapter ID should result in the right URL + if (chapterIdMatch) { + chapterId = +chapterIdMatch[1]; + } else { + chapterId++; + } + } + + const chapterUrl = `${this.site}/novel/${novelId}/${chapterId}.html`; + const chapterName = + volumeName + + " — " + + chaptersLoadedCheerio(el).find(".chapter-index").text().trim(); + const releaseDate = null; + + if (!chapterId) return; + + chapter.push({ + name: chapterName, + releaseTime: releaseDate, + url: chapterUrl, + }); + }); + + novel.chapters = chapter; + + return novel; + } + + async parseChapter(chapterUrl: string): Promise { + const headers = new Headers(); + let chapterName, + chapterText = "", + hasNextPage, + pageHasNextPage, + pageText = ""; + let pageNumber = 1; + + /* + * TODO: Maybe there are other ways to get the translation table + * It is embed and encrypted inside readtool.js + * UPDATE: Decrypted, see skillgg + */ + // const mapping_dict = { + // '“': '「', + // '’': '』', + // '': '是', + // '': '不', + // '': '好', + // '': '个', + // '': '开', + // '': '样', + // '': '想', + // '': '说', + // '': '年', + // '': '那', + // '': '她', + // '': '美', + // '': '自', + // '': '家', + // '': '而', + // '': '去', + // '': '都', + // '': '于', + // '': '舔', + // '': '他', + // '': '只', + // '': '看', + // '': '来', + // '': '用', + // '': '道', + // '': '得', + // '': '乳', + // '': '茎', + // '': '肉', + // '': '胸', + // '': '淫', + // '': '性', + // '': '骚', + // '”': '」', + // '': '的', + // '': '当', + // '': '人', + // '': '有', + // '': '上', + // '': '到', + // '': '地', + // '': '中', + // '': '生', + // '': '着', + // '': '和', + // '': '起', + // '': '交', + // '': '以', + // '': '可', + // '': '过', + // '': '能', + // '': '多', + // '': '心', + // '': '小', + // '': '成', + // '': '了', + // '': '把', + // '': '发', + // '': '第', + // '': '子', + // '': '事', + // '': '阴', + // '': '欲', + // '': '里', + // '': '私', + // '': '臀', + // '': '脱', + // '': '唇', + // '‘': '『', + // '': '一', + // '': '我', + // '': '在', + // '': '这', + // '': '们', + // '': '时', + // '': '为', + // '': '你', + // '': '国', + // '': '就', + // '': '要', + // '': '也', + // '': '后', + // '': '没', + // '': '下', + // '': '天', + // '': '对', + // '': '然', + // '': '学', + // '': '之', + // '': '出', + // '': '没', + // '': '如', + // '': '还', + // '': '大', + // '': '作', + // '': '种', + // '': '液', + // '': '呻', + // '': '射', + // '': '穴', + // '': '么', + // '': '裸', + // }; + const skillgg: Record = { + "\u201c": "\u300c", + "\u201d": "\u300d", + "\u2018": "\u300e", + "\u2019": "\u300f", + "\ue82c": "\u7684", + "\ue852": "\u4e00", + "\ue82d": "\u662f", + "\ue819": "\u4e86", + "\ue856": "\u6211", + "\ue857": "\u4e0d", + "\ue816": "\u4eba", + "\ue83c": "\u5728", + "\ue830": "\u4ed6", + "\ue82e": "\u6709", + "\ue836": "\u8fd9", + "\ue859": "\u4e2a", + "\ue80a": "\u4e0a", + "\ue855": "\u4eec", + "\ue842": "\u6765", + "\ue858": "\u5230", + "\ue80b": "\u65f6", + "\ue81f": "\u5927", + "\ue84a": "\u5730", + "\ue853": "\u4e3a", + "\ue81e": "\u5b50", + "\ue822": "\u4e2d", + "\ue813": "\u4f60", + "\ue85b": "\u8bf4", + "\ue807": "\u751f", + "\ue818": "\u56fd", + "\ue810": "\u5e74", + "\ue812": "\u7740", + "\ue851": "\u5c31", + "\ue801": "\u90a3", + "\ue80c": "\u548c", + "\ue815": "\u8981", + "\ue84c": "\u5979", + "\ue840": "\u51fa", + "\ue848": "\u4e5f", + "\ue835": "\u5f97", + "\ue800": "\u91cc", + "\ue826": "\u540e", + "\ue863": "\u81ea", + "\ue861": "\u4ee5", + "\ue854": "\u4f1a", + "\ue827": "\u5bb6", + "\ue83b": "\u53ef", + "\ue85d": "\u4e0b", + "\ue84d": "\u800c", + "\ue862": "\u8fc7", + "\ue81c": "\u5929", + "\ue81d": "\u53bb", + "\ue860": "\u80fd", + "\ue843": "\u5bf9", + "\ue82f": "\u5c0f", + "\ue802": "\u591a", + "\ue831": "\u7136", + "\ue84b": "\u4e8e", + "\ue837": "\u5fc3", + "\ue829": "\u5b66", + "\ue85e": "\u4e48", + "\ue83a": "\u4e4b", + "\ue832": "\u90fd", + "\ue808": "\u597d", + "\ue841": "\u770b", + "\ue821": "\u8d77", + "\ue845": "\u53d1", + "\ue803": "\u5f53", + "\ue828": "\u6ca1", + "\ue81b": "\u6210", + "\ue83e": "\u53ea", + "\ue820": "\u5982", + "\ue84e": "\u4e8b", + "\ue85a": "\u628a", + "\ue806": "\u8fd8", + "\ue83f": "\u7528", + "\ue833": "\u7b2c", + "\ue811": "\u6837", + "\ue804": "\u9053", + "\ue814": "\u60f3", + "\ue80f": "\u4f5c", + "\ue84f": "\u79cd", + "\ue80e": "\u5f00", + "\ue823": "\u7f8e", + "\ue849": "\u4e73", + "\ue805": "\u9634", + "\ue809": "\u6db2", + "\ue81a": "\u830e", + "\ue844": "\u6b32", + "\ue847": "\u547b", + "\ue850": "\u8089", + "\ue824": "\u4ea4", + "\ue85f": "\u6027", + "\ue817": "\u80f8", + "\ue85c": "\u79c1", + "\ue838": "\u7a74", + "\ue82a": "\u6deb", + "\ue83d": "\u81c0", + "\ue82b": "\u8214", + "\ue80d": "\u5c04", + "\ue839": "\u8131", + "\ue834": "\u88f8", + "\ue846": "\u9a9a", + "\ue825": "\u5507", + }; + const addPage = async (pageCheerio: CheerioAPI) => { + const formatPage = async () => { + // Remove JS + pageCheerio("#ccacontent .cgo").remove(); + + // Load lazyloaded images + pageCheerio("#ccacontent img.imagecontent").each((i, el) => { + // Sometimes images are either in data-src or src + const imgSrc = + pageCheerio(el).attr("data-src") || + pageCheerio(el).attr("src"); + if (imgSrc) { + // The original CDN URL is locked behind a CF-like challenge, switch the URL to bypass that + // There are no react-native-url-polyfill lib, can't use URL API + const regex = /\/\/.+\.com\//; + const imgUrl = imgSrc.replace( + regex, + "//img.linovelib.com/" + ); + // Clean up img element + pageCheerio(el) + .attr("src", imgUrl) + .removeAttr("data-src") + .removeClass("lazyload"); + } + }); + + // Recover the original character + pageText = pageCheerio("#ccacontent").html() || ""; + pageText = pageText.replace( + /./g, + (char) => skillgg[char] || char + ); + + return Promise.resolve(); + }; + + await formatPage(); + chapterName = + pageCheerio("#atitle + h3").text() + + " — " + + pageCheerio("#atitle").text(); + if (chapterText === "") { + chapterText = "

" + chapterName + "

"; + } + chapterText += pageText; + }; + + const loadPage = async (url: string) => { + const result = await fetchApi(url, { headers }); + const body = await result.text(); + const pageCheerio = parseHTML(body); + await addPage(pageCheerio); + pageHasNextPage = + pageCheerio("#footlink a:last").text() === "下一页" + ? true + : false; + return { pageCheerio, pageHasNextPage }; + }; + + let url = chapterUrl; + do { + const page = await loadPage(url); + hasNextPage = page.pageHasNextPage; + if (hasNextPage === true) { + pageNumber++; + url = chapterUrl.replace( + /\.html/gi, + `_${pageNumber}` + ".html" + ); + } + } while (hasNextPage === true); + + return chapterText; + } + + async searchNovels( + searchTerm: string, + pageNo?: number | undefined + ): Promise { + const searchUrl = `${this.site}/search/`; + const Term = encodeURI(searchTerm); + const headers = new Headers(); + let NextPage, NoNextPage: boolean, DeadEnd; + pageNo = 1; + const novels: Plugin.NovelItem[] = []; + + const addPage = async (pageCheerio: CheerioAPI, redirect: string) => { + const loadSearchResults = () => { + pageCheerio(".book-ol .book-layout").each((i, el) => { + let nUrl = pageCheerio(el).attr("href"); + + const novelName = pageCheerio(el) + .find(".book-title") + .text(); + const novelCover = pageCheerio(el) + .find("img.book-cover") + .attr("data-src"); + const novelUrl = this.site + nUrl; + + if (!nUrl) return; + + novels.push({ + name: novelName, + url: novelUrl, + cover: novelCover, + }); + }); + }; + + const novelResults = pageCheerio(".book-ol a.book-layout"); + if (novelResults.length === 0) { + } else { + loadSearchResults(); + } + + if (redirect.length) { + novels.length = 0; + const novelName = pageCheerio( + "#bookDetailWrapper .book-title" + ).text(); + + const novelCover = pageCheerio( + "#bookDetailWrapper img.book-cover" + ).attr("src"); + const novelUrl = + this.site + + pageCheerio("#btnReadBook").attr("href")?.slice(0, -8) + + ".html"; + novels.push({ + name: novelName, + url: novelUrl, + cover: novelCover, + }); + } + }; + + const loadPage = async (url: string) => { + const result = await fetchApi(url, { headers }); + const body = await result.text(); + const pageCheerio = parseHTML(body); + const redirect = pageCheerio("div.book-layout").text(); + await addPage(pageCheerio, redirect); + NextPage = pageCheerio(".next").attr("href"); + if (!NextPage) { + NoNextPage === true; + } else { + NoNextPage = NextPage === "#" ? true : false; + } + return { pageCheerio, NoNextPage }; + }; + + let url = `${searchUrl}${Term}_${pageNo}.html`; + do { + const page = await loadPage(url); + DeadEnd = page.NoNextPage; + if (DeadEnd === false) { + pageNo++; + url = `${searchUrl}${Term}_${pageNo}.html`; + } + } while (DeadEnd === false); + + return novels; + } + + async fetchImage(url: string): Promise { + return await fetchFile(url); + } + filters = { + sort: { + label: "Sort By", + value: "monthvisit", + options: [ + { label: "月点击榜", value: "monthvisit" }, + + { label: "周点击榜", value: "weekvisit" }, + + { label: "月推荐榜", value: "monthvote" }, + + { label: "周推荐榜", value: "weekvote" }, + + { label: "月鲜花榜", value: "monthflower" }, + + { label: "周鲜花榜", value: "weekflower" }, + + { label: "月鸡蛋榜", value: "monthegg" }, + + { label: "周鸡蛋榜", value: "weekegg" }, + + { label: "最近更新", value: "lastupdate" }, + + { label: "最新入库", value: "postdate" }, + + { label: "收藏榜", value: "goodnum" }, + + { label: "新书榜", value: "newhot" }, + ], + type: FilterTypes.Picker, + }, + } satisfies Filters; +} + +export default new Linovelib(); diff --git a/plugins/english/earlynovel.ts b/plugins/english/earlynovel.ts index e430a4f..109ad21 100644 --- a/plugins/english/earlynovel.ts +++ b/plugins/english/earlynovel.ts @@ -1,7 +1,6 @@ import { CheerioAPI, load as parseHTML } from "cheerio"; import { fetchApi, fetchFile } from "@libs/fetch"; import { FilterTypes, Filters } from "@libs/filterInputs"; -import { showToast } from "@libs/showToast"; import { Plugin } from "@typings/plugin"; import { defaultCover } from "@libs/defaultCover"; @@ -60,7 +59,6 @@ class EarlyNovelPlugin implements Plugin.PluginBase { } async parseNovelAndChapters(novelUrl: string): Promise { - showToast("Early Novel may take 20-30 seconds"); const url = novelUrl; const headers = new Headers(); const result = await fetchApi(url, { headers }); diff --git a/plugins/english/freenovelupdates.broken.ts b/plugins/english/freenovelupdates.broken.ts index ec5ec49..99da292 100644 --- a/plugins/english/freenovelupdates.broken.ts +++ b/plugins/english/freenovelupdates.broken.ts @@ -1,6 +1,5 @@ import { load as parseHTML } from "cheerio"; import { fetchApi, fetchFile } from "@libs/fetch"; -import { showToast } from "@libs/showToast"; import { isUrlAbsolute } from "@libs/isAbsoluteUrl"; import { Novel, Plugin } from "@typings/plugin"; @@ -117,8 +116,6 @@ export const parseChapter: Plugin.parseChapter = async function (chapterUrl) { }; export const searchNovels: Plugin.searchNovels = async function (searchTerm) { - showToast("Search is not available in this source"); - return []; }; diff --git a/plugins/english/lnmtl.broken.ts b/plugins/english/lnmtl.broken.ts index b7755d0..dc93e6d 100644 --- a/plugins/english/lnmtl.broken.ts +++ b/plugins/english/lnmtl.broken.ts @@ -1,6 +1,5 @@ import { load as parseHTML } from "cheerio"; import { fetchApi, fetchFile } from "@libs/fetch"; -import { showToast } from "@libs/showToast"; import { Chapter, Novel, Plugin } from "@typings/plugin"; const pluginId = "lnmtl"; @@ -36,8 +35,6 @@ export const popularNovels: Plugin.popularNovels = async function (page) { export const parseNovelAndChapters: Plugin.parseNovelAndChapters = async function (novelUrl) { - showToast("LNMTL might take around 20-30 seconds."); - const url = novelUrl; const body = await fetchApi(url, {}, pluginId).then((r) => r.text()); diff --git a/plugins/english/novelhall.ts b/plugins/english/novelhall.ts index 15947a5..876a372 100644 --- a/plugins/english/novelhall.ts +++ b/plugins/english/novelhall.ts @@ -4,7 +4,7 @@ import { Plugin } from "@typings/plugin"; import { Filters } from "@libs/filterInputs"; class NovelHall implements Plugin.PluginBase { - id = "novelhold"; + id = "novelhall"; name = "Novel Hall"; version = "1.0.0"; icon = "src/en/novelhall/icon.png"; diff --git a/plugins/spanish/tunovelaligera.ts b/plugins/spanish/tunovelaligera.ts index 82c9177..97e37b8 100644 --- a/plugins/spanish/tunovelaligera.ts +++ b/plugins/spanish/tunovelaligera.ts @@ -1,8 +1,7 @@ -import { CheerioAPI, load as parseHTML } from "cheerio"; +import { load as parseHTML } from "cheerio"; import { fetchApi, fetchFile } from "@libs/fetch"; import { FilterTypes, Filters } from "@libs/filterInputs"; import { Plugin } from "@typings/plugin"; -import { showToast } from "@libs/showToast"; import { defaultCover } from "@libs/defaultCover"; import { NovelStatus } from "@libs/novelStatus"; @@ -116,8 +115,6 @@ class TuNovelaLigera implements Plugin.PluginBase { const getChapters = async () => { const n = url.split("/"); const novelName = n[4]; - showToast("Cargando desde Archivo..."); - const formData = new FormData(); formData.append("action", "madara_load_more"); formData.append("page", "0"); @@ -158,7 +155,6 @@ class TuNovelaLigera implements Plugin.PluginBase { const getPageChapters = async () => { for (let i = 1; i <= lastPage; i++) { const chaptersUrl = `${novelUrl}?lcp_page0=${i}`; - showToast(`Cargando desde la página ${i}/${lastPage}...`); const result = await fetchApi(chaptersUrl, { headers }); const chaptersHTML = await result.text(); @@ -193,7 +189,6 @@ class TuNovelaLigera implements Plugin.PluginBase { novel.chapters = await getChapters(); if (!novel.chapters.length) { - showToast("¡Archivo no encontrado!"); await delay(1000); novel.chapters = await getPageChapters(); } diff --git a/types/plugin.ts b/types/plugin.ts index 52fc559..1c0ac99 100644 --- a/types/plugin.ts +++ b/types/plugin.ts @@ -13,7 +13,6 @@ export namespace Plugin { */ releaseTime?: string | number | null; chapterNumber?: number; - volumn?: number; } export interface NovelItem { name: string;