From 25042742ad5ecda747df5a1097b0fe8c3e1e11a8 Mon Sep 17 00:00:00 2001 From: Alenvelocity Date: Mon, 30 Jun 2025 20:44:55 +0530 Subject: [PATCH] api/metadata: endpoint to fetch metadata of given video --- api/src/core/api.js | 43 ++++++++++++++++++++++++++ api/src/processing/services/youtube.js | 5 +-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/api/src/core/api.js b/api/src/core/api.js index 248f9357..c722899c 100644 --- a/api/src/core/api.js +++ b/api/src/core/api.js @@ -276,6 +276,49 @@ export const runAPI = async (express, app, __dirname, isPrimary = true) => { } }); + app.post('/metadata', apiLimiter); + app.post('/metadata', async (req, res) => { + const request = req.body; + if (!request.url) { + return fail(res, "error.api.link.missing"); + } + const { success, data: normalizedRequest } = await normalizeRequest(request); + if (!success) { + return fail(res, "error.api.invalid_body"); + } + const parsed = extract( + normalizedRequest.url, + APIKeys.getAllowedServices(req.rateLimitKey), + ); + if (!parsed) { + return fail(res, "error.api.link.invalid"); + } + if ("error" in parsed) { + let context; + if (parsed?.context) { + context = parsed.context; + } + return fail(res, `error.api.${parsed.error}`, context); + } + + if (parsed.host === "youtube") { + const youtube = (await import("../processing/services/youtube.js")).default; + const info = await youtube({ id: parsed.patternMatch.id }); + if (info.error) { + return fail(res, info.error); + } + const meta = { + title: info.fileMetadata?.title, + duration: info.duration || null, + thumbnail: info.cover || null, + author: info.fileMetadata?.artist || null, + }; + return res.json({ status: "success", metadata: meta }); + } else { + return res.status(501).json({ status: "error", code: "not_implemented", message: "Metadata endpoint is only implemented for YouTube." }); + } + }); + app.use('/tunnel', cors({ methods: ['GET'], exposedHeaders: [ diff --git a/api/src/processing/services/youtube.js b/api/src/processing/services/youtube.js index 55caa835..9f9a26cf 100644 --- a/api/src/processing/services/youtube.js +++ b/api/src/processing/services/youtube.js @@ -480,7 +480,7 @@ export default async function (o) { const fileMetadata = { title: basicInfo.title.trim(), - artist: basicInfo.author.replace("- Topic", "").trim() + artist: basicInfo.author.replace("- Topic", "").trim(), } if (basicInfo?.short_description?.startsWith("Provided to YouTube by")) { @@ -597,7 +597,8 @@ export default async function (o) { filenameAttributes, fileMetadata, isHLS: useHLS, - originalRequest + originalRequest, + duration: basicInfo.duration, } }