Add FLAC bit depth fallback option to quality profile
This commit is contained in:
parent
4a73ef6d24
commit
9a22c49a0e
3 changed files with 51 additions and 6 deletions
|
|
@ -15062,6 +15062,7 @@ def _check_flac_bit_depth(file_path, context, context_key):
|
||||||
"""
|
"""
|
||||||
Check if a FLAC file matches the user's preferred bit depth.
|
Check if a FLAC file matches the user's preferred bit depth.
|
||||||
Returns True if the file was rejected (caller should return), False if OK.
|
Returns True if the file was rejected (caller should return), False if OK.
|
||||||
|
With fallback enabled (default), accepts any FLAC bit depth rather than quarantining.
|
||||||
"""
|
"""
|
||||||
if not context.get('_audio_quality', '').startswith('FLAC'):
|
if not context.get('_audio_quality', '').startswith('FLAC'):
|
||||||
return False
|
return False
|
||||||
|
|
@ -15069,7 +15070,8 @@ def _check_flac_bit_depth(file_path, context, context_key):
|
||||||
from database.music_database import MusicDatabase
|
from database.music_database import MusicDatabase
|
||||||
_qp_db = MusicDatabase()
|
_qp_db = MusicDatabase()
|
||||||
_quality_profile = _qp_db.get_quality_profile()
|
_quality_profile = _qp_db.get_quality_profile()
|
||||||
_flac_pref = _quality_profile.get('qualities', {}).get('flac', {}).get('bit_depth', 'any')
|
_flac_config = _quality_profile.get('qualities', {}).get('flac', {})
|
||||||
|
_flac_pref = _flac_config.get('bit_depth', 'any')
|
||||||
|
|
||||||
if _flac_pref == 'any':
|
if _flac_pref == 'any':
|
||||||
return False
|
return False
|
||||||
|
|
@ -15079,7 +15081,17 @@ def _check_flac_bit_depth(file_path, context, context_key):
|
||||||
if _actual_bits == _flac_pref:
|
if _actual_bits == _flac_pref:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Reject — same pattern as AcoustID verification failure
|
# Bit depth doesn't match preference — check if fallback is enabled
|
||||||
|
_flac_fallback = _flac_config.get('bit_depth_fallback', True)
|
||||||
|
|
||||||
|
if _flac_fallback:
|
||||||
|
# Accept the file — a FLAC at any bit depth is better than a failed download
|
||||||
|
track_info = context.get('track_info', {})
|
||||||
|
track_name = track_info.get('name', os.path.basename(file_path))
|
||||||
|
print(f"📀 [FLAC Fallback] Accepted {_actual_bits}-bit FLAC (preferred {_flac_pref}-bit): {track_name}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Strict mode — reject and quarantine
|
||||||
rejection_msg = f"FLAC bit depth mismatch: file is {_actual_bits}-bit, preference is {_flac_pref}-bit"
|
rejection_msg = f"FLAC bit depth mismatch: file is {_actual_bits}-bit, preference is {_flac_pref}-bit"
|
||||||
try:
|
try:
|
||||||
quarantine_path = _move_to_quarantine(file_path, context, rejection_msg)
|
quarantine_path = _move_to_quarantine(file_path, context, rejection_msg)
|
||||||
|
|
|
||||||
|
|
@ -4014,8 +4014,14 @@
|
||||||
<button class="bit-depth-btn" data-value="16" onclick="setFlacBitDepth('16')">16-bit</button>
|
<button class="bit-depth-btn" data-value="16" onclick="setFlacBitDepth('16')">16-bit</button>
|
||||||
<button class="bit-depth-btn" data-value="24" onclick="setFlacBitDepth('24')">24-bit</button>
|
<button class="bit-depth-btn" data-value="24" onclick="setFlacBitDepth('24')">24-bit</button>
|
||||||
</div>
|
</div>
|
||||||
<div style="color: #888; font-size: 0.75em; margin-top: 4px;">
|
<div class="flac-fallback-toggle" id="flac-fallback-toggle" style="display: none; margin-top: 6px;">
|
||||||
Rejects FLAC files that don't match the selected bit depth
|
<label style="display: flex; align-items: center; gap: 6px; cursor: pointer; font-size: 0.8em; color: #ccc;">
|
||||||
|
<input type="checkbox" id="flac-bit-depth-fallback" checked onchange="setFlacBitDepthFallback(this.checked)">
|
||||||
|
Accept other bit depths as fallback
|
||||||
|
</label>
|
||||||
|
<div style="color: #888; font-size: 0.75em; margin-top: 2px;">
|
||||||
|
When enabled, accepts any FLAC rather than rejecting on bit depth mismatch
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -4943,7 +4943,7 @@ function populateQualityProfileUI(profile) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FLAC-specific: restore bit depth selector
|
// FLAC-specific: restore bit depth selector and fallback toggle
|
||||||
if (quality === 'flac') {
|
if (quality === 'flac') {
|
||||||
const bitDepthValue = config.bit_depth || 'any';
|
const bitDepthValue = config.bit_depth || 'any';
|
||||||
document.querySelectorAll('.bit-depth-btn').forEach(btn => {
|
document.querySelectorAll('.bit-depth-btn').forEach(btn => {
|
||||||
|
|
@ -4957,6 +4957,15 @@ function populateQualityProfileUI(profile) {
|
||||||
bitDepthSelector.classList.add('disabled');
|
bitDepthSelector.classList.add('disabled');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Show/hide and restore fallback toggle
|
||||||
|
const fallbackToggle = document.getElementById('flac-fallback-toggle');
|
||||||
|
if (fallbackToggle) {
|
||||||
|
fallbackToggle.style.display = bitDepthValue === 'any' ? 'none' : 'block';
|
||||||
|
}
|
||||||
|
const fallbackCb = document.getElementById('flac-bit-depth-fallback');
|
||||||
|
if (fallbackCb) {
|
||||||
|
fallbackCb.checked = config.bit_depth_fallback !== false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -5033,6 +5042,12 @@ function setFlacBitDepth(value) {
|
||||||
btn.classList.toggle('active', btn.getAttribute('data-value') === value);
|
btn.classList.toggle('active', btn.getAttribute('data-value') === value);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Show/hide fallback toggle — only relevant when a specific bit depth is selected
|
||||||
|
const fallbackToggle = document.getElementById('flac-fallback-toggle');
|
||||||
|
if (fallbackToggle) {
|
||||||
|
fallbackToggle.style.display = value === 'any' ? 'none' : 'block';
|
||||||
|
}
|
||||||
|
|
||||||
// Mark preset as custom when manually changing
|
// Mark preset as custom when manually changing
|
||||||
if (currentQualityProfile) {
|
if (currentQualityProfile) {
|
||||||
currentQualityProfile.preset = 'custom';
|
currentQualityProfile.preset = 'custom';
|
||||||
|
|
@ -5044,6 +5059,16 @@ function setFlacBitDepth(value) {
|
||||||
debouncedAutoSaveSettings();
|
debouncedAutoSaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setFlacBitDepthFallback(enabled) {
|
||||||
|
if (currentQualityProfile) {
|
||||||
|
currentQualityProfile.preset = 'custom';
|
||||||
|
document.querySelectorAll('.preset-button').forEach(btn => {
|
||||||
|
btn.classList.remove('active');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
debouncedAutoSaveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
async function applyQualityPreset(presetName) {
|
async function applyQualityPreset(presetName) {
|
||||||
try {
|
try {
|
||||||
showLoadingOverlay(`Applying ${presetName} preset...`);
|
showLoadingOverlay(`Applying ${presetName} preset...`);
|
||||||
|
|
@ -5094,10 +5119,12 @@ function collectQualityProfileFromUI() {
|
||||||
priority: existingPriority
|
priority: existingPriority
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add FLAC-specific bit_depth setting
|
// Add FLAC-specific bit_depth and fallback settings
|
||||||
if (quality === 'flac') {
|
if (quality === 'flac') {
|
||||||
const activeBtn = document.querySelector('.bit-depth-btn.active');
|
const activeBtn = document.querySelector('.bit-depth-btn.active');
|
||||||
profile.qualities[quality].bit_depth = activeBtn ? activeBtn.getAttribute('data-value') : 'any';
|
profile.qualities[quality].bit_depth = activeBtn ? activeBtn.getAttribute('data-value') : 'any';
|
||||||
|
const fallbackCb = document.getElementById('flac-bit-depth-fallback');
|
||||||
|
profile.qualities[quality].bit_depth_fallback = fallbackCb ? fallbackCb.checked : true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue