feat: optimize lazy PK resolution and fix OpenHome IdList delimiter
- In track_metadata.rs: cache real_pk at construction time to avoid repeated DB queries per metadata field access. - In openhome_client.rs: change IdList delimiter from comma to space per OpenHome spec.
This commit is contained in:
@@ -20,6 +20,9 @@ fn map_db_err(err: rusqlite::Error) -> MetadataError {
|
||||
pub struct AudioCacheTrackMetadata {
|
||||
cache: Arc<crate::Cache>,
|
||||
pk: String,
|
||||
/// Real pk si le lazy pk a été téléchargé, None sinon.
|
||||
/// Résolu une seule fois à la construction pour éviter N appels DB par champ.
|
||||
real_pk: Option<String>,
|
||||
}
|
||||
|
||||
impl AudioCacheTrackMetadata {
|
||||
@@ -28,24 +31,25 @@ impl AudioCacheTrackMetadata {
|
||||
/// Le type implémente ensuite toutes les méthodes du trait `pmometadata::TrackMetadata`
|
||||
/// en stockant les données dans la base SQLite de `pmocache`.
|
||||
pub fn new(cache: Arc<crate::Cache>, pk: impl Into<String>) -> Self {
|
||||
Self {
|
||||
cache,
|
||||
pk: pk.into(),
|
||||
}
|
||||
let pk_str: String = pk.into();
|
||||
// Résolution lazy→real une seule fois à la construction (une seule query DB).
|
||||
let real_pk = if pmocache::is_lazy_pk(&pk_str) {
|
||||
cache.db.get_pk_by_lazy_pk(&pk_str).ok().flatten()
|
||||
} else {
|
||||
None
|
||||
};
|
||||
Self { cache, pk: pk_str, real_pk }
|
||||
}
|
||||
|
||||
fn read_raw(&self, key: &str) -> Result<Option<Value>, MetadataError> {
|
||||
// Si le pk est un lazy pk déjà téléchargé (pk != lazy_pk dans l'asset),
|
||||
// lire d'abord sous le real_pk (métadonnées écrites par FlacCacheSink),
|
||||
// puis fallback sous le lazy_pk (cover_pk, qobuz_track_id semés à l'enregistrement).
|
||||
if pmocache::is_lazy_pk(&self.pk) {
|
||||
if let Ok(Some(real_pk)) = self.cache.db.get_pk_by_lazy_pk(&self.pk) {
|
||||
if let Ok(Some(v)) = self.cache.db.get_a_metadata(&real_pk, key) {
|
||||
return Ok(Some(v));
|
||||
}
|
||||
// Fallback vers lazy_pk pour les clés semées avant téléchargement (cover_pk, etc.)
|
||||
return self.cache.db.get_a_metadata(&self.pk, key).map_err(map_db_err);
|
||||
// Si le lazy pk a été téléchargé, lire d'abord sous le real_pk
|
||||
// (métadonnées écrites par FlacCacheSink), puis fallback sous le lazy_pk
|
||||
// pour les clés semées avant téléchargement (cover_pk, etc.).
|
||||
if let Some(real_pk) = &self.real_pk {
|
||||
if let Ok(Some(v)) = self.cache.db.get_a_metadata(real_pk, key) {
|
||||
return Ok(Some(v));
|
||||
}
|
||||
return self.cache.db.get_a_metadata(&self.pk, key).map_err(map_db_err);
|
||||
}
|
||||
self.cache
|
||||
.db
|
||||
|
||||
Reference in New Issue
Block a user