diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 7f8d66b..0b5d21b 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -13,6 +13,15 @@ struct MetadataResponse { size_bytes: u64, } +fn get_binary_name(base: &str) -> String { + if cfg!(target_os = "windows") { + format!("{}.exe", base) + } else { + base.to_string() + } +} + + #[tauri::command] async fn fetch_metadata(url: String, user_agent: Option, username: Option, password: Option) -> Result { let mut builder = reqwest::Client::builder(); @@ -115,7 +124,7 @@ async fn fetch_metadata(url: String, user_agent: Option, username: Optio async fn fetch_media_metadata(app_handle: tauri::AppHandle, url: String, cookie_browser: Option, username: Option, password: Option) -> Result { println!("fetch_media_metadata called for: {}", url); let resource_dir = app_handle.path().resource_dir().map_err(|e| e.to_string())?; - let ytdlp_path = resource_dir.join("binaries").join("yt-dlp"); + let ytdlp_path = resource_dir.join("binaries").join(get_binary_name("yt-dlp")); let mut cmd = AsyncCommand::new(&ytdlp_path); cmd.arg("-J") @@ -179,7 +188,7 @@ fn greet(name: &str) -> String { async fn test_ytdlp(app_handle: tauri::AppHandle) -> Result { println!("test_ytdlp called!"); let resource_dir = app_handle.path().resource_dir().map_err(|e| e.to_string())?; - let ytdlp_path = resource_dir.join("binaries").join("yt-dlp"); + let ytdlp_path = resource_dir.join("binaries").join(get_binary_name("yt-dlp")); println!("Resolved yt-dlp path: {:?}", ytdlp_path); let output = AsyncCommand::new(&ytdlp_path) @@ -207,7 +216,7 @@ async fn test_ytdlp(app_handle: tauri::AppHandle) -> Result { async fn test_ffmpeg(app_handle: tauri::AppHandle) -> Result { println!("test_ffmpeg called!"); let resource_dir = app_handle.path().resource_dir().map_err(|e| e.to_string())?; - let ffmpeg_path = resource_dir.join("binaries").join("ffmpeg"); + let ffmpeg_path = resource_dir.join("binaries").join(get_binary_name("ffmpeg")); println!("Resolved ffmpeg path: {:?}", ffmpeg_path); let output = AsyncCommand::new(&ffmpeg_path) @@ -238,7 +247,7 @@ async fn test_ffmpeg(app_handle: tauri::AppHandle) -> Result { async fn test_deno(app_handle: tauri::AppHandle) -> Result { println!("test_deno called!"); let resource_dir = app_handle.path().resource_dir().map_err(|e| e.to_string())?; - let deno_path = resource_dir.join("binaries").join("deno"); + let deno_path = resource_dir.join("binaries").join(get_binary_name("deno")); println!("Resolved deno path: {:?}", deno_path); let output = AsyncCommand::new(&deno_path) @@ -606,8 +615,8 @@ pub(crate) async fn start_media_download_internal( ) -> Result<(), String> { println!("start_media_download called for id: {}", id); let resource_dir = app_handle.path().resource_dir().map_err(|e| e.to_string())?; - let ytdlp_path = resource_dir.join("binaries").join("yt-dlp"); - let ffmpeg_path = resource_dir.join("binaries").join("ffmpeg"); + let ytdlp_path = resource_dir.join("binaries").join(get_binary_name("yt-dlp")); + let ffmpeg_path = resource_dir.join("binaries").join(get_binary_name("ffmpeg")); let mut resolved_dest = std::path::PathBuf::from(&destination); if destination.starts_with("~/") { @@ -1243,7 +1252,7 @@ pub fn run() { } let resource_dir = app.path().resource_dir().unwrap(); - let aria2c_path = resource_dir.join("binaries").join("aria2c"); + let aria2c_path = resource_dir.join("binaries").join(get_binary_name("aria2c")); #[cfg(all(target_os = "macos", debug_assertions))] if let Err(error) = resign_aria2_debug_bundle(&aria2c_path) { diff --git a/apps/desktop/src/store/useSettingsStore.ts b/apps/desktop/src/store/useSettingsStore.ts index b7a2918..3f57625 100644 --- a/apps/desktop/src/store/useSettingsStore.ts +++ b/apps/desktop/src/store/useSettingsStore.ts @@ -230,7 +230,10 @@ export const useSettingsStore = create()( set({ maxConcurrentDownloads: max }); invoke('set_concurrent_limit', { limit: max }).catch(console.error); }, - setGlobalSpeedLimit: (limit) => set({ globalSpeedLimit: limit }), + setGlobalSpeedLimit: (limit) => { + set({ globalSpeedLimit: limit }); + invoke('set_global_speed_limit', { limit: limit === '' || limit === '0' ? null : limit }).catch(console.error); + }, setActiveView: (view) => set({ activeView: view }), setActiveSettingsTab: (activeSettingsTab) => set({ activeSettingsTab }), setScheduler: (scheduler) => set({ scheduler }), @@ -246,14 +249,20 @@ export const useSettingsStore = create()( setPlayCompletionSound: (playCompletionSound) => set({ playCompletionSound }), setAppFontSize: (appFontSize) => set({ appFontSize }), setListRowDensity: (listRowDensity) => set({ listRowDensity }), - setShowDockBadge: (showDockBadge) => set({ showDockBadge }), + setShowDockBadge: (showDockBadge) => { + set({ showDockBadge }); + if (!showDockBadge) invoke('update_dock_badge', { count: 0 }).catch(console.error); + }, setShowMenuBarIcon: (showMenuBarIcon) => set({ showMenuBarIcon }), setProxyMode: (proxyMode) => set({ proxyMode }), setProxyHost: (proxyHost) => set({ proxyHost }), setProxyPort: (proxyPort) => set({ proxyPort }), setCustomUserAgent: (customUserAgent) => set({ customUserAgent }), setAskWhereToSaveEachFile: (askWhereToSaveEachFile) => set({ askWhereToSaveEachFile }), - setPreventsSleepWhileDownloading: (preventsSleepWhileDownloading) => set({ preventsSleepWhileDownloading }), + setPreventsSleepWhileDownloading: (preventsSleepWhileDownloading) => { + set({ preventsSleepWhileDownloading }); + if (!preventsSleepWhileDownloading) invoke('set_prevent_sleep', { prevent: false }).catch(console.error); + }, setMediaCookieSource: (mediaCookieSource) => set({ mediaCookieSource }), setCategoryDirectory: (category, path) => set((state) => ({ downloadDirectories: { ...state.downloadDirectories, [category]: path }