fix: local asset playback

This commit is contained in:
Adrian Castro
2024-03-26 16:06:13 +01:00
parent 1e975ddce4
commit 0566b5ba54
4 changed files with 29 additions and 17 deletions

View File

@@ -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) => (

View File

@@ -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>
); );
}; };

View File

@@ -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"

View File

@@ -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 && (