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]
# FIXME this is bound to be slow for large libraries
for value in values:
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:
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:

View File

@ -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)]

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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')