mirror of
https://github.com/MasterAcnolo/Freedom-Loader.git
synced 2026-07-29 18:25:47 +02:00
Using MVC Model + AutoDeteck Package + Fix Download/Info
This commit is contained in:
46
server/controller/download.controller.js
Normal file
46
server/controller/download.controller.js
Normal file
@@ -0,0 +1,46 @@
|
||||
const { fetchDownload } = require("../services/download.services");
|
||||
const { logger } = require("../logger");
|
||||
const { isValidUrl, isSafePath } = require("../helpers/validation");
|
||||
const { buildYtDlpArgs } = require("../helpers/buildArgs");
|
||||
const { notifyDownloadFinished } = require("../helpers/notify");
|
||||
|
||||
const listeners = [];
|
||||
|
||||
async function downloadController(req, res) {
|
||||
try {
|
||||
const options = {
|
||||
url: req.body.url,
|
||||
audioOnly: req.body.audioOnly === "1",
|
||||
quality: req.body.quality || "best",
|
||||
outputFolder: req.body.savePath || undefined,
|
||||
};
|
||||
|
||||
if (!options.url || !isValidUrl(options.url)) return res.status(400).send("❌ URL invalide !");
|
||||
if (options.outputFolder && !isSafePath(options.outputFolder)) return res.status(400).send("❌ Chemin de sauvegarde non autorisé.");
|
||||
|
||||
const filePath = await fetchDownload(options, listeners);
|
||||
notifyDownloadFinished(filePath);
|
||||
res.send("✅ Téléchargement terminé !");
|
||||
} catch (err) {
|
||||
logger.error(`Erreur serveur dans /download : ${err.message}`);
|
||||
res.status(500).send(`❌ ${err.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
function progressController(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 = { downloadController, progressController };
|
||||
49
server/controller/info.controller.js
Normal file
49
server/controller/info.controller.js
Normal file
@@ -0,0 +1,49 @@
|
||||
const express = require("express");
|
||||
const router = express.Router();
|
||||
|
||||
const { fetchInfo } = require("../services/info.services");
|
||||
const { parseVideo, parsePlaylist } = require("../helpers/parseInfo");
|
||||
const { logger } = require("../logger");
|
||||
const { isValidUrl } = require("../helpers/validation");
|
||||
|
||||
async function infoController(req, res){
|
||||
|
||||
const url = req.body.url || req.query.url; // Gérer POST et GET
|
||||
|
||||
|
||||
/* Si pas d'url ou url invalide*/
|
||||
if (!url || !isValidUrl(url)) return res.status(400).send("❌ URL invalide ou manquante");
|
||||
|
||||
logger.info(`Requête /info reçue par le controller. URL: ${url}`);
|
||||
|
||||
if (url.includes("?list")) {
|
||||
logger.info("Type de contenu: Playlist")
|
||||
|
||||
} else{
|
||||
logger.info("Type de contenu: Vidéo")
|
||||
}
|
||||
|
||||
try {
|
||||
const data = await fetchInfo(url);
|
||||
|
||||
if (data._type === "playlist") {
|
||||
|
||||
const playlist = parsePlaylist(data);
|
||||
logger.info(`Playlist détectée : ${playlist.title} (${playlist.count} vidéos)`);
|
||||
return res.json(playlist);
|
||||
|
||||
} else{
|
||||
const video = parseVideo(data);
|
||||
logger.info(`Vidéo unique récupérée : ${video.title}`);
|
||||
return res.json(video);
|
||||
}
|
||||
|
||||
|
||||
|
||||
} catch (err) {
|
||||
return res.status(500).send(`❌ ${err.message}`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = {infoController};
|
||||
Reference in New Issue
Block a user