From 8b1d2f0093748cc7f31e0f360f72d28598e89d45 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 2 Jun 2025 19:55:02 +0200 Subject: store fail reason --- scripts/ytdlp_download.ts | 41 +++++++++++++++++++++++++++++------------ src/webui.rs | 7 ++++--- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/scripts/ytdlp_download.ts b/scripts/ytdlp_download.ts index 184f2f5..bc9afd7 100644 --- a/scripts/ytdlp_download.ts +++ b/scripts/ytdlp_download.ts @@ -55,23 +55,40 @@ async function do_download(key: string, data: { [key: string]: string }) { url ], stdout: "piped", - stderr: "inherit", + stderr: "piped", cwd: output }).spawn() - const lines = child.stdout.pipeThrough(new TextDecoderStream()).pipeThrough(new TextLineStream()) - for await (const line of lines) { - if (!line.length) continue - const k = JSON.parse(line) - ws.send(JSON.stringify({ - t: "metadata", key, data: { - progress: (k._percent ?? 0) / 100, - status: k._default_template?.trim() ?? "" + let fail_reason = "unknown" + + Promise.all([ + (async () => { + const lines = child.stderr.pipeThrough(new TextDecoderStream()).pipeThrough(new TextLineStream()) + for await (const line of lines) { + if (!line.length) continue + if (line.includes("members-only content")) fail_reason = "members_only" + if (line.includes("Sign in to confirm") && line.includes(" not a bot")) fail_reason = "bot" + if (line.includes("Sign in to confirm your age")) fail_reason = "age_restricted" + console.error("ytdlp: " + line); } - })) - } + })(), + (async () => { + const lines = child.stdout.pipeThrough(new TextDecoderStream()).pipeThrough(new TextLineStream()) + for await (const line of lines) { + if (!line.length) continue + const k = JSON.parse(line) + ws.send(JSON.stringify({ + t: "metadata", key, data: { + progress: (k._percent ?? 0) / 100, + status: k._default_template?.trim() ?? "" + } + })) + } + })() + ]) + const status = await child.status - if (!status.success) ws.send(JSON.stringify({ t: "metadata", key, data: { failed: true } })) + if (!status.success) ws.send(JSON.stringify({ t: "metadata", key, data: { failed: fail_reason } })) ws.send(JSON.stringify({ t: "metadata", key, data: { progress: null, status: null } })) ws.send(JSON.stringify({ t: "complete", key })) ws.send(JSON.stringify({ t: "save" })) diff --git a/src/webui.rs b/src/webui.rs index e292676..a17f53e 100644 --- a/src/webui.rs +++ b/src/webui.rs @@ -77,6 +77,9 @@ markup::define!( span.subtitle { @s } br; } span.key { @key } + @if let Some(s) = data.get("failed").and_then(Value::as_str) { + br; span.fail_reason { "Fail reason: " @s } + } @if let Some(s) = data.get("status").and_then(Value::as_str) { pre.status { @s } } @@ -114,9 +117,7 @@ fn task_class(state: TaskState, data: &Map) -> &'static str { match state { TaskState::Queue => "task queue", TaskState::Loading => "task loading", - TaskState::Complete if data.get("failed").and_then(Value::as_bool).unwrap_or(false) => { - "task complete-failed" - } + TaskState::Complete if data.contains_key("failed") => "task complete-failed", TaskState::Complete => "task complete", } } -- cgit v1.2.3-70-g09d2