From 8976b939b674e71960bc484ca59ed73aea17d4f0 Mon Sep 17 00:00:00 2001 From: Adrian Castro <22133246+castdrian@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:04:38 +0100 Subject: [PATCH] feat: add getVideoUrl function --- packages/provider-utils/src/video.ts | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 packages/provider-utils/src/video.ts diff --git a/packages/provider-utils/src/video.ts b/packages/provider-utils/src/video.ts new file mode 100644 index 0000000..162a7a9 --- /dev/null +++ b/packages/provider-utils/src/video.ts @@ -0,0 +1,47 @@ +import type { + FileBasedStream, + Qualities, + RunnerOptions, + ScrapeMedia} from '@movie-web/providers'; +import { + makeProviders, + makeStandardFetcher, + targets, + } from '@movie-web/providers'; + +export async function getVideoUrl(media: ScrapeMedia): Promise { + const providers = makeProviders({ + fetcher: makeStandardFetcher(fetch), + target: targets.NATIVE, + consistentIpForRequests: true, + }); + + const options: RunnerOptions = { + media + }; + + const results = await providers.runAll(options); + if (!results) return null; + + let highestQuality; + let url; + + switch (results.stream.type) { + case 'file': + highestQuality = findHighestQuality(results.stream); + url = highestQuality ? results.stream.qualities[highestQuality]?.url : null; + return url ?? null; + case 'hls': + return results.stream.playlist; + } +} + +function findHighestQuality(stream: FileBasedStream): Qualities | undefined { + const qualityOrder: Qualities[] = ['4k', '1080', '720', '480', '360', 'unknown']; + for (const quality of qualityOrder) { + if (stream.qualities[quality]) { + return quality; + } + } + return undefined; +} \ No newline at end of file