diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9b73fd6..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "editor.quickSuggestions": { - "comments": "off", - "strings": "off", - "other": "off" - }, - "editor.suggestOnTriggerCharacters": false, - "editor.parameterHints.enabled": false, - "editor.codeLens": false, - "editor.lightbulb.enabled": "off", - "editor.inlineSuggest.enabled": false, - "github.copilot.enable": { - "*": false - } -} diff --git a/README.md b/README.md index c70556f..0476cc4 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,9 @@
- - - - - - - - - + + +

@@ -103,29 +97,13 @@ Try restarting the application, checking the logs, or opening the developer cons This project uses: -
- - - - - - - - - - - - - - - - - - - - - -
+

+ + + + + +

--- diff --git a/main.js b/main.js index 978ab0e..aa43415 100644 --- a/main.js +++ b/main.js @@ -2,6 +2,7 @@ const config = require("./config.js"); const { app, BrowserWindow, ipcMain, dialog, Menu, shell } = require("electron"); const path = require("path"); const os = require("os"); +const fs = require("fs"); const { logger, logSessionStart, logSessionEnd, logDir } = require("./server/logger"); const { AutoUpdater } = require("./server/update.js"); @@ -12,23 +13,57 @@ const defaultDownloadPath = path.join(os.homedir(), "Downloads", "Freedom Loader app.setAppUserModelId("com.masteracnolo.freedomloader"); // pour notifications Windows app.disableHardwareAcceleration(); + // Gestion single instance const gotLock = app.requestSingleInstanceLock(); -if (!gotLock) { - // Une instance existe déjà -> fermer l'ancienne et continuer la nouvelle - // Ici la nouvelle instance continue normalement -} else { - app.on("second-instance", () => { - // La vieille instance se ferme - if (mainWindow) { - logger.info("New Instance Detected, closing the older..."); - mainWindow.destroy(); - mainWindow = null; - } - }); +// Native dependencies check (yt-dlp.exe, ffmpeg.exe, ffprobe.exe, Deno) +function checkNativeDependencies() { + const deps = [ + { name: "yt-dlp.exe", path: path.join(process.resourcesPath, "yt-dlp.exe") }, + { name: "ffmpeg.exe", path: path.join(process.resourcesPath, "ffmpeg.exe") }, + { name: "ffprobe.exe", path: path.join(process.resourcesPath, "ffprobe.exe") }, + { name: "deno.exe", path: path.join(process.resourcesPath, "deno.exe") }, + ]; + const missing = deps.filter(dep => !fs.existsSync(dep.path)); + let errorMsg = ""; + if (missing.length > 0) { + const missingList = missing.map(dep => dep.name).join(", "); + logger.error(`Missing dependencies: ${missingList}`); + errorMsg += `The following files are missing in the 'ressources' folder:\n${missingList}`; + } + if (errorMsg) { + app.whenReady().then(() => { + dialog.showErrorBox( + "Missing dependencies", + `${errorMsg}\n\nThe application will now exit. Try to reinstall` + ); + app.quit(); + }); + return false; + } + return true; } +if(!config.localMode){ + if (!gotLock) { + // Une instance existe déjà -> fermer l'ancienne et continuer la nouvelle + // Ici la nouvelle instance continue normalement + } else { + if (!checkNativeDependencies()) { + // Arrêt déjà géré dans la fonction + } else { + app.on("second-instance", () => { + // La vieille instance se ferme + if (mainWindow) { + logger.info("New Instance Detected, closing the older..."); + mainWindow.destroy(); + mainWindow = null; + } + }); + } + } +} // Création fenêtre principale async function createMainWindow() { if (mainWindow) { @@ -42,6 +77,7 @@ async function createMainWindow() { height: 800, minWidth: 750, minHeight: 800, + frame:false, webPreferences: { nodeIntegration: false, contextIsolation: true, @@ -83,46 +119,37 @@ ipcMain.on("set-progress", (event, percent) => { if (mainWindow) mainWindow.setProgressBar(percent / 100); // Electron attend 0 → 1 }); -// Menu -function setupMenu() { - const menuTemplate = [ - { - label: "Logs", - submenu: [ - { - label: "Open Logs", - click: () => shell.openPath(logsFolderPath), - }, - ], - }, - { - label: "Website", - submenu: [ - { - label: "Go to Website", - click: () => shell.openExternal("https://masteracnolo.github.io/FreedomLoader/"), - }, - ], - }, - { - label: "Documentation", - submenu: [ - { - label: "Go to Wiki", - click: () => shell.openExternal("https://masteracnolo.github.io/FreedomLoader/pages/wiki.html"), - }, - ], - }, - - ]; +// Topbar window controls +ipcMain.on("window-minimize", () => { + if (mainWindow) mainWindow.minimize(); +}); +ipcMain.on("window-maximize", () => { + if (mainWindow) { + if (mainWindow.isMaximized()) { + mainWindow.unmaximize(); + } else { + mainWindow.maximize(); + } + } +}); +ipcMain.on("window-close", () => { + if (mainWindow) mainWindow.close(); +}); - const defaultMenu = Menu.getApplicationMenu(); - const mergedTemplate = defaultMenu - ? [...defaultMenu.items.map(item => item), ...menuTemplate] - : menuTemplate; +// Topbar custom actions +ipcMain.on("open-devtools", () => { + if (mainWindow) mainWindow.webContents.openDevTools({ mode: 'detach' }); +}); +ipcMain.on("open-logs", () => { + if (logsFolderPath) shell.openPath(logsFolderPath); +}); +ipcMain.on("open-website", () => { + shell.openExternal("https://masteracnolo.github.io/FreedomLoader/index.html"); +}); +ipcMain.on("open-wiki", () => { + shell.openExternal("https://masteracnolo.github.io/FreedomLoader/pages/wiki.html"); +}); - Menu.setApplicationMenu(Menu.buildFromTemplate(mergedTemplate)); -} // App ready app.whenReady().then(async () => { @@ -141,7 +168,6 @@ app.whenReady().then(async () => { await createMainWindow(); AutoUpdater(mainWindow); - setupMenu(); } catch (err) { logger.error("Window or Server error :", err); app.quit(); diff --git a/package-lock.json b/package-lock.json index afa1ce3..dba5193 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "freedom-loader", - "version": "1.3.0", + "version": "1.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "freedom-loader", - "version": "1.3.0", + "version": "1.3.1", "dependencies": { "chalk": "^4.1.2", "debug": "^4.4.1", @@ -487,9 +487,9 @@ } }, "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, "license": "MIT", "dependencies": { @@ -547,7 +547,6 @@ "dev": true, "license": "BSD-2-Clause", "optional": true, - "peer": true, "dependencies": { "cross-dirname": "^0.1.0", "debug": "^4.3.4", @@ -563,13 +562,12 @@ } }, "node_modules/@electron/windows-sign/node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -586,7 +584,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -601,7 +598,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">= 10.0.0" } @@ -974,9 +970,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", "dependencies": { @@ -1110,6 +1106,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1375,23 +1372,43 @@ } }, "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", - "debug": "^4.4.0", + "debug": "^4.4.3", "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", + "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/boolean": { @@ -1857,9 +1874,9 @@ "license": "MIT" }, "node_modules/color-string": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.3.tgz", - "integrity": "sha512-r/wfcFshhORndnDjn3GtNVLA4QL4TAi0A/XIBNuWUIEAVyUBNWYLuckrDz/JM1aQlpIDzKuY5hAYdHcLYgwJsg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", "dependencies": { "color-name": "^2.0.0" @@ -1960,9 +1977,9 @@ } }, "node_modules/config-file-ts/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -2007,15 +2024,16 @@ } }, "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/content-type": { @@ -2070,8 +2088,7 @@ "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -2425,9 +2442,9 @@ } }, "node_modules/electron": { - "version": "37.10.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-37.10.0.tgz", - "integrity": "sha512-cVa3/q6kdIMrCTW1eMfkcItTcdBTj2HSlwbEYcDY8ol66mARdPOEsnX4bi/DO0oo4WM5jfA0YjxllE8Jnby2mg==", + "version": "37.10.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.10.3.tgz", + "integrity": "sha512-3IjCGSjQmH50IbW2PFveaTzK+KwcFX9PEhE7KXb9v5IT8cLAiryAN7qezm/XzODhDRlLu0xKG1j8xWBtZ/bx/g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2669,7 +2686,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", @@ -2690,7 +2706,6 @@ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -2722,16 +2737,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -2860,18 +2865,19 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.0", + "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", + "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", @@ -3013,9 +3019,9 @@ } }, "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", "dependencies": { "debug": "^4.4.0", @@ -3026,7 +3032,11 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/fn.name": { @@ -3066,9 +3076,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -3444,28 +3454,23 @@ "license": "BSD-2-Clause" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-proxy-agent": { @@ -3542,6 +3547,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "devOptional": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -4073,15 +4079,19 @@ } }, "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mimic-fn": { @@ -4644,7 +4654,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "commander": "^9.4.0" }, @@ -4662,7 +4671,6 @@ "dev": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": "^12.20.0 || >=14" } @@ -4780,24 +4788,24 @@ } }, "node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.10" } }, "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5042,25 +5050,29 @@ "optional": true }, "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serialize-error": { @@ -5081,9 +5093,9 @@ } }, "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -5093,6 +5105,10 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { @@ -5495,7 +5511,6 @@ "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" @@ -5559,7 +5574,6 @@ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -5574,7 +5588,6 @@ "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -5862,10 +5875,11 @@ } }, "node_modules/winston": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", diff --git a/package.json b/package.json index 8fb9fe7..cdf3322 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,14 @@ { "name": "freedom-loader", "productName": "Freedom Loader", - "version": "1.3.0", + "version": "1.3.1", "author": "MasterAcnolo", "description": "Freedom Loader", "main": "main.js", "scripts": { "start": "electron --trace-warnings .", - "dist": "electron-builder" + "dist": "electron-builder", + "update": "npm update" }, "dependencies": { "chalk": "^4.1.2", diff --git a/preload.js b/preload.js index a1f3787..2f0e8e8 100644 --- a/preload.js +++ b/preload.js @@ -5,3 +5,14 @@ contextBridge.exposeInMainWorld("electronAPI", { selectDownloadFolder: () => ipcRenderer.invoke("select-download-folder"), setProgress: (percent) => ipcRenderer.send("set-progress", percent) }); + +// Contrôles de fenêtre et outils custom pour la topbar +contextBridge.exposeInMainWorld("topbarAPI", { + minimize: () => ipcRenderer.send("window-minimize"), + maximize: () => ipcRenderer.send("window-maximize"), + close: () => ipcRenderer.send("window-close"), + openDevTools: () => ipcRenderer.send("open-devtools"), + openLogs: () => ipcRenderer.send("open-logs"), + openWebsite: () => ipcRenderer.send("open-website"), + openWiki: () => ipcRenderer.send("open-wiki") +}); diff --git a/public/assets/icon/close.svg b/public/assets/icon/close.svg new file mode 100644 index 0000000..1d747f8 --- /dev/null +++ b/public/assets/icon/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icon/maximize.svg b/public/assets/icon/maximize.svg new file mode 100644 index 0000000..24dc937 --- /dev/null +++ b/public/assets/icon/maximize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/icon/minimize.svg b/public/assets/icon/minimize.svg new file mode 100644 index 0000000..f5d42a4 --- /dev/null +++ b/public/assets/icon/minimize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/index.html b/public/index.html index f0eafd9..76d9296 100644 --- a/public/index.html +++ b/public/index.html @@ -12,10 +12,25 @@ + +
+
+ + + + +
+
+ + + +
+
+
@@ -80,12 +95,15 @@
+ v1.3.1 + + \ No newline at end of file diff --git a/public/script/topbar.js b/public/script/topbar.js new file mode 100644 index 0000000..0225ea8 --- /dev/null +++ b/public/script/topbar.js @@ -0,0 +1,24 @@ +// Ajout des listeners pour la topbar +function setupTopbarListeners() { + document.addEventListener('DOMContentLoaded', () => { + const { topbarAPI } = window; + if (!topbarAPI) return; + const minBtn = document.getElementById('minimize-btn'); + const maxBtn = document.getElementById('maximize-btn'); + const closeBtn = document.getElementById('close-btn'); + const devtoolsBtn = document.getElementById('devtools-btn'); + const logsBtn = document.getElementById('logs-btn'); + const websiteBtn = document.getElementById('website-btn'); + const wikiBtn = document.getElementById('wiki-btn'); + + if (minBtn) minBtn.onclick = () => topbarAPI.minimize(); + if (maxBtn) maxBtn.onclick = () => topbarAPI.maximize(); + if (closeBtn) closeBtn.onclick = () => topbarAPI.close(); + if (devtoolsBtn) devtoolsBtn.onclick = () => topbarAPI.openDevTools(); + if (logsBtn) logsBtn.onclick = () => topbarAPI.openLogs(); + if (websiteBtn) websiteBtn.onclick = () => topbarAPI.openWebsite(); + if (wikiBtn) wikiBtn.onclick = () => topbarAPI.openWiki(); + }); +} + +setupTopbarListeners(); diff --git a/public/styles/components/themebutton.css b/public/styles/components/themebutton.css index 84693e6..3031696 100644 --- a/public/styles/components/themebutton.css +++ b/public/styles/components/themebutton.css @@ -1,6 +1,6 @@ .theme-switcher { position: absolute; - top: 10px; + top: 60px; right: 10px; background: #242424; padding: 8px 12px; @@ -11,7 +11,7 @@ display: flex; align-items: center; gap: 8px; - z-index: 1000; + z-index: 1050; } .theme-switcher label { diff --git a/public/styles/layout/topbar.css b/public/styles/layout/topbar.css new file mode 100644 index 0000000..939b931 --- /dev/null +++ b/public/styles/layout/topbar.css @@ -0,0 +1,116 @@ +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + + position: fixed; + top: 0; + z-index: 1100; + + height: 48px; + width: 100%; + + background: #1f1f1f98; + color: #eaeaea; + + -webkit-app-region: drag; + user-select: none; + +} + +/* LEFT - custom buttons */ +.custom-controls { + display: flex; + align-items: center; + gap: 6px; + padding-left: 12px; +} + +/* RIGHT - window buttons */ +.window-controls { + display: flex; + align-items: center; +} + +/* GLOBAL BUTTON RESET */ +.topbar button { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + + -webkit-app-region: no-drag; + + display: flex; + align-items: center; + justify-content: center; + + transition: background 0.15s ease, transform 0.1s ease; + +} + +/* Custom buttons (Logs / Wiki / etc.) */ +.custom-controls button { + height: 32px; + padding: 0 14px; + + font-size: 15px; + border-radius: 8px; +} + +.custom-controls button:hover { + background: rgba(255, 255, 255, 0.12); +} + +/* Window buttons (Windows style) */ +.window-controls button { + width: 46px; + height: 48px; + + font-size: 12px; +} + +.window-controls button:hover { + background: rgba(255, 255, 255, 0.1); +} + +.window-controls img { + width: 27px; + height: 27px; + pointer-events: none; + filter: invert(100%); +} + + +#close-btn:hover { + background: #e81123; + color: #fff; +} + +/* Active effect */ +.topbar button:active { + background: rgba(255, 255, 255, 0.18); + transform: scale(0.9); +} + +#close-btn:active { + background: #c50f1f; + transform: scale(0.9); +} + +.version-badge { + position: fixed; + right: 18px; + bottom: 12px; + z-index: 2000; + font-size: 0.85em; + color: #b0b0b0; + background: none; + font-weight: 500; + border-radius: 6px; + padding: 2px 8px; + opacity: 0.7; + pointer-events: none; + box-shadow: none; + user-select: none; +} \ No newline at end of file diff --git a/public/styles/styles.css b/public/styles/styles.css index d0a3261..6472249 100644 --- a/public/styles/styles.css +++ b/public/styles/styles.css @@ -49,6 +49,47 @@ body { } +/* Scrollbar globale pour Chromium/Electron */ +body::-webkit-scrollbar { + width: 10px; + height: 10px; +} + +body::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.03); + border-radius: 5px; +} + +body::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.2); + border-radius: 5px; + border: 2px solid transparent; + background-clip: padding-box; + transition: background-color 0.2s ease, transform 0.2s ease; +} + +body::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.35); + transform: scaleX(1.05); +} + +/* Thème clair */ +body.light::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.05); +} + +body.light::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.25); +} + +body.light::-webkit-scrollbar-thumb:hover { + background-color: rgba(0, 0, 0, 0.45); +} + +.container{ + margin-top: 50px; +} + header p{ color: var(--subtitle-color); } diff --git a/ressources/yt-dlp.exe b/ressources/yt-dlp.exe index 5b72abe..ac0e0d8 100644 Binary files a/ressources/yt-dlp.exe and b/ressources/yt-dlp.exe differ diff --git a/server/discordRPC.js b/server/discordRPC.js index 591cc43..2a03678 100644 --- a/server/discordRPC.js +++ b/server/discordRPC.js @@ -15,7 +15,7 @@ function startRPC() { smallImageText: "By MasterAcnolo", startTimestamp: new Date(), details: `Open Source Download Tools - ${config.version}`, - state: "masteracnolo.github.io/No-Sense/FreedomLoader", + state: "masteracnolo.github.io/FreedomLoader", }; rpc.setActivity(presence); diff --git a/server/update.js b/server/update.js index d644bfc..a21908e 100644 --- a/server/update.js +++ b/server/update.js @@ -17,7 +17,9 @@ function AutoUpdater() { new Notification({ title: "Freedom Loader", body: `Update ${info.version} downloaded.` - }).show(); + }).on("click", () => + shell.openExternal("https://github.com/MasterAcnolo/Freedom-Loader/releases/latest") + ).show(); setTimeout(() => { autoUpdater.quitAndInstall();