diff --git a/docs/changelog.rst b/docs/changelog.rst index e8953ce8..77ac5320 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -24,7 +24,8 @@ Core API - Add ``tlid`` alternatives to methods that take ``tl_track`` and also add ``get_{eot,next,previous}_tlid`` methods as light weight alternatives to the - ``tl_track`` versions of the calls. (Fixes: :issue:`1131` PR: :issue:`1136`) + ``tl_track`` versions of the calls. (Fixes: :issue:`1131` PR: :issue:`1136`, + :issue:`1140`) Models ------ diff --git a/mopidy/core/playback.py b/mopidy/core/playback.py index 135e1828..99deee05 100644 --- a/mopidy/core/playback.py +++ b/mopidy/core/playback.py @@ -265,18 +265,32 @@ class PlaybackController(object): self.set_state(PlaybackState.PAUSED) self._trigger_track_playback_paused() - def play(self, tl_track=None): + def play(self, tl_track=None, tlid=None): """ Play the given track, or if the given track is :class:`None`, play the currently active track. :param tl_track: track to play :type tl_track: :class:`mopidy.models.TlTrack` or :class:`None` + :param tlid: TLID of the track to play + :type tlid: :class:`int` or :class:`None` """ tl_track is None or validation.check_instance(tl_track, models.TlTrack) - self._play(tl_track, on_error_step=1) + tlid is None or validation.check_integer(tlid, min=0) + # TODO: check one of or none for args + if tl_track: + deprecation.warn('core.playback.play:tl_track_kwarg', pending=True) + + self._play(tl_track=tl_track, tlid=tlid, on_error_step=1) + + def _play(self, tl_track=None, tlid=None, on_error_step=1): + if tl_track is None and tlid is not None: + for tl_track in self.core.tracklist.get_tl_tracks(): + if tl_track.tlid == tlid: + break + else: + tl_track = None - def _play(self, tl_track=None, on_error_step=1): if tl_track is None: if self.get_state() == PlaybackState.PAUSED: return self.resume() diff --git a/mopidy/utils/deprecation.py b/mopidy/utils/deprecation.py index a650d79e..7b1b915e 100644 --- a/mopidy/utils/deprecation.py +++ b/mopidy/utils/deprecation.py @@ -30,6 +30,9 @@ _MESSAGES = { 'core.playback.set_mute': 'playback.set_mute() is deprecated', 'core.playback.get_volume': 'playback.get_volume() is deprecated', 'core.playback.set_volume': 'playback.set_volume() is deprecated', + 'core.playback.play:tl_track_kwargs': + 'playback.play() with "tl_track" argument is pending deprecation use ' + '"tlid" instead', # Deprecated features in core playlists: 'core.playlists.filter': 'playlists.filter() is deprecated', diff --git a/tests/core/test_playback.py b/tests/core/test_playback.py index a113e034..1837ac80 100644 --- a/tests/core/test_playback.py +++ b/tests/core/test_playback.py @@ -8,6 +8,7 @@ import pykka from mopidy import backend, core from mopidy.models import Track +from mopidy.utils import deprecation from tests import dummy_audio as audio @@ -698,3 +699,22 @@ class CorePlaybackWithOldBackendTest(unittest.TestCase): c = core.Core(mixer=None, backends=[b]) c.tracklist.add(uris=['dummy1:a']) c.playback.play() # No TypeError == test passed. + + +class TestPlay(unittest.TestCase): + + def setUp(self): # noqa: N802 + self.backend = mock.Mock() + self.backend.uri_schemes.get.return_value = ['dummy'] + self.core = core.Core(backends=[self.backend]) + + self.tracks = [Track(uri='dummy:a', length=1234), + Track(uri='dummy:b', length=1234)] + + with deprecation.ignore('core.tracklist.add:tracks_arg'): + self.tl_tracks = self.core.tracklist.add(tracks=self.tracks) + + def test_play_tlid(self): + self.core.playback.play(tlid=self.tl_tracks[1].tlid) + self.backend.playback.change_track.assert_called_once_with( + self.tl_tracks[1].track)