added config for cover art save

This commit is contained in:
Xoconoch
2025-06-03 19:21:26 -06:00
parent 784a545538
commit 09fdcb7610
9 changed files with 45 additions and 2 deletions

View File

@@ -2,4 +2,4 @@ waitress==3.0.2
celery==5.5.3 celery==5.5.3
Flask==3.1.1 Flask==3.1.1
flask_cors==6.0.0 flask_cors==6.0.0
deezspot-spotizerr==1.4.0 deezspot-spotizerr==1.4.1

View File

@@ -15,6 +15,7 @@ def download_album(
custom_dir_format="%ar_album%/%album%/%copyright%", custom_dir_format="%ar_album%/%album%/%copyright%",
custom_track_format="%tracknum%. %music% - %artist%", custom_track_format="%tracknum%. %music% - %artist%",
pad_tracks=True, pad_tracks=True,
save_cover=True,
initial_retry_delay=5, initial_retry_delay=5,
retry_delay_increase=5, retry_delay_increase=5,
max_retries=3, max_retries=3,
@@ -114,6 +115,7 @@ def download_album(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -155,6 +157,7 @@ def download_album(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -195,6 +198,7 @@ def download_album(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -229,6 +233,7 @@ def download_album(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries

View File

@@ -35,6 +35,7 @@ DEFAULT_MAIN_CONFIG = {
'customDirFormat': '%ar_album%/%album%', 'customDirFormat': '%ar_album%/%album%',
'customTrackFormat': '%tracknum%. %music%', 'customTrackFormat': '%tracknum%. %music%',
'tracknum_padding': True, 'tracknum_padding': True,
'save_cover': True,
'maxConcurrentDownloads': 3, 'maxConcurrentDownloads': 3,
'maxRetries': 3, 'maxRetries': 3,
'retryDelaySeconds': 5, 'retryDelaySeconds': 5,

View File

@@ -57,6 +57,7 @@ def get_config_params():
'customDirFormat': config.get('customDirFormat', '%ar_album%/%album%'), 'customDirFormat': config.get('customDirFormat', '%ar_album%/%album%'),
'customTrackFormat': config.get('customTrackFormat', '%tracknum%. %music%'), 'customTrackFormat': config.get('customTrackFormat', '%tracknum%. %music%'),
'tracknum_padding': config.get('tracknum_padding', True), 'tracknum_padding': config.get('tracknum_padding', True),
'save_cover': config.get('save_cover', True),
'maxRetries': config.get('maxRetries', 3), 'maxRetries': config.get('maxRetries', 3),
'retryDelaySeconds': config.get('retryDelaySeconds', 5), 'retryDelaySeconds': config.get('retryDelaySeconds', 5),
'retry_delay_increase': config.get('retry_delay_increase', 5) 'retry_delay_increase': config.get('retry_delay_increase', 5)
@@ -74,6 +75,7 @@ def get_config_params():
'customDirFormat': '%ar_album%/%album%', 'customDirFormat': '%ar_album%/%album%',
'customTrackFormat': '%tracknum%. %music%', 'customTrackFormat': '%tracknum%. %music%',
'tracknum_padding': True, 'tracknum_padding': True,
'save_cover': True,
'maxRetries': 3, 'maxRetries': 3,
'retryDelaySeconds': 5, 'retryDelaySeconds': 5,
'retry_delay_increase': 5 'retry_delay_increase': 5
@@ -198,6 +200,7 @@ class CeleryDownloadQueueManager:
"custom_dir_format": original_request.get("custom_dir_format", config_params['customDirFormat']), "custom_dir_format": original_request.get("custom_dir_format", config_params['customDirFormat']),
"custom_track_format": original_request.get("custom_track_format", config_params['customTrackFormat']), "custom_track_format": original_request.get("custom_track_format", config_params['customTrackFormat']),
"pad_tracks": self._parse_bool_param(original_request.get("tracknum_padding"), config_params['tracknum_padding']), "pad_tracks": self._parse_bool_param(original_request.get("tracknum_padding"), config_params['tracknum_padding']),
"save_cover": self._parse_bool_param(original_request.get("save_cover"), config_params['save_cover']),
"retry_count": 0, "retry_count": 0,
"original_request": original_request, "original_request": original_request,
"created_at": time.time() "created_at": time.time()

View File

@@ -1086,6 +1086,7 @@ def download_track(self, **task_data):
custom_dir_format = task_data.get("custom_dir_format", config_params.get("customDirFormat", "%ar_album%/%album%")) custom_dir_format = task_data.get("custom_dir_format", config_params.get("customDirFormat", "%ar_album%/%album%"))
custom_track_format = task_data.get("custom_track_format", config_params.get("customTrackFormat", "%tracknum%. %music%")) custom_track_format = task_data.get("custom_track_format", config_params.get("customTrackFormat", "%tracknum%. %music%"))
pad_tracks = task_data.get("pad_tracks", config_params.get("tracknum_padding", True)) pad_tracks = task_data.get("pad_tracks", config_params.get("tracknum_padding", True))
save_cover = task_data.get("save_cover", config_params.get("save_cover", True))
# Execute the download - service is now determined from URL # Execute the download - service is now determined from URL
download_track_func( download_track_func(
@@ -1098,6 +1099,7 @@ def download_track(self, **task_data):
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
progress_callback=self.progress_callback progress_callback=self.progress_callback
) )
@@ -1153,6 +1155,7 @@ def download_album(self, **task_data):
custom_dir_format = task_data.get("custom_dir_format", config_params.get("customDirFormat", "%ar_album%/%album%")) custom_dir_format = task_data.get("custom_dir_format", config_params.get("customDirFormat", "%ar_album%/%album%"))
custom_track_format = task_data.get("custom_track_format", config_params.get("customTrackFormat", "%tracknum%. %music%")) custom_track_format = task_data.get("custom_track_format", config_params.get("customTrackFormat", "%tracknum%. %music%"))
pad_tracks = task_data.get("pad_tracks", config_params.get("tracknum_padding", True)) pad_tracks = task_data.get("pad_tracks", config_params.get("tracknum_padding", True))
save_cover = task_data.get("save_cover", config_params.get("save_cover", True))
# Execute the download - service is now determined from URL # Execute the download - service is now determined from URL
download_album_func( download_album_func(
@@ -1165,6 +1168,7 @@ def download_album(self, **task_data):
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
progress_callback=self.progress_callback progress_callback=self.progress_callback
) )
@@ -1220,6 +1224,7 @@ def download_playlist(self, **task_data):
custom_dir_format = task_data.get("custom_dir_format", config_params.get("customDirFormat", "%ar_album%/%album%")) custom_dir_format = task_data.get("custom_dir_format", config_params.get("customDirFormat", "%ar_album%/%album%"))
custom_track_format = task_data.get("custom_track_format", config_params.get("customTrackFormat", "%tracknum%. %music%")) custom_track_format = task_data.get("custom_track_format", config_params.get("customTrackFormat", "%tracknum%. %music%"))
pad_tracks = task_data.get("pad_tracks", config_params.get("tracknum_padding", True)) pad_tracks = task_data.get("pad_tracks", config_params.get("tracknum_padding", True))
save_cover = task_data.get("save_cover", config_params.get("save_cover", True))
# Get retry parameters # Get retry parameters
initial_retry_delay = task_data.get("initial_retry_delay", config_params.get("retryDelaySeconds", 5)) initial_retry_delay = task_data.get("initial_retry_delay", config_params.get("retryDelaySeconds", 5))
@@ -1237,6 +1242,7 @@ def download_playlist(self, **task_data):
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries, max_retries=max_retries,

View File

@@ -15,6 +15,7 @@ def download_playlist(
custom_dir_format="%ar_album%/%album%/%copyright%", custom_dir_format="%ar_album%/%album%/%copyright%",
custom_track_format="%tracknum%. %music% - %artist%", custom_track_format="%tracknum%. %music% - %artist%",
pad_tracks=True, pad_tracks=True,
save_cover=True,
initial_retry_delay=5, initial_retry_delay=5,
retry_delay_increase=5, retry_delay_increase=5,
max_retries=3, max_retries=3,
@@ -109,6 +110,7 @@ def download_playlist(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries, max_retries=max_retries,
@@ -150,6 +152,7 @@ def download_playlist(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -190,6 +193,7 @@ def download_playlist(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -224,6 +228,7 @@ def download_playlist(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries

View File

@@ -15,6 +15,7 @@ def download_track(
custom_dir_format="%ar_album%/%album%/%copyright%", custom_dir_format="%ar_album%/%album%/%copyright%",
custom_track_format="%tracknum%. %music% - %artist%", custom_track_format="%tracknum%. %music% - %artist%",
pad_tracks=True, pad_tracks=True,
save_cover=True,
initial_retry_delay=5, initial_retry_delay=5,
retry_delay_increase=5, retry_delay_increase=5,
max_retries=3, max_retries=3,
@@ -108,6 +109,7 @@ def download_track(
not_interface=False, not_interface=False,
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -143,6 +145,7 @@ def download_track(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -176,6 +179,7 @@ def download_track(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries
@@ -204,6 +208,7 @@ def download_track(
custom_dir_format=custom_dir_format, custom_dir_format=custom_dir_format,
custom_track_format=custom_track_format, custom_track_format=custom_track_format,
pad_tracks=pad_tracks, pad_tracks=pad_tracks,
save_cover=save_cover,
initial_retry_delay=initial_retry_delay, initial_retry_delay=initial_retry_delay,
retry_delay_increase=retry_delay_increase, retry_delay_increase=retry_delay_increase,
max_retries=max_retries max_retries=max_retries

View File

@@ -121,6 +121,8 @@ async function loadConfig() {
if (retryDelayIncrease) retryDelayIncrease.value = savedConfig.retry_delay_increase || '5'; if (retryDelayIncrease) retryDelayIncrease.value = savedConfig.retry_delay_increase || '5';
const tracknumPaddingToggle = document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null; const tracknumPaddingToggle = document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null;
if (tracknumPaddingToggle) tracknumPaddingToggle.checked = savedConfig.tracknum_padding === undefined ? true : !!savedConfig.tracknum_padding; if (tracknumPaddingToggle) tracknumPaddingToggle.checked = savedConfig.tracknum_padding === undefined ? true : !!savedConfig.tracknum_padding;
const saveCoverToggle = document.getElementById('saveCoverToggle') as HTMLInputElement | null;
if (saveCoverToggle) saveCoverToggle.checked = savedConfig.save_cover === undefined ? true : !!savedConfig.save_cover;
// Update explicit filter status // Update explicit filter status
updateExplicitFilterStatus(savedConfig.explicitFilter); updateExplicitFilterStatus(savedConfig.explicitFilter);
@@ -243,6 +245,7 @@ function setupEventListeners() {
(document.getElementById('spotifyQualitySelect') as HTMLSelectElement | null)?.addEventListener('change', saveConfig); (document.getElementById('spotifyQualitySelect') as HTMLSelectElement | null)?.addEventListener('change', saveConfig);
(document.getElementById('deezerQualitySelect') as HTMLSelectElement | null)?.addEventListener('change', saveConfig); (document.getElementById('deezerQualitySelect') as HTMLSelectElement | null)?.addEventListener('change', saveConfig);
(document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null)?.addEventListener('change', saveConfig); (document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null)?.addEventListener('change', saveConfig);
(document.getElementById('saveCoverToggle') as HTMLInputElement | null)?.addEventListener('change', saveConfig);
(document.getElementById('maxRetries') as HTMLInputElement | null)?.addEventListener('change', saveConfig); (document.getElementById('maxRetries') as HTMLInputElement | null)?.addEventListener('change', saveConfig);
(document.getElementById('retryDelaySeconds') as HTMLInputElement | null)?.addEventListener('change', saveConfig); (document.getElementById('retryDelaySeconds') as HTMLInputElement | null)?.addEventListener('change', saveConfig);
@@ -843,7 +846,8 @@ async function saveConfig() {
maxRetries: parseInt((document.getElementById('maxRetries') as HTMLInputElement | null)?.value || '3', 10) || 3, maxRetries: parseInt((document.getElementById('maxRetries') as HTMLInputElement | null)?.value || '3', 10) || 3,
retryDelaySeconds: parseInt((document.getElementById('retryDelaySeconds') as HTMLInputElement | null)?.value || '5', 10) || 5, retryDelaySeconds: parseInt((document.getElementById('retryDelaySeconds') as HTMLInputElement | null)?.value || '5', 10) || 5,
retry_delay_increase: parseInt((document.getElementById('retryDelayIncrease') as HTMLInputElement | null)?.value || '5', 10) || 5, retry_delay_increase: parseInt((document.getElementById('retryDelayIncrease') as HTMLInputElement | null)?.value || '5', 10) || 5,
tracknum_padding: (document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null)?.checked tracknum_padding: (document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null)?.checked,
save_cover: (document.getElementById('saveCoverToggle') as HTMLInputElement | null)?.checked
}; };
try { try {
@@ -901,6 +905,8 @@ async function saveConfig() {
if (retryDelayIncrease) retryDelayIncrease.value = savedConfig.retry_delay_increase || '5'; if (retryDelayIncrease) retryDelayIncrease.value = savedConfig.retry_delay_increase || '5';
const tracknumPaddingToggle = document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null; const tracknumPaddingToggle = document.getElementById('tracknumPaddingToggle') as HTMLInputElement | null;
if (tracknumPaddingToggle) tracknumPaddingToggle.checked = savedConfig.tracknum_padding === undefined ? true : !!savedConfig.tracknum_padding; if (tracknumPaddingToggle) tracknumPaddingToggle.checked = savedConfig.tracknum_padding === undefined ? true : !!savedConfig.tracknum_padding;
const saveCoverToggle = document.getElementById('saveCoverToggle') as HTMLInputElement | null;
if (saveCoverToggle) saveCoverToggle.checked = savedConfig.save_cover === undefined ? true : !!savedConfig.save_cover;
// Update explicit filter status // Update explicit filter status
updateExplicitFilterStatus(savedConfig.explicitFilter); updateExplicitFilterStatus(savedConfig.explicitFilter);

View File

@@ -201,6 +201,7 @@
<option value="%mood%">%mood% - Mood information</option> <option value="%mood%">%mood% - Mood information</option>
<option value="%rating%">%rating% - Track rating</option> <option value="%rating%">%rating% - Track rating</option>
<option value="%website%">%website% - Website information</option> <option value="%website%">%website% - Website information</option>
<option value="%quality%">%quality% - Quality of the track</option>
</optgroup> </optgroup>
<optgroup label="ReplayGain"> <optgroup label="ReplayGain">
<option value="%replaygain_album_gain%">%replaygain_album_gain% - Album gain</option> <option value="%replaygain_album_gain%">%replaygain_album_gain% - Album gain</option>
@@ -225,6 +226,17 @@
When enabled: "01. Track" - When disabled: "1. Track" When enabled: "01. Track" - When disabled: "1. Track"
</div> </div>
</div> </div>
<!-- New Save Cover Art Toggle -->
<div class="config-item">
<label>Save Cover Art:</label>
<label class="switch">
<input type="checkbox" id="saveCoverToggle" />
<span class="slider"></span>
</label>
<div class="setting-description">
When enabled, cover art will saved as cover.jpg in the same directory as the track.
</div>
</div>
</div> </div>
<div class="watch-options-config card"> <div class="watch-options-config card">