fix(wip): add fallback format support for unavailable tracks

Add support for selecting a fallback audio format if the requested
track format is unavailable. Users can now choose to fall back
to MP3_320, MP3_128, or the highest available format, or opt to fail
if the requested format is not found. The queue manager and downloader
now fetch fresh track data just-in-time, handle dz fallback
parameters, and ensure the correct track ID is used for decryption.
Settings UI and store are updated to allow configuring the fallback format.
This commit is contained in:
2025-10-03 10:28:56 -04:00
parent d74bf7e828
commit 90053b67c5
6 changed files with 220 additions and 33 deletions

View File

@@ -6,6 +6,7 @@
setPlaylistsFolder,
setDeezerConcurrency,
setDeezerFormat,
setDeezerFallbackFormat,
setDeezerOverwrite,
setEmbedCoverArt,
setSaveCoverToFolder,
@@ -23,6 +24,7 @@
let currentPlaylistsFolder = $state<string | null>(null);
let currentDeezerConcurrency = $state<number>(1);
let currentDeezerFormat = $state<'FLAC' | 'MP3_320' | 'MP3_128'>('FLAC');
let currentDeezerFallbackFormat = $state<'none' | 'MP3_320' | 'MP3_128' | 'highest'>('none');
let currentDeezerOverwrite = $state<boolean>(false);
let currentEmbedCoverArt = $state<boolean>(true);
let currentSaveCoverToFolder = $state<boolean>(true);
@@ -37,6 +39,7 @@
currentPlaylistsFolder = $settings.playlistsFolder;
currentDeezerConcurrency = $settings.deezerConcurrency;
currentDeezerFormat = $settings.deezerFormat;
currentDeezerFallbackFormat = $settings.deezerFallbackFormat;
currentDeezerOverwrite = $settings.deezerOverwrite;
currentEmbedCoverArt = $settings.embedCoverArt;
currentSaveCoverToFolder = $settings.saveCoverToFolder;
@@ -50,6 +53,7 @@
currentPlaylistsFolder = $settings.playlistsFolder;
currentDeezerConcurrency = $settings.deezerConcurrency;
currentDeezerFormat = $settings.deezerFormat;
currentDeezerFallbackFormat = $settings.deezerFallbackFormat;
currentDeezerOverwrite = $settings.deezerOverwrite;
currentEmbedCoverArt = $settings.embedCoverArt;
currentSaveCoverToFolder = $settings.saveCoverToFolder;
@@ -210,6 +214,21 @@
<small class="help-text">Select the audio quality for downloaded tracks</small>
</div>
<div class="field-row-stacked">
<label for="deezer-fallback">Fallback Format</label>
<select
id="deezer-fallback"
bind:value={currentDeezerFallbackFormat}
onchange={() => setDeezerFallbackFormat(currentDeezerFallbackFormat)}
>
<option value="none">None (fail if unavailable)</option>
<option value="highest">Highest Available</option>
<option value="MP3_320">MP3 320kbps</option>
<option value="MP3_128">MP3 128kbps</option>
</select>
<small class="help-text">What to do if the requested format is unavailable</small>
</div>
<div class="field-row-stacked">
<label for="deezer-concurrency">Download Concurrency</label>
<div class="slider-container">