Implémentation du shuffle de la queue de lecture

Ajout de la fonctionnalité de shuffle pour mélanger l'ordre des morceaux dans la queue de lecture.

- Implémentation de la méthode shuffle_queue() dans MusicRenderer
- Ajout de l'endpoint REST /api/control/renderers/{renderer_id}/queue/shuffle
- Intégration du bouton shuffle dans l'interface Vue.js
- Centralisation des émissions d'événements SSE dans le MusicRenderer
- Mise à jour de la documentation OpenAPI

Cette fonctionnalité permet de randomiser l'ordre des morceaux dans la queue et de redémarrer la lecture depuis le premier morceau, tout en améliorant l'architecture en centralisant les émissions d'événements.
This commit is contained in:
2026-01-16 08:56:14 +01:00
parent 50bc0570ba
commit 8e9dd7601f
15 changed files with 763 additions and 44 deletions

View File

@@ -3,6 +3,7 @@ import { computed } from "vue";
import { Server, Music2 } from "lucide-vue-next";
import StatusBadge from "@/components/pmocontrol/StatusBadge.vue";
import TimerControl from "@/components/pmocontrol/TimerControl.vue";
import ShuffleControl from "@/components/pmocontrol/ShuffleControl.vue";
import type {
RendererSummary,
RendererState,
@@ -113,8 +114,9 @@ function handleRendererDrawerClick() {
</div>
</div>
<!-- Sleep Timer (si un renderer est actif) -->
<div v-if="activeRenderer" class="timer-section">
<!-- Shuffle et Sleep Timer (si un renderer est actif) -->
<div v-if="activeRenderer" class="controls-section">
<ShuffleControl :renderer-id="activeRenderer.id" />
<TimerControl :renderer-id="activeRenderer.id" />
</div>
@@ -342,6 +344,14 @@ function handleRendererDrawerClick() {
border: 1px solid rgba(239, 68, 68, 0.3);
}
/* Controls section (shuffle + timer) */
.controls-section {
display: flex;
align-items: center;
gap: var(--spacing-sm);
flex-shrink: 0;
}
/* Mobile responsive */
@media (max-width: 768px) {
.bottom-bar {