452 Commits
main ... 1.6.1

Author SHA1 Message Date
Axel Nicolas
730069a3c6 Merge pull request #46 from MasterAcnolo/1.6.1
1.6.1
2026-08-07 22:27:33 +02:00
MasterAcnolo
7a0cbd7456 refactor: changed /info router from POST to GET 2026-08-07 21:13:12 +02:00
MasterAcnolo
5d676b45e7 refactor: moved "Auto Fetch Info" settings to advanced settings 2026-08-07 21:06:11 +02:00
MasterAcnolo
a7f3d84a7d fix: log start format and smalls coms fix 2026-08-07 21:04:28 +02:00
MasterAcnolo
fbce5e5b7b update: dependencies 2026-08-05 22:51:55 +02:00
MasterAcnolo
cc7cc38392 feat: automatic release creation with scripts 2026-08-05 22:51:31 +02:00
MasterAcnolo
6a9e5a063b refactor: notify.helpers.js logic. Add a timeout and a better notification management to avoid race condition on Unix Systems 2026-08-05 22:16:15 +02:00
MasterAcnolo
cf8c95711c refactor: notify.helpers.js logic. Add a timeout and a better notification management to avoid race condition on Unix Systems 2026-08-05 22:15:53 +02:00
MasterAcnolo
3683e4245f fix: enhance readme with keepPlaylistOrder information. And fix some typo to fix Linux Env 2026-08-05 22:10:44 +02:00
MasterAcnolo
01affd8ddf feat: Keep Playlist Order features. Add index before title if it's a playlist and we activate this feature. 2026-08-05 21:52:14 +02:00
MasterAcnolo
faba3f516b fix: unit test wrong folder 2026-08-05 21:49:37 +02:00
MasterAcnolo
c1d9448a2b fix: bump version to 1.6.1 and update electron to 43.3.0 2026-08-05 21:49:25 +02:00
MasterAcnolo
1bff8376b4 fix: force artifact name for exe 2026-08-04 22:04:20 +02:00
MasterAcnolo
3f44c01bd7 fix: refresh config at every download. Used by CreatePlaylistFolder 2026-08-04 22:03:55 +02:00
MasterAcnolo
d0bdd887e3 fix: exclude dist, release and build folder from jest config 2026-08-02 21:40:39 +02:00
MasterAcnolo
609ac2eadb fix: better dev mode comparaison, useful for tests 2026-08-02 09:25:39 +02:00
MasterAcnolo
c484d322bf feat: unit tests for buildArgs and Notify 2026-08-02 09:25:05 +02:00
Axel Nicolas
b321a1d164 Merge pull request #45 from MasterAcnolo/linux-version
1.6.0 - Linux version
2026-07-28 21:38:03 +02:00
MasterAcnolo
89e6fcf9bc fix: snap Store package.json arguments 2026-07-28 20:43:04 +02:00
MasterAcnolo
ba2f317551 fix: snap Store mention in SECURITY.md 2026-07-28 20:42:51 +02:00
MasterAcnolo
553e383c94 refactor: rpm package publish 2026-07-27 22:40:30 +02:00
MasterAcnolo
89cc0b85a3 refactor: rpm package publish 2026-07-27 22:40:22 +02:00
MasterAcnolo
abd0bf9006 refactor: rpm package publish 2026-07-27 22:40:19 +02:00
MasterAcnolo
653f73805e fix: enhance package.json and rename linux package to freedom-loader 2026-07-27 22:15:19 +02:00
Axel Nicolas
4f03c5876f Merge pull request #44 from MasterAcnolo/sync
Sync
2026-07-26 15:15:52 +02:00
MasterAcnolo
a5f05f32af fix: readme missing items and [!TIP] 2026-07-26 11:21:23 +02:00
MasterAcnolo
0d1b1e4919 refactor: security.md 2026-07-26 09:37:39 +02:00
MasterAcnolo
0e77a94ec7 feat: enhance logger by displaying systeminfo at start of the app 2026-07-26 09:37:27 +02:00
MasterAcnolo
7f481d20b2 sync: update dependencies and this is ready for windows 2026-07-25 12:49:36 +02:00
MasterAcnolo
1ff32ca021 sync: to work on windows 2026-07-25 11:32:48 +02:00
MasterAcnolo
90d8a9f65d fix: correct use of logger for path.helpers.js 2026-07-22 20:41:54 +02:00
MasterAcnolo
d5965c2ce0 fix: bring back theme features for Linux 2026-07-22 18:44:30 +02:00
MasterAcnolo
15f59a6093 fix: bring back theme features for Linux 2026-07-22 18:16:33 +02:00
MasterAcnolo
8b31436e25 feat: publish package to fedora copr, add script to automaticaly build and upload the file.
Enhance readme and fix auto updater issue
2026-06-29 10:44:17 +02:00
MasterAcnolo
7d5203001b add: BINARIES.md readme file. About how to install the binaries for dev mode 2026-06-28 21:49:53 +02:00
MasterAcnolo
60709c4fad fix: don't show dialog box if no previous version is available. 2026-06-28 21:48:24 +02:00
MasterAcnolo
2fb6509edc add: dark.zip and white.zip theme to the repo 2026-06-28 21:34:26 +02:00
MasterAcnolo
eebce83976 fix: small code quality and mismatch. 2026-06-28 21:34:00 +02:00
MasterAcnolo
a56a070bc8 feat: support Linux. Refactor resources architecture. Create build script
Currently, themes are disabled and firefox notification too.
2026-06-28 21:32:49 +02:00
MasterAcnolo
e1ef7032bb add: default theme applied in app. If no theme is there 2026-06-18 21:55:50 +02:00
MasterAcnolo
e7333b7b6b fix: missing enableHardwareAcceleration settings in readme 2026-06-10 21:43:38 +02:00
Axel Nicolas
e2b51d32d1 Merge pull request #43 from MasterAcnolo/1.6.0
1.5.1
2026-06-02 22:47:40 +02:00
MasterAcnolo
81515c6ab8 fix: revert version to 1.5.1 in package.json and README.md 2026-06-02 22:35:29 +02:00
MasterAcnolo
c88189b44f feat: add Devtron in dev mode
remove unused settings item
add setting to disable hardware acceleration (enabled by default)
optimize main.js startup loading
2026-06-01 22:39:12 +02:00
MasterAcnolo
b745ebd29f fix: display "dev" in app version if the app is not packaged 2026-05-31 21:45:56 +02:00
MasterAcnolo
13ee4c170b fix: fix width for form 2026-05-31 21:12:35 +02:00
MasterAcnolo
0218664c5a refactor: add full documentation and fix theme loading robustness
- Add JSDoc comments across frontend and backend modules
- Improve code readability and maintainability with consistent documentation style
- Document Electron IPC handlers, UI utilities, and theme system
- Add missing function/class documentation in theme loader and app services
- Minor structural improvements and cleanup across Electron main process modules
- Minor fixes on variable names
2026-05-31 20:38:42 +02:00
MasterAcnolo
6afc5e06d6 fix: app startup. Can't start another instance now. 2026-05-31 15:48:20 +02:00
MasterAcnolo
519dcad6e6 fix: rename localMode => devMode for clarity 2026-05-29 07:42:49 +02:00
MasterAcnolo
ac94d68224 fix: rename localMode => devMode for clarity 2026-05-29 07:42:38 +02:00
MasterAcnolo
0f876fcb70 fix: update dependencies 2026-05-29 07:41:54 +02:00
MasterAcnolo
a6c11ba7c4 update: version for 1.6.0 2026-05-15 19:57:33 +02:00
MasterAcnolo
44132dd7b5 fix: update dependencies 2026-05-11 21:14:00 +02:00
MasterAcnolo
15ab6892b7 Fix: remove duplication roadmap (now full in website) 2026-05-01 12:07:39 +02:00
MasterAcnolo
725b6f0ada Fix: Configuration File Location 2026-04-15 13:55:13 +02:00
MasterAcnolo
ad0e4f858b Fix: missing options in readme 2026-04-15 13:50:39 +02:00
MasterAcnolo
68108e3a66 Update Workshop link to GitHub repository 2026-04-14 11:28:53 +02:00
MasterAcnolo
eff2affd42 1.5.0 !!!!!!
IT'S TIME
2026-04-14 11:20:48 +02:00
MasterAcnolo
87cf05643f Feat: Update README with detailed project structure and architecture overview 2026-04-14 11:04:55 +02:00
MasterAcnolo
ce14b8abd7 Fix: Remove emoji from error messages in download and info controllers 2026-04-14 09:31:23 +02:00
MasterAcnolo
44ed1bbf0e Feat: Add link to the most recent roadmap in README 2026-04-14 09:25:59 +02:00
MasterAcnolo
e0d017d9fd Fix: Remove z-index from container styles and add z-index to settings button 2026-04-14 09:22:31 +02:00
MasterAcnolo
c3ea1ac0bd Feat: Add section for submitting community themes in README 2026-04-14 09:22:24 +02:00
MasterAcnolo
238d4ea717 Fix: Save Themes inside "AppData" 2026-04-13 21:49:19 +02:00
MasterAcnolo
d879a5eb1d Feat: Add dynamic icon path for main window based on local mode 2026-04-13 20:57:56 +02:00
MasterAcnolo
40bea35286 Feat: Implement notification feature for download completion 2026-04-13 20:39:23 +02:00
MasterAcnolo
83ac76381a Fix: Update links to Freedom-Loader-Site in documentation and IPC handlers 2026-04-13 20:20:47 +02:00
MasterAcnolo
6ff0c71be7 Feat: Add related repository links for website and workshop in README 2026-04-13 19:48:09 +02:00
MasterAcnolo
fd0b339bcc Fix: Update link to Freedom Loader Workshop in README 2026-04-13 19:15:33 +02:00
MasterAcnolo
bc5faf38b6 Fix: Correct typo in Workshop badge link in README 2026-04-13 19:14:35 +02:00
MasterAcnolo
e744e55475 Feat: Add Theme Workshop section to README and update features list 2026-04-13 19:13:04 +02:00
MasterAcnolo
a581c9309d Fix: Update external links for website and wiki in IPC handlers 2026-04-13 19:13:00 +02:00
MasterAcnolo
61040769ee Feat: Add "Theme Workshop" button and associated IPC handler for workshop access 2026-04-12 21:40:13 +02:00
MasterAcnolo
06f6a30797 Feat: Enhance theme settings with new button styles for open theme and JSON options 2026-04-12 19:32:05 +02:00
MasterAcnolo
a2653eef57 Feat: Implement playlist download count tracking during downloads with UI updates 2026-04-12 18:24:19 +02:00
MasterAcnolo
89573d11f7 Fix: Adjust z-index for reference 2026-04-12 18:17:43 +02:00
MasterAcnolo
f0c28a7f5e Fix: Moving Custom Top BAr Settings into advanced 2026-04-12 18:15:19 +02:00
MasterAcnolo
f3c37c2498 Feat: Add createPlaylistFolders feature to organize downloads into dedicated folders with toggle settings 2026-04-12 18:13:38 +02:00
MasterAcnolo
8fe4e7c38a Fix: Update save path display to include title attribute for better accessibility 2026-04-12 17:40:01 +02:00
MasterAcnolo
912f4042e5 Fix: Enhance error handling for playlist fetch failures by retrying with single video 2026-04-12 17:34:17 +02:00
MasterAcnolo
5dc61b4a15 Fix: Adjust stop button hover scale effect for better user experience 2026-04-12 17:28:13 +02:00
MasterAcnolo
5fb49b0c9d Fix: Update button text 2026-04-12 17:04:20 +02:00
MasterAcnolo
75fdf91fcd Refactor: auto-update functionality with user prompts and download progress 2026-04-12 16:57:39 +02:00
MasterAcnolo
011e0a703a Feat: Enhance download experience with progress indicators and toast notifications 2026-04-12 12:04:05 +02:00
MasterAcnolo
5aebc78d44 Fix: IPC button not working 2026-04-12 11:22:31 +02:00
MasterAcnolo
60137a15dc Feat: Implement download cancellation feature with stop button and progress handling 2026-04-12 11:22:18 +02:00
MasterAcnolo
d05b9e2511 Feat: Add theme reloading functionality with refresh button in settings panel 2026-04-12 09:32:15 +02:00
MasterAcnolo
ebb48f4f8b Fix: Remove themes from the theme order array 2026-04-11 22:38:25 +02:00
MasterAcnolo
8be47b9821 Feat: Implement splash screen with progress indicators during startup 2026-04-11 22:36:42 +02:00
MasterAcnolo
ca8b107f61 Fix: Display custom these with a basic order 2026-04-11 22:16:05 +02:00
MasterAcnolo
f25d07cb83 Fix: Remove empty title tag from index.html and unused app styles from styles.css 2026-04-11 22:15:49 +02:00
MasterAcnolo
49e1e1b507 Feat: Add theme folder access functionality in UI 2026-04-11 18:25:17 +02:00
MasterAcnolo
23d11d8933 Feat: Custom Theme features and clean the old one 2026-04-11 18:10:51 +02:00
MasterAcnolo
9f88fe19c3 Fix: Theme Saving 2026-04-11 16:37:35 +02:00
MasterAcnolo
9b4b0306c7 fix: move config to AppData to prevent settings loss on update, add config.dev.json for dev environment 2026-04-11 16:33:58 +02:00
MasterAcnolo
96401a6e1f Refactor: split main.js into app/ modules 2026-04-11 16:14:21 +02:00
MasterAcnolo
0c7103c5c9 Update: Readme version and file structure 2026-04-11 16:13:36 +02:00
MasterAcnolo
798084e3bf Fix: Remove unusued element 2026-04-11 16:00:51 +02:00
MasterAcnolo
5c4e6669fe Fix: Update theme JSON structure for audio and button settings 2026-04-11 15:18:11 +02:00
MasterAcnolo
00c542925c Refactor: Update CSS variables
Fix Progress bar
2026-04-11 15:17:05 +02:00
MasterAcnolo
24460cf0b5 Refactor: Restructure HTML layout and enhance CSS styles for improved UI 2026-04-11 14:20:05 +02:00
MasterAcnolo
a3c1b1d753 Fix: Settings Secondary Color in LIght THeme 2026-04-11 14:01:39 +02:00
MasterAcnolo
5ade3fe144 Merge pull request #39 from MasterAcnolo/1.5.0
1.4.7
2026-04-09 13:46:20 +02:00
MasterAcnolo
577069b471 Fix: Remove unusued pictures 2026-04-09 13:35:04 +02:00
MasterAcnolo
a4da47647a Update: App Version in ReadME 2026-04-09 13:31:58 +02:00
MasterAcnolo
c5b29a0647 Update: Dependencies 2026-04-08 15:04:56 +02:00
MasterAcnolo
90e1a5fde7 Merge pull request #36 from MasterAcnolo/1.4.6
1.4.6
2026-03-18 10:00:17 +01:00
MasterAcnolo
dcfea2073c Fix: Wrong files Path 2026-03-18 09:20:25 +01:00
MasterAcnolo
0be1ef1710 Update: YT-DLP 2026-03-18 09:13:56 +01:00
MasterAcnolo
da393b19d9 Refactor: Suffixe in helpers/ 2026-03-18 09:13:47 +01:00
MasterAcnolo
1c27cc19cf Fix: Remove unusued modules and disable devTools when packaged 2026-03-16 21:22:41 +01:00
MasterAcnolo
ff7366c46c Fix: Update YT-DLP 2026-03-16 21:22:24 +01:00
MasterAcnolo
459d4c6df4 Fix: Increment app version 2026-03-16 21:15:35 +01:00
MasterAcnolo
d2ca3e99d2 Fix: Dependencies 2026-03-16 21:15:17 +01:00
MasterAcnolo
8ad3ea55cc Docs: Update ReadME 2026-03-16 20:57:38 +01:00
MasterAcnolo
71dbd104f8 Merge pull request #35 from MasterAcnolo/working
1.4.5
2026-02-21 13:00:36 +01:00
MasterAcnolo
57a5defb08 Fix: Update Dependencies 2026-02-21 12:43:36 +01:00
MasterAcnolo
25c78ff8b7 Fix: Increment App Version 2026-02-21 12:40:27 +01:00
MasterAcnolo
792a59d8d7 Feat: You can now fetch image from all website. 2026-02-21 12:38:57 +01:00
MasterAcnolo
b13c98dda2 Refactor: Translate all comms in English 2026-02-21 12:27:13 +01:00
MasterAcnolo
1f103c20b9 Fix: Remove Discord RPC Update. It's useless and take performance for nothing. 2026-02-19 22:23:30 +01:00
MasterAcnolo
70d62959ca Fix: Reduce Line Complexity featuresPath 2026-02-19 22:08:56 +01:00
MasterAcnolo
83ca963502 Merge with false positive
Merge with False positive
2026-02-18 15:10:01 +01:00
MasterAcnolo
9fb9295093 Fix: Try to re run workflow 2026-02-18 14:51:57 +01:00
MasterAcnolo
74fcdbb738 Fix: Undo Path Validation for coming back on a classic one 2026-02-18 14:43:40 +01:00
MasterAcnolo
32c9a66a35 Fix: Centralize default download path and enhance path validation logic 2026-02-17 23:29:31 +01:00
MasterAcnolo
45e0840fea Fix: Correct windowMs value in rate limit configuration to 15 minutes 2026-02-17 23:26:01 +01:00
MasterAcnolo
19b3f8b947 Fix: Refactor conditional statements for starting Discord RPC and Auto Update 2026-02-17 21:49:52 +01:00
MasterAcnolo
cc5bde5b48 Fix: Correct comment for rate limit window duration in rateLimit.js 2026-02-17 21:49:43 +01:00
MasterAcnolo
9a48ac05e3 Fix: Uncomplete comments and remove repeated code 2026-02-17 21:42:12 +01:00
MasterAcnolo
5750444655 Fix: Update full changelog link format in release template 2026-02-17 21:35:57 +01:00
MasterAcnolo
fdb22f2342 Fix: Improve browser detection logging and error handling 2026-02-17 21:29:51 +01:00
MasterAcnolo
760550e521 Fix: Centralize resource paths and icons 2026-02-17 21:28:46 +01:00
MasterAcnolo
334e83ae1f Fix: Small coms in AppVersion.js 2026-02-17 21:12:01 +01:00
MasterAcnolo
5d776594fc Fix: App Not Stopping correctly + Better Logs for end :) 2026-02-17 21:09:09 +01:00
MasterAcnolo
adb36e3fa2 Fix: We are not on apple system. Don't care about Darwin 2026-02-17 20:59:22 +01:00
MasterAcnolo
87945fba80 Fix: Missing semi colon, Better Folder Creation, And remove the fucking bad code who was repeat too much (wtf i did) 2026-02-17 18:05:07 +01:00
MasterAcnolo
2234f9ed81 Fix: Update version numbers to 1.4.4 in package.json and ReadME 2026-02-17 15:22:38 +01:00
MasterAcnolo
7cd3b4be06 Fix: Update playlist badge text to English 2026-02-17 15:19:23 +01:00
MasterAcnolo
a42b020b96 Fix: Update URL check to correctly identify playlist links 2026-02-17 15:19:17 +01:00
MasterAcnolo
c1e70dae80 Feat: Add Better playlist layout 2026-02-17 10:27:13 +01:00
MasterAcnolo
6877c51c0e Fix: Add Small Comms for clarity 2026-02-17 10:26:54 +01:00
MasterAcnolo
5a41090175 Fix: Remove Unusued Code 2026-02-17 10:26:39 +01:00
MasterAcnolo
5983f21759 Fix: Big mistake when estimating video format (? -> &) 2026-02-17 09:50:32 +01:00
MasterAcnolo
ee9e02410f Merge pull request #31 from MasterAcnolo/fix-input
1.4.3
2026-02-16 22:34:12 +01:00
MasterAcnolo
909480083e Fix: Update Dependencies 2026-02-16 22:00:31 +01:00
MasterAcnolo
ca0492ed04 Fix: Update ReadME App Version 2026-02-16 21:37:24 +01:00
MasterAcnolo
6c73dd75be Feat: Add Paste BTN URL Input 2026-02-16 21:34:39 +01:00
MasterAcnolo
556dccec08 Fix: Increment App version 2026-02-16 21:29:24 +01:00
MasterAcnolo
f720d7c889 Merge pull request #30 from MasterAcnolo/fix
1.4.2
2026-02-06 22:55:43 +01:00
MasterAcnolo
bb23f37fb5 Fix: Update release badge to version 1.4.2 2026-02-06 22:38:19 +01:00
MasterAcnolo
220e81d8b2 Fix: 1.4.2 Version 2026-02-06 22:37:05 +01:00
MasterAcnolo
44d8772827 Fix: yt-dlp update 2026-02-06 22:23:31 +01:00
MasterAcnolo
335fb9652b Fix: Dependencies Vulnerability 2026-02-06 22:11:43 +01:00
MasterAcnolo
243b98cbf9 Merge branch 'fix' of https://github.com/MasterAcnolo/Freedom-Loader into fix 2026-02-06 22:01:01 +01:00
MasterAcnolo
23da75a17b Potential fix for code scanning alert no. 5: Type confusion through parameter tampering
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2026-02-06 22:00:50 +01:00
MasterAcnolo
756d2c048e Update: YT-DLP 2026-02-05 16:05:33 +01:00
MasterAcnolo
659c1d4cf9 Update acknowledgments in README.md
Added acknowledgment for Deno and Jacques Chirac.
2026-02-03 17:48:59 +01:00
MasterAcnolo
443fd31170 Add: Additional dependencies section in README with required binaries 2026-02-03 14:01:59 +01:00
MasterAcnolo
6d8095ceb2 Mark completed tasks in the roadmap as strikethrough
Updated the roadmap to mark completed tasks as strikethrough.
2026-01-26 10:09:33 +01:00
MasterAcnolo
c18cb6c8aa Fix: ReadME 2026-01-25 21:34:40 +01:00
MasterAcnolo
a3c5025434 Fix: Bug Report Template 2026-01-25 21:31:35 +01:00
MasterAcnolo
3d7986cb87 Fix: Security 2026-01-25 21:28:23 +01:00
MasterAcnolo
3f8701567f Fix: Security, Contributing, Code Of Conduct 2026-01-25 21:27:28 +01:00
MasterAcnolo
ccb16c49d5 Feat: Templates for PR and Issues 2026-01-25 21:22:09 +01:00
MasterAcnolo
86d9ac3592 Update GitHub username for SpicyFire21 2026-01-25 21:08:33 +01:00
MasterAcnolo
43d87c2b47 Enhance README with detailed features list
Expanded features section with detailed descriptions of new functionalities including multi-format downloads, video information preview, quality selection, and more.
2026-01-25 21:04:38 +01:00
MasterAcnolo
19aa8ed8fa Revise README for improved structure and clarity
Updated README with new structure and content for clarity and organization.
2026-01-25 20:51:18 +01:00
MasterAcnolo
3ddfaa999e Fix: ReadME Version 1.4.1 2026-01-25 18:05:07 +01:00
MasterAcnolo
3d7f3b7481 1.4.1
1.4.1
2026-01-25 17:55:19 +01:00
MasterAcnolo
cfe2e17313 Add: App Version for 1.4.1 2026-01-25 17:45:14 +01:00
MasterAcnolo
dedf10c6b3 Fix: Discord RPC not Stoping #26 2026-01-25 17:32:29 +01:00
MasterAcnolo
ac0b4a0750 1.4.0 - It's time to sleep
1.4.0 - It's time to sleep
2026-01-22 22:09:24 +01:00
MasterAcnolo
29ca2ea496 Fix: Auto Update mispelling (Am a monkey) 2026-01-22 21:39:07 +01:00
MasterAcnolo
2a3905bdfb Add: Video Codec 2026-01-21 20:43:15 +01:00
MasterAcnolo
d3755ab57d Fix: Remove unusued "Settings.svg" icon 2026-01-21 20:25:34 +01:00
MasterAcnolo
9824e107fe Fix: Try to force AAC Audio Codec 2026-01-21 13:29:33 +01:00
MasterAcnolo
e437722937 Merge pull request #27 from MasterAcnolo/sync
Sync
2026-01-21 11:32:19 +01:00
MasterAcnolo
fd8c4ae33c Fix: Check Info config every request 2026-01-21 11:16:53 +01:00
MasterAcnolo
967144bd55 Fix: Config not working propely 2026-01-21 11:08:42 +01:00
MasterAcnolo
cd8eb05020 Fix: Remove Unusued Import 2026-01-21 11:08:20 +01:00
MasterAcnolo
590060e504 Fix: Reference position bottom 2026-01-20 22:34:33 +01:00
MasterAcnolo
26c7d4d2ee Because why not ? 2026-01-20 22:30:41 +01:00
MasterAcnolo
caa987fa42 Fix: Remove unusued files 2026-01-20 22:30:22 +01:00
MasterAcnolo
ccb090e4b2 Add: Settings theme color 2026-01-20 22:29:56 +01:00
MasterAcnolo
8d070ed10d Fix: Neon Theme rename 2026-01-20 22:29:22 +01:00
MasterAcnolo
343dbb26a2 Feat: Settings Panel 2026-01-20 22:28:53 +01:00
MasterAcnolo
fef4f6de36 Sync: Synchro Settings Panel 2026-01-18 14:23:17 +01:00
MasterAcnolo
1a61972750 Add: Settings Icon 2026-01-18 14:11:01 +01:00
MasterAcnolo
45ae5d7f98 Fix: Update Dependencies 2026-01-18 14:09:41 +01:00
MasterAcnolo
fecb123d0e Fix: Indent Index.html 2026-01-18 13:51:17 +01:00
MasterAcnolo
5c62ed081a Fix: Update ReadME Banner Redirection 2026-01-18 11:28:27 +01:00
MasterAcnolo
8f0f31041d Fix: Remove Unusued Dependencies 2026-01-16 09:42:32 +01:00
MasterAcnolo
0e48ab3b4c Fix: Default Theme Info Color 2026-01-16 09:42:09 +01:00
MasterAcnolo
d4c33bcf2d FIx: Updated Appliction Version because i did too much work to be a "minor release" 2026-01-15 22:54:40 +01:00
MasterAcnolo
2f105f5145 Fix: Put config.json file into config folder for better readability + Fix Yt-DLP Path 2026-01-15 22:01:26 +01:00
MasterAcnolo
b7a193b062 Fix: Remove unusued import server.js 2026-01-15 21:23:26 +01:00
MasterAcnolo
65364d3095 Fix: Update Dependencies 2026-01-15 21:22:57 +01:00
MasterAcnolo
c356e2e30d Fix: Using ASAR for every parts of the projects (the server is now in it) and i put the binaries in a /binaries folder. It's better for readability of the resources folder 2026-01-15 21:22:40 +01:00
MasterAcnolo
e45810b54c Add: Better logs. Write logs when a download is init 2026-01-15 16:22:29 +01:00
MasterAcnolo
55db30febc Fix: Remove Useless Console.log 2026-01-15 16:21:43 +01:00
MasterAcnolo
163faec221 Feat: Add Configuration Button. user can edit config.json as wanted. Linked and IPC 2026-01-15 16:01:24 +01:00
MasterAcnolo
5398fed928 Fix: Remove unusued Variable 2026-01-15 10:59:45 +01:00
MasterAcnolo
f959171db5 Feat: Add CustomVideo Codec Choice with verification in config.json 2026-01-15 10:57:37 +01:00
MasterAcnolo
01b6bcd02c Feat: Add Newline YT-DLP Args. Add Toggle Switches for verbose, autodownloadplaylist + Fix Thumbail misspell 2026-01-15 10:00:17 +01:00
MasterAcnolo
0ff4715b35 Fix: Correct Config.json file for packaged version 2026-01-15 09:28:46 +01:00
MasterAcnolo
745a73a5b0 Feat: Add version badge controlled. Before we needed to write with the hand for the front. But now there is an IPC event that provide App Version from package.json 2026-01-15 09:03:50 +01:00
MasterAcnolo
a69114edce Feat: Package Update + Add NSIS Installer Banner 2026-01-14 22:49:34 +01:00
MasterAcnolo
489a4766fa Feat: Path Verification (Security #4) 2026-01-14 21:47:38 +01:00
MasterAcnolo
adcee62386 Fix: ReadME Badge Version 2026-01-14 20:41:55 +01:00
MasterAcnolo
b867d819b7 Fix: Increment App Version for 1.3.2 2026-01-14 14:04:06 +01:00
MasterAcnolo
31d8b20a76 Feat: Implement Config File. Read by Front and Back. It aims to give possibility to disable some features quickly. Currenty: DiscordRPC, AutoCheckInfo, AutoUpdate, Custom TopBar, AddMetadata, Add Thumbail were put and implement. Other need to be implement. That's the begin of Settings Panel 2026-01-14 14:03:32 +01:00
MasterAcnolo
42ae0e7204 Feat: Add Codec H264 to vidéo output 2026-01-14 10:06:17 +01:00
MasterAcnolo
43869420c0 Update: Update Script + Dependencies 2026-01-14 10:04:38 +01:00
MasterAcnolo
6c9d296fbd Add: Some Variables in config.js. For Modules 2025-12-30 11:38:18 +01:00
MasterAcnolo
008428f10a Fix: Remove Unsued Import in Controller 2025-12-28 12:47:00 +01:00
MasterAcnolo
ae7d338474 Add: Rate Limit to front rendering. Using Components for reusability 2025-12-28 12:40:55 +01:00
MasterAcnolo
12ff25cc4b Fix: Error Handling Download Controller 2025-12-27 12:15:28 +01:00
MasterAcnolo
f31767e7e7 Fix: Error Handling Info Controller 2025-12-27 12:14:21 +01:00
MasterAcnolo
7c4f2841e1 Fix: Security #5 2025-12-27 11:41:52 +01:00
MasterAcnolo
a27b3555f6 Potential fix for code scanning alert no. 5: Type confusion through parameter tampering
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2025-12-27 11:39:30 +01:00
MasterAcnolo
c451ddd042 Add pull request template for consistent feature submissions 2025-12-20 13:51:55 +01:00
MasterAcnolo
da6311055f Replace feature and version templates in PULL_REQUEST_TEMPLATE directory 2025-12-20 13:46:47 +01:00
MasterAcnolo
945efb2059 Add feature issue template for improved feature requests 2025-12-20 13:46:00 +01:00
MasterAcnolo
ab2881f8e9 Add version template for changelog and roadmap 2025-12-20 13:45:39 +01:00
MasterAcnolo
f23811fff4 Create SECURITY.md 2025-12-20 13:39:50 +01:00
MasterAcnolo
19ab77501b Create CONTRIBUTING.md for project guidelines
Added a comprehensive contributing guide for Freedom Loader, outlining how to report issues, submit pull requests, and improve documentation.
2025-12-20 13:35:21 +01:00
MasterAcnolo
37eeed583a Add Contributor Covenant Code of Conduct
This document outlines the Contributor Covenant Code of Conduct, including our pledge, standards of behavior, enforcement responsibilities, and consequences for violations.
2025-12-20 13:29:21 +01:00
MasterAcnolo
caf08efb90 Update issue templates 2025-12-20 13:25:58 +01:00
MasterAcnolo
7ff998e4df Merge pull request #21 from MasterAcnolo/build
1.3.1
2025-12-20 11:41:36 +01:00
MasterAcnolo
0c1e8fe899 refactor: Remove setupMenu function and its invocation from app initialization 2025-12-20 11:28:04 +01:00
MasterAcnolo
4158e8c6e3 feat: Add version badge 2025-12-20 11:18:54 +01:00
MasterAcnolo
653319e408 style: Update z-index for theme switcher and topbar; add custom scrollbar styles 2025-12-20 10:23:39 +01:00
MasterAcnolo
0a4f14fba7 fix: Update topbar width to use 100% instead of 100vw for better responsiveness 2025-12-20 10:10:42 +01:00
MasterAcnolo
fb4571fc51 Fix: Update release badge to version 1.3.1 in README 2025-12-20 09:54:35 +01:00
MasterAcnolo
c11fd40681 feat: Implement topbar with custom window controls and actions 2025-12-20 09:53:17 +01:00
MasterAcnolo
cbfde8b761 Fix: Startup verif + Update Package 2025-12-20 09:11:25 +01:00
MasterAcnolo
c774821cc4 Refactor badge links in README for improved layout and consistency 2025-12-19 14:21:35 +01:00
MasterAcnolo
2ed15a32bc Refactor dependencies section in README for improved layout and styling 2025-12-19 14:20:39 +01:00
MasterAcnolo
c252853603 Refactor layout of dependencies section in README for improved styling 2025-12-19 14:18:43 +01:00
MasterAcnolo
cfdddec073 Refactor badge links in README for improved readability 2025-12-19 14:18:03 +01:00
MasterAcnolo
97a63ab791 Update version to 1.3.1 and add update script to package.json 2025-12-19 14:15:37 +01:00
MasterAcnolo
a0e00341e1 Add native dependencies check and error handling on startup 2025-12-19 14:11:37 +01:00
MasterAcnolo
26d42491ce Bump version to 1.3.1 and fix Discord RPC state URL; enhance update notification with clickable link to releases 2025-12-19 13:50:17 +01:00
MasterAcnolo
d678ba2f12 Merge Main 2025-12-19 13:47:07 +01:00
MasterAcnolo
55b400eb05 Merge branch 'main' into build 2025-12-19 13:47:06 +01:00
MasterAcnolo
0a6313b1f3 Update Freedom Loader link in README.md 2025-12-16 16:27:51 +01:00
MasterAcnolo
b4312376bb Version 1.3.0
It's Time. Remember The Goal.
2025-11-21 14:10:26 +01:00
MasterAcnolo
5ffb143a1a Size Reduce README 2025-11-21 13:54:16 +01:00
MasterAcnolo
ee24473077 Size Reduce README 2025-11-21 13:53:55 +01:00
MasterAcnolo
2b98a63f92 ReadME Firefox 2025-11-21 13:52:09 +01:00
MasterAcnolo
2e594d87e8 ReadME Firefox 2025-11-21 13:45:29 +01:00
MasterAcnolo
b343c2869d Added Website Top Menu Section 2025-11-21 13:44:32 +01:00
MasterAcnolo
094b93f4fa Update Banner 2025-11-20 21:21:45 +01:00
MasterAcnolo
cdc8a623c0 Fix Wiki Path + Icon + Bring Back Spicy Theme + New banner (Logo) 2025-11-20 21:18:04 +01:00
MasterAcnolo
2b43c00a3a Better RPC 2025-11-20 14:42:52 +01:00
MasterAcnolo
14928798d4 Bring Back Spicy Fire Theme from darkness 2025-11-20 13:53:49 +01:00
MasterAcnolo
e5fb44fc6b ReadME Change Logo 2025-11-20 12:58:08 +01:00
MasterAcnolo
9f9e4cd1d8 ReadME Fix 2025-11-20 12:48:50 +01:00
MasterAcnolo
45fe7336fe New Logo 2025-11-20 12:47:17 +01:00
MasterAcnolo
b909e7d917 main fix 2025-11-20 10:35:50 +01:00
MasterAcnolo
ce62748ade ReadME 2025-11-20 10:28:18 +01:00
MasterAcnolo
d4ecc36f6b ReadME 2025-11-20 10:27:23 +01:00
MasterAcnolo
fee364610e ReadME 2025-11-20 10:26:07 +01:00
MasterAcnolo
492af8525b ReadME 2025-11-20 10:25:19 +01:00
MasterAcnolo
fb58b5ae06 ReadME 2025-11-20 10:24:30 +01:00
MasterAcnolo
577034b0bd English Index.html audio 2025-11-20 10:23:07 +01:00
MasterAcnolo
6fc452edb4 ReadME 2025-11-20 09:55:31 +01:00
MasterAcnolo
086ca49599 ReadME 2025-11-20 09:54:45 +01:00
MasterAcnolo
be1de35da8 ReadME 2025-11-20 09:52:21 +01:00
MasterAcnolo
3c1f57667f ReadME 2025-11-20 09:51:28 +01:00
MasterAcnolo
5997cd20b4 ReadME 2025-11-20 09:51:05 +01:00
MasterAcnolo
6220c9400e ReadME 2025-11-20 09:49:01 +01:00
MasterAcnolo
48a16b927f ReadME 2025-11-20 09:48:21 +01:00
MasterAcnolo
87545d77b4 English 2025-11-20 08:32:38 +01:00
MasterAcnolo
4e0fe29c20 Anglais Fetch Info.js + Removed Files Check 2025-11-19 18:24:50 +01:00
MasterAcnolo
f8e3bc843d Change Language Main.js 2025-11-19 18:09:42 +01:00
MasterAcnolo
b3f1edaabd Better Log Components Path 2025-11-19 16:55:26 +01:00
MasterAcnolo
ef784dd19c Translate English 2025-11-19 16:48:07 +01:00
MasterAcnolo
69bbcee885 NO AID HERE 2025-11-18 21:09:25 +01:00
MasterAcnolo
60b4a99506 NO AID HERE 2025-11-18 18:06:39 +01:00
MasterAcnolo
c1030400f5 Notify Logic 2025-11-18 13:55:56 +01:00
MasterAcnolo
3f508da501 Info Loading Bar 2025-11-17 16:54:11 +01:00
MasterAcnolo
0437cb61a2 Change Error Info Box + Clean HTML 2025-11-17 16:40:05 +01:00
MasterAcnolo
1372582c54 SongBird Theme + Playlist Background For Every Theme 2025-11-17 16:25:32 +01:00
MasterAcnolo
070c3d507f Download Speed 2025-11-17 15:33:25 +01:00
MasterAcnolo
3e9c545952 Clean Code 2025-11-15 23:54:41 +01:00
MasterAcnolo
e3845e1849 Loading Bar taskbar 2025-11-15 23:52:43 +01:00
MasterAcnolo
91703d6a91 Using Download Route MVC Model 2025-11-15 23:34:20 +01:00
MasterAcnolo
cff3101b03 Push 2025-11-15 23:14:05 +01:00
MasterAcnolo
c9a48ec64c Using MVC Model + AutoDeteck Package + Fix Download/Info 2025-11-15 15:06:19 +01:00
MasterAcnolo
e6419a9759 Fix Deno Not Using on Info.js 2025-11-15 01:26:54 +01:00
MasterAcnolo
9d1d2fc7a8 Deno Integré + Progress Bar Fix + Small Clean 2025-11-15 00:50:45 +01:00
MasterAcnolo
cdca4a82ab Removed Cyberpunk | Spicy | Vilbrequin Theme, Info Fix, Fix Progress Bar. Centralized Ressources 2025-11-14 23:41:03 +01:00
MasterAcnolo
c2e4e12512 ProgressBar + Playlist 2025-11-14 18:42:15 +01:00
MasterAcnolo
96c1c6717d Playlist Card + Safe Args 2025-11-14 13:02:55 +01:00
MasterAcnolo
abf776175c UpperCase 2025-11-12 18:23:58 +01:00
MasterAcnolo
d6de184bfd Autoupdate + FreedomKiller Démarrage 2025-11-12 18:00:07 +01:00
MasterAcnolo
12249c4e8a Fix AutoUpdate 2025-11-12 15:58:05 +01:00
MasterAcnolo
f1fbc3f0c7 Version Config Depend PackageJSON 2025-11-12 15:53:06 +01:00
MasterAcnolo
bb8cf54bf9 Auto Update GitHub 2025-11-12 15:33:07 +01:00
MasterAcnolo
dccf8bd786 Change log file path for bug reports
Updated log file path in README for bug reports.
2025-11-12 15:04:01 +01:00
MasterAcnolo
793bb79d76 Fix Logs path readme 2025-11-12 15:03:45 +01:00
MasterAcnolo
f5cdf27ce6 Log Discord RPC 2025-11-12 15:01:10 +01:00
MasterAcnolo
627c56cd25 Discord RPC Fix 2025-11-12 14:59:11 +01:00
MasterAcnolo
783871d131 Documentation Bouton + Package Lock Update 2025-11-12 14:53:49 +01:00
MasterAcnolo
138c05f995 Removed Licence Preload 2025-11-09 15:16:59 +01:00
MasterAcnolo
5009a479af Removed console.log RPC 2025-11-09 15:16:15 +01:00
MasterAcnolo
2a95a10113 Removed Else Statement 2025-11-09 13:21:04 +01:00
MasterAcnolo
9d6065c80a Notify Error + Cookies Gestion 2025-11-09 13:19:54 +01:00
MasterAcnolo
cd8b2bf007 RPC Com 2025-11-09 10:46:33 +01:00
MasterAcnolo
1faf74fbc4 Port Lisible Server.js 2025-11-09 10:46:00 +01:00
MasterAcnolo
09163afbcd YTDLP Path DevMode 2025-11-09 10:44:34 +01:00
MasterAcnolo
405d141055 Fix Double Log Start 2025-11-09 10:40:06 +01:00
MasterAcnolo
599e09fa9f Helpers + Clean Download et Info 2025-11-09 10:35:19 +01:00
MasterAcnolo
4954de5f1a Push avant Clean 2025-11-09 09:04:57 +01:00
MasterAcnolo
ac854ae559 Préparation du Champ de Bataille 2025-11-08 15:11:25 +01:00
MasterAcnolo
9944f05139 ReadME Okay for 1.3 2025-11-08 15:02:05 +01:00
MasterAcnolo
f6558b656a Fix Version Mismatch (1.3.1 -> 1.3.0) 2025-11-08 14:58:29 +01:00
MasterAcnolo
bfbf57ba38 Package UPDATE For 1.3.1 2025-11-08 14:57:45 +01:00
MasterAcnolo
d0af35377c NPM Script Clear 2025-11-08 14:53:39 +01:00
MasterAcnolo
59c263a246 Change Apercu README 2025-11-08 14:12:52 +01:00
MasterAcnolo
42700bd7d8 LatestRelease No Space 2025-11-08 14:09:59 +01:00
MasterAcnolo
5a9b364b4b LatestRelease Space 2025-11-08 14:09:38 +01:00
MasterAcnolo
3619550c74 ReadME Fix 2025-11-08 14:09:04 +01:00
MasterAcnolo
31cc4012ac ReadME Fix 2025-11-08 14:08:42 +01:00
MasterAcnolo
2e329a8584 ReadME Fix 2025-11-08 14:06:57 +01:00
MasterAcnolo
d92dd59f86 ReadME Fix 2025-11-08 14:06:46 +01:00
MasterAcnolo
5bb7ca377d Removed ReadME FR and Rework ReadME 2025-11-08 14:05:15 +01:00
MasterAcnolo
9ee9a3574c Change project license from MIT to GNU License 2025-11-08 10:31:33 +01:00
MasterAcnolo
dc50a44682 Clear NPM Scripts 2025-10-31 18:00:48 +01:00
MasterAcnolo
4be5c14999 Merge pull request #16 from MasterAcnolo/build-branch
1.2.4
2025-09-27 11:15:41 +02:00
MasterAcnolo
b92ffebdb4 YT-DLP Maj Automatique 2025-09-27 11:10:34 +02:00
MasterAcnolo
7b6e48b09e Préparation 1.2.4 2025-09-26 07:50:09 +02:00
MasterAcnolo
368851b4bb Merge pull request #15 from MasterAcnolo/build-branch
1.2.3
2025-09-25 21:51:13 +02:00
MasterAcnolo
fa2da5712d ReadME Update 2025-09-25 21:48:38 +02:00
MasterAcnolo
7df97d70bb YT-DLP Update + Fix Crash 2025-09-25 21:43:14 +02:00
MasterAcnolo
5c5f595829 Fix Spicy Image 2025-09-21 09:57:47 +02:00
MasterAcnolo
5b659e3d8a ffprobe 2025-09-20 18:22:43 +02:00
MasterAcnolo
1a526777cc FFPROBE 2025-09-20 18:22:07 +02:00
MasterAcnolo
b0d99d4c29 Update project purpose in README-FR.md 2025-09-20 17:59:17 +02:00
MasterAcnolo
c7554475a9 Update README.md 2025-09-20 17:58:53 +02:00
MasterAcnolo
cab177e8a7 Merge pull request #14 from MasterAcnolo/build-branch
Build branch
2025-09-20 17:53:59 +02:00
MasterAcnolo
f7244a69ac ReadME Update 2025-09-20 17:42:15 +02:00
MasterAcnolo
c6ed79ed1d Title Window 2025-09-20 17:41:27 +02:00
MasterAcnolo
00e5358bbb Asar 2025-09-20 17:21:38 +02:00
MasterAcnolo
598c35eb54 Asar 2025-09-20 17:00:33 +02:00
MasterAcnolo
00c74ea6c6 Package Update + Notif Fix Issues#13 2025-09-20 16:51:46 +02:00
MasterAcnolo
0c415c9106 Merge pull request #12 from MasterAcnolo/build-branch
1.2.1
2025-09-17 12:29:53 +02:00
MasterAcnolo
b0495d033d FFMPEG Location 2025-09-17 11:10:48 +02:00
MasterAcnolo
d72cc6e0ca Correct Log Folder Name 2025-09-17 10:32:53 +02:00
MasterAcnolo
b59cb9f57f Fix Server.js Path 2025-09-17 10:30:48 +02:00
MasterAcnolo
af743be5b0 GitIgnore Fix 2025-09-13 16:18:17 +02:00
MasterAcnolo
024d039701 Package Updated for 1.2.1 + ReadME Fix 2025-09-13 15:41:19 +02:00
MasterAcnolo
e9a91656bc Package JSON Updated for 1.2.1 2025-08-31 18:09:16 +02:00
MasterAcnolo
3505606b44 ADD Licence 'discordRPC.js' 2025-08-31 18:04:07 +02:00
MasterAcnolo
815abae0a0 YT-DLP Moove 2025-08-31 16:30:54 +02:00
MasterAcnolo
004271241e Merge pull request #11 from MasterAcnolo/1.2
Update 1.2
2025-08-29 13:57:11 +02:00
MasterAcnolo
8295967ff2 ReadME Update 2025-08-29 13:45:52 +02:00
MasterAcnolo
053dca365c Package Update 2025-08-29 13:45:02 +02:00
MasterAcnolo
62110b1a5b Package Update 2025-08-29 13:38:20 +02:00
MasterAcnolo
aae9b2866c Discord RPC 2025-08-29 13:36:36 +02:00
MasterAcnolo
0d8bddbc20 ReadME Update 2025-08-29 12:17:46 +02:00
MasterAcnolo
2a7d61bab7 Inversion ReadME Principal 2025-08-29 12:16:12 +02:00
MasterAcnolo
de71035fa0 NF Theme + Ajustement Other Themes 2025-08-29 10:31:13 +02:00
MasterAcnolo
5368fb9311 Update YT-DLP 2025-08-28 10:37:14 +02:00
MasterAcnolo
3d583a9b6f Retrait '--Restrict Filenames' 2025-08-22 12:23:41 +02:00
MasterAcnolo
94de0a42f1 Merge pull request #6 from MasterAcnolo/1.2
1.1.3
2025-08-21 16:01:34 +02:00
MasterAcnolo
5ba2901273 ReadME Update 2025-08-21 15:50:51 +02:00
MasterAcnolo
f5888b8382 NPM Update 2025-08-21 15:49:09 +02:00
MasterAcnolo
6ece182629 Update YTDLP + New Icon 2025-08-21 11:27:03 +02:00
MasterAcnolo
777257b71d Clarification 2025-08-21 08:45:50 +02:00
MasterAcnolo
df0156d603 Add Metadata / Thumbail
Optimisation + Retries
2025-08-20 14:27:45 +02:00
MasterAcnolo
68cdad06ab Merge pull request #5 from MasterAcnolo/Notification-System
# Freedom Loader - 1.1.2

## Changelog

- Added a “Logs” menu in the toolbar to open the logs folder directly
- Fixed log path for better Windows/Linux compatibility
- Disabled hardware acceleration to improve stability on some systems
- Fixed Electron menu merging logic
- Various minor improvements and bug fixes

## Found a bug or issue?
- Please report it in the GitHub Issues section

## Next Release (non-exhaustive roadmap)
- More format options  
- Subtitle support  
- Improved UI / UX  
- Language selection  
- Download specific parts of videos  
- File renaming options  
- Video extraction/splitting using native chapters  
- Parallel downloads  
- Skip sponsored parts automatically  

**Full Changelog**: https://github.com/MasterAcnolo/Freedom-Loader/compare/1.1.1...1.1.2
2025-08-13 15:28:57 +02:00
MasterAcnolo
ee7c6520b9 ReadME Fix 2025-08-13 15:22:51 +02:00
MasterAcnolo
4ed1609e41 Logs Fix + Logs Button 2025-08-13 15:20:35 +02:00
MasterAcnolo
b64e61d45d Fix Download 2025-08-13 14:56:14 +02:00
MasterAcnolo
b4c2c865d8 Logger Error Fix 2025-08-13 14:34:00 +02:00
MasterAcnolo
e32ffd8fa0 NPM Update 2025-08-13 14:25:33 +02:00
MasterAcnolo
8be6a932e5 NPM Update 2025-08-13 14:22:51 +02:00
MasterAcnolo
6ed59fd272 Merge pull request #4 from MasterAcnolo/Notification-System
Notification system + YT DLP Update
2025-07-20 18:22:10 +02:00
MasterAcnolo
4df1cb207f ReadME Update 2025-07-20 18:17:19 +02:00
MasterAcnolo
d03e3bc7e5 Notif + Update YT DLP 2025-07-20 15:27:40 +02:00
MasterAcnolo
df02acb97f Notification + Open On CLICK 2025-07-03 18:28:56 +02:00
MasterAcnolo
6ef04700ab NPM Update 2025-07-03 15:39:03 +02:00
MasterAcnolo
766694f330 ReadME Fix 2025-07-02 22:38:38 +02:00
MasterAcnolo
93380b2f36 ReadME Fix 2025-07-02 22:38:15 +02:00
MasterAcnolo
8c969d694f ReadME Fix 2025-07-02 22:37:30 +02:00
MasterAcnolo
f2f3d42e8c ReadME Fix 2025-07-02 22:36:53 +02:00
MasterAcnolo
8d8973acfc ReadME Fix 2025-07-02 22:35:59 +02:00
MasterAcnolo
281bff2379 Merge pull request #3 from MasterAcnolo/1.0.2
1.1.1
2025-07-02 22:33:09 +02:00
MasterAcnolo
e30f54050f ReadME FIX 2025-07-02 22:28:30 +02:00
MasterAcnolo
0ae808c1a0 Merge branch '1.0.2' of https://github.com/MasterAcnolo/MP3-Downloader into 1.0.2 2025-07-02 22:27:46 +02:00
MasterAcnolo
2598573844 Package Fix 2025-07-02 22:27:44 +02:00
MasterAcnolo
27782376a3 Merge pull request #2 from MasterAcnolo/1.0.2
1.1
2025-07-02 22:26:28 +02:00
MasterAcnolo
876f7e1db0 Merge branch 'main' into 1.0.2 2025-07-02 22:26:14 +02:00
MasterAcnolo
db654c5f82 1.1 2025-07-02 22:24:46 +02:00
MasterAcnolo
751f3d5c3e Commentary + Custom PATH 2025-07-02 16:50:52 +02:00
MasterAcnolo
2a8d307bc8 Chirac Easter EGG 2025-07-02 16:17:09 +02:00
MasterAcnolo
ec6963cff3 Logs FIX + Bug FIX 2025-07-02 13:49:55 +02:00
MasterAcnolo
196a07977a Package FIX for 1.0.2 2025-07-02 10:50:10 +02:00
MasterAcnolo
f20366f0c7 Logs Fix 2025-07-01 20:34:22 +02:00
MasterAcnolo
f54dc18e85 ReadME Pictures Fix 2025-07-01 20:13:12 +02:00
MasterAcnolo
251049c7fe Undo last Commit 2025-07-01 15:37:13 +02:00
MasterAcnolo
5d347967b1 ReadMe Fix 2025-07-01 15:36:33 +02:00
MasterAcnolo
d5c506c4e0 ReadME Fix %20 2025-07-01 15:35:47 +02:00
MasterAcnolo
6718f4133e ReadME Fix %20 2025-07-01 15:35:24 +02:00
MasterAcnolo
9ff6678730 ReadME Fix 2025-07-01 15:34:36 +02:00
MasterAcnolo
3957450fdb ReadME Fix 2025-07-01 15:34:06 +02:00
MasterAcnolo
25e50a6e7a ReadME Fix 2025-07-01 15:33:31 +02:00
MasterAcnolo
22f935f678 ReadME Fix 2025-07-01 15:32:04 +02:00
MasterAcnolo
58b843630b ReadME Fix 2025-07-01 15:30:54 +02:00
MasterAcnolo
dec3f3272a ReadME Fix 2025-07-01 15:30:23 +02:00
MasterAcnolo
f3252c2548 ReadME Fix 2025-07-01 15:29:18 +02:00
MasterAcnolo
ac28afb17a ReadME Fix 2025-07-01 15:27:44 +02:00
MasterAcnolo
b1a42f44fa ReadME Fix 2025-07-01 15:26:21 +02:00
MasterAcnolo
78eea2fa0f ReadME Fix 2025-07-01 15:25:21 +02:00
MasterAcnolo
4290e6db52 Merge pull request #1 from MasterAcnolo/Développement-Branch
[PR] 1.0.1
2025-07-01 15:21:11 +02:00
MasterAcnolo
0ffc1af218 1.0.1 Commit 2025-07-01 15:16:17 +02:00
MasterAcnolo
10cefdba19 CSS Variable Begin 2025-07-01 13:51:42 +02:00
MasterAcnolo
c888946588 Logs Name Ajust + 1.0.1 Prepa 2025-06-30 13:49:02 +02:00
MasterAcnolo
9026c63979 Clarification 2025-06-29 15:48:06 +02:00
MasterAcnolo
cfc2c5bbaa Update README-EN.md 2025-06-29 14:13:24 +02:00
MasterAcnolo
a41da5c4c2 Update README.md 2025-06-29 14:12:40 +02:00
MasterAcnolo
b4242e4295 Correction Git Ignore 2025-06-29 14:10:58 +02:00
MasterAcnolo
1f0650a71c MD En + FR 2025-06-29 13:59:33 +02:00
MasterAcnolo
87fe8af6f5 Push 2025-06-29 13:57:00 +02:00
MasterAcnolo
592d3a5ae4 Push 2025-06-29 13:56:10 +02:00
MasterAcnolo
dc847a5a8c Correction 2025-06-29 13:55:40 +02:00
MasterAcnolo
250e6c3f23 Correction Path 2025-06-29 13:54:46 +02:00
MasterAcnolo
1ffe9dcea0 Push ReadME + License 2025-06-29 13:52:46 +02:00
MasterAcnolo
b40a4fc033 MD Push 2025-06-29 13:00:15 +02:00
MasterAcnolo
0900e1b485 Correction Path YT DLP 2025-06-29 12:09:37 +02:00
MasterAcnolo
432633af52 Fix NPM RUN DIST 2025-06-29 11:33:14 +02:00
MasterAcnolo
152ee39535 Working on my machine 2025-06-29 11:27:52 +02:00
MasterAcnolo
9d824f5c33 It Works on my machine 2025-06-28 22:36:03 +02:00
MasterAcnolo
accb55e538 Push 2025-06-28 21:25:57 +02:00
MasterAcnolo
bfb3e0cbdf Push avant l'enfer (PRIDEFUl - NF) 2025-06-28 21:19:48 +02:00
MasterAcnolo
b9460dbceb Aled 2025-06-28 20:54:37 +02:00
MasterAcnolo
1216e5f10d Push Version 1 2025-06-28 18:33:16 +02:00
MasterAcnolo
8b4b3c84e0 Push avant modif DIV INFO 2025-06-28 17:56:36 +02:00
MasterAcnolo
f7abca90cb LE POULET 2025-06-28 09:49:36 +02:00
MasterAcnolo
83b31cb645 CSS Beginning 2025-06-27 23:21:50 +02:00
MasterAcnolo
bb967834f0 Loading Screen 2025-06-27 23:11:42 +02:00
MasterAcnolo
e9f4b80b7b Fix Bug Download 2025-06-27 22:57:43 +02:00
MasterAcnolo
abd5295395 Diviser pour mieux régner 2025-06-27 22:48:24 +02:00
MasterAcnolo
d4d36c39ca Informations Vidéo 2025-06-27 15:42:46 +02:00
MasterAcnolo
95701bf56e Working V1 2025-06-27 15:02:35 +02:00
MasterAcnolo
7b93413050 Working V1 2025-06-27 09:47:11 +02:00
MasterAcnolo
c2c69935b1 Push 2025-06-26 20:40:55 +02:00
MasterAcnolo
07485f39ba OUII 2025-06-26 16:19:26 +02:00
MasterAcnolo
0c99e48950 CA MARCHE 2025-06-26 14:27:54 +02:00
45 changed files with 580 additions and 1362 deletions

View File

@@ -29,9 +29,6 @@ Clear description of the performance issue.
- **Storage**: [e.g. SSD/HDD]
- **Other Applications Opened**: [e.g. Discord/Opera GX]
> [!INFO]
> At the start of the application, SystemInfo is printed in the logs, so you can just copy and paste it!
## Reproduction Details
- **Download URL**: [if applicable]

View File

@@ -9,8 +9,8 @@ assignees: 'MasterAcnolo'
## Pre-submission Checklist
- [ ] I have checked the [FAQ](https://masteracnolo.github.io/Freedom-Loader-Site/#/faq)
- [ ] I have reviewed the [Wiki](https://masteracnolo.github.io/Freedom-Loader-Site/#/wiki)
- [ ] I have checked the [FAQ](https://masteracnolo.github.io/Freedom-Loader-Site/pages/faq)
- [ ] I have reviewed the [Wiki](https://masteracnolo.github.io/Freedom-Loader-Site/pages/wiki)
- [ ] I have searched existing issues
## Question

View File

@@ -2,7 +2,7 @@
Brief description of what this PR does.
## Related Issue (if applicable)
## Related Issue
Fixes #(issue number)
Closes #(issue number)
@@ -30,7 +30,7 @@ Related to #(issue number)
- [ ] I have tested with different download scenarios (video/audio, playlists)
- [ ] I have checked the application logs for errors
- [ ] I have verified the UI changes (if applicable)
- [ ] I have tested on Windows 10 and/or Windows 11 or in any Linux Distribution
- [ ] I have tested on Windows 10 and/or Windows 11
## Screenshots (if applicable)

View File

@@ -1,46 +0,0 @@
name: "CodeQL PR"
on:
pull_request:
branches: [ "main" ]
schedule:
- cron: '00 00 * * 1'
jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
permissions:
security-events: write
packages: read
actions: read
contents: read
strategy:
fail-fast: false
matrix:
include:
- language: javascript-typescript
build-mode: none
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
- name: Run manual build steps
if: matrix.build-mode == 'manual'
shell: bash
run: |
echo 'Manual build required'
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
with:
category: "/language:${{matrix.language}}"

4
.gitignore vendored
View File

@@ -17,10 +17,8 @@ config/config.dev.json
ffmpeg
ffprobe
deno
yt-dlp
# Windows Executable
ffmpeg.exe
ffprobe.exe
deno.exe
yt-dlp.exe
deno.exe

View File

@@ -93,5 +93,4 @@ chmod +x resources/binaries/linux/deno
## Notes
- These binaries are excluded from version control via `.gitignore`.
- Always use the latest stable release of each tool.
- **Yt-dlp** binaries don't need to be updated manually. At every startup of the application, the binary tries to update itself
- Always use the latest stable release of each tool.

View File

@@ -6,7 +6,6 @@ Welcome! Thanks for your interest in Freedom Loader. Your contributions—bug re
## Quick Links
- [Development Guide](DEVELOPMENT.md)
- [Code of Conduct](CODE_OF_CONDUCT.md)
- [Issue Templates](.github/ISSUE_TEMPLATE/)
- [Pull Request Templates](.github/PULL_REQUEST_TEMPLATE/)
@@ -24,7 +23,7 @@ Found a bug or unexpected behavior? Open an [**issue**](https://github.com/Maste
- Clear description of the bug
- Steps to reproduce
- App version and environment (Windows version, Firefox version if relevant)
- Logs from: `C:\Users\[USERNAME]\AppData\Local\FreedomLoader\logs\LOGS-YYYY-MM-DD.log` (Windows) or `~/.local/share/FreedomLoader/logs/` (Linux)
- Logs from: `C:\Users\[USERNAME]\AppData\Local\FreedomLoader\logs\LOGS-YYYY-MM-DD.log`
- Screenshots if applicable
### 2. Request a Feature
@@ -44,11 +43,13 @@ Have an idea to improve Freedom Loader? Open a [**Feature Request**](https://git
- Follow the project's code style and conventions
**Process:**
1. Fork the repository.
2. Check out our [**Developer Guide (DEVELOPMENT.md)**](./DEVELOPMENT.md) to set up your environment.
3. Create a feature branch following our branching conventions.
4. Make your changes and test thoroughly on Windows and/or Linux.
5. Open a Pull Request using the appropriate template.
1. Fork the repository
2. Create a feature branch: `git checkout -b feature/your-feature-name`
3. Make your changes
4. Test thoroughly on Windows 10/11
5. Commit with clear messages: `git commit -m "Add feature X"`
6. Push to your fork: `git push origin feature/your-feature-name`
7. Open a Pull Request using the appropriate template
**Code Guidelines:**
- Use camelCase for variables and functions
@@ -71,9 +72,41 @@ Small contributions matter—don't hesitate to submit documentation PRs.
## Development Setup
Want to write some code? Awesome!
### Prerequisites
- Node.js 16.x or higher
- npm or yarn
- Git
- Windows 10/11 (for testing)
Please read our [**Developer Guide (DEVELOPMENT.md)**](./DEVELOPMENT.md) for instructions on how to set up your local environment, our project architecture, and our Git branching rules.
### Setup
```bash
# Clone your fork
git clone https://github.com/YOUR-USERNAME/Freedom-Loader.git
cd Freedom-Loader
# Install dependencies
npm install
# Run in development mode
npm start
# Build for production
npm run build
```
### Project Structure
```
Freedom-Loader/
├── main.js # Electron main process
├── preload.js # Electron preload script
├── config.js # Global configuration
├── server/ # Express backend
│ ├── routes/ # API routes
│ ├── controller/ # Business logic
│ └── helpers/ # Utility functions
├── public/ # Frontend (HTML, CSS, JS)
└── resources/ # Binaries (yt-dlp, ffmpeg, etc.)
```
---
@@ -81,9 +114,12 @@ Please read our [**Developer Guide (DEVELOPMENT.md)**](./DEVELOPMENT.md) for ins
Before submitting a PR, verify:
- [ ] Download functionality works (video/audio)
- [ ] Playlist downloads work
- [ ] Settings panel functions correctly
- [ ] Custom path selection works
- [ ] No errors in application logs
- [ ] Any features wasn't break during the development
- [ ] Tested on Windows 10/11 and/or any Linux Distribution
- [ ] UI changes work on all themes (if applicable)
- [ ] Tested on Windows 10 and/or Windows 11
---
@@ -125,4 +161,4 @@ Check out his work: [IG @designmark_studio](https://www.instagram.com/designmark
---
**Thank you for contributing to Freedom Loader!**
**Thank you for contributing to Freedom Loader!**

View File

@@ -1,388 +0,0 @@
# Freedom Loader - Development Guide
Welcome to the Developer Guide! This document explains how to set up your local environment, project architecture, Git workflow, and the release process.
## Prerequisites
Before you begin, ensure you have the following installed on your machine:
- **Node.js** (v22 or higher recommended)
- **npm** (comes with Node.js)
- **Git**
- **yt-dlp binaries**: Freedom Loader requires native binaries to function. Read [BINARIES.md](./BINARIES.md) for download instructions and placement in `resources/binaries/`.
## Setup Instructions
### 1. Clone the repository
```bash
git clone https://github.com/MasterAcnolo/Freedom-Loader.git
cd Freedom-Loader
```
### 2. Install dependencies
```bash
npm install
```
### 3. Install the Binaries
Follow the instructions in `BINARIES.md` to place `yt-dlp`, `ffmpeg`, `ffprobe`, and `deno` in the correct `resources/binaries/` folder for your OS.
### 4. Run in Development Mode
```bash
npm start
```
**Note**: Development mode automatically enables detailed colored logs and the DevTron extension for debugging.
---
## Available Scripts
### Development
- `npm start` — Start the app in development mode (no warnings)
- `npm run start:warn` — Start with deprecation warnings visible
- `npm run start:debug` — Start with full debug logging (Wayland, Electron logging, stack dumps)
- `npm run dev` — Start with auto-reload on file changes (watches server/, app/, main.js, config.js)
- `npm run dev:warn` — Dev mode with warnings
- `npm run dev:debug` — Dev mode with full debug output and auto-reload
### Building
- `npm run build:linux` — Build Linux packages (AppImage, deb, snap)
- `npm run build:win` — Build Windows installer (.exe)
- `npm run build:rpm` — Build RPM and SRPM for COPR (Fedora)
- `npm run build:all` — Build both Windows and Linux (not recommended because it adds both OS binaries into a single package. The output file is 2x bigger than expected).
### Testing
- `npm test` — Run all tests (unit + integration)
- `npm run test:unit` — Run unit tests only
### Release Pipeline
- `npm run release` — Build all packages and create a draft GitHub release (no store publishing)
- `npm run release:publish` — Build all packages and publish to Snap Store + COPR
- `npm run release:dry-run` — Simulate the full release pipeline without publishing anything
### Maintenance
- `npm update` — Update npm dependencies
---
## Project Architecture
Freedom Loader is built with **Electron** (frontend) and **Node.js + Express** (backend), using a modular structure:
---
## Git & Branching Workflow
I use **Trunk-Based Development** (GitHub Flow):
### Core Principles
- **`main` is always deployable**: The `main` branch contains the latest stable code and must never be broken.
- **No long-lived branches**: I no longer maintain version branches like `v1.6` or `v1.7`.
- **Pull Requests for review**: All code changes go through PR review before merging to `main`.
### How to Contribute
#### 1. Create a feature branch
```bash
git checkout -b feat/add-new-button
# or for fixes:
git checkout -b fix/ui-bug
```
**Branch naming convention**:
- `feat/` — New features
- `fix/` — Bug fixes
- `refactor/` — Code cleanup (no behavior change)
- `docs/` — Documentation updates
- `chore/` — Dependency updates, build config, etc.
#### 2. Make commits
```bash
# Make changes
git add .
git commit -m "Brief, imperative description of the change"
```
**Commit message tips**:
- Use imperative mood: "Add theme caching" not "Added theme caching"
- Keep commits logical and focused (one feature per commit if possible)
- Link to issues if relevant: "Fix crash on download (fixes #42)"
#### 3. Push and open a PR
```bash
git push origin feat/add-new-button
```
Then open a PR on GitHub against `main`.
#### 4. Review and merge
- Address feedback in new commits (don't rebase — easier to review)
- Once approved, merge via GitHub (use "Squash and merge" for clean history if many small commits and you find it relevant)
---
## Release Process
**Note**: Only project maintainers release to production. This section documents the process for transparency and for future maintainers.
Releases are fully automated via the `release.sh` script. The process handles building, packaging, and publishing to **all distribution channels**:
- **GitHub Releases** (Windows .exe, Linux packages)
- **Fedora COPR** (automatic RPM builds for Fedora 43+)
- **Snap Store** (universal Linux)
### Before You Release
1. **Ensure `main` is green**: All tests pass, features are stable.
2. **Update `package.json` version**:
```json
"version": "1.6.1"
```
3. **Commit the version bump**: `git add package.json && git commit -m "chore: v1.6.1"`
4. **Push to `main`**: `git push origin main`
### Step 1: Local Build & Draft Release
```bash
npm run release
```
This:
1. Builds Linux packages (AppImage, deb, snap)
2. Builds RPM and SRPM for COPR
3. Builds Windows installer
4. Creates a draft GitHub release
### Step 2: Edit & Publish on GitHub
1. Go to https://github.com/MasterAcnolo/Freedom-Loader/releases
2. Edit the draft release — fill in changelog
3. Click **"Publish"** to make it live
### Step 3: Publish to Distribution Channels
```bash
npm run release:publish
```
This automatically:
- **Uploads to Snap Store**: Makes the app available via `snap install freedom-loader`
- **Submits to Fedora COPR**: Builds and publishes RPMs for Fedora 43+ (users can `dnf install freedom-loader` from the COPR repo)
Both happen in parallel — users across all platforms get the release simultaneously.
---
## Linux Development Considerations
### Cross-Distribution Compatibility
Freedom Loader targets **Debian-based** (Ubuntu, Debian) and **Fedora-based** (Fedora, RHEL, openSUSE) distributions. When developing features, keep this in mind:
#### What to test
- **Feature works on Fedora 44+** (primary Linux development environment)
- **Feature works on Ubuntu/Debian** (via deb package or AppImage)
- **Feature doesn't break Snap confinement** (Snap has restricted filesystem/IPC access)
- **Feature gracefully degrades on missing system dependencies**
#### Desktop Environment (DE) Compatibility
Test on at least **GNOME** and **KDE** (the most common DEs). Common pain points:
- **Themes**: May render differently on KDE vs GNOME — test both if possible
- **File dialogs**: Some DEs use native file pickers, others fall back to Electron's
- **Notifications**: System notification APIs vary (D-Bus, libnotify)
- **Tray icons**: May not work identically across DEs
#### How to check locally
```bash
# Test on Fedora (if available)
npm run build:linux
sudo dnf install dist/freedom-loader-*.x86_64.rpm
freedom-loader
# Test AppImage (works on any distro)
chmod +x dist/Freedom\ Loader-*.AppImage
./dist/Freedom\ Loader-*.AppImage
```
### CI/CD Gap
**Currently**: No automated testing across distros or DEs. Releases rely on manual testing before publish.
**Future improvement**: Automated tests via GitHub Actions (Ubuntu) + local testing on Fedora would catch cross-distro issues early. This is planned but not yet implemented.
For now, if you fix a Linux-specific bug or add a DE-dependent feature, **please mention it in your PR description** so reviewers can test extra carefully.
---
## Testing
### Unit Tests
Test individual functions in isolation (no Electron required).
```bash
npm run test:unit
```
Covered:
(Tests will come soon)
### End-to-End Tests (Playwright)
Test the actual Electron app launching and basic UI interactions.
```bash
npm run test
```
Covered:
(Tests will come soon)
### Running All Tests
```bash
npm test
```
Or include tests before release:
```bash
npm test && npm run release
```
---
## Common Tasks
### Add a new feature
1. Create a feature branch: `git checkout -b feat/my-feature`
2. Make changes, commit: `git add . && git commit -m "feat: my feature"`
3. Push: `git push origin feat/my-feature`
4. Open a PR on GitHub
5. Once approved, merge to `main`
6. (Later) Cut a release when ready: `npm run release`
### Fix a bug
Same as above, but use `fix/bug-name` branch and `git commit -m "fix: description"`.
### Test the app before releasing
```bash
npm run dev # Auto-reload on file changes
# Make changes, test in the UI
npm test # Run all tests
npm run release:dry-run # Simulate release (builds but doesn't publish)
```
### Update dependencies
```bash
npm update
git add package.json package-lock.json
git commit -m "chore: update dependencies"
git push origin main
```
### Rebuild only Linux (after quick fixes)
```bash
npm run build:linux
# Or just the RPM:
npm run build:rpm
```
### Publish to stores manually
If `npm run release:publish` fails partway:
```bash
# Just Snap:
snapcraft upload dist/freedom-loader_*.snap --release=stable
# Just COPR:
copr-cli build freedom-loader srpm-out/*.src.rpm
```
---
## Troubleshooting
### App won't start in dev mode
```bash
npm run start:debug
```
Check the debug output for errors. Most common:
- Missing binaries in `resources/binaries/`
- Port 8787 already in use
- A dead instance is still running — open Task Manager and kill the "Freedom Loader" process
### (Linux) Binaries in the right place but app still won't launch
You probably forgot to make them executable:
```bash
chmod +x resources/binaries/linux/*
```
The app will fail silently if binaries lack execute permissions.
### Build fails with "permission denied"
Make sure you have write access to `dist/` and `srpm-out/`:
```bash
chmod -R u+w dist srpm-out
npm run build:linux
```
### Tests fail
Check for:
- Missing test files in `tests/unit/`
- Node modules out of sync: `rm -rf node_modules && npm install`
### GitHub release publish fails
Verify `gh` CLI is installed and authenticated:
```bash
gh auth login
gh release list
```
---
## Questions?
For more info:
- **Electron docs**: https://www.electronjs.org/docs
- **electron-builder**: https://www.electron.build/
- **This repo**: https://github.com/MasterAcnolo/Freedom-Loader
Happy coding! 🎉

193
README.md
View File

@@ -15,6 +15,8 @@
</div>
---
## Overview
Freedom Loader is a desktop application built with Electron that provides a straightforward way to download video and audio content with full metadata support. The application focuses on reliability, transparency, and user privacy-no ads, no tracking, no questionable third-party services.
@@ -23,7 +25,7 @@ The primary goal is to make media downloading accessible to users who want offli
### See related repo:
- **[Website](https://github.com/MasterAcnolo/Freedom-Loader-Site/)** - Official project website and documentation
- **[Website](https://masteracnolo.github.io/Freedom-Loader-Site/)** - Official project website and documentation
- **[Workshop](https://github.com/MasterAcnolo/Freedom-Loader-Workshop)** - Theme creation tool and theme browser
## Table of Contents
@@ -33,12 +35,14 @@ The primary goal is to make media downloading accessible to users who want offli
- [Usage](#usage)
- [Preview](#preview)
- [Configuration](#configuration)
- [Project Structure](#project-structure)
- [Theme Workshop](#Theme-Workshop)
- [Technology Stack](#technology-stack)
- [Development](#development)
- [Roadmap](#roadmap)
- [Contributing](#contributing)
- [Submitting a community theme](#Submitting-a-community-theme)
- [Support](#support)
- [License](#license)
## Features
@@ -57,9 +61,9 @@ The primary goal is to make media downloading accessible to users who want offli
### User Interface
- **Custom window controls** - Frameless window with custom top bar (optional)
- **Custom themes** - ZIP-based theme system with live preview
- **Theme Workshop** - web-based theme creator and browser
- **Toast notifications** - in-app feedback system
- **Custom themes** — ZIP-based theme system with live preview
- **Theme Workshop** — web-based theme creator and browser
- **Toast notifications** — in-app feedback system
- **Real-time progress tracking** - Live download progress bar with network speed indicator
- **Server-Sent Events (SSE)** - Non-blocking progress updates via event streaming
- **Settings panel** - In-app configuration interface with live updates
@@ -76,11 +80,9 @@ The primary goal is to make media downloading accessible to users who want offli
- **Rate limiting** - Express-based request throttling to prevent server overload
- **Graceful shutdown** - Proper cleanup of servers, logs, and RPC connections
- **System notifications** - Windows notifications on download completion (clickable to open folder)
- **Splash screen** - animated loading screen on startup
- **Stop download** - ability to cancel in-progress downloads
- **Playlist folders** - dedicated folder creation per playlist
- **Keep Playlist Order** - Add an Index before the title, could be useful for an album for example.
- **System Tray** - Could minimize the application in the system Tray, allow it to run in the background.
- **Splash screen** — animated loading screen on startup
- **Stop download** — ability to cancel in-progress downloads
- **Playlist folders** — dedicated folder creation per playlist
## Installation
@@ -103,7 +105,7 @@ The primary goal is to make media downloading accessible to users who want offli
### Linux
#### Fedora (via Copr - recommended)
#### Fedora (via Copr — recommended)
Installing via Copr lets `dnf` handle future updates automatically:
@@ -176,8 +178,7 @@ The application supports various configuration options:
- Custom download directory selection
- Discord Rich Presence activation
- Theme customization
- Log level
- And somes to see in the list [Configuration Options](#configuration-options) available
- Log level configuration
### Troubleshooting
@@ -225,7 +226,6 @@ Freedom Loader can be configured either through the settings panel in the UI or
```json
{
"autoUpdate": true,
"systemTray": true,
"discordRPC": true,
"customTopBar": true,
"autoCheckInfo": true,
@@ -250,7 +250,6 @@ Freedom Loader can be configured either through the settings panel in the UI or
| Option | Type | Default | Description |
|------------------------------|---------|----------|------------------------------------------------------------|
| `autoUpdate` | boolean | `true` | Enable automatic application updates |
| `systemTray` | boolean | `false` | Allow app to minimize on close [EXPERIMENTAL] |
| `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 |
@@ -259,7 +258,7 @@ Freedom Loader can be configured either through the settings panel in the UI or
| `verboseLogs` | boolean | `false` | Enable detailed logging for debugging |
| `autoDownloadPlaylist` | boolean | `true` | Automatically download entire playlists |
| `keepPlaylistOrder` | boolean | `false` | Add index before title, usefull for album |
| `createPlaylistFolders` | boolean | `false` | Automatically create a folder for a playlist |
| `createPlaylistFolders` | boolean | `true` | Automatically create a folder for a playlist |
| `customCodec` | string | `"h264"` | Video codec for encoding (supported: h264, h265, vp9, av1) |
| `logSystem` | boolean | `true` | Enable application logging |
| `outputTitleCheck` | boolean | `true` | Verify output file titles |
@@ -281,6 +280,94 @@ Freedom Loader can be configured either through the settings panel in the UI or
> [!NOTE]
> Some configuration changes may require an application restart to take effect.
## Project Structure
```
Freedom-Loader/
├── app/ # Electron main process modules
│ ├── autoUpdater.js
│ ├── dependencyCheck.js
│ ├── discordRPC.js
│ ├── ipcHandlers.js
│ ├── pathValidator.js
│ ├── splashManager.js
│ ├── themeManager.js
│ ├── windowManager.js
│ └── ytDlpUpdater.js
├── build/ # Build resources and assets
├── config/ # Configuration files
│ ├── config.default.json
│ └── config.dev.json
├── public/ # Frontend assets and UI
│ ├── index.html
│ ├── splash.html
│ ├── assets/
│ │ ├── icon/ # Application icons
│ │ └── logo/ # Logo assets
│ ├── script/ # Frontend JavaScript modules
│ │ ├── appVersion.js
│ │ ├── clipboardPaste.js
│ │ ├── custompath.js
│ │ ├── customthemes.js
│ │ ├── downloadstatus.js
│ │ ├── fetchinfo.js
│ │ ├── progressBar.js
│ │ ├── settingsPanel.js
│ │ ├── toast.js
│ │ └── topbar.js
│ └── styles/ # CSS stylesheets
│ ├── styles.css
│ ├── variables.css
│ ├── components/ # Component-specific styles
│ │ ├── checkbox.css
│ │ ├── editpathbutton.css
│ │ ├── loader.css
│ │ ├── progressBar.css
│ │ └── toast.css
│ └── layout/ # Layout styles
│ ├── container.css
│ ├── form.css
│ ├── header.css
│ ├── settingsPanel.css
│ ├── topbar.css
│ └── videoinfo.css
├── resources/ # Internal resources (binaries)
├── server/ # Express backend server
│ ├── logger.js
│ ├── server.js
│ ├── controller/ # Request handlers
│ │ ├── download.controller.js
│ │ └── info.controller.js
│ ├── helpers/ # Utility functions
│ │ ├── buildArgs.helpers.js
│ │ ├── getBrowser.helpers.js
│ │ ├── notify.helpers.js
│ │ ├── parseInfo.helpers.js
│ │ ├── path.helpers.js
│ │ ├── rateLimit.helpers.js
│ │ └── validation.helpers.js
│ ├── routes/ # API route definitions
│ │ ├── download.route.js
│ │ └── info.route.js
│ └── services/ # Business logic layer
│ ├── download.services.js
│ └── info.services.js
├── theme/ # Theme system
│ ├── template.theme.json # Theme template
│ ├── Dark/ # Default dark theme
│ │ └── dark.theme.json
│ └── Light/ # Default light theme
│ └── light.theme.json
├── main.js # Electron main process entry point
├── preload.js # Electron preload script (IPC bridge)
├── config.js # Global configuration loader
├── package.json # Project metadata and dependencies
├── CODE_OF_CONDUCT.md # Community guidelines
├── CONTRIBUTING.md # Contribution guidelines
├── LICENSE # GPLv3 license
└── README.md # This file
```
### Architecture Overview
Freedom Loader uses a client-server architecture within a single Electron application:
@@ -304,7 +391,7 @@ Freedom Loader includes a web-based theme creator available at [Freedom Loader W
### Installing a custom theme
1. Download a `.zip` theme file
2. Drop it in the `theme/` folder of your Freedom Loader installation
3. Restart the app - your theme appears in the settings panel
3. Restart the app — your theme appears in the settings panel
## Technology Stack
@@ -327,7 +414,28 @@ Freedom Loader includes a web-based theme creator available at [Freedom Loader W
## Development
If you are interested by running a local non compiled version of Freedom Loader or just interested by contributing, see [DEVELOPMENT](./DEVELOPMENT.md)
### Prerequisites
- Node.js 16.x or higher
- npm or yarn
- Git
### Setup
```bash
# Clone the repository
git clone https://github.com/MasterAcnolo/Freedom-Loader.git
cd Freedom-Loader
# Install dependencies
npm install
# Run in development mode
npm start
# Build for production
npm run build
```
### Additional Dependencies
@@ -338,19 +446,40 @@ You must download the required binaries and place them in the `resources` folder
#### Required binaries
See [BINARIES.md](./BINARIES.md) for how to setup the binaries.
- **Deno**
- Download from: https://sourceforge.net/projects/deno.mirror/files/latest/download
- Rename to: `deno.exe`
- **FFmpeg**
- Download from: https://www.ffmpeg.org/download.html
- Required files:
- `ffmpeg.exe`
- `ffprobe.exe`
- **yt-dlp**
- Already bundled with the project
- No manual installation required
Final folder structure:
```
resources/
├── deno.exe
├── ffmpeg.exe
├── ffprobe.exe
└── yt-dlp.exe
```
> These binaries are required for the application to start correctly.
> If any of them are missing, an error message will be displayed at application startup.
### Development Guidelines
- Follow existing code style and conventions
- Write clear, imperative commit messages (e.g., "Add playlist indexing" not "Added")
- Test thoroughly on both Windows and Linux before submitting changes
- Update documentation (README, DEVELOPMENT.md) when adding features
- Maintain compatibility with:
- Windows 10+
- Fedora 43+ / Debian 11+ / Ubuntu 20.04+
- GNOME and KDE desktop environments (when possible)
- Consider Linux distribution differences early (see [DEVELOPMENT.md](./DEVELOPMENT.md#linux-development-considerations))
- Write clear commit messages
- Test thoroughly before submitting changes
- Update documentation when adding features
- Maintain compatibility with Windows 10+ and Linux
## Roadmap
@@ -392,7 +521,15 @@ Open a feature request issue with:
5. Update documentation as needed
6. Submit a pull request with a detailed description
Please read [CONTRIBUTING.md](CONTRIBUTING.md), [DEVELOPMENT.md](./DEVELOPMENT.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) before contributing.
Please read [CONTRIBUTING.md](CONTRIBUTING.md) and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) before contributing.
## Support
If you find this project useful and want to support its development:
[![PayPal](https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white)](https://paypal.me/axelnicolas25)
Your support helps maintain infrastructure, develop new features, and keep the project free and ad-free.
## License
@@ -408,8 +545,8 @@ You are free to use, modify, and redistribute this software under the terms of t
- [Electron](https://www.electronjs.org/) for the desktop application framework
- The open-source community for continuous support and contributions
- [@SpicyFire21](https://github.com/SpicyFire21) to be the spiciest one
- [@AureCX](https://github.com/AureCX) for being the Official Windows Tester!
- Zakaria for the website icon
- Jacques Chirac to love Apples
- All users who test, report issues, and help improve the application
---

View File

@@ -121,14 +121,8 @@ function initAutoUpdater(mainWindow) {
*/
async function checkForUpdates() {
/**
* Prevents electron-updater from running inside sandboxed environments.
* Snap and Flatpak lock the file system in read-only mode, causing the updater to crash.
* In these environments, updates are safely handled by snapd or the Flatpak runtime.
* Standalone Linux packages (.deb, .rpm, AppImage) will bypass this and update normally.
*/
if (process.env.SNAP || process.env.FLATPAK_ID) {
logger.info("Running as Snap or Flatpak. Updates are managed by the OS store. Skipping electron-updater.");
if (process.env.SNAP) {
logger.info("Running as Snap, update managed by snapd, skipping electron-updater");
return;
}

View File

@@ -1,8 +1,6 @@
const config = require('../config');
const RPC = require("discord-rpc");
const { logger } = require("../server/logger");
const fs = require("fs");
const path = require("path");
/**
* Discord Application Client ID used to authenticate the RPC connection.
@@ -22,51 +20,6 @@ const rpc = new RPC.Client({ transport: "ipc" });
*/
let intervalId;
/**
* Automagically fixes Discord RPC on Linux for Sandboxed versions (Flatpak & Snap).
* It creates a symlink from the sandbox IPC socket to the standard system location.
*
* @returns {void}
*/
function fixLinuxDiscordRPC() {
// Only execute on Linux
if (process.platform !== "linux") return;
/**
* Get the user's runtime directory (e.g., /run/user/1000).
* @type {string}
*/
const xdgDir = process.env.XDG_RUNTIME_DIR || `/run/user/${process.getuid()}`;
const standardSocket = path.join(xdgDir, "discord-ipc-0");
// If the standard socket already exists (Native Discord), do nothing.
if (fs.existsSync(standardSocket)) return;
/**
* Paths for known sandboxed Discord IPC sockets.
*/
const flatpakSocket = path.join(xdgDir, "app/com.discordapp.Discord/discord-ipc-0");
const snapSocket = path.join(xdgDir, "snap.discord/discord-ipc-0");
let targetSocket = null;
if (fs.existsSync(flatpakSocket)) {
targetSocket = flatpakSocket;
} else if (fs.existsSync(snapSocket)) {
targetSocket = snapSocket;
}
// If a sandboxed socket is found, create the symlink stealthily.
if (targetSocket) {
try {
fs.symlinkSync(targetSocket, standardSocket);
logger.info(`Discord RPC bridge created automatically targeting: ${targetSocket}`);
} catch (err) {
logger.warn(`Failed to create Discord RPC bridge: ${err.message}`);
}
}
}
/**
* Initializes Discord Rich Presence (RPC) connection.
*
@@ -79,11 +32,6 @@ function fixLinuxDiscordRPC() {
*/
function startRPC() {
/**
* Patch that create Simlinks for Linux environment;
*/
fixLinuxDiscordRPC();
/**
* Rich Presence payload describing current application state
* shown in Discord user profile.
@@ -102,10 +50,8 @@ function startRPC() {
});
rpc.login({ clientId }).catch(() => {
// Since 1.6.2, it no longer print the error. This is because if discord is not opened, it will send an error.
// logger.error("Unable to connect to the RPC:", err);
logger.info("Unable to connect to the Discord RPC. Discord is maybe not launched");
rpc.login({ clientId }).catch(err => {
logger.error("Unable to connect to the RPC:", err);
});
}
@@ -114,23 +60,28 @@ function startRPC() {
*
* Responsibilities:
* - Clear any running intervals
* - Remove current activity from Discord if connected
* - Remove current activity from Discord
* - Destroy RPC transport connection
* - Handle cleanup errors safely
*/
async function stopRPC() {
if (rpc) {
async function stopRPC(){
try {
if (intervalId) clearInterval(intervalId);
await rpc.destroy();
/**
* Ensures RPC connection exists before attempting cleanup.
*/
if (rpc && rpc.transport) {
await rpc.clearActivity()
await rpc.destroy();
} else{
logger.error("Not Able to close RPC")
}
} catch (err) {
// Since 1.6.2, it no longer print the error. This is because if discord is not opened, it will send an error.
// logger.error("Error while closing the RPC:", err);
logger.error("Error while closing the RPC:", err);
}
}
}
module.exports = { startRPC, stopRPC};

View File

@@ -13,12 +13,11 @@
const { ipcMain, dialog, shell } = require("electron");
const fs = require("fs");
const { logger, logDir } = require("../server/logger");
const {configFeatures, featuresPath, devMode} = require("../config");
const { configFeatures, featuresPath } = require("../config");
const { getThemes, reloadThemes } = require("./themeManager");
const config = require("../config");
const { validateDownloadPath, getDefaultDownloadPath } = require("./pathValidator");
const { userThemesPath } = require("../server/helpers/path.helpers");
const { createSystemTray, destroyTray } = require("./tray");
/**
* Security whitelist for feature flags that can be modified at runtime.
@@ -28,7 +27,6 @@ const { createSystemTray, destroyTray } = require("./tray");
*/
const FEATURE_WHITELIST = new Set([
"autoUpdate",
"systemTray",
"discordRPC",
"customTopBar",
"autoCheckInfo",
@@ -114,18 +112,7 @@ function registerIpcHandlers(getMainWindow) {
/**
* Window minimize request from renderer.
*/
ipcMain.on("window-minimize", () => {
// Minimize to tray
if (configFeatures.systemTray) {
getMainWindow()?.hide()
logger.info("Window Minimized in SystemTray (Using Minimize Button)");
} else {
// Native minimize
getMainWindow()?.minimize()
logger.info("Window minimized normally");
}
}
);
ipcMain.on("window-minimize", () => getMainWindow()?.minimize());
/**
* Toggles maximize/unmaximize state of main window.
@@ -226,21 +213,6 @@ function registerIpcHandlers(getMainWindow) {
return true;
}
/**
* Dynamically intercepts and applies System Tray state changes at runtime.
* Instantiates or destroys the tray icon immediately to prevent window
* lifecycle desynchronization (e.g., minimizing a window to a non-existent tray).
*/
if (key === "systemTray") {
if (value === true) {
logger.info("System Tray enabled dynamically.");
createSystemTray(devMode);
} else {
logger.info("System Tray disabled dynamically.");
destroyTray();
}
}
configFeatures[key] = value;
fs.writeFileSync(

View File

@@ -56,30 +56,35 @@ function validateDownloadPath(userPath) {
if (!userPath) return getDefaultDownloadPath();
try {
const absolutePath = path.resolve(userPath);
if (!fs.existsSync(absolutePath)) {
fs.mkdirSync(absolutePath, { recursive: true });
logger.info(`Download folder created: ${absolutePath}`);
}
/**
* Resolves filesystem symlinks to ensure canonical absolute path.
* Required to prevent path traversal or alias bypass.
*/
const resolved = fs.realpathSync(path.resolve(userPath));
const real = fs.realpathSync(absolutePath);
if (!isSafePath(real)) {
logger.error("Path not allowed: system folders are blocked!");
}
return real;
if (!fs.existsSync(resolved)) {
fs.mkdirSync(resolved, { recursive: true });
logger.info(`Download folder created: ${resolved}`);
}
catch (err) {
/**
* Handles invalid filesystem paths, permissions issues, or resolution failures.
* Logs diagnostic information before propagating a sanitized error.
*/
logger.error(`Invalid download path: ${userPath} — ${err.message}`);
throw new Error(`Invalid or inaccessible path: ${err.message}`);
const real = fs.realpathSync(resolved);
if (!isSafePath(resolved)) {
throw new Error("Path not allowed: system folders are blocked!");
}
return real;
}
catch (err) {
/**
* Handles invalid filesystem paths, permissions issues, or resolution failures.
* Logs diagnostic information before propagating a sanitized error.
*/
logger.error(`Invalid download path: ${userPath} — ${err.message}`);
throw new Error(`Invalid or inaccessible path: ${err.message}`);
}
}
module.exports = { validateDownloadPath, getDefaultDownloadPath };

View File

@@ -1,117 +0,0 @@
const {app, Menu, Tray, nativeImage} = require("electron");
const path = require("path");
const {logger} = require("../server/logger"); // Ajuste le chemin si besoin
const fs = require("fs");
const {getMainWindow} = require("./windowManager");
/**
* Global reference to the Tray instance to prevent garbage collection.
* @type {Tray | null}
*/
let tray = null;
/**
* Creates and configures the cross-platform System Tray.
*
* Responsibilities:
* - Loads the appropriate icon format based on the operating system.
* - Builds the right-click context menu.
* - Handles left-click behavior to toggle main window visibility.
*
* @param {boolean} devMode - Indicates whether the application is running in development mode.
* @returns {Tray} The created Tray instance.
*/
function createSystemTray(devMode) {
// Prevent creating multiple tray instances
if (tray) return tray;
const isWin = process.platform === "win32";
const iconName = isWin ? "app-icon.ico" : "app-icon-64x64.png";
// Attempt to load the icon from the local build directory first
let iconPath = path.join(__dirname, "..", "build", iconName);
// Fallback to the extracted resources path if running in production
if (!devMode && !fs.existsSync(iconPath)) {
iconPath = path.join(process.resourcesPath, iconName);
}
if (!fs.existsSync(iconPath)) {
logger.error(`System Tray icon not found at resolved path: ${iconPath}`);
} else {
logger.info("System Tray icon resolved successfully.");
}
const icon = nativeImage.createFromPath(iconPath);
if (icon.isEmpty()) {
logger.error("System Tray icon file was found but could not be decoded by Electron (image is empty).");
}
tray = new Tray(icon);
tray.setToolTip("Freedom Loader");
/**
* System Tray Context Menu (Right-click action).
*/
const contextMenu = Menu.buildFromTemplate([
{
label: "Show Freedom Loader",
click: () => {
const window = getMainWindow();
if (window && !window.isDestroyed()) {
window.show();
window.focus();
logger.info("Window Restored from SystemTray (Using Show Action)");
}
},
},
{ type: "separator" },
{
label: "Quit",
click: () => {
/**
* Flags the application for a deliberate exit,
* bypassing the default "minimize to tray" behavior.
*/
app.isQuitting = true;
app.quit();
},
},
]);
tray.setContextMenu(contextMenu);
/**
* Left-click behavior: Toggles main window visibility.
* but it remains standard practice for Windows and Linux environments.
*/
tray.on("click", () => {
const window = getMainWindow();
if (!window || window.isDestroyed()) return;
if (window.isVisible()) {
window.hide();
} else {
window.show();
window.focus();
logger.info("Window Restored from SystemTray (Double Click on Tray Icon)")
}
});
return tray;
}
/**
* Safely destroys the tray icon to prevent OS-level crashes (especially on Linux/Wayland).
* Should be called right before the application quits.
*/
function destroyTray() {
if (tray && !tray.isDestroyed()) {
tray.destroy();
tray = null;
logger.info("System Tray destroyed cleanly.");
}
}
module.exports = {createSystemTray, destroyTray};

View File

@@ -81,21 +81,6 @@ async function createMainWindow() {
throw err;
}
/**
* Intercepts the window close event.
* If the app is not explicitly quitting (via Tray menu),
* cancels the destruction and hides the window instead.
*/
mainWindow.on('close', (event) => {
if (!app.isQuitting && config.configFeatures.systemTray) {
event.preventDefault();
mainWindow.hide();
logger.info("Window Minimized in SystemTray (Using Close Button)");
return false;
}
});
/**
* Cleans up window reference when the main window is closed.
* Prevents memory leaks and allows recreation if needed.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -7,7 +7,7 @@ const path = require("path");
* Indicates whether the application is running in development mode.
* Determined by Electron's packaging state.
*/
const devMode = !app.isPackaged || process.env.NODE_ENV === "test";
const devMode = process.env.NODE_ENV === "test" || !app?.isPackaged;
/**
* Resolves the configuration file path depending on runtime environment.

View File

@@ -1,6 +1,5 @@
{
"autoUpdate": true,
"systemTray": false,
"discordRPC": true,
"customTopBar": true,
"autoCheckInfo": true,
@@ -9,7 +8,7 @@
"verboseLogs": false,
"autoDownloadPlaylist": true,
"keepPlaylistOrder": false,
"createPlaylistFolders": false,
"createPlaylistFolders": true,
"customCodec": "h264",
"logSystem": true,
"outputTitleCheck": true,

83
main.js
View File

@@ -38,13 +38,10 @@ app.setAppUserModelId("com.masteracnolo.freedomloader");
* Load the app dependencies for hardware choice
*/
const { logger, logSessionStart, logSessionEnd, logDir } = require("./server/logger");
const { configFeatures, devMode} = require("./config");
const { configFeatures } = require("./config");
/**
* In-memory snapshot of application feature flags.
*
* Note: Changes to the config file are not automatically reflected.
* A restart could be required.
* On start, enable or disable hardWareAcceleration
*/
if (!configFeatures.enableHardwareAcceleration){
app.disableHardwareAcceleration();
@@ -53,7 +50,15 @@ if (!configFeatures.enableHardwareAcceleration){
logger.info("Enable Hardware Acceleration")
}
if(devMode){
/**
* In-memory snapshot of application feature flags.
*
* Note: Changes to the config file are not automatically reflected.
* A restart could be required.
*/
const config = require("./config");
if(config.devMode){
/**
* Start devTron extensions - @see https://github.com/electron/devtron
*/
@@ -74,45 +79,8 @@ const { updateYtDlp } = require("./app/ytDlpUpdater");
const { createMainWindow, getMainWindow } = require("./app/windowManager");
const { registerIpcHandlers } = require("./app/ipcHandlers");
const { createSplashWindow, closeSplashWindow, setSplashProgress } = require("./app/splashManager");
const { userThemesPath, initUserThemes, validateBinaries, defaultDownloadFolder } = require("./server/helpers/path.helpers");
const {createSystemTray, destroyTray} = require("./app/tray");
const { stopServer } = require("./server/server");
const { userThemesPath, initUserThemes, isWindows, validateBinaries, defaultDownloadFolder } = require("./server/helpers/path.helpers");
/**
* Global flag indicating if the application is intentionally shutting down.
* Used across the app to bypass the "minimize to tray on close" behavior.
* @type {boolean}
*/
app.isQuitting = false;
/**
* State flag to track the asynchronous cleanup process during shutdown.
* Prevents the application from exiting before services (RPC, Tray, Logs) are properly closed.
* @type {boolean}
*/
let isCleanedUp = false;
/**
* Performs a graceful shutdown of all application services asynchronously.
* Once finished, it re-triggers the app.quit() process.
*/
async function cleanShutdown() {
try {
destroyTray();
await stopRPC();
stopServer();
} catch (err) {
logger.error("Error during cleanup:", err);
} finally {
logger.info("All services stopped. Have a nice day!");
logSessionEnd();
isCleanedUp = true;
app.quit();
}
}
/**
* If another instance want to run
@@ -135,7 +103,7 @@ app.whenReady().then(async () => {
createSplashWindow();
if (!devMode && !checkNativeDependencies()) return;
if (!config.devMode && !checkNativeDependencies()) return;
const { userYtDlp } = require("./server/helpers/path.helpers");
updateYtDlp(userYtDlp);
@@ -159,11 +127,6 @@ app.whenReady().then(async () => {
closeSplashWindow();
getMainWindow().show();
if (configFeatures.systemTray) {
createSystemTray(devMode);
}
if (configFeatures.discordRPC) startRPC();
if (configFeatures.autoUpdate) initAutoUpdater(getMainWindow());
@@ -175,20 +138,12 @@ app.whenReady().then(async () => {
});
app.on("window-all-closed", () => {
if (app.isQuitting || !configFeatures.systemTray) {
logger.info("Shutting down...");
app.quit();
} else if (process.platform !== "darwin") {
logger.info("Main window closed, app running in background (Tray).");
}
logger.info("Shutting down...");
app.quit();
});
app.on("before-quit", (event) => {
app.isQuitting = true;
if (!isCleanedUp) {
event.preventDefault();
cleanShutdown();
}
app.on("before-quit", async () => {
await stopRPC();
logger.info("All services stopped. Have a nice day!");
logSessionEnd();
});

258
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "freedom-loader",
"version": "1.6.3-preview",
"version": "1.6.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "freedom-loader",
"version": "1.6.3-preview",
"version": "1.6.1",
"license": "GPL-3.0-only",
"dependencies": {
"chalk": "^4.1.2",
@@ -24,10 +24,9 @@
"@electron/devtron": "^2.1.1",
"@jest/globals": "^30.4.1",
"@playwright/test": "^1.62.1",
"electron": "^44.3.0",
"electron": "^43.3.0",
"electron-builder": "^26.15.3",
"jest": "^30.4.2",
"nodemon": "^3.1.14",
"playwright": "^1.62.1"
}
},
@@ -2940,19 +2939,6 @@
"node": ">=6.0.0"
}
},
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
@@ -3029,19 +3015,6 @@
"node": "20 || >=22"
}
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browserslist": {
"version": "4.28.7",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz",
@@ -3292,31 +3265,6 @@
"node": ">=10"
}
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chownr": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
@@ -3910,9 +3858,9 @@
}
},
"node_modules/electron": {
"version": "44.3.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-44.3.0.tgz",
"integrity": "sha512-St9EV7F2VtYaYWD2qaAjBwUgKxx39eJOUsUJ5+/1113sqbVfNqv4Dbm/W1rN7qmYSPa+mWwR6yr+b7MfgjgVfQ==",
"version": "43.3.0",
"resolved": "https://registry.npmjs.org/electron/-/electron-43.3.0.tgz",
"integrity": "sha512-nLlvu0WFjftWsSaTkV2B/c4NDuJBspTyXu8vKSQ6vLvFt8uG3NgN49LLKcXddwX0GqVvAQDhciWp+4xOdTdhew==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4517,19 +4465,6 @@
"node": ">=10"
}
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/finalhandler": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
@@ -4806,19 +4741,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/glob/node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -5109,13 +5031,6 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
"dev": true,
"license": "ISC"
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
@@ -5195,29 +5110,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -5238,29 +5130,6 @@
"node": ">=6"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
@@ -6784,58 +6653,6 @@
"node": ">=18"
}
},
"node_modules/nodemon": {
"version": "3.1.14",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz",
"integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==",
"dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^4",
"ignore-by-default": "^1.0.1",
"minimatch": "^10.2.1",
"pstree.remy": "^1.1.8",
"semver": "^7.5.3",
"simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
},
"bin": {
"nodemon": "bin/nodemon.js"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
"node_modules/nodemon/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/nodemon/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/nopt": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
@@ -7433,13 +7250,6 @@
"node": ">= 0.10"
}
},
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
"dev": true,
"license": "MIT"
},
"node_modules/pump": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
@@ -7657,32 +7467,6 @@
"util-deprecate": "~1.0.1"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/readdirp/node_modules/picomatch": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/register-scheme": {
"version": "0.0.2",
"resolved": "git+ssh://git@github.com/devsnek/node-register-scheme.git#e7cc9a63a1f512565da44cb57316d9fb10750e17",
@@ -8540,19 +8324,6 @@
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -8562,16 +8333,6 @@
"node": ">=0.6"
}
},
"node_modules/touch": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
"integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
"dev": true,
"license": "ISC",
"bin": {
"nodetouch": "bin/nodetouch.js"
}
},
"node_modules/tr46": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -8658,13 +8419,6 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
"dev": true,
"license": "MIT"
},
"node_modules/undici": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",

View File

@@ -1,8 +1,7 @@
{
"name": "freedom-loader",
"desktopName": "com.masteracnolo.freedomloader",
"productName": "Freedom Loader",
"version": "1.6.3",
"version": "1.6.1",
"author": "MasterAcnolo <MasterAcnolo@users.noreply.github.com>",
"description": "Free and open-source GUI for yt-dlp — download video and audio from hundreds of platforms",
"homepage": "https://masteracnolo.github.io/Freedom-Loader-Site/",
@@ -16,12 +15,8 @@
},
"main": "main.js",
"scripts": {
"start": "electron --no-warnings .",
"start:warn": "electron --trace-warnings .",
"start:debug": "WAYLAND_DEBUG=1 ELECTRON_ENABLE_LOGGING=1 ELECTRON_ENABLE_STACK_DUMPING=1 electron --enable-logging --v=1 .",
"dev": "nodemon --watch server --watch app --watch main.js --watch config.js --ext js,json --exec \"electron --no-warnings .\"",
"dev:warn": "nodemon --watch server --watch app --watch main.js --watch config.js --ext js,json --exec \"electron --trace-warnings .\"",
"dev:debug": "nodemon --watch server --watch app --watch main.js --watch config.js --ext js,json --exec \"WAYLAND_DEBUG=1 ELECTRON_ENABLE_LOGGING=1 ELECTRON_ENABLE_STACK_DUMPING=1 electron --enable-logging --v=1 .\"",
"start": "electron --trace-warnings .",
"build": "electron-builder",
"build:win": "electron-builder --win",
"build:linux": "electron-builder --linux",
@@ -30,8 +25,10 @@
"release": "bash scripts/release.sh",
"release:publish": "bash scripts/release.sh --publish",
"release:dry-run": "bash scripts/release.sh --dry-run",
"test": "jest",
"test:unit": "jest test/unit",
"update": "npm update"
},
"dependencies": {
@@ -50,10 +47,9 @@
"@electron/devtron": "^2.1.1",
"@jest/globals": "^30.4.1",
"@playwright/test": "^1.62.1",
"electron": "^44.3.0",
"electron": "^43.3.0",
"electron-builder": "^26.15.3",
"jest": "^30.4.2",
"nodemon": "^3.1.14",
"playwright": "^1.62.1"
},
"build": {
@@ -83,20 +79,24 @@
"to": "theme"
},
{
"from": "config/config.default.json",
"to": "config/config.default.json"
"from": "build/confirm-icon.png",
"to": "confirm-icon.png"
},
{
"from": "build",
"to": ".",
"filter": [
"app-icon.ico",
"app-icon-64x64.png",
"confirm-icon.png",
"banner.bmp",
"banner.png",
"error.png"
]
"from": "build/banner.bmp",
"to": "banner.bmp"
},
{
"from": "build/banner.png",
"to": "banner.png"
},
{
"from": "build/error.png",
"to": "error.png"
},
{
"from": "config/config.default.json",
"to": "config/config.default.json"
}
],
"win": {
@@ -105,14 +105,20 @@
"artifactName": "Freedom-Loader-Setup-${version}.${ext}",
"extraResources": [
{
"from": "resources/binaries/win-32",
"to": "binaries",
"filter": [
"yt-dlp.exe",
"ffmpeg.exe",
"ffprobe.exe",
"deno.exe"
]
"from": "resources/binaries/win-32/yt-dlp.exe",
"to": "binaries/yt-dlp.exe"
},
{
"from": "resources/binaries/win-32/ffmpeg.exe",
"to": "binaries/ffmpeg.exe"
},
{
"from": "resources/binaries/win-32/ffprobe.exe",
"to": "binaries/ffprobe.exe"
},
{
"from": "resources/binaries/win-32/deno.exe",
"to": "binaries/deno.exe"
}
]
},
@@ -134,20 +140,24 @@
"snap"
],
"category": "Utility",
"synopsis": "GUI for yt-dlp to download video and audio with metadata",
"maintainer": "MasterAcnolo",
"icon": "build/app-icon.png",
"executableName": "freedom-loader",
"extraResources": [
{
"from": "resources/binaries/linux",
"to": "binaries",
"filter": [
"yt-dlp",
"ffmpeg",
"ffprobe",
"deno"
]
"from": "resources/binaries/linux/yt-dlp",
"to": "binaries/yt-dlp"
},
{
"from": "resources/binaries/linux/ffmpeg",
"to": "binaries/ffmpeg"
},
{
"from": "resources/binaries/linux/ffprobe",
"to": "binaries/ffprobe"
},
{
"from": "resources/binaries/linux/deno",
"to": "binaries/deno"
}
]
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -56,9 +56,9 @@
<div class="setting-item" id="theme" style="margin-left: 32px;">
<div class="setting-info">
<div style="display: flex; align-items: center; gap: 10px;">
<span class="setting-title">Theme</span>
<span class="setting-title">Thème</span>
<select id="themeSelect" data-key="theme" aria-label="Choose the theme">
<select id="themeSelect" data-key="theme" aria-label="Choisir le thème">
</select>
<button id="refresh-themes-btn" title="Refresh themes" class="refresh-themes-btn">
@@ -127,21 +127,13 @@
</div>
</div>
<div class="setting-item">
<input data-key="systemTray" id="systemTray" type="checkbox">
<div class="setting-info">
<span class="setting-title">System Tray</span>
<small>Minimize app on close, in the System Tray. [EXPERIMENTAL]</small>
</div>
<!-- <div class="setting-item">
<input type="checkbox" data-key="outputTitleCheck" id="outputTitleCheck">
<div class="setting-info">
<span class="setting-title">Output title (special chars)</span>
<small>Check for unusual characters in output titles.</small>
</div>
<!-- <div class="setting-item">
<input type="checkbox" data-key="outputTitleCheck" id="outputTitleCheck">
<div class="setting-info">
<span class="setting-title">Output title (special chars)</span>
<small>Check for unusual characters in output titles.</small>
</div>
</div> -->
</div> -->
<div class="setting-item">
<input data-key="autoCheckInfo" id="autoCheckInfo" type="checkbox">
@@ -262,7 +254,7 @@
</div>
<div class="download-path">
Will be saved in <span id="savePath"></span>
Will be save on <span id="savePath"></span>
<button id="changePath">Edit</button>
</div>
@@ -306,6 +298,7 @@
<!-- Scripts -->
<script src="script/toast.js"></script>
<script src="script/customConfiguration.js"></script>
<script src="script/clipboardPaste.js"></script>
<script src="script/custompath.js"></script>
<script src="script/settingsPanel.js"></script>

View File

@@ -1,54 +1,21 @@
/**
* Retrieves the application version and build state from the backend.
* Displays a formatted string indicating packaging state and preview status.
* Hides the "Packaged" state for production builds to keep the UI clean.
* Retrieves the application version from the Electron main process
* and displays it in the UI version badge (bottom-right corner).
*
* Example outputs: "Not Packaged Preview v1.6.2" or "Preview v1.6.2"
*
* @returns {Promise<void>}
* This is mainly used for debugging and build identification.
*/
async function displayVersionLabel() {
/**
* Raw version string from the backend (e.g., "dev-1.6.2-preview" or "v1.6.2")
* @type {string}
*/
async function versionLabel() {
const appVersion = await window.electronAPI.getVersion();
/**
* UI element displaying the current application version.
* @type {HTMLElement | null}
*/
const versionBadge = document.getElementById("version-badge");
/**
* UI element displaying the current application version.
* Updated at runtime after IPC call resolves.
*/
const versionBadge = document.getElementById("version-badge");
if (!versionBadge) return;
if (!versionBadge) return;
/**
* Extracts the numeric semantic version (e.g., "1.6.2").
* @type {RegExpMatchArray | null}
*/
const versionMatch = appVersion.match(/(\d+\.\d+\.\d+)/);
const baseVersion = versionMatch ? versionMatch[0] : "Unknown";
/**
* Determines the packaging state. The backend prepends "dev-" if unpackaged.
* @type {boolean}
*/
const isPackaged = !appVersion.includes("dev-");
/**
* Determines if the current build is a preview version.
* @type {boolean}
*/
const isPreview = appVersion.includes("preview");
/**
* Construct the final display string.
* If packaged, we don't mention it. If not, we explicitly say "Not Packaged ".
*/
const packageStateStr = isPackaged ? "" : "Not Packaged ";
const previewStr = isPreview ? "Preview " : "";
versionBadge.textContent = `${packageStateStr}${previewStr}v${baseVersion}`;
versionBadge.textContent = `${appVersion}`;
}
displayVersionLabel();
versionLabel();

View File

@@ -0,0 +1,27 @@
async function initPlatformRestrictions() {
const platform = await window.electronAPI.getProcessPlatform();
const themeSelect = document.getElementById("themeSelect");
const refreshBtn = document.getElementById("refresh-themes-btn");
/**
* Is the OS windows
* @type {boolean}
*/
const isWindows = platform === "win32";
console.log(isWindows);
// If it's windows, the button is not disabled.
themeSelect.disabled = !isWindows;
refreshBtn.disabled = !isWindows;
themeSelect.classList.toggle("disabled", !isWindows);
refreshBtn.classList.toggle("disabled", !isWindows);
if (!isWindows) {
themeSelect.title = "Themes are only available on Windows";
refreshBtn.title = "Themes are only available on Windows";
}
}

View File

@@ -121,7 +121,7 @@ async function initThemes() {
const defaultTheme = {
id: "dark",
name: "Dark",
subtitle: "Because Why Not ?",
subtitle: "Darkness is my ally",
style: {
background: {
size: "cover",

View File

@@ -5,55 +5,53 @@
* This function is safe to call once DOM is ready.
* It silently aborts if the API or elements are missing.
*/
export function initTopBar() {
function setupTopbarListeners() {
const { topbarAPI } = window;
if (!topbarAPI) return;
const minBtn = document.getElementById("minimize-btn");
if (minBtn) minBtn.onclick = () => topbarAPI.minimize();
const maxBtn = document.getElementById("maximize-btn");
if (maxBtn) maxBtn.onclick = () => topbarAPI.maximize();
const closeBtn = document.getElementById("close-btn");
if (closeBtn) closeBtn.onclick = () => topbarAPI.close();
const devtoolsBtn = document.getElementById("devtools-btn");
if (devtoolsBtn) devtoolsBtn.onclick = () => topbarAPI.openDevTools();
const logsBtn = document.getElementById("logs-btn");
if (logsBtn) logsBtn.onclick = () => topbarAPI.openLogs();
const websiteBtn = document.getElementById("website-btn");
if (websiteBtn) websiteBtn.onclick = () => topbarAPI.openWebsite();
const wikiBtn = document.getElementById("wiki-btn");
if (wikiBtn) wikiBtn.onclick = () => topbarAPI.openWiki();
const workshopBtn = document.getElementById("workshop-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();
if (workshopBtn) workshopBtn.onclick = () => topbarAPI.openWorkshop();
}
async function attachListeners(){
try{
const featuresList = await window.electronAPI.getFeatures();
if (!featuresList.customTopBar) {
const topbar = document.getElementById("topbar");
const container = document.getElementById("container");
const themeSwitcher = document.getElementById("theme-switcher");
if (topbar) topbar.style.display = "none";
if (container) container.style.marginTop = "0";
if (themeSwitcher) themeSwitcher.style.top = "30px";
}
} catch (error) {
console.error("Failed to load layout features for topbar:", error);
/**
* Registers topbar event listeners after DOM is fully loaded.
*/
document.addEventListener("DOMContentLoaded", setupTopbarListeners);
/**
* Applies UI layout adjustments depending on feature flags
* provided by the Electron backend.
*
* Specifically handles:
* - hiding custom topbar
* - adjusting layout spacing
* - repositioning theme switcher
*/
(async function applyFeatureLayout() {
const features = await window.electronAPI.getFeatures();
if (!features.customTopBar) {
const topbar = document.getElementById("topbar");
const container = document.getElementById("container");
const themeSwitcher = document.getElementById("theme-switcher");
if (topbar) topbar.style.display = "none";
if (container) container.style.marginTop = "0";
if (themeSwitcher) themeSwitcher.style.top = "30px";
}
}
initTopBar()
document.addEventListener("DOMContentLoaded", attachListeners)
})();

BIN
resources/binaries/linux/yt-dlp Executable file

Binary file not shown.

Binary file not shown.

View File

@@ -1 +0,0 @@
[//]: # (This file is used for the release CHANGELOG. Please use Markdown to describe changes.)

View File

@@ -4,14 +4,7 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
VERSION=$(node -p "require('$ROOT_DIR/package.json').version")
if [[ "$VERSION" == *"-preview"* ]]; then
echo "Error: The current version ($VERSION) is a 'preview"
echo "Unable to launch release pipeline. Please update the package.json with a stable version.."
exit 1
fi
TAG="$VERSION"
TAG="v$VERSION"
# Parse arguments
PUBLISH_SNAP=false
@@ -24,7 +17,7 @@ for arg in "$@"; do
--copr) PUBLISH_COPR=true ;;
--publish) PUBLISH_SNAP=true; PUBLISH_COPR=true ;;
--dry-run) DRY_RUN=true ;;
*) echo "Unknown Argument : $arg" ; exit 1 ;;
*) echo "⚠️ Argument inconnu : $arg" ; exit 1 ;;
esac
done
@@ -64,16 +57,6 @@ echo "[0/5] Cleaning workspace..."
rm -rf "$ROOT_DIR/dist" "$ROOT_DIR/srpm-out"
echo "Workspace cleaned (dist/ and srpm-out/ removed)"
# ------------------------------------------------------------
# Step 0.3 - Retrieve Changelog
# ------------------------------------------------------------
if [ ! -f "$ROOT_DIR/CHANGELOG.md" ]; then
echo "Warning: CHANGELOG.md not found, release notes will be empty."
CHANGELOG=""
else
CHANGELOG="$(cat "$ROOT_DIR/CHANGELOG.md")"
echo "Changelog retrieved successfully"
fi
# ------------------------------------------------------------
# Step 1 - Build Linux packages (AppImage, deb, snap)
# ------------------------------------------------------------
@@ -115,13 +98,19 @@ PREV_TAG=$(git rev-list --tags --skip=1 --max-count=1 | xargs git describe --tag
RELEASE_NOTES="# Freedom Loader - $VERSION
## Changelog
$CHANGELOG
## Found a bug or issue?
Please report it in the [GitHub Issues](https://github.com/MasterAcnolo/Freedom-Loader/issues) section.
## Next Release (non-exhaustive roadmap)
- More format options
- Subtitle support
- Improved UI / UX
- Language selection
- Download specific parts of videos
- File renaming options
- Parallel downloads
- Skip sponsored parts automatically
**Full Changelog**: https://github.com/MasterAcnolo/Freedom-Loader/compare/${PREV_TAG}...${TAG}"
if [ "$DRY_RUN" = false ]; then

View File

@@ -2,7 +2,6 @@ const { fetchInfo } = require("../services/info.services");
const { parseVideo, parsePlaylist } = require("../helpers/parseInfo.helpers");
const { logger } = require("../logger");
const { isValidUrl } = require("../helpers/validation.helpers");
const {isUrlPlaylist} = require("../helpers/playlist.helpers");
/**
* Handles metadata retrieval for a video or playlist.
@@ -37,7 +36,7 @@ async function infoController(req, res) {
logger.info(`Info request received. ENCODED: ${encodedUrl}`);
// Lightweight heuristic to detect playlist URLs. It works for Youtube.
const isPlaylistUrl = isUrlPlaylist(url);
const isPlaylistUrl = url.includes("&list") || url.includes("?list");
logger.info(
isPlaylistUrl
@@ -77,11 +76,11 @@ async function infoController(req, res) {
);
// Preserve original error context
logger.error(err);
throw err;
}
} else {
logger.error(err);
throw err;
}
}

View File

@@ -1,10 +1,9 @@
const path = require("path");
const {getUserBrowser} = require("./getBrowser.helpers.js");
const getUserBrowser = require("./getBrowser.helpers.js");
const { ffmpegPath, denoPath} = require("./path.helpers.js");
const { configFeatures } = require("../../config.js");
const { logger } = require("../logger.js");
const config = require("../../config")
/**
* Validates whether the provided codec is supported by the application.
@@ -131,14 +130,6 @@ function buildYtDlpArgs({url, audioOnly, quality, outputFolder, isPlaylist}) {
outputTemplate = "%(playlist_index)02d - %(title)s.%(ext)s";
}
// Add a custom signature in each file downloaded with the app. It's a small things but i found it cool :)
if (configFeatures.addMetadata) {
args.push(
"--postprocessor-args",
`ffmpeg:-metadata comment="Downloaded with Freedom Loader ${config.version}"`
);
}
args.push("-o", path.join(outputFolder, outputTemplate));
args.push(url);

View File

@@ -1,6 +1,7 @@
const fs = require("fs");
const os = require("os");
const notify = require("./notify.helpers");
const path = require("path");
const notify = require("./notify.helpers")
const { logger } = require("../logger");
/**
@@ -21,38 +22,41 @@ const { logger } = require("../logger");
* @returns {string} The detected browser identifier.
*/
function getUserBrowser() {
const platform = process.platform;
let isFirefoxHere = false;
//const userProfile = os.homedir();
const firefoxPath = getFirefoxProfilePath();
if (platform === "win32") {
const paths = [
"C:\\Program Files\\Mozilla Firefox\\firefox.exe",
"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
`${process.env.LOCALAPPDATA}\\Mozilla Firefox\\firefox.exe`,
];
/**
* Browsers supported by yt-dlp cookie extraction.
*
* Only Firefox is currently enabled and tested.
* Additional browsers can be enabled in the future
* once compatibility has been verified.
*/
const browsers = [
{ name: "firefox", path: firefoxPath },
// { name: "chrome", path: path.join(userProfile, "AppData", "Local", "Google", "Chrome", "User Data", "Default") },
// { name: "brave", path: path.join(userProfile, "AppData", "Local", "BraveSoftware", "Brave-Browser", "User Data", "Default") },
// { name: "edge", path: path.join(userProfile, "AppData", "Local", "Microsoft", "Edge", "User Data", "Default") },
// { name: "opera", path: path.join(userProfile, "AppData", "Roaming", "Opera Software", "Opera Stable") },
// { name: "vivaldi", path: path.join(userProfile, "AppData", "Local", "Vivaldi", "User Data", "Default") },
// { name: "safari", path: path.join(userProfile, "AppData", "Local", "Apple Computer", "Safari") },
// { name: "whale", path: path.join(userProfile, "AppData", "Local", "Naver", "Naver Whale", "User Data", "Default") }
];
isFirefoxHere = paths.some(p => fs.existsSync(p));
// Search for the first available browser profile.
for (const browser of browsers) {
if (browser.path && fs.existsSync(browser.path)) {
logger.info(`Browser found: ${browser.name}`);
return browser.name;
}
}
if (platform === "linux") {
const paths = [
"/usr/bin/firefox",
"/usr/bin/firefox-esr",
"/usr/local/bin/firefox",
"/snap/bin/firefox",
"/var/lib/flatpak/exports/bin/org.mozilla.firefox",
`${os.homedir()}/.local/share/flatpak/exports/bin/org.mozilla.firefox`,
];
isFirefoxHere = paths.some(p => fs.existsSync(p));
}
// No supported browser found => Notify User
logger.warn("No supported browser found on the system");
if (!isFirefoxHere) {
// If you somehow managed to live without Firefox and need help installing it. - Don't applied to my Linux chad
// No supported browser found => Notify User
logger.warn("No supported browser found on the system");
// If you somehow managed to live without Firefox and need help installing it. - Don't applied to my Linux chad
if (process.platform === "win32") {
notify.notifyFirefoxBrowserMissing();
} else {
logger.info("Browser found: firefox");
}
// Fallback to Firefox and let yt-dlp handle the error gracefully.
@@ -60,4 +64,39 @@ function getUserBrowser() {
return "firefox";
}
module.exports = {getUserBrowser};
function getFirefoxProfilePath() {
const home = os.homedir();
if (process.platform === "win32") {
return path.join(
home,
"AppData",
"Roaming",
"Mozilla",
"Firefox",
"Profiles"
);
}
if (process.platform === "linux") {
return path.join(
"usr",
"bin",
"firefox"
);
}
if (process.platform === "darwin") {
return path.join(
home,
"Library",
"Application Support",
"Firefox",
"Profiles"
);
}
return null;
}
module.exports = getUserBrowser

View File

@@ -150,7 +150,7 @@ const binaryPaths = {
* - user themes are persisted in userData to survive updates
*/
const userThemesPath = path.join(app.getPath("userData"), "themes");
const defaultThemesSourcePath = path.join("theme");
const defaultThemesSourcePath = path.join(resourcesPath, "theme");
/**
* Initializes user theme directory and ensures default themes exist.
@@ -260,7 +260,7 @@ function validateBinaries() {
/**
* Helper to lazy load logger, avoid circular import
* @returns {import("winston").Logger}
* @returns {winston.Logger}
*/
function getLogger() {
return require("../logger.js").logger;

View File

@@ -1,12 +0,0 @@
/**
* Determines whether a URL targets a playlist.
*
* The detection is based on the presence of the YouTube
* playlist query parameter (`list`).
*
* @param {string} url - URL to inspect.
* @returns {boolean} True if the URL appears to be a playlist.
*/
export function isUrlPlaylist(url) {
return url.includes("?list=") || url.includes("&list=") || url.includes("@");
}

View File

@@ -17,29 +17,9 @@ try {
console.error(`Failed to create log directory: ${error.message}`);
}
/**
* Format used by the saved file
* @type {Format}
*/
const fileFormat = format.combine(
format.timestamp({format: "YYYY-MM-DD HH:mm:ss"}),
format.errors({stack: true}), // Capture la stack trace complète des erreurs
format.printf(({timestamp, level, message, stack}) => {
return `${timestamp} | ${level.toUpperCase()} | ${stack || message}`;
})
);
/**
* Formated used by the IDE/Console
* @type {Format}
*/
const consoleFormat = format.combine(
format.colorize({all: true}),
format.timestamp({format: "HH:mm:ss"}),
format.errors({stack: true}),
format.printf(({timestamp, level, message, stack}) => {
return `[${timestamp}] ${level}: ${stack || message}`;
})
const logFormat = format.combine(
format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
format.printf(({ timestamp, level, message }) => `${timestamp} | ${level.toUpperCase()} | ${message}`)
);
/**
@@ -53,6 +33,7 @@ const consoleFormat = format.combine(
*/
const logger = createLogger({
level: "info",
format: logFormat,
transports: [
new DailyRotateFile({
dirname: logDir,
@@ -60,11 +41,11 @@ const logger = createLogger({
datePattern: "YYYY-MM-DD",
zippedArchive: false,
maxFiles: "7d",
format: fileFormat,
format: logFormat,
options: { flags: "a" },
}),
new transports.Console({
format: consoleFormat,
format: logFormat,
}),
],
});
@@ -73,17 +54,17 @@ const logger = createLogger({
* Start Log Session
*/
function logSessionStart(logDir, downloadPath) {
logger.info(`--- Starting session: ${new Date().toLocaleString('sv-SE')} ---`);
logger.info(`--- Starting session: ${new Date().toISOString()} ---`);
logger.info("============================================================")
logger.info(`Application Version: ${config.version}`)
if (typeof logSystemInfo === 'function') logSystemInfo(logger, logDir, downloadPath);
logSystemInfo(logger, logDir, downloadPath)
}
/**
* Stop Log Session
*/
function logSessionEnd() {
logger.info(`--- Ending session: ${new Date().toLocaleString('sv-SE')} ---`);
logger.info(`--- Ending session: ${new Date().toISOString()} ---`);
}
module.exports = {

View File

@@ -1,17 +1,11 @@
const express = require("express");
const path = require("path");
const { logger, logSessionEnd } = require("./logger");
const config = require("../config");
const {logger} = require("./logger");
const { rateLimit } = require("./helpers/rateLimit.helpers");
const app = express();
/**
* Store the state of the server
*/
let serverInstance = null;
// Middlewares
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
@@ -36,32 +30,33 @@ app.get("/", rateLimit, (req, res) => {
*/
async function startServer() {
return new Promise((resolve, reject) => {
const serverInstance = app.listen(config.applicationPort, () => {
const server = app.listen(config.applicationPort, () => {
logger.info(`Express server ready at http://localhost:${config.applicationPort}`);
resolve(serverInstance);
resolve(server);
});
serverInstance.on("error", (err) => {
server.on("error", (err) => {
logger.error("Express server error:", err);
reject(err);
});
/**
* Clean exit function
* - Stop Log
* - Stop Express Server
* - Stop Electron App
*/
const gracefulExit = () => {
logSessionEnd();
server.close(() => {
logger.info("Express server closed cleanly.");
process.exit();
});
};
process.on("SIGINT", gracefulExit);
process.on("SIGTERM", gracefulExit);
});
}
/**
* Clean exit function called by Electron
*/
function stopServer() {
if (serverInstance) {
try{
serverInstance.close();
logger.info("Express server closed cleanly");
} catch (err){
logger.error("Express server was not closed cleanly:", err)
}
} else {
logger.info("Express server was already closed");
}
}
module.exports = { startServer, stopServer };
module.exports = { startServer };

View File

@@ -7,7 +7,6 @@ const notify = require("../helpers/notify.helpers");
const path = require("path");
const { isSafePath } = require("../helpers/validation.helpers");
const {reloadFeatures} = require("../../config");
const {isUrlPlaylist} = require("../helpers/playlist.helpers");
/**
* Reference to the currently running yt-dlp process.
@@ -19,6 +18,19 @@ const {isUrlPlaylist} = require("../helpers/playlist.helpers");
*/
let currentDownloadProcess = null;
/**
* Determines whether a URL targets a playlist.
*
* The detection is based on the presence of the YouTube
* playlist query parameter (`list`).
*
* @param {string} url - URL to inspect.
* @returns {boolean} True if the URL appears to be a playlist.
*/
function isPlaylistUrl(url) {
return url.includes("?list=") || url.includes("&list=");
}
/**
* Creates a dedicated download folder for a playlist.
*
@@ -37,23 +49,23 @@ let currentDownloadProcess = null;
*/
function createPlaylistFolder(basePath, playlistTitle) {
const sanitizedTitle = playlistTitle
.replace(/[<>:"|?*]/g, '')
.replace(/\s+/g, ' ')
.replace(/[<>:"|?*]/g, '')
.replace(/\s+/g, ' ')
.trim()
.substring(0, 200);
const playlistPath = path.join(basePath, sanitizedTitle);
try {
if (!fs.existsSync(playlistPath)) {
fs.mkdirSync(playlistPath, { recursive: true });
logger.info(`Playlist folder created: ${playlistPath}`);
return playlistPath;
}
let counter = 1;
let newPath;
while (counter <= 1000) {
newPath = path.join(basePath, `${sanitizedTitle} ${counter}`);
if (!fs.existsSync(newPath)) {
@@ -63,17 +75,17 @@ function createPlaylistFolder(basePath, playlistTitle) {
}
counter++;
}
logger.error(`Could not find available playlist folder after 1000 attempts`);
logger.error("Unable to create playlist folder");
throw new Error("Unable to create playlist folder");
} catch (err) {
logger.warn(`Failed to create playlist folder with title "${sanitizedTitle}": ${err.message}`);
// Fallback: create folder "Untitled Playlist X"
let counter = 1;
let fallbackPath;
while (counter <= 1000) {
fallbackPath = path.join(basePath, `Untitled Playlist ${counter}`);
if (!fs.existsSync(fallbackPath)) {
@@ -88,7 +100,7 @@ function createPlaylistFolder(basePath, playlistTitle) {
}
counter++;
}
logger.error(`Could not create playlist folder after 1000 attempts`);
throw new Error("Unable to create playlist folder");
}
@@ -111,7 +123,7 @@ function createPlaylistFolder(basePath, playlistTitle) {
* @param {string} [options.outputFolder] - Destination folder.
* @param {string} [options.playlistTitle] - Playlist title.
*
* @param {Function[]} progressListeners - Progress listeners.
* @param {Function[]} listeners - Progress listeners.
* @param {Function[]} speedListeners - Download speed listeners.
* @param {Function[]} stageListeners - Processing stage listeners.
* @param {Function[]} playlistInfoListeners - Playlist progress listeners.
@@ -120,24 +132,24 @@ function createPlaylistFolder(basePath, playlistTitle) {
* Resolves with the final output folder path once the
* download has completed successfully.
*/
function fetchDownload(options, progressListeners, speedListeners, stageListeners, playlistInfoListeners) {
function fetchDownload(options, listeners, speedListeners, stageListeners, playlistInfoListeners) {
return new Promise((resolve, reject) => {
const userConfig = reloadFeatures();
logger.info(`CONFIG createPlaylistFolders: ${userConfig.createPlaylistFolders}`);
let outputFolder = options.outputFolder || defaultDownloadFolder;
// Normalize path and validate it's safe (within Users folder)
let safeOutputFolder = path.resolve(outputFolder);
if (!isSafePath(safeOutputFolder)) {
logger.warn(`Path not allowed, using default instead: ${safeOutputFolder}`);
safeOutputFolder = path.resolve(defaultDownloadFolder);
}
// Create download folder if it doesn't exist
try {
fs.mkdirSync(safeOutputFolder, { recursive: true });
@@ -148,7 +160,7 @@ function fetchDownload(options, progressListeners, speedListeners, stageListener
}
// Détecte si c'est une playlist et crée un dossier approprié
const isPlaylist = options.playlistTitle || isUrlPlaylist(options.url);
const isPlaylist = options.playlistTitle || isPlaylistUrl(options.url);
if (isPlaylist && userConfig.createPlaylistFolders) {
try {
@@ -178,25 +190,25 @@ function fetchDownload(options, progressListeners, speedListeners, stageListener
child.on("close", code => {
currentDownloadProcess = null;
progressListeners.forEach(fn => fn("done"));
listeners.forEach(fn => fn("done"));
if (code === 0) resolve(safeOutputFolder);
else if (code === null) reject(new Error(`Download cancelled by user`));
else reject(new Error(`YT-DLP failed with code : ${code}`));
});
child.stdout.on("data", data => {
data.toString().split("\n").forEach(line => {
if (!line.trim()) return;
logger.info(`[yt-dlp] ${line}`);
// Progress Bar
// Progress Bar
if (line.startsWith("[download] Destination:")) {
progressListeners.forEach(fn => fn("reset"));
listeners.forEach(fn => fn("reset"));
stageListeners.forEach(fn => fn("Downloading..."));
}
const match = line.match(/\[download\]\s+(\d+\.\d+)%/);
if (match) progressListeners.forEach(fn => fn(parseFloat(match[1])));
if (match) listeners.forEach(fn => fn(parseFloat(match[1])));
if (line.includes("MiB/s") || line.includes("KiB/s")) {
const match = line.match(/\d+(\.\d+)?[KM]?iB\/s/);
@@ -241,7 +253,7 @@ function fetchDownload(options, progressListeners, speedListeners, stageListener
data.toString().split("\n").forEach(line => line.trim() && logger.error(`[yt-dlp stderr] ${line}`));
});
});
}
@@ -258,7 +270,7 @@ function fetchDownload(options, progressListeners, speedListeners, stageListener
function cancelDownload() {
if (currentDownloadProcess) {
logger.info("Cancelling download and killing all child processes...");
// Force kill the process and all its children with SIGKILL
try {
// Try to kill with SIGKILL on Windows (process group) or Unix
@@ -274,7 +286,7 @@ function cancelDownload() {
// Fallback to regular kill
currentDownloadProcess.kill('SIGKILL');
}
currentDownloadProcess = null;
logger.info("Download cancelled successfully");
return true;

View File

@@ -1,6 +1,6 @@
const { execFile } = require("child_process");
const { userYtDlp, denoPath } = require("../helpers/path.helpers");
const {getUserBrowser} = require("../helpers/getBrowser.helpers");
const getUserBrowser = require("../helpers/getBrowser.helpers");
const { logger } = require("../logger");
/**
@@ -61,7 +61,6 @@ function fetchInfo(url) {
try {
const data = JSON.parse(stdout);
resolve(data);
} catch (e) {
logger.error(`JSON Parsing Error: ${e.message}`);

Binary file not shown.