mirror of
https://github.com/MasterAcnolo/Freedom-Loader.git
synced 2026-07-29 18:25:47 +02:00
English
This commit is contained in:
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@@ -6,7 +6,6 @@
|
|||||||
},
|
},
|
||||||
"editor.suggestOnTriggerCharacters": false,
|
"editor.suggestOnTriggerCharacters": false,
|
||||||
"editor.parameterHints.enabled": false,
|
"editor.parameterHints.enabled": false,
|
||||||
"editor.hover.enabled": false,
|
|
||||||
"editor.codeLens": false,
|
"editor.codeLens": false,
|
||||||
"editor.lightbulb.enabled": "off",
|
"editor.lightbulb.enabled": "off",
|
||||||
"editor.inlineSuggest.enabled": false,
|
"editor.inlineSuggest.enabled": false,
|
||||||
|
|||||||
@@ -40,21 +40,21 @@
|
|||||||
Audio seulement (MP3)
|
Audio seulement (MP3)
|
||||||
</label>
|
</label>
|
||||||
<select name="quality">
|
<select name="quality">
|
||||||
<option value="best">Meilleure qualité</option>
|
<option value="best">Best Quality</option>
|
||||||
<option value="medium">Qualité moyenne</option>
|
<option value="medium">Medium Quality</option>
|
||||||
<option value="worst">Qualité minimale</option>
|
<option value="worst">Lowest Quality</option>
|
||||||
<option value="1080">1080p</option>
|
<option value="1080">1080p</option>
|
||||||
<option value="720">720p</option>
|
<option value="720">720p</option>
|
||||||
<option value="480">480p</option>
|
<option value="480">480p</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<button type="submit" onclick="startProgress()">Télécharger</button>
|
<button type="submit" onclick="startProgress()">Download</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="download-path">
|
<div class="download-path">
|
||||||
Sera enregistré dans <span id="savePath"></span>
|
Will be save on <span id="savePath"></span>
|
||||||
<button id="changePath">Modifier</button>
|
<button id="changePath">Edit</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="downloadProgressWrapper">
|
<div id="downloadProgressWrapper">
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ const themes = {
|
|||||||
light: { label: "Clair", subtitle: "Qui aime ce thème ?" },
|
light: { label: "Clair", subtitle: "Qui aime ce thème ?" },
|
||||||
neon: { label: "Néon", subtitle: "How was your day ?"},
|
neon: { label: "Néon", subtitle: "How was your day ?"},
|
||||||
nf: { label: "NF", subtitle: "You call it music, i call it my Therapist" },
|
nf: { label: "NF", subtitle: "You call it music, i call it my Therapist" },
|
||||||
songbird: { label: "Songbird", subtitle: "From Her to Eternity" },
|
songbird: { label: "Songbird", subtitle: "From Her to Eternity" },
|
||||||
drift: { label: "Drift", subtitle: "Si la route t'appelle, contre appel" },
|
drift: { label: "Drift", subtitle: "Si la route t'appelle, contre appel" },
|
||||||
fanatic: { label: "Fanatic", subtitle: "Always Fnatic !" },
|
fanatic: { label: "Fanatic", subtitle: "Always Fnatic !" },
|
||||||
chirac: { label: "Chirac", subtitle: "J'aime les pommes" },
|
chirac: { label: "Chirac", subtitle: "J'aime les pommes" },
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ async function fetchVideoInfo(url) {
|
|||||||
if (!res.ok) return { error: `An Error occured when fetching info` };
|
if (!res.ok) return { error: `An Error occured when fetching info` };
|
||||||
|
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (!data) return { error: "Données manquantes" };
|
if (!data) return { error: "Data is Missing" };
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return { error: "Erreur réseau ou JSON" };
|
return { error: "Network or JSON Issue" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,8 +71,8 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
if (data.type === "playlist") {
|
if (data.type === "playlist") {
|
||||||
infoDiv.classList.add("playlist-mode");
|
infoDiv.classList.add("playlist-mode");
|
||||||
infoDiv.innerHTML = `
|
infoDiv.innerHTML = `
|
||||||
<h3 style="color:var(--video-info-heading-color);"><strong>Playlist détectée: ${data.title}</strong></h3>
|
<h3 style="color:var(--video-info-heading-color);"><strong>Playlist Detected: ${data.title}</strong></h3>
|
||||||
<h3 style="color:var(--video-info-heading-color);"><strong>Nombre de vidéos: ${data.count}</strong></h3>
|
<h3 style="color:var(--video-info-heading-color);"><strong>Video Count: ${data.count}</strong></h3>
|
||||||
<p><strong>Channel :</strong> ${data.channel || "Unknown"}</p>
|
<p><strong>Channel :</strong> ${data.channel || "Unknown"}</p>
|
||||||
<div id="playlistVideos"></div>
|
<div id="playlistVideos"></div>
|
||||||
`;
|
`;
|
||||||
@@ -89,7 +89,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
<div style="margin-bottom:12px;">
|
<div style="margin-bottom:12px;">
|
||||||
<img src="${v.thumbnail}" width="160" alt="Thumbnail">
|
<img src="${v.thumbnail}" width="160" alt="Thumbnail">
|
||||||
<p><strong>${v.title}</strong></p>
|
<p><strong>${v.title}</strong></p>
|
||||||
<p>Durée : ${durationStr}</p>
|
<p>Duration : ${durationStr}</p>
|
||||||
<p><a href="${videoUrl}" target="_blank">URL</a>
|
<p><a href="${videoUrl}" target="_blank">URL</a>
|
||||||
<button class="copy-btn" data-url="${videoUrl}">📋</button>
|
<button class="copy-btn" data-url="${videoUrl}">📋</button>
|
||||||
</p>
|
</p>
|
||||||
@@ -152,7 +152,7 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
// ---------- VIDEO NORMALE ----------
|
// ---------- VIDEO NORMALE ----------
|
||||||
const durationStr = data.duration
|
const durationStr = data.duration
|
||||||
? `${Math.floor(data.duration/60)}m ${(data.duration%60).toString().padStart(2,"0")}s`
|
? `${Math.floor(data.duration/60)}m ${(data.duration%60).toString().padStart(2,"0")}s`
|
||||||
: "Inconnue";
|
: "Unknown";
|
||||||
|
|
||||||
const sizeStr = formatSize(data.filesize_approx);
|
const sizeStr = formatSize(data.filesize_approx);
|
||||||
const readableDate = formatDate(data.upload_date);
|
const readableDate = formatDate(data.upload_date);
|
||||||
@@ -162,15 +162,15 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
<h3>${data.title}</h3>
|
<h3>${data.title}</h3>
|
||||||
<img src="${data.thumbnail}" width="320" alt="Thumbnail">
|
<img src="${data.thumbnail}" width="320" alt="Thumbnail">
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Durée :</strong> ${durationStr}</li>
|
<li><strong>Duration :</strong> ${durationStr}</li>
|
||||||
<li><strong>Uploader :</strong> ${data.uploader || "Inconnu"}</li>
|
<li><strong>Uploader :</strong> ${data.uploader || "Inconnu"}</li>
|
||||||
<li><strong>Date d’upload :</strong> ${readableDate}</li>
|
<li><strong>Upload Date :</strong> ${readableDate}</li>
|
||||||
<li><strong>Vues :</strong> ${data.view_count?.toLocaleString() || "?"}</li>
|
<li><strong>Views :</strong> ${data.view_count?.toLocaleString() || "?"}</li>
|
||||||
<li><strong>Likes :</strong> ${data.like_count?.toLocaleString() || "?"}</li>
|
<li><strong>Likes :</strong> ${data.like_count?.toLocaleString() || "?"}</li>
|
||||||
<li><strong>URL :</strong> <a href="${data.webpage_url}" target="_blank">${data.webpage_url}</a></li>
|
<li><strong>URL :</strong> <a href="${data.webpage_url}" target="_blank">${data.webpage_url}</a></li>
|
||||||
<li><strong>Channel :</strong> <a href="${data.channel_url}" target="_blank">${data.channel_url}</a></li>
|
<li><strong>Channel :</strong> <a href="${data.channel_url}" target="_blank">${data.channel_url}</a></li>
|
||||||
<li><strong>Taille estimée :</strong> ${sizeStr}</li>
|
<li><strong>Estimed Size :</strong> ${sizeStr}</li>
|
||||||
<li><strong>Catégories :</strong> ${categories}</li>
|
<li><strong>Category :</strong> ${categories}</li>
|
||||||
</ul>
|
</ul>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ async function infoController(req, res){
|
|||||||
logger.info(`/Info Request receive by the Info Controller. URL: ${url}`);
|
logger.info(`/Info Request receive by the Info Controller. URL: ${url}`);
|
||||||
|
|
||||||
if (url.includes("?list")) {
|
if (url.includes("?list")) {
|
||||||
logger.info("Type de contenu: Playlist")
|
logger.info("Estimated Data Type: Playlist")
|
||||||
|
|
||||||
} else{
|
} else{
|
||||||
logger.info("Type de contenu: Vidéo")
|
logger.info("Estimated Data Type: Video")
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ const notify = require("./notify")
|
|||||||
function getUserBrowser() {
|
function getUserBrowser() {
|
||||||
const userProfile = os.homedir();
|
const userProfile = os.homedir();
|
||||||
|
|
||||||
// Liste des navigateurs supportés par yt-dlp
|
// Liste des navigateurs supportés par yt-dlp (Actuellement je peux que garantir Firefox, Désolé)
|
||||||
const browsers = [
|
const browsers = [
|
||||||
{ name: "firefox", path: path.join(userProfile, "AppData", "Roaming", "Mozilla", "Firefox", "Profiles") },
|
{ name: "firefox", path: path.join(userProfile, "AppData", "Roaming", "Mozilla", "Firefox", "Profiles") },
|
||||||
// { name: "chrome", path: path.join(userProfile, "AppData", "Local", "Google", "Chrome", "User Data", "Default") },
|
// { name: "chrome", path: path.join(userProfile, "AppData", "Local", "Google", "Chrome", "User Data", "Default") },
|
||||||
|
|||||||
Reference in New Issue
Block a user