fix: calculate fallback count properly, only use VidSrc when no other normal source provided results

This commit is contained in:
WebStreamr 2026-01-15 19:43:55 +00:00
parent 96c4b1f16b
commit 5ef6119294
No known key found for this signature in database
5 changed files with 22 additions and 31 deletions

View file

@ -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'];

View file

@ -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[];

View file

@ -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'];

View file

@ -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) {

View file

@ -1,4 +1,4 @@
import { Config, CountryCode } from '../types';
import { CountryCode } from '../types';
const countryCodeMap: Record<CountryCode, { language: string; flag: string; iso639: string | undefined }> = {
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;
};