Changed track to track_no, fix code, add tests
Added testcases for track and count
This commit is contained in:
parent
df32e7fcd0
commit
1975694d08
@ -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:
|
||||||
|
|||||||
@ -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)]
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user