fix(quality): parse track metadata quality instead of defaulting to UltraHiRes

Frontend sends "24bit/44.1kHz" format from track metadata, but
parse_quality fell through to default UltraHiRes for unknown formats.
This caused unnecessary API quality fallback cascades (3 calls per
track) and cache mismatches where cached 24bit/44.1kHz data was
discarded for re-download that returns the same quality.

Now parses "XXbit/YYYkHz" format and maps to the correct Quality
level, requesting exactly what the track offers.

cc
This commit is contained in:
vicrodh committed 2026-04-06 15:03:23 -06:00
1 parent 8b9abdea58
commit 6103044a2e
1 file changed
+20 -1
+20 -1
View File
@@ -251,7 +251,26 @@ fn parse_quality(quality_str: Option<&str>) -> Quality {
Some("CD Quality") => Quality::Lossless,
Some("Hi-Res") => Quality::HiRes,
Some("Hi-Res+") => Quality::UltraHiRes,
_ => Quality::UltraHiRes, // Default to highest
Some(s) => {
// Parse "XXbit/YYYkHz" format from track metadata.
// Map to the Quality that matches what the track actually offers,
// avoiding unnecessary quality fallback cascades from the API.
if let Some((bit_str, rate_str)) = s.split_once("bit/") {
let bit_depth: u32 = bit_str.parse().unwrap_or(0);
let sample_rate: f64 = rate_str.trim_end_matches("kHz").parse().unwrap_or(0.0);
if bit_depth >= 24 && sample_rate > 96.0 {
Quality::UltraHiRes
} else if bit_depth >= 24 {
Quality::HiRes
} else {
Quality::Lossless
}
} else {
Quality::UltraHiRes // Unknown format, try highest
}
}
None => Quality::UltraHiRes,
}
}