Changed track to track_no, fix code, add tests

Added testcases for track and count
This commit is contained in:
Lasse Bigum 2013-10-13 13:28:13 +02:00 committed by Lasse Bigum
parent df32e7fcd0
commit 1975694d08
6 changed files with 127 additions and 12 deletions

View File

@ -55,23 +55,28 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
values = [values] values = [values]
# FIXME this is bound to be slow for large libraries # FIXME this is bound to be slow for large libraries
for value in values: for value in values:
q = value.strip() if field != 'track_no':
q = value.strip()
else:
q = value
uri_filter = lambda t: q == t.uri uri_filter = lambda t: q == t.uri
track_filter = lambda t: q == int(t.track_no) \ track_filter = lambda t: q == t.name
if t.track_no.isdigit() else None
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)
albumartist_filter = lambda t: any([ albumartist_filter = lambda t: any([
q == a.name q == a.name
for a in getattr(t.album, 'artists', [])]) for a in getattr(t.album, 'artists', [])])
track_no_filter = lambda t: q == t.track_no
date_filter = lambda t: q == t.date date_filter = lambda t: q == t.date
any_filter = lambda t: ( any_filter = lambda t: (
track_filter(t) or track_filter(t) or
album_filter(t) or album_filter(t) or
artist_filter(t) or artist_filter(t) or
albumartist_filter(t) or albumartist_filter(t) or
track_no_filter(t) or
date_filter(t)) or
uri_filter(t)) uri_filter(t))
if field == 'uri': if field == 'uri':
@ -86,6 +91,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
result_tracks = filter(albumartist_filter, result_tracks) result_tracks = filter(albumartist_filter, result_tracks)
elif field == 'date': elif field == 'date':
result_tracks = filter(date_filter, result_tracks) result_tracks = filter(date_filter, result_tracks)
elif field == 'track_no':
result_tracks = filter(track_no_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:
@ -106,7 +113,10 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
values = [values] values = [values]
# FIXME this is bound to be slow for large libraries # FIXME this is bound to be slow for large libraries
for value in values: 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() uri_filter = lambda t: q in t.uri.lower()
track_filter = lambda t: q in t.name.lower() track_filter = lambda t: q in t.name.lower()
@ -117,12 +127,15 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
albumartist_filter = lambda t: any([ albumartist_filter = lambda t: any([
q in a.name.lower() q in a.name.lower()
for a in getattr(t.album, 'artists', [])]) 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) date_filter = lambda t: t.date and t.date.startswith(q)
any_filter = lambda t: ( any_filter = lambda t: (
track_filter(t) or track_filter(t) or
album_filter(t) or album_filter(t) or
artist_filter(t) or artist_filter(t) or
albumartist_filter(t) or albumartist_filter(t) or
track_no_filter(t) or
date_filter(t)) or
uri_filter(t)) uri_filter(t))
if field == 'uri': if field == 'uri':
@ -137,6 +150,8 @@ class LocalLibraryProvider(base.BaseLibraryProvider):
result_tracks = filter(albumartist_filter, result_tracks) result_tracks = filter(albumartist_filter, result_tracks)
elif field == 'date': elif field == 'date':
result_tracks = filter(date_filter, result_tracks) result_tracks = filter(date_filter, result_tracks)
elif field == 'track_no':
result_tracks = filter(track_no_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

@ -59,8 +59,6 @@ def count(context, mpd_query):
except ValueError: except ValueError:
return return
results = context.core.library.find_exact(**query).get() results = context.core.library.find_exact(**query).get()
result_tracks = []
result_tracks = _get_tracks(results) result_tracks = _get_tracks(results)
return [('songs', len(result_tracks)), return [('songs', len(result_tracks)),
('playtime', sum(track.length for track in result_tracks) / 1000)] ('playtime', sum(track.length for track in result_tracks) / 1000)]

View File

@ -202,6 +202,8 @@ def query_from_mpd_search_format(mpd_query):
field = m.groupdict()['field'].lower() field = m.groupdict()['field'].lower()
if field == 'title': if field == 'title':
field = 'track' field = 'track'
if field == 'track':
field = 'track_no'
elif field in ('file', 'filename'): elif field in ('file', 'filename'):
field = 'uri' field = 'uri'
field = str(field) # Needed for kwargs keys on OS X and Windows field = str(field) # Needed for kwargs keys on OS X and Windows

View File

@ -29,15 +29,15 @@ class LocalLibraryProviderTest(unittest.TestCase):
Track( Track(
uri='local:track:path1', name='track1', uri='local:track:path1', name='track1',
artists=[artists[0]], album=albums[0], artists=[artists[0]], album=albums[0],
date='2001-02-03', length=4000), date='2001-02-03', length=4000, track_no=1),
Track( Track(
uri='local:track:path2', name='track2', uri='local:track:path2', name='track2',
artists=[artists[1]], album=albums[1], artists=[artists[1]], album=albums[1],
date='2002', length=4000), date='2002', length=4000, track_no=2),
Track( Track(
uri='local:track:path3', name='track3', uri='local:track:path3', name='track3',
artists=[artists[3]], album=albums[2], artists=[artists[3]], album=albums[2],
date='2003', length=4000), date='2003', length=4000, track_no=3),
] ]
config = { config = {
@ -87,6 +87,18 @@ class LocalLibraryProviderTest(unittest.TestCase):
result = self.library.find_exact(album=['unknown artist']) result = self.library.find_exact(album=['unknown artist'])
self.assertEqual(list(result[0].tracks), []) 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): def test_find_exact_uri(self):
track_1_uri = 'local:track:path1' track_1_uri = 'local:track:path1'
result = self.library.find_exact(uri=track_1_uri) 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) result = self.library.find_exact(uri=track_2_uri)
self.assertEqual(list(result[0].tracks), self.tracks[1:2]) 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): def test_find_exact_track(self):
result = self.library.find_exact(track=['track1']) result = self.library.find_exact(track=['track1'])
self.assertEqual(list(result[0].tracks), self.tracks[:1]) self.assertEqual(list(result[0].tracks), self.tracks[:1])
@ -130,6 +158,13 @@ class LocalLibraryProviderTest(unittest.TestCase):
result = self.library.find_exact(albumartist=['artist3']) result = self.library.find_exact(albumartist=['artist3'])
self.assertEqual(list(result[0].tracks), [self.tracks[2]]) 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): def test_find_exact_date(self):
result = self.library.find_exact(date=['2001']) result = self.library.find_exact(date=['2001'])
self.assertEqual(list(result[0].tracks), []) self.assertEqual(list(result[0].tracks), [])
@ -175,16 +210,28 @@ class LocalLibraryProviderTest(unittest.TestCase):
test = lambda: self.library.find_exact(album=['']) test = lambda: self.library.find_exact(album=[''])
self.assertRaises(LookupError, test) self.assertRaises(LookupError, test)
def test_search_no_hits(self): test = lambda: self.library.find_exact(track_no=[])
result = self.library.search(track=['unknown track']) self.assertRaises(LookupError, test)
self.assertEqual(list(result[0].tracks), [])
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']) result = self.library.search(artist=['unknown artist'])
self.assertEqual(list(result[0].tracks), []) self.assertEqual(list(result[0].tracks), [])
result = self.library.search(album=['unknown artist']) result = self.library.search(album=['unknown artist'])
self.assertEqual(list(result[0].tracks), []) 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']) result = self.library.search(uri=['unknown'])
self.assertEqual(list(result[0].tracks), []) self.assertEqual(list(result[0].tracks), [])
@ -245,6 +292,13 @@ class LocalLibraryProviderTest(unittest.TestCase):
result = self.library.search(date=['2002']) result = self.library.search(date=['2002'])
self.assertEqual(list(result[0].tracks), self.tracks[1:2]) 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): def test_search_any(self):
# Matches on track artist # Matches on track artist
result = self.library.search(any=['Tist1']) result = self.library.search(any=['Tist1'])
@ -254,6 +308,9 @@ class LocalLibraryProviderTest(unittest.TestCase):
result = self.library.search(any=['Rack1']) result = self.library.search(any=['Rack1'])
self.assertEqual(list(result[0].tracks), self.tracks[:1]) 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 # Matches on track album
result = self.library.search(any=['Bum1']) result = self.library.search(any=['Bum1'])
self.assertEqual(list(result[0].tracks), self.tracks[:1]) self.assertEqual(list(result[0].tracks), self.tracks[:1])
@ -280,6 +337,9 @@ class LocalLibraryProviderTest(unittest.TestCase):
test = lambda: self.library.search(album=['']) test = lambda: self.library.search(album=[''])
self.assertRaises(LookupError, test) self.assertRaises(LookupError, test)
test = lambda: self.library.search(date=[''])
self.assertRaises(LookupError, test)
test = lambda: self.library.search(uri=['']) test = lambda: self.library.search(uri=[''])
self.assertRaises(LookupError, test) self.assertRaises(LookupError, test)

View File

@ -9,6 +9,7 @@ Artist: artist1
Title: track1 Title: track1
Album: album1 Album: album1
Date: 2001-02-03 Date: 2001-02-03
Track: 1
Time: 4 Time: 4
key: key2 key: key2
file: /path2 file: /path2
@ -16,6 +17,7 @@ Artist: artist2
Title: track2 Title: track2
Album: album2 Album: album2
Date: 2002 Date: 2002
Track: 2
Time: 4 Time: 4
key: key3 key: key3
file: /path3 file: /path3
@ -24,5 +26,6 @@ AlbumArtist: artist3
Title: track3 Title: track3
Album: album3 Album: album3
Date: 2003 Date: 2003
Track: 3
Time: 4 Time: 4
songList end songList end

View File

@ -24,6 +24,23 @@ class MusicDatabaseHandlerTest(protocol.BaseTestCase):
self.assertInResponse('playtime: 0') self.assertInResponse('playtime: 0')
self.assertInResponse('OK') 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): def test_findadd(self):
self.backend.library.dummy_find_exact_result = SearchResult( self.backend.library.dummy_find_exact_result = SearchResult(
tracks=[Track(uri='dummy:a', name='A')]) tracks=[Track(uri='dummy:a', name='A')])
@ -235,6 +252,14 @@ class MusicDatabaseFindTest(protocol.BaseTestCase):
self.sendRequest('find title "what"') self.sendRequest('find title "what"')
self.assertInResponse('OK') 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): def test_find_date(self):
self.sendRequest('find "date" "2002-01-01"') self.sendRequest('find "date" "2002-01-01"')
self.assertInResponse('OK') self.assertInResponse('OK')
@ -593,6 +618,18 @@ class MusicDatabaseSearchTest(protocol.BaseTestCase):
self.sendRequest('search "any" ""') self.sendRequest('search "any" ""')
self.assertInResponse('OK') 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): def test_search_date(self):
self.sendRequest('search "date" "2002-01-01"') self.sendRequest('search "date" "2002-01-01"')
self.assertInResponse('OK') self.assertInResponse('OK')