aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/complete_from_files.ts36
-rw-r--r--scripts/enqueue.ts4
-rw-r--r--src/style.css3
-rw-r--r--src/worker_ws.rs35
4 files changed, 71 insertions, 7 deletions
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 => {