diff --git a/plugins/french/rezerowebnovelfr.ts b/plugins/french/rezerowebnovelfr.ts new file mode 100644 index 000000000..0c370f38c --- /dev/null +++ b/plugins/french/rezerowebnovelfr.ts @@ -0,0 +1,841 @@ +import { CheerioAPI, load } from 'cheerio'; +import { fetchApi } from '@libs/fetch'; +import { Plugin } from '@/types/plugin'; +import { NovelStatus } from '@libs/novelStatus'; + +const NOVEL_METADATA: Record = { + '/histoire-principale/': { + name: 'Re:Zero - Histoire Principale', + summary: 'Histoire principale de Re:Zero traduite en français.', + }, + '/histoires-annexes/': { + name: 'Re:Zero - Histoires Annexes', + summary: + 'Histoires annexes (Side Stories) de Re:Zero traduites en français.', + }, + '/if-stories/': { + name: 'Re:Zero - IF Stories', + summary: + 'Histoires alternatives (IF Stories) de Re:Zero traduites en français.', + }, +}; + +const NOVEL_COVER = + 'https://rezerowebnovelfr.wordpress.com/wp-content/uploads/2021/03/sans-titre-1.png'; + +const EXISTING_SCANLATORS: Record = { + '/2021/06/12/arc-i-chapitre-4-compensation-pour-un-oreiller/': 'SNUserTL', + '/2021/06/12/arc-i-prologue-la-chaleur-residuelle-du-commencement/': + 'SNUserTL', + '/2021/06/12/arc-i-chapitre-3-premiere-rencontre-avec-la-magie/': 'SNUserTL', + '/2021/06/13/arc-i-chapitre-7-des-retrouvailles-incomprehensibles/': + 'SNUserTL', + '/2021/07/14/arc-i-interlude-la-lune-observe/': 'SNUserTL', + '/2021/06/28/arc-i-chapitre-20-le-groupe-est-au-complet/': 'SNUserTL', + '/2021/07/14/arc-i-chapitre-21-la-puissance-du-maitre-epeiste/': 'SNUserTL', + '/2021/06/24/arc-i-chapitre-13-fin-et-commencement/': 'SNUserTL', + '/2021/06/15/arc-i-chapitre-12-les-retrouvailles-avec-la-sorciere/': + 'SNUserTL', + '/2021/06/24/arc-i-chapitre-14-la-quatrieme-fois-est-la-bonne/': 'SNUserTL', + '/2021/06/13/arc-i-chapitre-9-atout/': 'SNUserTL', + '/2021/07/29/arc-ii-chapitre-2-la-gardienne-de-la-bibliotheque-interdite-et-les-servantes-jumelles/': + 'Eminent Translations', + '/2021/06/12/arc-i-chapitre-5-ton-nom/': 'SNUserTL', + '/2021/06/12/arc-i-chapitre-1-linutile-piece-de-10-yens-striee/': 'SNUserTL', + '/2021/06/12/arc-i-chapitre-6-la-fin-du-commencement/': 'SNUserTL', + '/2021/06/26/arc-i-chapitre-17-negociation-dans-la-maison-du-receleur/': + 'SNUserTL', + '/2021/07/14/arc-i-chapitre-22-vivre-dans-un-autre-monde-a-partir-de-zero/': + 'SNUserTL', + '/2021/06/12/arc-i-chapitre-2-ne-temporte-pas-declara-dieu/': 'SNUserTL', + '/2021/06/28/arc-i-chapitre-19-bataille-dun-spiritualiste/': 'SNUserTL', + '/2021/06/24/arc-i-chapitre-15-parce-quil-est-le-saint-de-lepee/': 'SNUserTL', + '/2021/07/29/arc-ii-chapitre-3-je-ne-peux-plus-etre-une-mariee/': + 'Eminent Translations', + '/2021/06/13/arc-i-chapitre-8-le-gout-amer-de-lalcool/': 'SNUserTL', + '/2021/07/29/arc-ii-chapitre-4-seance-dentrainement-dans-un-autre-monde/': + 'Eminent Translations', + '/2021/06/15/arc-i-chapitre-11-une-lutte-trop-tardive/': 'SNUserTL', + '/2021/06/26/arc-i-chapitre-16-negociation-dans-les-bidonvilles/': 'SNUserTL', + '/2021/07/30/arc-ii-chapitre-6-le-retour-du-margrave/': + 'Eminent Translations', + '/2021/07/29/arc-ii-chapitre-1-le-plafond-inconnu-le-couloir-sans-fin/': + 'Eminent Translations', + '/2021/06/15/arc-i-chapitre-10-les-consequences-pour-ceux-qui-ne-savent-pas-tenir-leur-langue/': + 'SNUserTL', + '/2021/06/26/arc-i-chapitre-18-bataille-dans-la-maison-du-receleur/': + 'SNUserTL', + '/2021/07/29/arc-ii-chapitre-5-prise-de-conscience-des-emotions/': + 'Eminent Translations', + '/2022/05/31/arc-ii-chapitre-11-le-rassemblement-harmonieux-de-lapres-repas/': + 'Eminent Translations', + '/2021/06/10/arc-iii-interlude-chapitre-1-scene-a-bord-dun-chariot-draconique/': + 'Ankaa Burner', + '/2022/05/31/arc-ii-chapitre-13-le-matin-promis-est-lointain/': + 'Eminent Translations', + '/2021/06/10/arc-iii-interlude-chapitre-2-que-le-festin-commence/': + 'Ankaa Burner', + '/2023/09/24/arc-ii-chapitre-19-les-resultats-de-la-lecture-et-de-lecriture/': + 'Eminent Translations', + '/2020/10/22/arc-4-interlude-chapitre-4-la-naissance-du-ministre-des-affaires-interieures-de-la-faction-emilia/': + 'Ankaa Burner', + '/2020/11/26/arc-5-chapitre-1-ca-commence-toujours-avec-un-visiteur/': + 'Summary Anon', + '/2020/11/05/arc-4-interlude-chapitre-6-une-derniere-chose/': 'Ankaa Burner', + '/2021/02/04/arc-5-chapitre-3-a-chacun-son-point-de-vue/': 'Summary Anon', + '/2022/05/31/arc-ii-chapitre-16-la-confusion-de-la-deuxieme-boucle/': + 'Eminent Translations', + '/2022/08/13/arc-ii-chapitre-17-le-son-dune-chaine/': 'Eminent Translations', + '/2022/05/31/arc-ii-chapitre-15-la-deuxieme-erreur-de-jugement-et-la-trahison-des-attentes/': + 'Eminent Translations', + '/2022/05/31/arc-ii-chapitre-12-le-duo-compatible-et-pourtant-incompatible/': + 'Eminent Translations', + '/2021/07/30/arc-ii-chapitre-8-la-situation-du-pays-et-la-position-de-cette-fille/': + 'Eminent Translations', + '/2022/05/31/arc-ii-chapitre-14-declaration-de-rebellion/': + 'Eminent Translations', + '/2020/10/08/arc-4-interlude-chapitre-2-jeunes-ames-et-spectateur/': + 'Ankaa Burner', + '/2021/02/25/arc-5-chapitre-5-1-2-pristella-la-cite-aqueuse/': 'Summary Anon', + '/2021/07/30/arc-ii-chapitre-9-les-fruits-de-la-triple-mort/': + 'Eminent Translations', + '/2020/11/19/arc-4-interlude-chapitre-final-une-danse-absurde-au-clair-de-lune/': + 'Ankaa Burner', + '/2020/10/29/arc-4-interlude-chapitre-5-le-piege-danne-rose-et-les-relations-fraternelles/': + 'Ankaa Burner', + '/2023/07/17/arc-ii-chapitre-18-les-troisiemes-retrouvailles/': + 'Eminent Translations', + '/2021/02/18/arc-5-chapitre-4-sur-la-route/': 'Summary Anon', + '/2021/07/30/arc-ii-chapitre-10-une-negociation-a-double-face/': + 'Eminent Translations', + '/2021/07/30/arc-ii-chapitre-7-la-reunion-conviviale-au-manoir-de-roswaal/': + 'Eminent Translations', + '/2020/10/15/arc-4-interlude-chapitre-3-belle-fille-belle-femme-belle-grand-mere/': + 'Ankaa Burner', + '/2021/06/10/arc-iii-interlude-chapitre-3-chacun-ses-serments/': + 'Ankaa Burner', + '/2021/03/18/arc-5-chapitre-6-deux-chevaliers-spirituels-deux-marchands-avides-et-un-ange-desinteresse/': + 'DiscountAnon/Nanashi-tan', + '/2021/01/21/arc-5-chapitre-2-lignee-du-becheur/': 'Summary Anon', + '/2020/10/01/arc-4-interlude-chapitre-1-la-relation-de-ces-soeurs/': + 'Ankaa Burner', + '/2021/03/25/arc-iv-annexe-avenement/': 'Ankaa Burner', + '/2021/05/22/arc-v-chapitre-13-paisible-diner/': 'Nanashi-tan', + '/2021/08/07/arc-v-chapitre-22-une-reponse-desinvolte/': 'Nanashi-tan', + '/2021/05/03/arc-v-chapitre-11-une-reunion-surprenante-une-reunion-destinee-et-une-reunion-inattendue/': + 'Nanashi-tan', + '/2021/08/15/arc-v-chapitre-23-situation-perturbee/': 'Nanashi-tan', + '/2021/07/24/arc-v-chapitre-20-empathie-partagee/': 'Nanashi-tan', + '/2021/06/05/arc-v-chapitre-14-la-lame-demoniaque-au-clair-de-lune/': + 'Nanashi-tan', + '/2021/10/30/arc-v-chapitre-32-reunion-pour-la-conquete-de-lhotel-de-ville/': + 'Nanashi-tan', + '/2021/12/25/arc-v-chapitre-36-le-commencement-et-la-conclusion-de-lamour/': + 'Nanashi-tan', + '/2021/04/22/arc-v-chapitre-10-les-coutumes-de-la-cite-de-leau/': + 'Nanashi-tan', + '/2021/03/25/arc-5-chapitre-7-le-pecheur-met-les-voiles/': + 'Discount Anon/Nanashi-tan', + '/2021/10/03/arc-v-chapitre-29-gorgeous-tiger/': 'Nanashi-tan', + '/2021/07/03/arc-v-chapitre-17-cette-armure-toujours-presente/': + 'Nanashi-tan', + '/2021/07/10/arc-v-chapitre-18-un-temps-pour-le-chant-et-la-danse/': + 'Nanashi-tan', + '/2021/09/04/arc-v-chapitre-26-lance-damour/': 'Nanashi-tan', + '/2021/07/18/arc-v-chapitre-19-le-theatre-de-la-malice/': 'Nanashi-tan', + '/2021/10/09/arc-5-chapitre-30-tigre-et-chat-sous-la-lune/': 'Nanashi-tan', + '/2021/11/20/arc-v-chapitre-35-embuscades-et-surprises/': 'Nanashi-tan', + '/2021/04/08/1427/': 'Discount Anon/Nanashi-tan', + '/2021/05/15/arc-v-chapitre-12-latmosphere-ecrasante-du-salon-de-the/': + 'Nanashi-tan', + '/2021/11/15/arc-v-chapitre-34-maniement-a-lepee-et-melee/': 'Nanashi-tan', + '/2021/06/19/arc-v-chapitre-15-un-silence-assourdissant/': 'Nanashi-tan', + '/2021/06/26/arc-v-chapitre-16-invites-imprevus/': 'Nanashi-tan', + '/2021/07/31/arc-v-chapitre-21-solution-optimale/': 'Nanashi-tan', + '/2021/04/15/arc-v-chapitre-9-la-valeur-dune-diva/': 'Nanashi-tan', + '/2021/08/28/arc-v-chapitre-25-le-theatre-de-leo/': 'Nanashi-tan', + '/2021/09/11/arc-v-chapitre-27-bruit/': 'Nanashi-tan', + '/2021/11/08/arc-v-chapitre-33-bataille-pour-la-conquete-de-lhotel-de-ville/': + 'Nanashi-tan', + '/2021/08/21/arc-v-chapitre-24-resolution-de-glace-et-de-feu/': 'Nanashi-tan', + '/2021/09/19/arc-v-chapitre-28-une-reunion-strategique-couverte-de-blessures/': + 'Nanashi-tan', + '/2021/10/17/arc-v-chapitre-31-le-prix-dune-erreur/': 'Nanashi-tan', + '/2022/07/30/arc-v-chapitre-59-regulus-corneas/': 'Nanashi-tan et Ringo', + '/2022/01/15/arc-v-chapitre-39-chevalerie-et-le-retardataire/': 'Nanashi-tan', + '/2022/06/11/arc-v-chapitre-52-les-etoiles-et-les-archeveques-du-peche/': + 'Nanashi-tan, Ringo, Frr et Paper', + '/2022/03/05/arc-v-chapitre-44-rien-nest-laisse-sous-silence/': + 'TranslationChicken', + '/2022/07/23/arc-v-chapitre-58-foi/': 'Nanashi-tan', + '/2022/01/08/arc-v-chapitre-38-les-demandes-du-culte-de-la-sorciere/': + 'Nanashi-tan', + '/2022/09/03/arc-v-chapitre-64-le-decouragement-de-liliana-masquerade/': + 'Nanashi-tan', + '/2022/08/13/arc-v-chapitre-61-victime-du-territoire/': 'Nanashi-tan', + '/2022/08/05/arc-v-chapitre-60-une-conclusion-une-bataille/': + 'Nanashi-tan et Ringo', + '/2022/08/27/arc-v-chapitre-63-la-passion-de-liliana-masquerade/': + 'Nanashi-tan', + '/2022/07/16/arc-v-chapitre-57-la-ou-le-coeur-reside/': 'Nanashi-tan', + '/2022/01/01/arc-v-chapitre-37-gestion-de-la-defaite/': 'Nanashi-tan', + '/2022/01/29/arc-v-chapitre-41-reveries-heroiques/': 'TranslationChicken', + '/2022/09/17/arc-v-chapitre-66-la-scene-de-liliana-masquerade/': + 'Nanashi-tan', + '/2022/02/12/arc-v-chapitre-43-avant-le-rendez-vous/': 'Fr', + '/2022/05/21/arc-v-chapitre-49-ainsi-debute-la-croisade-contre-lavarice/': + 'Nanashi-tan', + '/2022/09/11/arc-v-chapitre-65-le-regret-de-liliana-masquerade/': + 'Nanashi-tan', + '/2022/06/18/arc-v-chapitre-53-une-ville-de-luttes/': 'Ringo et Nanashi-tan', + '/2022/06/26/arc-v-chapitre-54-la-puissance-de-combat-des-non-combattants/': + 'Ringo et Nanashi-tan', + '/2022/03/12/arc-v-chapitre-45-une-malediction-inexorable/': 'Fr', + '/2022/07/02/arc-v-chapitre-55-ladversaire-du-dieu-de-la-guerre/': + 'Nanashi-tan', + '/2022/06/05/arc-v-chapitre-51-la-malice-dans-la-tromperie/': + 'Nanashi-tan et Ringo', + '/2022/01/22/arc-v-chapitre-40-corrosion-de-la-colere/': 'Nanashi-tan', + '/2022/03/27/arc-v-chapitre-47-lavant-poste-de-la-strategie-de-reconquete-de-la-ville/': + 'Fr', + '/2022/05/14/arc-v-chapitre-48-la-personne-dont-je-tomberai-un-jour-amoureuse/': + 'TranslationChicken', + '/2022/05/28/arc-v-chapitre-50-les-chaines-de-lamour/': 'Nanashi-tan', + '/2022/07/09/arc-v-chapitre-56-signature-dun-divorce/': 'Nanashi-tan', + '/2022/02/07/arc-v-chapitre-42-le-plus-recent-des-heros-et-le-plus-ancien-des-heros-%ef%bf%bc/': + 'TranslationChicken', + '/2022/03/19/arc-v-chapitre-46-un-etat-desprit/': 'TranslationChicken', + '/2022/08/20/arc-v-chapitre-62-leloge-du-guerrier/': 'Nanashi-tan et Ringo', + '/2022/10/08/arc-v-chapitre-69-un-banquet-repugnant/': 'Ringo', + '/2022/10/23/arc-v-chapitre-70-eclipse/': 'Ringo', + '/2022/10/29/arc-v-chapitre-71-la-lame-demoniaque-contre-lancienne-maitre-epeiste/': + 'Ringo', + '/2023/03/11/arc-vi-chapitre-9-percee-dans-le-temps-du-sable/': 'Remonwater', + '/2022/10/01/arc-v-chapitre-68-mangeur-de-nom-gourmet/': 'Ringo', + '/2023/02/04/arc-vi-chapitre-4-une-raison-de-temmener-hors-dici/': + 'Remonwater', + '/2023/01/21/arc-vi-chapitre-2-sa-facon-doffrir-un-accueil-chaleureux/': + 'Remonwater', + '/2023/02/18/arc-vi-chapitre-6-la-denomination-juukulius/': 'Remonwater', + '/2023/02/11/arc-vi-chapitre-5-a-chacun-son-mal-etre/': 'Remonwater', + '/2023/03/25/arc-vi-chapitre-11-une-voix-audible-et-larmoyante/': 'Ringo', + '/2023/03/18/arc-vi-chapitre-10-en-un-eclair/': 'Ringo', + '/2022/11/13/arc-v-chapitre-74-les-consequences-de-la-bataille-pour-pristella-1/': + 'Gracedharperd et Ice', + '/2023/04/03/arc-vi-chapitre-12-le-bapteme-de-la-tour-de-guet/': 'Mahubrobin', + '/2023/01/14/arc-vi-chapitre-1-le-chemin-du-retour-du-carrosse-draconique/': + 'Remonwater', + '/2023/02/25/arc-vi-chapitre-7-cap-vers-la-mer-de-sable/': 'Remonwater', + '/2022/12/24/arc-v-chapitre-81-ceux-qui-comblent-le-receptacle-de-lavarice/': + 'Ice et Gracedharperd', + '/2023/01/28/arc-vi-chapitre-3-la-cellule-de-la-petite-fille/': 'Remonwater', + '/2022/11/19/arc-v-chapitre-75-les-consequences-de-la-bataille-pour-pristella-2/': + 'Ice et Graced', + '/2022/12/17/arc-v-chapitre-80-laissant-derriere-des-ondulations-a-la-surface-de-leau/': + 'Ice', + '/2022/09/24/arc-v-chapitre-67-liliana-masquerade/': 'Nanashi-tan', + '/2022/12/10/arc-v-chapitre-79-la-tour-de-guet-du-sage/': 'Ice', + '/2022/11/26/arc-v-chapitre-77-un-chevalier-sans-nom/': 'Ringo', + '/2022/12/24/arc-v-interlude-i-les-conditions-requises-du-couple/': + 'Heretic Translations', + '/2022/12/24/arc-v-interlude-iii-nom-de-la-chaleur/': 'Heretic Translations', + '/2023/03/04/arc-vi-chapitre-8-le-bapteme-des-dunes-de-sable/': 'Remonwater', + '/2022/11/19/arc-v-chapitre-76-les-consequences-de-la-bataille-pour-pristella-3/': + 'Ice et Graced', + '/2022/11/05/arc-v-chapitre-73-theresia-van-astrea/': 'Ringo', + '/2022/12/24/arc-v-interlude-ii-talent-inexploite/': 'Heretic Translations', + '/2022/10/29/arc-v-chapitre-72-maitre-epeiste-contre-maitre-epeiste-de-la-generation-precedente/': + 'Ringo', + '/2022/12/03/arc-v-chapitre-78-les-derniers-remous-de-la-cite-aqueuse/': + 'Ice', + '/2023/04/17/arc-vi-chapitre-14-une-foi-batie-sur-le-sable/': 'Ice', + '/2023/06/26/arc-vi-chapitre-24-un-examinateur-contrariant/': 'Hedge', + '/2023/07/10/arc-vi-chapitre-26-manieur-de-baton/': 'Hedge et Ringo', + '/2023/06/10/arc-vi-chapitre-22-lasterisme-du-ciel-blanc-etoile/': 'Ice', + '/2023/04/08/arc-vi-chapitre-13-le-ridicule-du-sable/': 'Mahubrobin', + '/2023/04/22/arc-vi-chapitre-15-eparpilles-sur-le-sable/': 'Ice', + '/2023/09/24/arc-vi-chapitre-37-un-reve-en-papier-mache/': 'Ice', + '/2023/04/29/arc-vi-chapitre-16-des-restes-maches/': 'Mahubrobin', + '/2023/08/19/arc-vi-chapitre-32-qui-au-juste/': 'Ringo', + '/2023/07/31/arc-vi-chapitre-29-loser/': 'Ice', + '/2023/06/03/arc-vi-chapitre-21-le-defi-du-monolithe/': 'Ice', + '/2023/05/13/arc-vi-chapitre-18-la-gardienne-de-la-tour-de-sable/': + 'Ice et Furuta', + '/2023/10/09/arc-vi-chapitre-39-ruines/': 'Ice et Jaerek', + '/2023/06/16/arc-vi-chapitre-23-le-troisieme-etage-de-la-bibliotheque-linspection-de-taygete/': + 'Nana et Ringo', + '/2023/08/12/arc-vi-chapitre-31-un-encouragement-a-la-cooperation-dans-la-tour/': + 'Hedge', + '/2023/08/28/arc-vi-chapitre-33-%e2%96%a0%e2%96%a0%e2%96%a0-%e2%97%8f-%e2%96%a0%e2%96%a0%e2%96%a0/': + 'TranslationChicken', + '/2023/07/15/arc-vi-chapitre-27-le-mur-delectre/': 'Ice et Ringo', + '/2023/05/27/arc-vi-chapitre-20-shaula-%e2%89%a0-sage-flugel/': 'Ice', + '/2023/07/22/arc-vi-chapitre-28-julius-juukulius/': 'Gracedharperd et Paper', + '/2023/10/15/arc-vi-chapitre-40-delaisse-par-les-etoiles/': 'Ice', + '/2023/09/10/arc-vi-chapitre-35-relations-tendues/': 'TranslationChicken', + '/2023/09/16/arc-vi-chapitre-36-un-lieu-de-soulagement/': 'Ice', + '/2023/05/20/arc-vi-chapitre-19-quen-est-il-du-sage/': 'Ice et Ringo', + '/2023/10/23/arc-vi-chapitre-41-un-parfum-apaisant/': 'Ice', + '/2023/09/30/arc-vi-chapitre-38-qui-es-tu/': 'Ice et Jaerek', + '/2023/11/04/arc-vi-chapitre-42-la-tour-des-morts/': 'Ice', + '/2023/08/05/arc-vi-chapitre-30-la-strategie-de-capture-post-mortem-du-deuxieme-etage/': + 'Hedge et Nanashi', + '/2023/09/02/arc-vi-chapitre-34-au-dehors-de-la-superette-se-trouvait-un-monde-merveilleux/': + 'TranslationChicken', + '/2023/05/07/arc-vi-chapitre-17-le-roi-de-la-mer-de-sable/': + 'Ice et u/WintryOne', + '/2023/07/03/arc-vi-chapitre-25-lhomme-qui-attend-au-deuxieme-etage-electre/': + 'Hedge', + '/2023/12/30/arc-vi-chapitre-51-la-tour-des-vivants-partie-2/': + 'Ice, Nana et Furuta', + '/2023/12/11/arc-vi-chapitre-48-le-meurtre-est-une-habitude/': + 'Ice, Furuta, Jaerek et Ringo', + '/2024/01/13/arc-vi-chapitre-53-%e2%80%95%e2%80%95une-voix-carillonna/': + 'Ringo', + '/2023/11/25/arc-vi-chapitre-46-meili-portroute/': + 'Ice, Furuta, Ringo et Paperlightning', + '/2023/12/23/arc-vi-chapitre-50-a-toi-labsolue-pietre-imitation/': + 'Ice et PaperLightning', + '/2023/12/03/arc-vi-chapitre-47-je-ne-te-pardonnerai-pas/': 'Ice', + '/2024/02/03/arc-vi-chapitre-56-parlons-de-ce-qui-nous-attend/': 'Ringo', + '/2023/11/11/arc-vi-chapitre-44-medaille-de-sang/': 'Ice', + '/2024/01/30/arc-vi-chapitre-55-toi-qui-attends-la-fonte-des-neiges/': + 'Ringo', + '/2024/02/24/arc-vi-chapitre-59-ce-qui-sourit-dans-le-monde-blanc/': 'Ringo', + '/2023/11/04/arc-vi-chapitre-43-la-tour-des-vivants/': 'Ice', + '/2024/03/18/arc-vi-chapitre-62-les-tremblements-de-leffondrement/': 'Ringo', + '/2024/04/23/arc-vi-chapitre-67-petit-roi/': 'Ringo', + '/2024/02/12/arc-vi-chapitre-57-nen-tenons-pas-compte-pour-linstant/': + 'Ringo', + '/2023/12/16/arc-vi-chapitre-49-a-toi-la-pietre-imitation/': 'Ice', + '/2024/01/08/arc-vi-chapitre-52-dieu-sil-te-plait-pardonne-moi/': + 'Furuta, Paper, Ice, Ringo et Nanashi', + '/2024/02/17/arc-vi-chapitre-58-ceci-est-ceci-cela-est-cela/': 'Ringo', + '/2024/05/19/arc-vi-chapitre-71-count-one/': 'Ringo', + '/2024/03/02/arc-vi-chapitre-60-un-seul-rayon-de-soleil/': 'Ringo', + '/2024/03/30/arc-vi-chapitre-64-le-deuxieme-obstacle/': 'Ringo', + '/2024/05/04/arc-vi-chapitre-69-labsurde-marteau-de-fer-de-lepee/': 'Ringo', + '/2024/03/23/arc-vi-chapitre-63-cinq-obstacles/': 'Ringo', + '/2024/01/21/arc-vi-chapitre-54-revivre-dans-un-autre-monde-a-partir-de-zero/': + 'Ice', + '/2024/04/13/arc-vi-chapitre-66-deuxieme-chance-jusquau-denouement/': 'Ringo', + '/2024/04/27/arc-vi-chapitre-68-la-femme-de-scorpius/': 'Ringo', + '/2024/03/11/arc-vi-chapitre-61-%e2%80%95%e2%80%95leve-toi/': 'Ringo', + '/2024/05/25/arc-vi-chapitre-72/': 'Ringo', + '/2024/04/06/arc-vi-chapitre-65-le-deuxieme-le-cinquieme-suivis-de%e2%80%95%e2%80%95/': + 'Ringo', + '/2023/11/20/arc-vi-chapitre-45-letreinte-de-la-culpabilite/': + 'Ice, Furuta, Ringo et Paperlightning', + '/2024/05/11/arc-vi-chapitre-70-letoile-sincere/': 'Ringo', + '/2024/07/02/arc-vi-chapitre-77-le-flambeau-de-la-contre-attaque/': 'Ringo', + '/2024/06/18/arc-vi-chapitre-75-rui-arneb/': 'Ringo', + '/2024/09/15/arc-vi-chapitre-86-converser-a-propos-de-ce-que-hier-recelait/': + 'Ringo', + '/2024/06/01/arc-vi-chapitre-73-natsuki-subaru/': 'Ringo', + '/2024/07/07/arc-vi-chapitre-78-quatre-coins/': 'Auteur anonyme', + '/2024/06/23/arc-vi-chapitre-76-lenfer-qui-porte-le-nom-de-soi-meme/': + 'Ringo', + '/2024/09/18/arc-vi-chapitre-87-regard-distant/': 'Ringo et Hedge', + '/2024/07/20/arc-vi-chapitre-80-mort-de-lesprit/': 'Ringo', + '/2024/08/04/arc-vi-chapitre-82-une-bataille-sous-entraves/': 'Ringo', + '/2024/08/20/arc-vi-chapitre-84-ho-hisse-ho-hisse/': 'Ringo', + '/2024/07/27/arc-vi-chapitre-81-%e2%80%95%e2%80%95enchante-de-vous-rencontrer/': + 'Ringo', + '/2024/07/13/arc-vi-chapitre-79-a-vos-marques-prets-partez/': 'Ice et Ringo', + '/2024/09/21/arc-vi-chapitre-88-%e2%80%95%e2%80%95je-sollicite-ta-volonte/': + 'Ringo et Hedge', + '/2024/08/12/arc-vi-chapitre-83-ram/': 'Ringo', + '/2024/09/01/arc-vi-chapitre-85-good-loser/': 'Ringo', + '/2025/01/12/arc-vii-chapitre-7-cetait-dur-detre-un-homme/': 'Ice et Negi', + '/2024/09/28/arc-vi-chapitre-89-shaula/': 'Eminent', + '/2024/12/28/arc-vii-chapitre-3-contre-rem/': 'Negi', + '/2025/01/05/arc-vii-chapitre-5-cest-dur-detre-un-homme/': 'Negi', + '/2025/02/01/arc-vii-chapitre-12-lempire-de-vollachia/': + 'Ice, Hedge, Negi, Kobosuhito et Taurace', + '/2024/12/22/arc-vii-chapitre-2-animal-tracking/': 'Negi', + '/2025/01/11/arc-vii-chapitre-6-une-terre-lointaine-au-sud/': + 'Ice et Erifuru', + '/2024/12/21/arc-vii-chapitre-1-bapteme/': 'Ice, Hedge, Ringo et Negi', + '/2025/01/18/arc-vii-chapitre-8-nom/': 'Ice, Negi, Kobosuhito et Taurace', + '/2024/06/08/arc-vi-chapitre-74-natsuki-subaru/': 'Ringo', + '/2024/10/13/arc-vi-chapitre-90-heros/': 'Eminent', + '/2025/01/04/arc-vii-chapitre-4-un-choix-courageux/': 'Negi et Ice', + '/2025/01/26/arc-vii-chapitre-11-le-rituel-du-serment-de-sang/': + 'Ice, Hedge, Negi, Kobosuhito et Taurace', + '/2025/01/25/arc-vii-chapitre-10-le-peuple-de-shudraq/': + 'Negi, Kobosuhito et Taurace', + '/2025/01/19/arc-vii-chapitre-9-la-facon-de-faire-de-lempire/': + 'Ice, Negi, Kobosuhito et Taurace', + '/2025/03/09/arc-vii-chapitre-21-zikr-osman/': 'Kobosuhito et Taurace', + '/2025/03/09/arc-vii-chapitre-22-le-plan-de-reddition-sans-effusion-de-sang/': + 'Kobosuhito, Taurace et Polaris', + '/2025/08/19/arc-vii-chapitre-28-conditions-de-victoire/': + 'Witch Cult Translation', + '/2025/08/12/arc-vii-chapitre-27-ceux-qui-ont-et-ceux-qui-nont-pas/': + 'Witch Cult Translation', + '/2025/02/09/arc-vii-chapitre-14-des-valeurs-inconciliables/': + 'Negi, Kobosuhito et Taurace', + '/2025/08/30/arc-vii-chapitre-32-la-voie-a-suivre/': 'Witch Cult Translation', + '/2025/09/14/arc-vii-chapitre-37-le-seigneur-du-chateau-du-lapis-ecarlate/': + 'Witch Cult Translation', + '/2025/08/20/arc-vii-chapitre-29-a-chacun-sa-posture/': + 'Witch Cult Translation', + '/2025/08/01/arc-vii-chapitre-26-la-reunion-dansante-de-la-table-ronde/': + 'Witch Cult Translation', + '/2025/08/31/arc-vii-chapitre-33-en-avant-vers-la-cite-demoniaque/': + 'Witch Cult Translation', + '/2025/08/23/arc-vii-chapitre-31-une-conversation-entre-compatriotes/': + 'Witch Cult Translation', + '/2025/09/13/arc-vii-chapitre-36-la-cite-demoniaque-chaotique/': + 'Witch Cult Translation', + '/2025/09/21/arc-vii-chapitre-39-scelerat/': 'Witch Cult Translation', + '/2025/02/18/arc-vii-chapitre-15-ceux-que-je-veux-proteger/': + 'Negi, Kobosuhito et Taurace', + '/2025/02/09/arc-vii-chapitre-13-en-tant-que-mortel/': 'Negi et Kobosuhito', + '/2025/02/27/arc-vii-chapitre-17-une-menace-imminente/': + 'Negi, Kobosuhito, Taurace et Polaris', + '/2025/09/21/arc-vii-chapitre-38-une-recompense-au-terme-de-huit-annees/': + 'Witch Cult Translation', + '/2025/10/04/arc-vii-chapitre-40-natchuki-shubaru/': 'Witch Cult Translation', + '/2025/04/12/arc-vii-chapitre-25-des-retrouvailles-a-faire-bouillir-le-sang/': + 'Witch Cult Translation', + '/2025/10/05/arc-vii-chapitre-41-une-discussion-autour-dun-the/': + 'Witch Cult Translation', + '/2025/10/12/arc-vii-chapitre-42-un-monstre-dambition/': + 'Witch Cult Translation', + '/2025/09/06/arc-vii-chapitre-34-une-querelle-dans-le-carrosse/': + 'Witch Cult Translation', + '/2025/02/22/arc-vii-chapitre-16-la-situation-dans-lempire/': + 'Negi, Kobosuhito, Taurace, Polaris, Ice et FriedHedgehog', + '/2025/03/02/arc-vii-chapitre-19-des-retrouvailles-exasperantes/': + 'Negi, Kobosuhito et Taurace', + '/2025/03/31/arc-vii-chapitre-24-arrogance/': 'Witch Cult Translation', + '/2025/03/30/arc-vii-chapitre-23-la-musicienne-natsumi-schwartz/': + 'Witch Cult Translation', + '/2025/09/07/arc-vii-chapitre-35-une-nuit-pour-discuter/': + 'Witch Cult Translation', + '/2025/03/08/arc-vii-chapitre-20-empereur-marchand-natsuki-subaru/': + 'Kobosuhito et Taurace', + '/2025/08/22/arc-vii-chapitre-30-natsuki-subaru-le-heros-autoproclame/': + 'Witch Cult Translation', + '/2025/03/01/arc-vii-chapitre-18-bataille-dans-la-ville-fortifiee-de-guaral/': + 'Negi, Kobosuhito, Taurace et Polaris', + '/2025/11/02/arc-vii-chapitre-48-des-objectifs-entremeles-dans-la-cite-demoniaque/': + 'Witch Cult Translation', + '/2026/02/01/arc-vii-chapitre-59-taritta-shudraq/': 'Witch Cult Translation', + '/2025/11/17/arc-vii-chapitre-51-la-maitresse-de-la-cite-demoniaque/': + 'Witch Cult Translation', + '/2026/02/21/arc-vii-chapitre-55b-la-rhapsodie-de-la-ville-fortifiee/': + 'Witch Cult Translation', + '/2025/10/19/arc-vii-chapitre-44-vision-retrecie/': 'Witch Cult Translation', + '/2026/02/23/arc-vii-chapitre-56b-le-cataclysme-des-dragons-aeriens/': + 'Witch Cult Translation', + '/2026/02/25/arc-vii-chapitre-57b-ca-mest-egal-quon-me-traite-de-cretin/': + 'Witch Cult Translation', + '/2026/04/02/arc-vii-chapitre-63-sparka/': 'Witch Cult Translation', + '/2026/01/26/arc-vii-chapitre-58-ceux-qui-nont-nulle-part-ou-aller/': + 'Witch Cult Translation', + '/2025/11/01/arc-vii-chapitre-47-une-%e2%96%a0%e2%96%a0-imperissable/': + 'Witch Cult Translation', + '/2025/12/05/arc-vii-chapitre-54-lutopie-de-chaosflame/': + 'Witch Cult Translation', + '/2025/10/18/arc-vii-chapitre-43-dans-lenvers-des-paupieres/': + 'Witch Cult Translation', + '/2026/03/22/arc-vii-chapitre-61-bienvenue-sur-lile-des-gladiateurs/': + 'Witch Cult Translation', + '/2026/01/11/arc-vii-chapitre-55-la-rhapsodie-de-la-cite-demoniaque/': + 'Witch Cult Translation', + '/2026/02/04/arc-vii-chapitre-60-les-graines-du-tumulte/': + 'Witch Cult Translation', + '/2025/11/19/arc-vii-chapitre-52-lamour-ne-saurait-se-ceder/': + 'Witch Cult Translation', + '/2025/10/26/arc-vii-chapitre-46-temerite-enfantine/': + 'Witch Cult Translation', + '/2026/04/12/arc-vii-chapitre-66-hian-yatz/': 'Capella et Akira', + '/2025/11/09/arc-vii-chapitre-49-les-etoiles-se-sont-alignees/': + 'Witch Cult Translation', + '/2025/10/25/arc-vii-chapitre-45-konkon/': 'Witch Cult Translation', + '/2026/04/03/arc-vii-chapitre-64-des-mots-magiques/': + 'Witch Cult Translation', + '/2026/04/09/arc-vii-chapitre-65-le-guerrier-des-repas-scolaires/': + 'Witch Cult Translation', + '/2026/01/13/arc-vii-chapitre-56-le-grand-desastre/': + 'Witch Cult Translation', + '/2025/11/10/arc-vii-chapitre-50-un-trou-avec-une-belle-vue/': + 'Witch Cult Translation', + '/2025/11/22/arc-vii-chapitre-53-au-dela-de-la-onzieme-seconde/': + 'Witch Cult Translation', + '/2026/02/16/arc-vii-chapitre-54b-recouvrant-le-ciel-azur/': + 'Witch Cult Translation', + '/2026/01/26/arc-vii-chapitre-57-je-ne-peux-pas-vivre-avec-sagesse/': + 'Witch Cult Translation', + '/2026/03/25/arc-vii-chapitre-62-lordre-de-lile/': 'Witch Cult Translation', + '/2026/03/04/arc-vii-chapitre-59b-flop-oconnell/': 'Witch Cult Translation', + '/2026/02/28/arc-vii-chapitre-58b-ceux-qui-ne-possedent-aucun-refuge/': + 'Witch Cult Translation', + '/2026/05/06/arc-vii-chapitre-72-des-rumeurs-absurdes/': + 'Witch Cult Translation', + '/2025/12/24/histoire-annexe-rem-rencontre-subaru/': 'Remonwater', + '/2025/12/22/histoire-annexe-le-cours-du-ciel-etoile-demilia/': 'Reddagh', + '/2026/04/18/arc-vii-chapitre-68-la-providence-du-loup-empale/': + 'Witch Cult Translation', + '/2026/04/27/arc-vii-chapitre-71-eau/': 'Witch Cult Translation', + '/2026/01/04/histoire-annexe-les-liens-geles-prelude-des-jours-glaces/': + 'Wakaran', + '/2024/11/03/histoire-annexe-les-ovations-de-priscilla-a-mon-egard-partie-divertissement/': + 'Xrakix et WintryOne', + '/2026/01/07/histoire-annexe-lafter-tea-party-de-la-sorciere-le-debrief-des-sorcieres/': + 'Ice', + '/2024/12/09/histoire-annexe-le-loup-solitaire-des-bidonvilles-les-journees-agitees-de-felt/': + 'Eminent', + '/2026/04/21/arc-vii-chapitre-69-en-provenance-de-la-capitale-imperiale/': + 'Witch Cult Translation', + '/2025/03/12/histoire-annexe-my-fair-bad-lady/': 'Remonwater', + '/2024/12/24/histoire-annexe-lhistoire-damour-de-la-lame-demoniaque-le-pere-de-la-mariee/': + 'Eminent', + '/2024/11/02/histoire-annexe-another-memory-snow/': 'SNUserTL', + '/2025/10/29/histoire-annexe-la-chronique-touristique-demilia-a-la-capitale/': + 'SNUserTL', + '/2026/03/20/histoire-annexe-le-grand-debrief-du-camp-demilia/': 'SNUserTL', + '/2024/10/26/histoire-annexe-al-visual-complete/': 'Ice', + '/2025/01/03/histoire-annexe-lhistoire-damour-de-la-lame-demoniaque-les-coulisses-de-la-lune-de-miel/': + 'Eminent', + '/2025/01/02/histoire-annexe-lhistoire-damour-de-la-lame-demoniaque-la-capitale-des-dragons-terrestres-flandres/': + 'Eminent', + '/2024/12/30/histoire-annexe-lafter-tea-party-de-la-sorciere/': 'Eminent', + '/2024/11/17/histoire-annexe-la-lumiere-du-soleil-illuminant-la-surface-de-leau/': + 'Negi', + '/2025/12/24/histoire-annexe-le-premier-rencard-demilia/': 'SnuserTL', + '/2024/11/24/histoire-annexe-orgueil-prejuges-et-zombies/': 'Negi', + '/2024/11/11/histoire-annexe-le-jour-ou-jai-renonce-a-etre-une-etoile-suivante/': + 'Xrakix', + '/2026/05/11/arc-vii-chapitre-73-weitz-rogen/': 'Witch Cult Translation', + '/2026/01/05/histoire-annexe-lafter-tea-party-de-la-sorciere-les-conditions-pour-devenir-une-sorciere/': + 'Ice', + '/2026/01/01/histoire-annexe-les-liens-geles/': 'SNUserTL', + '/2026/04/13/arc-vii-chapitre-67-derriere-les-molaires/': + 'Witch Cult Translation', + '/2026/04/23/arc-vii-chapitre-70-une-chose/': 'Witch Cult Translation', + '/2026/05/18/arc-vii-chapitre-75-i-know/': 'Witch Cult Translation', + '/2026/05/14/arc-vii-chapitre-74-idra-missanga/': 'Witch Cult Translation', + '/2024/12/11/histoire-annexe-les-ovations-de-priscilla-a-mon-egard-partie-pressentiments-du-chaos/': + 'Ice', + '/2025/08/29/histoire-annexe-la-ballade-guerriere-de-la-lame-demoniaque-le-dernier-acte-des-huit-bras/': + 'Ringo', + '/2024/11/30/histoire-annexe-la-ligue-ecarlate/': 'Eminent', + '/2025/03/14/histoire-annexe-la-ballade-guerriere-de-la-lame-demoniaque-le-champ-de-fleurs-de-ce-jour-la/': + 'Garmadoncar', + '/2024/12/07/histoire-annexe-les-ovations-de-priscilla-a-mon-egard-partie-ombres-de-la-conspiration/': + 'Ice', + '/2024/11/25/histoire-annexe-les-ovations-de-priscilla-a-mon-egard-partie-pere-alcoolique/': + 'Ice', + '/2025/03/14/histoire-annexe-la-ballade-guerriere-de-la-lame-demoniaque-lheritier-astrea/': + 'Garmadoncar', + '/2024/12/12/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-zero-arakiya/': + 'Eminent', + '/2024/12/10/histoire-annexe-les-ovations-de-priscilla-a-mon-egard-partie-declaration-de-guerre/': + 'Ice', + '/2024/12/18/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-zero-vincent/': + 'Erifuru', + '/2026/05/24/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-6/': + 'Eminent', + '/2024/05/25/histoire-annexe-la-deuxieme-encyclopedie-prudente-de-joshua-juukulius/': + 'Ringo, Nanashi-tan et Frr', + '/2024/10/01/histoire-annexe-la-malice-avant-le-theatre/': 'Ringo et Garcar', + '/2024/12/17/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-zero-priscilla/': + 'Eminent', + '/2025/04/02/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-2/': + 'PaperKaminari', + '/2026/03/08/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-5/': + 'Eminent', + '/2025/12/21/histoire-annexe-le-royaume-draconique-la-chronique-de-recherche-de-lenfant-perdu-4/': + 'Erifuru', + '/2025/02/02/histoire-annexe-la-paranoia-provisoire-de-rem-les-mots-creux-dune-oni/': + 'PaperKaminari', + '/2025/09/27/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-3/': + 'Ice', + '/2026/05/24/histoire-annexe-la-paranoia-provisoire-de-rem-oni-ou-serpents-qui-sait-ce-qui-sy-cache/': + 'PaperKaminari', + '/2025/12/06/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-4/': + 'Eminent', + '/2025/09/27/histoire-annexe-la-paranoia-provisoire-de-rem-une-batte-en-metal-pour-une-oni/': + 'PaperKaminari', + '/2025/04/04/histoire-annexe-le-royaume-draconique-la-chronique-de-recherche-de-lenfant-perdu-2/': + 'Eminent', + '/2025/02/02/histoire-annexe-le-royaume-draconique-la-chronique-de-recherche-de-lenfant-perdu-1/': + 'Eminent', + '/2026/03/10/histoire-annexe-le-royaume-draconique-la-chronique-de-recherche-de-lenfant-perdu-5/': + 'Erifuru', + '/2025/04/03/histoire-annexe-la-paranoia-provisoire-de-rem-le-desarroi-dune-oni/': + 'Hedgehog', + '/2025/02/02/histoire-annexe-la-terre-des-loups-mort-aux-faibles-pas-de-pitie-1/': + 'Ice', + '/2025/09/27/histoire-annexe-le-royaume-draconique-la-chronique-de-recherche-de-lenfant-perdu-3/': + 'Erifuru', + '/2025/12/07/histoire-annexe-la-paranoia-provisoire-de-rem-il-ny-a-pas-doni-dans-le-monde-entier/': + 'PaperKaminari', + '/2026/03/09/histoire-annexe-la-paranoia-provisoire-de-rem-profiter-de-labsence-de-loni-pour-faire-la-lessive/': + 'PaperKaminari', + '/2025/12/21/histoire-annexe-stand-by-me-pleiades-2/': 'Eminent', + '/2024/06/02/rezero-academie/': 'Eminent', + '/2023/01/31/ayamatsu-if-resegarer-dans-un-autre-monde-a-partir-de-zero/': + 'Ankaa Burner', + '/2026/03/16/histoire-annexe-stand-by-me-pleiades-3/': 'Eminent', + '/2025/04/06/histoire-annexe-stand-by-me-pleiades-1/': 'Eminent', + '/2022/06/21/kasaneru-if-reaccumuler-dans-un-autre-monde-a-partir-de-zero/': + 'Ice', + '/2024/10/21/tsugihagu-if-re-se-reconstituer-dans-un-autre-monde-a-partir-de-zero/': + 'Ice', + '/2021/06/13/oboreru-if-rese-noyer-dans-un-autre-monde-a-partir-de-zero/': + 'Fr, /Fr81', +}; + +function toRoman(num: number): string { + const romanMap: [number, string][] = [ + [100, 'C'], + [90, 'XC'], + [50, 'L'], + [40, 'XL'], + [10, 'X'], + [9, 'IX'], + [5, 'V'], + [4, 'IV'], + [1, 'I'], + ]; + let roman = ''; + let n = num; + for (const [value, symbol] of romanMap) { + while (n >= value) { + roman += symbol; + n -= value; + } + } + return roman; +} + +function getArcRomanPrefix(matchStr: string): string { + const num = parseInt(matchStr, 10); + if (isNaN(num)) { + return matchStr.toUpperCase(); + } + return toRoman(num); +} + +class ReZeroWebNovelFrPlugin implements Plugin.PluginBase { + id = 'rezerowebnovelfr'; + name = 'Re:Zero Web Novel FR'; + icon = 'src/fr/rezerowebnovelfr/icon.png'; + site = 'https://rezerowebnovelfr.wordpress.com'; + version = '1.0.1'; + + async getCheerio(url: string): Promise { + const r = await fetchApi(url, { + headers: { 'Accept-Encoding': 'deflate' }, + }); + const body = await r.text(); + const $ = load(body); + return $; + } + + async popularNovels(pageNo: number): Promise { + if (pageNo > 1) return []; + + return Object.entries(NOVEL_METADATA).map(([path, meta]) => ({ + name: meta.name, + cover: NOVEL_COVER, + path: path, + })); + } + + async parseNovel(novelPath: string): Promise { + const novel: Plugin.SourceNovel = { + path: novelPath, + name: 'Sans titre', + }; + + const $ = await this.getCheerio(this.site + novelPath); + novel.name = $('h1.entry-title').text().trim(); + novel.author = 'Tappei Nagatsuki'; + novel.status = NovelStatus.Ongoing; + + const meta = NOVEL_METADATA[novelPath]; + if (meta) { + novel.cover = NOVEL_COVER; + novel.summary = meta.summary; + } + + const chapters: Plugin.ChapterItem[] = []; + + const tryAddChapter = ( + href: string | undefined, + name: string, + prefix = '', + ) => { + if (!href || !href.includes(this.site)) return; + const cleanHref = href.split('?')[0]; + const dateMatch = cleanHref.match(/\/(\d{4})\/(\d{2})\/(\d{2})\//); + if (dateMatch && name) { + const path = cleanHref.replace(this.site, ''); + if (!chapters.some(c => c.path === path)) { + const releaseDate = `${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}`; + let cleanName = name; + if (novelPath === '/if-stories/') { + cleanName = name + .replace(/^(Lire|lire|LIRE|LIRE LE)\s+/i, '') + .trim(); + } + const scanlator = EXISTING_SCANLATORS[path]; + chapters.push({ + name: prefix + cleanName, + path, + releaseTime: releaseDate, + ...(scanlator ? { scanlator } : {}), + }); + } + } + }; + + if (novelPath === '/histoire-principale/') { + const arcUrls: string[] = []; + $('.entry-content .wp-block-button a').each((i, el) => { + const href = $(el).attr('href'); + if (href && href.includes(this.site)) { + arcUrls.push(href); + } + }); + + const pages = await Promise.all( + arcUrls.map(async arcUrl => { + try { + const page$ = await this.getCheerio(arcUrl); + return { page$, arcUrl }; + } catch (e) { + return null; + } + }), + ); + + for (const result of pages) { + if (!result) continue; + const { page$, arcUrl } = result; + + // Extract arc designation from URL, e.g. "arc-viii-vincent-vollachia" -> "Arc VIII" + const arcMatch = arcUrl + .replace(this.site, '') + .match(/^\/arc-([^-/]+)/i); + const arcPrefix = arcMatch + ? `Arc ${getArcRomanPrefix(arcMatch[1])} - ` + : ''; + + page$('div.entry-content ul li a, div.entry-content ol li a').each( + (i, el) => { + const href = page$(el).attr('href'); + const name = page$(el).text().trim(); + tryAddChapter(href, name, arcPrefix); + }, + ); + } + } else if (novelPath === '/histoires-annexes/') { + // All arcs are on a single page; h2 elements mark each arc section. + let currentArcPrefix = ''; + const children = $('div.entry-content').children().toArray(); + for (const el of children) { + if (el.type !== 'tag') continue; + const tag = el.tagName.toLowerCase(); + if (tag === 'h2') { + // Extract arc number, e.g. "Arc 1 - Memory Snow" or "ARC I" -> "Arc I - " + const h2Text = $(el).text().trim(); + const arcMatch = h2Text.match(/arc\s+([ivxlcdm]+|\d+)/i); + currentArcPrefix = arcMatch + ? `Arc ${getArcRomanPrefix(arcMatch[1])} - ` + : `${h2Text} - `; + } else { + $(el) + .find('a') + .each((_j, a) => { + const href = $(a).attr('href'); + const name = $(a).text().trim(); + tryAddChapter(href, name, currentArcPrefix); + }); + } + } + } else { + $('.entry-content a').each((i, el) => { + const href = $(el).attr('href'); + const name = $(el).text().trim(); + tryAddChapter(href, name); + }); + } + + // Fetch scanlators for all parsed chapters in parallel batches + const chaptersToFetch = chapters.filter(ch => !ch.scanlator); + const batchSize = 15; + for (let i = 0; i < chaptersToFetch.length; i += batchSize) { + const batch = chaptersToFetch.slice(i, i + batchSize); + await Promise.all( + batch.map(async ch => { + try { + const page$ = await this.getCheerio(this.site + ch.path); + let scanlator = ''; + page$('p').each((_i, pEl) => { + const text = page$(pEl).text(); + const match = text.match(/Traduit.*par\s*:\s*(.+)/i); + if (match) { + scanlator = match[1].trim(); + } + }); + if (scanlator) { + ch.scanlator = scanlator; + } + } catch (e) { + // Ignore error + } + }), + ); + } + + novel.chapters = chapters; + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const $ = await this.getCheerio(this.site + chapterPath); + + // Remove ads, social sharing widgets, like widgets + $( + 'div.entry-content .sharedaddy, div.entry-content .wpcnt, div.entry-content #jp-post-flair, div.entry-content div[id^="atatags-"]', + ).remove(); + + const title = $('h1.entry-title').html() || ''; + const chapter = $('div.entry-content').html() || ''; + return title + chapter; + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + if (pageNo !== 1) return []; + + const popularNovels = this.popularNovels(1); + + const novels = (await popularNovels).filter(novel => + novel.name + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim() + .includes( + searchTerm + .toLowerCase() + .normalize('NFD') + .replace(/[\u0300-\u036f]/g, '') + .trim(), + ), + ); + + return novels; + } +} + +export default new ReZeroWebNovelFrPlugin(); diff --git a/plugins/index.ts b/plugins/index.ts index 14af62d51..25018cf96 100644 --- a/plugins/index.ts +++ b/plugins/index.ts @@ -1,252 +1,253 @@ import { Plugin } from '@/types/plugin'; import p_0 from '@plugins/arabic/ArNovel[madara]'; import p_1 from '@plugins/arabic/Azora[madara]'; -import p_2 from '@plugins/arabic/FreeKolNovel[lightnovelwp]'; -import p_3 from '@plugins/arabic/HizoManga[madara]'; -import p_4 from '@plugins/arabic/KolNovel[lightnovelwp]'; -import p_5 from '@plugins/arabic/Markazriwayat[madara]'; -import p_6 from '@plugins/arabic/Novel4Up[madara]'; -import p_7 from '@plugins/arabic/NovelsParadise[lightnovelwp]'; -import p_8 from '@plugins/arabic/Olaoecyou[madara]'; -import p_9 from '@plugins/arabic/Riwyat[madara]'; -import p_10 from '@plugins/arabic/dilartube'; -import p_11 from '@plugins/arabic/rewayatclub'; +import p_2 from '@plugins/arabic/dilartube'; +import p_3 from '@plugins/arabic/FreeKolNovel[lightnovelwp]'; +import p_4 from '@plugins/arabic/HizoManga[madara]'; +import p_5 from '@plugins/arabic/KolNovel[lightnovelwp]'; +import p_6 from '@plugins/arabic/Markazriwayat[madara]'; +import p_7 from '@plugins/arabic/Novel4Up[madara]'; +import p_8 from '@plugins/arabic/NovelsParadise[lightnovelwp]'; +import p_9 from '@plugins/arabic/Olaoecyou[madara]'; +import p_10 from '@plugins/arabic/rewayatclub'; +import p_11 from '@plugins/arabic/Riwyat[madara]'; import p_12 from '@plugins/arabic/sunovels'; import p_13 from '@plugins/chinese/69shu'; -import p_14 from '@plugins/chinese/Quanben'; -import p_15 from '@plugins/chinese/ixdzs8'; -import p_16 from '@plugins/chinese/linovel'; -import p_17 from '@plugins/chinese/linovelib'; -import p_18 from '@plugins/chinese/linovelib_tw'; -import p_19 from '@plugins/chinese/novel543'; +import p_14 from '@plugins/chinese/ixdzs8'; +import p_15 from '@plugins/chinese/linovel'; +import p_16 from '@plugins/chinese/linovelib'; +import p_17 from '@plugins/chinese/linovelib_tw'; +import p_18 from '@plugins/chinese/novel543'; +import p_19 from '@plugins/chinese/Quanben'; import p_20 from '@plugins/english/AllNovelFull[readnovelfull]'; import p_21 from '@plugins/english/AllNovel[readnovelfull]'; -import p_22 from '@plugins/english/ArcaneTranslations[lightnovelwp]'; -import p_23 from '@plugins/english/BelleReservoir[madara]'; -import p_24 from '@plugins/english/BoxNovel[madara]'; -import p_25 from '@plugins/english/CPUnovel[lightnovelwp]'; +import p_22 from '@plugins/english/ao3'; +import p_23 from '@plugins/english/ArcaneTranslations[lightnovelwp]'; +import p_24 from '@plugins/english/BelleReservoir[madara]'; +import p_25 from '@plugins/english/BoxNovel[madara]'; import p_26 from '@plugins/english/CherryMistCafe[fictioneer]'; -import p_27 from '@plugins/english/CitrusAurora[madara]'; -import p_28 from '@plugins/english/CoralBoutique[madara]'; -import p_29 from '@plugins/english/DaoNovel[madara]'; -import p_30 from '@plugins/english/DaoTranslate[lightnovelwp]'; -import p_31 from '@plugins/english/DaoistQuest[fictioneer]'; -import p_32 from '@plugins/english/DearestRosalie[fictioneer]'; -import p_33 from '@plugins/english/DragonTea[madara]'; -import p_34 from '@plugins/english/Dragonholic[madara]'; -import p_35 from '@plugins/english/DuskBlossoms[madara]'; -import p_36 from '@plugins/english/ElloTL[lightnovelwp]'; -import p_37 from '@plugins/english/Eternalune[madara]'; -import p_38 from '@plugins/english/EtudeTranslations[madara]'; -import p_39 from '@plugins/english/FanNovel[readwn]'; -import p_40 from '@plugins/english/FansMTL[readwn]'; -import p_41 from '@plugins/english/FansTranslations[madara]'; -import p_42 from '@plugins/english/FirstKissNovel[madara]'; -import p_43 from '@plugins/english/Foxaholic[madara]'; -import p_44 from '@plugins/english/FreeWebNovel[readnovelfull]'; -import p_45 from '@plugins/english/GalaxyTranslations[madara]'; -import p_46 from '@plugins/english/Guavaread[madara]'; -import p_47 from '@plugins/english/HiraethTranslation[madara]'; -import p_48 from '@plugins/english/HotNovelPub[hotnovelpub]'; -import p_49 from '@plugins/english/Ippotranslations[lightnovelwp]'; -import p_50 from '@plugins/english/KDTNovels[lightnovelwp]'; -import p_51 from '@plugins/english/KeopiTranslations[lightnovelwp]'; -import p_52 from '@plugins/english/KnoxT[lightnovelwp]'; -import p_53 from '@plugins/english/LazyGirlTranslations[lightnovelwp]'; -import p_54 from '@plugins/english/LibRead[readnovelfull]'; -import p_55 from '@plugins/english/LightNovelCave[lightnovelworld]'; -import p_56 from '@plugins/english/LightNovelHeaven[madara]'; -import p_57 from '@plugins/english/LightNovelPlus[readnovelfull]'; -import p_58 from '@plugins/english/LightNovelPubVip[lightnovelworld]'; -import p_59 from '@plugins/english/LightNovelUpdates[madara]'; -import p_60 from '@plugins/english/LilyontheValley[fictioneer]'; -import p_61 from '@plugins/english/Ltnovel[readwn]'; -import p_62 from '@plugins/english/LulloBox[madara]'; -import p_63 from '@plugins/english/LunarLetters[madara]'; -import p_64 from '@plugins/english/MTLNovel[madara]'; -import p_65 from '@plugins/english/MTLNovel[mtlnovel]'; -import p_66 from '@plugins/english/Meownovel[madara]'; -import p_67 from '@plugins/english/MoonlightNovels[lightnovelwp]'; -import p_68 from '@plugins/english/MostNovel[madara]'; -import p_69 from '@plugins/english/MysticalSeries[madara]'; -import p_70 from '@plugins/english/NeoSekaiTranslations[madara]'; -import p_71 from '@plugins/english/NitroManga[madara]'; -import p_72 from '@plugins/english/NobleMTL[lightnovelwp]'; -import p_73 from '@plugins/english/NoiceTranslations[madara]'; -import p_74 from '@plugins/english/NovelBin[readnovelfull]'; -import p_75 from '@plugins/english/NovelCool[novelcool]'; -import p_76 from '@plugins/english/NovelFull[readnovelfull]'; -import p_77 from '@plugins/english/NovelLib[fictioneer]'; -import p_78 from '@plugins/english/NovelMultiverse[madara]'; -import p_79 from '@plugins/english/NovelNinja[madara]'; -import p_80 from '@plugins/english/NovelOnline'; -import p_81 from '@plugins/english/NovelTranslate[madara]'; -import p_82 from '@plugins/english/NovelsKnight[lightnovelwp]'; -import p_83 from '@plugins/english/PandaMachineTranslations[lightnovelwp]'; -import p_84 from '@plugins/english/PastelTales[madara]'; -import p_85 from '@plugins/english/PenguinSquad[fictioneer]'; -import p_86 from '@plugins/english/Prizma[fictioneer]'; -import p_87 from '@plugins/english/Ranobes[ranobes]'; -import p_88 from '@plugins/english/Ranovel[madara]'; -import p_89 from '@plugins/english/ReadFanfic[madara]'; -import p_90 from '@plugins/english/ReadNovelFull[readnovelfull]'; -import p_91 from '@plugins/english/RequiemTranslations[lightnovelwp]'; -import p_92 from '@plugins/english/SalmonLatte[madara]'; -import p_93 from '@plugins/english/SleepyTranslations[madara]'; -import p_94 from '@plugins/english/SonicMTL[madara]'; -import p_95 from '@plugins/english/SrankManga[madara]'; -import p_96 from '@plugins/english/StorySeedling'; -import p_97 from '@plugins/english/SweetEscape[madara]'; -import p_98 from '@plugins/english/SystemTranslation[lightnovelwp]'; -import p_99 from '@plugins/english/TranslatinOtaku[madara]'; -import p_100 from '@plugins/english/TranslationWeaver[lightnovelwp]'; -import p_101 from '@plugins/english/UniversalNovel[lightnovelwp]'; -import p_102 from '@plugins/english/VandyTranslate[lightnovelwp]'; -import p_103 from '@plugins/english/VioletLily[madara]'; -import p_104 from '@plugins/english/WebNovelLover[madara]'; -import p_105 from '@plugins/english/WebNovelPub[lightnovelworld]'; -import p_106 from '@plugins/english/WebNovelTranslation[madara]'; -import p_107 from '@plugins/english/WhiteMoonlightNovels[lightnovelwp]'; -import p_108 from '@plugins/english/WooksTeahouse[madara]'; -import p_109 from '@plugins/english/WordExcerpt[madara]'; -import p_110 from '@plugins/english/WuxiaSpace[readwn]'; -import p_111 from '@plugins/english/WuxiaV[readwn]'; -import p_112 from '@plugins/english/WuxiaWorldSite[madara]'; -import p_113 from '@plugins/english/Wuxiabox[readwn]'; -import p_114 from '@plugins/english/Wuxiafox[readwn]'; -import p_115 from '@plugins/english/ZetroTranslation[madara]'; -import p_116 from '@plugins/english/ao3'; -import p_117 from '@plugins/english/chrysanthemumgarden'; -import p_118 from '@plugins/english/crimsonscrolls'; -import p_119 from '@plugins/english/divinedaolibrary'; -import p_120 from '@plugins/english/dreambigtl'; -import p_121 from '@plugins/english/faqwikius'; -import p_122 from '@plugins/english/fenrirrealm'; -import p_123 from '@plugins/english/fictionzone'; -import p_124 from '@plugins/english/foxteller'; -import p_125 from '@plugins/english/genesis'; -import p_126 from '@plugins/english/indraTranslations'; -import p_127 from '@plugins/english/inkitt'; -import p_128 from '@plugins/english/inoveltranslation'; -import p_129 from '@plugins/english/leafstudio'; -import p_130 from '@plugins/english/lightnoveltranslation'; -import p_131 from '@plugins/english/lnmtl'; -import p_132 from '@plugins/english/mvlempyr'; -import p_133 from '@plugins/english/novelbuddy'; -import p_134 from '@plugins/english/novelfire'; -import p_135 from '@plugins/english/novelhall'; -import p_136 from '@plugins/english/novelhi'; -import p_137 from '@plugins/english/novelight'; -import p_138 from '@plugins/english/novelrest'; -import p_139 from '@plugins/english/novelupdates'; -import p_140 from '@plugins/english/pawread'; -import p_141 from '@plugins/english/rainofsnow'; -import p_142 from '@plugins/english/readfrom'; -import p_143 from '@plugins/english/relibrary'; -import p_144 from '@plugins/english/royalroad'; -import p_145 from '@plugins/english/scribblehub'; -import p_146 from '@plugins/english/vynovel'; -import p_147 from '@plugins/english/wct'; -import p_148 from '@plugins/english/webnovel'; -import p_149 from '@plugins/english/wtrlab'; -import p_150 from '@plugins/english/wuxiaworld'; -import p_151 from '@plugins/french/LighNovelFR[lightnovelwp]'; -import p_152 from '@plugins/french/MTLNovel(FR)[mtlnovel]'; -import p_153 from '@plugins/french/MassNovel[madara]'; -import p_154 from '@plugins/french/WorldNovel[madara]'; -import p_155 from '@plugins/french/chireads'; -import p_156 from '@plugins/french/harkeneliwood'; -import p_157 from '@plugins/french/kisswood'; -import p_158 from '@plugins/french/noveldeglace'; -import p_159 from '@plugins/french/novelfrance'; -import p_160 from '@plugins/french/novhell'; +import p_27 from '@plugins/english/chrysanthemumgarden'; +import p_28 from '@plugins/english/CitrusAurora[madara]'; +import p_29 from '@plugins/english/CoralBoutique[madara]'; +import p_30 from '@plugins/english/CPUnovel[lightnovelwp]'; +import p_31 from '@plugins/english/crimsonscrolls'; +import p_32 from '@plugins/english/DaoistQuest[fictioneer]'; +import p_33 from '@plugins/english/DaoNovel[madara]'; +import p_34 from '@plugins/english/DaoTranslate[lightnovelwp]'; +import p_35 from '@plugins/english/DearestRosalie[fictioneer]'; +import p_36 from '@plugins/english/divinedaolibrary'; +import p_37 from '@plugins/english/Dragonholic[madara]'; +import p_38 from '@plugins/english/DragonTea[madara]'; +import p_39 from '@plugins/english/dreambigtl'; +import p_40 from '@plugins/english/DuskBlossoms[madara]'; +import p_41 from '@plugins/english/ElloTL[lightnovelwp]'; +import p_42 from '@plugins/english/Eternalune[madara]'; +import p_43 from '@plugins/english/EtudeTranslations[madara]'; +import p_44 from '@plugins/english/FanNovel[readwn]'; +import p_45 from '@plugins/english/FansMTL[readwn]'; +import p_46 from '@plugins/english/FansTranslations[madara]'; +import p_47 from '@plugins/english/faqwikius'; +import p_48 from '@plugins/english/fenrirrealm'; +import p_49 from '@plugins/english/fictionzone'; +import p_50 from '@plugins/english/FirstKissNovel[madara]'; +import p_51 from '@plugins/english/Foxaholic[madara]'; +import p_52 from '@plugins/english/foxteller'; +import p_53 from '@plugins/english/FreeWebNovel[readnovelfull]'; +import p_54 from '@plugins/english/GalaxyTranslations[madara]'; +import p_55 from '@plugins/english/genesis'; +import p_56 from '@plugins/english/Guavaread[madara]'; +import p_57 from '@plugins/english/HiraethTranslation[madara]'; +import p_58 from '@plugins/english/HotNovelPub[hotnovelpub]'; +import p_59 from '@plugins/english/indraTranslations'; +import p_60 from '@plugins/english/inkitt'; +import p_61 from '@plugins/english/inoveltranslation'; +import p_62 from '@plugins/english/Ippotranslations[lightnovelwp]'; +import p_63 from '@plugins/english/KDTNovels[lightnovelwp]'; +import p_64 from '@plugins/english/KeopiTranslations[lightnovelwp]'; +import p_65 from '@plugins/english/KnoxT[lightnovelwp]'; +import p_66 from '@plugins/english/LazyGirlTranslations[lightnovelwp]'; +import p_67 from '@plugins/english/leafstudio'; +import p_68 from '@plugins/english/LibRead[readnovelfull]'; +import p_69 from '@plugins/english/LightNovelCave[lightnovelworld]'; +import p_70 from '@plugins/english/LightNovelHeaven[madara]'; +import p_71 from '@plugins/english/LightNovelPlus[readnovelfull]'; +import p_72 from '@plugins/english/LightNovelPubVip[lightnovelworld]'; +import p_73 from '@plugins/english/lightnoveltranslation'; +import p_74 from '@plugins/english/LightNovelUpdates[madara]'; +import p_75 from '@plugins/english/LilyontheValley[fictioneer]'; +import p_76 from '@plugins/english/lnmtl'; +import p_77 from '@plugins/english/Ltnovel[readwn]'; +import p_78 from '@plugins/english/LulloBox[madara]'; +import p_79 from '@plugins/english/LunarLetters[madara]'; +import p_80 from '@plugins/english/Meownovel[madara]'; +import p_81 from '@plugins/english/MoonlightNovels[lightnovelwp]'; +import p_82 from '@plugins/english/MostNovel[madara]'; +import p_83 from '@plugins/english/MTLNovel[madara]'; +import p_84 from '@plugins/english/MTLNovel[mtlnovel]'; +import p_85 from '@plugins/english/mvlempyr'; +import p_86 from '@plugins/english/MysticalSeries[madara]'; +import p_87 from '@plugins/english/NeoSekaiTranslations[madara]'; +import p_88 from '@plugins/english/NitroManga[madara]'; +import p_89 from '@plugins/english/NobleMTL[lightnovelwp]'; +import p_90 from '@plugins/english/NoiceTranslations[madara]'; +import p_91 from '@plugins/english/NovelBin[readnovelfull]'; +import p_92 from '@plugins/english/novelbuddy'; +import p_93 from '@plugins/english/NovelCool[novelcool]'; +import p_94 from '@plugins/english/novelfire'; +import p_95 from '@plugins/english/NovelFull[readnovelfull]'; +import p_96 from '@plugins/english/novelhall'; +import p_97 from '@plugins/english/novelhi'; +import p_98 from '@plugins/english/novelight'; +import p_99 from '@plugins/english/NovelLib[fictioneer]'; +import p_100 from '@plugins/english/NovelMultiverse[madara]'; +import p_101 from '@plugins/english/NovelNinja[madara]'; +import p_102 from '@plugins/english/NovelOnline'; +import p_103 from '@plugins/english/novelrest'; +import p_104 from '@plugins/english/NovelsKnight[lightnovelwp]'; +import p_105 from '@plugins/english/NovelTranslate[madara]'; +import p_106 from '@plugins/english/novelupdates'; +import p_107 from '@plugins/english/PandaMachineTranslations[lightnovelwp]'; +import p_108 from '@plugins/english/PastelTales[madara]'; +import p_109 from '@plugins/english/pawread'; +import p_110 from '@plugins/english/PenguinSquad[fictioneer]'; +import p_111 from '@plugins/english/Prizma[fictioneer]'; +import p_112 from '@plugins/english/rainofsnow'; +import p_113 from '@plugins/english/Ranobes[ranobes]'; +import p_114 from '@plugins/english/Ranovel[madara]'; +import p_115 from '@plugins/english/ReadFanfic[madara]'; +import p_116 from '@plugins/english/readfrom'; +import p_117 from '@plugins/english/ReadNovelFull[readnovelfull]'; +import p_118 from '@plugins/english/relibrary'; +import p_119 from '@plugins/english/RequiemTranslations[lightnovelwp]'; +import p_120 from '@plugins/english/royalroad'; +import p_121 from '@plugins/english/SalmonLatte[madara]'; +import p_122 from '@plugins/english/scribblehub'; +import p_123 from '@plugins/english/SleepyTranslations[madara]'; +import p_124 from '@plugins/english/SonicMTL[madara]'; +import p_125 from '@plugins/english/SrankManga[madara]'; +import p_126 from '@plugins/english/StorySeedling'; +import p_127 from '@plugins/english/SweetEscape[madara]'; +import p_128 from '@plugins/english/SystemTranslation[lightnovelwp]'; +import p_129 from '@plugins/english/TranslatinOtaku[madara]'; +import p_130 from '@plugins/english/TranslationWeaver[lightnovelwp]'; +import p_131 from '@plugins/english/UniversalNovel[lightnovelwp]'; +import p_132 from '@plugins/english/VandyTranslate[lightnovelwp]'; +import p_133 from '@plugins/english/VioletLily[madara]'; +import p_134 from '@plugins/english/vynovel'; +import p_135 from '@plugins/english/wct'; +import p_136 from '@plugins/english/webnovel'; +import p_137 from '@plugins/english/WebNovelLover[madara]'; +import p_138 from '@plugins/english/WebNovelPub[lightnovelworld]'; +import p_139 from '@plugins/english/WebNovelTranslation[madara]'; +import p_140 from '@plugins/english/WhiteMoonlightNovels[lightnovelwp]'; +import p_141 from '@plugins/english/WooksTeahouse[madara]'; +import p_142 from '@plugins/english/WordExcerpt[madara]'; +import p_143 from '@plugins/english/wtrlab'; +import p_144 from '@plugins/english/Wuxiabox[readwn]'; +import p_145 from '@plugins/english/Wuxiafox[readwn]'; +import p_146 from '@plugins/english/WuxiaSpace[readwn]'; +import p_147 from '@plugins/english/WuxiaV[readwn]'; +import p_148 from '@plugins/english/wuxiaworld'; +import p_149 from '@plugins/english/WuxiaWorldSite[madara]'; +import p_150 from '@plugins/english/ZetroTranslation[madara]'; +import p_151 from '@plugins/french/chireads'; +import p_152 from '@plugins/french/harkeneliwood'; +import p_153 from '@plugins/french/kisswood'; +import p_154 from '@plugins/french/LighNovelFR[lightnovelwp]'; +import p_155 from '@plugins/french/MassNovel[madara]'; +import p_156 from '@plugins/french/MTLNovel(FR)[mtlnovel]'; +import p_157 from '@plugins/french/noveldeglace'; +import p_158 from '@plugins/french/novelfrance'; +import p_159 from '@plugins/french/novhell'; +import p_160 from '@plugins/french/rezerowebnovelfr'; import p_161 from '@plugins/french/warriorlegendtrad'; -import p_162 from '@plugins/french/wuxialnscantrad'; -import p_163 from '@plugins/french/xiaowaz'; -import p_164 from '@plugins/indonesian/BacaLightNovel[lightnovelwp]'; -import p_165 from '@plugins/indonesian/MTLNovel(ID)[mtlnovel]'; -import p_166 from '@plugins/indonesian/MeioNovel[madara]'; -import p_167 from '@plugins/indonesian/NovelBookID[madara]'; -import p_168 from '@plugins/indonesian/SekteNovel[lightnovelwp]'; -import p_169 from '@plugins/indonesian/Vanovel[madara]'; -import p_170 from '@plugins/indonesian/WBNovel[madara]'; -import p_171 from '@plugins/indonesian/indowebnovel'; -import p_172 from '@plugins/indonesian/sakuranovel'; -import p_173 from '@plugins/japanese/Syosetu'; +import p_162 from '@plugins/french/WorldNovel[madara]'; +import p_163 from '@plugins/french/wuxialnscantrad'; +import p_164 from '@plugins/french/xiaowaz'; +import p_165 from '@plugins/indonesian/BacaLightNovel[lightnovelwp]'; +import p_166 from '@plugins/indonesian/indowebnovel'; +import p_167 from '@plugins/indonesian/MeioNovel[madara]'; +import p_168 from '@plugins/indonesian/MTLNovel(ID)[mtlnovel]'; +import p_169 from '@plugins/indonesian/NovelBookID[madara]'; +import p_170 from '@plugins/indonesian/sakuranovel'; +import p_171 from '@plugins/indonesian/SekteNovel[lightnovelwp]'; +import p_172 from '@plugins/indonesian/Vanovel[madara]'; +import p_173 from '@plugins/indonesian/WBNovel[madara]'; import p_174 from '@plugins/japanese/kakuyomu'; -import p_175 from '@plugins/korean/Agitoon'; -import p_176 from '@plugins/korean/FortuneEternal[madara]'; -import p_177 from '@plugins/multi/komga'; -import p_178 from '@plugins/polish/novelki'; -import p_179 from '@plugins/portuguese/BetterNovels[lightnovelwp]'; -import p_180 from '@plugins/portuguese/CentralNovel[lightnovelwp]'; -import p_181 from '@plugins/portuguese/Kiniga[madara]'; -import p_182 from '@plugins/portuguese/LaNovels[hotnovelpub]'; -import p_183 from '@plugins/portuguese/LightNovelBrasil[lightnovelwp]'; -import p_184 from '@plugins/portuguese/MTLNovel(PT)[mtlnovel]'; -import p_185 from '@plugins/portuguese/blogdoamonnovels'; -import p_186 from '@plugins/portuguese/illusia'; -import p_187 from '@plugins/portuguese/novelmania'; -import p_188 from '@plugins/portuguese/tsundoku'; -import p_189 from '@plugins/russian/Bllate[rulate]'; -import p_190 from '@plugins/russian/Bookhamster[ifreedom]'; -import p_191 from '@plugins/russian/Erolate[rulate]'; -import p_192 from '@plugins/russian/EzNovels[hotnovelpub]'; -import p_193 from '@plugins/russian/MTLNovel(RU)[mtlnovel]'; -import p_194 from '@plugins/russian/NovelCool(RU)[novelcool]'; -import p_195 from '@plugins/russian/Ranobes(RU)[ranobes]'; -import p_196 from '@plugins/russian/Rulate[rulate]'; -import p_197 from '@plugins/russian/authortoday'; -import p_198 from '@plugins/russian/bookriver'; -import p_199 from '@plugins/russian/ficbook'; -import p_200 from '@plugins/russian/jaomix'; -import p_201 from '@plugins/russian/neobook'; -import p_202 from '@plugins/russian/novelTL'; -import p_203 from '@plugins/russian/ranobehub'; -import p_204 from '@plugins/russian/ranobelib'; -import p_205 from '@plugins/russian/ranoberf'; +import p_175 from '@plugins/japanese/Syosetu'; +import p_176 from '@plugins/korean/Agitoon'; +import p_177 from '@plugins/korean/FortuneEternal[madara]'; +import p_178 from '@plugins/multi/komga'; +import p_179 from '@plugins/polish/novelki'; +import p_180 from '@plugins/portuguese/BetterNovels[lightnovelwp]'; +import p_181 from '@plugins/portuguese/blogdoamonnovels'; +import p_182 from '@plugins/portuguese/CentralNovel[lightnovelwp]'; +import p_183 from '@plugins/portuguese/illusia'; +import p_184 from '@plugins/portuguese/Kiniga[madara]'; +import p_185 from '@plugins/portuguese/LaNovels[hotnovelpub]'; +import p_186 from '@plugins/portuguese/LightNovelBrasil[lightnovelwp]'; +import p_187 from '@plugins/portuguese/MTLNovel(PT)[mtlnovel]'; +import p_188 from '@plugins/portuguese/novelmania'; +import p_189 from '@plugins/portuguese/tsundoku'; +import p_190 from '@plugins/russian/authortoday'; +import p_191 from '@plugins/russian/Bllate[rulate]'; +import p_192 from '@plugins/russian/Bookhamster[ifreedom]'; +import p_193 from '@plugins/russian/bookriver'; +import p_194 from '@plugins/russian/Erolate[rulate]'; +import p_195 from '@plugins/russian/EzNovels[hotnovelpub]'; +import p_196 from '@plugins/russian/ficbook'; +import p_197 from '@plugins/russian/jaomix'; +import p_198 from '@plugins/russian/MTLNovel(RU)[mtlnovel]'; +import p_199 from '@plugins/russian/neobook'; +import p_200 from '@plugins/russian/NovelCool(RU)[novelcool]'; +import p_201 from '@plugins/russian/novelTL'; +import p_202 from '@plugins/russian/ranobehub'; +import p_203 from '@plugins/russian/ranobelib'; +import p_204 from '@plugins/russian/ranoberf'; +import p_205 from '@plugins/russian/Ranobes(RU)[ranobes]'; import p_206 from '@plugins/russian/renovels'; -import p_207 from '@plugins/russian/topliba'; -import p_208 from '@plugins/russian/zelluloza'; -import p_209 from '@plugins/russian/СвободныйМирРанобэ[ifreedom]'; -import p_210 from '@plugins/spanish/AllNovelRead[lightnovelwp]'; -import p_211 from '@plugins/spanish/AnimesHoy12[madara]'; -import p_212 from '@plugins/spanish/LightNovelDaily[hotnovelpub]'; -import p_213 from '@plugins/spanish/MTLNovel(ES)[mtlnovel]'; -import p_214 from '@plugins/spanish/NOVA'; -import p_215 from '@plugins/spanish/PanchoTranslations[madara]'; -import p_216 from '@plugins/spanish/TC&Sega[lightnovelwp]'; -import p_217 from '@plugins/spanish/TraduccionesAmistosas[madara]'; -import p_218 from '@plugins/spanish/hasutl'; -import p_219 from '@plugins/spanish/novelasligera'; -import p_220 from '@plugins/spanish/novelawuxia'; -import p_221 from '@plugins/spanish/novelyra'; -import p_222 from '@plugins/spanish/oasistranslations'; -import p_223 from '@plugins/spanish/skynovels'; -import p_224 from '@plugins/spanish/tunovelaligera'; -import p_225 from '@plugins/spanish/yukitls'; -import p_226 from '@plugins/thai/NovelLucky[madara]'; -import p_227 from '@plugins/thai/NovelPDF[madara]'; -import p_228 from '@plugins/turkish/ArazNovel[madara]'; -import p_229 from '@plugins/turkish/EKTAPLAR[madara]'; -import p_230 from '@plugins/turkish/KodeksLibrary[lightnovelwp]'; -import p_231 from '@plugins/turkish/MangaTR'; -import p_232 from '@plugins/turkish/NABSCANS[madara]'; -import p_233 from '@plugins/turkish/Namevt[lightnovelwp]'; -import p_234 from '@plugins/turkish/NovelTR[lightnovelwp]'; -import p_235 from '@plugins/turkish/Noveloku[madara]'; -import p_236 from '@plugins/turkish/RagnarScans[madara]'; -import p_237 from '@plugins/turkish/ThNovels[hotnovelpub]'; -import p_238 from '@plugins/turkish/TurkceLightNovels[madara]'; -import p_239 from '@plugins/turkish/WebNovelOku[madara]'; -import p_240 from '@plugins/turkish/epiknovel'; -import p_241 from '@plugins/turkish/kakikata[madara]'; -import p_242 from '@plugins/ukrainian/bakainua'; -import p_243 from '@plugins/ukrainian/smakolykytl'; -import p_244 from '@plugins/vietnamese/LNHako'; +import p_207 from '@plugins/russian/Rulate[rulate]'; +import p_208 from '@plugins/russian/topliba'; +import p_209 from '@plugins/russian/zelluloza'; +import p_210 from '@plugins/russian/СвободныйМирРанобэ[ifreedom]'; +import p_211 from '@plugins/spanish/AllNovelRead[lightnovelwp]'; +import p_212 from '@plugins/spanish/AnimesHoy12[madara]'; +import p_213 from '@plugins/spanish/hasutl'; +import p_214 from '@plugins/spanish/LightNovelDaily[hotnovelpub]'; +import p_215 from '@plugins/spanish/MTLNovel(ES)[mtlnovel]'; +import p_216 from '@plugins/spanish/NOVA'; +import p_217 from '@plugins/spanish/novelasligera'; +import p_218 from '@plugins/spanish/novelawuxia'; +import p_219 from '@plugins/spanish/novelyra'; +import p_220 from '@plugins/spanish/oasistranslations'; +import p_221 from '@plugins/spanish/PanchoTranslations[madara]'; +import p_222 from '@plugins/spanish/skynovels'; +import p_223 from '@plugins/spanish/TC&Sega[lightnovelwp]'; +import p_224 from '@plugins/spanish/TraduccionesAmistosas[madara]'; +import p_225 from '@plugins/spanish/tunovelaligera'; +import p_226 from '@plugins/spanish/yukitls'; +import p_227 from '@plugins/thai/NovelLucky[madara]'; +import p_228 from '@plugins/thai/NovelPDF[madara]'; +import p_229 from '@plugins/turkish/ArazNovel[madara]'; +import p_230 from '@plugins/turkish/EKTAPLAR[madara]'; +import p_231 from '@plugins/turkish/epiknovel'; +import p_232 from '@plugins/turkish/kakikata[madara]'; +import p_233 from '@plugins/turkish/KodeksLibrary[lightnovelwp]'; +import p_234 from '@plugins/turkish/MangaTR'; +import p_235 from '@plugins/turkish/NABSCANS[madara]'; +import p_236 from '@plugins/turkish/Namevt[lightnovelwp]'; +import p_237 from '@plugins/turkish/Noveloku[madara]'; +import p_238 from '@plugins/turkish/NovelTR[lightnovelwp]'; +import p_239 from '@plugins/turkish/RagnarScans[madara]'; +import p_240 from '@plugins/turkish/ThNovels[hotnovelpub]'; +import p_241 from '@plugins/turkish/TurkceLightNovels[madara]'; +import p_242 from '@plugins/turkish/WebNovelOku[madara]'; +import p_243 from '@plugins/ukrainian/bakainua'; +import p_244 from '@plugins/ukrainian/smakolykytl'; import p_245 from '@plugins/vietnamese/lightnovelvn'; -import p_246 from '@plugins/vietnamese/nettruyen'; -import p_247 from '@plugins/vietnamese/truyenss'; +import p_246 from '@plugins/vietnamese/LNHako'; +import p_247 from '@plugins/vietnamese/nettruyen'; +import p_248 from '@plugins/vietnamese/truyenss'; const PLUGINS: Plugin.PluginBase[] = [ p_0, @@ -497,5 +498,6 @@ const PLUGINS: Plugin.PluginBase[] = [ p_245, p_246, p_247, + p_248, ]; export default PLUGINS; diff --git a/public/static/src/fr/rezerowebnovelfr/icon.png b/public/static/src/fr/rezerowebnovelfr/icon.png new file mode 100644 index 000000000..e58e06837 Binary files /dev/null and b/public/static/src/fr/rezerowebnovelfr/icon.png differ diff --git a/src/types/plugin.ts b/src/types/plugin.ts index 477a01734..244b22656 100644 --- a/src/types/plugin.ts +++ b/src/types/plugin.ts @@ -17,6 +17,7 @@ export namespace Plugin { * For novel without pages only */ page?: string; + scanlator?: string | string[]; }; export type NovelItem = { name: string;