Mopidy: Besoin d'un moyen d'ajouter ET de JOUER des pistes

Créé le 7 avr. 2020  ·  6Commentaires  ·  Source: mopidy/mopidy

Je construis une interface utilisateur Web Jukebox qui sera consommée par plusieurs clients connectés simultanément. Ils ont seulement la possibilité de mettre des chansons en file d'attente. Si la liste des pistes est vide et que la première chanson est mise en file d'attente, j'aimerais que cette chanson commence à jouer.

Pour l'instant, il n'y a pas de méthode pour le faire. Le PlaybackController.play() interrompra la piste en cours de lecture et PlaybackController.resume() ne jouera pas la liste des pistes si rien n'était encore en cours de lecture.

Je peux évidemment configurer le client pour qu'il fasse quelque chose comme :

await mopidy.tracklist.add(...);
const playbackState = await mopidy.playback.getState();
if (playbackState === "PAUSED") {
  await mopidy.playback.resume();
} else if (playbackState === "STOPPED") {
  await mopidy.playback.play();
}

Le problème avec ceci est que si deux personnes mettent des chansons en file d'attente en même temps, elles peuvent toutes les deux retrouver l'état "ARRÊTÉ" et une personne piétinera l'autre. J'aimerais résoudre ce problème en ayant quelque chose d'intégré à l'API qui me permet à la fois d'ajouter une piste et de déclarer qu'elle doit être jouée si c'est la seule piste de la liste des pistes et que la lecture est arrêtée.

C-enhancement A-core

Commentaire le plus utile

Une autre façon d'atteindre ce qui est essentiellement une collection atomique personnalisée de
opérations de base seraient de fournir un Frontend mettant en œuvre la commande et
assurez-vous que tous vos clients l'utilisent. Ce serait mieux si nous avions un mécanisme
pour étendre le websocket en quelque sorte.

Le Mar. 7 Avr 2020, 08:55 Stein Magnus Jodal, [email protected]
a écrit:

J'ai transféré le problème vers le référentiel principal de mpidy, car cela nécessiterait
change ici.

-
Vous recevez ceci parce que vous êtes abonné à ce fil.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 , ou
Se désabonner
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

Tous les 6 commentaires

J'ai transféré le problème vers le référentiel principal de mpidy, car cela nécessiterait des modifications ici.

Une autre façon d'atteindre ce qui est essentiellement une collection atomique personnalisée de
opérations de base seraient de fournir un Frontend mettant en œuvre la commande et
assurez-vous que tous vos clients l'utilisent. Ce serait mieux si nous avions un mécanisme
pour étendre le websocket en quelque sorte.

Le Mar. 7 Avr 2020, 08:55 Stein Magnus Jodal, [email protected]
a écrit:

J'ai transféré le problème vers le référentiel principal de mpidy, car cela nécessiterait
change ici.

-
Vous recevez ceci parce que vous êtes abonné à ce fil.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 , ou
Se désabonner
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

Mis à part les conditions de course, faire en sorte que cela fonctionne de manière fiable avec un seul client est également un effort.

await mopidy.tracklist.add({ tracks: [track] });
await mopidy.playback.play({});

Cela échoue si la liste des pistes commence vide.

Mon cas d'utilisation de jukebox est simple : les gens mettent des chansons en file d'attente et je veux que quelque chose soit toujours joué. Si la liste des pistes était vide et que rien n'était en cours de lecture, la nouvelle piste devrait commencer à jouer. Si les choses se sont interrompues d'une manière ou d'une autre, elles devraient reprendre.

L'API prend-elle en charge cela sans avoir à le faire, ce qui semble beaucoup trop compliqué ? :

const firstFewTracks = await mopidy.tracklist.slice({ start: 0, end: 3 });
...
const [tlTrack] = await mopidy.tracklist.add({ tracks: [track] });
if (firstFewTracks.length === 0) {
  await mopidy.playback.play({ tlid: tlTrack.tlid });
} else {
  const playbackState = await mopidy.playback.getState();
  if (playbackState === "stopped") {
    await mopidy.playback.play({});
  } else if (playbackState === "paused") {
    await mopidy.playback.resume();
  }
}

Est-ce la philosophie de l'API d'avoir chaque méthode très précise dans ce qu'elle fait exactement afin que vous puissiez les utiliser comme blocs de construction pour créer un comportement comme mon cas ? Ou devrait-il être plus résistant aux différents états et à l'intention évidente de l'appelant (par exemple, PlaybackController.resume() faire avancer la liste des morceaux si rien ne joue)

Cela échoue si la liste des pistes commence vide.

Je dois mal comprendre parce que cela fonctionne pour moi comme je m'y attendais. Quel backend utilisez-vous ?

En pause, l'appel de play sans argument devrait reprendre. Considérant que, avec ce qui précède, les éléments suivants ne font-ils pas la même chose que votre extrait de code ?

await mopidy.tracklist.add({ tracks: [track] });
const playbackState = await mopidy.playback.getState();
if (playbackState != "playing") {
  await mopidy.playback.play({})
}

Gardez à l'esprit que l'API Core est consommée par d'autres frontends, pas seulement par les clients Web javascript, et donc de petits blocs de construction ont du sens. L'intention de l'appelant peut ne pas toujours être évidente dans d'autres contextes, nous n'intégrons donc généralement pas d'hypothèses. Pour moi, l'idée de "reprendre" à l'arrêt n'a aucun sens car il n'y a rien à reprendre.

@altano , avez-vous eu de la chance avec ma suggestion?

salut @kingosticks , je me rends compte maintenant que j'aurais pu penser que ce code plus simple ne fonctionnait pas à cause d'un problème sans rapport où GStreamer ne parvient pas sporadiquement à jouer après un changement de piste avec soit:

ERREUR 2020-04-20 03:57:04,106 [1:MainThread] mopidy.audio.gst,
Erreur GStreamer : impossible de se connecter au serveur,

ou

Erreur GStreamer : impossible d'écrire dans la ressource.

J'ai posté à ce sujet sur le forum Discourse (je ne voulais pas spammer les problèmes de github) mais mon message a été marqué comme spam et est maintenant en attente d'approbation.

Une fois que j'aurai résolu ce problème, j'essaierai à nouveau cette logique plus simple et je verrai si cela fonctionne.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

artjeck picture artjeck  ·  11Commentaires

kingosticks picture kingosticks  ·  12Commentaires

ecoCuyo picture ecoCuyo  ·  3Commentaires

Mestelan picture Mestelan  ·  6Commentaires

jodal picture jodal  ·  15Commentaires