diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-03-01 16:36:37 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-03-01 16:36:37 +0100 |
| commit | 8b6cdea5ff529a7c08a353059279636343feb3e8 (patch) | |
| tree | 2e9471ffdbecebc3ff09d8fad4a48452bde1eae4 | |
| parent | eb16e8075c80f6d148cecdc513cc47ba14f81c55 (diff) | |
| download | isda-8b6cdea5ff529a7c08a353059279636343feb3e8.tar isda-8b6cdea5ff529a7c08a353059279636343feb3e8.tar.bz2 isda-8b6cdea5ff529a7c08a353059279636343feb3e8.tar.zst | |
script for checking channels only when atom feed changed
| -rw-r--r-- | scripts/youtube_atom_compare.ts | 62 | ||||
| -rw-r--r-- | scripts/youtube_atom_flatten.ts (renamed from scripts/youtube_xml_feed.ts) | 4 |
2 files changed, 64 insertions, 2 deletions
diff --git a/scripts/youtube_atom_compare.ts b/scripts/youtube_atom_compare.ts new file mode 100644 index 0000000..f56f9af --- /dev/null +++ b/scripts/youtube_atom_compare.ts @@ -0,0 +1,62 @@ +import { Config } from "./config.ts"; + +const ws = new WebSocket(Deno.args[0]) +// deno-lint-ignore no-unused-vars +let config: Config = {} as unknown as Config + +async function flat_feed(cid: string, data: { [key: string]: unknown }) { + const feedurl = `https://www.youtube.com/feeds/videos.xml?channel_id=${cid}` + console.log(`load feed ${feedurl}`); + const res = await fetch(feedurl) + if (!res.ok) throw new Error("feed download error:" + await res.text()); + const feed = await res.text() + + let last_seen_ids = "" + for (const entry of feed.split("<entry>")) { + const id_match = entry.match(/\<yt:videoId\>([0-9A-Za-z-_]{11})\<\/yt:videoId\>/) + if (!id_match) continue + last_seen_ids += id_match[1] + "|" + } + + if (data.last_seen_ids && data.last_seen_ids == last_seen_ids) { + console.log("feed identical"); + return + } else { + console.log("feed changed"); + ws.send(JSON.stringify({ + t: "metadata", + key: `youtube-channel-atom-compare:${cid}`, + data: { last_seen_ids } + })) + ws.send(JSON.stringify({ + t: "metadata", + key: `youtube-channel:${cid}`, + data: { ...data, last_seen_ids: undefined } + })) + ws.send(JSON.stringify({ t: "enqueue", key: `youtube-channel:${cid}` })) + } + console.log("done"); +} + +ws.onerror = () => console.error("ws error") +ws.onclose = () => { + console.error("ws closed") + Deno.exit(1) +} +ws.onopen = () => { + console.log("ws open"); + ws.send(JSON.stringify({ t: "register", name: "YouTube Atom feed checker", task_kinds: ["youtube-channel-atom-compare"] })) + ws.send(JSON.stringify({ t: "accept" })) +} +ws.onmessage = async ev => { + if (typeof ev.data != "string") return + const p = JSON.parse(ev.data) + if (p.t == "config") config = p.config + if (p.t == "error") console.error(`error: ${p.message}`); + if (p.t == "work") { + await flat_feed(p.key.replace("youtube-channel-atom-compare:", ""), p.data) + ws.send(JSON.stringify({ t: "complete", key: p.key })) + ws.send(JSON.stringify({ t: "save" })) + ws.send(JSON.stringify({ t: "accept" })) + } +} diff --git a/scripts/youtube_xml_feed.ts b/scripts/youtube_atom_flatten.ts index 5d21542..7bddced 100644 --- a/scripts/youtube_xml_feed.ts +++ b/scripts/youtube_atom_flatten.ts @@ -41,7 +41,7 @@ ws.onclose = () => { } ws.onopen = () => { console.log("ws open"); - ws.send(JSON.stringify({ t: "register", name: "YouTube XML feed flattener", task_kinds: ["youtube-channel-xmlfeed"] })) + ws.send(JSON.stringify({ t: "register", name: "YouTube XML feed flattener", task_kinds: ["youtube-channel-atom"] })) ws.send(JSON.stringify({ t: "accept" })) } ws.onmessage = async ev => { @@ -50,7 +50,7 @@ ws.onmessage = async ev => { if (p.t == "config") config = p.config if (p.t == "error") console.error(`error: ${p.message}`); if (p.t == "work") { - await flat_feed(p.key.replace("youtube-channel-xmlfeed:", ""), p.data) + await flat_feed(p.key.replace("youtube-channel-atom:", ""), p.data) ws.send(JSON.stringify({ t: "complete", key: p.key })) ws.send(JSON.stringify({ t: "save" })) ws.send(JSON.stringify({ t: "accept" })) |