fix: calculate fallback count properly, only use VidSrc when no other normal source provided results
This commit is contained in:
parent
96c4b1f16b
commit
5ef6119294
5 changed files with 22 additions and 31 deletions
|
|
@ -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'];
|
||||
|
||||
|
|
|
|||
|
|
@ -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[];
|
||||
|
||||
|
|
|
|||
|
|
@ -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'];
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue