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 17cd119b0..e19bc9227 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 ? '.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/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/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; 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)) {