From 93f59004567027224dc943388913f460cd6952b0 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sun, 11 Jan 2026 21:19:01 +0100 Subject: [PATCH] Bump PMOMusic version and improve snapshot update logic Version bump for PMOMusic from 0.3.1 to 0.3.3 - Updated snapshot update logic in useRenderers.ts to directly update local snapshot state based on event types - Improved handling of various events like state_changed, position_changed, volume_changed, etc. - Adjusted polling interval in control_point.rs from 500ms to 250ms for smoother UI updates --- Cargo.lock | 2 +- pmoapp/webapp/src/composables/useRenderers.ts | 97 ++++++++++++++++++- pmocontrol/src/control_point.rs | 4 +- 3 files changed, 97 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 54552d0d..51b1ef4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,7 +4,7 @@ version = 4 [[package]] name = "PMOMusic" -version = "0.3.1" +version = "0.3.3" dependencies = [ "axum 0.8.7", "console-subscriber", diff --git a/pmoapp/webapp/src/composables/useRenderers.ts b/pmoapp/webapp/src/composables/useRenderers.ts index 68fd0126..f9e27e2d 100644 --- a/pmoapp/webapp/src/composables/useRenderers.ts +++ b/pmoapp/webapp/src/composables/useRenderers.ts @@ -105,12 +105,103 @@ function ensureSSEConnected() { return; } - // Pour les autres événements, comportement existant + // Pour les autres événements, mettre à jour le snapshot local directement snapshotState.lastEventAt.set(rendererId, timestamp); - const lastSnapshot = snapshotState.lastSnapshotAt.get(rendererId) ?? 0; - if (!snapshotState.snapshots.has(rendererId) || timestamp > lastSnapshot) { + + const snapshot = snapshotState.snapshots.get(rendererId); + + // Si pas de snapshot, on doit fetch + if (!snapshot) { void fetchRendererSnapshot(rendererId, { force: true }); + return; } + + // Sinon, mettre à jour le snapshot localement selon le type d'événement + switch (event.type) { + case "state_changed": + snapshot.state.transport_state = event.state as any; + break; + + case "position_changed": + // Convertir rel_time (HH:MM:SS) en millisecondes + if (event.rel_time) { + const parts = event.rel_time.split(":").map(Number); + if (parts.length === 3) { + snapshot.state.position_ms = + ((parts[0] ?? 0) * 3600 + + (parts[1] ?? 0) * 60 + + (parts[2] ?? 0)) * + 1000; + } + } + // Convertir track_duration (HH:MM:SS) en millisecondes + if (event.track_duration) { + const parts = event.track_duration.split(":").map(Number); + if (parts.length === 3) { + snapshot.state.duration_ms = + ((parts[0] ?? 0) * 3600 + + (parts[1] ?? 0) * 60 + + (parts[2] ?? 0)) * + 1000; + } + } + break; + + case "volume_changed": + snapshot.state.volume = event.volume; + break; + + case "mute_changed": + snapshot.state.mute = event.mute; + break; + + case "metadata_changed": + if (!snapshot.state.current_track) { + snapshot.state.current_track = { + title: null, + artist: null, + album: null, + album_art_uri: null, + }; + } + snapshot.state.current_track.title = event.title; + snapshot.state.current_track.artist = event.artist; + snapshot.state.current_track.album = event.album; + snapshot.state.current_track.album_art_uri = event.album_art_uri; + break; + + case "queue_updated": + snapshot.state.queue_len = event.queue_length; + // Pour la queue complète, on doit refetch + void fetchRendererSnapshot(rendererId, { force: true }); + break; + + case "binding_changed": + if (event.server_id && event.container_id) { + snapshot.binding = { + server_id: event.server_id, + container_id: event.container_id, + has_seen_update: false, + }; + snapshot.state.attached_playlist = snapshot.binding; + } else { + snapshot.binding = null; + snapshot.state.attached_playlist = null; + } + break; + + case "timer_started": + case "timer_updated": + case "timer_tick": + case "timer_expired": + case "timer_cancelled": + // Les événements de timer ne modifient pas le snapshot renderer + // (le timer state est géré séparément) + break; + } + + // Trigger reactivity + snapshotState.snapshots.set(rendererId, snapshot); }); sseConnected = true; diff --git a/pmocontrol/src/control_point.rs b/pmocontrol/src/control_point.rs index 560a6628..c0c6cd4b 100644 --- a/pmocontrol/src/control_point.rs +++ b/pmocontrol/src/control_point.rs @@ -334,8 +334,8 @@ impl ControlPoint { } tick = tick.wrapping_add(1); - // 500ms polling for smoother position updates and progress bar - thread::sleep(Duration::from_millis(500)); + // 250ms polling for smoother UI updates and fluid progress bar + thread::sleep(Duration::from_millis(250)); } });