Mopidy: 現在再生中のトラックをトラックリストから削除するときの未定義の動作。

作成日 2017年01月07日  ·  10コメント  ·  ソース: mopidy/mopidy

TracklistController.remove()現在、トラックを削除してtracklist_changedイベントをトリガーします。

https://github.com/mopidy/mopidy/blob/2b7f12b8542d04190a85ed890edac1ce9192d9e8/mopidy/core/tracklist.py#L567 -L572

トラックリストから削除されたばかりの場合、現在のトラックを再生し続けることが理にかなっているのかわかりません。代わりに、その時点でstop()またはnext()を呼び出す方がよいでしょうか。

https://github.com/mopidy/mopidy/blob/2b7f12b8542d04190a85ed890edac1ce9192d9e8/mopidy/core/playback.py#L304 -L305

C-bug A-core

最も参考になるコメント

MPDはトラックを削除し、可能な場合はプレイリスト内の次のトラックにジャンプします。 それ以外の場合、再生は停止します。

全てのコメント10件

mpdの機能を確認する必要があります

MPDはトラックを削除し、可能な場合はプレイリスト内の次のトラックにジャンプします。 それ以外の場合、再生は停止します。

誰かがこのバグを修正し始めましたか? 私は解決策を考え出すことを試みることができます。

いいえ、それを行ってください。 誰もパイプを張っていないので、MPDの動作をミラーリングすることは合理的であると推測できます。

Ok。 いくつかの観察:

  • PlaybackControllerは、self._current_tl_trackを使用して、next()などの他のトラックを検索します。 トラックを削除した後もトラックリストから再生を続ける場合は、self._current_tl_trackをトラックリストの残りのトラック(_current_tl_trackはもう含まれていません)に関連付ける必要があります。 非常に簡単なことは、TracklistController.tl_tracksを調べて、_current_tl_trackのtlidよりも高いtlid値でトラックを再生することです。 次のトラックの再生の実装をより簡単にする何かを見逃した場合はお知らせください。
  • PlayplayController._on_about_to_finish()は、再生中のトラックが削除されるとAttributeErrorをスローします(つまり、トラックが削除されると、_on_tracklist_change()は少なくともstop()する必要があります):
    File "/home/aj/mopidy-dev/mopidy/mopidy/core/playback.py", line 270, in _on_about_to_finish self._last_position = self._current_tl_track.track.length AttributeError: 'NoneType' object has no attribute 'track'
  • _on_tracklist_change()の単体テストがないことに気づきました。おそらく、_on_about_to_finish()のテストにいくつかのヒントがあります。
  • MPDとは対照的に、VLCは、再生中にトラックが削除されると再生を停止します

この問題を修正したブランチを作成しました。これは、ストリームを含むすべてのトラックで機能し、gstreamerが停止時にバッファリングメッセージを送信することに関連するいくつかの追加の問題がありました。 現在、いくつかのテストに失敗していますが、実際には機能します。 これは@kingosticksWeb APIプレイリストブランチに基づいているため、その機能も含まれています。 テストを修正する前に、ベータテストをさらに取得することに興味がある人がいれば、 https://github.com/fatg3erman/mopidy/tree/fix/consume-current-trackにあります。

実際、そのコメントの一部はナンセンスです:)それはweb-api-playlistsブランチに基づいていません。なぜなら、それはmopidy-spotifyであり、この問題とは無関係だからです:)今日はまだ十分なお茶を飲んでいません...。

私は今休暇中ですが、次の週末に戻ったときに確認できます(必要に応じてプルリクエストを行います)。

ありがとう。 このためにPR1689を追加しました。

mopidy3.0.1でも再現可能

Traceback (most recent call last):
  File "/usr/lib/python3.7/site-packages/mopidy/audio/actor.py", line 559, in _on_about_to_finish
    self._about_to_finish_callback()
  File "/usr/lib/python3.7/site-packages/mopidy/core/playback.py", line 178, in _on_about_to_finish_callback
    kwargs={},
  File "/usr/lib/python3.7/site-packages/pykka/_ref.py", line 114, in ask
    return future.get(timeout=timeout)
  File "/usr/lib/python3.7/site-packages/pykka/_threading.py", line 45, in get
    _compat.reraise(*self._data['exc_info'])
  File "/usr/lib/python3.7/site-packages/pykka/_compat/__init__.py", line 29, in reraise
    raise value
  File "/usr/lib/python3.7/site-packages/pykka/_actor.py", line 193, in _actor_loop
    response = self._handle_receive(envelope.message)
  File "/usr/lib/python3.7/site-packages/pykka/_actor.py", line 299, in _handle_receive
    return callee(*message.args, **message.kwargs)
  File "/usr/lib/python3.7/site-packages/mopidy/core/playback.py", line 190, in _on_about_to_finish
    self._last_position = self._current_tl_track.track.length
AttributeError: 'NoneType' object has no attribute 'track'

STR:現在再生中のトラックを削除し、終了するのを待ちます

ncmpcppを使用:複数のトラックを再生します。 現在再生されていない他のトラックにカーソルを合わせます。 shift-cを押して、ホバーしたトラックを除くすべてのトラックを削除します。 現在のトラックが終了するのを待ちます。

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