diff --git a/web/i18n/en/queue.json b/web/i18n/en/queue.json index b18477ba..77473935 100644 --- a/web/i18n/en/queue.json +++ b/web/i18n/en/queue.json @@ -5,7 +5,12 @@ "stub.remux": "remuxing", "state.waiting": "queued", - "state.starting": "starting...", + "state.retrying": "retrying", + + "state.starting": "starting", + "state.starting.fetch": "starting downloading", + "state.starting.remux": "starting muxing", + "state.running.remux": "remuxing", "state.running.fetch": "downloading", "estimated_storage_usage": "estimated storage usage:" diff --git a/web/src/components/queue/ProcessingQueueItem.svelte b/web/src/components/queue/ProcessingQueueItem.svelte index ac385613..cca1a1a5 100644 --- a/web/src/components/queue/ProcessingQueueItem.svelte +++ b/web/src/components/queue/ProcessingQueueItem.svelte @@ -3,14 +3,18 @@ import { formatFileSize } from "$lib/util"; import { downloadFile } from "$lib/download"; import { removeItem } from "$lib/state/queen-bee/queue"; + import { savingHandler } from "$lib/api/saving-handler"; import type { CobaltQueueItem } from "$lib/types/queue"; + import type { CobaltWorkerProgress } from "$lib/types/workers"; import type { CobaltCurrentTaskItem } from "$lib/types/queen-bee"; import ProgressBar from "$components/queue/ProgressBar.svelte"; import IconX from "@tabler/icons-svelte/IconX.svelte"; import IconCheck from "@tabler/icons-svelte/IconCheck.svelte"; + import IconReload from "@tabler/icons-svelte/IconReload.svelte"; + import IconLoader2 from "@tabler/icons-svelte/IconLoader2.svelte"; import IconDownload from "@tabler/icons-svelte/IconDownload.svelte"; import IconExclamationCircle from "@tabler/icons-svelte/IconExclamationCircle.svelte"; @@ -29,8 +33,17 @@ export let runningWorker: CobaltCurrentTaskItem | undefined; export let runningWorkerId: string | undefined; - $: progress = runningWorker?.progress; - $: size = formatFileSize(runningWorker?.progress?.size); + let retrying = false; + + const retry = async (info: CobaltQueueItem) => { + if (info.canRetry && info.originalRequest) { + retrying = true; + await savingHandler({ + request: info.originalRequest, + }); + retrying = false; + } + }; const download = (file: File) => downloadFile({ @@ -38,6 +51,64 @@ type: info.mimeType, }), }); + + $: progress = runningWorker?.progress; + $: size = formatFileSize(runningWorker?.progress?.size); + + type StatusText = { + info: CobaltQueueItem; + runningWorker: CobaltCurrentTaskItem | undefined; + progress: CobaltWorkerProgress | undefined; + size: string; + retrying: boolean; + }; + + const generateStatusText = ({ info, runningWorker, progress, retrying, size }: StatusText) => { + switch (info.state) { + case "running": + if (runningWorker) { + const running = $t(`queue.state.running.${runningWorker.type}`); + if (progress && progress.percentage) { + return `${running}: ${Math.ceil(progress.percentage)}%, ${size}`; + } + else if (runningWorker && progress && size) { + return `${running}: ${size}`; + } + else if (runningWorker?.type) { + const starting = $t(`queue.state.starting.${runningWorker.type}`); + + if (info.pipeline.length > 1) { + const currentPipeline = (info.completedWorkers?.length || 0) + 1; + return `${starting} (${currentPipeline}/${info.pipeline.length})`; + } + return starting; + } + } + return $t("queue.state.starting"); + + case "done": + return formatFileSize(info.resultFile?.file?.size); + + case "error": + return !retrying ? info.errorCode : $t("queue.state.retrying"); + + case "waiting": + return $t("queue.state.waiting"); + } + }; + + /* + params are passed here because svelte will re-run + the function every time either of them is changed, + which is what we want in this case :3 + */ + $: statusText = generateStatusText({ + info, + runningWorker, + progress, + retrying, + size, + });