From 5ef61192948b42240ea21ddde7940e881f921aaf Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Thu, 15 Jan 2026 19:43:55 +0000 Subject: [PATCH] fix: calculate fallback count properly, only use VidSrc when no other normal source provided results --- src/source/RgShows.ts | 2 +- src/source/Source.ts | 2 +- src/source/VidSrc.ts | 2 +- src/utils/StreamResolver.ts | 33 ++++++++++++++++++--------------- src/utils/language.ts | 14 +------------- 5 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/source/RgShows.ts b/src/source/RgShows.ts index 2147480..51a70aa 100644 --- a/src/source/RgShows.ts +++ b/src/source/RgShows.ts @@ -8,7 +8,7 @@ export class RgShows extends Source { public readonly label = 'RgShows'; - public override readonly isFallback = true; + public override readonly useOnlyWithMaxUrlsFound = 1; public readonly contentTypes: ContentType[] = ['movie', 'series']; diff --git a/src/source/Source.ts b/src/source/Source.ts index bca53b1..207cafa 100644 --- a/src/source/Source.ts +++ b/src/source/Source.ts @@ -27,7 +27,7 @@ export abstract class Source { public readonly ttl: number = 43200000; // 12h - public readonly isFallback: boolean = false; // fallback sources are only considered if we don't have enough URLs from others already + public readonly useOnlyWithMaxUrlsFound: number | undefined = undefined; // fallback sources are only considered if we don't have enough URLs from others already public abstract readonly contentTypes: ContentType[]; diff --git a/src/source/VidSrc.ts b/src/source/VidSrc.ts index 0ca4688..939a569 100644 --- a/src/source/VidSrc.ts +++ b/src/source/VidSrc.ts @@ -8,7 +8,7 @@ export class VidSrc extends Source { public readonly label = 'VidSrc'; - public override readonly isFallback = true; + public override readonly useOnlyWithMaxUrlsFound = 0; public readonly contentTypes: ContentType[] = ['movie', 'series']; diff --git a/src/utils/StreamResolver.ts b/src/utils/StreamResolver.ts index 5ccf121..d3d0b40 100644 --- a/src/utils/StreamResolver.ts +++ b/src/utils/StreamResolver.ts @@ -9,7 +9,7 @@ import { Context, CountryCode, Format, UrlResult } from '../types'; import { showErrors, showExternalUrls } from './config'; import { envGetAppName } from './env'; import { Id } from './id'; -import { countryCodesFromConfig, flagFromCountryCode } from './language'; +import { flagFromCountryCode } from './language'; interface ResolveResponse { streams: Stream[]; @@ -50,16 +50,17 @@ export class StreamResolver { const skippedFallbackSources: Source[] = []; - const handleSource = async (source: Source) => { + const handleSource = async (source: Source, countUrlResultsByCountryCode: boolean) => { try { const sourceResults = await source.handle(ctx, type, id); const sourceUrlResults = await Promise.all( sourceResults.map(({ url, meta }) => this.extractorRegistry.handle(ctx, url, { ...meta, sourceLabel: source.label, sourceId: source.id }, true)), ); - const urlResultsToAdd = sourceUrlResults.flat(); - for (const urlResult of urlResultsToAdd) { - if (urlResult.error) { + for (const urlResult of sourceUrlResults.flat()) { + urlResults.push(urlResult); + + if (urlResult.error || !countUrlResultsByCountryCode) { continue; } @@ -69,7 +70,6 @@ export class StreamResolver { }); }); } - urlResults.push(...urlResultsToAdd); } catch (error) { await sourceErrorCountMutex.runExclusive(() => { sourceErrorCount++; @@ -91,25 +91,28 @@ export class StreamResolver { return; } - if (source.isFallback) { + if (source.useOnlyWithMaxUrlsFound !== undefined) { skippedFallbackSources.push(source); return; } - await handleSource(source); + await handleSource(source, true); }); await Promise.all(sourcePromises); // Resolve fallback sources if we didn't get enough results already - for (const skippedFallbackSource of skippedFallbackSources) { - const configCountryCodes = countryCodesFromConfig(ctx.config); - const resultCount = urlResults.reduce((accumulator, urlResult) => accumulator + Number(this.arraysIntersect(urlResult.meta?.countryCodes as CountryCode[], configCountryCodes)), 0); - if (resultCount > 2) { - continue; + const skippedFallbackSourcePromises = skippedFallbackSources.map(async (skippedFallbackSource) => { + console.log(skippedFallbackSource.countryCodes); + console.log(urlResults[0]?.meta?.countryCodes); + const resultCount = urlResults.reduce((accumulator, urlResult) => accumulator + Number(this.arraysIntersect(skippedFallbackSource.countryCodes, urlResult.meta?.countryCodes as CountryCode[])), 0); + console.log(skippedFallbackSource.id, resultCount); + if (resultCount > (skippedFallbackSource.useOnlyWithMaxUrlsFound as number)) { + return; } - await handleSource(skippedFallbackSource); - } + await handleSource(skippedFallbackSource, false); + }); + await Promise.all(skippedFallbackSourcePromises); urlResults.sort((a, b) => { if (a.error || b.error) { diff --git a/src/utils/language.ts b/src/utils/language.ts index 9e0173b..a490819 100644 --- a/src/utils/language.ts +++ b/src/utils/language.ts @@ -1,4 +1,4 @@ -import { Config, CountryCode } from '../types'; +import { CountryCode } from '../types'; const countryCodeMap: Record = { multi: { language: 'Multi', flag: '🌐', iso639: undefined }, @@ -71,15 +71,3 @@ export const findCountryCodes = (value: string): CountryCode[] => { return countryCodes; }; - -export const countryCodesFromConfig = (config: Config): CountryCode[] => { - const countryCodes: CountryCode[] = []; - - for (const countryCode in countryCodeMap) { - if (countryCode in config) { - countryCodes.push(countryCode as CountryCode); - } - } - - return countryCodes; -};