From efc9fc75b5e6179d9712653c15aeb6f67b753174 Mon Sep 17 00:00:00 2001 From: Lasse Bigum Date: Thu, 31 Oct 2013 21:45:02 +0100 Subject: [PATCH 1/2] Fix track_no --- mopidy/backends/local/library.py | 22 ++++++++++------------ tests/backends/local/library_test.py | 14 +++++++------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index 2ff0e6d1..2a56098d 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -60,10 +60,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider): values = [values] # FIXME this is bound to be slow for large libraries for value in values: - if field == 'track_no': - q = value - else: - q = value.strip() + q = value.strip() uri_filter = lambda t: q == t.uri track_filter = lambda t: q == t.name @@ -73,7 +70,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider): albumartist_filter = lambda t: any([ q == a.name for a in getattr(t.album, 'artists', [])]) - track_no_filter = lambda t: q == t.track_no + track_no_filter = lambda t: int(q) == t.track_no date_filter = lambda t: q == t.date any_filter = lambda t: ( uri_filter(t) or @@ -81,7 +78,6 @@ class LocalLibraryProvider(base.BaseLibraryProvider): album_filter(t) or artist_filter(t) or albumartist_filter(t) or - track_no_filter(t) or date_filter(t)) if field == 'uri': @@ -92,8 +88,14 @@ class LocalLibraryProvider(base.BaseLibraryProvider): result_tracks = filter(album_filter, result_tracks) elif field == 'artist': result_tracks = filter(artist_filter, result_tracks) + #import logging + #logger = logging.getLogger('mopidy.backends.local') + #logger.debug("==find_exact=artist - q: {} - tracks: {}".format(q, result_tracks)) elif field == 'albumartist': result_tracks = filter(albumartist_filter, result_tracks) + #import logging + #logger = logging.getLogger('mopidy.backends.local') + #logger.debug("==find_exact=albumartist - q: {} - tracks: {}".format(q, result_tracks)) elif field == 'track_no': result_tracks = filter(track_no_filter, result_tracks) elif field == 'date': @@ -118,10 +120,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider): values = [values] # FIXME this is bound to be slow for large libraries for value in values: - if field == 'track_no': - q = value - else: - q = value.strip().lower() + q = value.strip().lower() uri_filter = lambda t: q in t.uri.lower() track_filter = lambda t: q in t.name.lower() @@ -132,7 +131,7 @@ 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 + track_no_filter = lambda t: int(q) == t.track_no date_filter = lambda t: t.date and t.date.startswith(q) any_filter = lambda t: ( uri_filter(t) or @@ -140,7 +139,6 @@ class LocalLibraryProvider(base.BaseLibraryProvider): album_filter(t) or artist_filter(t) or albumartist_filter(t) or - track_no_filter(t) or date_filter(t)) if field == 'uri': diff --git a/tests/backends/local/library_test.py b/tests/backends/local/library_test.py index 1cb07451..9067c134 100644 --- a/tests/backends/local/library_test.py +++ b/tests/backends/local/library_test.py @@ -114,7 +114,7 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.find_exact(date=['1990']) self.assertEqual(list(result[0].tracks), []) - result = self.library.find_exact(track_no=[9]) + result = self.library.find_exact(track_no=['9']) self.assertEqual(list(result[0].tracks), []) result = self.library.find_exact(uri=['fake uri']) @@ -167,10 +167,10 @@ class LocalLibraryProviderTest(unittest.TestCase): self.assertEqual(list(result[0].tracks), [self.tracks[2]]) def test_find_exact_track_no(self): - result = self.library.find_exact(track_no=[1]) + 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]) + result = self.library.find_exact(track_no=['2']) self.assertEqual(list(result[0].tracks), self.tracks[1:2]) def test_find_exact_date(self): @@ -228,7 +228,7 @@ class LocalLibraryProviderTest(unittest.TestCase): test = lambda: self.library.find_exact(album=['']) self.assertRaises(LookupError, test) - test = lambda: self.library.find_exact(track_no=[]) + test = lambda: self.library.find_exact(track_no=['']) self.assertRaises(LookupError, test) test = lambda: self.library.find_exact(date=['']) @@ -247,7 +247,7 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.search(album=['unknown artist']) self.assertEqual(list(result[0].tracks), []) - result = self.library.search(track_no=[9]) + result = self.library.search(track_no=['9']) self.assertEqual(list(result[0].tracks), []) result = self.library.search(date=['unknown date']) @@ -314,10 +314,10 @@ class LocalLibraryProviderTest(unittest.TestCase): self.assertEqual(list(result[0].tracks), self.tracks[1:2]) def test_search_track_no(self): - result = self.library.search(track_no=[1]) + result = self.library.search(track_no=['1']) self.assertEqual(list(result[0].tracks), self.tracks[:1]) - result = self.library.search(track_no=[2]) + result = self.library.search(track_no=['2']) self.assertEqual(list(result[0].tracks), self.tracks[1:2]) def test_search_any(self): From e7746dac1b5d6a536755cad32e0a2a277f207217 Mon Sep 17 00:00:00 2001 From: Lasse Bigum Date: Sat, 2 Nov 2013 03:25:57 +0100 Subject: [PATCH 2/2] Remove debug, make track_no more robust --- mopidy/backends/local/library.py | 26 ++++++++++++++++---------- tests/backends/local/library_test.py | 6 ++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index 2a56098d..d2af41fc 100644 --- a/mopidy/backends/local/library.py +++ b/mopidy/backends/local/library.py @@ -21,6 +21,12 @@ class LocalLibraryProvider(base.BaseLibraryProvider): self._tag_cache_file = self.backend.config['local']['tag_cache_file'] self.refresh() + def _convert_to_int(self, string): + try: + return int(string) + except ValueError: + return object() + def refresh(self, uri=None): logger.debug( 'Loading local tracks from %s using %s', @@ -60,7 +66,10 @@ 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 = self._convert_to_int(value) + else: + q = value.strip() uri_filter = lambda t: q == t.uri track_filter = lambda t: q == t.name @@ -70,7 +79,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider): albumartist_filter = lambda t: any([ q == a.name for a in getattr(t.album, 'artists', [])]) - track_no_filter = lambda t: int(q) == t.track_no + track_no_filter = lambda t: q == t.track_no date_filter = lambda t: q == t.date any_filter = lambda t: ( uri_filter(t) or @@ -88,14 +97,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider): result_tracks = filter(album_filter, result_tracks) elif field == 'artist': result_tracks = filter(artist_filter, result_tracks) - #import logging - #logger = logging.getLogger('mopidy.backends.local') - #logger.debug("==find_exact=artist - q: {} - tracks: {}".format(q, result_tracks)) elif field == 'albumartist': result_tracks = filter(albumartist_filter, result_tracks) - #import logging - #logger = logging.getLogger('mopidy.backends.local') - #logger.debug("==find_exact=albumartist - q: {} - tracks: {}".format(q, result_tracks)) elif field == 'track_no': result_tracks = filter(track_no_filter, result_tracks) elif field == 'date': @@ -120,7 +123,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 = self._convert_to_int(value) + else: + q = value.strip().lower() uri_filter = lambda t: q in t.uri.lower() track_filter = lambda t: q in t.name.lower() @@ -131,7 +137,7 @@ 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: int(q) == t.track_no + track_no_filter = lambda t: q == t.track_no date_filter = lambda t: t.date and t.date.startswith(q) any_filter = lambda t: ( uri_filter(t) or diff --git a/tests/backends/local/library_test.py b/tests/backends/local/library_test.py index 9067c134..061895d8 100644 --- a/tests/backends/local/library_test.py +++ b/tests/backends/local/library_test.py @@ -117,6 +117,9 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.find_exact(track_no=['9']) self.assertEqual(list(result[0].tracks), []) + result = self.library.find_exact(track_no=['no_match']) + self.assertEqual(list(result[0].tracks), []) + result = self.library.find_exact(uri=['fake uri']) self.assertEqual(list(result[0].tracks), []) @@ -250,6 +253,9 @@ class LocalLibraryProviderTest(unittest.TestCase): result = self.library.search(track_no=['9']) self.assertEqual(list(result[0].tracks), []) + result = self.library.search(track_no=['no_match']) + self.assertEqual(list(result[0].tracks), []) + result = self.library.search(date=['unknown date']) self.assertEqual(list(result[0].tracks), [])