diff --git a/app/(auth)/(tabs)/(home)/downloads.tsx b/app/(auth)/(tabs)/(home)/downloads.tsx index c9596647..d6cccb8e 100644 --- a/app/(auth)/(tabs)/(home)/downloads.tsx +++ b/app/(auth)/(tabs)/(home)/downloads.tsx @@ -53,9 +53,12 @@ const downloads: React.FC = () => { {settings?.downloadMethod === "remux" && ( - - Queue - + + Queue + + Queue and downloads will be lost on app restart + + {queue.map((q) => ( diff --git a/components/DownloadItem.tsx b/components/DownloadItem.tsx index 589b757f..31936686 100644 --- a/components/DownloadItem.tsx +++ b/components/DownloadItem.tsx @@ -164,6 +164,7 @@ export const DownloadItem: React.FC = ({ item, ...props }) => { selectedAudioStream, selectedSubtitleStream, maxBitrate, + settings?.downloadMethod, ]); /** @@ -291,14 +292,17 @@ export const DownloadItem: React.FC = ({ item, ...props }) => { throw new Error("No item id"); } closeModal(); - initiateDownload(); - // Remove for now - // queueActions.enqueue(queue, setQueue, { - // id: item.Id, - // execute: async () => { - // }, - // item, - // }); + if (settings?.downloadMethod === "remux") { + queueActions.enqueue(queue, setQueue, { + id: item.Id, + execute: async () => { + await initiateDownload(); + }, + item, + }); + } else { + initiateDownload(); + } } else { toast.error("You are not allowed to download files."); } diff --git a/components/downloads/ActiveDownloads.tsx b/components/downloads/ActiveDownloads.tsx index 9154b8c4..89380775 100644 --- a/components/downloads/ActiveDownloads.tsx +++ b/components/downloads/ActiveDownloads.tsx @@ -48,7 +48,7 @@ export const ActiveDownloads: React.FC = ({ ...props }) => { }, onError: (e) => { console.log(e); - toast.error("Failed to cancel download"); + toast.error("Failed to cancel download on the server"); }, }); diff --git a/providers/DownloadProvider.tsx b/providers/DownloadProvider.tsx index 4461de4d..582061d2 100644 --- a/providers/DownloadProvider.tsx +++ b/providers/DownloadProvider.tsx @@ -161,39 +161,66 @@ function useDownloadProvider() { const updatedProcesses = await Promise.all( processes.map(async (process) => { - if (!settings.optimizedVersionsServerUrl) return; + if (!settings.optimizedVersionsServerUrl) return process; if (process.state === "queued" || process.state === "optimizing") { - const job = await checkJobStatus( - process.id, - settings.optimizedVersionsServerUrl, - authHeader - ); + try { + const job = await checkJobStatus( + process.id, + settings.optimizedVersionsServerUrl, + authHeader + ); - if (!job) { - return null; + if (!job) { + return process; + } + + let newState: ProcessItem["state"] = process.state; + if (job.status === "queued") { + newState = "queued"; + } else if (job.status === "running") { + newState = "optimizing"; + } else if (job.status === "completed") { + startDownload(process); + return null; + } else if (job.status === "failed") { + newState = "error"; + } else if (job.status === "cancelled") { + newState = "canceled"; + } + + return { ...process, state: newState, progress: job.progress }; + } catch (error) { + if (axios.isAxiosError(error) && !error.response) { + // Network error occurred (server might be down) + console.error("Network error occurred:", error.message); + toast.error( + "Network error: Unable to connect to optimization server" + ); + return { + ...process, + state: "error", + errorMessage: + "Network error: Unable to connect to optimization server", + }; + } else { + // Other types of errors + console.error("Error checking job status:", error); + toast.error( + "An unexpected error occurred while checking job status" + ); + return { + ...process, + state: "error", + errorMessage: "An unexpected error occurred", + }; + } } - - let newState: ProcessItem["state"] = process.state; - if (job.status === "queued") { - newState = "queued"; - } else if (job.status === "running") { - newState = "optimizing"; - } else if (job.status === "completed") { - startDownload(process); - return null; - } else if (job.status === "failed") { - newState = "error"; - } else if (job.status === "cancelled") { - newState = "canceled"; - } - - return { ...process, state: newState, progress: job.progress }; } return process; }) ); - // Filter out null values (completed or cancelled jobs) + // Filter out null values (completed jobs) const filteredProcesses = updatedProcesses.filter( (process) => process !== null ) as ProcessItem[]; @@ -205,7 +232,12 @@ function useDownloadProvider() { const intervalId = setInterval(checkJobStatusPeriodically, 2000); return () => clearInterval(intervalId); - }, [processes, settings?.optimizedVersionsServerUrl]); + }, [ + processes, + settings?.optimizedVersionsServerUrl, + authHeader, + startDownload, + ]); const startBackgroundDownload = useCallback( async (url: string, item: BaseItemDto) => {