From e9140ab6a1ad791638b899d71e6cbd551027c13c Mon Sep 17 00:00:00 2001 From: Mattias Thall Date: Tue, 26 May 2026 20:07:41 +0200 Subject: [PATCH] Fix quality format fallbacks and resolution detection above 1080p The per-quality format strings fell back to best[height<=NNN] which on YouTube resolves to pre-merged streams capped at ~360p, causing every quality selector choice to silently download low-res video. Replace with bestvideo+bestaudio as the intermediate fallback so adaptive streams are always preferred over pre-merged ones. Also fix detect_resolution to correctly label 1440p and 2160p files instead of capping the display at 1080p. Co-Authored-By: Claude Sonnet 4.6 --- backend/services/ytdlp.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/backend/services/ytdlp.py b/backend/services/ytdlp.py index b9dad2b..8cf15b5 100644 --- a/backend/services/ytdlp.py +++ b/backend/services/ytdlp.py @@ -450,14 +450,14 @@ def fetch_dislike_count(youtube_video_id: str) -> int | None: QUALITY_FORMATS = { "best": "bestvideo+bestaudio/best", - "2160p": "bestvideo[height<=2160]+bestaudio/best[height<=2160]", - "1440p": "bestvideo[height<=1440]+bestaudio/best[height<=1440]", - "1080p": "bestvideo[height<=1080]+bestaudio/best[height<=1080]", - "720p": "bestvideo[height<=720]+bestaudio/best[height<=720]", - "480p": "bestvideo[height<=480]+bestaudio/best[height<=480]", - "360p": "bestvideo[height<=360]+bestaudio/best[height<=360]", - "240p": "bestvideo[height<=240]+bestaudio/best[height<=240]", - "144p": "bestvideo[height<=144]+bestaudio/best[height<=144]", + "2160p": "bestvideo[height<=2160]+bestaudio/bestvideo+bestaudio/best", + "1440p": "bestvideo[height<=1440]+bestaudio/bestvideo+bestaudio/best", + "1080p": "bestvideo[height<=1080]+bestaudio/bestvideo+bestaudio/best", + "720p": "bestvideo[height<=720]+bestaudio/bestvideo+bestaudio/best", + "480p": "bestvideo[height<=480]+bestaudio/bestvideo+bestaudio/best", + "360p": "bestvideo[height<=360]+bestaudio/bestvideo+bestaudio/best", + "240p": "bestvideo[height<=240]+bestaudio/bestvideo+bestaudio/best", + "144p": "bestvideo[height<=144]+bestaudio/bestvideo+bestaudio/best", } @@ -470,6 +470,8 @@ def detect_resolution(file_path: str) -> str | None: capture_output=True, text=True, timeout=15, ) height = int(result.stdout.strip()) + if height >= 2160: return "2160p" + if height >= 1440: return "1440p" if height >= 1080: return "1080p" if height >= 720: return "720p" if height >= 480: return "480p"