From 0f6176a3b471d931fa2d2449ffb179c591cd065c Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 20 Oct 2013 13:26:38 +0200 Subject: [PATCH 1/2] local: Temporary workaround for issue #527 Adds a fallback to `Track(uri=uri` when track lookup fails for playlists. This means we can at least load metadata less tracks giving users functioning playlists, instead of only supporting `local:track:...` style URIs. Issue is not fixed, but this is sufficient to reduce priority until we get to the larger planed refactor for this and other core API issues. --- mopidy/backends/local/playlists.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mopidy/backends/local/playlists.py b/mopidy/backends/local/playlists.py index af3814ae..5206718e 100644 --- a/mopidy/backends/local/playlists.py +++ b/mopidy/backends/local/playlists.py @@ -6,7 +6,7 @@ import os import shutil from mopidy.backends import base, listener -from mopidy.models import Playlist +from mopidy.models import Playlist, Track from mopidy.utils import formatting, path from .translator import parse_m3u @@ -52,11 +52,12 @@ class LocalPlaylistsProvider(base.BasePlaylistsProvider): tracks = [] for track_uri in parse_m3u(m3u, self._media_dir): try: - # TODO We must use core.library.lookup() to support tracks + # TODO: We must use core.library.lookup() to support tracks # from other backends tracks += self.backend.library.lookup(track_uri) except LookupError as ex: - logger.warning('Playlist item could not be added: %s', ex) + # TODO: this is just a quick workaround for issue #527. + tracks.append(Track(uri=track_uri)) playlist = Playlist(uri=uri, name=name, tracks=tracks) playlists.append(playlist) From fcd3e5d5cf32d78d4297ac246c0000cde62bcb7b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 20 Oct 2013 16:18:03 +0200 Subject: [PATCH 2/2] local: Add test for fallback handling of unknown track uris in playlists - Checks that adding a non local:track:... uri to a playlist and reading it back works. - Also fixes mistake in API usage where we assumed lookup still raised LookupError. --- mopidy/backends/local/playlists.py | 8 +++----- tests/backends/local/playlists_test.py | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/mopidy/backends/local/playlists.py b/mopidy/backends/local/playlists.py index 5206718e..081bc335 100644 --- a/mopidy/backends/local/playlists.py +++ b/mopidy/backends/local/playlists.py @@ -51,12 +51,10 @@ class LocalPlaylistsProvider(base.BasePlaylistsProvider): tracks = [] for track_uri in parse_m3u(m3u, self._media_dir): - try: - # TODO: We must use core.library.lookup() to support tracks - # from other backends + result = self.backend.library.lookup(track_uri) + if result: tracks += self.backend.library.lookup(track_uri) - except LookupError as ex: - # TODO: this is just a quick workaround for issue #527. + else: tracks.append(Track(uri=track_uri)) playlist = Playlist(uri=uri, name=name, tracks=tracks) diff --git a/tests/backends/local/playlists_test.py b/tests/backends/local/playlists_test.py index a9f13974..c8fedd62 100644 --- a/tests/backends/local/playlists_test.py +++ b/tests/backends/local/playlists_test.py @@ -201,6 +201,18 @@ class LocalPlaylistsProviderTest(unittest.TestCase): self.assertNotIn(playlist1, self.core.playlists.playlists) self.assertIn(playlist2, self.core.playlists.playlists) - @unittest.SkipTest def test_playlist_with_unknown_track(self): - pass + track = Track(uri='file:///dev/null') + playlist = self.core.playlists.create('test') + playlist = playlist.copy(tracks=[track]) + playlist = self.core.playlists.save(playlist) + + backend = self.backend_class(config=self.config, audio=self.audio) + + self.assert_(backend.playlists.playlists) + self.assertEqual( + 'local:playlist:test', backend.playlists.playlists[0].uri) + self.assertEqual( + playlist.name, backend.playlists.playlists[0].name) + self.assertEqual( + track.uri, backend.playlists.playlists[0].tracks[0].uri)