Merge branch 'release/v0.19.x' into develop

Conflicts:
	mopidy/core/playback.py
This commit is contained in:
Stein Magnus Jodal 2014-12-24 00:24:19 +01:00
commit dbbb86e6c0
5 changed files with 67 additions and 8 deletions

View File

@ -97,6 +97,10 @@ Bug fix release.
:attr:`mopidy.models.Track.track_no`, and :attr:`mopidy.models.Track.track_no`, and
:attr:`mopidy.models.Track.last_modified` from ``0`` to :class:`None`. :attr:`mopidy.models.Track.last_modified` from ``0`` to :class:`None`.
- Core: When skipping to the next track in consume mode, remove the skipped
track from the tracklist. This is consistent with the original MPD server's
behavior. (Fixes: :issue:`902`)
- Local: Fix scanning of modified files. (PR: :issue:`904`) - Local: Fix scanning of modified files. (PR: :issue:`904`)
- MPD: Re-enable browsing of empty directories. (PR: :issue:`906`) - MPD: Re-enable browsing of empty directories. (PR: :issue:`906`)

View File

@ -185,16 +185,20 @@ class PlaybackController(object):
The current playback state will be kept. If it was playing, playing The current playback state will be kept. If it was playing, playing
will continue. If it was paused, it will still be paused, etc. will continue. If it was paused, it will still be paused, etc.
""" """
tl_track = self.core.tracklist.next_track(self.current_tl_track) original_tl_track = self.current_tl_track
if tl_track: next_tl_track = self.core.tracklist.next_track(original_tl_track)
if next_tl_track:
# TODO: switch to: # TODO: switch to:
# backend.play(track) # backend.play(track)
# wait for state change? # wait for state change?
self.change_track(tl_track) self.change_track(next_tl_track)
else: else:
self.stop() self.stop()
self.current_tl_track = None self.current_tl_track = None
self.core.tracklist.mark_played(original_tl_track)
def pause(self): def pause(self):
"""Pause playback.""" """Pause playback."""
backend = self._get_backend() backend = self._get_backend()

View File

@ -449,10 +449,10 @@ class TracklistController(object):
def mark_played(self, tl_track): def mark_played(self, tl_track):
"""Private method used by :class:`mopidy.core.PlaybackController`.""" """Private method used by :class:`mopidy.core.PlaybackController`."""
if not self.consume: if self.consume and tl_track is not None:
return False self.remove(tlid=[tl_track.tlid])
self.remove(tlid=[tl_track.tlid]) return True
return True return False
def _trigger_tracklist_changed(self): def _trigger_tracklist_changed(self):
if self.random: if self.random:

View File

@ -239,6 +239,23 @@ class CorePlaybackTest(unittest.TestCase):
# TODO Test next() more # TODO Test next() more
def test_next_keeps_finished_track_in_tracklist(self):
tl_track = self.tl_tracks[0]
self.core.playback.play(tl_track)
self.core.playback.next()
self.assertIn(tl_track, self.core.tracklist.tl_tracks)
def test_next_in_consume_mode_removes_finished_track(self):
tl_track = self.tl_tracks[0]
self.core.playback.play(tl_track)
self.core.tracklist.consume = True
self.core.playback.next()
self.assertNotIn(tl_track, self.core.tracklist.tl_tracks)
@mock.patch( @mock.patch(
'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener) 'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener)
def test_next_emits_events(self, listener_mock): def test_next_emits_events(self, listener_mock):
@ -265,6 +282,23 @@ class CorePlaybackTest(unittest.TestCase):
# TODO Test previous() more # TODO Test previous() more
def test_previous_keeps_finished_track_in_tracklist(self):
tl_track = self.tl_tracks[1]
self.core.playback.play(tl_track)
self.core.playback.previous()
self.assertIn(tl_track, self.core.tracklist.tl_tracks)
def test_previous_keeps_finished_track_even_in_consume_mode(self):
tl_track = self.tl_tracks[1]
self.core.playback.play(tl_track)
self.core.tracklist.consume = True
self.core.playback.previous()
self.assertIn(tl_track, self.core.tracklist.tl_tracks)
@mock.patch( @mock.patch(
'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener) 'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener)
def test_previous_emits_events(self, listener_mock): def test_previous_emits_events(self, listener_mock):
@ -291,6 +325,23 @@ class CorePlaybackTest(unittest.TestCase):
# TODO Test on_end_of_track() more # TODO Test on_end_of_track() more
def test_on_end_of_track_keeps_finished_track_in_tracklist(self):
tl_track = self.tl_tracks[0]
self.core.playback.play(tl_track)
self.core.playback.on_end_of_track()
self.assertIn(tl_track, self.core.tracklist.tl_tracks)
def test_on_end_of_track_in_consume_mode_removes_finished_track(self):
tl_track = self.tl_tracks[0]
self.core.playback.play(tl_track)
self.core.tracklist.consume = True
self.core.playback.on_end_of_track()
self.assertNotIn(tl_track, self.core.tracklist.tl_tracks)
@mock.patch( @mock.patch(
'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener) 'mopidy.core.playback.listener.CoreListener', spec=core.CoreListener)
def test_on_end_of_track_emits_events(self, listener_mock): def test_on_end_of_track_emits_events(self, listener_mock):

View File

@ -347,7 +347,7 @@ class LocalPlaybackProviderTest(unittest.TestCase):
self.tracklist.consume = True self.tracklist.consume = True
self.playback.play() self.playback.play()
self.playback.next() self.playback.next()
self.assertIn(self.tracks[0], self.tracklist.tracks) self.assertNotIn(self.tracks[0], self.tracklist.tracks)
@populate_tracklist @populate_tracklist
def test_next_with_single_and_repeat(self): def test_next_with_single_and_repeat(self):