From 8c5dcd0e32b767ba38843a1da030bc90478a81a7 Mon Sep 17 00:00:00 2001 From: error7404 <48163201+error7404@users.noreply.github.com> Date: Sun, 20 Oct 2024 18:33:10 +0200 Subject: [PATCH 1/3] added `down` status to plugins modified: plugins/multisrc/generate-multisrc-plugins.js modified: plugins/multisrc/lightnovelwp/generator.js modified: plugins/multisrc/lightnovelwp/template.ts modified: plugins/multisrc/madara/generator.js modified: plugins/multisrc/madara/template.ts --- plugins/multisrc/generate-multisrc-plugins.js | 6 +- plugins/multisrc/lightnovelwp/generator.js | 10 ++- plugins/multisrc/lightnovelwp/template.ts | 2 + plugins/multisrc/madara/generator.js | 10 ++- plugins/multisrc/madara/sources.json | 86 +++++++++++++++++++ plugins/multisrc/madara/template.ts | 2 + 6 files changed, 112 insertions(+), 4 deletions(-) diff --git a/plugins/multisrc/generate-multisrc-plugins.js b/plugins/multisrc/generate-multisrc-plugins.js index 17cd119b0..e000cb9c5 100644 --- a/plugins/multisrc/generate-multisrc-plugins.js +++ b/plugins/multisrc/generate-multisrc-plugins.js @@ -5,6 +5,7 @@ import fs from 'fs'; // lang: string; // filename: string; // pluginScript: string; +// down?: boolean; // }; // export type ScrpitGeneratorFunction = () => GeneratedScript[]; @@ -19,7 +20,7 @@ const generate = async name => { if (!isScriptGenerator(generateAll)) return false; const sources = generateAll(); for (let source of sources) { - const { lang, filename, pluginScript } = source; + const { lang, filename, pluginScript, down } = source; if (!lang || !filename || !pluginScript) { console.warn(name, ': lang, filename, pluginScript are required!'); continue; @@ -28,7 +29,8 @@ const generate = async name => { const filePath = path.join( pluginsDir, lang.toLowerCase(), - filename.replace(/[\s-.]+/g, '') + `[${name}].ts`, + filename.replace(/[\s-\.]+/g, '') + + `[${name}]${down ? '.down' : ''}.ts`, ); fs.writeFileSync(filePath, pluginScript, { encoding: 'utf-8' }); } diff --git a/plugins/multisrc/lightnovelwp/generator.js b/plugins/multisrc/lightnovelwp/generator.js index d6bcd242e..dbd4fadf1 100644 --- a/plugins/multisrc/lightnovelwp/generator.js +++ b/plugins/multisrc/lightnovelwp/generator.js @@ -15,7 +15,14 @@ export const generateAll = function () { source.filters = JSON.parse(filters).filters; } console.log( - `[lightnovelwp] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + '[lightnovelwp] Generating:', + source.id.padEnd(20), + source.options?.down + ? '🔽site is down🔽' + : source.filters + ? '🔎with filters🔍' + : '🚫 no filters 🚫', + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -39,5 +46,6 @@ export default plugin; lang: source.options?.lang || 'English', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/lightnovelwp/template.ts b/plugins/multisrc/lightnovelwp/template.ts index a51f23915..821a05e02 100644 --- a/plugins/multisrc/lightnovelwp/template.ts +++ b/plugins/multisrc/lightnovelwp/template.ts @@ -9,6 +9,8 @@ import { storage } from '@libs/storage'; type LightNovelWPOptions = { reverseChapters?: boolean; + down?: boolean; + downSince?: string; lang?: string; versionIncrements?: number; seriesPath?: string; diff --git a/plugins/multisrc/madara/generator.js b/plugins/multisrc/madara/generator.js index cb3fa09c7..5486466dc 100644 --- a/plugins/multisrc/madara/generator.js +++ b/plugins/multisrc/madara/generator.js @@ -15,7 +15,14 @@ export const generateAll = function () { source.filters = JSON.parse(filters).filters; } console.log( - `[madara] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + '[madara] Generating:', + source.id.padEnd(20), + source.options?.down + ? '🔽site is down🔽' + : source.filters + ? '🔎with filters🔍' + : '🚫 no filters 🚫', + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -35,5 +42,6 @@ export default plugin; lang: source.options?.lang || 'English', filename: source.sourceName.replace(/[^\w]/g, ''), pluginScript, + down: source.options?.down, }; }; diff --git a/plugins/multisrc/madara/sources.json b/plugins/multisrc/madara/sources.json index e3b5c7f75..171cd915d 100644 --- a/plugins/multisrc/madara/sources.json +++ b/plugins/multisrc/madara/sources.json @@ -25,6 +25,15 @@ "useNewChapterEndpoint": true } }, + { + "id": "freenovel.me", + "sourceSite": "https://freenovel.me/", + "sourceName": "FreeNovelMe", + "options": { + "down": true, + "downSince": "2024-03-04" + } + }, { "id": "1stkissnovel", "sourceSite": "https://1stkissnovel.org/", @@ -90,6 +99,15 @@ "downSince": 1768289212967 } }, + { + "id": "readwebnovels", + "sourceSite": "https://readwebnovels.net/", + "sourceName": "ReadWebNovels", + "options": { + "down": true, + "downSince": "2024-03-04" + } + }, { "id": "wbnovel", "sourceSite": "https://wbnovel.com/", @@ -124,6 +142,16 @@ "lang": "Indonesian" } }, + { + "id": "onlymtl", + "sourceSite": "https://www.onlymtl.com/", + "sourceName": "OnlyMTL", + "options": { + "useNewChapterEndpoint": true, + "down": true, + "downSince": "2024-03-04" + } + }, { "id": "hizomanga", "sourceSite": "https://hizomanga.net/", @@ -169,6 +197,16 @@ "useNewChapterEndpoint": true } }, + { + "id": "mtlnovel.club", + "sourceSite": "https://mtlnovel.club/", + "sourceName": "MTLNovel.Club", + "options": { + "useNewChapterEndpoint": true, + "down": true, + "downSince": "2024-03-04" + } + }, { "id": "guavaread", "sourceSite": "https://guavaread.com/", @@ -179,6 +217,26 @@ "downSince": 1768289212912 } }, + { + "id": "sweetEscapeTL", + "sourceSite": "https://sweetescapetranslations.com/", + "sourceName": "Sweet Escape Translations", + "options": { + "useNewChapterEndpoint": false, + "down": true, + "downSince": "2024-03-04" + } + }, + { + "id": "novelstic", + "sourceSite": "https://novelstic.com/", + "sourceName": "Novelstic", + "options": { + "useNewChapterEndpoint": true, + "down": true, + "downSince": "2024-03-04" + } + }, { "id": "neosekaiTLS", "sourceSite": "https://www.neosekaitranslations.com/", @@ -203,6 +261,34 @@ "hasLocked": true } }, + { + "id": "nocturneTLS", + "sourceSite": "https://nocturnetls.net/", + "sourceName": "Nocturne Translations", + "options": { + "down": true, + "downSince": "2024-03-04" + } + }, + { + "id": "novelroom", + "sourceSite": "https://novelroom.net/", + "sourceName": "Novelroom.net", + "options": { + "down": true, + "downSince": "2024-03-04" + } + }, + { + "id": "novelr18", + "sourceSite": "https://novelr18.com/", + "sourceName": "NovelR18", + "options": { + "useNewChapterEndpoint": true, + "down": true, + "downSince": "2024-03-04" + } + }, { "id": "webnoveloku", "sourceSite": "https://www.webnoveloku.com/", diff --git a/plugins/multisrc/madara/template.ts b/plugins/multisrc/madara/template.ts index bc97c2f44..ce529be16 100644 --- a/plugins/multisrc/madara/template.ts +++ b/plugins/multisrc/madara/template.ts @@ -12,6 +12,8 @@ const includesAny = (str: string, keywords: string[]) => type MadaraOptions = { useNewChapterEndpoint?: boolean; + down?: boolean; + downSince?: string; lang?: string; orderBy?: string; versionIncrements?: number; From 7c1b72387df8213c99bc2143326d2b80663eab08 Mon Sep 17 00:00:00 2001 From: Rojikku Date: Tue, 13 Jan 2026 03:23:48 -0500 Subject: [PATCH 2/3] revert: sources.json to current --- plugins/multisrc/madara/sources.json | 86 ---------------------------- 1 file changed, 86 deletions(-) diff --git a/plugins/multisrc/madara/sources.json b/plugins/multisrc/madara/sources.json index 171cd915d..e3b5c7f75 100644 --- a/plugins/multisrc/madara/sources.json +++ b/plugins/multisrc/madara/sources.json @@ -25,15 +25,6 @@ "useNewChapterEndpoint": true } }, - { - "id": "freenovel.me", - "sourceSite": "https://freenovel.me/", - "sourceName": "FreeNovelMe", - "options": { - "down": true, - "downSince": "2024-03-04" - } - }, { "id": "1stkissnovel", "sourceSite": "https://1stkissnovel.org/", @@ -99,15 +90,6 @@ "downSince": 1768289212967 } }, - { - "id": "readwebnovels", - "sourceSite": "https://readwebnovels.net/", - "sourceName": "ReadWebNovels", - "options": { - "down": true, - "downSince": "2024-03-04" - } - }, { "id": "wbnovel", "sourceSite": "https://wbnovel.com/", @@ -142,16 +124,6 @@ "lang": "Indonesian" } }, - { - "id": "onlymtl", - "sourceSite": "https://www.onlymtl.com/", - "sourceName": "OnlyMTL", - "options": { - "useNewChapterEndpoint": true, - "down": true, - "downSince": "2024-03-04" - } - }, { "id": "hizomanga", "sourceSite": "https://hizomanga.net/", @@ -197,16 +169,6 @@ "useNewChapterEndpoint": true } }, - { - "id": "mtlnovel.club", - "sourceSite": "https://mtlnovel.club/", - "sourceName": "MTLNovel.Club", - "options": { - "useNewChapterEndpoint": true, - "down": true, - "downSince": "2024-03-04" - } - }, { "id": "guavaread", "sourceSite": "https://guavaread.com/", @@ -217,26 +179,6 @@ "downSince": 1768289212912 } }, - { - "id": "sweetEscapeTL", - "sourceSite": "https://sweetescapetranslations.com/", - "sourceName": "Sweet Escape Translations", - "options": { - "useNewChapterEndpoint": false, - "down": true, - "downSince": "2024-03-04" - } - }, - { - "id": "novelstic", - "sourceSite": "https://novelstic.com/", - "sourceName": "Novelstic", - "options": { - "useNewChapterEndpoint": true, - "down": true, - "downSince": "2024-03-04" - } - }, { "id": "neosekaiTLS", "sourceSite": "https://www.neosekaitranslations.com/", @@ -261,34 +203,6 @@ "hasLocked": true } }, - { - "id": "nocturneTLS", - "sourceSite": "https://nocturnetls.net/", - "sourceName": "Nocturne Translations", - "options": { - "down": true, - "downSince": "2024-03-04" - } - }, - { - "id": "novelroom", - "sourceSite": "https://novelroom.net/", - "sourceName": "Novelroom.net", - "options": { - "down": true, - "downSince": "2024-03-04" - } - }, - { - "id": "novelr18", - "sourceSite": "https://novelr18.com/", - "sourceName": "NovelR18", - "options": { - "useNewChapterEndpoint": true, - "down": true, - "downSince": "2024-03-04" - } - }, { "id": "webnoveloku", "sourceSite": "https://www.webnoveloku.com/", From a22f11b806793bff3359470c01fd0ad1b79b4445 Mon Sep 17 00:00:00 2001 From: Rojikku Date: Tue, 13 Jan 2026 16:56:51 -0500 Subject: [PATCH 3/3] feat: Add .broken with all down statuses --- plugins/multisrc/fictioneer/generator.js | 2 ++ plugins/multisrc/fictioneer/template.ts | 2 ++ plugins/multisrc/generate-multisrc-plugins.js | 2 +- plugins/multisrc/hotnovelpub/generator.js | 9 ++++++++- plugins/multisrc/hotnovelpub/template.ts | 2 ++ plugins/multisrc/ifreedom/generator.js | 9 ++++++++- plugins/multisrc/ifreedom/template.ts | 7 +++++++ plugins/multisrc/lightnovelworld/generator.js | 4 +++- plugins/multisrc/lightnovelworld/template.ts | 2 ++ plugins/multisrc/mtlnovel/generator.js | 8 +++++++- plugins/multisrc/mtlnovel/template.ts | 2 ++ plugins/multisrc/novelcool/generator.js | 1 + plugins/multisrc/novelcool/template.ts | 2 ++ plugins/multisrc/ranobes/generator.js | 9 ++++++++- plugins/multisrc/ranobes/template.ts | 2 ++ plugins/multisrc/readnovelfull/generator.js | 5 ++++- plugins/multisrc/readnovelfull/template.ts | 2 ++ plugins/multisrc/readwn/generator.js | 5 ++++- plugins/multisrc/readwn/template.ts | 2 ++ plugins/multisrc/rulate/generator.js | 7 ++++++- plugins/multisrc/rulate/template.ts | 7 +++++++ scripts/build-plugin-manifest.js | 1 + 22 files changed, 83 insertions(+), 9 deletions(-) diff --git a/plugins/multisrc/fictioneer/generator.js b/plugins/multisrc/fictioneer/generator.js index 452a878e6..b745a8a9b 100644 --- a/plugins/multisrc/fictioneer/generator.js +++ b/plugins/multisrc/fictioneer/generator.js @@ -10,6 +10,7 @@ export const generateAll = function () { return list.map(source => { console.log( `[fictioneer] Generating: ${source.id}${' '.repeat(20 - source.id.length)}`, + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -37,5 +38,6 @@ export default plugin; lang: source.options?.lang || 'English', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/fictioneer/template.ts b/plugins/multisrc/fictioneer/template.ts index 2ac2688a7..a827a34fa 100644 --- a/plugins/multisrc/fictioneer/template.ts +++ b/plugins/multisrc/fictioneer/template.ts @@ -6,6 +6,8 @@ import { Filters } from '@libs/filterInputs'; type FictioneerOptions = { browsePage: string; + down?: boolean; + downSince?: string; lang?: string; versionIncrements?: number; }; diff --git a/plugins/multisrc/generate-multisrc-plugins.js b/plugins/multisrc/generate-multisrc-plugins.js index e000cb9c5..e19bc9227 100644 --- a/plugins/multisrc/generate-multisrc-plugins.js +++ b/plugins/multisrc/generate-multisrc-plugins.js @@ -30,7 +30,7 @@ const generate = async name => { pluginsDir, lang.toLowerCase(), filename.replace(/[\s-\.]+/g, '') + - `[${name}]${down ? '.down' : ''}.ts`, + `[${name}]${down ? '.broken' : ''}.ts`, ); fs.writeFileSync(filePath, pluginScript, { encoding: 'utf-8' }); } diff --git a/plugins/multisrc/hotnovelpub/generator.js b/plugins/multisrc/hotnovelpub/generator.js index c8c89ae3f..1d12cd9bf 100644 --- a/plugins/multisrc/hotnovelpub/generator.js +++ b/plugins/multisrc/hotnovelpub/generator.js @@ -36,7 +36,13 @@ export const generateAll = function () { return { ...p, filters }; }) .map(metadata => { - console.log(`[hotnovelpub]: Generating`, metadata.id); + console.log( + `[hotnovelpub]: Generating`, + metadata.id, + metadata.options?.downSince + ? `since: ${metadata.options?.downSince}` + : '', + ); return generator(metadata); }); }; @@ -59,5 +65,6 @@ export default plugin; lang: lang[metadata?.options?.lang || 'en'] || 'english', filename: metadata.sourceName, pluginScript, + down: metadata.options?.down || false, }; }; diff --git a/plugins/multisrc/hotnovelpub/template.ts b/plugins/multisrc/hotnovelpub/template.ts index 5fa1246c6..6def09635 100644 --- a/plugins/multisrc/hotnovelpub/template.ts +++ b/plugins/multisrc/hotnovelpub/template.ts @@ -13,6 +13,8 @@ export type HotNovelPubMetadata = { type HotNovelPubOptions = { lang?: string; + down?: boolean; + downSince?: string; }; class HotNovelPubPlugin implements Plugin.PluginBase { diff --git a/plugins/multisrc/ifreedom/generator.js b/plugins/multisrc/ifreedom/generator.js index a09249eba..fab8b37bf 100644 --- a/plugins/multisrc/ifreedom/generator.js +++ b/plugins/multisrc/ifreedom/generator.js @@ -9,7 +9,13 @@ const folder = dirname(fileURLToPath(import.meta.url)); export const generateAll = function () { return list.map(metadata => { metadata.filters = Object.assign(defaultSettings.filters, metadata.filters); - console.log(`[ifreedom]: Generating`, metadata.id); + console.log( + `[ifreedom]: Generating`, + metadata.id, + metadata.options?.downSince + ? `since: ${metadata.options?.downSince}` + : '', + ); return generator(metadata); }); }; @@ -32,5 +38,6 @@ export default plugin; lang: 'russian', filename: metadata.sourceName, pluginScript, + down: metadata.options?.down || false, }; }; diff --git a/plugins/multisrc/ifreedom/template.ts b/plugins/multisrc/ifreedom/template.ts index 27f705434..e9a0bb422 100644 --- a/plugins/multisrc/ifreedom/template.ts +++ b/plugins/multisrc/ifreedom/template.ts @@ -10,6 +10,13 @@ export type IfreedomMetadata = { sourceSite: string; sourceName: string; filters?: Filters; + options?: IfreedomOptions; +}; + +type IfreedomOptions = { + lang?: string; + down?: boolean; + downSince?: string; }; class IfreedomPlugin implements Plugin.PluginBase { diff --git a/plugins/multisrc/lightnovelworld/generator.js b/plugins/multisrc/lightnovelworld/generator.js index 3b0f098b2..c7624ce4f 100644 --- a/plugins/multisrc/lightnovelworld/generator.js +++ b/plugins/multisrc/lightnovelworld/generator.js @@ -15,7 +15,8 @@ export const generateAll = function () { source.filters = JSON.parse(filters); } console.log( - `[lightnovelworld] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + `[lightnovelworld] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.options?.down ? '🔽site is down🔽' : source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -36,5 +37,6 @@ export default plugin; lang: source.options?.lang || 'English', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/lightnovelworld/template.ts b/plugins/multisrc/lightnovelworld/template.ts index 45c743233..d0899f597 100644 --- a/plugins/multisrc/lightnovelworld/template.ts +++ b/plugins/multisrc/lightnovelworld/template.ts @@ -7,6 +7,8 @@ import dayjs from 'dayjs'; type LightNovelWorldOptions = { lang?: string; versionIncrements?: number; + down?: boolean; + downSince?: string; }; export type LightNovelWorldMetadata = { diff --git a/plugins/multisrc/mtlnovel/generator.js b/plugins/multisrc/mtlnovel/generator.js index e911eb7e3..a3ad80f87 100644 --- a/plugins/multisrc/mtlnovel/generator.js +++ b/plugins/multisrc/mtlnovel/generator.js @@ -16,7 +16,12 @@ export const generateAll = function () { } catch (e) {} console.log( `[mtlnovel] Generating: ${source.id}`.padEnd(35), - source.filters ? '🔎with filters🔍' : '🚫 no filters 🚫', + source.options?.down + ? '🔽site is down🔽' + : source.filters + ? '🔎with filters🔍' + : '🚫 no filters 🚫', + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -38,5 +43,6 @@ export default plugin; lang: source.options?.lang || 'English', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/mtlnovel/template.ts b/plugins/multisrc/mtlnovel/template.ts index e0a4437d0..3869d39c7 100644 --- a/plugins/multisrc/mtlnovel/template.ts +++ b/plugins/multisrc/mtlnovel/template.ts @@ -7,6 +7,8 @@ import { Filters } from '@libs/filterInputs'; type MTLNovelOptions = { lang?: string; + down?: boolean; + downSince?: string; }; export type MTLNovelMetadata = { diff --git a/plugins/multisrc/novelcool/generator.js b/plugins/multisrc/novelcool/generator.js index d9d05c9af..ce6fb8050 100644 --- a/plugins/multisrc/novelcool/generator.js +++ b/plugins/multisrc/novelcool/generator.js @@ -36,5 +36,6 @@ export default plugin; lang: source.options.lang, filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/novelcool/template.ts b/plugins/multisrc/novelcool/template.ts index 80df52114..18731e060 100644 --- a/plugins/multisrc/novelcool/template.ts +++ b/plugins/multisrc/novelcool/template.ts @@ -8,6 +8,8 @@ type NovelCoolOptions = { lang: string; langCode: string; app: Record; + down?: boolean; + downSince?: string; }; export type NovelCoolMetadata = { diff --git a/plugins/multisrc/ranobes/generator.js b/plugins/multisrc/ranobes/generator.js index 07229b7e3..79e8d68b2 100644 --- a/plugins/multisrc/ranobes/generator.js +++ b/plugins/multisrc/ranobes/generator.js @@ -7,7 +7,13 @@ const folder = dirname(fileURLToPath(import.meta.url)); export const generateAll = function () { return list.map(metadata => { - console.log(`[ranobes]: Generating`, metadata.id); + console.log( + `[ranobes]: Generating`, + metadata.id, + metadata.options?.downSince + ? `since: ${metadata.options?.downSince}` + : '', + ); return generator(metadata); }); }; @@ -27,5 +33,6 @@ export default plugin; lang: metadata.options.lang, filename: metadata.sourceName, pluginScript, + down: metadata.options?.down || false, }; }; diff --git a/plugins/multisrc/ranobes/template.ts b/plugins/multisrc/ranobes/template.ts index 788ee4932..547f902f2 100644 --- a/plugins/multisrc/ranobes/template.ts +++ b/plugins/multisrc/ranobes/template.ts @@ -6,6 +6,8 @@ import { NovelStatus } from '@libs/novelStatus'; type RanobesOptions = { lang?: string; path: string; + down?: boolean; + downSince?: string; }; export type RanobesMetadata = { diff --git a/plugins/multisrc/readnovelfull/generator.js b/plugins/multisrc/readnovelfull/generator.js index 18d96b4b3..6b5bea763 100644 --- a/plugins/multisrc/readnovelfull/generator.js +++ b/plugins/multisrc/readnovelfull/generator.js @@ -15,7 +15,9 @@ export const generateAll = function () { source.filters = JSON.parse(filters).filters; } console.log( - `[readnovelfull] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + `[readnovelfull] Generating: ${source.id}${' '.repeat(20 - source.id.length)}`, + `${source.options?.down ? '🔽site is down🔽' : source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -35,5 +37,6 @@ export default plugin; lang: source.options?.lang || 'English', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/readnovelfull/template.ts b/plugins/multisrc/readnovelfull/template.ts index f883ad5cb..8c1fd44be 100644 --- a/plugins/multisrc/readnovelfull/template.ts +++ b/plugins/multisrc/readnovelfull/template.ts @@ -23,6 +23,8 @@ type ReadNovelFullOptions = { noAjax?: boolean; noPages?: string[]; pageAsPath?: boolean; + down?: boolean; + downSince?: string; }; export type ReadNovelFullMetadata = { diff --git a/plugins/multisrc/readwn/generator.js b/plugins/multisrc/readwn/generator.js index c4ae9e9b6..989df6747 100644 --- a/plugins/multisrc/readwn/generator.js +++ b/plugins/multisrc/readwn/generator.js @@ -15,7 +15,9 @@ export const generateAll = function () { source.filters = JSON.parse(filters).filters; } console.log( - `[readwn] Generating: ${source.id}${' '.repeat(20 - source.id.length)} ${source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + `[readwn] Generating: ${source.id}${' '.repeat(20 - source.id.length)}`, + `${source.options?.down ? '🔽site is down🔽' : source.filters ? '🔎with filters🔍' : '🚫no filters🚫'}`, + source.options?.downSince ? `since: ${source.options?.downSince}` : '', ); return generator(source); }); @@ -36,5 +38,6 @@ export default plugin; lang: 'english', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/readwn/template.ts b/plugins/multisrc/readwn/template.ts index 4b73f4d46..732f87534 100644 --- a/plugins/multisrc/readwn/template.ts +++ b/plugins/multisrc/readwn/template.ts @@ -7,6 +7,8 @@ import dayjs from 'dayjs'; type ReadwnOptions = { versionIncrements?: number; + down?: boolean; + downSince?: string; }; export type ReadwnMetadata = { diff --git a/plugins/multisrc/rulate/generator.js b/plugins/multisrc/rulate/generator.js index 2cee5a3cf..b84eaa4e8 100644 --- a/plugins/multisrc/rulate/generator.js +++ b/plugins/multisrc/rulate/generator.js @@ -35,7 +35,11 @@ export const generateAll = function () { return { ...p, filters: d ? undefined : filters }; }) .map(source => { - console.log(`[rulate]: Generating`, source.id); + console.log( + `[rulate]: Generating`, + source.id, + source.options?.downSince ? `since: ${source.options?.downSince}` : '', + ); return generator(source); }); }; @@ -58,5 +62,6 @@ export default plugin; lang: 'russian', filename: source.sourceName, pluginScript, + down: source.options?.down || false, }; }; diff --git a/plugins/multisrc/rulate/template.ts b/plugins/multisrc/rulate/template.ts index a5bee83a7..a268210be 100644 --- a/plugins/multisrc/rulate/template.ts +++ b/plugins/multisrc/rulate/template.ts @@ -11,6 +11,13 @@ export type RulateMetadata = { sourceName: string; filters?: Filters; versionIncrements: number; + options?: RulateOptions; +}; + +type RulateOptions = { + lang?: string; + down?: boolean; + downSince?: string; }; class RulatePlugin implements Plugin.PluginBase { diff --git a/scripts/build-plugin-manifest.js b/scripts/build-plugin-manifest.js index d76c15a4c..ece537320 100644 --- a/scripts/build-plugin-manifest.js +++ b/scripts/build-plugin-manifest.js @@ -138,6 +138,7 @@ for (let language in languages) { iconUrl: `${STATIC_LINK}/${icon || 'siteNotAvailable.png'}`, customJS: customJS ? `${STATIC_LINK}/${customJS}` : undefined, customCSS: customCSS ? `${STATIC_LINK}/${customCSS}` : undefined, + down: plugin.endsWith('.broken.js'), }; if (pluginSet.has(id)) {