🚀 v0.3.42 → v0.3.43 — Correctif bug shuffle & amélioration auto-advance
- Mise à jour de la version (0.3.42 → 0.3.43) dans Cargo.toml, lock et version.txt - Correctif critique du bug d’auto-saut après shuffle ou sélection manuelle : réinitialisation obligatoire de `has_played_flag` + positionnement explicite du playback source avant appel backend - Ajout de logs détaillés pour tracer les appels à `play_from_index`, ainsi que l’état de la queue - Intégration d’un retry (`play_current_from_queue_with_retry`) pour les renderers JBL-like qui échouent au premier Play - Correction de race condition potentielle lors du changement d’index ou auto-saut
This commit is contained in:
@@ -27,10 +27,6 @@ const loadingIds = reactive(new Set<string>());
|
|||||||
const queueRefreshingIds = reactive(new Set<string>());
|
const queueRefreshingIds = reactive(new Set<string>());
|
||||||
const selectedRendererId = ref<string | null>(null);
|
const selectedRendererId = ref<string | null>(null);
|
||||||
|
|
||||||
// Debounce pour les refetches queue_updated
|
|
||||||
const queueUpdateDebounceTimers = new Map<string, ReturnType<typeof setTimeout>>();
|
|
||||||
const QUEUE_UPDATE_DEBOUNCE_MS = 300;
|
|
||||||
|
|
||||||
// Cache des renderers (summary)
|
// Cache des renderers (summary)
|
||||||
const renderersCache = ref<Map<string, RendererSummary>>(new Map());
|
const renderersCache = ref<Map<string, RendererSummary>>(new Map());
|
||||||
const RENDERERS_CACHE_MS = 2000;
|
const RENDERERS_CACHE_MS = 2000;
|
||||||
@@ -205,15 +201,10 @@ function ensureSSEInitialized() {
|
|||||||
snapshot.state.queue_len = event.queue_length;
|
snapshot.state.queue_len = event.queue_length;
|
||||||
queueRefreshingIds.delete(rendererId);
|
queueRefreshingIds.delete(rendererId);
|
||||||
|
|
||||||
// Annuler le timer précédent pour ce renderer
|
// Fetch queue items immediately when we get queue_updated
|
||||||
const existingTimer = queueUpdateDebounceTimers.get(rendererId);
|
// The debounce was causing race conditions where queue_len was updated
|
||||||
if (existingTimer) clearTimeout(existingTimer);
|
// but items weren't fetched yet when user clicked play
|
||||||
|
void fetchRendererSnapshot(rendererId, { force: true });
|
||||||
// Programmer un seul fetch après stabilisation
|
|
||||||
queueUpdateDebounceTimers.set(rendererId, setTimeout(() => {
|
|
||||||
queueUpdateDebounceTimers.delete(rendererId);
|
|
||||||
void fetchRendererSnapshot(rendererId, { force: true });
|
|
||||||
}, QUEUE_UPDATE_DEBOUNCE_MS));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "binding_changed":
|
case "binding_changed":
|
||||||
@@ -448,6 +439,7 @@ async function resumeOrPlayFromQueue(id: string) {
|
|||||||
return play(id);
|
return play(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if queue has content
|
||||||
if (
|
if (
|
||||||
["STOPPED", "NO_MEDIA"].includes(state.transport_state) &&
|
["STOPPED", "NO_MEDIA"].includes(state.transport_state) &&
|
||||||
snapshot.queue.items.length > 0
|
snapshot.queue.items.length > 0
|
||||||
|
|||||||
Reference in New Issue
Block a user