local: Add search-by-date support

This commit is contained in:
Stein Magnus Jodal 2012-12-20 21:28:36 +01:00
parent 53f3ef488c
commit 02c8ea53d7
4 changed files with 38 additions and 4 deletions

View File

@ -28,6 +28,8 @@ v0.11.0 (in development)
- Load track dates from tag cache. - Load track dates from tag cache.
- Add support for searching by track date.
**MPD frontend** **MPD frontend**
- Add :attr:`mopidy.settings.MPD_SERVER_CONNECTION_TIMEOUT` setting which - Add :attr:`mopidy.settings.MPD_SERVER_CONNECTION_TIMEOUT` setting which

View File

@ -51,6 +51,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
album_filter = lambda t: q == getattr(t, 'album', Album()).name album_filter = lambda t: q == getattr(t, 'album', Album()).name
artist_filter = lambda t: filter( artist_filter = lambda t: filter(
lambda a: q == a.name, t.artists) lambda a: q == a.name, t.artists)
date_filter = lambda t: q == t.date
any_filter = lambda t: ( any_filter = lambda t: (
track_filter(t) or album_filter(t) or track_filter(t) or album_filter(t) or
artist_filter(t) or uri_filter(t)) artist_filter(t) or uri_filter(t))
@ -63,6 +64,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
result_tracks = filter(album_filter, result_tracks) result_tracks = filter(album_filter, result_tracks)
elif field == 'artist': elif field == 'artist':
result_tracks = filter(artist_filter, result_tracks) result_tracks = filter(artist_filter, result_tracks)
elif field == 'date':
result_tracks = filter(date_filter, result_tracks)
elif field == 'any': elif field == 'any':
result_tracks = filter(any_filter, result_tracks) result_tracks = filter(any_filter, result_tracks)
else: else:
@ -86,6 +89,7 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
t, 'album', Album()).name.lower() t, 'album', Album()).name.lower()
artist_filter = lambda t: filter( artist_filter = lambda t: filter(
lambda a: q in a.name.lower(), t.artists) lambda a: q in a.name.lower(), t.artists)
date_filter = lambda t: t.date and t.date.startswith(q)
any_filter = lambda t: track_filter(t) or album_filter(t) or \ any_filter = lambda t: track_filter(t) or album_filter(t) or \
artist_filter(t) or uri_filter(t) artist_filter(t) or uri_filter(t)
@ -97,6 +101,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
result_tracks = filter(album_filter, result_tracks) result_tracks = filter(album_filter, result_tracks)
elif field == 'artist': elif field == 'artist':
result_tracks = filter(artist_filter, result_tracks) result_tracks = filter(artist_filter, result_tracks)
elif field == 'date':
result_tracks = filter(date_filter, result_tracks)
elif field == 'any': elif field == 'any':
result_tracks = filter(any_filter, result_tracks) result_tracks = filter(any_filter, result_tracks)
else: else:

View File

@ -16,11 +16,12 @@ class LibraryControllerTest(object):
Album()] Album()]
tracks = [ tracks = [
Track( Track(
name='track1', length=4000, artists=artists[:1], uri='file://' + path_to_data_dir('uri1'), name='track1',
album=albums[0], uri='file://' + path_to_data_dir('uri1')), artists=artists[:1], album=albums[0], date='2001-02-03',
length=4000),
Track( Track(
name='track2', length=4000, artists=artists[1:2], uri='file://' + path_to_data_dir('uri2'), name='track2',
album=albums[1], uri='file://' + path_to_data_dir('uri2')), artists=artists[1:2], album=albums[1], date='2002', length=4000),
Track()] Track()]
def setUp(self): def setUp(self):
@ -90,6 +91,16 @@ class LibraryControllerTest(object):
result = self.library.find_exact(album=['album2']) result = self.library.find_exact(album=['album2'])
self.assertEqual(result, self.tracks[1:2]) self.assertEqual(result, self.tracks[1:2])
def test_find_exact_date(self):
result = self.library.find_exact(date=['2001'])
self.assertEqual(result, [])
result = self.library.find_exact(date=['2001-02-03'])
self.assertEqual(result, self.tracks[:1])
result = self.library.find_exact(date=['2002'])
self.assertEqual(result, self.tracks[1:2])
def test_find_exact_wrong_type(self): def test_find_exact_wrong_type(self):
test = lambda: self.library.find_exact(wrong=['test']) test = lambda: self.library.find_exact(wrong=['test'])
self.assertRaises(LookupError, test) self.assertRaises(LookupError, test)
@ -148,6 +159,19 @@ class LibraryControllerTest(object):
result = self.library.search(album=['Bum2']) result = self.library.search(album=['Bum2'])
self.assertEqual(result, self.tracks[1:2]) self.assertEqual(result, self.tracks[1:2])
def test_search_date(self):
result = self.library.search(date=['2001'])
self.assertEqual(result, self.tracks[:1])
result = self.library.search(date=['2001-02-03'])
self.assertEqual(result, self.tracks[:1])
result = self.library.search(date=['2001-02-04'])
self.assertEqual(result, [])
result = self.library.search(date=['2002'])
self.assertEqual(result, self.tracks[1:2])
def test_search_any(self): def test_search_any(self):
result = self.library.search(any=['Tist1']) result = self.library.search(any=['Tist1'])
self.assertEqual(result, self.tracks[:1]) self.assertEqual(result, self.tracks[:1])

View File

@ -8,12 +8,14 @@ file: /uri1
Artist: artist1 Artist: artist1
Title: track1 Title: track1
Album: album1 Album: album1
Date: 2001-02-03
Time: 4 Time: 4
key: uri2 key: uri2
file: /uri2 file: /uri2
Artist: artist2 Artist: artist2
Title: track2 Title: track2
Album: album2 Album: album2
Date: 2002
Time: 4 Time: 4
key: uri3 key: uri3
file: /uri3 file: /uri3