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
This commit is contained in:
2026-01-11 21:19:01 +01:00
parent af003292bc
commit 93f5900456
3 changed files with 97 additions and 6 deletions

2
Cargo.lock generated
View File

@@ -4,7 +4,7 @@ version = 4
[[package]] [[package]]
name = "PMOMusic" name = "PMOMusic"
version = "0.3.1" version = "0.3.3"
dependencies = [ dependencies = [
"axum 0.8.7", "axum 0.8.7",
"console-subscriber", "console-subscriber",

View File

@@ -105,12 +105,103 @@ function ensureSSEConnected() {
return; return;
} }
// Pour les autres événements, comportement existant // Pour les autres événements, mettre à jour le snapshot local directement
snapshotState.lastEventAt.set(rendererId, timestamp); 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 }); 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; sseConnected = true;

View File

@@ -334,8 +334,8 @@ impl ControlPoint {
} }
tick = tick.wrapping_add(1); tick = tick.wrapping_add(1);
// 500ms polling for smoother position updates and progress bar // 250ms polling for smoother UI updates and fluid progress bar
thread::sleep(Duration::from_millis(500)); thread::sleep(Duration::from_millis(250));
} }
}); });