diff --git a/README-EN.md b/README-EN.md
index a80b211..b888e7b 100644
--- a/README-EN.md
+++ b/README-EN.md
@@ -1,5 +1,8 @@
# Freedom Loader
+
+
+
 
> This project aims to enable free, open-source, and unrestricted downloading of Video/Audio content. Eventually, it will allow users to choose
@@ -11,6 +14,8 @@
✅ Detailed Logs (Console + Logs)
✅ Automatic Fetch of Information
✅ Playlist Download
+✅ Theme selection
+✅ Custom output path selection for videos
---
diff --git a/README.md b/README.md
index 275c4eb..bf033c7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,8 @@
# Freedom Loader
+
+
+
 
> Ce projet a pour but de permettre le téléchargement de contenu Vidéo/Audio de manière gratuite, open source et libre. Il permettra à terme de choisir
@@ -11,6 +14,8 @@
✅ Logs détaillés (console + fichiers logs)
✅ Récupération automatique des informations
✅ Téléchargement des playlists
+✅ Choix de thèmes
+✅ Choix du chemin de sortie des vidéos personnalisés
---
diff --git a/main.js b/main.js
index af0e2b8..6017925 100644
--- a/main.js
+++ b/main.js
@@ -16,19 +16,26 @@
along with this program. If not, see .
*/
-const { app, BrowserWindow } = require("electron");
+const { app, BrowserWindow, ipcMain, dialog } = require("electron");
const path = require("path");
+const os = require("os");
const { logger, logSessionStart, logSessionEnd } = require("./server/logger");
let mainWindow;
+/*
+ Fonction principale qui crée la fenêtre principale de l'application.
+ Elle évite la création multiple et configure les dimensions et options de la fenêtre.
+ Charge l'URL locale du serveur Express et gère les erreurs éventuelles.
+*/
async function createWindow() {
- logger.info("Creation de la fenetre...");
-
+ logger.info("Création de la fenêtre...");
+
if (mainWindow) {
- logger.warn("La fenetre existe deja, pas de nouvelle creation");
+ logger.warn("La fenêtre existe déjà, pas de nouvelle création");
return;
}
+
mainWindow = new BrowserWindow({
title: "Freedom Loader",
width: 750,
@@ -38,42 +45,92 @@ async function createWindow() {
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
+ preload: path.join(__dirname, "preload.js"), // Chargement du preload script sécurisé
},
- // titleBarStyle: 'hidden',
+ // titleBarStyle: 'hidden', // Option possible pour une barre de titre personnalisée
});
try {
await mainWindow.loadURL("http://localhost:8080");
- logger.info("Fenetre chargee");
+ logger.info("Fenêtre chargée");
} catch (err) {
- logger.error("Erreur chargement fenetre:", err);
+ logger.error("Erreur chargement fenêtre:", err);
}
+ // Événement déclenché à la fermeture de la fenêtre principale
mainWindow.on("closed", () => {
- logger.info("Fenetre principale fermee");
+ logger.info("Fenêtre principale fermée");
mainWindow = null;
});
}
+/*
+ Définition du chemin par défaut pour les téléchargements.
+ Ici, on utilise le dossier 'Downloads' de l'utilisateur avec un sous-dossier spécifique à l'application.
+*/
+const defaultDownloadPath = path.join(os.homedir(), "Downloads", "Freedom Loader");
+
+/*
+ Gestionnaire IPC qui permet au renderer de demander à l'utilisateur
+ de sélectionner un dossier via une boîte de dialogue native.
+ On retourne le chemin sélectionné ou null si annulation.
+*/
+ipcMain.handle("select-download-folder", async () => {
+ logger.info("Demande de sélection d'un dossier reçue depuis le renderer");
+ try {
+ const result = await dialog.showOpenDialog({
+ properties: ["openDirectory"]
+ });
+ if (!result.canceled && result.filePaths.length > 0) {
+ logger.info(`Dossier sélectionné : ${result.filePaths[0]}`);
+ return result.filePaths[0];
+ }
+ return null;
+ } catch (err) {
+ logger.error(`Erreur lors de la sélection de dossier : ${err.message}`);
+ return null;
+ }
+});
+
+/*
+ Gestionnaire IPC pour exposer au renderer le chemin par défaut de téléchargement
+ afin qu'il puisse l'afficher ou l'utiliser comme valeur initiale.
+*/
+ipcMain.handle("get-default-download-path", () => {
+ return defaultDownloadPath;
+});
+
+/*
+ Événement déclenché quand l'application est prête.
+ On démarre le serveur Express, puis on crée la fenêtre principale.
+ En cas d'erreur, on log et on quitte l'application proprement.
+*/
app.whenReady().then(async () => {
- logSessionStart();
- logger.info("App prete, demarrage du serveur Express...");
+ logSessionStart();
+ logger.info("App prête, démarrage du serveur Express...");
const expressServer = require("./server/server.js");
try {
await expressServer.startServer();
- logger.info("Serveur Express demarre");
+ logger.info("Serveur Express démarré");
await createWindow();
} catch (error) {
- logger.error("Erreur serveur ou fenetre :", error);
+ logger.error("Erreur serveur ou fenêtre :", error);
app.quit();
}
});
+/*
+ Quitte l'application lorsque toutes les fenêtres sont fermées,
+ sauf sous macOS où il est habituel de garder l'application active.
+*/
app.on("window-all-closed", () => {
- logger.info("Toutes fenetres fermees, quitte l'app");
+ logger.info("Toutes fenêtres fermées, quitte l'app");
if (process.platform !== "darwin") app.quit();
});
+/*
+ Avant de quitter l'application, on log la fin de session pour traçabilité.
+*/
app.on("before-quit", () => {
- logSessionEnd();
+ logSessionEnd();
});
diff --git a/package-lock.json b/package-lock.json
index fdf4cf8..23e9233 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "freedom-loader",
- "version": "1.0.1",
+ "version": "1.0.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "freedom-loader",
- "version": "1.0.1",
+ "version": "1.0.2",
"dependencies": {
"chalk": "^4.1.2",
"debug": "^4.4.1",
@@ -1153,9 +1153,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.15.34",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.34.tgz",
- "integrity": "sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==",
+ "version": "22.16.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.0.tgz",
+ "integrity": "sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index 13da612..d35b284 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "freedom-loader",
"productName": "Freedom Loader",
- "version": "1.0.1",
+ "version": "1.0.2",
"author": "MasterAcnolo",
"description": "Freedom Loader, parce que nous le valons bien",
"main": "main.js",
diff --git a/preload.js b/preload.js
new file mode 100644
index 0000000..6a2f152
--- /dev/null
+++ b/preload.js
@@ -0,0 +1,31 @@
+/*
+ This file is part of Freedom Loader.
+
+ Copyright (C) 2025 MasterAcnolo
+
+ Freedom Loader is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License.
+
+ Freedom Loader is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+const { contextBridge, ipcRenderer } = require("electron");
+
+/*
+ Expose dans le contexte global (window.electronAPI) deux méthodes sécurisées
+ pour que le renderer puisse interagir avec le main process via IPC.
+
+ - getDefaultDownloadPath : récupère le chemin de téléchargement par défaut.
+ - selectDownloadFolder : ouvre la boîte de dialogue pour choisir un dossier.
+*/
+contextBridge.exposeInMainWorld("electronAPI", {
+ getDefaultDownloadPath: () => ipcRenderer.invoke("get-default-download-path"),
+ selectDownloadFolder: () => ipcRenderer.invoke("select-download-folder"),
+});
diff --git a/public/assets/images/Vilbrequin.avif b/public/assets/images/Vilbrequin.avif
new file mode 100644
index 0000000..e115f98
Binary files /dev/null and b/public/assets/images/Vilbrequin.avif differ
diff --git a/public/assets/images/cyberpunk4.webp b/public/assets/images/cyberpunk4.webp
new file mode 100644
index 0000000..bb0dfd5
Binary files /dev/null and b/public/assets/images/cyberpunk4.webp differ
diff --git a/public/assets/images/goat.webp b/public/assets/images/goat.webp
new file mode 100644
index 0000000..4411f79
Binary files /dev/null and b/public/assets/images/goat.webp differ
diff --git a/public/assets/images/spicy.webp b/public/assets/images/spicy.webp
new file mode 100644
index 0000000..da2b756
Binary files /dev/null and b/public/assets/images/spicy.webp differ
diff --git a/public/index.html b/public/index.html
index f25656b..d317159 100644
--- a/public/index.html
+++ b/public/index.html
@@ -18,12 +18,12 @@