Mopidy: Necesita una forma de agregar Y REPRODUCIR pistas

Creado en 7 abr. 2020  ·  6Comentarios  ·  Fuente: mopidy/mopidy

Estoy creando una interfaz de usuario web de Jukebox que será consumida por varios clientes conectados simultáneamente. Solo tienen la capacidad de poner canciones en cola. Si la lista de canciones está vacía y la primera canción se pone en cola, me gustaría que esa canción comenzara a reproducirse.

Ahora mismo no hay ningún método para hacer eso. PlaybackController.play() interrumpirá la pista que se está reproduciendo y PlaybackController.resume() no reproducirá la lista de pistas si todavía no se está reproduciendo nada.

Obviamente, puedo preparar al cliente para que haga algo como:

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();
}

El problema con esto es que si dos personas ponen canciones en cola al mismo tiempo, ambos podrían volver al estado "DETENIDO" y una persona pisoteará a la otra. Me gustaría resolver esto al tener algo integrado en la API que me permita agregar una pista y declarar que debe reproducirse si es la única pista en la lista de pistas y la reproducción está detenida.

C-enhancement A-core

Comentario más útil

Otra forma de lograr lo que es esencialmente una colección atómica personalizada de
Las operaciones centrales serían proporcionar un Frontend que implemente el comando y
asegúrese de que todos sus clientes lo utilicen. Esto sería mejor si tuviéramos un mecanismo
para extender el websocket de alguna manera.

El martes 7 de abril de 2020 a las 08:55 Stein Magnus Jodal, [email protected]
escribió:

Transferí el problema al repositorio principal de mopidy, ya que esto requeriría
cambios aquí.

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 , o
darse de baja
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

Todos 6 comentarios

Transferí el problema al repositorio principal de mopidy, ya que esto requeriría cambios aquí.

Otra forma de lograr lo que es esencialmente una colección atómica personalizada de
Las operaciones centrales serían proporcionar un Frontend que implemente el comando y
asegúrese de que todos sus clientes lo utilicen. Esto sería mejor si tuviéramos un mecanismo
para extender el websocket de alguna manera.

El martes 7 de abril de 2020 a las 08:55 Stein Magnus Jodal, [email protected]
escribió:

Transferí el problema al repositorio principal de mopidy, ya que esto requeriría
cambios aquí.

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 , o
darse de baja
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

Dejando de lado las condiciones de carrera, hacer que esto funcione de manera confiable con un cliente único también es un esfuerzo.

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

Eso falla si la lista de canciones comienza vacía.

Mi caso de uso de la máquina de discos es simple: la gente pone canciones en cola y quiero que algo suene siempre. Si la lista de pistas estaba vacía y no se estaba reproduciendo nada, la nueva pista debería comenzar a reproducirse. Si las cosas se detuvieron de alguna manera, deberían reanudarlas.

¿La API admite esto sin tener que hacer esto, que se siente demasiado complicado ?:

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();
  }
}

¿Es la filosofía de la API hacer que cada método sea súper preciso exactamente en lo que hace para que pueda usarlos como bloques de construcción para construir un comportamiento como mi caso? ¿O debería ser más resistente a los diferentes estados y la intención obvia de la persona que llama (por ejemplo, PlaybackController.resume() avanzando la lista de canciones si no se está reproduciendo nada)?

Eso falla si la lista de canciones comienza vacía.

Debo entenderlo mal porque eso funciona para mí como lo esperaba. ¿Qué backend estás usando?

Cuando está en pausa, la llamada a play sin argumentos debe reanudarse. Teniendo en cuenta que, junto con lo anterior, ¿no hace lo siguiente lo mismo que su fragmento?

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

Tenga en cuenta que la API principal es consumida por otras interfaces, no solo por los clientes web javascript, por lo que los pequeños bloques de construcción tienen sentido. Es posible que la intención de la persona que llama no siempre sea obvia en otros contextos, por lo que generalmente no hacemos suposiciones. Para mí, la idea de "reanudar" cuando se detiene no tiene sentido, ya que no hay nada que reanudar.

@altano , ¿tuviste suerte con mi sugerencia?

Hola @kingosticks , ahora me doy cuenta de que podría haber pensado que este código más simple no funcionaba debido a un problema no relacionado en el que GStreamer no se reproduce esporádicamente después de un cambio de pista con:

ERROR 2020-04-20 03: 57: 04,106 [1: MainThread] mopidy.audio.gst,
Error de GStreamer: no se pudo conectar al servidor,

o

Error de GStreamer: no se pudo escribir en el recurso.

Publiqué sobre esto en el foro Discourse (no quería enviar spam a problemas de github) pero mi publicación se marcó como spam y ahora está esperando aprobación.

Una vez que resuelva ese problema, intentaré esta lógica más simple nuevamente y veré si funciona.

¿Fue útil esta página
0 / 5 - 0 calificaciones