From a7e4eb865b565d5a196985157ca03813cb5cb88c Mon Sep 17 00:00:00 2001 From: Nexmoe <16796652+nexmoe@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:01:11 +0800 Subject: [PATCH] feat: add cookies file support in settings and download engine, enhance i18n with new cookie-related translations --- src/main/download-engine/args-builder.ts | 5 ++ src/main/lib/download-engine.ts | 10 +++ src/renderer/src/locales/en.json | 8 ++ src/renderer/src/pages/Settings.tsx | 94 ++++++++++++++++++++---- src/shared/types/index.ts | 2 + 5 files changed, 105 insertions(+), 14 deletions(-) diff --git a/src/main/download-engine/args-builder.ts b/src/main/download-engine/args-builder.ts index 5078867..a044635 100644 --- a/src/main/download-engine/args-builder.ts +++ b/src/main/download-engine/args-builder.ts @@ -90,6 +90,11 @@ export const buildDownloadArgs = ( args.push('--cookies-from-browser', settings.browserForCookies) } + const cookiesPath = settings.cookiesPath?.trim() + if (cookiesPath) { + args.push('--cookies', cookiesPath) + } + if (settings.proxy) { args.push('--proxy', settings.proxy) } diff --git a/src/main/lib/download-engine.ts b/src/main/lib/download-engine.ts index 398516c..d1dd911 100644 --- a/src/main/lib/download-engine.ts +++ b/src/main/lib/download-engine.ts @@ -61,6 +61,11 @@ class DownloadEngine extends EventEmitter { args.push('--cookies-from-browser', settings.browserForCookies) } + const cookiesPath = settings.cookiesPath?.trim() + if (cookiesPath) { + args.push('--cookies', cookiesPath) + } + // Add config file if configured if (settings.configPath) { args.push('--config-location', `"${settings.configPath}"`) @@ -130,6 +135,11 @@ class DownloadEngine extends EventEmitter { args.push('--cookies-from-browser', settings.browserForCookies) } + const cookiesPath = settings.cookiesPath?.trim() + if (cookiesPath) { + args.push('--cookies', cookiesPath) + } + args.push(url) return new Promise((resolve, reject) => { diff --git a/src/renderer/src/locales/en.json b/src/renderer/src/locales/en.json index f80e699..d8d5502 100644 --- a/src/renderer/src/locales/en.json +++ b/src/renderer/src/locales/en.json @@ -255,6 +255,14 @@ "audio": "Audio Preferences", "browserForCookies": "Select browser to use cookies from", "browserForCookiesDescription": "Browser to extract cookies from for authentication", + "cookiesFile": "Cookies file", + "cookiesFileDescription": "Netscape formatted cookies file to load for authentication", + "clearCookiesFile": "Clear", + "cookiesHelpTitle": "Using cookies", + "cookiesHelpBrowser": "Pick your browser above to reuse its signed-in session automatically.", + "cookiesHelpFile": "Export a Netscape cookies file (see the yt-dlp FAQ) and select it here when needed.", + "cookiesHelpFaq": "Open yt-dlp cookies FAQ", + "openLinkError": "Failed to open link", "browserOptions": { "brave": "Brave", "chrome": "Chrome", diff --git a/src/renderer/src/pages/Settings.tsx b/src/renderer/src/pages/Settings.tsx index 1634ebd..335f6a2 100644 --- a/src/renderer/src/pages/Settings.tsx +++ b/src/renderer/src/pages/Settings.tsx @@ -71,6 +71,31 @@ export function Settings() { } } + const handleSelectCookiesFile = async () => { + try { + const { ipcServices } = await import('../lib/ipc') + const path = await ipcServices.fs.selectFile() + if (path) { + await handleSettingChange('cookiesPath', path) + } + } catch (error) { + console.error('Failed to select cookies file:', error) + toast.error(t('settings.fileSelectError')) + } + } + + const handleOpenCookiesFaq = async () => { + try { + const { ipcServices } = await import('../lib/ipc') + await ipcServices.fs.openExternal( + 'https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp' + ) + } catch (error) { + console.error('Failed to open cookies FAQ:', error) + toast.error(t('settings.openLinkError')) + } + } + const handleThemeChange = async (value: 'light' | 'dark' | 'system') => { const currentTheme = (theme ?? settings.theme ?? 'system') as 'light' | 'dark' | 'system' if (currentTheme === value) { @@ -269,6 +294,38 @@ export function Settings() { + + + {t('settings.proxy')} + {t('settings.proxyDescription')} + + + handleSettingChange('proxy', e.target.value)} + className="w-64" + /> + + + + + + + + {t('settings.configFile')} + {t('settings.configFileDescription')} + + + + + {t('settings.selectPath')} + + + + + + {t('settings.browserForCookies')} @@ -300,16 +357,21 @@ export function Settings() { - {t('settings.proxy')} - {t('settings.proxyDescription')} + {t('settings.cookiesFile')} + {t('settings.cookiesFileDescription')} - handleSettingChange('proxy', e.target.value)} - className="w-64" - /> + + + {t('settings.selectPath')} + void handleSettingChange('cookiesPath', '')} + disabled={!settings.cookiesPath} + > + {t('settings.clearCookiesFile')} + + @@ -317,14 +379,18 @@ export function Settings() { - {t('settings.configFile')} - {t('settings.configFileDescription')} + {t('settings.cookiesHelpTitle')} + + + {t('settings.cookiesHelpBrowser')} + {t('settings.cookiesHelpFile')} + + - - - {t('settings.selectPath')} - + + {t('settings.cookiesHelpFaq')} + diff --git a/src/shared/types/index.ts b/src/shared/types/index.ts index f651fec..cbb1336 100644 --- a/src/shared/types/index.ts +++ b/src/shared/types/index.ts @@ -146,6 +146,7 @@ export interface AppSettings { showMoreFormats: boolean maxConcurrentDownloads: number browserForCookies: string + cookiesPath: string proxy: string configPath: string betaProgram: boolean @@ -163,6 +164,7 @@ export const defaultSettings: AppSettings = { showMoreFormats: false, maxConcurrentDownloads: 5, browserForCookies: 'none', + cookiesPath: '', proxy: '', configPath: '', betaProgram: false,