Mopidy: トラックを追加して再生する方法が必要

作成日 2020年04月07日  ·  6コメント  ·  ソース: mopidy/mopidy

同時に接続されている複数のクライアントによって使用されるジュークボックスWebUIを構築しています。 彼らは曲をキューに入れる能力しか持っていません。 トラックリストが空で、最初の曲がキューに入れられた場合は、その曲の再生を開始します。

現在、それを行う方法はありません。 PlaybackController.play()は現在再生中のトラックを中断し、 PlaybackController.resume()はまだ何も再生されていない場合、トラックリストを再生しません。

私は明らかに次のようなことをするためにクライアントを装備することができます:

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

これに伴う問題は、2人が同時に曲をキューに入れると、両方が「STOPPED」状態に戻り、一方が他方を踏みにじる可能性があることです。 これを解決するには、APIに何かを組み込んで、トラックを追加し、それがトラックリストの唯一のトラックであり、再生が停止している場合に再生する必要があることを宣言できるようにします。

C-enhancement A-core

最も参考になるコメント

本質的にカスタムアトミックコレクションであるものを達成するための別の方法
コアオペレーションは、コマンドを実装するフロントエンドを提供することであり、
すべてのクライアントがそれを使用することを確認してください。 メカニズムがあればもっといいでしょう
どういうわけかWebSocketを拡張するため。

2020年4月7日火曜日、08:55 Stein Magnus Jodal、 notifications @ github.com
書きました:

必要になるため、問題をコアのmopidyリポジトリに転送しました
ここで変更します。


このスレッドにサブスクライブしているため、これを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 、または
退会
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W763​​6PBHZYLRLLMATANCNFSM4MC4SYFQ

全てのコメント6件

ここで変更が必要になるため、問題をコアのmopidyリポジトリに転送しました。

本質的にカスタムアトミックコレクションであるものを達成するための別の方法
コアオペレーションは、コマンドを実装するフロントエンドを提供することであり、
すべてのクライアントがそれを使用することを確認してください。 メカニズムがあればもっといいでしょう
どういうわけかWebSocketを拡張するため。

2020年4月7日火曜日、08:55 Stein Magnus Jodal、 notifications @ github.com
書きました:

必要になるため、問題をコアのmopidyリポジトリに転送しました
ここで変更します。


このスレッドにサブスクライブしているため、これを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/mopidy/mopidy/issues/1897#issuecomment-610236208 、または
退会
https://github.com/notifications/unsubscribe-auth/AAHEHKHXVX76W763​​6PBHZYLRLLMATANCNFSM4MC4SYFQ

競合状態は別として、これを_single_クライアントで確実に機能させることも簡単です。

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

トラックリストが空で始まると失敗します。

私のジュークボックスのユースケースは単純です。人々は曲をキューに入れ、何かを常に再生したいと思っています。 トラックリストが空で何も再生されていない場合は、新しいトラックの再生が開始されます。 なんらかの方法で一時停止した場合は、一時停止を解除する必要があります。

APIはこれを行う必要なしにこれをサポートしますか?これは非常に複雑に感じますか?:

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

私の場合のように動作を構築するためのビルディングブロックとしてそれらを使用できるように、各メソッドを正確に実行することを非常に正確にすることがAPIの哲学ですか? または、さまざまな状態や発信者の明らかな意図に対してより回復力がある必要があります(たとえば、何も再生されていない場合はPlaybackController.resume()がトラックリストを進めます)

トラックリストが空で始まると失敗します。

それは私が期待するように私のために働くので、私は誤解しなければなりません。 どのバックエンドを使用していますか?

一時停止すると、引数なしでplay呼び出しを再開する必要があります。 上記に加えて、以下はスニペットと同じことをしませんか?

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

Core APIは、JavaScript Webクライアントだけでなく、他のフロントエンドによって消費されるため、小さなビルディングブロックが理にかなっていることに注意してください。 発信者の意図は他のコンテキストでは必ずしも明白ではない可能性があるため、通常は仮定を焼き付けません。私にとって、停止したときに「再開」するという考えは、再開するものがないため意味がありません。

@altano 、私の提案で運が良かったですか?

ちょっと@ kingosticks 、GStreamerが次のいずれかでトラックを変更した後、散発的に再生に失敗するという無関係の問題のために、この単純なコードが機能していないと思ったかもしれないことに気付きました。

エラー2020-04-2003:57:04,106 [1:MainThread] mopidy.audio.gst、
GStreamerエラー:サーバーに接続できませんでした。

また

GStreamerエラー:リソースに書き込めませんでした。

私はそれについてDiscourseフォーラムに投稿しました(githubの問題をスパムしたくありませんでした)が、私の投稿はスパムとしてマークされ、現在承認を待っています。

その問題を解決したら、この単純なロジックを再試行して、機能するかどうかを確認します。

このページは役に立ちましたか?
0 / 5 - 0 評価