diff --git a/mopidy/backends/local/library.py b/mopidy/backends/local/library.py index 2ff0e6d1..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', @@ -61,7 +67,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider): # FIXME this is bound to be slow for large libraries for value in values: if field == 'track_no': - q = value + q = self._convert_to_int(value) else: q = value.strip() @@ -81,7 +87,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': @@ -119,7 +124,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider): # FIXME this is bound to be slow for large libraries for value in values: if field == 'track_no': - q = value + q = self._convert_to_int(value) else: q = value.strip().lower() @@ -140,7 +145,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..061895d8 100644 --- a/tests/backends/local/library_test.py +++ b/tests/backends/local/library_test.py @@ -114,7 +114,10 @@ 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(track_no=['no_match']) self.assertEqual(list(result[0].tracks), []) result = self.library.find_exact(uri=['fake uri']) @@ -167,10 +170,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 +231,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 +250,10 @@ 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(track_no=['no_match']) self.assertEqual(list(result[0].tracks), []) result = self.library.search(date=['unknown date']) @@ -314,10 +320,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):