diff --git a/mopidy/core/tracklist.py b/mopidy/core/tracklist.py index e0497a9a..de875081 100644 --- a/mopidy/core/tracklist.py +++ b/mopidy/core/tracklist.py @@ -200,19 +200,32 @@ class TracklistController(object): # Methods - def index(self, tl_track): + def index(self, tl_track=None, tlid=None): """ The position of the given track in the tracklist. :param tl_track: the track to find the index of :type tl_track: :class:`mopidy.models.TlTrack` or :class:`None` + :param tlid: of the track to find the index of + :type tlid: TLID number or :class:`None` :rtype: :class:`int` or :class:`None` + + .. versionchanged:: 1.1 + Added the *tlid* parameter """ tl_track is None or validation.check_instance(tl_track, TlTrack) - try: - return self._tl_tracks.index(tl_track) - except ValueError: - return None + tlid is None or validation.check_integer(tlid, min=0) + + if tl_track is not None: + try: + return self._tl_tracks.index(tl_track) + except ValueError: + pass + elif tlid is not None: + for i, tl_track in enumerate(self._tl_tracks): + if tl_track.tlid == tlid: + return i + return None def eot_track(self, tl_track): """ diff --git a/tests/core/test_tracklist.py b/tests/core/test_tracklist.py index 1ff089cb..d9f918a8 100644 --- a/tests/core/test_tracklist.py +++ b/tests/core/test_tracklist.py @@ -5,7 +5,7 @@ import unittest import mock from mopidy import backend, core -from mopidy.models import Track +from mopidy.models import TlTrack, Track from mopidy.utils import deprecation @@ -102,3 +102,55 @@ class TracklistTest(unittest.TestCase): self.core.tracklist.filter({'uri': 'a'}) # TODO Extract tracklist tests from the local backend tests + + +class TracklistIndexTest(unittest.TestCase): + + def setUp(self): # noqa: N802 + self.tracks = [ + Track(uri='dummy1:a', name='foo'), + Track(uri='dummy1:b', name='foo'), + Track(uri='dummy1:c', name='bar'), + ] + + def lookup(uris): + return {u: [t for t in self.tracks if t.uri == u] for u in uris} + + self.core = core.Core(mixer=None, backends=[]) + self.core.library.lookup = mock.Mock() + self.core.library.lookup.side_effect = lookup + + self.tl_tracks = self.core.tracklist.add(uris=[ + t.uri for t in self.tracks]) + + def test_index_returns_index_of_track(self): + self.assertEqual(0, self.core.tracklist.index(self.tl_tracks[0])) + self.assertEqual(1, self.core.tracklist.index(self.tl_tracks[1])) + self.assertEqual(2, self.core.tracklist.index(self.tl_tracks[2])) + + def test_index_returns_none_if_item_not_found(self): + tl_track = TlTrack(0, Track()) + self.assertEqual(self.core.tracklist.index(tl_track), None) + + def test_index_returns_none_if_called_with_none(self): + self.assertEqual(self.core.tracklist.index(None), None) + + def test_index_errors_out_for_invalid_tltrack(self): + with self.assertRaises(ValueError): + self.core.tracklist.index('abc') + + def test_index_return_index_when_called_with_tlids(self): + tl_tracks = self.tl_tracks + self.assertEqual(0, self.core.tracklist.index(tlid=tl_tracks[0].tlid)) + self.assertEqual(1, self.core.tracklist.index(tlid=tl_tracks[1].tlid)) + self.assertEqual(2, self.core.tracklist.index(tlid=tl_tracks[2].tlid)) + + def test_index_returns_none_if_tlid_not_found(self): + self.assertEqual(self.core.tracklist.index(tlid=123), None) + + def test_index_returns_none_if_called_with_tlid_none(self): + self.assertEqual(self.core.tracklist.index(tlid=None), None) + + def test_index_errors_out_for_invalid_tlid(self): + with self.assertRaises(ValueError): + self.core.tracklist.index(tlid=-1) diff --git a/tests/local/test_tracklist.py b/tests/local/test_tracklist.py index f405f218..a0add637 100644 --- a/tests/local/test_tracklist.py +++ b/tests/local/test_tracklist.py @@ -8,7 +8,7 @@ import pykka from mopidy import core from mopidy.core import PlaybackState from mopidy.local import actor -from mopidy.models import Playlist, TlTrack, Track +from mopidy.models import Playlist, Track from mopidy.utils import deprecation from tests import dummy_audio, path_to_data_dir @@ -176,16 +176,6 @@ class LocalTracklistProviderTest(unittest.TestCase): tl_tracks = self.controller.add(self.controller.tracks[1:2]) self.assertEqual(tl_tracks[0].track, self.controller.tracks[1]) - def test_index_returns_index_of_track(self): - tl_tracks = self.controller.add(self.tracks) - self.assertEqual(0, self.controller.index(tl_tracks[0])) - self.assertEqual(1, self.controller.index(tl_tracks[1])) - self.assertEqual(2, self.controller.index(tl_tracks[2])) - - def test_index_returns_none_if_item_not_found(self): - tl_track = TlTrack(0, Track()) - self.assertEqual(self.controller.index(tl_track), None) - @populate_tracklist def test_move_single(self): self.controller.move(0, 0, 2)