From 3f7fa19cdff09c66d1bd49c3a65556bf2d4e7456 Mon Sep 17 00:00:00 2001 From: zarzet Date: Sat, 31 Jan 2026 07:53:13 +0700 Subject: [PATCH] fix: MP3 download returns 403 - download FLAC first then convert When user selects MP3 quality, the app was sending 'MP3' directly to Tidal/Qobuz APIs which don't support MP3 as a quality parameter, resulting in 403 Forbidden errors. Fix: Convert quality 'MP3' to 'LOSSLESS' before sending to backend, then convert the downloaded FLAC to MP3 using FFmpeg (existing logic). --- lib/providers/download_queue_provider.dart | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/providers/download_queue_provider.dart b/lib/providers/download_queue_provider.dart index 37da93dc..99927349 100644 --- a/lib/providers/download_queue_provider.dart +++ b/lib/providers/download_queue_provider.dart @@ -1667,6 +1667,10 @@ class DownloadQueueNotifier extends Notifier { ); final quality = item.qualityOverride ?? state.audioQuality; + + // For MP3, we need to download FLAC first then convert + // Servers don't support MP3 quality directly + final downloadQuality = quality == 'MP3' ? 'LOSSLESS' : quality; // Fetch extended metadata (genre, label) from Deezer if available String? genre; @@ -1717,7 +1721,7 @@ class DownloadQueueNotifier extends Notifier { if (useExtensions) { _log.d('Using extension providers for download'); _log.d( - 'Quality: $quality${item.qualityOverride != null ? ' (override)' : ''}', + 'Quality: $quality${item.qualityOverride != null ? ' (override)' : ''}${quality == 'MP3' ? ' (downloading as LOSSLESS for conversion)' : ''}', ); _log.d('Output dir: $outputDir'); result = await PlatformBridge.downloadWithExtensions( @@ -1730,7 +1734,7 @@ class DownloadQueueNotifier extends Notifier { coverUrl: trackToDownload.coverUrl, outputDir: outputDir, filenameFormat: state.filenameFormat, - quality: quality, + quality: downloadQuality, trackNumber: trackToDownload.trackNumber ?? 1, discNumber: trackToDownload.discNumber ?? 1, releaseDate: trackToDownload.releaseDate, @@ -1744,7 +1748,7 @@ class DownloadQueueNotifier extends Notifier { } else if (state.autoFallback) { _log.d('Using auto-fallback mode'); _log.d( - 'Quality: $quality${item.qualityOverride != null ? ' (override)' : ''}', + 'Quality: $quality${item.qualityOverride != null ? ' (override)' : ''}${quality == 'MP3' ? ' (downloading as LOSSLESS for conversion)' : ''}', ); _log.d('Output dir: $outputDir'); result = await PlatformBridge.downloadWithFallback( @@ -1757,7 +1761,7 @@ class DownloadQueueNotifier extends Notifier { coverUrl: trackToDownload.coverUrl, outputDir: outputDir, filenameFormat: state.filenameFormat, - quality: quality, + quality: downloadQuality, trackNumber: trackToDownload.trackNumber ?? 1, discNumber: trackToDownload.discNumber ?? 1, releaseDate: trackToDownload.releaseDate, @@ -1780,7 +1784,7 @@ class DownloadQueueNotifier extends Notifier { coverUrl: trackToDownload.coverUrl, outputDir: outputDir, filenameFormat: state.filenameFormat, - quality: quality, + quality: downloadQuality, trackNumber: trackToDownload.trackNumber ?? 1, discNumber: trackToDownload.discNumber ?? 1, releaseDate: trackToDownload.releaseDate,