diff --git a/scripts/multisrc/ifreedom/template.ts b/scripts/multisrc/ifreedom/template.ts index 88f3d4010..bf140154c 100644 --- a/scripts/multisrc/ifreedom/template.ts +++ b/scripts/multisrc/ifreedom/template.ts @@ -25,7 +25,7 @@ class IfreedomPlugin implements Plugin.PluginBase { this.name = metadata.sourceName; this.icon = `multisrc/ifreedom/${metadata.id.toLowerCase()}/icon.png`; this.site = metadata.sourceSite; - this.version = '1.0.1'; + this.version = '1.0.2'; this.filters = metadata.filters; } @@ -166,7 +166,11 @@ class IfreedomPlugin implements Plugin.PluginBase { page: number | undefined = 1, ): Promise { const url = - this.site + '/vse-knigi/?searchname=' + searchTerm + '&bpage=' + page; + this.site + + '/vse-knigi/?searchname=' + + encodeURIComponent(searchTerm) + + '&bpage=' + + page; const result = await fetchApi(url).then(res => res.text()); const loadedCheerio = parseHTML(result); diff --git a/scripts/multisrc/lightnovelwp/template.ts b/scripts/multisrc/lightnovelwp/template.ts index cfc1a7ad3..cccb3f258 100644 --- a/scripts/multisrc/lightnovelwp/template.ts +++ b/scripts/multisrc/lightnovelwp/template.ts @@ -42,7 +42,7 @@ class LightNovelWPPlugin implements Plugin.PluginBase { this.icon = `multisrc/lightnovelwp/${metadata.id.toLowerCase()}/icon.png`; this.site = metadata.sourceSite; const versionIncrements = metadata.options?.versionIncrements || 0; - this.version = `1.1.${6 + versionIncrements}`; + this.version = `1.1.${7 + versionIncrements}`; this.options = metadata.options ?? ({} as LightNovelWPOptions); this.filters = metadata.filters satisfies Filters; @@ -103,7 +103,9 @@ class LightNovelWPPlugin implements Plugin.PluginBase { if (novelName && novelUrl) { const novelCover = - article.match(/]*?src="([^\"]*)"[^>]*?(?: data-src="([^\"]*)")?[^>]*>/) || []; + article.match( + /]*?src="([^\"]*)"[^>]*?(?: data-src="([^\"]*)")?[^>]*>/, + ) || []; let novelPath; if (novelUrl.includes(this.site)) { @@ -444,7 +446,8 @@ class LightNovelWPPlugin implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const url = this.site + 'page/' + page + '/?s=' + searchTerm; + const url = + this.site + 'page/' + page + '/?s=' + encodeURIComponent(searchTerm); const html = await this.safeFecth(url, true); return this.parseNovels(html); } diff --git a/scripts/multisrc/madara/template.ts b/scripts/multisrc/madara/template.ts index 316db5f7c..6875c927b 100644 --- a/scripts/multisrc/madara/template.ts +++ b/scripts/multisrc/madara/template.ts @@ -45,7 +45,7 @@ class MadaraPlugin implements Plugin.PluginBase { this.icon = `multisrc/madara/${metadata.id.toLowerCase()}/icon.png`; this.site = metadata.sourceSite; const versionIncrements = metadata.options?.versionIncrements || 0; - this.version = `1.0.${6 + versionIncrements}`; + this.version = `1.0.${7 + versionIncrements}`; this.options = metadata.options; this.filters = metadata.filters; @@ -62,26 +62,41 @@ class MadaraPlugin implements Plugin.PluginBase { translateDragontea(text: Cheerio): Cheerio { if (this.id !== 'dragontea') return text; - - const $ = parseHTML(text.html()?.replace('\n', '').replace(//g, '\n') || ''); + + const $ = parseHTML( + text + .html() + ?.replace('\n', '') + .replace(//g, '\n') || '', + ); const reverseAlpha = 'zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA'; const forwardAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - + text.html($.html()); - text.find('*').addBack().contents().filter((_, el) => el.nodeType === 3).each((_, el) => { - const $el = $(el); - const translated = $el.text().normalize('NFD').split('') - .map(char => { - const base = char.normalize('NFC'); - const idx = forwardAlpha.indexOf(base); - return idx >= 0 ? reverseAlpha[idx] + char.slice(base.length) : char; - }) - .join(''); - $el.replaceWith(translated.replace('\n', '
')); - }); - + text + .find('*') + .addBack() + .contents() + .filter((_, el) => el.nodeType === 3) + .each((_, el) => { + const $el = $(el); + const translated = $el + .text() + .normalize('NFD') + .split('') + .map(char => { + const base = char.normalize('NFC'); + const idx = forwardAlpha.indexOf(base); + return idx >= 0 + ? reverseAlpha[idx] + char.slice(base.length) + : char; + }) + .join(''); + $el.replaceWith(translated.replace('\n', '
')); + }); + return text; - } + } getHostname(url: string): string { url = url.split('/')[2]; @@ -261,7 +276,7 @@ class MadaraPlugin implements Plugin.PluginBase { if (this.options?.useNewChapterEndpoint) { html = await fetchApi(this.site + novelPath + 'ajax/chapters/', { method: 'POST', - referrer: this.site + novelPath + referrer: this.site + novelPath, }).then(res => res.text()); } else { const novelId = @@ -347,7 +362,7 @@ class MadaraPlugin implements Plugin.PluginBase { '/page/' + pageNo + '/?s=' + - searchTerm + + encodeURIComponent(searchTerm) + '&post_type=wp-manga'; const loadedCheerio = await this.getCheerio(url, true); return this.parseNovels(loadedCheerio); diff --git a/scripts/multisrc/mtlnovel/template.ts b/scripts/multisrc/mtlnovel/template.ts index 57a3b2759..261edd000 100644 --- a/scripts/multisrc/mtlnovel/template.ts +++ b/scripts/multisrc/mtlnovel/template.ts @@ -33,7 +33,7 @@ class MTLNovelPlugin implements Plugin.PluginBase { this.icon = 'multisrc/mtlnovel/mtlnovel/icon.png'; this.site = metadata.sourceSite; this.mainUrl = 'https://www.mtlnovels.com/'; - this.version = '1.1.2'; + this.version = '1.1.3'; this.options = metadata.options ?? ({} as MTLNovelOptions); this.filters = metadata.filters satisfies Filters; } @@ -203,7 +203,9 @@ class MTLNovelPlugin implements Plugin.PluginBase { ): Promise { if (pageNo !== 1) return []; const searchUrl = - this.site + 'wp-admin/admin-ajax.php?action=autosuggest&q=' + searchTerm; + this.site + + 'wp-admin/admin-ajax.php?action=autosuggest&q=' + + encodeURIComponent(searchTerm); const res = await this.safeFecth(searchUrl); const result = await res.json(); diff --git a/scripts/multisrc/readnovelfull/template.ts b/scripts/multisrc/readnovelfull/template.ts index 6f5900bbd..4cf80bc08 100644 --- a/scripts/multisrc/readnovelfull/template.ts +++ b/scripts/multisrc/readnovelfull/template.ts @@ -34,7 +34,7 @@ class ReadNovelFullPlugin implements Plugin.PluginBase { this.icon = `multisrc/readnovelfull/${metadata.id.toLowerCase()}/icon.png`; this.site = metadata.sourceSite; const versionIncrements = metadata.options?.versionIncrements || 0; - this.version = `1.0.${0 + versionIncrements}`; + this.version = `1.0.${1 + versionIncrements}`; this.options = metadata.options; } @@ -229,7 +229,7 @@ class ReadNovelFullPlugin implements Plugin.PluginBase { this.site + '/' + this.options?.searchPage - .replace('%%SEARCH%%', searchTerm) + .replace('%%SEARCH%%', encodeURIComponent(searchTerm)) .replace('%%PAGE%%', page.toString()); const $ = await this.getCheerio(url, true); diff --git a/scripts/multisrc/rulate/template.ts b/scripts/multisrc/rulate/template.ts index b6da1035e..155fbf0bd 100644 --- a/scripts/multisrc/rulate/template.ts +++ b/scripts/multisrc/rulate/template.ts @@ -26,7 +26,7 @@ class RulatePlugin implements Plugin.PluginBase { this.name = metadata.sourceName; this.icon = `multisrc/rulate/${metadata.id.toLowerCase()}/icon.png`; this.site = metadata.sourceSite; - this.version = '1.0.' + (1 + metadata.versionIncrements); + this.version = '1.0.' + (2 + metadata.versionIncrements); this.filters = metadata.filters; } @@ -217,7 +217,9 @@ class RulatePlugin implements Plugin.PluginBase { async searchNovels(searchTerm: string): Promise { const novels: Plugin.NovelItem[] = []; const result: response[] = await fetchApi( - this.site + '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/search/autocomplete?query=' + searchTerm, + this.site + + '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/search/autocomplete?query=' + + encodeURIComponent(searchTerm), ).then(res => res.json()); result.forEach(novel => { diff --git a/src/plugins/english/allnovelfull.ts b/src/plugins/english/allnovelfull.ts index d69ceb15b..ec524cc86 100644 --- a/src/plugins/english/allnovelfull.ts +++ b/src/plugins/english/allnovelfull.ts @@ -9,7 +9,7 @@ class AllNovelFullPlugin implements Plugin.PluginBase { name = 'AllNovelFull'; icon = 'src/en/allnovelfull/icon.png'; site = 'https://allnovelfull.net'; - version = '1.0.1'; + version = '1.0.2'; parseNovels(loadedCheerio: CheerioAPI) { const novels: Plugin.NovelItem[] = []; @@ -140,7 +140,7 @@ class AllNovelFullPlugin implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const url = `${this.site}/search?keyword=${searchTerm}&page=${page}`; + const url = `${this.site}/search?keyword=${encodeURIComponent(searchTerm)}&page=${page}`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/ao3.ts b/src/plugins/english/ao3.ts index 7353e10e1..8069d161f 100644 --- a/src/plugins/english/ao3.ts +++ b/src/plugins/english/ao3.ts @@ -7,7 +7,7 @@ import { defaultCover } from '@libs/defaultCover'; class ArchiveOfOurOwn implements Plugin.PluginBase { id = 'archiveofourown'; name = 'Archive Of Our Own'; - version = '1.0.2'; + version = '1.0.3'; icon = 'src/en/ao3/icon.png'; site = 'https://archiveofourown.org/'; @@ -282,7 +282,7 @@ class ArchiveOfOurOwn implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const searchUrl = `${this.site}works/search?page=${page}&work_search%5Blanguage_id%5D=en&work_search%5Bquery%5D=${searchTerm}`; + const searchUrl = `${this.site}works/search?page=${page}&work_search%5Blanguage_id%5D=en&work_search%5Bquery%5D=${encodeURIComponent(searchTerm)}`; const result = await fetchApi(searchUrl); const body = await result.text(); diff --git a/src/plugins/english/bestlightnovel.ts b/src/plugins/english/bestlightnovel.ts index 901ea82ab..952303a3d 100644 --- a/src/plugins/english/bestlightnovel.ts +++ b/src/plugins/english/bestlightnovel.ts @@ -10,7 +10,7 @@ class BLN implements Plugin.PluginBase { name = 'BestLightNovel'; icon = 'src/en/bestlightnovel/icon.png'; site = 'https://bestlightnovel.com/'; - version = '1.0.0'; + version = '1.0.1'; parseNovels(loadedCheerio: CheerioAPI) { const novels: Plugin.NovelItem[] = []; @@ -160,7 +160,7 @@ class BLN implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const url = `${this.site}search_novels/${searchTerm}?page=${page}`; + const url = `${this.site}search_novels/${encodeURIComponent(searchTerm)}?page=${page}`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/comrademao.broken.ts b/src/plugins/english/comrademao.broken.ts index b5b3d9660..6b7ec81c2 100644 --- a/src/plugins/english/comrademao.broken.ts +++ b/src/plugins/english/comrademao.broken.ts @@ -8,7 +8,7 @@ class ComradeMaoPlugin implements Plugin.PluginBase { id = 'comrademao'; name = 'Comrade Mao'; site = 'https://comrademao.com/'; - version = '1.0.0'; + version = '1.0.1'; icon = 'src/en/comrademao/icon.png'; parseNovels(loadedCheerio: CheerioAPI) { @@ -149,7 +149,7 @@ class ComradeMaoPlugin implements Plugin.PluginBase { searchTerm: string, pageNo: number, ): Promise { - const url = `${this.site}page/${pageNo}/?s=${searchTerm}&post_type=novel`; + const url = `${this.site}page/${pageNo}/?s=${encodeURIComponent(searchTerm)}&post_type=novel`; const body = await fetchApi(url).then(result => result.text()); diff --git a/src/plugins/english/divinedaolibrary.ts b/src/plugins/english/divinedaolibrary.ts index 04f8bedf2..d7867efa7 100644 --- a/src/plugins/english/divinedaolibrary.ts +++ b/src/plugins/english/divinedaolibrary.ts @@ -4,11 +4,13 @@ import { Filters, FilterTypes, FilterValueWithType } from '@libs/filterInputs'; import { Plugin } from '@typings/plugin'; import { load as parseHTML } from 'cheerio'; +//TODO: this looks similar to fictioneer source? maybe use multisrc someday + class DDLPlugin implements Plugin.PluginBase { id = 'DDL.com'; name = 'Divine Dao Library'; site = 'https://www.divinedaolibrary.com/'; - version = '1.1.0'; + version = '1.1.1'; icon = 'src/en/divinedaolibrary/icon.png'; filters = { diff --git a/src/plugins/english/earlynovel.ts b/src/plugins/english/earlynovel.ts index 19886e1a2..c3be3e04c 100644 --- a/src/plugins/english/earlynovel.ts +++ b/src/plugins/english/earlynovel.ts @@ -6,7 +6,7 @@ import { Plugin } from '@typings/plugin'; class EarlyNovelPlugin implements Plugin.PagePlugin { id = 'earlynovel'; name = 'Early Novel'; - version = '1.0.0'; + version = '1.0.1'; icon = 'src/en/earlynovel/icon.png'; site = 'https://earlynovel.net/'; @@ -128,7 +128,7 @@ class EarlyNovelPlugin implements Plugin.PagePlugin { } async searchNovels(searchTerm: string): Promise { - const url = `${this.site}search?keyword=${searchTerm}`; + const url = `${this.site}search?keyword=${encodeURIComponent(searchTerm)}`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/genesis.ts b/src/plugins/english/genesis.ts index 286e8d333..f69094e68 100644 --- a/src/plugins/english/genesis.ts +++ b/src/plugins/english/genesis.ts @@ -18,7 +18,7 @@ class Genesis implements Plugin.PluginBase { icon = 'src/en/genesis/icon.png'; customCSS = 'src/en/genesis/customCSS.css'; site = 'https://genesistudio.com'; - version = '1.1.0'; + version = '1.1.1'; imageRequestInit?: Plugin.ImageRequestInit | undefined = { headers: { @@ -465,7 +465,7 @@ class Genesis implements Plugin.PluginBase { pageNo: number, ): Promise { if (pageNo !== 1) return []; - const url = `${this.site}/api/novels/search?serialization=All&sort=Popular&title=${searchTerm}`; + const url = `${this.site}/api/novels/search?serialization=All&sort=Popular&title=${encodeURIComponent(searchTerm)}`; const json = await fetchApi(url).then(r => r.json()); return this.parseNovels(json); } diff --git a/src/plugins/english/mtlreader.ts b/src/plugins/english/mtlreader.ts index 46e074f5d..3b9693960 100644 --- a/src/plugins/english/mtlreader.ts +++ b/src/plugins/english/mtlreader.ts @@ -5,7 +5,7 @@ import { Plugin } from '@typings/plugin'; class MTLReader implements Plugin.PluginBase { id = 'mtlreader'; name = 'MTL Reader'; - version = '1.0.0'; + version = '1.0.1'; icon = 'src/en/mtlreader/icon.png'; site = 'https://mtlreader.com/'; @@ -92,7 +92,7 @@ class MTLReader implements Plugin.PluginBase { const tokenCheerio = parseHTML(body); const token = tokenCheerio('input[name="_token"]').attr('value'); - const searchUrl = `${this.site}search?_token=${token}&input=${searchTerm}`; + const searchUrl = `${this.site}search?_token=${token}&input=${encodeURIComponent(searchTerm)}`; const seacrhBody = await fetchApi(searchUrl).then(r => r.text()); const loadedCheerio = parseHTML(seacrhBody); return this.parseNovels(loadedCheerio); diff --git a/src/plugins/english/novelbin.ts b/src/plugins/english/novelbin.ts index 3de839c81..78033f22c 100644 --- a/src/plugins/english/novelbin.ts +++ b/src/plugins/english/novelbin.ts @@ -9,7 +9,7 @@ class NovelBin implements Plugin.PluginBase { icon = 'src/en/novelbin/icon.png'; site = 'https://novelbin.com/'; subsite = 'https://novelbin.lanovels.net/'; - version = '1.2.0'; + version = '1.2.1'; imageRequestInit?: Plugin.ImageRequestInit | undefined = { headers: { 'referrer': this.site, @@ -144,7 +144,7 @@ class NovelBin implements Plugin.PluginBase { } async searchNovels(searchTerm: string): Promise { - const url = `${this.site}search/?keyword=${searchTerm}`; + const url = `${this.site}search/?keyword=${encodeURIComponent(searchTerm)}`; const body = await fetchApi(url).then(r => r.text()); const loadedCheerio = parseHTML(body); diff --git a/src/plugins/english/novelbuddy.ts b/src/plugins/english/novelbuddy.ts index 15a4f704f..4e3374a2d 100644 --- a/src/plugins/english/novelbuddy.ts +++ b/src/plugins/english/novelbuddy.ts @@ -7,7 +7,7 @@ class NovelBuddy implements Plugin.PluginBase { id = 'novelbuddy'; name = 'NovelBuddy.io'; site = 'https://novelbuddy.io/'; - version = '1.0.2'; + version = '1.0.3'; icon = 'src/en/novelbuddy/icon.png'; parseNovels(loadedCheerio: CheerioAPI) { @@ -177,7 +177,7 @@ class NovelBuddy implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const url = `${this.site}search?q=${searchTerm}&page=${page}`; + const url = `${this.site}search?q=${encodeURIComponent(searchTerm)}&page=${page}`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/novelfire.ts b/src/plugins/english/novelfire.ts index cbe2208d6..79f55f67a 100644 --- a/src/plugins/english/novelfire.ts +++ b/src/plugins/english/novelfire.ts @@ -7,7 +7,7 @@ import { Plugin } from '@typings/plugin'; class NovelFire implements Plugin.PluginBase { id = 'novelfire'; name = 'Novel Fire'; - version = '1.0.1'; + version = '1.0.2'; icon = 'src/en/novelfire/icon.png'; site = 'https://novelfire.net/'; @@ -230,7 +230,7 @@ class NovelFire implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const url = `${this.site}search?keyword=${searchTerm}&page=${page}`; + const url = `${this.site}search?keyword=${encodeURIComponent(searchTerm)}&page=${page}`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/novelfull.ts b/src/plugins/english/novelfull.ts index d154aea59..576fa3efa 100644 --- a/src/plugins/english/novelfull.ts +++ b/src/plugins/english/novelfull.ts @@ -6,7 +6,7 @@ import { Filters, FilterTypes } from '@libs/filterInputs'; class NovelFull implements Plugin.PluginBase { id = 'novelfull'; name = 'NovelFull'; - version = '1.0.2'; + version = '1.0.3'; icon = 'src/en/novelfull/icon.png'; site = 'https://novelfull.com/'; @@ -142,7 +142,7 @@ class NovelFull implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const searchUrl = `${this.site}search?keyword=${searchTerm}&page=${page}`; + const searchUrl = `${this.site}search?keyword=${encodeURIComponent(searchTerm)}&page=${page}`; const result = await fetchApi(searchUrl); const body = await result.text(); diff --git a/src/plugins/english/novelhall.ts b/src/plugins/english/novelhall.ts index 40b6a2e08..be286a385 100644 --- a/src/plugins/english/novelhall.ts +++ b/src/plugins/english/novelhall.ts @@ -6,7 +6,7 @@ import { defaultCover } from '@libs/defaultCover'; class NovelHall implements Plugin.PluginBase { id = 'novelhall'; name = 'Novel Hall'; - version = '1.0.1'; + version = '1.0.2'; icon = 'src/en/novelhall/icon.png'; site = 'https://novelhall.com/'; @@ -90,7 +90,7 @@ class NovelHall implements Plugin.PluginBase { } async searchNovels(searchTerm: string): Promise { - const url = `${this.site}index.php?s=so&module=book&keyword=${searchTerm}`; + const url = `${this.site}index.php?s=so&module=book&keyword=${encodeURIComponent(searchTerm)}`; const body = await fetchApi(url).then(r => r.text()); const loadedCheerio = parseHTML(body); diff --git a/src/plugins/english/novelight.ts b/src/plugins/english/novelight.ts index aa30aeb33..3095ac925 100644 --- a/src/plugins/english/novelight.ts +++ b/src/plugins/english/novelight.ts @@ -9,7 +9,7 @@ import { NovelStatus } from '@libs/novelStatus'; class Novelight implements Plugin.PagePlugin { id = 'novelight'; name = 'Novelight'; - version = '1.1.0'; + version = '1.1.1'; icon = 'src/en/novelight/icon.png'; site = 'https://novelight.net/'; @@ -188,7 +188,7 @@ class Novelight implements Plugin.PagePlugin { } async searchNovels(searchTerm: string): Promise { - const url = `${this.site}catalog/?search=${searchTerm}`; + const url = `${this.site}catalog/?search=${encodeURIComponent(searchTerm)}`; const body = await fetchApi(url).then(r => r.text()); const loadedCheerio = parseHTML(body); diff --git a/src/plugins/english/novelupdates.ts b/src/plugins/english/novelupdates.ts index 82eafb44c..c8b4ca421 100644 --- a/src/plugins/english/novelupdates.ts +++ b/src/plugins/english/novelupdates.ts @@ -6,7 +6,7 @@ import { Plugin } from '@typings/plugin'; class NovelUpdates implements Plugin.PluginBase { id = 'novelupdates'; name = 'Novel Updates'; - version = '0.7.15'; + version = '0.7.16'; icon = 'src/en/novelupdates/icon.png'; customCSS = 'src/en/novelupdates/customCSS.css'; site = 'https://www.novelupdates.com/'; @@ -1004,7 +1004,7 @@ class NovelUpdates implements Plugin.PluginBase { ); searchTerm = longestSearchTerm.replace(/[‘’]/g, "'").replace(/\s+/g, '+'); - const url = `${this.site}series-finder/?sf=1&sh=${searchTerm}&sort=srank&order=asc&pg=${page}`; + const url = `${this.site}series-finder/?sf=1&sh=${encodeURIComponent(searchTerm)}&sort=srank&order=asc&pg=${page}`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/pawread.ts b/src/plugins/english/pawread.ts index 810322cf7..b15b8bba1 100644 --- a/src/plugins/english/pawread.ts +++ b/src/plugins/english/pawread.ts @@ -6,7 +6,7 @@ import { Filters, FilterTypes } from '@libs/filterInputs'; class PawRead implements Plugin.PluginBase { id = 'pawread'; name = 'PawRead'; - version = '2.0.0'; + version = '2.0.1'; icon = 'src/en/pawread/icon.png'; site = 'https://m.pawread.com/'; @@ -128,7 +128,7 @@ class PawRead implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const searchUrl = `${this.site}search/?keywords=${searchTerm}&page=${page}`; + const searchUrl = `${this.site}search/?keywords=${encodeURIComponent(searchTerm)}&page=${page}`; const result = await fetchApi(searchUrl); const body = await result.text(); diff --git a/src/plugins/english/rainofsnow.ts b/src/plugins/english/rainofsnow.ts index 46b644380..67bcff7bd 100644 --- a/src/plugins/english/rainofsnow.ts +++ b/src/plugins/english/rainofsnow.ts @@ -9,7 +9,7 @@ class Rainofsnow implements Plugin.PagePlugin { name = 'Rainofsnow'; icon = 'src/en/rainofsnow/icon.png'; site = 'https://rainofsnow.com/'; - version = '1.1.1'; + version = '1.1.2'; parseNovels(loadedCheerio: CheerioAPI) { const novels: Plugin.NovelItem[] = []; @@ -154,7 +154,7 @@ class Rainofsnow implements Plugin.PagePlugin { // no page number, infinite scroll const newSearch = searchTerm.replace(/\s+/g, '+'); - const url = this.site + '?s=' + newSearch; + const url = this.site + '?s=' + encodeURIComponent(newSearch); const result = await fetch(url); const body = await result.text(); diff --git a/src/plugins/english/readlitenovel.ts b/src/plugins/english/readlitenovel.ts index ec77bd7a1..ec3a2dc7f 100644 --- a/src/plugins/english/readlitenovel.ts +++ b/src/plugins/english/readlitenovel.ts @@ -8,7 +8,7 @@ import dayjs from 'dayjs'; class ReadLiteNovel implements Plugin.PluginBase { id = 'rln.app'; name = 'ReadLiteNovel'; - version = '1.0.0'; + version = '1.0.1'; icon = 'src/en/readlitenovel/icon.png'; site = 'https://rln.app'; @@ -154,7 +154,8 @@ class ReadLiteNovel implements Plugin.PluginBase { async searchNovels(searchTerm: string): Promise { const url = - this.site + `/search/autocomplete?dataType=json&query=${searchTerm}`; + this.site + + `/search/autocomplete?dataType=json&query=${encodeURIComponent(searchTerm)}`; const result = await fetchApi(url); const body = await result.json(); const novels: Plugin.NovelItem[] = []; diff --git a/src/plugins/english/royalroad.ts b/src/plugins/english/royalroad.ts index 444708603..68c577c53 100644 --- a/src/plugins/english/royalroad.ts +++ b/src/plugins/english/royalroad.ts @@ -7,7 +7,7 @@ import { NovelStatus } from '@libs/novelStatus'; class RoyalRoad implements Plugin.PluginBase { id = 'royalroad'; name = 'Royal Road'; - version = '2.1.2'; + version = '2.1.3'; icon = 'src/en/royalroad/icon.png'; site = 'https://www.royalroad.com/'; @@ -258,7 +258,7 @@ class RoyalRoad implements Plugin.PluginBase { searchTerm: string, page: number, ): Promise { - const searchUrl = `${this.site}fictions/search?page=${page}&title=${searchTerm}`; + const searchUrl = `${this.site}fictions/search?page=${page}&title=${encodeURIComponent(searchTerm)}`; const body = await fetchApi(searchUrl).then(r => r.text()); return this.parseNovels(body); diff --git a/src/plugins/english/scribblehub.ts b/src/plugins/english/scribblehub.ts index d0d2c42a2..d62e3c749 100644 --- a/src/plugins/english/scribblehub.ts +++ b/src/plugins/english/scribblehub.ts @@ -9,7 +9,7 @@ class ScribbleHubPlugin implements Plugin.PluginBase { name = 'Scribble Hub'; icon = 'src/en/scribblehub/icon.png'; site = 'https://www.scribblehub.com/'; - version = '1.0.1'; + version = '1.0.2'; parseNovels(loadedCheerio: CheerioAPI) { const novels: Plugin.NovelItem[] = []; @@ -177,7 +177,7 @@ class ScribbleHubPlugin implements Plugin.PluginBase { } async searchNovels(searchTerm: string): Promise { - const url = `${this.site}?s=${searchTerm}&post_type=fictionposts`; + const url = `${this.site}?s=${encodeURIComponent(searchTerm)}&post_type=fictionposts`; const result = await fetchApi(url); const body = await result.text(); diff --git a/src/plugins/english/webnovel.ts b/src/plugins/english/webnovel.ts index e84901380..aac4257f5 100644 --- a/src/plugins/english/webnovel.ts +++ b/src/plugins/english/webnovel.ts @@ -7,7 +7,7 @@ import { storage } from '@libs/storage'; class Webnovel implements Plugin.PluginBase { id = 'webnovel'; name = 'Webnovel'; - version = '1.0.2'; + version = '1.0.3'; icon = 'src/en/webnovel/icon.png'; site = 'https://www.webnovel.com'; headers = { @@ -240,7 +240,7 @@ class Webnovel implements Plugin.PluginBase { ): Promise { searchTerm = searchTerm.replace(/\s+/g, '+'); - const url = `${this.site}/search?keywords=${searchTerm}&pageIndex=${pageNo}${type ? `&type=${type}` : ''}`; + const url = `${this.site}/search?keywords=${encodeURIComponent(searchTerm)}&pageIndex=${pageNo}${type ? `&type=${type}` : ''}`; const result = await fetchApi(url, { headers: this.headers, }); diff --git a/src/plugins/english/wuxiaworld.ts b/src/plugins/english/wuxiaworld.ts index e3b3356e7..8d9af80f7 100644 --- a/src/plugins/english/wuxiaworld.ts +++ b/src/plugins/english/wuxiaworld.ts @@ -107,7 +107,7 @@ class WuxiaWorld implements Plugin.PluginBase { site = 'https://www.wuxiaworld.com/'; apiSite = 'https://api2.wuxiaworld.com/wuxiaworld.api.v2.'; filters?: Filters | undefined; - version = '0.5.0'; + version = '0.5.1'; parseNovels(data: { items: NovelEntry[] }) { const novels: Plugin.NovelItem[] = []; @@ -270,7 +270,8 @@ class WuxiaWorld implements Plugin.PluginBase { } async searchNovels(searchTerm: string): Promise { - const url = this.site + 'api/novels/search?query=' + searchTerm; + const url = + this.site + 'api/novels/search?query=' + encodeURIComponent(searchTerm); const result = await fetchApi(url); const data = await result.json();