This commit is contained in:
Fredrik Burmester
2024-09-27 18:44:41 +02:00
parent a386c3a47c
commit 79020c357f
3 changed files with 26 additions and 18 deletions

View File

@@ -160,7 +160,7 @@ const downloads: React.FC = () => {
</Text> </Text>
<View className="flex flex-row items-center space-x-2 mt-1 text-purple-600"> <View className="flex flex-row items-center space-x-2 mt-1 text-purple-600">
<Text className="text-xs"> <Text className="text-xs">
{(process.progress * 100).toFixed(0)}% {process.progress.toFixed(0)}%
</Text> </Text>
</View> </View>
</View> </View>

View File

@@ -8,7 +8,7 @@ import { useQueryClient } from "@tanstack/react-query";
import * as FileSystem from "expo-file-system"; import * as FileSystem from "expo-file-system";
import { FFmpegKit, ReturnCode } from "ffmpeg-kit-react-native"; import { FFmpegKit, ReturnCode } from "ffmpeg-kit-react-native";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { useCallback } from "react"; import { useCallback, useEffect, useState } from "react";
import { toast } from "sonner-native"; import { toast } from "sonner-native";
export const useDownloadM3U8Files = (item: BaseItemDto) => { export const useDownloadM3U8Files = (item: BaseItemDto) => {
@@ -16,6 +16,9 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const [api] = useAtom(apiAtom); const [api] = useAtom(apiAtom);
const [totalSegments, setTotalSegments] = useState<number>(0);
const [downloadedSegments, setDownloadedSegments] = useState<number[]>([]);
if (!item.Id || !item.Name) { if (!item.Id || !item.Name) {
throw new Error("Item must have an Id and Name"); throw new Error("Item must have an Id and Name");
} }
@@ -56,6 +59,8 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => {
item.Id! item.Id!
); );
setTotalSegments(segments.length);
for (let i = 0; i < segments.length; i++) { for (let i = 0; i < segments.length; i++) {
const segment = segments[i]; const segment = segments[i];
const segmentUrl = `${api.basePath}/videos/${item.Id}/${segment.path}`; const segmentUrl = `${api.basePath}/videos/${item.Id}/${segment.path}`;
@@ -65,18 +70,8 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => {
id: `${item.Id}_segment_${i}`, id: `${item.Id}_segment_${i}`,
url: segmentUrl, url: segmentUrl,
destination: destination, destination: destination,
}).done((e) => { }).done(() => {
console.log("Download completed for segment", i); setDownloadedSegments((prev) => [...prev, i]);
setProgress((prev) => {
const newProgress = ((prev?.progress || 0) + 1) / segments.length;
if (prev === null) {
return null;
}
return {
...prev,
progress: newProgress,
};
});
}); });
} }
@@ -93,9 +88,24 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => {
throw error; throw error;
} }
}, },
[item, setProgress, queryClient, api] [item, queryClient, api]
); );
useEffect(() => {
if (totalSegments === 0) return;
console.log("[0]", downloadedSegments.length, totalSegments);
const progress = (downloadedSegments.length / totalSegments) * 100;
setProgress((prev) => ({
...prev!,
progress,
}));
if (progress > 99) {
setProgress(null);
}
}, [downloadedSegments, totalSegments]);
return { startBackgroundDownload }; return { startBackgroundDownload };
}; };
@@ -210,5 +220,3 @@ export async function getAllDownloadedItems(): Promise<BaseItemDto[]> {
return []; return [];
} }
} }

View File

@@ -13,7 +13,7 @@ export const useFileOpener = () => {
const openFile = useCallback( const openFile = useCallback(
async (item: BaseItemDto) => { async (item: BaseItemDto) => {
const m3u8File = `${FileSystem.documentDirectory}${item.Id}/playlist.m3u8`; const m3u8File = `${FileSystem.documentDirectory}${item.Id}/local.m3u8`;
const outputFile = `${FileSystem.documentDirectory}${item.Id}/output.mp4`; const outputFile = `${FileSystem.documentDirectory}${item.Id}/output.mp4`;
console.log("Checking for output file:", outputFile); console.log("Checking for output file:", outputFile);