From c7ba9c2ff06b7baddf436f5a1e511aa6297697da Mon Sep 17 00:00:00 2001 From: luigidotmoe <19366824+luigidotmoe@users.noreply.github.com> Date: Sat, 13 Jun 2026 05:48:43 +0200 Subject: [PATCH 1/2] add rezerowebnovelfr reorder plugins alphabetically --- plugins/french/rezerowebnovelfr.ts | 245 +++++++++ plugins/index.ts | 476 +++++++++--------- .../static/src/fr/rezerowebnovelfr/icon.png | Bin 0 -> 18688 bytes 3 files changed, 484 insertions(+), 237 deletions(-) create mode 100644 plugins/french/rezerowebnovelfr.ts create mode 100644 public/static/src/fr/rezerowebnovelfr/icon.png diff --git a/plugins/french/rezerowebnovelfr.ts b/plugins/french/rezerowebnovelfr.ts new file mode 100644 index 000000000..6036697d5 --- /dev/null +++ b/plugins/french/rezerowebnovelfr.ts @@ -0,0 +1,245 @@ +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'; + +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.0'; + + 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(); + } + chapters.push({ + name: prefix + cleanName, + path, + releaseTime: releaseDate, + }); + } + } + }; + + 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); + }); + } + + 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 0000000000000000000000000000000000000000..e58e06837c5d47c56db0bf59740ae376f77bd299 GIT binary patch literal 18688 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 a|CcdE{aYk&SlTUP0M7Pqb^`3rDSrVdhf;a~ literal 0 HcmV?d00001 From b3b550c85e7559f63fae5d7bb920b09d7ca5a968 Mon Sep 17 00:00:00 2001 From: luigidotmoe <19366824+luigidotmoe@users.noreply.github.com> Date: Sat, 13 Jun 2026 07:01:46 +0200 Subject: [PATCH 2/2] feat: add rezerowebnovelfr scanlator filter --- plugins/french/rezerowebnovelfr.ts | 598 ++++++++++++++++++++++++++++- src/types/plugin.ts | 1 + 2 files changed, 598 insertions(+), 1 deletion(-) diff --git a/plugins/french/rezerowebnovelfr.ts b/plugins/french/rezerowebnovelfr.ts index 6036697d5..0c370f38c 100644 --- a/plugins/french/rezerowebnovelfr.ts +++ b/plugins/french/rezerowebnovelfr.ts @@ -23,6 +23,573 @@ const NOVEL_METADATA: Record = { 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'], @@ -59,7 +626,7 @@ class ReZeroWebNovelFrPlugin implements Plugin.PluginBase { name = 'Re:Zero Web Novel FR'; icon = 'src/fr/rezerowebnovelfr/icon.png'; site = 'https://rezerowebnovelfr.wordpress.com'; - version = '1.0.0'; + version = '1.0.1'; async getCheerio(url: string): Promise { const r = await fetchApi(url, { @@ -117,10 +684,12 @@ class ReZeroWebNovelFrPlugin implements Plugin.PluginBase { .replace(/^(Lire|lire|LIRE|LIRE LE)\s+/i, '') .trim(); } + const scanlator = EXISTING_SCANLATORS[path]; chapters.push({ name: prefix + cleanName, path, releaseTime: releaseDate, + ...(scanlator ? { scanlator } : {}), }); } } @@ -198,6 +767,33 @@ class ReZeroWebNovelFrPlugin implements Plugin.PluginBase { }); } + // 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; } 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;