diff --git a/core/repair_jobs/quality_upgrade.py b/core/repair_jobs/quality_upgrade.py index 7d6a9b44..a6e70588 100644 --- a/core/repair_jobs/quality_upgrade.py +++ b/core/repair_jobs/quality_upgrade.py @@ -50,6 +50,15 @@ from utils.logging_config import get_logger logger = get_logger("repair_jobs.quality_upgrade") +def _to_bool(val) -> bool: + """Coerce a setting value to bool. Handles Python bool, string 'true'/'false', and int.""" + if isinstance(val, bool): + return val + if isinstance(val, str): + return val.lower() == 'true' + return bool(val) if val is not None else False + + # Quality ranks — higher is better. Lossless tops everything; lossy tiers fall out # of bitrate. 0 means "below the lowest tracked tier / unknown". RANK_LOSSLESS = 4 @@ -494,8 +503,8 @@ class QualityUpgradeJob(RepairJob): merged['min_confidence'] = float(merged.get('min_confidence', 0.7)) except (TypeError, ValueError): merged['min_confidence'] = 0.7 - merged['deep_audio_verify'] = merged.get('deep_audio_verify') is True - merged['require_top_target'] = merged.get('require_top_target') is True + merged['deep_audio_verify'] = _to_bool(merged.get('deep_audio_verify')) + merged['require_top_target'] = _to_bool(merged.get('require_top_target')) return merged def _load_tracks(self, db: Any, scope: str) -> List[dict]: diff --git a/core/repair_jobs/quality_upgrade_scanner.py b/core/repair_jobs/quality_upgrade_scanner.py index 060f3375..25b36e56 100644 --- a/core/repair_jobs/quality_upgrade_scanner.py +++ b/core/repair_jobs/quality_upgrade_scanner.py @@ -297,6 +297,10 @@ class QualityUpgradeScannerJob(RepairJob): merged.update(cfg) except Exception as e: logger.debug("settings read failed: %s", e) + for key in ('library_tracks_only', 'deep_audio_verify', 'require_top_target'): + val = merged.get(key) + if not isinstance(val, bool): + merged[key] = str(val).lower() == 'true' if val is not None else False return merged def _collect_music_dirs(self, context: JobContext) -> list: diff --git a/webui/static/enrichment.js b/webui/static/enrichment.js index e43cfe17..7ef07010 100644 --- a/webui/static/enrichment.js +++ b/webui/static/enrichment.js @@ -1988,7 +1988,10 @@ async function saveRepairJobSettings(jobId) { } else { if (input.type === 'checkbox') settings[key] = input.checked; else if (input.type === 'number') settings[key] = parseFloat(input.value); - else settings[key] = input.value; + else { + const v = input.value; + settings[key] = v === 'true' ? true : v === 'false' ? false : v; + } } });