From bec7c07881c8e85c56e308d8eb01b5b5b0d21e7c Mon Sep 17 00:00:00 2001 From: mrjvs Date: Thu, 26 Oct 2023 21:07:11 +0200 Subject: [PATCH] check validity of stream before returning --- src/main/individualRunner.ts | 5 ++++- src/main/runner.ts | 4 ++++ src/utils/valid.ts | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/utils/valid.ts diff --git a/src/main/individualRunner.ts b/src/main/individualRunner.ts index 957edd0..ac563ea 100644 --- a/src/main/individualRunner.ts +++ b/src/main/individualRunner.ts @@ -6,6 +6,7 @@ import { EmbedOutput, SourcererOutput } from '@/providers/base'; import { ProviderList } from '@/providers/get'; import { ScrapeContext } from '@/utils/context'; import { NotFoundError } from '@/utils/errors'; +import { isValidStream } from '@/utils/valid'; export type IndividualSourceRunnerOptions = { features: FeatureMap; @@ -50,7 +51,7 @@ export async function scrapeInvidualSource( }); // stream doesn't satisfy the feature flags, so gets removed in output - if (output?.stream && !flagsAllowedInFeatures(ops.features, output.stream.flags)) { + if (output?.stream && (!isValidStream(output.stream) || !flagsAllowedInFeatures(ops.features, output.stream.flags))) { output.stream = undefined; } @@ -87,7 +88,9 @@ export async function scrapeIndividualEmbed( }, }); + if (!isValidStream(output.stream)) throw new NotFoundError('stream is incomplete'); if (!flagsAllowedInFeatures(ops.features, output.stream.flags)) throw new NotFoundError("stream doesn't satisfy target feature flags"); + return output; } diff --git a/src/main/runner.ts b/src/main/runner.ts index 0ecaee1..866ffb9 100644 --- a/src/main/runner.ts +++ b/src/main/runner.ts @@ -8,6 +8,7 @@ import { Stream } from '@/providers/streams'; import { ScrapeContext } from '@/utils/context'; import { NotFoundError } from '@/utils/errors'; import { reorderOnIdList } from '@/utils/list'; +import { isValidStream } from '@/utils/valid'; export type RunOutput = { sourceId: string; @@ -79,6 +80,9 @@ export async function runAllProviders(list: ProviderList, ops: ProviderRunnerOpt ...contextBase, media: ops.media, }); + if (!isValidStream(output?.stream)) { + throw new NotFoundError('stream is incomplete'); + } if (output?.stream && !flagsAllowedInFeatures(ops.features, output.stream.flags)) { throw new NotFoundError("stream doesn't satisfy target feature flags"); } diff --git a/src/utils/valid.ts b/src/utils/valid.ts new file mode 100644 index 0000000..62347c3 --- /dev/null +++ b/src/utils/valid.ts @@ -0,0 +1,17 @@ +import { Stream } from '@/providers/streams'; + +export function isValidStream(stream: Stream | undefined): boolean { + if (!stream) return false; + if (stream.type === 'hls') { + if (!stream.playlist) return false; + return true; + } + if (stream.type === 'file') { + const validQualities = Object.values(stream.qualities).filter((v) => v.url.length > 0); + if (validQualities.length === 0) return false; + return true; + } + + // unknown file type + return false; +}