From 0669d3871297abae36f0456e0d0042bf861afce8 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 18 May 2025 12:45:12 +0200 Subject: complete tasks from files --- scripts/complete_from_files.ts | 36 ++++++++++++++++++++++++++++++++++++ scripts/enqueue.ts | 4 +++- src/style.css | 3 +++ src/worker_ws.rs | 35 +++++++++++++++++++++++++++++------ 4 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 scripts/complete_from_files.ts diff --git a/scripts/complete_from_files.ts b/scripts/complete_from_files.ts new file mode 100644 index 0000000..6aec7a2 --- /dev/null +++ b/scripts/complete_from_files.ts @@ -0,0 +1,36 @@ + +const ws = new WebSocket(Deno.args[0]) +const root = Deno.args[1] + +async function traverse(path: string) { + console.log(`> ${path}`); + for await (const e of Deno.readDir(path)) { + if (e.isDirectory) await traverse(path + "/" + e.name) + else if (e.isFile) mark_complete(e.name) + } +} + +let counter = 0; +function mark_complete(name: string) { + // TODO other platforms + const r = /([A-Za-z0-9-_]{11})\.mkv/g.exec(name) + if (!r) return + const id = r[1] + counter += 1 + ws.send(JSON.stringify({ t: "complete", key: `youtube:${id}`, force: true })) +} + +ws.onerror = () => console.error("ws error") +ws.onclose = () => console.error("ws closed") +ws.onopen = async () => { + console.log("ws open"); + ws.send(JSON.stringify({ t: "register", name: "complete from files", task_kinds: [] })) + await traverse(root) + console.log(`done, ${counter} tasks marked as complete`); + setTimeout(() => Deno.exit(0), 200) // not sure if websockets are flushed since they're instant +} +ws.onmessage = ev => { + if (typeof ev.data != "string") return + const p = JSON.parse(ev.data) + if (p.t == "error") console.error(`error: ${p.message}`); +} diff --git a/scripts/enqueue.ts b/scripts/enqueue.ts index e6e3958..934f49d 100644 --- a/scripts/enqueue.ts +++ b/scripts/enqueue.ts @@ -4,6 +4,8 @@ const note_filter = Deno.args.length >= 3 ? Deno.args[2] : "" const ws = new WebSocket(Deno.args[0]) +const requeue = Deno.env.has("REQUEUE") + function run_enqueue() { let kind = "http" for (const line of file.split("\n")) { @@ -16,7 +18,7 @@ function run_enqueue() { if (note_filter.length && note != note_filter) continue const key = `${kind}:${id}`; ws.send(JSON.stringify({ t: "metadata", key, data: { output: name, title: name } })) - ws.send(JSON.stringify({ t: "enqueue", key })) + ws.send(JSON.stringify({ t: "enqueue", key, ignore_complete: requeue })) } } ws.send(JSON.stringify({ t: "save" })) diff --git a/src/style.css b/src/style.css index 9eb1187..a309979 100644 --- a/src/style.css +++ b/src/style.css @@ -43,6 +43,9 @@ .worker.busy { border-color: #ffc36e; } +.worker.idle { + border-color: #6e6eff; +} section.tasks { display: flex; diff --git a/src/worker_ws.rs b/src/worker_ws.rs index 7b76476..5f0e47c 100644 --- a/src/worker_ws.rs +++ b/src/worker_ws.rs @@ -32,9 +32,13 @@ pub enum WorkerRequest { }, Enqueue { key: String, + #[serde(default)] + ignore_complete: bool, }, Complete { key: String, + #[serde(default)] + force: bool, }, Accept, Save, @@ -162,16 +166,35 @@ impl State { let m = self.metadata.entry(key).or_default(); m.extend(data); } - WorkerRequest::Enqueue { key } => { - self.queue.insert(key); - self.dispatch_work(); + WorkerRequest::Enqueue { + key, + ignore_complete, + } => { + if ignore_complete { + if !self.loading.contains(&key) { + self.complete.remove(&key); + self.queue.insert(key); + self.dispatch_work(); + } + } else { + if !(self.complete.contains(&key) || self.loading.contains(&key)) { + self.queue.insert(key); + self.dispatch_work(); + } + } } - WorkerRequest::Complete { key } => { - if worker.assigned_tasks.remove(&key) { + WorkerRequest::Complete { key, force } => { + if force { + self.queue.remove(&key); self.loading.remove(&key); self.complete.insert(key); } else { - bail!("task was not assigned") + if worker.assigned_tasks.remove(&key) { + self.loading.remove(&key); + self.complete.insert(key); + } else { + bail!("task was not assigned") + } } } WorkerRequest::Accept => { -- cgit v1.2.3-70-g09d2