mirror of
https://github.com/streamyfin/streamyfin.git
synced 2026-06-01 03:28:27 +01:00
wip
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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 [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user