From bd6f6a7ed986035c969e7d7faa8f364b0c8cf312 Mon Sep 17 00:00:00 2001 From: Rider21 <58046032+Rider21@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:53:00 +0300 Subject: [PATCH] add VyNovel (#1036) * add VyNovel * Update vynovel.ts * fix --- .../multisrc/madara/1stkissnovel/icon.png | Bin 5478 -> 5331 bytes public/static/src/en/vynovel/icon.png | Bin 0 -> 1019 bytes scripts/icon_reloading.js | 23 ++- scripts/multisrc/hotnovelpub/template.ts | 2 +- scripts/multisrc/ifreedom/template.ts | 2 +- src/plugins/english/vynovel.ts | 176 ++++++++++++++++++ src/plugins/russian/authortoday.ts | 2 +- 7 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 public/static/src/en/vynovel/icon.png create mode 100644 src/plugins/english/vynovel.ts diff --git a/public/static/multisrc/madara/1stkissnovel/icon.png b/public/static/multisrc/madara/1stkissnovel/icon.png index 188d4c15852ae6ee85bad2cf7b2a7bbb106959af..96706e844cc70786bfc09e276e6d6d205e1d3dbe 100644 GIT binary patch delta 5317 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 diff --git a/public/static/src/en/vynovel/icon.png b/public/static/src/en/vynovel/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3467d07134cf2b02d824c5340b241eb7915d11d0 GIT binary patch literal 1019 zcmV~I+Da2W7#7u8${`g0ija~R`u9{h3^)LaMtaTV2D2FP0vdFIkz0000D zbW%=J01?1+Q!$W2XEiB7fU5J&p0R8-H{D$D1q54V`FzcS4qtR#w0f zGE_hXc>5kd_X)rQP7?nFf7muBOp5%P6lkBY*r@C<>OaMh zfa3_Ar_?N1)$W=_oqz;#pn(h4<1bNyUfbK%HiA$o=x!Uzb0bRXjc7B5342YvzzNgW5hEL9^oQ5@OW1A!DG*h{2h0c#FFVGvn@Tr3vQ zF_+Kpu@p()ntBez>23*-FP~d1Edkc-HUbUgVvkOcQVrMawmvh6h0Ip5!3l?(f1(y* zCrJCiY&q=MAGxL-?66`>v4&^sFyZ@Qe3Fc#dak=uP%&L<#r$tr>K(?KTy_;el*?U> z?w1J+x(5TGA+-~T1WP$$FQi<+QGL@kJgj2`3{?3ux@LOJL$Fw-L;EWCMK;pMR?{>! zJ{HycK7L_bMo*XfWt31XKtXeQnkHAzC5<)uRg)>c2q_6I`_&sxXuu~Y+us*N{-w3#)jK#ivZ`H5pdQUQzV0`lEeK{2TSF^CbA;$c~ZbNRvu zx-se{6~dD+rdYCpDybtLMxq&GvVlCfm+VGD2i%*5^9l45Ntgk54CKLney1A_ZtfY# zgI}_|D9o^oNxN|J={bOM9wUU;G9H6xy_@mT3dQHXnnmSjJaxR#eOW%7VMu=NlblC$ zA>VwAxWufAFC)LI*YC=I7bRErF^(97?H80U)c?ZrC5Gbv=$K}$w`J@We}_yw*ss}Zh11a$xa002ovPDHLkV1gz&$qN7g literal 0 HcmV?d00001 diff --git a/scripts/icon_reloading.js b/scripts/icon_reloading.js index 62375dd..c677222 100644 --- a/scripts/icon_reloading.js +++ b/scripts/icon_reloading.js @@ -27,13 +27,15 @@ const skip = new Set([ 'wuxiaworld.site', ]); +const folder = path.join('public', 'static'); + const used = new Set([ - path.join('public', 'icons', 'coverNotAvailable.webp'), - path.join('public', 'icons', 'siteNotAvailable.png'), + path.join(folder, 'coverNotAvailable.webp'), + path.join(folder, 'siteNotAvailable.png'), ]); const notAvailableImage = fs.readFileSync( - path.join('public', 'icons', 'siteNotAvailable.png'), + path.join(folder, 'siteNotAvailable.png'), ); (async () => { @@ -48,8 +50,9 @@ const notAvailableImage = fs.readFileSync( console.log('\nDownloading icons ⌛'); let language; for (let plugin in plugins) { - const { id, name, site, iconUrl, lang } = plugins[plugin]; - const icon = iconUrl && 'public/icons/' + iconUrl.split('icons/')[1]; + const { id, name, site, iconUrl, lang, customJS, customCSS } = + plugins[plugin]; + const icon = iconUrl && path.join(folder, iconUrl.split('/static/')[1]); if (language !== lang) { language = lang; @@ -61,7 +64,13 @@ const notAvailableImage = fs.readFileSync( } try { - if (icon) used.add(path.join(icon)); + if (customJS) { + used.add(path.join(folder, customJS.split('/static/')[1])); + } + if (customCSS) { + used.add(path.join(folder, customCSS.split('/static/')[1])); + } + if (icon) used.add(icon); if (!skip.has(id) && icon && site) { const image = await fetch( `https://www.google.com/s2/favicons?domain=${site}&sz=${size}&type=png`, @@ -121,7 +130,7 @@ const notAvailableImage = fs.readFileSync( } console.log('\nDeleting unused icons ⌛'); - fileList(path.join('public', 'icons')).forEach(path => { + fileList(folder).forEach(path => { if (!used.has(path)) { console.log('🗑️', path); fs.rmSync(path, { force: true }); diff --git a/scripts/multisrc/hotnovelpub/template.ts b/scripts/multisrc/hotnovelpub/template.ts index d8f043f..a0ee06b 100644 --- a/scripts/multisrc/hotnovelpub/template.ts +++ b/scripts/multisrc/hotnovelpub/template.ts @@ -115,7 +115,7 @@ class HotNovelPubPlugin implements Plugin.PluginBase { ); let chapterText = - body.match(/
/g)?.[0] || ''; + body.match(/
/)?.[0] || ''; if (chapterText) { const result = await fetchApi( diff --git a/scripts/multisrc/ifreedom/template.ts b/scripts/multisrc/ifreedom/template.ts index f81901a..b6199e3 100644 --- a/scripts/multisrc/ifreedom/template.ts +++ b/scripts/multisrc/ifreedom/template.ts @@ -140,7 +140,7 @@ class IfreedomPlugin implements Plugin.PluginBase { res.text(), ); let chapterText = - body.match(/
/)?.[0] || ''; chapterText = chapterText.replace(/]*>[\s\S]*?<\/script>/gim, ''); if (chapterText.includes(', + searchTerm?: string, + ): Promise { + const data = new URLSearchParams({ + sort: showLatestNovels ? 'updated_at' : filters?.sort?.value || 'viewed', + page, + }); + if (searchTerm) data.append('q', searchTerm); + + const url = this.site + '/search?' + data.toString(); + + const body = await fetchApi(url).then(res => res.text()); + const loadedCheerio = parseHTML(body); + + const novels: Plugin.NovelItem[] = []; + loadedCheerio('div[class="comic-item"] > a').each((index, element) => { + const name = loadedCheerio(element) + .find('div[class="comic-title"]') + .text() + ?.trim(); + const cover = + loadedCheerio(element) + .find('div[class="comic-image lozad "]') + .attr('data-background-image') || defaultCover; + const url = loadedCheerio(element).attr('href'); + + if (!name || !url) return; + + novels.push({ name, cover, path: url.replace('/novel/', '') }); + }); + + return novels; + } + + popularNovels = this.fetchNovels; + + async searchNovels( + searchTerm: string, + page: number, + ): Promise { + const defaultOptions: any = { + filters: undefined, + showLatestNovels: false, + }; + return this.fetchNovels(page, defaultOptions, searchTerm); + } + + async parseNovel(novelPath: string): Promise { + const body = await fetchApi(this.resolveUrl(novelPath, true)).then(res => + res.text(), + ); + const loadedCheerio = parseHTML(body); + + const novel: Plugin.SourceNovel = { + path: novelPath, + name: loadedCheerio('h1[class="title"]').text().trim(), + cover: + loadedCheerio('div[class="img-manga"] > img').attr('src') || + defaultCover, + summary: loadedCheerio('div[class="summary"] > p[class="content"]') + .text() + .trim(), + author: loadedCheerio('div[class="col-md-7"] > p:nth-child(5) > a') + .text() + .trim(), + status: + loadedCheerio('span[class="text-ongoing"]').text() === 'Ongoing' + ? NovelStatus.Ongoing + : NovelStatus.Completed, + }; + + const chapters: Plugin.ChapterItem[] = []; + const totalChapters = loadedCheerio('div[class="list-group"] > a').length; + + loadedCheerio('div[class="list-group"] > a').each( + (chapterIndex, element) => { + const name = loadedCheerio(element).find('span').text().trim(); + const id = loadedCheerio(element).attr('id')?.replace(/\D/g, ''); + if (!name || !id) return; + + const releaseDate = loadedCheerio(element).find('p').text(); + chapters.push({ + name, + path: novelPath + '/' + id, + releaseTime: this.parseDate(releaseDate?.trim()), + chapterNumber: totalChapters - chapterIndex, + }); + }, + ); + + novel.chapters = chapters.reverse(); + return novel; + } + + async parseChapter(chapterPath: string): Promise { + const body = await fetchApi(this.resolveUrl(chapterPath)).then(res => + res.text(), + ); + const loadedCheerio = parseHTML(body); + + const chapterText = loadedCheerio('.content').html(); + return chapterText || ''; + } + + parseDate = (date = '') => { + if (!date) return null; + if (date.includes('ago')) { + const [value, type] = date.split(' '); + if (!value || !type) return null; + + switch (type.toLowerCase()) { + case 'minutes': { + const minutes = parseInt(value, 10); + date = Date.now() - minutes * 60 * 1000; + break; + } + case 'hour': + case 'hours': { + const hours = parseInt(value, 10); + date = Date.now() - hours * 60 * 60 * 1000; + break; + } + case 'day': + case 'days': { + const days = parseInt(value, 10); + date = Date.now() - days * 24 * 60 * 60 * 1000; + break; + } + default: + console.log(date); + date = undefined; + } + return dayjs(date).format('LLL'); + } + return date; + }; + + resolveUrl = (path: string, isNovel?: boolean) => + this.site + (isNovel ? '/novel/' : '/read/') + path; + + filters = { + sort: { + label: 'Sort By:', + value: 'viewed', + options: [ + { label: 'Viewed', value: 'viewed' }, + { label: 'Scored', value: 'scored' }, + { label: 'Newest', value: 'created_at' }, + { label: 'Latest Update', value: 'updated_at' }, + ], + type: FilterTypes.Picker, + }, + } satisfies Filters; +} + +export default new VyNovel(); diff --git a/src/plugins/russian/authortoday.ts b/src/plugins/russian/authortoday.ts index 552103d..2a36582 100644 --- a/src/plugins/russian/authortoday.ts +++ b/src/plugins/russian/authortoday.ts @@ -175,7 +175,7 @@ class AuthorToday implements Plugin.PluginBase { } resolveUrl = (path: string, isNovel?: boolean) => - isNovel ? this.site + '/work/' + path : this.site + '/reader/' + path; + this.site + (isNovel ? '/work/' : '/reader/') + path; user: authorization | undefined; getUser = async () => {