mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 18:13:25 +00:00
feat: load video from providers
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
|
@@ -1 +1,3 @@
|
||||
export const name = "provider-utils";
|
||||
export * from "./video";
|
||||
export * from "./util";
|
||||
|
43
packages/provider-utils/src/util.ts
Normal file
43
packages/provider-utils/src/util.ts
Normal 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");
|
||||
}
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user