feat: load video from providers

This commit is contained in:
Adrian Castro
2024-02-05 12:27:46 +01:00
parent 8976b939b6
commit 552b9b52bc
10 changed files with 244 additions and 120 deletions

View File

@@ -29,6 +29,7 @@
},
"prettier": "@movie-web/prettier-config",
"dependencies": {
"@movie-web/providers": "^2.1.1"
"@movie-web/providers": "^2.1.1",
"tmdb-ts": "^1.6.1"
}
}

View File

@@ -1 +1,3 @@
export const name = "provider-utils";
export * from "./video";
export * from "./util";

View File

@@ -0,0 +1,43 @@
import type { MovieDetails, TvShowDetails } from "tmdb-ts";
import type { ScrapeMedia } from "@movie-web/providers";
export function transformSearchResultToScrapeMedia(
type: "tv" | "movie",
result: TvShowDetails | MovieDetails,
season?: number,
episode?: number,
): ScrapeMedia {
if (type === "tv") {
const tvResult = result as TvShowDetails;
return {
type: "show",
tmdbId: tvResult.id.toString(),
title: tvResult.name,
releaseYear: new Date(tvResult.first_air_date).getFullYear(),
season: {
number: season ?? tvResult.seasons[0]?.season_number ?? 1,
tmdbId: season
? tvResult.seasons
.find((s) => s.season_number === season)
?.id.toString() ?? ""
: tvResult.seasons[0]?.id.toString() ?? "",
},
episode: {
number: episode ?? 1,
tmdbId: "",
},
};
}
if (type === "movie") {
const movieResult = result as MovieDetails;
return {
type: "movie",
tmdbId: movieResult.id.toString(),
title: movieResult.title,
releaseYear: new Date(movieResult.release_date).getFullYear(),
};
}
throw new Error("Invalid type parameter");
}

View File

@@ -1,47 +1,57 @@
import type {
FileBasedStream,
Qualities,
RunnerOptions,
ScrapeMedia} from '@movie-web/providers';
FileBasedStream,
Qualities,
RunnerOptions,
ScrapeMedia,
} from "@movie-web/providers";
import {
makeProviders,
makeStandardFetcher,
targets,
} from '@movie-web/providers';
makeProviders,
makeStandardFetcher,
targets,
} from "@movie-web/providers";
export async function getVideoUrl(media: ScrapeMedia): Promise<string|null> {
const providers = makeProviders({
fetcher: makeStandardFetcher(fetch),
target: targets.NATIVE,
consistentIpForRequests: true,
});
export async function getVideoUrl(media: ScrapeMedia): Promise<string | null> {
const providers = makeProviders({
fetcher: makeStandardFetcher(fetch),
target: targets.NATIVE,
consistentIpForRequests: true,
});
const options: RunnerOptions = {
media
};
const options: RunnerOptions = {
media,
};
const results = await providers.runAll(options);
if (!results) return null;
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;
}
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;
}
const qualityOrder: Qualities[] = [
"4k",
"1080",
"720",
"480",
"360",
"unknown",
];
for (const quality of qualityOrder) {
if (stream.qualities[quality]) {
return quality;
}
}
return undefined;
}