diff -Nru mopidy-dleyna-1.2.0/CHANGES.rst mopidy-dleyna-1.2.1/CHANGES.rst --- mopidy-dleyna-1.2.0/CHANGES.rst 2016-09-23 16:17:17.000000000 +0000 +++ mopidy-dleyna-1.2.1/CHANGES.rst 2017-10-24 20:55:29.000000000 +0000 @@ -1,10 +1,19 @@ +v1.2.1 (2017-10-24) +------------------- + +- Add support for ``audioBook``, ``audioBroadcast`` and + ``playlistContainer`` classes. + +- Improve handling of browse and search limits. + + v1.2.0 (2016-09-23) ------------------- - Add ``dbus_start_session`` configuration value for specifying the command to start a session bus. The default is to invoke - ``dbus-daemon`` daemon directly, so ``dbus-launch`` is no longer - needed (but is still supported for now). + ``dbus-daemon`` directly, so ``dbus-launch`` is no longer needed + (but is still supported for now). - Check for ``$XDG_RUNTIME_DIR/bus`` before starting a session bus. @@ -143,7 +152,7 @@ - Add browse/search filters. -- Peristent URI handling. +- Persistent URI handling. v0.3.1 (2015-04-11) diff -Nru mopidy-dleyna-1.2.0/debian/changelog mopidy-dleyna-1.2.1/debian/changelog --- mopidy-dleyna-1.2.0/debian/changelog 2016-09-23 20:38:52.000000000 +0000 +++ mopidy-dleyna-1.2.1/debian/changelog 2018-04-14 23:27:19.000000000 +0000 @@ -1,3 +1,15 @@ +mopidy-dleyna (1.2.1-1) unstable; urgency=medium + + * New upstream release + * debian/control + - Bump Standards-Version to 4.1.4, no changes required + - Set Vcs-* to salsa.debian.org + - Require debhelper 10 + * debian/copyright + - Update copyright years + + -- Stein Magnus Jodal Sun, 15 Apr 2018 01:27:19 +0200 + mopidy-dleyna (1.2.0-1) unstable; urgency=medium * New upstream release. (Closes: #836117) diff -Nru mopidy-dleyna-1.2.0/debian/compat mopidy-dleyna-1.2.1/debian/compat --- mopidy-dleyna-1.2.0/debian/compat 2016-09-23 20:21:11.000000000 +0000 +++ mopidy-dleyna-1.2.1/debian/compat 2018-04-14 23:27:19.000000000 +0000 @@ -1 +1 @@ -9 +10 diff -Nru mopidy-dleyna-1.2.0/debian/control mopidy-dleyna-1.2.1/debian/control --- mopidy-dleyna-1.2.0/debian/control 2016-09-23 20:24:32.000000000 +0000 +++ mopidy-dleyna-1.2.1/debian/control 2018-04-14 23:27:19.000000000 +0000 @@ -2,7 +2,7 @@ Section: sound Priority: optional Maintainer: Stein Magnus Jodal -Build-Depends: debhelper (>= 9), +Build-Depends: debhelper (>= 10), dh-python, mopidy (>= 1.0.8-2), python-all (>= 2.7), @@ -11,10 +11,10 @@ python-pytest, python-setuptools, python-uritools, -Standards-Version: 3.9.8 +Standards-Version: 4.1.4 Homepage: https://github.com/tkem/mopidy-dleyna -Vcs-Git: git://anonscm.debian.org/pkg-mopidy/mopidy-dleyna.git -Vcs-Browser: https://anonscm.debian.org/cgit/pkg-mopidy/mopidy-dleyna.git +Vcs-Git: https://salsa.debian.org/mopidy-team/mopidy-dleyna.git +Vcs-Browser: https://salsa.debian.org/mopidy-team/mopidy-dleyna X-Python-Version: >= 2.7 Package: mopidy-dleyna diff -Nru mopidy-dleyna-1.2.0/debian/copyright mopidy-dleyna-1.2.1/debian/copyright --- mopidy-dleyna-1.2.0/debian/copyright 2016-09-23 20:21:11.000000000 +0000 +++ mopidy-dleyna-1.2.1/debian/copyright 2018-04-14 23:27:19.000000000 +0000 @@ -4,11 +4,11 @@ Source: https://github.com/tkem/mopidy-dleyna Files: * -Copyright: 2015-2016 Thomas Kemmer +Copyright: 2015-2017 Thomas Kemmer License: Apache-2.0 Files: debian/* -Copyright: 2015-2016 Stein Magnus Jodal +Copyright: 2015-2018 Stein Magnus Jodal License: Apache-2.0 License: Apache-2.0 diff -Nru mopidy-dleyna-1.2.0/debian/.git-dpm mopidy-dleyna-1.2.1/debian/.git-dpm --- mopidy-dleyna-1.2.0/debian/.git-dpm 2016-09-23 20:21:11.000000000 +0000 +++ mopidy-dleyna-1.2.1/debian/.git-dpm 2018-04-14 23:27:19.000000000 +0000 @@ -1,11 +1,11 @@ # see git-dpm(1) from git-dpm package -fb9d8c40f90d950c2f12a1b17394caca206cc168 -fb9d8c40f90d950c2f12a1b17394caca206cc168 -fb9d8c40f90d950c2f12a1b17394caca206cc168 -fb9d8c40f90d950c2f12a1b17394caca206cc168 -mopidy-dleyna_1.2.0.orig.tar.gz -1f5529bd6fcabbae42e987b9e2b8bf3289ee7619 -19882 +90dedf7009451d8a599faec8b61ddafa7bbaa77f +90dedf7009451d8a599faec8b61ddafa7bbaa77f +90dedf7009451d8a599faec8b61ddafa7bbaa77f +90dedf7009451d8a599faec8b61ddafa7bbaa77f +mopidy-dleyna_1.2.1.orig.tar.gz +2d9b62d073c2c57ef7da9bc17f154af203fad944 +20181 debianTag="debian/%e%v" patchedTag="patched/%e%v" upstreamTag="upstream/%e%u" diff -Nru mopidy-dleyna-1.2.0/docs/config.rst mopidy-dleyna-1.2.1/docs/config.rst --- mopidy-dleyna-1.2.0/docs/config.rst 2016-09-23 16:17:17.000000000 +0000 +++ mopidy-dleyna-1.2.1/docs/config.rst 2017-10-24 20:55:29.000000000 +0000 @@ -21,11 +21,6 @@ The maximum number of objects to retrieve per UPnP `Browse` action, or ``0`` to retrieve all objects. - .. note:: - - Due to a known bug in Mopidy-dLeyna, this should *not* be set - above 200 when using Kodi as a DLNA server. - .. confval:: dleyna/upnp_lookup_limit The maximum number of objects to retrieve by ID in a single UPnP diff -Nru mopidy-dleyna-1.2.0/docs/conf.py mopidy-dleyna-1.2.1/docs/conf.py --- mopidy-dleyna-1.2.0/docs/conf.py 2016-05-17 12:05:24.000000000 +0000 +++ mopidy-dleyna-1.2.1/docs/conf.py 2017-10-24 20:55:29.000000000 +0000 @@ -12,8 +12,9 @@ metadata = dict(findall(r"__([a-z]+)__ = '([^']+)'", f.read())) return metadata['version'] + project = 'Mopidy-dLeyna' -copyright = '2015, 2016 Thomas Kemmer' +copyright = '2015-2017 Thomas Kemmer' version = get_version(b'../mopidy_dleyna/__init__.py') release = version diff -Nru mopidy-dleyna-1.2.0/docs/license.rst mopidy-dleyna-1.2.1/docs/license.rst --- mopidy-dleyna-1.2.0/docs/license.rst 2016-05-17 12:05:24.000000000 +0000 +++ mopidy-dleyna-1.2.1/docs/license.rst 2017-10-24 20:55:29.000000000 +0000 @@ -1,7 +1,7 @@ License ======================================================================== -Mopidy-dLeyna is Copyright (c) 2015, 2016 Thomas Kemmer. +Mopidy-dLeyna is Copyright (c) 2015-2017 Thomas Kemmer. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License. You diff -Nru mopidy-dleyna-1.2.0/mopidy_dleyna/client.py mopidy-dleyna-1.2.1/mopidy_dleyna/client.py --- mopidy-dleyna-1.2.0/mopidy_dleyna/client.py 2016-07-22 10:13:08.000000000 +0000 +++ mopidy-dleyna-1.2.1/mopidy_dleyna/client.py 2017-10-24 20:55:29.000000000 +0000 @@ -152,10 +152,18 @@ ','.join(self.__sortorder(uri, order)), dbus_interface=self.MEDIA_CONTAINER_IFACE ) - if baseuri and (filter == ['*'] or 'URI' in filter): - return future.map(urimapper(baseuri)) - else: - return future + + def mapper(res): + if baseuri and (filter == ['*'] or 'URI' in filter): + objs = map(urimapper(baseuri), res) + else: + objs = res + # dleyna does not pass TotalMatches from Browse action; + # also note that a server may choose to return less than + # `limit` items, so assume `more` until nothing found + more = len(res) != 0 + return objs, more + return future.apply(mapper) def properties(self, uri, iface=None): baseuri, objpath = self.__parseuri(uri) @@ -183,10 +191,16 @@ ','.join(self.__sortorder(uri, order)), dbus_interface=self.MEDIA_CONTAINER_IFACE ) - if baseuri and (filter == ['*'] or 'URI' in filter): - return future.apply(lambda res: map(urimapper(baseuri), res[0])) - else: - return future.apply(lambda res: res[0]) + + def mapper(res): + items, total = res + if baseuri and (filter == ['*'] or 'URI' in filter): + objs = map(urimapper(baseuri), items) + else: + objs = items + more = offset + len(items) < total + return objs, more + return future.apply(mapper) def server(self, uri): # return future for consistency/future extensions diff -Nru mopidy-dleyna-1.2.0/mopidy_dleyna/ext.conf mopidy-dleyna-1.2.1/mopidy_dleyna/ext.conf --- mopidy-dleyna-1.2.0/mopidy_dleyna/ext.conf 2016-09-23 16:17:17.000000000 +0000 +++ mopidy-dleyna-1.2.1/mopidy_dleyna/ext.conf 2017-10-24 20:55:29.000000000 +0000 @@ -3,7 +3,7 @@ # maximum number of objects to retrieve per UPnP Browse action, or 0 # to retrieve all objects -upnp_browse_limit = 200 +upnp_browse_limit = 500 # maximum number of objects to retrieve by ID in a single UPnP Search # action (if supported by device), or 0 for no limit diff -Nru mopidy-dleyna-1.2.0/mopidy_dleyna/__init__.py mopidy-dleyna-1.2.1/mopidy_dleyna/__init__.py --- mopidy-dleyna-1.2.0/mopidy_dleyna/__init__.py 2016-09-23 16:17:17.000000000 +0000 +++ mopidy-dleyna-1.2.1/mopidy_dleyna/__init__.py 2017-10-24 20:55:29.000000000 +0000 @@ -4,7 +4,7 @@ from mopidy import config, exceptions, ext -__version__ = '1.2.0' +__version__ = '1.2.1' class Extension(ext.Extension): diff -Nru mopidy-dleyna-1.2.0/mopidy_dleyna/library.py mopidy-dleyna-1.2.1/mopidy_dleyna/library.py --- mopidy-dleyna-1.2.0/mopidy_dleyna/library.py 2016-09-23 16:17:17.000000000 +0000 +++ mopidy-dleyna-1.2.1/mopidy_dleyna/library.py 2017-10-24 20:55:29.000000000 +0000 @@ -51,23 +51,23 @@ def iterate(func, translate, limit): - def generate(future): - offset = limit - while future: - objs, more = future.get() - if more: - future = func(offset, limit) + count = 0 + future = func(count, limit) + while future: + objs, more = future.get() + if more: + objs = list(objs) + count += len(objs) + future = func(count, limit) + else: + future = None + for obj in objs: + try: + result = translate(obj) + except ValueError as e: + logger.debug('Skipping %s: %s', obj.get('URI'), e) else: - future = None - for obj in objs: - try: - result = translate(obj) - except ValueError as e: - logger.debug('Skipping %s: %s', obj.get('URI'), e) - else: - yield result - offset += limit - return generate(func(0, limit)) + yield result class dLeynaLibraryProvider(backend.LibraryProvider): @@ -161,9 +161,7 @@ order = BROWSE_ORDER[translator.ref(obj).type] def browse(offset, limit): - return client.browse(uri, offset, limit, filter, order).apply( - lambda objs: (objs, limit and len(objs) == limit) - ) + return client.browse(uri, offset, limit, filter, order) return iterate(browse, translator.ref, self.__upnp_browse_limit) def __images(self, baseuri, paths, filter=IMAGES_FILTER): @@ -180,7 +178,7 @@ slice = paths[offset:offset + limit if limit else None] query = ' or '.join('Path = "%s%s"' % (root, p) for p in slice) return client.search(baseuri, query, 0, 0, filter).apply( - lambda objs: (objs, limit and offset + limit < len(paths)) + lambda res: (res[0], limit and offset + limit < len(paths)) ) return iterate(images, translator.images, self.__upnp_lookup_limit) @@ -190,7 +188,7 @@ if translator.ref(obj).type == models.Ref.TRACK: objs = [obj] else: - objs = client.search(uri, LOOKUP_QUERY, filter=filter).get() + objs, _ = client.search(uri, LOOKUP_QUERY, filter=filter).get() return map(translator.track, objs) def __search(self, uri, query, exact, filter=SEARCH_FILTER): @@ -202,9 +200,7 @@ raise NotImplementedError('Search is not supported by this device') def search(offset, limit): - return client.search(uri, q, offset, limit, filter).apply( - lambda objs: (objs, limit and len(objs) == limit) - ) + return client.search(uri, q, offset, limit, filter) return iterate(search, translator.model, self.__upnp_search_limit) @property diff -Nru mopidy-dleyna-1.2.0/mopidy_dleyna/translator.py mopidy-dleyna-1.2.1/mopidy_dleyna/translator.py --- mopidy-dleyna-1.2.0/mopidy_dleyna/translator.py 2016-09-23 16:17:17.000000000 +0000 +++ mopidy-dleyna-1.2.1/mopidy_dleyna/translator.py 2017-10-24 20:55:29.000000000 +0000 @@ -35,7 +35,6 @@ ) } -# TODO: handle playlists and 'container.playlistContainer' _REFS = { 'audio': models.Ref.track, 'container': models.Ref.directory, @@ -43,7 +42,10 @@ 'container.album.musicAlbum': models.Ref.album, 'container.genre.musicGenre': models.Ref.directory, 'container.person.musicArtist': models.Ref.artist, + 'container.playlistContainer': models.Ref.directory, 'container.storageFolder': models.Ref.directory, + 'item.audioItem.audioBook': models.Ref.track, + 'item.audioItem.audioBroadcast': models.Ref.track, 'music': models.Ref.track } @@ -104,11 +106,12 @@ def model(obj): type = obj.get('TypeEx', obj['Type']) - if type == 'music' or type == 'audio': + ref = _REFS.get(type) + if ref == models.Ref.track: return track(obj) - elif type == 'container.album.musicAlbum': + elif ref == models.Ref.album: return album(obj) - elif type == 'container.person.musicArtist': + elif ref == models.Ref.artist: return artist(obj) else: raise ValueError('Object type "%s" not supported' % type) diff -Nru mopidy-dleyna-1.2.0/Mopidy_dLeyna.egg-info/PKG-INFO mopidy-dleyna-1.2.1/Mopidy_dLeyna.egg-info/PKG-INFO --- mopidy-dleyna-1.2.0/Mopidy_dLeyna.egg-info/PKG-INFO 2016-09-23 16:19:26.000000000 +0000 +++ mopidy-dleyna-1.2.1/Mopidy_dLeyna.egg-info/PKG-INFO 2017-10-24 20:55:57.000000000 +0000 @@ -1,11 +1,12 @@ Metadata-Version: 1.1 Name: Mopidy-dLeyna -Version: 1.2.0 +Version: 1.2.1 Summary: Mopidy extension for playing music from Digital Media Servers Home-page: https://github.com/tkem/mopidy-dleyna Author: Thomas Kemmer Author-email: tkemmer@computer.org License: Apache License, Version 2.0 +Description-Content-Type: UNKNOWN Description: Mopidy-dLeyna ======================================================================== @@ -48,7 +49,7 @@ License ------------------------------------------------------------------------ - Copyright (c) 2015, 2016 Thomas Kemmer. + Copyright (c) 2015-2017 Thomas Kemmer. Licensed under the `Apache License, Version 2.0`_. diff -Nru mopidy-dleyna-1.2.0/Mopidy_dLeyna.egg-info/requires.txt mopidy-dleyna-1.2.1/Mopidy_dLeyna.egg-info/requires.txt --- mopidy-dleyna-1.2.0/Mopidy_dLeyna.egg-info/requires.txt 2016-09-23 16:19:26.000000000 +0000 +++ mopidy-dleyna-1.2.1/Mopidy_dLeyna.egg-info/requires.txt 2017-10-24 20:55:57.000000000 +0000 @@ -1,4 +1,4 @@ setuptools -Mopidy >= 1.0 -Pykka >= 1.2 -uritools >= 1.0 +Mopidy>=1.0 +Pykka>=1.2 +uritools>=1.0 diff -Nru mopidy-dleyna-1.2.0/PKG-INFO mopidy-dleyna-1.2.1/PKG-INFO --- mopidy-dleyna-1.2.0/PKG-INFO 2016-09-23 16:19:27.000000000 +0000 +++ mopidy-dleyna-1.2.1/PKG-INFO 2017-10-24 20:55:57.000000000 +0000 @@ -1,11 +1,12 @@ Metadata-Version: 1.1 Name: Mopidy-dLeyna -Version: 1.2.0 +Version: 1.2.1 Summary: Mopidy extension for playing music from Digital Media Servers Home-page: https://github.com/tkem/mopidy-dleyna Author: Thomas Kemmer Author-email: tkemmer@computer.org License: Apache License, Version 2.0 +Description-Content-Type: UNKNOWN Description: Mopidy-dLeyna ======================================================================== @@ -48,7 +49,7 @@ License ------------------------------------------------------------------------ - Copyright (c) 2015, 2016 Thomas Kemmer. + Copyright (c) 2015-2017 Thomas Kemmer. Licensed under the `Apache License, Version 2.0`_. diff -Nru mopidy-dleyna-1.2.0/README.rst mopidy-dleyna-1.2.1/README.rst --- mopidy-dleyna-1.2.0/README.rst 2016-05-21 15:21:46.000000000 +0000 +++ mopidy-dleyna-1.2.1/README.rst 2017-10-24 20:55:29.000000000 +0000 @@ -40,7 +40,7 @@ License ------------------------------------------------------------------------ -Copyright (c) 2015, 2016 Thomas Kemmer. +Copyright (c) 2015-2017 Thomas Kemmer. Licensed under the `Apache License, Version 2.0`_. diff -Nru mopidy-dleyna-1.2.0/setup.cfg mopidy-dleyna-1.2.1/setup.cfg --- mopidy-dleyna-1.2.0/setup.cfg 2016-09-23 16:19:27.000000000 +0000 +++ mopidy-dleyna-1.2.1/setup.cfg 2017-10-24 20:55:57.000000000 +0000 @@ -13,5 +13,4 @@ [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -Nru mopidy-dleyna-1.2.0/tests/test_browse.py mopidy-dleyna-1.2.1/tests/test_browse.py --- mopidy-dleyna-1.2.0/tests/test_browse.py 2016-05-21 15:21:46.000000000 +0000 +++ mopidy-dleyna-1.2.1/tests/test_browse.py 2017-10-24 20:55:29.000000000 +0000 @@ -46,6 +46,11 @@ 'DisplayName': 'Track #2', 'Type': 'audio', 'URI': 'dleyna://media/2' + }, + { + 'DisplayName': 'Track #3', + 'Type': 'audio', + 'URI': 'dleyna://media/3' } ] @@ -63,8 +68,13 @@ # 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) + 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 #2', uri='dleyna://media/2'), + Ref.track(name='Track #3', uri='dleyna://media/3'), ] diff -Nru mopidy-dleyna-1.2.0/tests/test_images.py mopidy-dleyna-1.2.1/tests/test_images.py --- mopidy-dleyna-1.2.0/tests/test_images.py 2016-05-21 15:21:46.000000000 +0000 +++ mopidy-dleyna-1.2.1/tests/test_images.py 2017-10-24 20:55:29.000000000 +0000 @@ -41,7 +41,7 @@ with mock.patch.object(backend, 'client') as m: m.servers.return_value = Future.fromvalue([server]) m.server.return_value = Future.fromvalue(server) - m.search.return_value = Future.fromvalue(items) + m.search.return_value = Future.fromvalue([items, False]) assert backend.library.get_images(item['URI'] for item in items) == { items[0]['URI']: (models.Image(uri=items[0]['AlbumArtURL']),), items[1]['URI']: tuple() diff -Nru mopidy-dleyna-1.2.0/tests/test_lookup.py mopidy-dleyna-1.2.1/tests/test_lookup.py --- mopidy-dleyna-1.2.0/tests/test_lookup.py 2016-05-21 15:21:46.000000000 +0000 +++ mopidy-dleyna-1.2.1/tests/test_lookup.py 2017-10-24 20:55:29.000000000 +0000 @@ -50,7 +50,7 @@ def test_lookup_container(backend, container, items): with mock.patch.object(backend, 'client') as m: m.properties.return_value = Future.fromvalue(container) - m.search.return_value = Future.fromvalue(items) + m.search.return_value = Future.fromvalue([items, False]) assert backend.library.lookup(container['URI']) == [ models.Track(name='Track #1', uri='dleyna://media/11'), models.Track(name='Track #2', uri='dleyna://media/12') diff -Nru mopidy-dleyna-1.2.0/tests/test_search.py mopidy-dleyna-1.2.1/tests/test_search.py --- mopidy-dleyna-1.2.0/tests/test_search.py 2016-05-21 15:21:46.000000000 +0000 +++ mopidy-dleyna-1.2.1/tests/test_search.py 2017-10-24 20:55:29.000000000 +0000 @@ -45,7 +45,10 @@ with mock.patch.object(backend, 'client') as m: m.servers.return_value = Future.fromvalue([server]) m.server.return_value = Future.fromvalue(server) - m.search.return_value = Future.fromvalue(result) + m.search.side_effect = [ + Future.fromvalue([result[0:2], True]), + Future.fromvalue([result[2:3], False]) + ] # valid search assert backend.library.search({'any': ['foo']}) == models.SearchResult( albums=[ diff -Nru mopidy-dleyna-1.2.0/tests/test_translator.py mopidy-dleyna-1.2.1/tests/test_translator.py --- mopidy-dleyna-1.2.0/tests/test_translator.py 2016-05-21 15:21:46.000000000 +0000 +++ mopidy-dleyna-1.2.1/tests/test_translator.py 2017-10-24 20:55:29.000000000 +0000 @@ -11,6 +11,9 @@ ALBUM_TYPE = 'container.album.musicAlbum' ARTIST_TYPE = 'container.person.musicArtist' +PLAYLIST_TYPE = 'container.playlistContainer' +AUDIO_BOOK_TYPE = 'item.audioItem.audioBook' +AUDIO_BROADCAST_TYPE = 'item.audioItem.audioBroadcast' def test_album_ref(): @@ -31,7 +34,7 @@ }) == Ref.artist(uri=BASEURI+'/foo', name='Foo') -def test_track_ref(): +def test_music_ref(): assert translator.ref({ 'DisplayName': 'Foo', 'URI': BASEURI + '/foo', @@ -39,7 +42,25 @@ }) == Ref.track(uri=BASEURI+'/foo', name='Foo') -def test_directory_ref(): +def test_audio_book_ref(): + assert translator.ref({ + 'DisplayName': 'Foo', + 'URI': BASEURI + '/foo', + 'Type': 'audio', + 'TypeEx': AUDIO_BOOK_TYPE + }) == Ref.track(uri=BASEURI+'/foo', name='Foo') + + +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_container_ref(): assert translator.ref({ 'DisplayName': 'Foo', 'URI': BASEURI + '/foo', @@ -74,6 +95,15 @@ }) == Artist(uri=BASEURI+'/foo', name='Foo') +def test_playlist(): + assert translator.ref({ + 'DisplayName': 'Foo', + 'URI': BASEURI + '/foo', + 'Type': 'container', + 'TypeEx': PLAYLIST_TYPE + }) == Ref.directory(uri=BASEURI+'/foo', name='Foo') + + def test_track(): assert translator.model({ 'DisplayName': 'Foo', @@ -83,6 +113,24 @@ }) == Track(uri=BASEURI+'/foo', name='Foo', album=Album(name='Bar')) +def test_audio_book(): + assert translator.model({ + 'DisplayName': 'Foo', + 'URI': BASEURI + '/foo', + 'Type': 'audio', + 'TypeEx': AUDIO_BOOK_TYPE + }) == Track(uri=BASEURI+'/foo', name='Foo') + + +def test_audio_broadcast(): + assert translator.model({ + 'DisplayName': 'Foo', + 'URI': BASEURI + '/foo', + 'Type': 'audio', + 'TypeEx': AUDIO_BROADCAST_TYPE + }) == Track(uri=BASEURI+'/foo', name='Foo') + + def test_video(): with pytest.raises(ValueError): translator.model({