feat: set headers in video player

This commit is contained in:
Adrian Castro
2024-02-05 19:49:00 +01:00
parent e39ee1373b
commit 8db85c545b
2 changed files with 33 additions and 22 deletions

View File

@@ -7,6 +7,7 @@ import { useLocalSearchParams, useRouter } from "expo-router";
import * as ScreenOrientation from "expo-screen-orientation"; import * as ScreenOrientation from "expo-screen-orientation";
import { import {
findHighestQuality,
getVideoUrl, getVideoUrl,
transformSearchResultToScrapeMedia, transformSearchResultToScrapeMedia,
} from "@movie-web/provider-utils"; } from "@movie-web/provider-utils";
@@ -28,6 +29,7 @@ interface VideoPlayerProps {
const VideoPlayer: React.FC<VideoPlayerProps> = ({ data }) => { const VideoPlayer: React.FC<VideoPlayerProps> = ({ data }) => {
const [videoUrl, setVideoUrl] = useState(""); const [videoUrl, setVideoUrl] = useState("");
const [headers, setHeaders] = useState({} as Record<string, string>);
const [isLoading, setIsLoading] = useState(true); const [isLoading, setIsLoading] = useState(true);
const videoPlayer = useRef<VideoRef>(null); const videoPlayer = useRef<VideoRef>(null);
const router = useRouter(); const router = useRouter();
@@ -56,19 +58,38 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({ data }) => {
episode, episode,
); );
const videoUrl = await getVideoUrl(scrapeMedia); const stream = await getVideoUrl(scrapeMedia);
if (!videoUrl) { if (!stream) {
await ScreenOrientation.lockAsync( await ScreenOrientation.lockAsync(
ScreenOrientation.OrientationLock.PORTRAIT_UP, ScreenOrientation.OrientationLock.PORTRAIT_UP,
); );
return router.push("/(tabs)"); return router.push("/(tabs)");
} }
return videoUrl; return stream;
}; };
setIsLoading(true); setIsLoading(true);
const url = await fetchVideo(); const stream = await fetchVideo();
if (url) {
if (stream) {
let highestQuality;
let url;
switch (stream.type) {
case "file":
highestQuality = findHighestQuality(stream);
url = highestQuality ? stream.qualities[highestQuality]?.url : null;
return url ?? null;
case "hls":
url = stream.playlist;
}
const combinedHeaders = {
...stream.headers,
...stream.preferredHeaders,
};
setHeaders(combinedHeaders);
setVideoUrl(url); setVideoUrl(url);
setIsLoading(false); setIsLoading(false);
} else { } else {
@@ -123,7 +144,7 @@ const VideoPlayer: React.FC<VideoPlayerProps> = ({ data }) => {
<SafeAreaView style={styles.container}> <SafeAreaView style={styles.container}>
<Video <Video
ref={videoPlayer} ref={videoPlayer}
source={{ uri: videoUrl }} source={{ uri: videoUrl, headers }}
style={styles.fullScreen} style={styles.fullScreen}
fullscreen={true} fullscreen={true}
paused={false} paused={false}

View File

@@ -3,6 +3,7 @@ import type {
Qualities, Qualities,
RunnerOptions, RunnerOptions,
ScrapeMedia, ScrapeMedia,
Stream,
} from "@movie-web/providers"; } from "@movie-web/providers";
import { import {
makeProviders, makeProviders,
@@ -10,7 +11,7 @@ import {
targets, targets,
} from "@movie-web/providers"; } from "@movie-web/providers";
export async function getVideoUrl(media: ScrapeMedia): Promise<string | null> { export async function getVideoUrl(media: ScrapeMedia): Promise<Stream | null> {
const providers = makeProviders({ const providers = makeProviders({
fetcher: makeStandardFetcher(fetch), fetcher: makeStandardFetcher(fetch),
target: targets.NATIVE, target: targets.NATIVE,
@@ -23,23 +24,12 @@ export async function getVideoUrl(media: ScrapeMedia): Promise<string | null> {
const results = await providers.runAll(options); const results = await providers.runAll(options);
if (!results) return null; if (!results) return null;
return results.stream;
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 { export function findHighestQuality(
stream: FileBasedStream,
): Qualities | undefined {
const qualityOrder: Qualities[] = [ const qualityOrder: Qualities[] = [
"4k", "4k",
"1080", "1080",