From 79020c357fbda10ca83811fcd617c2c3c96ea35f Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Fri, 27 Sep 2024 18:44:41 +0200 Subject: [PATCH] wip --- app/(auth)/(tabs)/(home)/downloads.tsx | 2 +- hooks/useDownloadM3U8Files.ts | 40 +++++++++++++++----------- hooks/useDownloadedFileOpener.ts | 2 +- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/app/(auth)/(tabs)/(home)/downloads.tsx b/app/(auth)/(tabs)/(home)/downloads.tsx index 718a22b6..30b67bbf 100644 --- a/app/(auth)/(tabs)/(home)/downloads.tsx +++ b/app/(auth)/(tabs)/(home)/downloads.tsx @@ -160,7 +160,7 @@ const downloads: React.FC = () => { - {(process.progress * 100).toFixed(0)}% + {process.progress.toFixed(0)}% diff --git a/hooks/useDownloadM3U8Files.ts b/hooks/useDownloadM3U8Files.ts index 708942f1..f96995a0 100644 --- a/hooks/useDownloadM3U8Files.ts +++ b/hooks/useDownloadM3U8Files.ts @@ -8,7 +8,7 @@ import { useQueryClient } from "@tanstack/react-query"; import * as FileSystem from "expo-file-system"; import { FFmpegKit, ReturnCode } from "ffmpeg-kit-react-native"; import { useAtom } from "jotai"; -import { useCallback } from "react"; +import { useCallback, useEffect, useState } from "react"; import { toast } from "sonner-native"; export const useDownloadM3U8Files = (item: BaseItemDto) => { @@ -16,6 +16,9 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => { const queryClient = useQueryClient(); const [api] = useAtom(apiAtom); + const [totalSegments, setTotalSegments] = useState(0); + const [downloadedSegments, setDownloadedSegments] = useState([]); + if (!item.Id || !item.Name) { throw new Error("Item must have an Id and Name"); } @@ -56,6 +59,8 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => { item.Id! ); + setTotalSegments(segments.length); + for (let i = 0; i < segments.length; i++) { const segment = segments[i]; const segmentUrl = `${api.basePath}/videos/${item.Id}/${segment.path}`; @@ -65,18 +70,8 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => { id: `${item.Id}_segment_${i}`, url: segmentUrl, destination: destination, - }).done((e) => { - console.log("Download completed for segment", i); - setProgress((prev) => { - const newProgress = ((prev?.progress || 0) + 1) / segments.length; - if (prev === null) { - return null; - } - return { - ...prev, - progress: newProgress, - }; - }); + }).done(() => { + setDownloadedSegments((prev) => [...prev, i]); }); } @@ -93,9 +88,24 @@ export const useDownloadM3U8Files = (item: BaseItemDto) => { 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 }; }; @@ -210,5 +220,3 @@ export async function getAllDownloadedItems(): Promise { return []; } } - - diff --git a/hooks/useDownloadedFileOpener.ts b/hooks/useDownloadedFileOpener.ts index 6c0ece93..a2e38943 100644 --- a/hooks/useDownloadedFileOpener.ts +++ b/hooks/useDownloadedFileOpener.ts @@ -13,7 +13,7 @@ export const useFileOpener = () => { const openFile = useCallback( 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`; console.log("Checking for output file:", outputFile);