better metadata server support

This commit is contained in:
localhost 2026-05-25 10:15:41 +02:00
parent 389fdf49c4
commit 7791f92a56
4 changed files with 24 additions and 16 deletions

View File

@ -8,7 +8,6 @@
"@types/pg": "^8.20.0",
"kysely": "^0.28.16",
"pg": "^8.20.0",
"youtubei.js": "^17.0.1",
},
"devDependencies": {
"@types/bun": "latest",
@ -19,8 +18,6 @@
},
},
"packages": {
"@bufbuild/protobuf": ["@bufbuild/protobuf@2.12.0", "", {}, "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA=="],
"@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="],
"@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="],
@ -31,8 +28,6 @@
"kysely": ["kysely@0.28.16", "", {}, "sha512-3i5pmOiZvMDj00qhrIVbH0AnioVTx22DMP7Vn5At4yJO46iy+FM8Y/g61ltenLVSo3fiO8h8Q3QOFgf/gQ72ww=="],
"meriyah": ["meriyah@6.1.4", "", {}, "sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ=="],
"pg": ["pg@8.20.0", "", { "dependencies": { "pg-connection-string": "^2.12.0", "pg-pool": "^3.13.0", "pg-protocol": "^1.13.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA=="],
"pg-cloudflare": ["pg-cloudflare@1.3.0", "", {}, "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ=="],
@ -64,7 +59,5 @@
"undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="],
"xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
"youtubei.js": ["youtubei.js@17.0.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.0.0", "meriyah": "^6.1.4" } }, "sha512-1lO4b8UqMDzE0oh2qEGzbBOd4UYRdxn/4PdpRM7BGTHxM6ddsEsKZTu90jp8V9FHVgC2h1UirQyqoqLiKwl+Zg=="],
}
}

View File

@ -12,7 +12,6 @@
"dependencies": {
"@types/pg": "^8.20.0",
"kysely": "^0.28.16",
"pg": "^8.20.0",
"youtubei.js": "^17.0.1"
"pg": "^8.20.0"
}
}

View File

@ -1,6 +1,7 @@
import { Innertube } from 'youtubei.js'
import healthStatus from '@/utils/health';
import { db } from '@/utils/database'
import { getChannelVideos } from './utils/metadata';
let websocket = process.env.WEBSOCKET
if (healthStatus[process.env.METADATA!] != 'healthy') {
@ -14,23 +15,22 @@ const channels = await db.selectFrom('autodownload')
for (const c of channels) {
console.log(c.channel)
const channel = await yt.getChannel(c.channel);
const json = await channel.getVideos();
const videos = await getChannelVideos(c.channel)
for (const v of json.videos) {
console.log(v.video_id)
for (const v of videos) {
console.log(v.videoId)
const already = await db.selectFrom('videos')
.selectAll()
.where('id', '=', v.video_id)
.where('id', '=', v.videoId)
.executeTakeFirst()
if (already) continue
await new Promise(async (resolve, reject) => {
const ws = new WebSocket(`${websocket}/save?url=http://www.youtube.com/watch?v=${v.video_id}&bKey=${process.env.bKey}`)
const ws = new WebSocket(`${websocket}/save?url=http://www.youtube.com/watch?v=${v.videoId}&bKey=${process.env.bKey}`)
ws.onopen = () => {
console.log(`opened websocket for ${v.video_id}`)
console.log(`opened websocket for ${v.videoId}`)
}
ws.onmessage = (event) => {

16
src/utils/metadata.ts Normal file
View File

@ -0,0 +1,16 @@
// metadata either returns innertube or { error: string }
import { getMetadataBackend } from '@/utils/health';
async function getVideo(id: string) {
return await (await fetch(`${getMetadataBackend()}/video/${id}`)).json()
}
async function getChannel(id: string) {
return await (await fetch(`${getMetadataBackend()}/channel/${id}`)).json()
}
async function getChannelVideos(id: string) {
return await (await fetch(`${getMetadataBackend()}/videos/${id}`)).json()
}
export { getVideo, getChannel, getChannelVideos }