Mopidy: Benötigen Sie eine Möglichkeit zum Hinzufügen von AND PLAY-Tracks

Erstellt am 7. Apr. 2020  ·  6Kommentare  ·  Quelle: mopidy/mopidy

Ich baue eine Jukebox-Webbenutzeroberfläche, die von mehreren gleichzeitig verbundenen Clients verwendet wird. Sie haben nur die Möglichkeit, Songs in die Warteschlange zu stellen. Wenn die Trackliste leer ist und der erste Song in die Warteschlange gestellt wird, möchte ich, dass dieser Song abgespielt wird.

Im Moment gibt es dafür keine Methode. PlaybackController.play() unterbricht den laufenden Titel und PlaybackController.resume() spielt die Titelliste nicht ab, wenn noch nichts abgespielt wurde.

Ich kann den Client natürlich so aufrüsten, dass er Folgendes tut:

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

Das Problem dabei ist, dass, wenn zwei Leute gleichzeitig Songs in die Warteschlange stellen, beide möglicherweise in den Zustand "STOPPED" zurückkehren und eine Person die andere mit Füßen tritt. Ich möchte dies lösen, indem ich etwas in die API eingebaut habe, mit dem ich sowohl einen Track hinzufügen als auch angeben kann, dass er abgespielt werden soll, wenn er der einzige Track in der Trackliste ist und die Wiedergabe gestoppt wird.

C-enhancement A-core

Hilfreichster Kommentar

Ein weiterer Weg, um zu einer im Wesentlichen benutzerdefinierten atomaren Sammlung von zu gelangen
Kernoperationen wären die Bereitstellung eines Frontends, das den Befehl implementiert und
Stellen Sie sicher, dass alle Ihre Kunden es verwenden. Das wäre besser, wenn wir einen Mechanismus hätten
um den Websocket irgendwie zu erweitern.

Am Di, 7. April 2020, 08:55 Uhr Stein Magnus Jodal, [email protected]
schrieb:

Ich habe das Problem in das Core-Mopidy-Repo übertragen, da dies erforderlich wäre
ändert sich hier.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 , oder
Abmelden
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

Alle 6 Kommentare

Ich habe das Problem in das Core-Mopidy-Repo übertragen, da dies hier Änderungen erfordern würde.

Ein weiterer Weg, um zu einer im Wesentlichen benutzerdefinierten atomaren Sammlung von zu gelangen
Kernoperationen wären die Bereitstellung eines Frontends, das den Befehl implementiert und
Stellen Sie sicher, dass alle Ihre Kunden es verwenden. Das wäre besser, wenn wir einen Mechanismus hätten
um den Websocket irgendwie zu erweitern.

Am Di, 7. April 2020, 08:55 Uhr Stein Magnus Jodal, [email protected]
schrieb:

Ich habe das Problem in das Core-Mopidy-Repo übertragen, da dies erforderlich wäre
ändert sich hier.


Sie erhalten dies, weil Sie diesen Thread abonniert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 , oder
Abmelden
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W7636PBHZYLRLLMATANCNFSM4MC4SYFQ
.

Abgesehen von den Rennbedingungen ist es auch mühsam, dies mit einem _einzelnen_ Client zuverlässig zum Laufen zu bringen.

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

Das schlägt fehl, wenn die Tracklist leer beginnt.

Mein Jukebox-Anwendungsfall ist einfach: Leute stellen Songs in die Warteschlange und ich möchte, dass immer etwas abgespielt wird. Wenn die Trackliste leer war und nichts abgespielt wurde, sollte der neue Track abgespielt werden. Wenn die Dinge irgendwie pausiert wurden, sollten sie eine Pause einlegen.

Unterstützt die API dies, ohne dies tun zu müssen, was sich viel zu kompliziert anfühlt?:

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

Ist es die Philosophie der API, dass jede Methode sehr genau ist, was sie tut, damit Sie sie als Bausteine ​​​​zum Erstellen von Verhalten wie in meinem Fall verwenden können? Oder sollte es widerstandsfähiger gegenüber den verschiedenen Zuständen und offensichtlichen Absichten des Anrufers sein (z. B. PlaybackController.resume() die Trackliste vorrücken, wenn nichts abgespielt wird)

Das schlägt fehl, wenn die Tracklist leer beginnt.

Ich muss das missverstehen, denn das funktioniert für mich so, wie ich es erwarten würde. Welches Backend verwendest du?

Nach einer Pause sollte der Aufruf von play ohne Argumente fortgesetzt werden. Wenn man bedenkt, dass das Folgende zusammen mit dem oben Gesagten nicht dasselbe wie Ihr Snippet tut?

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

Denken Sie daran, dass die Core API von anderen Frontends verwendet wird, nicht nur von Javascript-Webclients, und daher sind kleine Bausteine ​​sinnvoll. Die Absicht des Aufrufers ist in anderen Kontexten möglicherweise nicht immer offensichtlich, sodass wir im Allgemeinen keine Annahmen einarbeiten. Für mich macht die Idee des "Fortsetzens" keinen Sinn, wenn es angehalten wird, da es nichts zum Fortsetzen gibt.

@altano ,

hey @kingosticks , mir ist jetzt klar, dass ich vielleicht gedacht habe, dass dieser einfachere Code aufgrund eines nicht verwandten Problems nicht funktioniert, bei dem GStreamer nach einem Trackwechsel sporadisch einfach nicht

FEHLER 2020-04-20 03:57:04,106 [1:MainThread] mopidy.audio.gst,
GStreamer-Fehler: Es konnte keine Verbindung zum Server hergestellt werden,

oder

GStreamer-Fehler: Es konnte nicht in die Ressource geschrieben werden.

Ich habe darüber im Discourse-Forum gepostet (ich wollte keine Github-Probleme spammen), aber mein Beitrag wurde als Spam markiert und wartet jetzt auf die Genehmigung.

Sobald ich dieses Problem durchgearbeitet habe, werde ich diese einfachere Logik erneut versuchen und sehen, ob sie funktioniert.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

weilbith picture weilbith  ·  7Kommentare

mczerski picture mczerski  ·  9Kommentare

artjeck picture artjeck  ·  11Kommentare

ice-bear-forever picture ice-bear-forever  ·  6Kommentare

djselbeck picture djselbeck  ·  8Kommentare