From f946386a7d1c90dba789621c94230bb6e06cc0c8 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 19:23:10 +0200 Subject: [PATCH 01/16] Reorder init of backends due to dependencies between them --- mopidy/backends/gstreamer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 826a3669..51da3d54 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -38,10 +38,10 @@ class GStreamerBackend(BaseBackend): def __init__(self, *args, **kwargs): super(GStreamerBackend, self).__init__(*args, **kwargs) - self.playback = GStreamerPlaybackController(self) + self.library = GStreamerLibraryController(self) self.stored_playlists = GStreamerStoredPlaylistsController(self) self.current_playlist = BaseCurrentPlaylistController(self) - self.library = GStreamerLibraryController(self) + self.playback = GStreamerPlaybackController(self) self.uri_handlers = [u'file://'] From 60ca5e4841d29bc087f7c962955ffbbc8416807e Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 19:24:22 +0200 Subject: [PATCH 02/16] Add logging for loading of tag_cache and playlists, and exception message for LookupError --- mopidy/backends/gstreamer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 51da3d54..fadfed35 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -126,6 +126,8 @@ class GStreamerStoredPlaylistsController(BaseStoredPlaylistsController): def refresh(self): playlists = [] + logger.info('Loading playlists from %s', self._folder) + for m3u in glob.glob(os.path.join(self._folder, '*.m3u')): name = os.path.basename(m3u)[:len('.m3u')] track_uris = parse_m3u(m3u) @@ -191,6 +193,9 @@ class GStreamerLibraryController(BaseLibraryController): tracks = parse_mpd_tag_cache(settings.TAG_CACHE, settings.MUSIC_FOLDER) + logger.info('Loading songs in %s from %s', settings.MUSIC_FOLDER, + settings.TAG_CACHE) + for track in tracks: self._uri_mapping[track.uri] = track @@ -198,7 +203,7 @@ class GStreamerLibraryController(BaseLibraryController): try: return self._uri_mapping[uri] except KeyError: - raise LookupError + raise LookupError('%s not found.' % uri) def find_exact(self, field, query): if not query: From 998f9abae6bb3968720fde9eabba2105a9ec13dc Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 19:24:42 +0200 Subject: [PATCH 03/16] Load playlist tracks from library --- mopidy/backends/gstreamer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index fadfed35..8c291f96 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -130,8 +130,9 @@ class GStreamerStoredPlaylistsController(BaseStoredPlaylistsController): for m3u in glob.glob(os.path.join(self._folder, '*.m3u')): name = os.path.basename(m3u)[:len('.m3u')] - track_uris = parse_m3u(m3u) - tracks = map(lambda u: Track(uri=u), track_uris) + tracks = [] + for uri in parse_m3u(m3u): + tracks.append(self.backend.library.lookup(uri)) playlist = Playlist(tracks=tracks, name=name) # FIXME playlist name needs better handling From 1622f760f2929e91e153e6785483a265d06c6d0b Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 19:26:31 +0200 Subject: [PATCH 04/16] Add FIXMEs --- mopidy/mpd/frontend.py | 2 +- mopidy/utils.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mopidy/mpd/frontend.py b/mopidy/mpd/frontend.py index 9ffdd169..da3d9609 100644 --- a/mopidy/mpd/frontend.py +++ b/mopidy/mpd/frontend.py @@ -1405,7 +1405,7 @@ class MpdFrontend(object): matches = self.backend.stored_playlists.search(name) if matches: self.backend.current_playlist.load(matches[0]) - self.backend.playback.new_playlist_loaded_callback() + self.backend.playback.new_playlist_loaded_callback() # FIXME not needed? @handle_pattern(r'^playlistadd "(?P[^"]+)" "(?P[^"]+)"$') def _stored_playlist_playlistadd(self, name, uri): diff --git a/mopidy/utils.py b/mopidy/utils.py index 8ddca4c8..700b7375 100644 --- a/mopidy/utils.py +++ b/mopidy/utils.py @@ -35,6 +35,7 @@ def get_or_create_folder(folder): def path_to_uri(*paths): path = os.path.join(*paths) + #path = os.path.expanduser(path) # FIXME path = path.encode('utf-8') if sys.platform == 'win32': return 'file:' + urllib.pathname2url(path) From f55390ee18bf21e8a3e77abc877557ce6f28a587 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 19:26:50 +0200 Subject: [PATCH 05/16] Use path_to_uri to join dirs --- mopidy/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mopidy/utils.py b/mopidy/utils.py index 700b7375..c0caf2fe 100644 --- a/mopidy/utils.py +++ b/mopidy/utils.py @@ -213,11 +213,11 @@ def _convert_mpd_data(data, tracks, music_dir): track_kwargs['name'] = data['title'] if data['file'][0] == '/': - path = os.path.join(music_dir, data['file'][1:]) + path = data['file'][1:] else: - path = os.path.join(music_dir, data['file']) + path = data['file'] - track_kwargs['uri'] = path_to_uri(path) + track_kwargs['uri'] = path_to_uri(music_dir, path) track_kwargs['length'] = int(data.get('time', 0)) * 1000 track = Track(**track_kwargs) From 65c8dbc9064debe8e62aa9d1818d47d80ae3b64f Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 20:16:41 +0200 Subject: [PATCH 06/16] Fix tests with respect to dependecies between backends --- tests/backends/base.py | 14 ++++++++++++-- tests/backends/gstreamer_test.py | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/tests/backends/base.py b/tests/backends/base.py index 2974b316..56bd3dd5 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -960,16 +960,26 @@ class BaseStoredPlaylistsControllerTest(object): backend_class = None def setUp(self): - self.original_folder = settings.PLAYLIST_FOLDER + self.original_playlist_folder = settings.PLAYLIST_FOLDER + self.original_tag_cache = settings.TAG_CACHE + self.original_music_folder = settings.MUSIC_FOLDER + settings.PLAYLIST_FOLDER = tempfile.mkdtemp() + settings.TAG_CACHE = data_folder('library_tag_cache') + settings.MUSIC_FOLDER = data_folder('') + self.backend = self.backend_class(mixer=DummyMixer()) self.stored = self.backend.stored_playlists def tearDown(self): self.backend.destroy() + if os.path.exists(settings.PLAYLIST_FOLDER): shutil.rmtree(settings.PLAYLIST_FOLDER) - settings.PLAYLIST_FOLDER = self.original_folder + + settings.PLAYLIST_FOLDER = self.original_playlist_folder + settings.TAG_CACHE = self.original_tag_cache + settings.MUSIC_FOLDER = self.original_music_folder def test_create(self): playlist = self.stored.create('test') diff --git a/tests/backends/gstreamer_test.py b/tests/backends/gstreamer_test.py index 7e682d36..7ea0c5d1 100644 --- a/tests/backends/gstreamer_test.py +++ b/tests/backends/gstreamer_test.py @@ -98,7 +98,7 @@ class GStreamerStoredPlaylistsControllerTest(BaseStoredPlaylistsControllerTest, self.assertEqual(uri, contents.strip()) def test_playlists_are_loaded_at_startup(self): - track = Track(uri=generate_song(1)) + track = Track(uri=path_to_uri(data_folder('uri2'))) playlist = Playlist(tracks=[track], name='test') self.stored.save(playlist) From 8875e054d06eb4dd8b39534af3e0ac1c620cf06e Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 20:28:51 +0200 Subject: [PATCH 07/16] Rename MUSIC_FOLDER, PLAYLIST_FOLDER and TAG_CACHE with LOCAL_ prefix --- mopidy/backends/gstreamer.py | 10 +++++----- mopidy/settings.py | 9 ++++++--- tests/backends/base.py | 22 +++++++++++----------- tests/backends/gstreamer_test.py | 27 +++++++++++++++------------ 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 8c291f96..30cffa6d 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -120,7 +120,7 @@ class GStreamerPlaybackController(BasePlaybackController): class GStreamerStoredPlaylistsController(BaseStoredPlaylistsController): def __init__(self, *args): super(GStreamerStoredPlaylistsController, self).__init__(*args) - self._folder = os.path.expanduser(settings.PLAYLIST_FOLDER) + self._folder = os.path.expanduser(settings.LOCAL_PLAYLIST_FOLDER) self.refresh() def refresh(self): @@ -191,11 +191,11 @@ class GStreamerLibraryController(BaseLibraryController): self.refresh() def refresh(self, uri=None): - tracks = parse_mpd_tag_cache(settings.TAG_CACHE, - settings.MUSIC_FOLDER) + tracks = parse_mpd_tag_cache(settings.LOCAL_TAG_CACHE, + settings.LOCAL_MUSIC_FOLDER) - logger.info('Loading songs in %s from %s', settings.MUSIC_FOLDER, - settings.TAG_CACHE) + logger.info('Loading songs in %s from %s', + settings.LOCAL_MUSIC_FOLDER, settings.LOCAL_TAG_CACHE) for track in tracks: self._uri_mapping[track.uri] = track diff --git a/mopidy/settings.py b/mopidy/settings.py index a2ba88e5..603faee2 100644 --- a/mopidy/settings.py +++ b/mopidy/settings.py @@ -117,13 +117,16 @@ SPOTIFY_LIB_APPKEY = u'~/.mopidy/spotify_appkey.key' SPOTIFY_LIB_CACHE = u'~/.mopidy/libspotify_cache' #: Path to playlist folder with m3u files. -PLAYLIST_FOLDER = u'~/.mopidy/playlists' +#: LOCAL_PLAYLIST_FOLDER = u'~/.mopidy/playlists' +LOCAL_PLAYLIST_FOLDER = u'~/.mopidy/playlists' #: Path to folder with local music. -MUSIC_FOLDER = u'~/music' +#: LOCAL_MUSIC_FOLDER = u'~/music' +LOCAL_MUSIC_FOLDER = u'~/music' #: Path to MPD tag_cache for local music -TAG_CACHE = u'~/.mopidy/tag_cache' +#: LOCAL_TAG_CACHE = u'~/.mopidy/tag_cache' +LOCAL_TAG_CACHE = u'~/.mopidy/tag_cache' # Import user specific settings dotdir = os.path.expanduser(u'~/.mopidy/') diff --git a/tests/backends/base.py b/tests/backends/base.py index 56bd3dd5..1bb9b50f 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -960,13 +960,13 @@ class BaseStoredPlaylistsControllerTest(object): backend_class = None def setUp(self): - self.original_playlist_folder = settings.PLAYLIST_FOLDER - self.original_tag_cache = settings.TAG_CACHE - self.original_music_folder = settings.MUSIC_FOLDER + self.original_playlist_folder = settings.LOCAL_PLAYLIST_FOLDER + self.original_tag_cache = settings.LOCAL_TAG_CACHE + self.original_music_folder = settings.LOCAL_MUSIC_FOLDER - settings.PLAYLIST_FOLDER = tempfile.mkdtemp() - settings.TAG_CACHE = data_folder('library_tag_cache') - settings.MUSIC_FOLDER = data_folder('') + settings.LOCAL_PLAYLIST_FOLDER = tempfile.mkdtemp() + settings.LOCAL_TAG_CACHE = data_folder('library_tag_cache') + settings.LOCAL_MUSIC_FOLDER = data_folder('') self.backend = self.backend_class(mixer=DummyMixer()) self.stored = self.backend.stored_playlists @@ -974,12 +974,12 @@ class BaseStoredPlaylistsControllerTest(object): def tearDown(self): self.backend.destroy() - if os.path.exists(settings.PLAYLIST_FOLDER): - shutil.rmtree(settings.PLAYLIST_FOLDER) + if os.path.exists(settings.LOCAL_PLAYLIST_FOLDER): + shutil.rmtree(settings.LOCAL_PLAYLIST_FOLDER) - settings.PLAYLIST_FOLDER = self.original_playlist_folder - settings.TAG_CACHE = self.original_tag_cache - settings.MUSIC_FOLDER = self.original_music_folder + settings.LOCAL_PLAYLIST_FOLDER = self.original_playlist_folder + settings.LOCAL_TAG_CACHE = self.original_tag_cache + settings.LOCAL_MUSIC_FOLDER = self.original_music_folder def test_create(self): playlist = self.stored.create('test') diff --git a/tests/backends/gstreamer_test.py b/tests/backends/gstreamer_test.py index 7ea0c5d1..c308d545 100644 --- a/tests/backends/gstreamer_test.py +++ b/tests/backends/gstreamer_test.py @@ -58,13 +58,13 @@ class GStreamerStoredPlaylistsControllerTest(BaseStoredPlaylistsControllerTest, backend_class = GStreamerBackend def test_created_playlist_is_persisted(self): - path = os.path.join(settings.PLAYLIST_FOLDER, 'test.m3u') + path = os.path.join(settings.LOCAL_PLAYLIST_FOLDER, 'test.m3u') self.assert_(not os.path.exists(path)) self.stored.create('test') self.assert_(os.path.exists(path)) def test_saved_playlist_is_persisted(self): - path = os.path.join(settings.PLAYLIST_FOLDER, 'test2.m3u') + path = os.path.join(settings.LOCAL_PLAYLIST_FOLDER, 'test2.m3u') self.assert_(not os.path.exists(path)) self.stored.save(Playlist(name='test2')) self.assert_(os.path.exists(path)) @@ -72,13 +72,13 @@ class GStreamerStoredPlaylistsControllerTest(BaseStoredPlaylistsControllerTest, def test_deleted_playlist_get_removed(self): playlist = self.stored.create('test') self.stored.delete(playlist) - path = os.path.join(settings.PLAYLIST_FOLDER, 'test.m3u') + path = os.path.join(settings.LOCAL_PLAYLIST_FOLDER, 'test.m3u') self.assert_(not os.path.exists(path)) def test_renamed_playlist_gets_moved(self): playlist = self.stored.create('test') - file1 = os.path.join(settings.PLAYLIST_FOLDER, 'test.m3u') - file2 = os.path.join(settings.PLAYLIST_FOLDER, 'test2.m3u') + file1 = os.path.join(settings.LOCAL_PLAYLIST_FOLDER, 'test.m3u') + file2 = os.path.join(settings.LOCAL_PLAYLIST_FOLDER, 'test2.m3u') self.assert_(not os.path.exists(file2)) self.stored.rename(playlist, 'test2') self.assert_(not os.path.exists(file1)) @@ -88,7 +88,7 @@ class GStreamerStoredPlaylistsControllerTest(BaseStoredPlaylistsControllerTest, track = Track(uri=generate_song(1)) uri = track.uri[len('file://'):] playlist = Playlist(tracks=[track], name='test') - path = os.path.join(settings.PLAYLIST_FOLDER, 'test.m3u') + path = os.path.join(settings.LOCAL_PLAYLIST_FOLDER, 'test.m3u') self.stored.save(playlist) @@ -130,15 +130,18 @@ class GStreamerLibraryControllerTest(BaseLibraryControllerTest, backend_class = GStreamerBackend def setUp(self): - self.original_tag_cache = settings.TAG_CACHE - self.original_music_folder = settings.MUSIC_FOLDER - settings.TAG_CACHE = data_folder('library_tag_cache') - settings.MUSIC_FOLDER = data_folder('') + self.original_tag_cache = settings.LOCAL_TAG_CACHE + self.original_music_folder = settings.LOCAL_MUSIC_FOLDER + + settings.LOCAL_TAG_CACHE = data_folder('library_tag_cache') + settings.LOCAL_MUSIC_FOLDER = data_folder('') + super(GStreamerLibraryControllerTest, self).setUp() def tearDown(self): - settings.TAG_CACHE = self.original_tag_cache - settings.MUSIC_FOLDER = self.original_music_folder + settings.LOCAL_TAG_CACHE = self.original_tag_cache + settings.LOCAL_MUSIC_FOLDER = self.original_music_folder + super(GStreamerLibraryControllerTest, self).tearDown() if __name__ == '__main__': From 09ffd91845c7b1637a06cdf410ad577a78eda379 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 22:56:52 +0200 Subject: [PATCH 08/16] Fix playlistinfo handling to match mpd behaviour --- mopidy/mpd/frontend.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mopidy/mpd/frontend.py b/mopidy/mpd/frontend.py index d7064370..64cbb61e 100644 --- a/mopidy/mpd/frontend.py +++ b/mopidy/mpd/frontend.py @@ -429,11 +429,14 @@ class MpdFrontend(object): argument is given, displays information only for the song ``SONGPOS`` or the range of songs ``START:END``. - *ncmpc:* + *ncmpc and mpc:* - uses negative indexes, like ``playlistinfo "-1"``, to request - information on the last track in the playlist. + the entire playlist """ + if songpos == "-1": + songpos = None + if songpos is not None: songpos = int(songpos) start = songpos From bfd34eb9e0ef66d0160629d36a876fd1136346d7 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 23:05:22 +0200 Subject: [PATCH 09/16] Fix gstreamer stored playlist controller with respect to tracks that don't exist in library (and test stub for issue) --- mopidy/backends/gstreamer.py | 5 ++++- tests/backends/base.py | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mopidy/backends/gstreamer.py b/mopidy/backends/gstreamer.py index 30cffa6d..3d6a8fdd 100644 --- a/mopidy/backends/gstreamer.py +++ b/mopidy/backends/gstreamer.py @@ -132,7 +132,10 @@ class GStreamerStoredPlaylistsController(BaseStoredPlaylistsController): name = os.path.basename(m3u)[:len('.m3u')] tracks = [] for uri in parse_m3u(m3u): - tracks.append(self.backend.library.lookup(uri)) + try: + tracks.append(self.backend.library.lookup(uri)) + except LookupError, e: + logger.error('Playlist item could not be added: %s', e) playlist = Playlist(tracks=tracks, name=name) # FIXME playlist name needs better handling diff --git a/tests/backends/base.py b/tests/backends/base.py index 1bb9b50f..dfc8a4a4 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -1074,6 +1074,9 @@ class BaseStoredPlaylistsControllerTest(object): self.stored.save(playlist) self.assert_(playlist in self.stored.playlists) + def test_playlist_with_unknown_track(self): + raise SkipTest + class BaseLibraryControllerTest(object): artists = [Artist(name='artist1'), Artist(name='artist2'), Artist()] From feb0b3f5f382fb0fee28c8f6e7f7dc364c026a05 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 23:54:53 +0200 Subject: [PATCH 10/16] Add logging marker --- mopidy/__main__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index 2086a2e8..5bbd4af5 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -18,6 +18,7 @@ logger = logging.getLogger('mopidy.main') def main(): options = _parse_options() _setup_logging(options.verbosity_level, options.dump) + logger.info('-- Starting Mopidy --') get_or_create_folder('~/.mopidy/') core_queue = multiprocessing.Queue() get_class(settings.SERVER)(core_queue) From c8b3c91c7c828072fb2b5ce0222b938be0979ee9 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Wed, 5 May 2010 23:55:28 +0200 Subject: [PATCH 11/16] Test that playlistinfo -1 == playlistinfo and add FIXMEs for rest of playlistinfo tests --- tests/mpd/frontend_test.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/mpd/frontend_test.py b/tests/mpd/frontend_test.py index 2ead2b1b..dd9299d9 100644 --- a/tests/mpd/frontend_test.py +++ b/tests/mpd/frontend_test.py @@ -713,22 +713,27 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): self.assert_(u'ACK "id=25" match no tracks' in result) def test_playlistinfo_without_songpos_or_range(self): + # FIXME testing just ok is not enough result = self.h.handle_request(u'playlistinfo') self.assert_(u'OK' in result) def test_playlistinfo_with_songpos(self): + # FIXME testing just ok is not enough result = self.h.handle_request(u'playlistinfo "5"') self.assert_(u'OK' in result) - def test_playlistinfo_with_negative_songpos(self): - result = self.h.handle_request(u'playlistinfo "-1"') - self.assert_(u'OK' in result) + def test_playlistinfo_with_negative_songpos_same_as_playlistinfo(self): + result1 = self.h.handle_request(u'playlistinfo "-1"') + result2 = self.h.handle_request(u'playlistinfo') + self.assertEqual(result1, result2) def test_playlistinfo_with_open_range(self): + # FIXME testing just ok is not enough result = self.h.handle_request(u'playlistinfo "10:"') self.assert_(u'OK' in result) def test_playlistinfo_with_closed_range(self): + # FIXME testing just ok is not enough result = self.h.handle_request(u'playlistinfo "10:20"') self.assert_(u'OK' in result) From b090d37457b10781a90258cdff80891c90c3c507 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 6 May 2010 00:11:11 +0200 Subject: [PATCH 12/16] Fix dummy library with respect to raising lookup error --- mopidy/backends/dummy.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mopidy/backends/dummy.py b/mopidy/backends/dummy.py index fd79cb23..3c940824 100644 --- a/mopidy/backends/dummy.py +++ b/mopidy/backends/dummy.py @@ -29,6 +29,7 @@ class DummyLibraryController(BaseLibraryController): matches = filter(lambda t: uri == t.uri, self._library) if matches: return matches[0] + raise LookupError def search(self, field, query): return Playlist() From e0ffd7e7a189e0e03472f3ab1e244e5448361913 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 6 May 2010 00:11:23 +0200 Subject: [PATCH 13/16] Add test_add_uri_that_triggers_lookup_error --- tests/mpd/frontend_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/mpd/frontend_test.py b/tests/mpd/frontend_test.py index dd9299d9..a8039b56 100644 --- a/tests/mpd/frontend_test.py +++ b/tests/mpd/frontend_test.py @@ -547,6 +547,10 @@ class CurrentPlaylistHandlerTest(unittest.TestCase): self.assert_(u'Id: 137' in result) self.assert_(u'OK' in result) + def test_add_uri_that_triggers_lookup_error(self): + result = self.h.handle_request(u'add "dummy://foo bar baz"') + self.assert_(u'ACK [50@0] {add} directory or file not found' in result) + def test_clear(self): self.b.current_playlist.playlist = Playlist( tracks=[Track(), Track(), Track(), Track(), Track()]) From 0186e3b56ea7429ea67ad6ec59ba3960fe4a41b3 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 6 May 2010 00:11:30 +0200 Subject: [PATCH 14/16] Fix test_add_uri_that_triggers_lookup_error --- mopidy/mpd/frontend.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mopidy/mpd/frontend.py b/mopidy/mpd/frontend.py index 64cbb61e..ebaee4b3 100644 --- a/mopidy/mpd/frontend.py +++ b/mopidy/mpd/frontend.py @@ -255,7 +255,10 @@ class MpdFrontend(object): """ if songpos is not None: songpos = int(songpos) - track = self.backend.library.lookup(uri) + try: + track = self.backend.library.lookup(uri) + except LookupError: + raise MpdAckError(u'[50@0] {add} directory or file not found') if track is not None: self.backend.current_playlist.add(track, at_position=songpos) return ('Id', track.id) From f60301800df484d033c613f912915982e6167ff2 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 6 May 2010 00:14:54 +0200 Subject: [PATCH 15/16] Add FIXME with respect to volume in alsamixer --- mopidy/mixers/alsa.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mopidy/mixers/alsa.py b/mopidy/mixers/alsa.py index 4fd84fd2..bbb99772 100644 --- a/mopidy/mixers/alsa.py +++ b/mopidy/mixers/alsa.py @@ -39,6 +39,7 @@ class AlsaMixer(BaseMixer): return [u'Master', u'PCM'] def _get_volume(self): + # FIXME does not seem to see external volume changes. return self._mixer.getvolume()[0] def _set_volume(self, volume): From 98f2f67663c7147a205e8a3462fcbebe67c51291 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Thu, 6 May 2010 00:50:22 +0200 Subject: [PATCH 16/16] Library needs to set id --- mopidy/utils.py | 1 + tests/backends/base.py | 6 +++--- tests/utils_test.py | 29 ++++++++++++++++------------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/mopidy/utils.py b/mopidy/utils.py index c0caf2fe..758fe2e3 100644 --- a/mopidy/utils.py +++ b/mopidy/utils.py @@ -219,6 +219,7 @@ def _convert_mpd_data(data, tracks, music_dir): track_kwargs['uri'] = path_to_uri(music_dir, path) track_kwargs['length'] = int(data.get('time', 0)) * 1000 + track_kwargs['id'] = len(tracks) track = Track(**track_kwargs) tracks.add(track) diff --git a/tests/backends/base.py b/tests/backends/base.py index dfc8a4a4..129ac4ff 100644 --- a/tests/backends/base.py +++ b/tests/backends/base.py @@ -1084,10 +1084,10 @@ class BaseLibraryControllerTest(object): Album(name='album2', artists=artists[1:2]), Album()] tracks = [Track(name='track1', length=4000, artists=artists[:1], - album=albums[0], uri='file://' + data_folder('uri1')), + album=albums[0], uri='file://' + data_folder('uri1'), id=0), Track(name='track2', length=4000, artists=artists[1:2], - album=albums[1], uri='file://' + data_folder('uri2')), - Track()] + album=albums[1], uri='file://' + data_folder('uri2'), id=1), + Track(id=3)] def setUp(self): self.backend = self.backend_class(mixer=DummyMixer()) diff --git a/tests/utils_test.py b/tests/utils_test.py index 5ee8797b..59f77ec7 100644 --- a/tests/utils_test.py +++ b/tests/utils_test.py @@ -144,21 +144,21 @@ expected_albums = [Album(name='albumname', artists=expected_artists, num_tracks=2)] expected_tracks = [] -def generate_track(path): +def generate_track(path, ident): uri = path_to_uri(data_folder(path)) track = Track(name='trackname', artists=expected_artists, track_no=1, - album=expected_albums[0], length=4000, uri=uri) + album=expected_albums[0], length=4000, uri=uri, id=ident) expected_tracks.append(track) -generate_track('song1.mp3') -generate_track('song2.mp3') -generate_track('song3.mp3') -generate_track('subdir1/song4.mp3') -generate_track('subdir1/song5.mp3') -generate_track('subdir2/song6.mp3') -generate_track('subdir2/song7.mp3') -generate_track('subdir1/subsubdir/song8.mp3') -generate_track('subdir1/subsubdir/song9.mp3') +generate_track('song1.mp3', 6) +generate_track('song2.mp3', 7) +generate_track('song3.mp3', 8) +generate_track('subdir1/song4.mp3', 2) +generate_track('subdir1/song5.mp3', 3) +generate_track('subdir2/song6.mp3', 4) +generate_track('subdir2/song7.mp3', 5) +generate_track('subdir1/subsubdir/song8.mp3', 0) +generate_track('subdir1/subsubdir/song9.mp3', 1) class MPDTagCacheToTracksTest(unittest.TestCase): def test_emtpy_cache(self): @@ -169,7 +169,10 @@ class MPDTagCacheToTracksTest(unittest.TestCase): def test_simple_cache(self): tracks = parse_mpd_tag_cache(data_folder('simple_tag_cache'), data_folder('')) - self.assertEqual(expected_tracks[0], list(tracks)[0]) + uri = path_to_uri(data_folder('song1.mp3')) + track = Track(name='trackname', artists=expected_artists, track_no=1, + album=expected_albums[0], length=4000, uri=uri, id=0) + self.assertEqual(set([track]), tracks) def test_advanced_cache(self): tracks = parse_mpd_tag_cache(data_folder('advanced_tag_cache'), @@ -187,4 +190,4 @@ class MPDTagCacheToTracksTest(unittest.TestCase): tracks = parse_mpd_tag_cache(data_folder('blank_tag_cache'), data_folder('')) uri = path_to_uri(data_folder('song1.mp3')) - self.assertEqual(set([Track(uri=uri, length=4000)]), tracks) + self.assertEqual(set([Track(uri=uri, length=4000, id=0)]), tracks)