From 56f542b4da4ace8aced4d447087831c81ac9036d Mon Sep 17 00:00:00 2001 From: hamedhani1998 Date: Wed, 26 Aug 2026 17:20:51 +0300 Subject: [PATCH] =?UTF-8?q?feat(ar/rewayahfans):=20add=20=D8=B1=D9=88?= =?UTF-8?q?=D8=A7=D9=8A=D9=87=20=D9=81=D8=A7=D9=86=D8=B2=20plugin=20(#2306?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: yemen Co-authored-by: K1ngfish3r <26593485+K1ngfish3r@users.noreply.github.com> --- plugins/arabic/rewayahfans.ts | 262 ++++++++++++++++++++++ public/static/src/ar/rewayahfans/icon.png | Bin 0 -> 8818 bytes 2 files changed, 262 insertions(+) create mode 100644 plugins/arabic/rewayahfans.ts create mode 100644 public/static/src/ar/rewayahfans/icon.png diff --git a/plugins/arabic/rewayahfans.ts b/plugins/arabic/rewayahfans.ts new file mode 100644 index 0000000..ab3ea8e --- /dev/null +++ b/plugins/arabic/rewayahfans.ts @@ -0,0 +1,262 @@ +import { load as parseHTML } from 'cheerio'; +import { fetchApi } from '@libs/fetch'; +import { Plugin } from '@/types/plugin'; + +type WPPage = { + title: { rendered: string }; + slug: string; + date: string; + content?: { rendered: string }; + _embedded?: { + 'wp:featuredmedia'?: { source_url: string }[]; + }; +}; + +class RewayahFans implements Plugin.PluginBase { + id = 'rewayahfans'; + name = 'روايه فانز'; + version = '1.0.0'; + icon = 'src/ar/rewayahfans/icon.png'; + site = 'https://rewayahfans.net/'; + + private allNovels: Plugin.NovelItem[] = []; + + private async fetchJson(url: string): Promise { + const res = await fetchApi(url); + if (!res.ok) throw new Error(`Request failed: ${res.status}`); + return res.json() as Promise; + } + + private async fetchHtml(url: string): Promise { + const res = await fetchApi(url); + if (!res.ok) throw new Error(`Request failed: ${res.status}`); + return res.text(); + } + + private normalizeUrl(url: string): string { + if (!url) return ''; + const decoded = url + .replace(/&/g, '&') + .replace(/&/g, '&') + .trim(); + if (decoded.startsWith('http')) return decoded; + if (decoded.startsWith('//')) return `https:${decoded}`; + if (decoded.startsWith('/')) + return `${this.site}${decoded.replace(/^\//, '')}`; + return `${this.site}${decoded}`; + } + + private async loadAllNovels(): Promise { + if (this.allNovels.length > 0) return this.allNovels; + + const html = await this.fetchHtml( + `${this.site}%d9%82%d8%a7%d8%a6%d9%85%d8%a9-%d8%a7%d9%84%d8%b1%d9%88%d8%a7%d9%8a%d8%a7%d8%aa/`, + ); + const $ = parseHTML(html); + const novels: Plugin.NovelItem[] = []; + const seen = new Set(); + + $('figure.wp-block-image').each((_, el) => { + const fig = $(el); + const linkEl = fig.find('figcaption a').first(); + const href = + linkEl.attr('href') || fig.find('a').first().attr('href') || ''; + const name = linkEl.text().trim(); + const cover = this.normalizeUrl( + fig.find('img').attr('data-src') || + fig.find('img').attr('data-lazy-src') || + fig.find('img').attr('src') || + '', + ); + + if (name && href) { + const path = href.replace(this.site, '').replace(/\/$/, ''); + if (!seen.has(path)) { + seen.add(path); + novels.push({ name, path, cover }); + } + } + }); + + this.allNovels = novels; + return novels; + } + + async popularNovels( + page: number, + _options: Plugin.PopularNovelsOptions, + ): Promise { + const allNovels = await this.loadAllNovels(); + if (page > 1) return []; + return allNovels; + } + + async parseNovel(novelPath: string): Promise { + const novel: Plugin.SourceNovel = { + path: novelPath, + name: '', + cover: '', + summary: '', + author: '', + genres: '', + status: '', + chapters: [], + }; + + const html = await this.fetchHtml(`${this.site}${novelPath}`); + const $ = parseHTML(html); + + const titleTag = $('title').text().trim(); + novel.name = + titleTag.split(' - ')[0].trim() || + titleTag.split('\u2013')[0].trim() || + 'بدون عنوان'; + + novel.name = this.extractNovelName(novel.name); + + const ogImage = $('meta[property="og:image"]').attr('content') || ''; + novel.cover = this.normalizeUrl(ogImage); + + if (!novel.cover) { + const coverImg = $('img') + .filter(function () { + const src = $(this).attr('data-src') || $(this).attr('src') || ''; + return src.includes('wp-content/uploads'); + }) + .first(); + novel.cover = this.normalizeUrl( + coverImg.attr('data-src') || coverImg.attr('src') || '', + ); + } + + const summaryParts: string[] = []; + let inStory = false; + let inChapters = false; + $('.entry-content > *').each((_, el) => { + const $el = $(el); + const tag = $el.prop('tagName')?.toLowerCase() || ''; + const text = $el.text().trim(); + + if (tag === 'p' && text.startsWith('القصة')) { + inStory = true; + return; + } + if (inStory) { + if (tag === 'p' && text.startsWith('الفصول')) { + inChapters = true; + return false; + } + if (tag === 'p' && text && !inChapters) { + summaryParts.push(text); + } + } + }); + novel.summary = summaryParts.join('\n') || ''; + + const metadataMap: Record = {}; + $('ul.wp-block-list li').each((_, el) => { + const text = $(el).text().trim(); + const colonIdx = text.indexOf(':'); + if (colonIdx > 0) { + const key = text.substring(0, colonIdx).trim(); + const value = text.substring(colonIdx + 1).trim(); + metadataMap[key] = value; + } + }); + + novel.author = metadataMap['المؤلف'] || ''; + novel.genres = metadataMap['التصنيفات'] || ''; + novel.status = metadataMap['الحالة'] || ''; + + const chapterSet = new Set(); + + const chapterSection = $( + 'p:contains("الفصول"), p:contains("Chapters"), p:contains("Fichier"), p:contains("Capitulos"), p:contains("Capítulos"), p:contains("Chapitres"), p:contains("Kapitel"), p:contains("Файл"), p:contains("Глава"), p:contains("章")', + ); + + if (chapterSection.length > 0) { + chapterSection.nextAll().each((_, el) => { + const $el = $(el); + if ($el.hasClass('wp-block-paragraph') || $el.is('p')) { + $el.find('a').each((_, aEl) => { + const href = $(aEl).attr('href') || ''; + const text = $(aEl).text().trim(); + if (!href || !text) return; + if (!href.startsWith(this.site)) return; + const chapterPath = href.replace(this.site, '').replace(/\/$/, ''); + if (chapterPath === novelPath) return; + if (chapterSet.has(chapterPath)) return; + const numMatch = text.match(/(\d+)/); + if (!numMatch) return; + const chapterNum = parseInt(numMatch[1], 10); + if (chapterNum === 0) return; + const cleanName = text.replace(/\bnew\b/i, '').trim(); + if (cleanName.includes('النهاية')) return; + if (cleanName.includes('اضغط هنا')) return; + if (cleanName.includes('Summary')) return; + chapterSet.add(chapterPath); + novel.chapters!.push({ + name: cleanName, + path: chapterPath, + chapterNumber: chapterNum, + }); + }); + } else { + return false; + } + }); + } + + novel.chapters!.sort( + (a, b) => (a.chapterNumber || 0) - (b.chapterNumber || 0), + ); + + if (!novel.name && novel.chapters!.length > 0) { + novel.name = this.extractNovelName(novel.chapters![0].name); + } + + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const pages = await this.fetchJson( + `${this.site}wp-json/wp/v2/pages?slug=${chapterPath}&_fields=content`, + ); + + const arr = Array.isArray(pages) ? pages : [pages]; + if (arr.length > 0 && arr[0].content?.rendered) { + const $ = parseHTML(arr[0].content.rendered); + $( + 'script, style, .sharedaddy, .jp-relatedposts, .wp-block-spacer, .simplefavorite-button, .wp-block-jetpack-rating-star', + ).remove(); + return $.html(); + } + + const html = await this.fetchHtml(`${this.site}${chapterPath}/`); + const $ = parseHTML(html); + const content = + $('article .entry-content, .post-content, .entry-content').html() || ''; + return content || '

المحتوى غير متاح.

'; + } + + async searchNovels( + searchTerm: string, + page: number, + ): Promise { + const allNovels = await this.loadAllNovels(); + const lower = searchTerm.toLowerCase(); + const filtered = allNovels.filter(n => + n.name.toLowerCase().includes(lower), + ); + const perPage = 20; + const start = (page - 1) * perPage; + return filtered.slice(start, start + perPage); + } + + private extractNovelName(title: string): string { + const match = title.match(/^(.+?)\s+\d+$/); + return match ? match[1].trim() : title.trim(); + } +} + +export default new RewayahFans(); diff --git a/public/static/src/ar/rewayahfans/icon.png b/public/static/src/ar/rewayahfans/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbe652852eaf9d46fa89c453713f13ecece27eb GIT binary patch literal 8818 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

2~;;RW>QNU5k1**V(qj{3##>IwZ z{J-5CL%>}%RB~|K_=z@Bz`B5B!2MsnT~(6kXxPEh^So)3$4jL z#$b&_GT%8RzcyWX)pZVC5NYd>$z_TsO^nJ*x%jaJ1~(RyF!ZbxEd=z0+`Lf$zqcWx zw?hO&SkLQf5dMmh3r@9Z7Bd%cu_uX7Y(9u*sl5$lHrT))os@0#6nZ#S|Fn!1Di(qr z#oRSB(%qHN?L3URcpKBE=1%Wkwe;OS=lMOG(s|$T&-Ffp`4c(4B9mVS;12Yss*`uq^gY!kY$ z>}$_>v((EUkht(mR`5g?UN>YS6)5HqH~AO(f2AZR*G5-e3lMC;eru= z-C*M)zwUlWb@c8LGRFB`xn!7-ex12S2MnoADQ1(Q-tkcU`8E_WMKX@2D00c_wIPG zd}G^rC~F(W;x@YjZU3=(7{SpUzbJXzaUm&EQw7mtUIf4?_^zOQNv{39xAg69f{8lF z**I|;UbeG==dSuOSdjk{bpT+kNFVwMO$ob|V>L!h*$m3GxEWv+$MM}6}()Z)A?$s*pX+W9_e3ixGSy**AwbzL-gl0!oBNEML-U=2>Le6MT|pR&e@vKQcB9OiX$J4$!rf2SvHAe zum+z&YvLP!5=_;Urf6Mh7~ggc&$Cm-Su!Qju_5yo=cAS@^U2`Hz11Ag->U&Cb8DSO ztfCfgnRo|gZ1E$lsUsGUu%{fc zl$>)NUb?nurU?iu*chl2@cSx8sHx=ca5Ch1=8V<$*~5TeslRI#rNrAmDZ1asX)vk| z?2V?=TLZ_gmY->dLY6krYH(F=@S|p%sfN@nr#3+Uy`@JtbIE|+ZeDfHbFSQ2*ZyNlOUZXqZ4~=eYYiQ+SGU_AbITdY7Xeme8OD_WZQo6q zr);O_gs+o)&lxL7Bju;2)fZA@kpj_)YV6jKIW~C9y?V!;S6=77>EcBiRz*%=JR>T( zb@0c*GD3)rh#PgClU=7#L}xn!rqFkb8m^*wl$F7?dI?Kma+bLt{nY=s6fDiMY~(u1{E+W{qeu$ubMzTvQT zSUhgKk80zU<#!M?>2_2&@qEfis)A|tTB4)MJea6NpOGzBDFf>sR88}lm49sOdfs#q zJ~i8}->PWG?h1x%*RRE2Ir23}!QAjL_a{pwc6Z9;$#lV5YFlwqd2)sv5!k=1a^rk> z*@O%u*RkI@1C590!_(aX61aDfhBmudA%5d_Yh3y9&+lV5CF$)AIUTOT;IFE)psdgU zZ*-BcvFOHLc1!gS-ZD!^Im>ee zE`!4a#5~It-*Rr{8{pZk2mUGJF|N>INIlC-eXjHtAwO3}Hp}Hcs^`oen{|Y^SgjrT zWx#gkuE3HAYXH(nf)+t|@`WQP|Ma5iT%&VCLmrwBzhvUquTJ8_-~Jyg{6U%Cg=YC5 zS4j7p!E}#f_V;VwZVI2~hibpwhn!~gxPGH!4_5NO25!SH`6XWFZ3paHy^_YTEQt&+ zhIgOx&A)*Rxqxm4N~ST0001=ne_4Rh&Q>d>8>;cxVmPc2i#+0L=RXCz$K>4W0<+pW zS?*!wB-;uWw)YA1zpQ3itM9WWmW^9!J(uzW+U+~@i7B23N|%c8KG9-RlE9OUq#j8^ zgU?hN1{us?yi!DzP1z-C306<>4+I1An?)xhm^BQy9Po~Qk+Dl`9Dwp zsWB{yAgQ^T(?bReM+Wf*JJ=DaNV1Nu{<=SJa>KX*gn0S9Pj?Tz3~7%Ob*D|>{Zbau zZ1wDdKJwm%uqe@rL?EYsHwx&l{6KsPBpZPFeDN!>dT%-wD%4vzn#BZ{(WGWAks5&s9|