⬆️ Bump version to v0.3.47 #95
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -4,7 +4,7 @@ version = 4
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "PMOMusic"
|
name = "PMOMusic"
|
||||||
version = "0.3.45"
|
version = "0.3.46"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"axum 0.8.7",
|
"axum 0.8.7",
|
||||||
"console-subscriber",
|
"console-subscriber",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "PMOMusic"
|
name = "PMOMusic"
|
||||||
version = "0.3.46"
|
version = "0.3.47"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@@ -153,7 +153,32 @@ impl DB {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let conn = Connection::open(path)?;
|
let conn = Connection::open(path)?;
|
||||||
conn.execute("PRAGMA foreign_keys = ON", [])?;
|
conn.execute_batch(
|
||||||
|
"
|
||||||
|
PRAGMA journal_mode = WAL;
|
||||||
|
PRAGMA synchronous = NORMAL;
|
||||||
|
PRAGMA cache_size = -32768;
|
||||||
|
PRAGMA temp_store = MEMORY;
|
||||||
|
PRAGMA mmap_size = 268435456;
|
||||||
|
",
|
||||||
|
)?;
|
||||||
|
|
||||||
|
// Index qui MANQUAIT sur les bases existantes:
|
||||||
|
// Ceci s'exécutera TOUT LE TEMPS, pas seulement à la création
|
||||||
|
conn.execute(
|
||||||
|
"CREATE INDEX IF NOT EXISTS idx_metadata_key_value ON metadata (key, value)",
|
||||||
|
[],
|
||||||
|
)?;
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
"CREATE INDEX IF NOT EXISTS idx_asset_last_used ON asset (last_used DESC)",
|
||||||
|
[],
|
||||||
|
)?;
|
||||||
|
|
||||||
|
conn.execute(
|
||||||
|
"CREATE INDEX IF NOT EXISTS idx_asset_hits ON asset (hits DESC)",
|
||||||
|
[],
|
||||||
|
)?;
|
||||||
|
|
||||||
conn.execute(
|
conn.execute(
|
||||||
"CREATE TABLE IF NOT EXISTS asset (
|
"CREATE TABLE IF NOT EXISTS asset (
|
||||||
@@ -228,7 +253,12 @@ impl DB {
|
|||||||
// Inscrire la version du schéma
|
// Inscrire la version du schéma
|
||||||
conn.execute_batch(&format!("PRAGMA user_version = {}", SCHEMA_VERSION))?;
|
conn.execute_batch(&format!("PRAGMA user_version = {}", SCHEMA_VERSION))?;
|
||||||
|
|
||||||
Ok((Self { conn: Mutex::new(conn) }, was_reset))
|
Ok((
|
||||||
|
Self {
|
||||||
|
conn: Mutex::new(conn),
|
||||||
|
},
|
||||||
|
was_reset,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ajoute ou met à jour une entrée dans la base de données
|
/// Ajoute ou met à jour une entrée dans la base de données
|
||||||
@@ -1158,7 +1188,9 @@ impl DB {
|
|||||||
|
|
||||||
tracing::debug!(
|
tracing::debug!(
|
||||||
"update_lazy_to_downloaded: {} → {} ({} metadata rows still under lazy_pk)",
|
"update_lazy_to_downloaded: {} → {} ({} metadata rows still under lazy_pk)",
|
||||||
lazy_pk, real_pk, meta_under_lazy
|
lazy_pk,
|
||||||
|
real_pk,
|
||||||
|
meta_under_lazy
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -688,10 +688,36 @@ impl QueueBackend for OpenHomeRenderer {
|
|||||||
items: Vec<PlaybackItem>,
|
items: Vec<PlaybackItem>,
|
||||||
current_index: Option<usize>,
|
current_index: Option<usize>,
|
||||||
) -> Result<(), ControlPointError> {
|
) -> Result<(), ControlPointError> {
|
||||||
|
// ✅ CORRECTION BUG PRODUCTION: On ne charge PAS toutes les métadonnées
|
||||||
|
// dans le thread principal. OpenHome sur 1000 titres inondait la base SQLite
|
||||||
|
// et bloquait TOUS les autres threads (mutex >500ms).
|
||||||
|
//
|
||||||
|
// On fait juste l'insertion minimaliste maintenant. Le préchargement
|
||||||
|
// des métadonnées est délégué à un thread background.
|
||||||
self.queue
|
self.queue
|
||||||
.lock()
|
.lock()
|
||||||
.map_err(|_| ControlPointError::QueueError("Queue mutex poisoned".into()))?
|
.map_err(|_| ControlPointError::QueueError("Mutex poisoned".into()))?
|
||||||
.replace_queue(items, current_index)
|
.replace_queue(items, current_index)?;
|
||||||
|
|
||||||
|
// Background worker: charge les métadonnées petit à petit sans bloquer personne
|
||||||
|
let queue = self.queue.clone();
|
||||||
|
tokio::task::spawn_blocking(move || {
|
||||||
|
debug!("🔄 OpenHome: préchargement métadonnées queue en background");
|
||||||
|
if let Ok(mut queue) = queue.lock() {
|
||||||
|
// On ne fait que les 10 prochains titres maintenant, le reste on s'en fout
|
||||||
|
if let Ok(Some(idx)) = queue.current_index() {
|
||||||
|
let end = std::cmp::min(idx + 10, queue.len().unwrap_or(0));
|
||||||
|
for i in idx..end {
|
||||||
|
let _ = queue.get_item(i);
|
||||||
|
// Petit délai pour ne pas noyer la base de données
|
||||||
|
std::thread::sleep(std::time::Duration::from_millis(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debug!("✅ OpenHome: préchargement métadonnées terminé");
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sync_queue(
|
fn sync_queue(
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
0.3.46
|
0.3.47
|
||||||
|
|||||||
Reference in New Issue
Block a user