From e20aee7b9bbb5c53358c73b4c0e746fccb9fcff7 Mon Sep 17 00:00:00 2001 From: moazfarrukh Date: Fri, 17 Jul 2026 23:54:33 +0500 Subject: [PATCH 1/2] feat: add dreamyTranslations --- plugins/english/dreamyTranslations.ts | 200 ++++++++++++++++++ .../static/src/en/dreamyTranslations/icon.png | Bin 0 -> 9698 bytes 2 files changed, 200 insertions(+) create mode 100644 plugins/english/dreamyTranslations.ts create mode 100644 public/static/src/en/dreamyTranslations/icon.png diff --git a/plugins/english/dreamyTranslations.ts b/plugins/english/dreamyTranslations.ts new file mode 100644 index 000000000..10e1fafa6 --- /dev/null +++ b/plugins/english/dreamyTranslations.ts @@ -0,0 +1,200 @@ +import { fetchApi } from '@libs/fetch'; +import { Plugin } from '@/types/plugin'; +import { Filters } from '@libs/filterInputs'; +import { defaultCover } from '@libs/defaultCover'; +import { NovelStatus } from '@libs/novelStatus'; + +type SeriesProject = { + id: number; + title: string; + slug: string; +}; + +type SeriesListData = { + projects: SeriesProject[]; + squareImageUrls: Record; +}; + +type NovelChapter = { + id: number; + title: string; + index: number; + free: boolean; +}; + +type NovelDetailData = { + project: { + title: string; + synopsis?: string; + short_synopsis?: string; + author?: string; + genres?: string[]; + completed?: boolean; + }; + chapters: NovelChapter[]; + coverUrl?: string; +}; + +type ChapterDetailData = { + chapter: { + title: string; + content: string; + free: boolean; + }; + hasAccess: boolean; +}; + +class DreamyTranslationsPlugin implements Plugin.PluginBase { + id = 'dreamyTranslations'; + name = 'Dreamy Translations'; + icon = 'src/en/dreamyTranslations/icon.png'; + site = 'https://dreamy-translations.com'; + version = '1.1.0'; + filters: Filters | undefined = undefined; + imageRequestInit?: Plugin.ImageRequestInit | undefined = undefined; + + webStorageUtilized?: boolean; + private headers = { + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120 Safari/537.36', + Referer: this.site, + Accept: '*/*', + 'Accept-Language': 'en-US,en;q=0.9', + 'Cache-Control': 'no-cache', + Pragma: 'no-cache', + RSC: '1', + }; + + /** + * This site is a Next.js app whose pages render their novel/chapter data + * client-side; the plain HTML response is just a loading skeleton. Requesting + * the same URL with the `RSC` header returns Next.js's React Server Component + * "flight" stream instead, which carries the real data as a series of + * `:` lines. Most lines are directly JSON-parsable once the leading + * `:` is stripped; long text bodies are instead referenced elsewhere as + * `"$"` and streamed separately as a `:T,` line. + */ + private async fetchRsc(url: string): Promise { + const res = await fetchApi(url, { headers: this.headers }); + return await res.text(); + } + + private extractRscObject(rscText: string, marker: string): T { + const line = rscText.split('\n').find(l => l.includes(marker)); + if (!line) { + throw new Error('Could not locate expected data in server response'); + } + const jsonStr = line.slice(line.indexOf(':') + 1); + const parsed = JSON.parse(jsonStr); + return parsed[3] as T; + } + + /** + * Text bodies aren't inline JSON: they're declared with their exact UTF-8 + * byte length (`T,`) and the following chunk starts immediately after + * those bytes with no separator, so byte-accurate slicing is required. + */ + private extractDeferredText(rscText: string, refId: string): string { + const match = new RegExp(`(?:^|\\n)${refId}:T([0-9a-f]+),`).exec(rscText); + if (!match) { + throw new Error('Could not locate chapter content in server response'); + } + const start = match.index + match[0].length; + const byteLength = parseInt(match[1], 16); + const rest = rscText.slice(start); + const bytes = new TextEncoder().encode(rest).slice(0, byteLength); + return new TextDecoder().decode(bytes); + } + + private async fetchAllNovels(): Promise { + const rscText = await this.fetchRsc(`${this.site}/series`); + const data = this.extractRscObject(rscText, '"projects"'); + + return data.projects.map(project => ({ + name: project.title, + path: `/novel/${project.slug}`, + cover: data.squareImageUrls[String(project.id)] || defaultCover, + })); + } + + async popularNovels(pageNo: number): Promise { + if (pageNo !== 1) return []; + return this.fetchAllNovels(); + } + + async parseNovel(novelPath: string): Promise { + const rscText = await this.fetchRsc(`${this.site}${novelPath}`); + const data = this.extractRscObject( + rscText, + '"chapters":[', + ); + + const novel: Plugin.SourceNovel = { + path: novelPath, + name: data.project.title || 'Untitled', + cover: data.coverUrl || defaultCover, + author: data.project.author, + genres: (data.project.genres || []).join(', '), + summary: data.project.synopsis || data.project.short_synopsis, + status: data.project.completed + ? NovelStatus.Completed + : NovelStatus.Ongoing, + }; + + novel.chapters = data.chapters.map(chapter => ({ + name: chapter.free ? chapter.title : `🔒 ${chapter.title}`, + path: `${novelPath}/chapter/${chapter.index}`, + chapterNumber: chapter.index, + })); + + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const rscText = await this.fetchRsc(`${this.site}${chapterPath}`); + const data = this.extractRscObject( + rscText, + '"chapter":{', + ); + + if (!data.hasAccess) { + throw new Error( + 'This chapter requires premium access and cannot be read here.', + ); + } + + const refMatch = /^\$([0-9a-zA-Z]+)$/.exec(data.chapter.content); + if (!refMatch) { + // Content was inlined directly rather than streamed separately. + return `

${data.chapter.content}

`; + } + + const rawText = this.extractDeferredText(rscText, refMatch[1]).replace( + /\r\n/g, + '\n', + ); + + return rawText + .split(/\n{2,}/) + .map(paragraph => paragraph.trim()) + .filter(Boolean) + .map(paragraph => `

${paragraph.replace(/\n/g, '
')}

`) + .join(''); + } + + async searchNovels( + searchTerm: string, + pageNo: number, + ): Promise { + if (pageNo !== 1) return []; + + const novels = await this.fetchAllNovels(); + const term = searchTerm.toLowerCase(); + + return novels.filter(novel => novel.name.toLowerCase().includes(term)); + } + + resolveUrl = (path: string) => this.site + path; +} + +export default new DreamyTranslationsPlugin(); diff --git a/public/static/src/en/dreamyTranslations/icon.png b/public/static/src/en/dreamyTranslations/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db670705bf5bce12313407cd521375573109f0ac GIT binary patch literal 9698 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 literal 0 HcmV?d00001 From 32638c068399731456c6447d01e8c81591edb2d6 Mon Sep 17 00:00:00 2001 From: moazfarrukh Date: Sat, 18 Jul 2026 02:33:16 +0500 Subject: [PATCH 2/2] fix typo --- plugins/english/dreamyTranslations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/english/dreamyTranslations.ts b/plugins/english/dreamyTranslations.ts index 10e1fafa6..a2c603757 100644 --- a/plugins/english/dreamyTranslations.ts +++ b/plugins/english/dreamyTranslations.ts @@ -49,7 +49,7 @@ class DreamyTranslationsPlugin implements Plugin.PluginBase { name = 'Dreamy Translations'; icon = 'src/en/dreamyTranslations/icon.png'; site = 'https://dreamy-translations.com'; - version = '1.1.0'; + version = '1.0.0'; filters: Filters | undefined = undefined; imageRequestInit?: Plugin.ImageRequestInit | undefined = undefined;