From e142bb35706067cd005bacafe86feb6be9de0e82 Mon Sep 17 00:00:00 2001 From: Raiyn Aydin Date: Wed, 23 Sep 2026 18:06:14 +0800 Subject: [PATCH] fix(english/cherrymistcafe): rewrite for new JSON API with cipher decoding The site migrated off WordPress/Fictioneer to a Vite SPA backed by a public JSON API, so every HTML route now serves an identical SPA shell and the old selectors return empty popular/search/chapters. Remove the dead cherrymistcafe entry from the fictioneer generator (sources.json + custom chapter transform + generator icon) and add a standalone API plugin: popular/search via /api/series, novel detail by slug, chapter listing by numeric series id, chapter bodies by numeric chapter id. Chapter bodies are PUA-substitution-ciphered per-chapter seeds (0-15); the plugin ships offline-solved seed tables and restores I in the two seeds whose fonts carry no I artwork. Closes #2563. Co-Authored-By: Muse Spark (AI agent, supervised by firstmate worker lane) --- plugins/english/cherrymistcafe.ts | 260 ++++++++++++++++++ .../custom/cherrymistcafe/chapterTransform.js | 46 ---- plugins/multisrc/fictioneer/sources.json | 12 - .../fictioneer/cherrymistcafe/icon.png | Bin 4879 -> 0 bytes public/static/src/en/cherrymistcafe/icon.png | Bin 0 -> 22232 bytes 5 files changed, 260 insertions(+), 58 deletions(-) create mode 100644 plugins/english/cherrymistcafe.ts delete mode 100644 plugins/multisrc/fictioneer/custom/cherrymistcafe/chapterTransform.js delete mode 100644 public/static/multisrc/fictioneer/cherrymistcafe/icon.png create mode 100644 public/static/src/en/cherrymistcafe/icon.png diff --git a/plugins/english/cherrymistcafe.ts b/plugins/english/cherrymistcafe.ts new file mode 100644 index 000000000..f107211d5 --- /dev/null +++ b/plugins/english/cherrymistcafe.ts @@ -0,0 +1,260 @@ +import { fetchApi } from '@libs/fetch'; +import { Plugin } from '@/types/plugin'; +import { defaultCover } from '@libs/defaultCover'; +import { NovelStatus } from '@libs/novelStatus'; + +// Per-seed PUA substitution tables, solved offline by matching the site's +// cipher webfont glyph outlines against stock Open Sans artwork and verified +// by decoding full chapters to fluent English across all 16 seeds. +// tables[seed].charAt(code - 0xe000) maps U+E000..U+E0FF to plain letters. +const CIPHER_TABLES: Record = { + 0: 'lrtjttdQRofisoelnohosassbwehJihzaBhoutilafaiobetneZmwGttPoIUaoarenOLrkeertrCeilaaMhlfvetuothXtqneieesswgcKTbsnctepisuicngdaaVrnsltesnmtxwhrigErdoiprhlerfeodeciAcdaenmahgotuNnateeddaklgymottcfrpnehessryalDnrsmpohteamiyounuvnhiSaFiohWahteiaosYnweddnrdeHiyyst', + 1: 'etcasvneCaocwebotclilJheitVsrodtKFMgyfselnmeowkaohtzWeOhruestsmlaiBrtoiZulrhnqnforfoomLiayheesnusinQiipfijhdTaEtgtetntRmoPoGnwieundIiirhydpetdmatstUdroetdtaadYlleerewhrhAedNHacetehnynotsrahhhavDiernihaSubeXercfamrgaxsasoosneksygdeuaipcpbritnastgowlalentons', + 2: 'CtJccIudjfkasgpqaungdttaxgodfiltsndrtQpglseBcotdeEsnncthhenetittFVweYeloinnpDateGlnsnaoanedldhcAnfaweenahyhekiuarpdeoZthtallrKbtfssetevenaubaiehewdwXliossmriumsnywtofiaosLyynrhoNsiiOtnishrrmzHrtmiMoeebuhotleerTayahrsmdhoeaUrWhaPvocgseoitroooeiSitRhiaarreem', + 3: 'AtlKohadlflaeavaeavRyunonnhnussnJroQiinTtetLgarisdsoaoDabrOcoVwqecdiftnoepSseeNtmailaooeisPusmcWsoinFtgMryeXrtaidywemetbdnahhhgUpErhinneeophztitorYsofeoylekwoHkeaaedhomhruwbcfeuntGpreeitliwlrIcetatyeemgnfatinirsdmxdhaajtssnthZdedertsgeitsrBCuhnlthtchoarlsi', + 4: 'ntPtatngHshhatbrmtkpiaroQvylaoeissnfblhmsefraFVstdIiaterwotmetedarnooOheneysahGwplkjmwnetcJsenlsartcnhtUolaigiYsolnoaebatthpdheotnsomAitadaSfiryodidrgneuesLafdXeEnheirxMZropoednenlcdWerfwiemhorhBcretiiauaeoqcngwzRtsCieteTlNuoauuthicsDsuryKsyoeeidvehnhliagt', + 5: 'acarMsatsnraeuprHtyttohluesrsavayhrensidttewehhfoGlFBNnWmuCosLkItiitkeernoeYeoniidrystsmrpgctmbtsannuSaedopeeejVTuchcniealhesimOZeanrigllrctdgnrhbhalimdaPahqthigncrynReodlohossedoettoiyQUnfetxnaiwttJiDlnootfebrevmwlofaarpsdXiteKdiAsgewefEhhedontaoawzaihosu', + 6: 'gneriilienCacloynmnhshafhsnhiatclcabsBmhooLDstghoeneyarpafnlOrnsJtathtemoioericeeSmrthepHdshcomlbieoqhnuywoefigIhicteiavdotmUisirdenpeaaQGefdettaFootnsnoretnvAkKeYrjufilneipsdtryauTdtaubolguozEeRxtekldortaunhehestswaswrZaoadnhtaVgtresielNwerMrXsWydwdstitaP', + 7: 'ofrirridaotDsgsenpldrfdlrthitrelcnsiohugshtkneHsdonwoenSoogBuaiahesenKspyaeorgaRutdhohbeeanFotdiwsOhigicsnpsnhnVheyttlketersrdpesndZoaWtsrhcniaoeweerjtfXvdyUeccfaCzLmnnmuttMaomrittemotuixawheGabvQAattoinysymetaoroYfieIhhrmatiNTulbelqaasthielaweJaldcPinEeel', + 8: 'wletotniraytoaqrnvliolgrkaueLyVthashtthgCtlflnrtdZregtthclscthterusrtdfefibresiacenJhuSepednomotwttyatiHeespanQxuOrmhainehhheGuworkebdovshaodaecmoewfiraeDhndieseThtXUgdrainoIecjoiWpoaefiAnydeybsPessnismeapcnumaeKrEtaYstoiatrinlnooBddoRswsnmasozFigeaNihllnM', + 9: 'ekalraolooyuemnCvtljsnsrybVslnLcYrfMXlatremiaaDdJnpeEhiewdaeGOcgtwmantoaledstslaQhIbngidetrhtusethnrelidoqiaydisatoipnfaehteweohssurthxdesdkiemoeheweaauigFstmiheelcRormffursnaTieoaectoetsnStobortBhhcrfWscieoawhytodZnsttvnoonheainagzHrreinhpitnKNpPtigAryduU', + 10: 'tsEunattoopphingisfavlKsijxcdthitloaedfoZhntBonthemcsuoayilwhRhfwhtnnsdDVtarthrugneOslenymtbteanlrssefaoimeQFnirpbfeshHbrpcarrdirirPiAoaScrsmsandthiaiowGaMvalLoauehaehcetleydgoaeiagaTrogezenqrcemXdedtiYldoeiehishsweWeeokotntynewttJdraNenoutneeCtousmslkrlyU', + 11: 'intheZredADelneGreocfaeptateeeohIeftmrngrewyuekhXdctCgpgnheingsonaicnslhhdweoosztelioablataaSsotHUPsatOsiytlYnMnreiRwcrsmntstrierJeuhdsaxahhfetbLerlrmnauiyqdlyiwobasttowNEiedshhofodserlkrejruyhfKiieaiiimttWdalsovsdpnFvtBmramnaonsdQottogoccnhtpaVinuaaueoheT', + 12: 'hotedemlooWeahJiayvhyolpfVhihfhNnahrymgletnesonhqlrioanmgGdnmAieetteeasuaYalersevededutdwzrHmtpIeutacothrlbtRawnacednelosUgthriesoeiguPcanparnydhwKdjsunCifsoaBXfabaoiowlhcQeLtstnineehsttdcstterahasrrerMknattnioowislOoZbeFEysniosrfdirgtneTitcmSisioterDkaxpu', + 13: 'odMsGtmtKdwdNTagnawctdraohhlabtmnrjoJsnlaezDeidneeiuotkawnotHedhlehoyebsefisncraXpanrnoetiteerlrenlegmerdesxiepebdorwhnBotusZchnsgrfoenduidstichaaqteAmaoWPhleVtnoiaattoQoeuemtrahutsrthifvsssavkengrsnnpleiargspoftFihaOhhlEtSsheltuyCiaitcYaUolyiowRiymLrefyic', + 14: 'etpictwedrniuoJhureoiRPtIsosrTinsuoEbchorleZeexAndadoauisctsnoHnMolmKenwvrehUtetiBgelgphdahataotfnasYiayvamLoiahsWfjeeltggituOltpuenhrreobeicnaafetwktnohefnshhtyipedgnQesneitkmcsdGyqhsesaoroaaoNsacaSeyzsdmaitFhdttfnmnmdhsryrhCliarirrwteeditelDwlonoeaVbXlrt', + 15: 'ooayeicoeaeocThwcoselxmhtitshdeeFsknudiieaLOlEteopiaaYtnhidjneyiebRsftocucmnseoanantaaQwdfhGsnPbogpVeiiesWndrelihrptZduKtSuwagCegarDsemliorihyatraieeodtclIqtogytMsvsrnedshbrtlryJhaieeHfeoAuogtsNedtsiUnwhpltudinawmfoohfleXhrtlvamskaanntrrnnhtrsmnotBrthazeer', +}; + +// Seeds whose cipher font carries no 'I' artwork (I and l share the +// l-shaped glyphs there) need a sentence-start l -> I restoration pass. +function decodeCipheredText(content: string, seed: number): string { + const table = CIPHER_TABLES[seed]; + if (!table) return content; + let out = ''; + for (let i = 0; i < content.length; i++) { + const code = content.charCodeAt(i); + if (code >= 0xe000 && code <= 0xe0ff) { + const plain = table.charAt(code - 0xe000); + out += plain === '?' ? content.charAt(i) : plain; + } else { + out += content.charAt(i); + } + } + // A standalone lowercase l is always the pronoun I. + out = out.replace(/\bl\b/g, 'I'); + if (table.indexOf('I') === -1) { + out = out.replace( + /(^|[.!?…]+["”’\s]*["“‘([]?\s*)(l)(?=[a-z])/g, + function (match, pre, _l, offset, full) { + const before = full.slice(0, offset).replace(/[\s"”’‘([]+$/, ''); + if ( + /(e\.g\.?|i\.e\.?|mr\.?|mrs\.?|ms\.?|dr\.?|st\.?|vs\.?|etc\.?|\d\.?)$/i.test( + before, + ) + ) { + return match; + } + return pre + 'I'; + }, + ); + } + return out; +} + +function toChapterHtml(decoded: string): string { + const blocks = decoded.split(/\r?\n\s*\r?\n/); + const html: string[] = []; + for (const rawBlock of blocks) { + const block = rawBlock.replace(/^\s+|\s+$/g, ''); + if (!block || block === ' ') continue; + if (block.charAt(0) === '<') { + html.push(block); + } else { + html.push('

' + block.replace(/\r?\n/g, '
') + '

'); + } + } + return html.join(''); +} + +type SeriesRow = { + id: number; + title: string; + slug: string; + cover_thumb_url?: string; + cover_image_url?: string; +}; + +type SeriesDetail = SeriesRow & { + synopsis?: string; + short_synopsis?: string; + author_name?: string; + original_author?: string; + translator?: { name?: string }; + story_status?: string; + genres?: string[]; + tags?: string[]; + total_chapters?: number; +}; + +type ChapterRow = { + id: number; + slug: string; + title: string; + chapter_number: number; + published_at?: string; +}; + +type ChapterDetail = { + id: number; + slug: string; + title: string; + content?: string; + foreword?: string; + afterword?: string; + chapter_number: number; + published_at?: string; + cipher?: { seed?: number }; +}; + +class CherryMistCafePlugin implements Plugin.PluginBase { + id = 'cherrymistcafe'; + name = 'Cherry Mist Cafe'; + icon = 'src/en/cherrymistcafe/icon.png'; + site = 'https://cherrymist.cafe'; + version = '1.0.0'; + + private async getJson(url: string): Promise { + const res = await fetchApi(url); + return (await res.json()) as T; + } + + private toNovelItem(row: SeriesRow): Plugin.NovelItem { + return { + name: row.title, + cover: row.cover_thumb_url || row.cover_image_url || defaultCover, + path: 'series/' + row.slug, + }; + } + + private seriesList(url: string): Promise { + return this.getJson<{ rows?: SeriesRow[] } | SeriesRow[]>(url).then( + data => { + const rows: SeriesRow[] = Array.isArray(data) ? data : data.rows || []; + return rows.map(row => this.toNovelItem(row)); + }, + ); + } + + async popularNovels( + pageNo: number, + options?: Plugin.PopularNovelsOptions, + ): Promise { + const sort = options?.showLatestNovels ? 'latest' : 'popular'; + return this.seriesList( + this.site + '/api/series?page=' + pageNo + '&limit=20&sort=' + sort, + ); + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + const term = (searchTerm || '').trim(); + if (!term) return []; + return this.seriesList( + this.site + + '/api/series?page=' + + pageNo + + '&limit=20&q=' + + encodeURIComponent(term), + ); + } + + async parseNovel(novelPath: string): Promise { + const slug = novelPath.replace(/^series\//, '').replace(/\/$/, ''); + const detail: SeriesDetail = await this.getJson( + this.site + '/api/series/' + slug, + ); + + const novel: Plugin.SourceNovel = { + path: novelPath, + name: detail.title, + cover: detail.cover_image_url || detail.cover_thumb_url || defaultCover, + }; + novel.author = + (detail.translator && detail.translator.name) || + detail.author_name || + detail.original_author || + ''; + const genres: string[] = (detail.genres || []).concat(detail.tags || []); + if (genres.length) novel.genres = genres.join(','); + novel.summary = detail.synopsis || detail.short_synopsis || ''; + + const status = (detail.story_status || '').toLowerCase(); + if (status === 'completed') novel.status = NovelStatus.Completed; + else if (status === 'hiatus') novel.status = NovelStatus.OnHiatus; + else novel.status = NovelStatus.Ongoing; + + const chapters: Plugin.ChapterItem[] = []; + const perPage = 500; + let page = 1; + for (;;) { + const rows: ChapterRow[] = await this.getJson( + this.site + + '/api/chapters?series_id=' + + detail.id + + '&limit=' + + perPage + + '&page=' + + page, + ); + if (!rows || !rows.length) break; + for (const row of rows) { + chapters.push({ + name: row.title, + path: 'chapter/' + row.id + '/' + row.slug, + chapterNumber: row.chapter_number, + releaseTime: row.published_at, + }); + } + if (rows.length < perPage) break; + page++; + if (page > 10) break; + } + chapters.sort((a, b) => (a.chapterNumber || 0) - (b.chapterNumber || 0)); + novel.chapters = chapters; + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const segment = (chapterPath.replace(/^chapter\//, '') || '').split('/')[0]; + const id = parseInt(segment, 10); + if (!id) return ''; + const detail: ChapterDetail = await this.getJson( + this.site + '/api/chapters/' + id, + ); + if (!detail) return ''; + const seed = + detail.cipher && typeof detail.cipher.seed === 'number' + ? detail.cipher.seed + : -1; + const parts: string[] = []; + if (detail.foreword) parts.push(decodeCipheredText(detail.foreword, seed)); + parts.push(decodeCipheredText(detail.content || '', seed)); + if (detail.afterword) + parts.push(decodeCipheredText(detail.afterword, seed)); + return toChapterHtml(parts.join('\r\n\r\n')); + } + + resolveUrl = (path: string, isNovel?: boolean) => { + if (isNovel || path.indexOf('series/') === 0) { + return this.site + '/story/' + path.replace(/^series\//, ''); + } + const parts = path.replace(/^chapter\//, '').split('/'); + const slug = parts.length > 1 ? parts.slice(1).join('/') : parts[0]; + return this.site + '/chapter/' + slug; + }; +} + +export default new CherryMistCafePlugin(); diff --git a/plugins/multisrc/fictioneer/custom/cherrymistcafe/chapterTransform.js b/plugins/multisrc/fictioneer/custom/cherrymistcafe/chapterTransform.js deleted file mode 100644 index 0f309828d..000000000 --- a/plugins/multisrc/fictioneer/custom/cherrymistcafe/chapterTransform.js +++ /dev/null @@ -1,46 +0,0 @@ - const ghostScript = loadedCheerio('script[id*=ghost]'); - const contentHost = loadedCheerio('#cherry-content-host'); - - if (ghostScript.length && contentHost.length) { - const poly = ghostScript.attr('data-poly'); - // data-poly attr provide id - // encoded text is stored in attr data-{id}-{number} - // create full string of all the data-poly-nums - const encoded = Array.from( - { length: +ghostScript.attr('data-total') || 0 }, - (_, i) => ghostScript.attr(`data-${poly}-${i}`) || '', - ).join(''); - - // technically copypasta from source - // var c = s.charCodeAt(i); - // if(c>=65 && c<=90) - // o+=String.fromCharCode((c-65+13)%26+65); - // else if(c>=97&&c<=122) - // o+=String.fromCharCode((c-97+13)%26+97); - // else - // o+=s.charAt(i); - if (encoded) { - const rot13 = (str) => { - return str.replace(/[a-zA-Z]/g, (char) => { - const base = char <= 'Z' ? 65 : 97; - const shift = ((char.charCodeAt(0) - base + 13) % 26) + base; - return String.fromCharCode(shift); - }); - }; - contentHost.replaceWith(decodeURIComponent(atob(rot13(encoded)))); - } - } - - loadedCheerio('script, ruby').remove(); - - loadedCheerio('section#chapter-content p [data-fcnc-rev="1"]').each((_, el) => { - const text = loadedCheerio(el).text().trim(); - if (text) loadedCheerio(el).replaceWith([...text].reverse().join('')); - }); - - return ( - loadedCheerio('section#chapter-content > div') - .html() - ?.replace(/\u00A0/g, ' ') - ?.replace(/[\u2060\u00AD\u202F\u2007\u200B]/g, '') || '' - ); diff --git a/plugins/multisrc/fictioneer/sources.json b/plugins/multisrc/fictioneer/sources.json index 06cc73009..7e0cb86b5 100644 --- a/plugins/multisrc/fictioneer/sources.json +++ b/plugins/multisrc/fictioneer/sources.json @@ -53,17 +53,5 @@ "down": true, "downSince": 1768289212907 } - }, - { - "id": "cherrymistcafe", - "sourceSite": "https://cherrymist.cafe/", - "sourceName": "Cherry Mist Cafe", - "options": { - "customJs": { - "chapterTransform": "custom/cherrymistcafe/chapterTransform.js" - }, - "versionIncrements": 1, - "browsePage": "stories" - } } ] diff --git a/public/static/multisrc/fictioneer/cherrymistcafe/icon.png b/public/static/multisrc/fictioneer/cherrymistcafe/icon.png deleted file mode 100644 index bf7eecd3d80ebe850de0a171ba2070b1b0feda7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4879 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 B2ozv&CIo+x;>8OT7I#=+k;U!y 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 e93Y5@{C@zXm#U5$CHIB^0000