From ef20218cd591436624323440fe5b2ae2d207f1aa Mon Sep 17 00:00:00 2001 From: Viren070 Date: Mon, 6 Oct 2025 14:51:56 +0100 Subject: [PATCH] fix(prowlarr): add debug logs and fetch after db init --- packages/core/src/builtins/prowlarr/addon.ts | 63 +++++++++++++++++--- packages/core/src/presets/prowlarr.ts | 42 ++----------- packages/server/src/server.ts | 10 ++++ 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/packages/core/src/builtins/prowlarr/addon.ts b/packages/core/src/builtins/prowlarr/addon.ts index 82dddfd7..7d30c87d 100644 --- a/packages/core/src/builtins/prowlarr/addon.ts +++ b/packages/core/src/builtins/prowlarr/addon.ts @@ -39,6 +39,8 @@ export class ProwlarrAddon extends BaseDebridAddon { readonly logger = logger; readonly api: ProwlarrApi; + public static predefinedIndexers: ProwlarrApiIndexer[] | undefined; + private readonly indexers: string[] = []; private readonly tags: string[] = []; constructor(config: ProwlarrAddonConfig, clientIp?: string) { @@ -52,17 +54,62 @@ export class ProwlarrAddon extends BaseDebridAddon { }); } - static async getIndexers( - url: string, - apiKey: string - ): Promise { + public static async fetchPredefinedIndexers(): Promise { + if (this.predefinedIndexers) return; + if (!Env.BUILTIN_PROWLARR_URL || !Env.BUILTIN_PROWLARR_API_KEY) return; const api = new ProwlarrApi({ - baseUrl: url, - apiKey: apiKey, - timeout: Env.BUILTIN_PROWLARR_SEARCH_TIMEOUT, + baseUrl: Env.BUILTIN_PROWLARR_URL, + apiKey: Env.BUILTIN_PROWLARR_API_KEY, + timeout: 5000, }); const { data } = await api.indexers(); - return data; + logger.debug(`Fetched ${data.length} predefined indexers`); + let filterReasons: Map = new Map(); + + this.predefinedIndexers = data.filter((indexer) => { + if (!indexer.enable) { + filterReasons.set( + 'not enabled', + (filterReasons.get('not enabled') ?? 0) + 1 + ); + return false; + } + if (indexer.protocol !== 'torrent') { + filterReasons.set( + 'not torrent protocol', + (filterReasons.get('not torrent protocol') ?? 0) + 1 + ); + return false; + } + if (Env.BUILTIN_PROWLARR_INDEXERS?.length) { + if ( + ![ + indexer.name.toLowerCase(), + indexer.sortName.toLowerCase(), + indexer.definitionName.toLowerCase(), + ].some((x) => + Env.BUILTIN_PROWLARR_INDEXERS?.map((x) => x.toLowerCase()).includes( + x + ) + ) + ) { + filterReasons.set( + 'not in predefined indexers', + (filterReasons.get('not in predefined indexers') ?? 0) + 1 + ); + return false; + } + } + return true; + }); + logger.debug(`Set ${this.predefinedIndexers?.length} predefined indexers`); + if (filterReasons.size > 0) { + logger.debug( + `Filter reasons: ${Array.from(filterReasons.entries()) + .map(([key, value]) => `${key}: ${value}`) + .join(', ')}` + ); + } } protected async _searchTorrents( diff --git a/packages/core/src/presets/prowlarr.ts b/packages/core/src/presets/prowlarr.ts index 24579ba7..6698131d 100644 --- a/packages/core/src/presets/prowlarr.ts +++ b/packages/core/src/presets/prowlarr.ts @@ -10,40 +10,6 @@ import { import { StremThruPreset } from './stremthru.js'; import { BuiltinAddonPreset } from './builtin.js'; import { ProwlarrAddon } from '../builtins/index.js'; -import { ProwlarrApiIndexer } from '../builtins/prowlarr/api.js'; - -let indexers: ProwlarrApiIndexer[] | undefined; -const logger = createLogger('prowlarr'); - -if (Env.BUILTIN_PROWLARR_URL && Env.BUILTIN_PROWLARR_API_KEY) { - (async () => { - while (typeof DB !== 'undefined' && !DB.getInstance().isInitialised()) { - await new Promise((resolve) => setTimeout(resolve, 100)); - } - try { - indexers = await ProwlarrAddon.getIndexers( - Env.BUILTIN_PROWLARR_URL!, - Env.BUILTIN_PROWLARR_API_KEY! - ); - indexers = indexers.filter( - (indexer) => - indexer.enable && - indexer.protocol === 'torrent' && - (Env.BUILTIN_PROWLARR_INDEXERS?.length - ? [indexer.name, indexer.sortName, indexer.definitionName] - .map((x) => x.toLowerCase()) - .some((x) => - Env.BUILTIN_PROWLARR_INDEXERS!.map((x) => - x.toLowerCase() - ).includes(x) - ) - : true) - ); - } catch (e) { - logger.error(`Failed to get indexers from Prowlarr: ${e}`); - } - })(); -} export class ProwlarrPreset extends BuiltinAddonPreset { static override get METADATA() { @@ -95,7 +61,7 @@ export class ProwlarrPreset extends BuiltinAddonPreset { type: 'password', required: !Env.BUILTIN_PROWLARR_URL || !Env.BUILTIN_PROWLARR_API_KEY, }, - ...(indexers + ...(ProwlarrAddon.predefinedIndexers ? [ { id: 'indexers', @@ -103,11 +69,13 @@ export class ProwlarrPreset extends BuiltinAddonPreset { description: 'If using the preconfigured instance, select the indexers to use here.', type: 'multi-select', - options: indexers.map((indexer) => ({ + options: ProwlarrAddon.predefinedIndexers.map((indexer) => ({ label: indexer.name, value: indexer.name, })), - default: indexers.map((indexer) => indexer.name), + default: ProwlarrAddon.predefinedIndexers.map( + (indexer) => indexer.name + ), } as const, ] : [ diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index 89c1d06f..2f801de9 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -11,6 +11,7 @@ import { FeatureControl, PTT, AnimeDatabase, + ProwlarrAddon, } from '@aiostreams/core'; const logger = createLogger('server'); @@ -57,6 +58,14 @@ async function initialiseAnimeDatabase() { } } +async function initialiseProwlarr() { + try { + await ProwlarrAddon.fetchPredefinedIndexers(); + } catch (error) { + logger.error('Failed to initialise Prowlarr:', error); + } +} + async function start() { try { logStartupInfo(); @@ -65,6 +74,7 @@ async function start() { await initialisePTT(); initialiseAnimeDatabase(); FeatureControl.initialise(); + await initialiseProwlarr(); if (Env.PRUNE_MAX_DAYS >= 0) { startAutoPrune(); }