def test_browse_items(backend, container, items): # FIXME: how to patch multiple object methods... with mock.patch.object(backend, 'client') as m: m.properties.return_value = Future.fromvalue(container) m.browse.return_value = Future.fromvalue(items) assert backend.library.browse(container['URI']) == [ Ref.track(name='Track #1', uri='dleyna://media/1'), Ref.track(name='Track #2', uri='dleyna://media/2') ]
def to_mopidy_track_ref(spotify_track): uri = str(spotify.Link.from_track(spotify_track, 0)) if not spotify_track.is_loaded(): return Ref.track(uri=uri, name='[loading] %s' % uri) name = spotify_track.name() if spotify_track.availability() != TRACK_AVAILABLE: name = '[unplayable] %s' % name return Ref.track(uri=uri, name=name)
def setUp(self): # noqa: N802 super(AddCommandsTest, self).setUp() self.tracks = [Track(uri='dummy:/a', name='a'), Track(uri='dummy:/foo/b', name='b')] self.refs = {'/a': Ref.track(uri='dummy:/a', name='a'), '/foo': Ref.directory(uri='dummy:/foo', name='foo'), '/foo/b': Ref.track(uri='dummy:/foo/b', name='b')} self.backend.library.dummy_library = self.tracks
def test_browse_dir_returns_subdirs_and_tracks(self): self.library1.browse.return_value.get.return_value = [ Ref.directory(uri='dummy1:directory:/foo/bar', name='Bar'), Ref.track(uri='dummy1:track:/foo/baz.mp3', name='Baz'), ] result = self.core.library.browse('dummy1:directory:/foo') self.assertEqual(result, [ Ref.directory(uri='dummy1:directory:/foo/bar', name='Bar'), Ref.track(uri='dummy1:track:/foo/baz.mp3', name='Baz'), ])
def test_add_with_library_should_recurse(self): tracks = [Track(uri='dummy:/a', name='a'), Track(uri='dummy:/foo/b', name='b')] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')], 'dummy:/foo': [Ref.track(uri='dummy:/foo/b', name='b')]} self.sendRequest('add "/dummy"') self.assertEqual(self.core.tracklist.tracks.get(), tracks) self.assertInResponse('OK')
def test_browse_items(backend, container, items): # FIXME: how to patch multiple object methods... with mock.patch.object(backend, 'client') as m: m.properties.return_value = Future.fromvalue(container) m.browse.side_effect = [ Future.fromvalue([items[0:2], True]), Future.fromvalue([items[2:3], True]), Future.fromvalue([[], False]) ] assert backend.library.browse(container['URI']) == [ Ref.track(name='Track #1', uri='dleyna://media/1'), Ref.track(name='Track #2', uri='dleyna://media/2'), Ref.track(name='Track #3', uri='dleyna://media/3'), ]
def test_listall_with_uri(self): tracks = [Track(uri="dummy:/a", name="a"), Track(uri="dummy:/foo/b", name="b")] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { "dummy:/": [Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo")], "dummy:/foo": [Ref.track(uri="dummy:/foo/b", name="b")], } self.sendRequest('listall "/dummy/foo"') self.assertNotInResponse("file: dummy:/a") self.assertInResponse("directory: /dummy/foo") self.assertInResponse("file: dummy:/foo/b") self.assertInResponse("OK")
def test_listall_with_uri(self): tracks = [Track(uri='dummy:/a', name='a'), Track(uri='dummy:/foo/b', name='b')] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')], 'dummy:/foo': [Ref.track(uri='dummy:/foo/b', name='b')]} self.sendRequest('listall "/dummy/foo"') self.assertNotInResponse('file: dummy:/a') self.assertInResponse('directory: /dummy/foo') self.assertInResponse('file: dummy:/foo/b') self.assertInResponse('OK')
def test_browse_dir_returns_subdirs_and_tracks(self): self.library1.browse().get.return_value = [ Ref.directory(uri="dummy1:directory:/foo/bar", name="Bar"), Ref.track(uri="dummy1:track:/foo/baz.mp3", name="Baz"), ] self.library1.browse.reset_mock() result = self.core.library.browse("dummy1:directory:/foo") self.assertEqual( result, [ Ref.directory(uri="dummy1:directory:/foo/bar", name="Bar"), Ref.track(uri="dummy1:track:/foo/baz.mp3", name="Baz"), ], )
def station_to_ref(station, show_country=True): name = station.get('name').strip() # TODO: fallback to streams URI? if show_country: # TODO: make this a setting so users can set '$name [$country]' etc? name = '%s [%s]' % (name, station.get('country', '??')) uri = unparse_uri('station', station['id']) return Ref.track(uri=uri, name=name)
def __init__(self, tracks, *args, **kwargs): logger.debug("initializing SpotifyWebLibraryProvider cache") self.albums2tracks = {} self.artists2albums = {} self.sortedAlbums = [] self.sortedArtists = [] self.tracks = [] self.trackDict = {} for t in tracks: logger.debug("Adding track %s", t.name) self.tracks.append(Ref.track(name=t.name, uri=t.uri)) self.trackDict[t.uri] = t if hasattr(t, 'album'): self.add_album_and_artists(t) logger.debug('Sorting albums and artists') cmp_dir_names = lambda x, y: cmp(x.name, y.name) self.sortedAlbums.sort(cmp_dir_names) self.sortedArtists.sort(cmp_dir_names) logger.debug('Sorting albums by track number') for key in self.albums2tracks: logger.debug('Sorting album %s', key) album = self.albums2tracks[key] cmp_tracknos = lambda x, y: \ cmp(self.trackDict[x.uri].track_no, self.trackDict[y.uri].track_no) album.sort(cmp_tracknos)
def get_items(self, uri): if self._playlists is None: self.refresh() playlist = self._playlists.get(uri) if playlist is None: return None return [Ref.track(uri=t.uri, name=t.name) for t in playlist.tracks]
def test_lsinfo_for_dir_includes_tracks(self): self.backend.library.dummy_library = [Track(uri="dummy:/a", name="a")] self.backend.library.dummy_browse_result = {"dummy:/": [Ref.track(uri="dummy:/a", name="a")]} self.sendRequest('lsinfo "/dummy"') self.assertInResponse("file: dummy:/a") self.assertInResponse("Title: a") self.assertInResponse("OK")
def test_lsinfo_for_dir_with_and_without_leading_slash_is_the_same(self): self.backend.library.dummy_browse_result = { "dummy:/": [Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo")] } response1 = self.sendRequest('lsinfo "dummy"') response2 = self.sendRequest('lsinfo "/dummy"') self.assertEqual(response1, response2)
def test_lsinfo_for_root_includes_dirs_for_each_lib_with_content(self): self.backend.library.dummy_browse_result = { "dummy:/": [Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo")] } self.sendRequest('lsinfo "/"') self.assertInResponse("directory: dummy") self.assertInResponse("OK")
def test_lsinfo_for_dir_does_not_include_self(self): self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.directory(uri='dummy:/foo', name='foo')], 'dummy:/foo': [Ref.track(uri='dummy:/a', name='a')]} self.sendRequest('lsinfo "/dummy"') self.assertNotInResponse('directory: dummy') self.assertInResponse('OK')
def test_lsinfo_for_dir_with_and_without_trailing_slash_is_the_same(self): self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')]} response1 = self.sendRequest('lsinfo "dummy"') response2 = self.sendRequest('lsinfo "dummy/"') self.assertEqual(response1, response2)
def test_lsinfo_for_root_includes_dirs_for_each_lib_with_content(self): self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')]} self.sendRequest('lsinfo "/"') self.assertInResponse('directory: dummy') self.assertInResponse('OK')
def test_add_root_should_not_add_anything_and_ok(self): self.backend.library.dummy_library = [Track(uri='dummy:/a', name='a')] self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a')]} self.sendRequest('add "/"') self.assertEqual(len(self.core.tracklist.tracks.get()), 0) self.assertInResponse('OK')
def test_get_items_when_playlist_exists(session_mock, sp_playlist_mock, provider): session_mock.get_playlist.return_value = sp_playlist_mock result = provider.get_items("spotify:user:alice:playlist:foo") assert len(result) == 1 assert result[0] == Ref.track(uri="spotify:track:abc", name="ABC 123")
def test_load_items(): assert loads('') == [] assert loads('test.mp3', basedir=b'/playlists') == [ Ref.track(uri='file:///playlists/test.mp3', name='test') ] assert loads('../test.mp3', basedir=b'/playlists') == [ Ref.track(uri='file:///test.mp3', name='test') ] assert loads('/test.mp3') == [ Ref.track(uri='file:///test.mp3', name='test') ] assert loads('file:///test.mp3') == [ Ref.track(uri='file:///test.mp3') ] assert loads('http://example.com/stream') == [ Ref.track(uri='http://example.com/stream') ] assert loads('#EXTM3U\n#EXTINF:42,Test\nfile:///test.mp3\n') == [ Ref.track(uri='file:///test.mp3', name='Test') ] assert loads('#EXTM3U\n#EXTINF:-1,Test\nhttp://example.com/stream\n') == [ Ref.track(uri='http://example.com/stream', name='Test') ]
def test_add_with_library_should_recurse(self): tracks = [ Track(uri='dummy:/a', name='a'), Track(uri='dummy:/foo/b', name='b') ] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { 'dummy:/': [ Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo') ], 'dummy:/foo': [Ref.track(uri='dummy:/foo/b', name='b')] } self.send_request('add "/dummy"') self.assertEqual(self.core.tracklist.tracks.get(), tracks) self.assertInResponse('OK')
def test_get_items_selects_the_matching_backend(self): ref = Ref.track() self.sp2.get_items.return_value.get.return_value = [ref] result = self.core.playlists.get_items('dummy2:pl:a') self.assertEqual([ref], result) self.assertFalse(self.sp1.get_items.called) self.sp2.get_items.assert_called_once_with('dummy2:pl:a')
def test_lsinfo_for_dir_does_not_include_self(self): self.backend.library.dummy_browse_result = { "dummy:/": [Ref.directory(uri="dummy:/foo", name="foo")], "dummy:/foo": [Ref.track(uri="dummy:/a", name="a")], } self.sendRequest('lsinfo "/dummy"') self.assertNotInResponse("directory: dummy") self.assertInResponse("OK")
def test_lsinfo_for_root_returns_browse_result_before_playlists(self): last_modified = 1390942873222 self.backend.library.dummy_browse_result = { "dummy:/": [Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo")] } self.backend.playlists.playlists = [Playlist(name="a", uri="dummy:/a", last_modified=last_modified)] response = self.sendRequest('lsinfo "/"') self.assertLess(response.index("directory: dummy"), response.index("playlist: a"))
def test_lsinfo_for_dir_does_not_include_self(self): self.backend.library.dummy_browse_result = { "dummy:/": [Ref.directory(uri="dummy:/foo", name="foo")], "dummy:/foo": [Ref.track(uri="dummy:/a", name="a")], } self.send_request('lsinfo "/dummy"') self.assertNotInResponse("directory: dummy") self.assertInResponse("OK")
def test_lsinfo_for_dir_does_not_include_self(self): self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.directory(uri='dummy:/foo', name='foo')], 'dummy:/foo': [Ref.track(uri='dummy:/a', name='a')] } self.send_request('lsinfo "/dummy"') self.assertNotInResponse('directory: dummy') self.assertInResponse('OK')
def test_get_items_when_playlist_exists(session_mock, sp_playlist_mock, provider): session_mock.get_playlist.return_value = sp_playlist_mock result = provider.get_items('spotify:user:alice:playlist:foo') assert len(result) == 1 assert result[0] == Ref.track(uri='spotify:track:abc', name='ABC 123')
def test_get_items_selects_the_matching_backend(self): ref = Ref.track() self.sp2.get_items.return_value.get.return_value = [ref] result = self.core.playlists.get_items("dummy2:pl:a") assert [ref] == result assert not self.sp1.get_items.called self.sp2.get_items.assert_called_once_with("dummy2:pl:a")
def repl(p): if p.type == Ref.TRACK and p.uri.startswith(podcast_scheme): if self.current_level() is not None: cname = self.current_level().name path=self.subscriptions.path_on_disk(cname,p.name) if path is not None: return Ref.track(name=p.name,uri=path) return p
def test_add_root_should_not_add_anything_and_ok(self): self.backend.library.dummy_library = [Track(uri='dummy:/a', name='a')] self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a')] } self.send_request('add "/"') self.assertEqual(len(self.core.tracklist.tracks.get()), 0) self.assertInResponse('OK')
def test_audio_broadcast_ref(): assert translator.ref( { "DisplayName": "Foo", "URI": BASEURI + "/foo", "Type": "audio", "TypeEx": AUDIO_BROADCAST_TYPE, } ) == Ref.track(uri=BASEURI + "/foo", name="Foo")
def test_lsinfo_for_root_returns_browse_result_before_playlists(self): self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')]} self.backend.playlists.set_dummy_playlists([ Playlist(name='a', uri='dummy:/a')]) response = self.send_request('lsinfo "/"') self.assertLess(response.index('directory: dummy'), response.index('playlist: a'))
def get_items(self, uri): ''' Query local playlist cache for a given playlist, returns tracks ''' playlist = self._playlists.get(uri) if not playlist: logger.info('Jellyfin: No playlists found') return None return [Ref.track(uri=i.uri, name=i.name) for i in playlist.tracks]
def station_to_ref(station): logger.debug('RadioBrowser: Start translator.station_to_ref') stationUuid = station.get('stationuuid', '??') uri = unparse_uri('station', stationUuid) name = station.get('name', station.get('url', '??')) # TODO: Should the name include 'now playing' for all stations? # if get_id_type(id) == RADIOBROWSER_ID_TOPIC: # name = name + ' [%s]' % station.get('subtext', '??') return Ref.track(uri=uri, name=name)
def test_lsinfo_for_dir_with_and_without_trailing_slash_is_the_same( self, last_modified_mock): last_modified_mock.return_value = '2015-08-05T22:51:06Z' self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')]} response1 = self.send_request('lsinfo "dummy"') response2 = self.send_request('lsinfo "dummy/"') self.assertEqual(response1, response2)
def reciter_suras(self, reciter_id): results = [] reciter_id = int(reciter_id) reciter = self.reciters[reciter_id] for sura_no in reciter['suras']: results.append( Ref.track(uri='mp3quran:reciter:%d:%d' % (reciter_id, sura_no), name=self.suras_name[sura_no])) logger.info(results) return results
def station_to_ref(station): if station['type'] != 'audio': logger.debug('Expecting station but got %s' % station['type']) guide_id = station.get('guide_id', '??') uri = unparse_uri('station', guide_id) name = station.get('text', station['URL']) # TODO: Should the name include 'now playing' for all stations? if get_id_type(guide_id) == TUNEIN_ID_TOPIC: name = name + ' [%s]' % station.get('subtext', '??') return Ref.track(uri=uri, name=name)
def test_listall_without_uri(self): tracks = [Track(uri='dummy:/a', name='a'), Track(uri='dummy:/foo/b', name='b')] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo'), Ref.album(uri='dummy:/album', name='album'), Ref.playlist(uri='dummy:/pl', name='pl')], 'dummy:/foo': [Ref.track(uri='dummy:/foo/b', name='b')]} self.sendRequest('listall') self.assertInResponse('file: dummy:/a') self.assertInResponse('directory: /dummy/foo') self.assertInResponse('directory: /dummy/album') self.assertInResponse('directory: /dummy/pl') self.assertInResponse('file: dummy:/foo/b') self.assertInResponse('OK')
def test_lsinfo_for_root_includes_dirs_for_each_lib_with_content(self): self.backend.library.dummy_browse_result = { "dummy:/": [ Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo"), ] } self.send_request('lsinfo "/"') self.assertInResponse("directory: dummy") self.assertInResponse("OK")
def test_listallinfo_for_dir_with_and_without_trailing_slash_is_same(self): self.backend.library.dummy_browse_result = { "dummy:/": [ Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo"), ] } response1 = self.send_request('listallinfo "dummy"') response2 = self.send_request('listallinfo "dummy/"') assert response1 == response2
def test_listall_with_uri(self): tracks = [ Track(uri="dummy:/a", name="a"), Track(uri="dummy:/foo/b", name="b"), ] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { "dummy:/": [ Ref.track(uri="dummy:/a", name="a"), Ref.directory(uri="dummy:/foo", name="foo"), ], "dummy:/foo": [Ref.track(uri="dummy:/foo/b", name="b")], } self.send_request('listall "/dummy/foo"') self.assertNotInResponse("file: dummy:/a") self.assertInResponse("directory: dummy/foo") self.assertInResponse("file: dummy:/foo/b") self.assertInResponse("OK")
def test_browse_dummy2_selects_dummy2_backend(self): self.library2.browse.return_value.get.return_value = [ Ref.directory(uri='dummy2:directory:/bar/baz', name='quux'), Ref.track(uri='dummy2:track:/bar/foo.mp3', name='Baz'), ] self.core.library.browse('dummy2:directory:/bar') self.assertEqual(self.library1.browse.call_count, 0) self.assertEqual(self.library2.browse.call_count, 1) self.library2.browse.assert_called_with('dummy2:directory:/bar')
def test_lsinfo_for_root_includes_dirs_for_each_lib_with_content(self): self.backend.library.dummy_browse_result = { 'dummy:/': [ Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo') ] } self.send_request('lsinfo "/"') self.assertInResponse('directory: dummy') self.assertInResponse('OK')
def test_listallinfo_for_dir_with_and_without_trailing_slash_is_same(self): self.backend.library.dummy_browse_result = { 'dummy:/': [ Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo') ] } response1 = self.send_request('listallinfo "dummy"') response2 = self.send_request('listallinfo "dummy/"') self.assertEqual(response1, response2)
def test_listall_with_uri(self): tracks = [ Track(uri='dummy:/a', name='a'), Track(uri='dummy:/foo/b', name='b') ] self.backend.library.dummy_library = tracks self.backend.library.dummy_browse_result = { 'dummy:/': [ Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo') ], 'dummy:/foo': [Ref.track(uri='dummy:/foo/b', name='b')] } self.send_request('listall "/dummy/foo"') self.assertNotInResponse('file: dummy:/a') self.assertInResponse('directory: /dummy/foo') self.assertInResponse('file: dummy:/foo/b') self.assertInResponse('OK')
def test_browse_dummy2_selects_dummy2_backend(self): self.library2.browse.return_value.get.return_value = [ Ref.directory(uri="dummy2:directory:/bar/baz", name="quux"), Ref.track(uri="dummy2:track:/bar/foo.mp3", name="Baz"), ] self.core.library.browse("dummy2:directory:/bar") assert self.library1.browse.call_count == 0 assert self.library2.browse.call_count == 1 self.library2.browse.assert_called_with("dummy2:directory:/bar")
def test_lsinfo_for_dir_includes_tracks(self): self.backend.library.dummy_library = [ Track(uri='dummy:/a', name='a'), ] self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a')]} self.sendRequest('lsinfo "/dummy"') self.assertInResponse('file: dummy:/a') self.assertInResponse('Title: a') self.assertInResponse('OK')
def test_lsinfo_for_root_returns_browse_result_before_playlists(self): last_modified = 1390942873222 self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.track(uri='dummy:/a', name='a'), Ref.directory(uri='dummy:/foo', name='foo')]} self.backend.playlists.playlists = [ Playlist(name='a', uri='dummy:/a', last_modified=last_modified)] response = self.sendRequest('lsinfo "/"') self.assertLess(response.index('directory: dummy'), response.index('playlist: a'))
def test_lsinfo_for_dir_does_not_recurse(self): self.backend.library.dummy_library = [ Track(uri='dummy:/a', name='a'), ] self.backend.library.dummy_browse_result = { 'dummy:/': [Ref.directory(uri='dummy:/foo', name='foo')], 'dummy:/foo': [Ref.track(uri='dummy:/a', name='a')]} self.sendRequest('lsinfo "/dummy"') self.assertNotInResponse('file: dummy:/a') self.assertInResponse('OK')
def trackToRef(track): """Convert a mopidy track to a mopidy ref.""" name = track.name if (len(track.artists)) > 0: name += ' - ' for artist in track.artists: if len(name) > 0: name += ', ' name += artist.name return Ref.track(uri=track.uri, name=name)
def _track_to_ref(self, track, uri=None): if not uri: uri = track.uri name = '' for artist in track.artists: if len(name) > 0: name += ', ' name += artist.name if (len(name)) > 0: name += ' - ' name += track.name return Ref.track(uri=uri, name=name)