mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 18:13:25 +00:00
feat: set headers in video player
This commit is contained in:
@@ -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}
|
||||||
|
@@ -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",
|
||||||
|
Reference in New Issue
Block a user