mirror of
https://github.com/MasterAcnolo/Freedom-Loader.git
synced 2026-11-13 15:09:20 +01:00
Compare commits
8 Commits
f0971ebccc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69de9eb9fc | ||
|
|
cfa85649b3 | ||
|
|
773ed9550d | ||
|
|
ea3a475525 | ||
|
|
738d5ec62f | ||
|
|
aff7637358 | ||
|
|
7ee6d6fbe7 | ||
|
|
6aa3a39819 |
11
README.md
11
README.md
@@ -56,7 +56,7 @@ The primary goal is to make media downloading accessible to users who want offli
|
|||||||
|
|
||||||
### User Interface
|
### User Interface
|
||||||
|
|
||||||
- **Custom window controls** - Frameless window with custom top bar (optional)
|
- **Custom window controls** - Frameless window with custom top bar
|
||||||
- **Custom themes** - ZIP-based theme system with live preview
|
- **Custom themes** - ZIP-based theme system with live preview
|
||||||
- **Theme Workshop** - web-based theme creator and browser
|
- **Theme Workshop** - web-based theme creator and browser
|
||||||
- **Toast notifications** - in-app feedback system
|
- **Toast notifications** - in-app feedback system
|
||||||
@@ -151,6 +151,7 @@ freedom-loader
|
|||||||
|---------------|---------------------------------------------------------|--------------------------------------|
|
|---------------|---------------------------------------------------------|--------------------------------------|
|
||||||
| **Downloads** | `C:\Users\[USERNAME]\Downloads\Freedom Loader` | `~/Downloads/Freedom Loader` |
|
| **Downloads** | `C:\Users\[USERNAME]\Downloads\Freedom Loader` | `~/Downloads/Freedom Loader` |
|
||||||
| **Logs** | `C:\Users\[USERNAME]\AppData\Local\FreedomLoader\logs\` | `~/.local/share/FreedomLoader/logs/` |
|
| **Logs** | `C:\Users\[USERNAME]\AppData\Local\FreedomLoader\logs\` | `~/.local/share/FreedomLoader/logs/` |
|
||||||
|
| **Cache** | ``
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> The download folder can be changed anytime via the "Edit" button in the UI, on both platforms.
|
> The download folder can be changed anytime via the "Edit" button in the UI, on both platforms.
|
||||||
@@ -224,10 +225,8 @@ Freedom Loader can be configured either through the settings panel in the UI or
|
|||||||
### Available Options
|
### Available Options
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"autoUpdate": true,
|
|
||||||
"systemTray": true,
|
"systemTray": true,
|
||||||
"discordRPC": true,
|
"discordRPC": true,
|
||||||
"customTopBar": true,
|
|
||||||
"autoCheckInfo": true,
|
"autoCheckInfo": true,
|
||||||
"addThumbnail": true,
|
"addThumbnail": true,
|
||||||
"addMetadata": true,
|
"addMetadata": true,
|
||||||
@@ -241,6 +240,7 @@ Freedom Loader can be configured either through the settings panel in the UI or
|
|||||||
"downloadSystem": true,
|
"downloadSystem": true,
|
||||||
"notifySystem": true,
|
"notifySystem": true,
|
||||||
"enableHardwareAcceleration": true,
|
"enableHardwareAcceleration": true,
|
||||||
|
"showChanglogsAfterUpdate": true,
|
||||||
"theme": "dark"
|
"theme": "dark"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -249,10 +249,8 @@ Freedom Loader can be configured either through the settings panel in the UI or
|
|||||||
|
|
||||||
| Option | Type | Default | Description |
|
| Option | Type | Default | Description |
|
||||||
|------------------------------|---------|----------|------------------------------------------------------------|
|
|------------------------------|---------|----------|------------------------------------------------------------|
|
||||||
| `autoUpdate` | boolean | `true` | Enable automatic application updates |
|
| `systemTray` | boolean | `false` | Allow app to minimize on close |
|
||||||
| `systemTray` | boolean | `false` | Allow app to minimize on close [EXPERIMENTAL] |
|
|
||||||
| `discordRPC` | boolean | `true` | Enable Discord Rich Presence integration |
|
| `discordRPC` | boolean | `true` | Enable Discord Rich Presence integration |
|
||||||
| `customTopBar` | boolean | `true` | Use custom application top bar |
|
|
||||||
| `autoCheckInfo` | boolean | `true` | Automatically fetch video information on URL paste |
|
| `autoCheckInfo` | boolean | `true` | Automatically fetch video information on URL paste |
|
||||||
| `addThumbnail` | boolean | `true` | Embed thumbnail in downloaded audio files |
|
| `addThumbnail` | boolean | `true` | Embed thumbnail in downloaded audio files |
|
||||||
| `addMetadata` | boolean | `true` | Add metadata tags to downloaded files |
|
| `addMetadata` | boolean | `true` | Add metadata tags to downloaded files |
|
||||||
@@ -266,6 +264,7 @@ Freedom Loader can be configured either through the settings panel in the UI or
|
|||||||
| `downloadSystem` | boolean | `true` | Enable download system |
|
| `downloadSystem` | boolean | `true` | Enable download system |
|
||||||
| `notifySystem` | boolean | `true` | Enable system notifications |
|
| `notifySystem` | boolean | `true` | Enable system notifications |
|
||||||
| `enableHardwareAcceleration` | boolean | `true` | Enable Hardware Acceleration |
|
| `enableHardwareAcceleration` | boolean | `true` | Enable Hardware Acceleration |
|
||||||
|
| `showChanglogsAfterUpdate` | boolean | `true` | Auto-display changelog popup after and update |
|
||||||
| `theme` | string | `dark` | Current Theme Name |
|
| `theme` | string | `dark` | Current Theme Name |
|
||||||
|
|
||||||
### Supported Codecs
|
### Supported Codecs
|
||||||
|
|||||||
5
app/ipcHandlers.js
Normal file → Executable file
5
app/ipcHandlers.js
Normal file → Executable file
@@ -30,10 +30,8 @@ const { getChangelog, markChangelogSeen } = require("./changelogManager");
|
|||||||
* Acts as a basic validation layer for IPC "set-feature".
|
* Acts as a basic validation layer for IPC "set-feature".
|
||||||
*/
|
*/
|
||||||
const FEATURE_WHITELIST = new Set([
|
const FEATURE_WHITELIST = new Set([
|
||||||
"autoUpdate",
|
|
||||||
"systemTray",
|
"systemTray",
|
||||||
"discordRPC",
|
"discordRPC",
|
||||||
"customTopBar",
|
|
||||||
"autoCheckInfo",
|
"autoCheckInfo",
|
||||||
"addThumbnail",
|
"addThumbnail",
|
||||||
"addMetadata",
|
"addMetadata",
|
||||||
@@ -44,7 +42,8 @@ const FEATURE_WHITELIST = new Set([
|
|||||||
"theme",
|
"theme",
|
||||||
"createPlaylistFolders",
|
"createPlaylistFolders",
|
||||||
"notifySystem",
|
"notifySystem",
|
||||||
"enableHardwareAcceleration"
|
"enableHardwareAcceleration",
|
||||||
|
"showChanglogsAfterUpdate"
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ async function createMainWindow() {
|
|||||||
height: 800,
|
height: 800,
|
||||||
minWidth: 750,
|
minWidth: 750,
|
||||||
minHeight: 800,
|
minHeight: 800,
|
||||||
frame: !configFeatures.customTopBar,
|
frame: false, // Force custom topbar for consistent UI across platforms, and less maintenance headaches with native titlebar actions
|
||||||
devTools: !app.isPackaged,
|
devTools: !app.isPackaged,
|
||||||
show: false,
|
show: false,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
{
|
{
|
||||||
"autoUpdate": true,
|
|
||||||
"systemTray": false,
|
"systemTray": false,
|
||||||
"discordRPC": true,
|
"discordRPC": true,
|
||||||
"customTopBar": true,
|
|
||||||
"autoCheckInfo": true,
|
"autoCheckInfo": true,
|
||||||
"addThumbnail": true,
|
"addThumbnail": true,
|
||||||
"addMetadata": true,
|
"addMetadata": true,
|
||||||
@@ -16,5 +14,6 @@
|
|||||||
"downloadSystem": true,
|
"downloadSystem": true,
|
||||||
"notifySystem": true,
|
"notifySystem": true,
|
||||||
"enableHardwareAcceleration": true,
|
"enableHardwareAcceleration": true,
|
||||||
|
"showChanglogsAfterUpdate": true,
|
||||||
"theme": "dark"
|
"theme": "dark"
|
||||||
}
|
}
|
||||||
2
main.js
2
main.js
@@ -173,7 +173,7 @@ app.whenReady().then(async () => {
|
|||||||
|
|
||||||
if (configFeatures.discordRPC) startRPC();
|
if (configFeatures.discordRPC) startRPC();
|
||||||
|
|
||||||
if (configFeatures.autoUpdate) initAutoUpdater(getMainWindow());
|
initAutoUpdater(getMainWindow());
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error("Boot error:", err);
|
logger.error("Boot error:", err);
|
||||||
|
|||||||
@@ -124,38 +124,38 @@
|
|||||||
<summary>Advanced Settings</summary>
|
<summary>Advanced Settings</summary>
|
||||||
|
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<input type="checkbox" data-key="autoUpdate" id="autoUpdate">
|
<input type="checkbox" data-key="showChanglogsAfterUpdate" id="showChanglogsAfterUpdate">
|
||||||
<div class="setting-info">
|
<div class="setting-info">
|
||||||
<span class="setting-title">Auto Update</span>
|
<span class="setting-title">Show Changelogs After Update</span>
|
||||||
<small>Enable automatic app updates.</small>
|
<small>Display changelogs after each update.</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<input data-key="systemTray" id="systemTray" type="checkbox">
|
<input data-key="systemTray" id="systemTray" type="checkbox">
|
||||||
<div class="setting-info">
|
<div class="setting-info">
|
||||||
<span class="setting-title">System Tray</span>
|
<span class="setting-title">System Tray</span>
|
||||||
<small>Minimize app on close, in the System Tray. [EXPERIMENTAL]</small>
|
<small>Minimize app on close, in the System Tray.</small>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- <div class="setting-item">
|
<!-- <div class="setting-item">
|
||||||
<input type="checkbox" data-key="outputTitleCheck" id="outputTitleCheck">
|
<input type="checkbox" data-key="outputTitleCheck" id="outputTitleCheck">
|
||||||
<div class="setting-info">
|
<div class="setting-info">
|
||||||
<span class="setting-title">Output title (special chars)</span>
|
<span class="setting-title">Output title (special chars)</span>
|
||||||
<small>Check for unusual characters in output titles.</small>
|
<small>Check for unusual characters in output titles.</small>
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
|
|
||||||
<div class="setting-item">
|
|
||||||
<input data-key="autoCheckInfo" id="autoCheckInfo" type="checkbox">
|
|
||||||
<div class="setting-info">
|
|
||||||
<span class="setting-title">Auto Fetch Info</span>
|
|
||||||
<small>Automatically fetch information for new downloads.</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div> -->
|
||||||
|
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
|
<input data-key="autoCheckInfo" id="autoCheckInfo" type="checkbox">
|
||||||
|
<div class="setting-info">
|
||||||
|
<span class="setting-title">Auto Fetch Info</span>
|
||||||
|
<small>Automatically fetch information for new downloads.</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="setting-item">
|
||||||
<input type="checkbox" data-key="addMetadata" id="addMetadata">
|
<input type="checkbox" data-key="addMetadata" id="addMetadata">
|
||||||
<div class="setting-info">
|
<div class="setting-info">
|
||||||
<span class="setting-title">Add Metadata</span>
|
<span class="setting-title">Add Metadata</span>
|
||||||
@@ -171,13 +171,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-item">
|
<!-- <div class="setting-item">
|
||||||
<input type="checkbox" data-key="customTopBar" id="customTopBar">
|
<input type="checkbox" data-key="customTopBar" id="customTopBar">
|
||||||
<div class="setting-info">
|
<div class="setting-info">
|
||||||
<span class="setting-title">Custom Top bar</span>
|
<span class="setting-title">Custom Top bar</span>
|
||||||
<small>Use this if the topbar is missing or you prefer a custom one.</small>
|
<small>Use this if the topbar is missing or you prefer a custom one.</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
|
|
||||||
<div class="setting-item" style="margin-left: 32px; margin-top: 20px;">
|
<div class="setting-item" style="margin-left: 32px; margin-top: 20px;">
|
||||||
<div class="setting-info">
|
<div class="setting-info">
|
||||||
|
|||||||
7
public/script/changelog.js
Normal file → Executable file
7
public/script/changelog.js
Normal file → Executable file
@@ -226,10 +226,15 @@ async function closeChangelog() {
|
|||||||
|
|
||||||
/** Loads changelog data and opens the modal when unread releases exist. */
|
/** Loads changelog data and opens the modal when unread releases exist. */
|
||||||
async function loadChangelog() {
|
async function loadChangelog() {
|
||||||
|
|
||||||
|
const features = await window.electronAPI.getFeatures();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
changelogData = await window.electronAPI.getChangelog();
|
changelogData = await window.electronAPI.getChangelog();
|
||||||
if (!changelogData.error && changelogData.hasUnread) {
|
|
||||||
|
if (!changelogData.error && changelogData.hasUnread && features.showChanglogsAfterUpdate === true) {
|
||||||
openChangelog(changelogData.unreadReleases);
|
openChangelog(changelogData.unreadReleases);
|
||||||
|
window.electronAPI.logInfo("Showing Changelog");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Unable to load changelog:", error);
|
console.error("Unable to load changelog:", error);
|
||||||
|
|||||||
@@ -35,25 +35,26 @@ export function initTopBar() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function attachListeners(){
|
//* Disabled because i disabled native topbar for now, but keeping the code in case i want to re-enable it later
|
||||||
try{
|
// async function attachListeners(){
|
||||||
const featuresList = await window.electronAPI.getFeatures();
|
// try{
|
||||||
|
// const featuresList = await window.electronAPI.getFeatures();
|
||||||
|
|
||||||
if (!featuresList.customTopBar) {
|
// if (!featuresList.customTopBar) {
|
||||||
const topbar = document.getElementById("topbar");
|
// const topbar = document.getElementById("topbar");
|
||||||
const container = document.getElementById("container");
|
// const container = document.getElementById("container");
|
||||||
const themeSwitcher = document.getElementById("theme-switcher");
|
// const themeSwitcher = document.getElementById("theme-switcher");
|
||||||
|
|
||||||
if (topbar) topbar.style.display = "none";
|
// if (topbar) topbar.style.display = "none";
|
||||||
if (container) container.style.marginTop = "0";
|
// if (container) container.style.marginTop = "0";
|
||||||
if (themeSwitcher) themeSwitcher.style.top = "30px";
|
// if (themeSwitcher) themeSwitcher.style.top = "30px";
|
||||||
}
|
// }
|
||||||
|
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
console.error("Failed to load layout features for topbar:", error);
|
// console.error("Failed to load layout features for topbar:", error);
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
initTopBar()
|
initTopBar()
|
||||||
document.addEventListener("DOMContentLoaded", attachListeners)
|
//document.addEventListener("DOMContentLoaded", attachListeners)
|
||||||
@@ -1,21 +1,24 @@
|
|||||||
### Features
|
### Features
|
||||||
- **In-App Feedback**: Added a built-in feedback form allowing users to send feedback, bug reports, and daily logs directly to the development team.
|
- **In-App Feedback**: Added a built-in feedback form allowing users to send feedback, bug reports, and daily logs directly to the development team.
|
||||||
- **Community Contributions**: GitHub issues are now better maintained on the repository. If you want to contribute to the project, feel free to drop by and check out the `good first issue` tags!
|
- **Community Contributions**: GitHub issues are now better maintained on the repository. If you want to contribute to the project, feel free to drop by and check out the `good first issue` tags!
|
||||||
|
- **Changelog**: The changelog is now automatically displayed after an update (can be disabled if preferred).
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
- **Bundle Size**: Optimized assets and dependencies, reducing the overall application bundle size by approximately 50% on specific version.
|
- **Bundle Size**: Optimized assets and dependencies, reducing the overall application bundle size by approximately 30% for specific versions.
|
||||||
- **Updater UI**: Reworked the update notification for better clarity. Windows and AppImage users can download updates seamlessly in-app, while unsupported Linux package users are gracefully redirected to the manual download page. Flatpak (.rpm) and Snap (.snap) users are not informed, because that updates are handled by their respective package managers.
|
- **Updater UI**: Reworked the update notification for better clarity. Windows and AppImage users can download updates seamlessly in-app, while unsupported Linux package users are gracefully redirected to the manual download page. Flatpak and Snap users are not prompted, as updates are handled natively by their respective package managers.
|
||||||
- **Toast Notifications**: Refactored the style and overall UX of toast alerts.
|
- **Toast Notifications**: Refactored the style and overall UX of toast alerts.
|
||||||
- **Code Quality**: Implemented a linter to enforce coding standards.
|
- **Code Quality**: Implemented a linter to enforce coding standards.
|
||||||
|
|
||||||
### Bug Fixes
|
### Fixes
|
||||||
- **Auto-Updater**: Fixed a major issue causing 404 Not Found errors when attempting to download updates for `.AppImage` releases.
|
- **Auto-Updater**: Fixed a major issue causing `404 Not Found` errors when attempting to download updates for `.AppImage` releases.
|
||||||
- **Linux Updates**: Fixed update crashes on `.rpm` and `.snap` packages. In-app update flows are now disabled for these formats to let the OS natively handle the process.
|
- **Linux Updates**: Fixed update crashes on `.rpm` and `.snap` packages. In-app update flows are now disabled for these formats to let the OS handle the process natively.
|
||||||
- **Windows Logs**: Fixed a file naming issue with the log transport system on Windows.
|
- **Windows Logs**: Fixed a file naming issue with the log transport system on Windows.
|
||||||
- **Desktop Entry Name**: Fixed the desktop entry name for Linux users, ensuring it displays correctly in application menus.
|
- **Desktop Entry Name**: Fixed the desktop entry name for Linux users, ensuring it displays correctly in application menus.
|
||||||
|
- **Custom Top Bar**: Removed the `customTopBar` settings.
|
||||||
|
- **Auto Update**: Removed the `autoAppUpdate` settings.
|
||||||
|
- **UI (System Tray)**: Removed the ***[EXPERIMENTAL]*** label from the config panel.
|
||||||
|
|
||||||
### Chores
|
### Chores
|
||||||
- **Dependencies**: Removed `dotenv` from the project.
|
- **Dependencies**: Removed `dotenv` from the project.
|
||||||
- **URL**: A new URL for the website is now available ! [freedomloader.acnolo.fr](https://freedomloader.acnolo.fr)
|
- **Website**: A brand new website URL is now available: [freedomloader.acnolo.fr](https://freedomloader.acnolo.fr)
|
||||||
- **Dev**: Add new npm script. To check linux file quality
|
- **Dev**: Added a new npm script to check Linux file quality.
|
||||||
|
|
||||||
@@ -67,9 +67,7 @@ function buildYtDlpArgs({url, audioOnly, quality, outputFolder, isPlaylist}) {
|
|||||||
|
|
||||||
logger.info("--- CONFIGURATION ---");
|
logger.info("--- CONFIGURATION ---");
|
||||||
|
|
||||||
logger.info(`CONFIG autoUpdate: ${configFeatures.autoUpdate}`);
|
|
||||||
logger.info(`CONFIG discordRPC: ${configFeatures.discordRPC}`);
|
logger.info(`CONFIG discordRPC: ${configFeatures.discordRPC}`);
|
||||||
logger.info(`CONFIG customTopBar: ${configFeatures.customTopBar}`);
|
|
||||||
logger.info(`CONFIG autoCheckInfo: ${configFeatures.autoCheckInfo}`);
|
logger.info(`CONFIG autoCheckInfo: ${configFeatures.autoCheckInfo}`);
|
||||||
logger.info(`CONFIG keepPlaylistOrder: ${configFeatures.keepPlaylistOrder}`);
|
logger.info(`CONFIG keepPlaylistOrder: ${configFeatures.keepPlaylistOrder}`);
|
||||||
logger.info(`CONFIG addThumbnail: ${configFeatures.addThumbnail}`);
|
logger.info(`CONFIG addThumbnail: ${configFeatures.addThumbnail}`);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ jest.mock("../../server/helpers/path.helpers.js", () => ({
|
|||||||
|
|
||||||
jest.mock("../../config.js", () => ({
|
jest.mock("../../config.js", () => ({
|
||||||
configFeatures: {
|
configFeatures: {
|
||||||
autoUpdate: false,
|
|
||||||
discordRPC: false,
|
discordRPC: false,
|
||||||
customTopBar: false,
|
customTopBar: false,
|
||||||
autoCheckInfo: false,
|
autoCheckInfo: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user