Files
Freedom-Loader/server/routes/info.js
2025-11-09 10:35:19 +01:00

70 lines
2.1 KiB
JavaScript

const express = require("express");
const router = express.Router();
const { execFile } = require("child_process");
const { logger } = require("../logger");
const { userYtDlp } = require("../helpers/path");
// const ytDlpPath = path.join(__dirname, '../../ressources/yt-dlp.exe');
// const userYtDlp = path.join(process.env.APPDATA || process.env.USERPROFILE, 'FreedomLoader', 'yt-dlp.exe');
function isValidUrl(url) {
try {
new URL(url);
return true;
} catch {
return false;
}
}
router.post("/", (req, res) => {
const { url } = req.body;
if (!url || !isValidUrl(url)) return res.status(400).send("❌ URL invalide ou manquante");
logger.info(`Requête /info reçue pour ${url}`);
const args = ["--dump-single-json", "--ignore-errors", "--yes-playlist", url];
execFile(userYtDlp, args, { timeout: 30_000, maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
if (error) {
logger.error(`Erreur yt-dlp: ${error.message}`);
if (stderr) logger.debug(`stderr: ${stderr}`);
return res.status(500).send("❌ Impossible de récupérer les infos.");
}
if (!stdout) return res.status(500).send("❌ Aucune donnée reçue.");
try {
const data = JSON.parse(stdout);
if (data._type === "playlist") {
const playlistPayload = {
type: "playlist",
title: data.title || data.id,
channel: data.uploader,
count: data.entries.length,
videos: (data.entries || []).map(v => ({
id: v.id,
title: v.title,
url: v.webpage_url,
duration: v.duration,
thumbnail: v.thumbnail,
uploader: v.uploader
}))
};
logger.info(`Playlist détectée : ${playlistPayload.title} (${playlistPayload.count} vidéos)`);
return res.json(playlistPayload);
}
// Vidéo unique
logger.info(`Vidéo unique récupérée : ${data.title}`);
res.json({ type: "video", ...data });
} catch (e) {
logger.error(`Erreur parsing JSON: ${e.message}`);
return res.status(500).send("❌ JSON illisible.");
}
});
});
module.exports = router;