diff --git a/src/main/download-engine/args-builder.ts b/src/main/download-engine/args-builder.ts index 53aa440..4cfc0cb 100644 --- a/src/main/download-engine/args-builder.ts +++ b/src/main/download-engine/args-builder.ts @@ -34,8 +34,8 @@ export const resolveVideoFormatSelector = (options: DownloadOptions): string => return 'bestvideo+none' } if (!audioFormat || audioFormat === 'best') { - // Use bestvideo+bestaudio to ensure video and audio are merged into a single file - return 'bestvideo+bestaudio' + // Prefer merged formats, but allow single-file "best" for sites without separate streams. + return 'bestvideo+bestaudio/best' } return `bestvideo+${audioFormat}` } diff --git a/src/renderer/src/components/download/DownloadDialog.tsx b/src/renderer/src/components/download/DownloadDialog.tsx index 179d1a6..2466cb6 100644 --- a/src/renderer/src/components/download/DownloadDialog.tsx +++ b/src/renderer/src/components/download/DownloadDialog.tsx @@ -78,11 +78,11 @@ const getQualityPreset = (settings: AppSettings): OneClickQualityPreset => const buildAudioSelectors = (preset: OneClickQualityPreset): string[] => { if (preset === 'worst') { - return ['worstaudio'] + return dedupe(['worstaudio', 'bestaudio']) } const abrLimit = qualityPresetToAudioAbr[preset] - // Remove 'best' fallback to ensure merging - only use 'bestaudio' variants + // Prefer audio-only selectors so video+audio merges remain valid. return dedupe([abrLimit ? `bestaudio[abr<=${abrLimit}]` : undefined, 'bestaudio']) } @@ -90,8 +90,8 @@ const buildVideoFormatPreference = (settings: AppSettings): string => { const preset = getQualityPreset(settings) if (preset === 'worst') { - // Use worstvideo+worstaudio as fallback instead of 'worst' to ensure merging - return 'worstvideo+worstaudio' + // Prefer separate streams, then fall back to single-file selectors. + return 'worstvideo+worstaudio/worst/best' } const maxHeight = qualityPresetToVideoHeight[preset] @@ -125,7 +125,7 @@ const buildVideoFormatPreference = (settings: AppSettings): string => { const buildAudioFormatPreference = (settings: AppSettings): string => { const selectors = buildAudioSelectors(getQualityPreset(settings)) - return selectors.join('/') + return dedupe([...selectors, 'best']).join('/') } interface DownloadDialogProps {