diff --git a/apps/desktop/app-icon-padded.png b/apps/desktop/app-icon-padded.png new file mode 100644 index 0000000..4d5d0c9 Binary files /dev/null and b/apps/desktop/app-icon-padded.png differ diff --git a/apps/desktop/app-icon-small.png b/apps/desktop/app-icon-small.png new file mode 100644 index 0000000..e71efa0 Binary files /dev/null and b/apps/desktop/app-icon-small.png differ diff --git a/apps/desktop/app-icon-transparent.png b/apps/desktop/app-icon-transparent.png new file mode 100644 index 0000000..d646ee6 Binary files /dev/null and b/apps/desktop/app-icon-transparent.png differ diff --git a/apps/desktop/app-icon.png b/apps/desktop/app-icon.png new file mode 100644 index 0000000..872bbec Binary files /dev/null and b/apps/desktop/app-icon.png differ diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock index 3c1e192..cd7adf5 100644 --- a/apps/desktop/src-tauri/Cargo.lock +++ b/apps/desktop/src-tauri/Cargo.lock @@ -334,6 +334,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.11.1" @@ -1826,6 +1832,19 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png 0.18.1", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -2166,6 +2185,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "muda" version = "0.19.2" @@ -2895,6 +2924,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + [[package]] name = "quick-xml" version = "0.37.5" @@ -3856,6 +3891,7 @@ dependencies = [ "gtk", "heck 0.5.0", "http", + "image", "jni", "libc", "log", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index b6b3cdd..38ceede 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -18,7 +18,7 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2", features = ["tray-icon"] } +tauri = { version = "2", features = ["tray-icon", "image-png"] } tauri-plugin-opener = "2" tauri-plugin-dialog = "2" serde = { version = "1", features = ["derive"] } diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png index 6be5e50..c21af8a 100644 Binary files a/apps/desktop/src-tauri/icons/128x128.png and b/apps/desktop/src-tauri/icons/128x128.png differ diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png index e81bece..2d3c7b9 100644 Binary files a/apps/desktop/src-tauri/icons/128x128@2x.png and b/apps/desktop/src-tauri/icons/128x128@2x.png differ diff --git a/apps/desktop/src-tauri/icons/32x32.png b/apps/desktop/src-tauri/icons/32x32.png index a437dd5..f1c7256 100644 Binary files a/apps/desktop/src-tauri/icons/32x32.png and b/apps/desktop/src-tauri/icons/32x32.png differ diff --git a/apps/desktop/src-tauri/icons/64x64.png b/apps/desktop/src-tauri/icons/64x64.png new file mode 100644 index 0000000..17dcd58 Binary files /dev/null and b/apps/desktop/src-tauri/icons/64x64.png differ diff --git a/apps/desktop/src-tauri/icons/Square107x107Logo.png b/apps/desktop/src-tauri/icons/Square107x107Logo.png index 0ca4f27..d0dbb80 100644 Binary files a/apps/desktop/src-tauri/icons/Square107x107Logo.png and b/apps/desktop/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square142x142Logo.png b/apps/desktop/src-tauri/icons/Square142x142Logo.png index b81f820..1970ed9 100644 Binary files a/apps/desktop/src-tauri/icons/Square142x142Logo.png and b/apps/desktop/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square150x150Logo.png b/apps/desktop/src-tauri/icons/Square150x150Logo.png index 624c7bf..53463b8 100644 Binary files a/apps/desktop/src-tauri/icons/Square150x150Logo.png and b/apps/desktop/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square284x284Logo.png b/apps/desktop/src-tauri/icons/Square284x284Logo.png index c021d2b..51f8309 100644 Binary files a/apps/desktop/src-tauri/icons/Square284x284Logo.png and b/apps/desktop/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square30x30Logo.png b/apps/desktop/src-tauri/icons/Square30x30Logo.png index 6219700..3a78ffb 100644 Binary files a/apps/desktop/src-tauri/icons/Square30x30Logo.png and b/apps/desktop/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square310x310Logo.png b/apps/desktop/src-tauri/icons/Square310x310Logo.png index f9bc048..1446121 100644 Binary files a/apps/desktop/src-tauri/icons/Square310x310Logo.png and b/apps/desktop/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square44x44Logo.png b/apps/desktop/src-tauri/icons/Square44x44Logo.png index d5fbfb2..b0b6157 100644 Binary files a/apps/desktop/src-tauri/icons/Square44x44Logo.png and b/apps/desktop/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square71x71Logo.png b/apps/desktop/src-tauri/icons/Square71x71Logo.png index 63440d7..b530887 100644 Binary files a/apps/desktop/src-tauri/icons/Square71x71Logo.png and b/apps/desktop/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/desktop/src-tauri/icons/Square89x89Logo.png b/apps/desktop/src-tauri/icons/Square89x89Logo.png index f3f705a..20186c8 100644 Binary files a/apps/desktop/src-tauri/icons/Square89x89Logo.png and b/apps/desktop/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/desktop/src-tauri/icons/StoreLogo.png b/apps/desktop/src-tauri/icons/StoreLogo.png index 4556388..c2f2bb4 100644 Binary files a/apps/desktop/src-tauri/icons/StoreLogo.png and b/apps/desktop/src-tauri/icons/StoreLogo.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/apps/desktop/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..3da5f57 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..1e8a5fc Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..196e839 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..a67c5d1 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..46cdc47 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..d25d78b Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..b9f314b Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..72aebd8 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..19356ab Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..7014b42 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..b735817 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e3ca63a Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..088da3d Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..e7bf0cd Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..f18ead3 Binary files /dev/null and b/apps/desktop/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml b/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..ea9c223 --- /dev/null +++ b/apps/desktop/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns index 12a5bce..af473a0 100644 Binary files a/apps/desktop/src-tauri/icons/icon.icns and b/apps/desktop/src-tauri/icons/icon.icns differ diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico index b3636e4..7d4daa3 100644 Binary files a/apps/desktop/src-tauri/icons/icon.ico and b/apps/desktop/src-tauri/icons/icon.ico differ diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png index e1cd261..826dcde 100644 Binary files a/apps/desktop/src-tauri/icons/icon.png and b/apps/desktop/src-tauri/icons/icon.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000..6268fdf Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000..5c2c13f Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 0000000..5c2c13f Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 0000000..5f73ea5 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000..16eb9d9 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000..f15db19 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000..f15db19 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000..36c6497 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000..5c2c13f Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000..b75e524 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000..b75e524 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000..95ecaf2 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000..d04928a Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000..95ecaf2 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000..fd206a4 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000..fefe958 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000..25a3767 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000..21bc634 Binary files /dev/null and b/apps/desktop/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/apps/desktop/src-tauri/icons/trayTemplate.png b/apps/desktop/src-tauri/icons/trayTemplate.png new file mode 100644 index 0000000..6d94556 Binary files /dev/null and b/apps/desktop/src-tauri/icons/trayTemplate.png differ diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index a673c84..0ad136b 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -697,11 +697,13 @@ async fn start_media_download( password: Option, headers: Option, proxy: Option, + user_agent: Option, + max_tries: Option, ) -> Result<(), String> { let task = queue::DownloadTask { is_media: true, id, url, destination, filename, speed_limit, username, password, headers, proxy, - connections: None, checksum: None, cookies: None, mirrors: None, user_agent: None, max_tries: None, + connections: None, checksum: None, cookies: None, mirrors: None, user_agent, max_tries, format_selector, cookie_source, }; state.cmd_tx.send(queue::DownloadCommand::Enqueue(task)).map_err(|e| e.to_string())?; @@ -725,6 +727,8 @@ pub(crate) async fn start_media_download_internal( let password = task.password; let headers = task.headers; let proxy = task.proxy; + let user_agent = task.user_agent; + let max_tries = task.max_tries; println!("start_media_download called for id: {}", id); let resource_dir = app_handle.path().resource_dir().map_err(|e| e.to_string())?; @@ -779,12 +783,23 @@ pub(crate) async fn start_media_download_internal( } } - if let Some(cs) = cookie_source { + if let Some(mut cs) = cookie_source { if !cs.is_empty() && cs != "none" { + if cs == "safari" { cs = "safari:".to_string() } cmd.arg("--cookies-from-browser").arg(cs); } } + if let Some(ua) = user_agent { + if !ua.is_empty() { + cmd.arg("--user-agent").arg(ua); + } + } + + if let Some(tries) = max_tries { + cmd.arg("--retries").arg(tries.to_string()); + } + let mut config_file = tempfile::Builder::new().prefix("ytdlp-").suffix(".conf").tempfile().map_err(|e| e.to_string())?; let mut config_content = String::new(); if let Some(user) = username { @@ -998,70 +1013,23 @@ fn set_prevent_sleep(state: tauri::State<'_, AppState>, prevent: bool) { #[tauri::command] fn perform_system_action(action: String) -> Result<(), String> { let status = match action.as_str() { - "sleep" => { - #[cfg(target_os = "macos")] - { - Command::new("osascript") - .arg("-e") - .arg("tell application \"Finder\" to sleep") - .status() - } - #[cfg(target_os = "windows")] - { - Command::new("rundll32.exe") - .arg("powrprof.dll,SetSuspendState") - .arg("0,1,0") - .status() - } - #[cfg(target_os = "linux")] - { - Command::new("systemctl").arg("suspend").status() - } - } - "restart" => { - #[cfg(target_os = "macos")] - { - Command::new("osascript") - .arg("-e") - .arg("tell application \"Finder\" to restart") - .status() - } - #[cfg(target_os = "windows")] - { - Command::new("shutdown").args(["/r", "/t", "0"]).status() - } - #[cfg(target_os = "linux")] - { - Command::new("systemctl").arg("reboot").status() - } - } - "shutdown" => { - #[cfg(target_os = "macos")] - { - Command::new("osascript") - .arg("-e") - .arg("tell application \"Finder\" to shut down") - .status() - } - #[cfg(target_os = "windows")] - { - Command::new("shutdown").args(["/s", "/t", "0"]).status() - } - #[cfg(target_os = "linux")] - { - Command::new("systemctl").arg("poweroff").status() - } - } - _ => return Err("Unsupported system action".to_string()), + "shutdown" => std::process::Command::new("osascript").arg("-e").arg("tell app \"System Events\" to shut down").status(), + "restart" => std::process::Command::new("osascript").arg("-e").arg("tell app \"System Events\" to restart").status(), + "sleep" => std::process::Command::new("osascript").arg("-e").arg("tell app \"System Events\" to sleep").status(), + _ => return Err("Invalid action".to_string()) }; match status { - Ok(result) if result.success() => Ok(()), - Ok(result) => Err(format!("System action exited with status {result}")), - Err(error) => Err(format!("Failed to perform system action: {error}")), + Ok(_) => Ok(()), + Err(e) => Err(e.to_string()) } } +#[tauri::command] +fn set_concurrent_limit(state: tauri::State<'_, AppState>, limit: usize) { + let _ = state.cmd_tx.send(queue::DownloadCommand::SetLimit(limit)); +} + #[tauri::command] fn request_automation_permission() -> Result<(), String> { #[cfg(target_os = "macos")] @@ -1216,8 +1184,10 @@ fn toggle_tray_icon(app_handle: tauri::AppHandle, show: bool) -> Result<(), Stri let show_i = MenuItem::with_id(&app_handle, "show", "Show Firelink", true, None::<&str>).map_err(|e| e.to_string())?; let menu = Menu::with_items(&app_handle, &[&show_i, &quit_i]).map_err(|e| e.to_string())?; + let tray_icon = tauri::image::Image::from_bytes(include_bytes!("../icons/trayTemplate.png")).unwrap(); let _tray = TrayIconBuilder::with_id("main") - .icon(app_handle.default_window_icon().unwrap().clone()) + .icon(tray_icon) + .icon_as_template(true) .menu(&menu) .on_menu_event(|app, event| match event.id.as_ref() { "quit" => { @@ -1342,7 +1312,7 @@ pub fn run() { request_automation_permission, open_automation_settings, set_keychain_password, get_keychain_password, delete_keychain_password, check_file_exists, delete_file, toggle_tray_icon, set_extension_pairing_token, - set_extension_frontend_ready, + set_extension_frontend_ready, set_concurrent_limit, parity::get_system_proxy, parity::get_file_category, parity::check_for_updates ]) .run(tauri::generate_context!()) diff --git a/apps/desktop/src-tauri/src/queue.rs b/apps/desktop/src-tauri/src/queue.rs index c98a5fb..ab090a1 100644 --- a/apps/desktop/src-tauri/src/queue.rs +++ b/apps/desktop/src-tauri/src/queue.rs @@ -30,7 +30,7 @@ pub enum DownloadCommand { } pub fn setup_queue(app_handle: tauri::AppHandle, mut cmd_rx: mpsc::UnboundedReceiver) { - tokio::spawn(async move { + tauri::async_runtime::spawn(async move { let mut queue = std::collections::VecDeque::new(); let mut active_count = 0; let mut limit = 3; diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 29d9a54..70c6764 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -53,11 +53,16 @@ function App() { const schedulerRunning = useSettingsStore(state => state.schedulerRunning); const globalSpeedLimit = useSettingsStore(state => state.globalSpeedLimit); const previousSpeedLimit = useRef(globalSpeedLimit); + const maxConcurrentDownloads = useSettingsStore(state => state.maxConcurrentDownloads); useEffect(() => { window.document.documentElement.setAttribute('data-font-size', appFontSize); }, [appFontSize]); + useEffect(() => { + invoke('set_concurrent_limit', { limit: maxConcurrentDownloads }).catch(console.error); + }, [maxConcurrentDownloads]); + useEffect(() => { invoke('update_dock_badge', { count: showDockBadge ? activeDownloadCount : 0 }).catch(() => {}); }, [showDockBadge, activeDownloadCount]); @@ -231,14 +236,18 @@ function App() { }, []); return ( -
+
{/* Left Side Panel - Curved Second Layer on Top */} - {isSidebarVisible && ( -
+
+
{ setFilter(f); useSettingsStore.getState().setActiveView('downloads'); }} />
- )} +
{/* Main Content - Base Layer */}
@@ -250,12 +259,21 @@ function App() {
{/* Status Bar */} -
- Ready -
- {activeDownloadCount} active - {queuedCount} queued - {doneCount} done +
+ + + Ready + +
+ + {activeDownloadCount} active + + + {queuedCount} queued + + + {doneCount} done +
diff --git a/apps/desktop/src/assets/app-icon.png b/apps/desktop/src/assets/app-icon.png new file mode 100644 index 0000000..872bbec Binary files /dev/null and b/apps/desktop/src/assets/app-icon.png differ diff --git a/apps/desktop/src/components/DownloadTable.tsx b/apps/desktop/src/components/DownloadTable.tsx index da81884..2bd23ef 100644 --- a/apps/desktop/src/components/DownloadTable.tsx +++ b/apps/desktop/src/components/DownloadTable.tsx @@ -13,16 +13,7 @@ interface DownloadTableProps { export const DownloadTable: React.FC = ({ filter }) => { const { downloads, toggleAddModal, updateDownload, removeDownload, clearFinished, redownload } = useDownloadStore(); - const { isSidebarVisible, toggleSidebar, listRowDensity } = useSettingsStore(); - - const getPaddingY = () => { - switch (listRowDensity) { - case 'compact': return 'py-1'; - case 'relaxed': return 'py-4'; - default: return 'py-3'; - } - }; - const py = getPaddingY(); + const { isSidebarVisible, toggleSidebar } = useSettingsStore(); const [contextMenu, setContextMenu] = useState<{ x: number; y: number; id: string } | null>(null); @@ -111,34 +102,35 @@ export const DownloadTable: React.FC = ({ filter }) => { } return ( -
-
- +
+
+ {/* Download Toolbar */} -
+

{getFilterTitle()}

-
+
+
+
- {/* Table */} -
- - - - - - - - - - - - + {/* List */} +
+
+
+
FILE
+
SIZE
+
STATUS
+
SPEED
+
ETA
+
DATE ADDED
+
+
{filteredDownloads.length === 0 ? ( -
- - + No downloads in this view + + ) : ( filteredDownloads.map(d => ( - { e.preventDefault(); setContextMenu({ @@ -200,19 +191,19 @@ export const DownloadTable: React.FC = ({ filter }) => { }); }} > - - - - - - - + + )) )} - -
FILESIZESTATUSSPEEDETADATE ADDED
-
- - No downloads in this view +
+
+
+
-
+
-
+
{getCategoryIcon(d.category)}
{d.fileName}
-
+ +
{d.status === 'downloading' || d.status === 'paused' ? ( -
-
-
+
+
+
{((d.fraction || 0) * 100).toFixed(1)}% @@ -221,33 +212,33 @@ export const DownloadTable: React.FC = ({ filter }) => { ) : ( {d.size || '-'} )} -
- +
+ {d.status} -
{d.speed}{d.eta} -
- +
+
{d.speed}
+
{d.eta}
+
+
+ {d.dateAdded ? new Date(d.dateAdded).toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' }) : '-'} -
+
{d.status === 'downloading' && ( - )} {d.status === 'paused' && ( - )} @@ -256,18 +247,18 @@ export const DownloadTable: React.FC = ({ filter }) => { e.stopPropagation(); setContextMenu({ x: e.clientX, y: e.clientY, id: d.id }); }} - className="p-1 bg-[#2A2B2D] border border-[#3f3f3f] hover:bg-[#3f3f3f] rounded text-text-muted hover:text-text-primary transition-colors" + className="p-1.5 bg-bg-modal border border-border-color shadow-sm hover:border-accent hover:text-accent rounded-lg text-text-muted transition-all hover-lift" >
-
+
+
{/* Floating Context Menu */} diff --git a/apps/desktop/src/components/SettingsView.tsx b/apps/desktop/src/components/SettingsView.tsx index 5cc2b1c..467a15c 100644 --- a/apps/desktop/src/components/SettingsView.tsx +++ b/apps/desktop/src/components/SettingsView.tsx @@ -2,11 +2,12 @@ import { useState, useEffect } from 'react'; import { SettingsTab, useSettingsStore } from '../store/useSettingsStore'; import { Download, Palette, Globe, Folder, Key, - Moon, Terminal, Puzzle, Info, Plus, Trash2, Copy, RefreshCw + Moon, Terminal, Puzzle, Info, Plus, Trash2, Copy, RefreshCw, Code } from 'lucide-react'; import { open } from '@tauri-apps/plugin-dialog'; import { invoke } from '@tauri-apps/api/core'; import { WindowDragRegion } from './WindowDragRegion'; +import appIcon from '../assets/app-icon.png'; const settingsTabs: { type: SettingsTab; label: string; icon: typeof Download }[] = [ { type: 'downloads', label: 'Downloads', icon: Download }, @@ -793,24 +794,72 @@ export default function SettingsView() { {/* About Pane */} {activeTab === 'about' && ( -
-
- FL -
-
-

Firelink Desktop

-

Version 0.8.0-rewrite (Tauri v2)

-

- A high-speed, cross-platform download engine rebuilt in Rust, React, and Tailwind, replicating the premium SwiftUI native look. -

+
+ {/* Header Box */} +
+ Firelink Icon +
+

Firelink

+

Version 0.7.3

+

+ A native macOS download manager for fast, organized, segmented transfers. +

+
-
- GitHub Repository - - Report Issues + {/* Updates Section */} +
+

Updates

+
+
+
+

Check for Updates

+

Firelink checks GitHub Releases for new versions.

+
+ +
+ +
+
+ + {/* Credits Footer */} +
+
+ Created by NimBold + + Source Code + +
+
+ Powered by aria2yt-dlpffmpegDeno + MIT License +
+
+ Copyright © 2026 NimBold. All rights reserved. +
-

© 2026 Firelink Project. Released under the MIT License.

)} diff --git a/apps/desktop/src/components/Sidebar.tsx b/apps/desktop/src/components/Sidebar.tsx index 6815640..e9bb97b 100644 --- a/apps/desktop/src/components/Sidebar.tsx +++ b/apps/desktop/src/components/Sidebar.tsx @@ -63,18 +63,18 @@ export const Sidebar: React.FC = (props) => { return ( ); @@ -170,17 +170,17 @@ export const Sidebar: React.FC = (props) => { return (