From 1975694d08f9367bc82e70ee37b859dc738b8370 Mon Sep 17 00:00:00 2001 From: Lasse Bigum Date: Sun, 13 Oct 2013 13:28:13 +0200 Subject: [PATCH] Changed track to track_no, fix code, add tests Added testcases for track and count --- mopidy/backends/local/library.py | 23 ++++-- mopidy/frontends/mpd/protocol/music_db.py | 2 - mopidy/frontends/mpd/translator.py | 2 + tests/backends/local/library_test.py | 72 +++++++++++++++++-- tests/data/library_tag_cache | 3 + tests/frontends/mpd/protocol/music_db_test.py | 37 ++++++++++ 6 files changed, 127 insertions(+), 12 deletions(-) diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index 73b4bf50..bec5b0d0 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -55,23 +55,28 @@ class LocalLibraryProvider(base.BaseLibraryProvider): values = [values] # FIXME this is bound to be slow for large libraries for value in values: - q = value.strip() + if field != 'track_no': + q = value.strip() + else: + q = value uri_filter = lambda t: q == t.uri - track_filter = lambda t: q == int(t.track_no) \ - if t.track_no.isdigit() else None + track_filter = lambda t: q == t.name album_filter = lambda t: q == getattr(t, 'album', Album()).name artist_filter = lambda t: filter( lambda a: q == a.name, t.artists) albumartist_filter = lambda t: any([ q == a.name for a in getattr(t.album, 'artists', [])]) + track_no_filter = lambda t: q == t.track_no date_filter = lambda t: q == t.date any_filter = lambda t: ( track_filter(t) or album_filter(t) or artist_filter(t) or albumartist_filter(t) or + track_no_filter(t) or + date_filter(t)) or uri_filter(t)) if field == 'uri': @@ -86,6 +91,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider): result_tracks = filter(albumartist_filter, result_tracks) elif field == 'date': result_tracks = filter(date_filter, result_tracks) + elif field == 'track_no': + result_tracks = filter(track_no_filter, result_tracks) elif field == 'any': result_tracks = filter(any_filter, result_tracks) else: @@ -106,7 +113,10 @@ class LocalLibraryProvider(base.BaseLibraryProvider): values = [values] # FIXME this is bound to be slow for large libraries for value in values: - q = value.strip().lower() + if field != 'track_no': + q = value.strip().lower() + else: + q = value uri_filter = lambda t: q in t.uri.lower() track_filter = lambda t: q in t.name.lower() @@ -117,12 +127,15 @@ class LocalLibraryProvider(base.BaseLibraryProvider): albumartist_filter = lambda t: any([ q in a.name.lower() for a in getattr(t.album, 'artists', [])]) + track_no_filter = lambda t: q == t.track_no date_filter = lambda t: t.date and t.date.startswith(q) any_filter = lambda t: ( track_filter(t) or album_filter(t) or artist_filter(t) or albumartist_filter(t) or + track_no_filter(t) or + date_filter(t)) or uri_filter(t)) if field == 'uri': @@ -137,6 +150,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider): result_tracks = filter(albumartist_filter, result_tracks) elif field == 'date': result_tracks = filter(date_filter, result_tracks) + elif field == 'track_no': + result_tracks = filter(track_no_filter, result_tracks) elif field == 'any': result_tracks = filter(any_filter, result_tracks) else: diff --git a/mopidy/frontends/mpd/protocol/music_db.py b/mopidy/frontends/mpd/protocol/music_db.py index 20d53a94..3f4d460f 100644 --- a/mopidy/frontends/mpd/protocol/music_db.py +++ b/mopidy/frontends/mpd/protocol/music_db.py @@ -59,8 +59,6 @@ def count(context, mpd_query): except ValueError: return results = context.core.library.find_exact(**query).get() - result_tracks = [] - result_tracks = _get_tracks(results) return [('songs', len(result_tracks)), ('playtime', sum(track.length for track in result_tracks) / 1000)] diff --git a/mopidy/frontends/mpd/translator.py b/mopidy/frontends/mpd/translator.py index 8f70320d..ec6dec4b 100644 --- a/mopidy/frontends/mpd/translator.py +++ b/mopidy/frontends/mpd/translator.py @@ -202,6 +202,8 @@ def query_from_mpd_search_format(mpd_query): field = m.groupdict()['field'].lower() if field == 'title': field = 'track' + if field == 'track': + field = 'track_no' elif field in ('file', 'filename'): field = 'uri' field = str(field) # Needed for kwargs keys on OS X and Windows diff --git a/tests/backends/local/library_test.py b/tests/backends/local/library_test.py index 6b0cd6f6..7077e65c 100644 --- a/tests/backends/local/library_test.py +++ b/tests/backends/local/library_test.py @@ -29,15 +29,15 @@ class LocalLibraryProviderTest(unittest.TestCase): Track( uri='local:track:path1', name='track1', artists=[artists[0]], album=albums[0], - date='2001-02-03', length=4000), + date='2001-02-03', length=4000, track_no=1), Track( uri='local:track:path2', name='track2', artists=[artists[1]], album=albums[1], - date='2002', length=4000), + date='2002', length=4000, track_no=2), Track( uri='local:track:path3', name='track3', artists=[artists[3]], album=albums[2], - date='2003', length=4000), + date='2003', length=4000, track_no=3), ] config = { @@ -87,6 +87,18 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.find_exact(album=['unknown artist']) self.assertEqual(list(result[0].tracks), []) + result = self.library.find_exact(date=['1990']) + self.assertEqual(list(result[0].tracks), []) + + result = self.library.find_exact(track_no=[9]) + self.assertEqual(list(result[0].tracks), []) + + result = self.library.find_exact(uri=['fake uri']) + self.assertEqual(list(result[0].tracks), []) + + result = self.library.find_exact(any=['unknown any']) + self.assertEqual(list(result[0].tracks), []) + def test_find_exact_uri(self): track_1_uri = 'local:track:path1' result = self.library.find_exact(uri=track_1_uri) @@ -96,6 +108,22 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.find_exact(uri=track_2_uri) self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + def test_find_exact_any(self): + result = self.library.find_exact(any=['track1']) + self.assertEqual(list(result[0].tracks), self.tracks[:1]) + + result = self.library.find_exact(any=['track2']) + self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + + result = self.library.find_exact(any=['2002']) + self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + + result = self.library.find_exact(any=['album1']) + self.assertEqual(list(result[0].tracks), self.tracks[:1]) + + result = self.library.find_exact(any=['artist2']) + self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + def test_find_exact_track(self): result = self.library.find_exact(track=['track1']) self.assertEqual(list(result[0].tracks), self.tracks[:1]) @@ -130,6 +158,13 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.find_exact(albumartist=['artist3']) self.assertEqual(list(result[0].tracks), [self.tracks[2]]) + def test_find_exact_track_no(self): + result = self.library.find_exact(track_no=[1]) + self.assertEqual(list(result[0].tracks), self.tracks[:1]) + + result = self.library.find_exact(track_no=[2]) + self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + def test_find_exact_date(self): result = self.library.find_exact(date=['2001']) self.assertEqual(list(result[0].tracks), []) @@ -175,16 +210,28 @@ class LocalLibraryProviderTest(unittest.TestCase): test = lambda: self.library.find_exact(album=['']) self.assertRaises(LookupError, test) - def test_search_no_hits(self): - result = self.library.search(track=['unknown track']) - self.assertEqual(list(result[0].tracks), []) + test = lambda: self.library.find_exact(track_no=[]) + self.assertRaises(LookupError, test) + test = lambda: self.library.find_exact(date=['']) + self.assertRaises(LookupError, test) + + test = lambda: self.library.find_exact(any=['']) + self.assertRaises(LookupError, test) + + def test_search_no_hits(self): result = self.library.search(artist=['unknown artist']) self.assertEqual(list(result[0].tracks), []) result = self.library.search(album=['unknown artist']) self.assertEqual(list(result[0].tracks), []) + result = self.library.search(track_no=[9]) + self.assertEqual(list(result[0].tracks), []) + + result = self.library.search(date=['unknown']) + self.assertEqual(list(result[0].tracks), []) + result = self.library.search(uri=['unknown']) self.assertEqual(list(result[0].tracks), []) @@ -245,6 +292,13 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.search(date=['2002']) self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + def test_search_track_no(self): + result = self.library.search(track_no=[1]) + self.assertEqual(list(result[0].tracks), self.tracks[:1]) + + result = self.library.search(track_no=[2]) + self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + def test_search_any(self): # Matches on track artist result = self.library.search(any=['Tist1']) @@ -254,6 +308,9 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.search(any=['Rack1']) self.assertEqual(list(result[0].tracks), self.tracks[:1]) + result = self.library.search(any=['Rack2']) + self.assertEqual(list(result[0].tracks), self.tracks[1:2]) + # Matches on track album result = self.library.search(any=['Bum1']) self.assertEqual(list(result[0].tracks), self.tracks[:1]) @@ -280,6 +337,9 @@ class LocalLibraryProviderTest(unittest.TestCase): test = lambda: self.library.search(album=['']) self.assertRaises(LookupError, test) + test = lambda: self.library.search(date=['']) + self.assertRaises(LookupError, test) + test = lambda: self.library.search(uri=['']) self.assertRaises(LookupError, test) diff --git a/tests/data/library_tag_cache b/tests/data/library_tag_cache index 2272a114..e9e87c1b 100644 --- a/tests/data/library_tag_cache +++ b/tests/data/library_tag_cache @@ -9,6 +9,7 @@ Artist: artist1 Title: track1 Album: album1 Date: 2001-02-03 +Track: 1 Time: 4 key: key2 file: /path2 @@ -16,6 +17,7 @@ Artist: artist2 Title: track2 Album: album2 Date: 2002 +Track: 2 Time: 4 key: key3 file: /path3 @@ -24,5 +26,6 @@ AlbumArtist: artist3 Title: track3 Album: album3 Date: 2003 +Track: 3 Time: 4 songList end diff --git a/tests/frontends/mpd/protocol/music_db_test.py b/tests/frontends/mpd/protocol/music_db_test.py index eaa5da06..203fc020 100644 --- a/tests/frontends/mpd/protocol/music_db_test.py +++ b/tests/frontends/mpd/protocol/music_db_test.py @@ -24,6 +24,23 @@ class MusicDatabaseHandlerTest(protocol.BaseTestCase): self.assertInResponse('playtime: 0') self.assertInResponse('OK') + def test_count_correct_length(self): + self.backend.library.dummy_search_result = SearchResult( + tracks=[Track(name='A', date="2001", length=4000), + Track(name='B', date="2001", length=50000), + Track(name='C', date="2001", length=600000), + Track(name='D', date="2009", length=60000) + ]) + self.sendRequest('count "date" "2009"') + self.assertInResponse('songs: 1') + self.assertInResponse('playtime: 4000') + self.assertInResponse('OK') + + self.sendRequest('count "date" "2001"') + self.assertInResponse('songs: 3') + self.assertInResponse('playtime: 654000') + self.assertInResponse('OK') + def test_findadd(self): self.backend.library.dummy_find_exact_result = SearchResult( tracks=[Track(uri='dummy:a', name='A')]) @@ -235,6 +252,14 @@ class MusicDatabaseFindTest(protocol.BaseTestCase): self.sendRequest('find title "what"') self.assertInResponse('OK') + def test_find_track_no(self): + self.sendRequest('find "track" "what"') + self.assertInResponse('OK') + + def test_find_track_no_without_quotes(self): + self.sendRequest('find track "what"') + self.assertInResponse('OK') + def test_find_date(self): self.sendRequest('find "date" "2002-01-01"') self.assertInResponse('OK') @@ -593,6 +618,18 @@ class MusicDatabaseSearchTest(protocol.BaseTestCase): self.sendRequest('search "any" ""') self.assertInResponse('OK') + def test_search_track_no(self): + self.sendRequest('search "track" "anything"') + self.assertInResponse('OK') + + def test_search_track_no_without_quotes(self): + self.sendRequest('search track "anything"') + self.assertInResponse('OK') + + def test_search_track_no_without_filter_value(self): + self.sendRequest('search "track" ""') + self.assertInResponse('OK') + def test_search_date(self): self.sendRequest('search "date" "2002-01-01"') self.assertInResponse('OK')