api/metadata: endpoint to fetch metadata of given video

This commit is contained in:
Alenvelocity 2025-06-30 20:44:55 +05:30
parent 7aa128d9cc
commit 25042742ad
2 changed files with 46 additions and 2 deletions

View File

@ -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({ app.use('/tunnel', cors({
methods: ['GET'], methods: ['GET'],
exposedHeaders: [ exposedHeaders: [

View File

@ -480,7 +480,7 @@ export default async function (o) {
const fileMetadata = { const fileMetadata = {
title: basicInfo.title.trim(), 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")) { if (basicInfo?.short_description?.startsWith("Provided to YouTube by")) {
@ -597,7 +597,8 @@ export default async function (o) {
filenameAttributes, filenameAttributes,
fileMetadata, fileMetadata,
isHLS: useHLS, isHLS: useHLS,
originalRequest originalRequest,
duration: basicInfo.duration,
} }
} }