Merge pull request #250 from DanTheMan827/mp3-bulk-download-fix

fix(downloads): handle MP3_320 format in bulk downloads
This commit is contained in:
Samidy 2026-02-27 23:36:06 +03:00 committed by GitHub
commit 6dbcd17e41
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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);