Mopidy: Mopidy 随机将上一首曲目标题带到下一首曲目

创建于 2020-01-15  ·  11评论  ·  资料来源: mopidy/mopidy

你好,

在让 Mopidy 完成一首曲目并转到下一首曲目后,曲目标题未正确更新,导致下一首曲目与上一首曲目具有相同的标题。 这个问题似乎慢慢变得更糟,整个播放列表变得倾斜。
作为记录; 音频播放良好,艺术家更新良好,曲目编号更新良好,曲目长度和进度也是如此。

重现步骤:

  1. 用几首曲目填充播放列表,
  2. 播放一个,不要跳过或寻找(就像当你让一首曲目播放一段时间时发生的那样)
  3. 让曲目完成,并注意在移动到下一曲目时标题没有改变。
    我正在运行 Arch Linux,具有以下版本的 Mopidy 及其扩展:

  4. mopidy 3.0.1-2

  5. mopidy 本地 3.1.0-1
  6. mopidy-mpd 3.0.0-1
  7. mopidy-soundcloud 3.0.0-1
    这些都更新到 Arch 和 AUR 上的最新已知版本。

自从去年某个地方更新到 Mopidy 3 以来,我一直在处理这个问题,而 2 从未有过这种行为。
这个问题似乎类似于 #1528 https://github.com/mopidy/mopidy/issues/1528 ,但是那个讨论的是 Mopidy 2。

下面显示的曲目是从 mopidy-local 播放的。

在 ncmpcpp 中:
不正确的曲目列表https://camo.githubusercontent.com/fa91261107d7af341374ef03a1ab2a774e813e9f/68747470733a2f2f692e696d6775722e636f6d2f5532707e67e6

在 polybar 的 MPD 扩展中:
Polybar MPD https://camo.githubusercontent.com/5b6207e174cd0cce829d2164aba91868c451d50b/68747470733a2f2f692e696d6775722e636f6d2f39767a6e4e

这是实际的曲目列表:
正确的曲目列表https://camo.githubusercontent.com/c99c327c9505f563f9f96a92b2b54df2a4f02a28/68747470733a2f2f692e696d6775722e636f6d2f66267e6d

使用不同的专辑,我尝试在发生时使用 mopidy -v 捕获日志。
登录https://camo.githubusercontent.com/76bb6011e2138c5ca800ac2b7d18618e46a8ca75/68747470733a2f2f692e696d6775722e636f6d2f6d53497376e7e

DEBUG 2020-01-15 14:07:06,594 [79919:MainThread] mopidy.audio.actor
音频事件:tags_changed(tags=['minimum-bitrate', 'bitrate'])
DEBUG 2020-01-15 14:07:06,594 [79919:MainThread] mopidy.listener
发送 tags_changed 到 AudioListener: {'tags': ['minimum-bitrate', 'bitrate']}
调试 2020-01-15 14:07:06,644 [79919:MpdSession-11] mopidy_mpd.session
来自 [:: ffff:127.0.0.1 ]:34768 的请求:noidle
调试 2020-01-15 14:07:06,644 [79919:MpdSession-11] mopidy_mpd.session
对 [:: ffff:127.0.0.1 ]:34768 的响应:好的
调试 2020-01-15 14:07:06,644 [79919:MpdSession-11] mopidy_mpd.session
来自 [:: ffff:127.0.0.1 ]:34768 的请求:状态
调试 2020-01-15 14:07:06,647 [79919:MpdSession-11] mopidy_mpd.session
对 [:: ffff:127.0.0.1 ]:34768 的回应:
体积:100
重复:0
随机:0
单身:0
消耗:0
播放列表:5
播放列表长度:8
淡入淡出:0
状态:玩
歌曲:2
歌曲编号:12
下一首:3
nextsongid: 13
时间:1:270
经过:1.412
比特率:0
好的
调试 2020-01-15 14:07:06,648 [79919:MpdSession-11] mopidy_mpd.session
来自 [:: ffff:127.0.0.1 ]:34768 的请求:空闲
调试 2020-01-15 14:07:06,656 [79919:MainThread] mopidy.audio.gst
得到 TAG 总线消息:tags={'artist': ['Ben Lukas Boysen'], 'title': ['Sleepers Beat Theme'], 'track-number': [3], 'track-count': [8 ],'专辑':['Spells'],'datetime':['2016'],'专辑艺术家':['Ben Lukas Boysen'],'组织':['Erased Tapes Records'],'流派':['环境/现代古典'],'isrc':['ERATP085'],'图像':
调试输出(来自图像)中有很多噪音,它很快超出了我终端的缓冲区大小。
如果需要任何其他信息,请告诉我,我会尽我所能。

谢谢你。

C-bug

最有用的评论

迟到总比不到好,重新标记更新和所有这些事件它变得复杂,因为它都是异步的。 自从我详细研究这些东西以来已经有很长时间了。 但是这里有一个非常简化的管道图:

[SRC] --> [DECODER] --> [SINK]
  • about-to-finishSRC数据耗尽时触发
  • 此时标签更新可能仍在管道中的中间节点中流动
  • 当前曲目的音频在此阶段仍在流动
  • 对于像 Icecast 流媒体这样的情况,这些标签在它们上线时到达SINK (我认为这也是我们获取它们的地方)
  • STREAM_START - 老实说,我不记得我们是在达到SINK时还是在SRC发生此事件时才收到此事件-这可能是正确处理的关键。 查看https://gstreamer.freedesktop.org/documentation/gstreamer/gstmessage.html?gi-language=c#gst_message_new_stream_start似乎一旦所有接收器都看到它,管道/bin 可能会将其转发到消息总线。

因此,认为我们可能会遇到在about-to-finish和下一首曲目开始之间存在有意义标签的情况。 如果做到这一点很棘手,我们可以考虑忽略它们,但在代码中添加一个 TODO 并提交其他错误以进行后续处理,如果这比当前状态破坏得少?

所有11条评论

这看起来与 mopidy/mopidy-mpd#23 有关。

没问题! 两份报告都在几个小时内发布,我们仍然不知道根本原因在哪个部分。

我会说这可能与https://github.com/mopidy/mopidy/pull/1751 有关,如果不是因为 Mopidy 2.x 中不存在此问题的声明。

我相信遇到了同样的问题,但我已经遇到这个问题几个月了。 还有 Arch 这里,一切都更新了。

Mopidy 将之前的曲目标题保留为当前曲目。 即曲目结束 - ncmpcpp 和 polybar 扩展显示以前的曲目名称(简单地为“Eminem - In Too Deep”)。 mpc 显示“Godzilla: Eminem - In Too Deep”,其中 Godzilla 是当前歌曲,In Too Deep 是上一首。 这有点奇怪,一个是错误,但为什么 mpc 显示两者?

这是https://github.com/mopidy/mopidy/pull/1751揭示的东西的组合,因此它也出现在 Mopidy v2.3.0 中。

我播放列表中的前两首曲目是 (1) 'Set Guitars To Kill' 然后是 (2) 'A Little Bit Of Solidarity Goes A Long Way'。 下面的日志显示,在从 (1) 到 (2) 的轨道更改后,我们收到了一个标签更改事件,但最终我们使用旧的轨道数据发送了stream_title_changed

Dummy-21 DEBUG    2020-01-17 23:58:44,257 Got about-to-finish event.
Dummy-21 DEBUG    2020-01-17 23:58:44,257 Running about-to-finish callback.
LocalBackend-8 DEBUG    2020-01-17 23:58:44,259 Backend translated URI from local:track:And%20So%20I%20Watch%20You%20From%20Afar%20-%20Self%20Titled%20%282009%29/02-and_so_i_watch_you_from_afar-a_little_bit_of_solidarity_goes_a_long_way.mp3 to file:///home/nick/Music/And%20So%20I%20Watch%20You%20From%20Afar%20-%20Self%20Titled%20%282009%29/02-and_so_i_watch_you_from_afar-a_little_bit_of_solidarity_goes_a_long_way.mp3
Dummy-21 DEBUG    2020-01-17 23:58:44,262 Got source-setup signal: element=GstFileSrc
MainThread DEBUG    2020-01-17 23:58:44,574 Got TAG bus message: tags={'title': ['Set Guitars To Kill'], 'artist': ['And So I Watch You From Afar'], 'album': ['Self Titled'], 'datetime': ['2009-04-13'], 'track-number': [1], 'genre': ['Instrumental Rock'], 'container-format': ['ID3 tag'], 'private-id3v2-frame': [b'TLAN\x00\x00\x00\x04\x00\x00\x00eng', b'TXXX\x00\x00\x00\x14\x00\x00\x00Rip date\x002009-04-14', b'TXXX\x00\x00\x00\n\x00\x00\x00Source\x00CD', b'TXXX\x00\x00\x00\x1c\x00\x00\x00Release type\x00Normal release'], 'track-count': [11], 'encoder': ['LAME 3.97 (-V2 --vbr-new)'], 'publisher': ['Smalltown America'], 'private-data': [b'\x02\x00\xfb1K\x00'], 'has-crc': [False], 'channel-mode': ['joint-stereo'], 'audio-codec': ['MPEG-1 Layer 3 (MP3)'], 'minimum-bitrate': [95856], 'maximum-bitrate': [319725], 'bitrate': [252000]}
MainThread DEBUG    2020-01-17 23:58:44,853 Got TAG bus message: tags={'title': ['Set Guitars To Kill'], 'artist': ['And So I Watch You From Afar'], 'album': ['Self Titled'], 'datetime': ['2009-04-13'], 'track-number': [1], 'genre': ['Instrumental Rock'], 'container-format': ['ID3 tag'], 'private-id3v2-frame': [b'TLAN\x00\x00\x00\x04\x00\x00\x00eng', b'TXXX\x00\x00\x00\x14\x00\x00\x00Rip date\x002009-04-14', b'TXXX\x00\x00\x00\n\x00\x00\x00Source\x00CD', b'TXXX\x00\x00\x00\x1c\x00\x00\x00Release type\x00Normal release'], 'track-count': [11], 'encoder': ['LAME 3.97 (-V2 --vbr-new)'], 'publisher': ['Smalltown America'], 'private-data': [b'\x02\x00\xfb1K\x00'], 'has-crc': [False], 'channel-mode': ['joint-stereo'], 'audio-codec': ['MPEG-1 Layer 3 (MP3)'], 'minimum-bitrate': [79931], 'maximum-bitrate': [319725], 'bitrate': [252000]}
MainThread DEBUG    2020-01-17 23:58:45,062 Got TAG bus message: tags={'title': ['Set Guitars To Kill'], 'artist': ['And So I Watch You From Afar'], 'album': ['Self Titled'], 'datetime': ['2009-04-13'], 'track-number': [1], 'genre': ['Instrumental Rock'], 'container-format': ['ID3 tag'], 'private-id3v2-frame': [b'TLAN\x00\x00\x00\x04\x00\x00\x00eng', b'TXXX\x00\x00\x00\x14\x00\x00\x00Rip date\x002009-04-14', b'TXXX\x00\x00\x00\n\x00\x00\x00Source\x00CD', b'TXXX\x00\x00\x00\x1c\x00\x00\x00Release type\x00Normal release'], 'track-count': [11], 'encoder': ['LAME 3.97 (-V2 --vbr-new)'], 'publisher': ['Smalltown America'], 'private-data': [b'\x02\x00\xfb1K\x00'], 'has-crc': [False], 'channel-mode': ['joint-stereo'], 'audio-codec': ['MPEG-1 Layer 3 (MP3)'], 'minimum-bitrate': [63700], 'maximum-bitrate': [319725], 'bitrate': [252000]}
MainThread DEBUG    2020-01-17 23:58:45,342 Got TAG bus message: tags={'title': ['Set Guitars To Kill'], 'artist': ['And So I Watch You From Afar'], 'album': ['Self Titled'], 'datetime': ['2009-04-13'], 'track-number': [1], 'genre': ['Instrumental Rock'], 'container-format': ['ID3 tag'], 'private-id3v2-frame': [b'TLAN\x00\x00\x00\x04\x00\x00\x00eng', b'TXXX\x00\x00\x00\x14\x00\x00\x00Rip date\x002009-04-14', b'TXXX\x00\x00\x00\n\x00\x00\x00Source\x00CD', b'TXXX\x00\x00\x00\x1c\x00\x00\x00Release type\x00Normal release'], 'track-count': [11], 'encoder': ['LAME 3.97 (-V2 --vbr-new)'], 'publisher': ['Smalltown America'], 'private-data': [b'\x02\x00\xfb1K\x00'], 'has-crc': [False], 'channel-mode': ['joint-stereo'], 'audio-codec': ['MPEG-1 Layer 3 (MP3)'], 'minimum-bitrate': [55737], 'maximum-bitrate': [319725], 'bitrate': [252000]}
MainThread DEBUG    2020-01-17 23:58:45,481 Got TAG bus message: tags={'title': ['Set Guitars To Kill'], 'artist': ['And So I Watch You From Afar'], 'album': ['Self Titled'], 'datetime': ['2009-04-13'], 'track-number': [1], 'genre': ['Instrumental Rock'], 'container-format': ['ID3 tag'], 'private-id3v2-frame': [b'TLAN\x00\x00\x00\x04\x00\x00\x00eng', b'TXXX\x00\x00\x00\x14\x00\x00\x00Rip date\x002009-04-14', b'TXXX\x00\x00\x00\n\x00\x00\x00Source\x00CD', b'TXXX\x00\x00\x00\x1c\x00\x00\x00Release type\x00Normal release'], 'track-count': [11], 'encoder': ['LAME 3.97 (-V2 --vbr-new)'], 'publisher': ['Smalltown America'], 'private-data': [b'\x02\x00\xfb1K\x00'], 'has-crc': [False], 'channel-mode': ['joint-stereo'], 'audio-codec': ['MPEG-1 Layer 3 (MP3)'], 'minimum-bitrate': [47775], 'maximum-bitrate': [319725], 'bitrate': [252000]}
MainThread DEBUG    2020-01-17 23:58:46,251 Got TAG bus message: tags={'title': ['Set Guitars To Kill'], 'artist': ['And So I Watch You From Afar'], 'album': ['Self Titled'], 'datetime': ['2009-04-13'], 'track-number': [1], 'genre': ['Instrumental Rock'], 'container-format': ['ID3 tag'], 'private-id3v2-frame': [b'TLAN\x00\x00\x00\x04\x00\x00\x00eng', b'TXXX\x00\x00\x00\x14\x00\x00\x00Rip date\x002009-04-14', b'TXXX\x00\x00\x00\n\x00\x00\x00Source\x00CD', b'TXXX\x00\x00\x00\x1c\x00\x00\x00Release type\x00Normal release'], 'track-count': [11], 'encoder': ['LAME 3.97 (-V2 --vbr-new)'], 'publisher': ['Smalltown America'], 'private-data': [b'\x02\x00\xfb1K\x00'], 'has-crc': [False], 'channel-mode': ['joint-stereo'], 'audio-codec': ['MPEG-1 Layer 3 (MP3)'], 'minimum-bitrate': [31850], 'maximum-bitrate': [319725], 'bitrate': [252000]}
MainThread DEBUG    2020-01-17 23:58:47,429 Got STREAM_START bus message
Dummy-20 DEBUG    2020-01-17 23:58:47,430 Got SEGMENT pad event: rate=1.0 format=time start=0 stop=18446744073709551615 position=0
MainThread DEBUG    2020-01-17 23:58:47,431 Audio event: stream_changed(uri='file:///home/nick/Music/And%20So%20I%20Watch%20You%20From%20Afar%20-%20Self%20Titled%20%282009%29/02-and_so_i_watch_you_from_afar-a_little_bit_of_solidarity_goes_a_long_way.mp3')
Dummy-20 DEBUG    2020-01-17 23:58:47,431 Audio event: position_changed(position=0)
MainThread DEBUG    2020-01-17 23:58:47,432 Sending stream_changed to AudioListener: {'uri': 'file:///home/nick/Music/And%20So%20I%20Watch%20You%20From%20Afar%20-%20Self%20Titled%20%282009%29/02-and_so_i_watch_you_from_afar-a_little_bit_of_solidarity_goes_a_long_way.mp3'}
Dummy-20 DEBUG    2020-01-17 23:58:47,432 Sending position_changed to AudioListener: {'position': 0}
MainThread DEBUG    2020-01-17 23:58:47,433 Audio event: tags_changed(tags=dict_keys(['title', 'artist', 'album', 'datetime', 'track-number', 'genre', 'container-format', 'private-id3v2-frame', 'track-count', 'encoder', 'publisher', 'private-data', 'has-crc', 'channel-mode', 'audio-codec', 'minimum-bitrate', 'maximum-bitrate', 'bitrate']))
Core-10 DEBUG    2020-01-17 23:58:47,434 Triggering track playback ended event
Core-10 DEBUG    2020-01-17 23:58:47,437 Sending track_playback_ended to CoreListener: {'tl_track': TlTrack(tlid=10, track=Track(album=Album(date='2009-04-13', name='Self Titled', num_tracks=11, uri='local:album:md5:5bdacb653bbd94bd6d1cbc68dc1854da'), artists=[Artist(name='And So I Watch You From Afar', uri='local:artist:md5:f69d2a608336108f1d645744c63d6dea')], date='2009-04-13', genre='Instrumental Rock', last_modified=1310599762000, length=329639, name='Set Guitars To Kill', track_no=1, uri='local:track:And%20So%20I%20Watch%20You%20From%20Afar%20-%20Self%20Titled%20%282009%29/01-and_so_i_watch_you_from_afar-set_guitars_to_kill.mp3')), 'time_position': 329639}
Core-10 DEBUG    2020-01-17 23:58:47,438 Changing state: playing -> playing
Core-10 DEBUG    2020-01-17 23:58:47,439 Triggering playback state change event
MainThread DEBUG    2020-01-17 23:58:47,435 Sending tags_changed to AudioListener: {'tags': dict_keys(['title', 'artist', 'album', 'datetime', 'track-number', 'genre', 'container-format', 'private-id3v2-frame', 'track-count', 'encoder', 'publisher', 'private-data', 'has-crc', 'channel-mode', 'audio-codec', 'minimum-bitrate', 'maximum-bitrate', 'bitrate'])}
Core-10 DEBUG    2020-01-17 23:58:47,440 Sending playback_state_changed to CoreListener: {'old_state': 'playing', 'new_state': 'playing'}
Core-10 DEBUG    2020-01-17 23:58:47,451 Triggering track playback started event
Core-10 DEBUG    2020-01-17 23:58:47,453 Sending track_playback_started to CoreListener: {'tl_track': TlTrack(tlid=11, track=Track(album=Album(date='2009-04-13', name='Self Titled', num_tracks=11, uri='local:album:md5:5bdacb653bbd94bd6d1cbc68dc1854da'), artists=[Artist(name='And So I Watch You From Afar', uri='local:artist:md5:f69d2a608336108f1d645744c63d6dea')], date='2009-04-13', genre='Instrumental Rock', last_modified=1310599762000, length=205871, name='A Little Bit Of Solidarity Goes A Long Way', track_no=2, uri='local:track:And%20So%20I%20Watch%20You%20From%20Afar%20-%20Self%20Titled%20%282009%29/02-and_so_i_watch_you_from_afar-a_little_bit_of_solidarity_goes_a_long_way.mp3'))}
MpdFrontend-13 DEBUG    2020-01-17 23:58:47,452 Sending player to MpdSession: {}
Core-10 DEBUG    2020-01-17 23:58:47,458 Sending stream_title_changed to CoreListener: {'title': 'Set Guitars To Kill'}

这是因为我们调用self.audio.get_current_tags().get()来获取 (2) 的新标签值,尚未更新并且仍然保留 (1) 的标签值。 因此,我们最终将 (2) 的current_track.name与 (1) 的title进行比较,发现它们不同,然后使用 (1) 错误地发出stream_title_changed事件。

这似乎是get_current_tagsget_current_track之间的竞争条件。 如果我在sleep(1)之前放了一个get_current_tags那么它就起作用了。 我还可以通过更改 Mopidy-MPD 以在track_playback_started上发出player空闲事件来解决该问题。 最重要的是,我们从不希望常规曲目的stream_title_changed事件(我在 #1751 中搞砸了)。

这里有一个竞争条件似乎是错误的,它应该是切换轨道时的一个同步动作 - 无论是否手动。 但我承认我对 mopidy 的工作原理知之甚少,所以也许有一些原因。

它比那更复杂,但是是的,如果我不清楚,这是一个错误。

我不是故意不礼貌的,那是一个深夜。 我想我只是将 sleep(1) 作为解决方案做出反应(没有双关语)。

不用担心。 我只提到了sleep因为它证明这是一个竞争条件。

编辑:这不完全是竞争条件。

@adamcik ,为什么我们关心在接收about-to-finishSTREAM_START之间获得的标签更新

迟到总比不到好,重新标记更新和所有这些事件它变得复杂,因为它都是异步的。 自从我详细研究这些东西以来已经有很长时间了。 但是这里有一个非常简化的管道图:

[SRC] --> [DECODER] --> [SINK]
  • about-to-finishSRC数据耗尽时触发
  • 此时标签更新可能仍在管道中的中间节点中流动
  • 当前曲目的音频在此阶段仍在流动
  • 对于像 Icecast 流媒体这样的情况,这些标签在它们上线时到达SINK (我认为这也是我们获取它们的地方)
  • STREAM_START - 老实说,我不记得我们是在达到SINK时还是在SRC发生此事件时才收到此事件-这可能是正确处理的关键。 查看https://gstreamer.freedesktop.org/documentation/gstreamer/gstmessage.html?gi-language=c#gst_message_new_stream_start似乎一旦所有接收器都看到它,管道/bin 可能会将其转发到消息总线。

因此,认为我们可能会遇到在about-to-finish和下一首曲目开始之间存在有意义标签的情况。 如果做到这一点很棘手,我们可以考虑忽略它们,但在代码中添加一个 TODO 并提交其他错误以进行后续处理,如果这比当前状态破坏得少?

此页面是否有帮助?
0 / 5 - 0 等级