mirror of
https://github.com/MasterAcnolo/Freedom-Loader.git
synced 2026-07-29 18:25:47 +02:00
ProgressBar + Playlist
This commit is contained in:
@@ -12,6 +12,8 @@ const { notifyDownloadFinished } = require("../helpers/notify");
|
||||
|
||||
const { userYtDlp } = require("../helpers/path");
|
||||
|
||||
const listeners = [];
|
||||
|
||||
router.post("/", (req, res) => {
|
||||
try {
|
||||
const options = {
|
||||
@@ -31,6 +33,7 @@ router.post("/", (req, res) => {
|
||||
logger.info(args)
|
||||
const child = execFile(userYtDlp, args);
|
||||
|
||||
|
||||
child.on("error", err => {
|
||||
logger.error(`Erreur yt-dlp : ${err.message}`);
|
||||
res.status(500).send(`❌ Erreur yt-dlp : ${err.message}`);
|
||||
@@ -48,10 +51,44 @@ router.post("/", (req, res) => {
|
||||
child.stderr.on("data", data => data.toString().split("\n").forEach(line => line.trim() && logger.error(`[yt-dlp stderr] ${line}`)));
|
||||
}
|
||||
|
||||
child.stdout.on("data", data => {
|
||||
const lines = data.toString().split("\n");
|
||||
lines.forEach(line => {
|
||||
const match = line.match(/\[download\]\s+(\d+\.\d+)%/);
|
||||
if (match) {
|
||||
const percent = parseFloat(match[1]);
|
||||
if (listeners.length > 0) {
|
||||
listeners.forEach(fn => fn(percent));
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
logger.error(`Erreur serveur dans /download : ${err.message}`);
|
||||
res.status(500).send(`Erreur serveur : ${err.message}`);
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
// SSE endpoint
|
||||
router.get("/progress", (req, res) => {
|
||||
res.set({
|
||||
'Content-Type': 'text/event-stream',
|
||||
'Cache-Control': 'no-cache',
|
||||
'Connection': 'keep-alive',
|
||||
});
|
||||
|
||||
const sendProgress = (percent) => {
|
||||
res.write(`data: ${percent}\n\n`);
|
||||
};
|
||||
|
||||
listeners.push(sendProgress);
|
||||
|
||||
req.on('close', () => {
|
||||
listeners.splice(listeners.indexOf(sendProgress), 1);
|
||||
res.end();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
module.exports = router;
|
||||
@@ -3,11 +3,7 @@ const router = express.Router();
|
||||
const { execFile } = require("child_process");
|
||||
const { logger } = require("../logger");
|
||||
const { userYtDlp } = require("../helpers/path");
|
||||
const getUserBrowser = require("../helpers/getBrowser")
|
||||
|
||||
|
||||
// const ytDlpPath = path.join(__dirname, '../../ressources/yt-dlp.exe');
|
||||
// const userYtDlp = path.join(process.env.APPDATA || process.env.USERPROFILE, 'FreedomLoader', 'yt-dlp.exe');
|
||||
const getUserBrowser = require("../helpers/getBrowser");
|
||||
|
||||
function isValidUrl(url) {
|
||||
try {
|
||||
@@ -24,7 +20,16 @@ router.post("/", (req, res) => {
|
||||
|
||||
logger.info(`Requête /info reçue pour ${url}`);
|
||||
|
||||
const args = ["--dump-single-json", "--ignore-errors", "--yes-playlist", url, "--cookies-from-browser" , `${getUserBrowser()}`];
|
||||
const args = [
|
||||
"--dump-single-json",
|
||||
"--ignore-errors",
|
||||
"--yes-playlist",
|
||||
url,
|
||||
"--cookies-from-browser",
|
||||
`${getUserBrowser()}`,
|
||||
"--extractor-args",
|
||||
"youtube:player_client=default"
|
||||
];
|
||||
|
||||
execFile(userYtDlp, args, { timeout: 30_000, maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
|
||||
|
||||
@@ -69,13 +74,21 @@ router.post("/", (req, res) => {
|
||||
}
|
||||
|
||||
// Vidéo unique
|
||||
if (!data.title) {
|
||||
return res.status(500).send("❌ Impossible de récupérer les infos pour cette vidéo.");
|
||||
|
||||
}
|
||||
|
||||
logger.info(`Vidéo unique récupérée : ${data.title}`);
|
||||
res.json({ type: "video", ...data });
|
||||
|
||||
} catch (e) {
|
||||
// fallback aussi si JSON est illisible
|
||||
logger.error(`Erreur parsing JSON: ${e.message}`);
|
||||
return res.status(500).send("❌ JSON illisible.");
|
||||
return res.status(500).send("❌ Impossible de récupérer les infos (JSON illisible).");
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user