From 353ced831bdf5a13c6fbefcfd106df34b3229855 Mon Sep 17 00:00:00 2001 From: Daniel <790119+DanTheMan827@users.noreply.github.com> Date: Fri, 27 Feb 2026 20:27:31 +0000 Subject: [PATCH] fix(downloads): handle MP3_320 format in bulk downloads --- js/downloads.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/js/downloads.js b/js/downloads.js index 49908b5..594481f 100644 --- a/js/downloads.js +++ b/js/downloads.js @@ -15,6 +15,7 @@ import { lyricsSettings, bulkDownloadSettings, playlistSettings } from './storag import { addMetadataToAudio } from './metadata.js'; import { DashDownloader } from './dash-downloader.js'; import { generateM3U, generateM3U8, generateCUE, generateNFO, generateJSON } from './playlist-generator.js'; +import { encodeToMp3 } from './mp3-encoder.js'; const downloadTasks = new Map(); const bulkDownloadTasks = new Map(); @@ -272,6 +273,9 @@ async function downloadTrackBlob(track, quality, api, lyricsManager = null, sign artist: track.artist || (track.artists && track.artists.length > 0 ? track.artists[0] : null), }; + // MP3_320 is not a native TIDAL quality, we download LOSSLESS and convert + const downloadQuality = quality === 'MP3_320' ? 'LOSSLESS' : quality; + try { const fullTrack = await api.getTrackMetadata(track.id); if (fullTrack) { @@ -306,7 +310,7 @@ async function downloadTrackBlob(track, quality, api, lyricsManager = null, sign } } - const lookup = await api.getTrack(track.id, quality); + const lookup = await api.getTrack(track.id, downloadQuality); let streamUrl; if (lookup.originalTrackUrl) { @@ -327,7 +331,7 @@ async function downloadTrackBlob(track, quality, api, lyricsManager = null, sign } catch (dashError) { console.error('DASH download failed:', dashError); // Fallback - if (quality !== 'LOSSLESS') { + if (downloadQuality !== 'LOSSLESS') { console.warn('Falling back to LOSSLESS (16-bit) download.'); return downloadTrackBlob(track, 'LOSSLESS', api, lyricsManager, signal); } @@ -341,6 +345,11 @@ async function downloadTrackBlob(track, quality, api, lyricsManager = null, sign blob = await response.blob(); } + // Convert to MP3 320kbps if requested + if (quality === 'MP3_320') { + blob = await encodeToMp3(blob, () => undefined, signal); + } + // Detect actual format from blob signature BEFORE adding metadata const extension = await getExtensionFromBlob(blob);