mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 18:13:25 +00:00
fix: local asset playback
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
import type { Asset } from "expo-media-library";
|
import type { Asset } from "expo-media-library";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { Platform } from "react-native";
|
|
||||||
import { ScrollView } from "react-native-gesture-handler";
|
import { ScrollView } from "react-native-gesture-handler";
|
||||||
import { useRouter } from "expo-router";
|
import { useRouter } from "expo-router";
|
||||||
import { MaterialCommunityIcons } from "@expo/vector-icons";
|
import { MaterialCommunityIcons } from "@expo/vector-icons";
|
||||||
@@ -35,7 +34,7 @@ const DownloadsScreen: React.FC = () => {
|
|||||||
backgroundColor="$sheetItemBackground"
|
backgroundColor="$sheetItemBackground"
|
||||||
icon={
|
icon={
|
||||||
<MaterialCommunityIcons
|
<MaterialCommunityIcons
|
||||||
name={Platform.select({ ios: "apple", android: "android" })}
|
name="download"
|
||||||
size={24}
|
size={24}
|
||||||
color={theme.buttonSecondaryText.val}
|
color={theme.buttonSecondaryText.val}
|
||||||
/>
|
/>
|
||||||
@@ -50,7 +49,7 @@ const DownloadsScreen: React.FC = () => {
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
test local playback (expo-av)
|
test download (mp4)
|
||||||
</MWButton>
|
</MWButton>
|
||||||
<ScrollView>
|
<ScrollView>
|
||||||
{downloads.map((item) => (
|
{downloads.map((item) => (
|
||||||
|
@@ -4,7 +4,13 @@ import { BottomControls } from "./BottomControls";
|
|||||||
import { Header } from "./Header";
|
import { Header } from "./Header";
|
||||||
import { MiddleControls } from "./MiddleControls";
|
import { MiddleControls } from "./MiddleControls";
|
||||||
|
|
||||||
export const ControlsOverlay = ({ isLoading }: { isLoading: boolean }) => {
|
export const ControlsOverlay = ({
|
||||||
|
isLoading,
|
||||||
|
isLocalAsset,
|
||||||
|
}: {
|
||||||
|
isLoading: boolean;
|
||||||
|
isLocalAsset: boolean;
|
||||||
|
}) => {
|
||||||
return (
|
return (
|
||||||
<View
|
<View
|
||||||
width="100%"
|
width="100%"
|
||||||
@@ -14,7 +20,7 @@ export const ControlsOverlay = ({ isLoading }: { isLoading: boolean }) => {
|
|||||||
>
|
>
|
||||||
<Header />
|
<Header />
|
||||||
{!isLoading && <MiddleControls />}
|
{!isLoading && <MiddleControls />}
|
||||||
<BottomControls />
|
{!isLocalAsset && <BottomControls />}
|
||||||
</View>
|
</View>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -13,7 +13,7 @@ export const Header = () => {
|
|||||||
const isIdle = usePlayerStore((state) => state.interface.isIdle);
|
const isIdle = usePlayerStore((state) => state.interface.isIdle);
|
||||||
const meta = usePlayerStore((state) => state.meta);
|
const meta = usePlayerStore((state) => state.meta);
|
||||||
|
|
||||||
if (!isIdle && meta) {
|
if (!isIdle) {
|
||||||
return (
|
return (
|
||||||
<View
|
<View
|
||||||
zIndex={50}
|
zIndex={50}
|
||||||
@@ -28,15 +28,17 @@ export const Header = () => {
|
|||||||
<BackButton />
|
<BackButton />
|
||||||
</Controls>
|
</Controls>
|
||||||
</View>
|
</View>
|
||||||
<Text fontWeight="bold">
|
{meta && (
|
||||||
{meta.title} ({meta.releaseYear}){" "}
|
<Text fontWeight="bold">
|
||||||
{meta.season !== undefined && meta.episode !== undefined
|
{meta.title} ({meta.releaseYear}){" "}
|
||||||
? mapSeasonAndEpisodeNumberToText(
|
{meta.season !== undefined && meta.episode !== undefined
|
||||||
meta.season.number,
|
? mapSeasonAndEpisodeNumberToText(
|
||||||
meta.episode.number,
|
meta.season.number,
|
||||||
)
|
meta.episode.number,
|
||||||
: ""}
|
)
|
||||||
</Text>
|
: ""}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
<View
|
<View
|
||||||
height="$3.5"
|
height="$3.5"
|
||||||
width="$11"
|
width="$11"
|
||||||
|
@@ -11,6 +11,7 @@ import Animated, {
|
|||||||
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
||||||
import { ResizeMode, Video } from "expo-av";
|
import { ResizeMode, Video } from "expo-av";
|
||||||
import * as Haptics from "expo-haptics";
|
import * as Haptics from "expo-haptics";
|
||||||
|
import * as MediaLibrary from "expo-media-library";
|
||||||
import * as NavigationBar from "expo-navigation-bar";
|
import * as NavigationBar from "expo-navigation-bar";
|
||||||
import { useRouter } from "expo-router";
|
import { useRouter } from "expo-router";
|
||||||
import * as StatusBar from "expo-status-bar";
|
import * as StatusBar from "expo-status-bar";
|
||||||
@@ -142,7 +143,11 @@ export const VideoPlayer = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const initializePlayer = async () => {
|
const initializePlayer = async () => {
|
||||||
if (asset) {
|
if (asset) {
|
||||||
setVideoSrc(asset);
|
const assetInfo = await MediaLibrary.getAssetInfoAsync(asset);
|
||||||
|
if (!assetInfo.localUri) return;
|
||||||
|
setVideoSrc({
|
||||||
|
uri: assetInfo.localUri,
|
||||||
|
});
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -283,7 +288,7 @@ export const VideoPlayer = () => {
|
|||||||
position="absolute"
|
position="absolute"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<ControlsOverlay isLoading={isLoading} />
|
<ControlsOverlay isLoading={isLoading} isLocalAsset={!!asset} />
|
||||||
</View>
|
</View>
|
||||||
{showVolumeOverlay && <GestureOverlay value={volume} type="volume" />}
|
{showVolumeOverlay && <GestureOverlay value={volume} type="volume" />}
|
||||||
{showBrightnessOverlay && (
|
{showBrightnessOverlay && (
|
||||||
|
Reference in New Issue
Block a user