curds: Give tracks their own sort_key() function

I'm about to give playlists a sort_key(), so clean up the existing
function first

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-05-31 10:40:36 -04:00
parent 4d5a347cc0
commit 054b9d05c2
4 changed files with 29 additions and 8 deletions

View File

@ -173,13 +173,7 @@ class Playlist(node.PlaylistNode):
return field in self.sort_order
def sort_key(self, track):
ret = [ ]
for field in self.sort_order:
val = track[field]
if isinstance(val, str):
val = ''.join(filter(str.isalnum, val.lower()))
ret.append(val)
return ret
return track.sort_key(self.sort_order)
def track_added(self, index):
if self.visible == True:

View File

@ -365,7 +365,7 @@ class TestPlaylist(unittest.TestCase):
def test_playlist_sort_key(self):
track = self.add_tracks([1])[0]
trackno = track["tracknumber"]
artist = track["artist"].lower().replace(" ", "")
artist = track["artist"].lower()
self.assertEqual(self.plist.sort_key(track), [ ])
self.assertTrue( self.plist.sort("tracknumber"))

View File

@ -4,6 +4,7 @@ from . import notify
import mutagen
import os
import re
import unicodedata
discno_map = { "one" : "1", "two" : "2", "three" : "3", "four" : "4", "five" : "5" }
tag_map = dict()
@ -80,6 +81,20 @@ class Track(Tag):
return None
return Tag.lookup(t, "new-track")
def sort_key(self, fields):
ret = [ ]
for field in fields:
val = self[field]
if isinstance(val, str):
decode = unicodedata.normalize("NFD", val)
val = decode.encode("ascii", "ignore").decode("utf8")
words = val.lower().split()
words = [ ''.join(filter(str.isalnum, w)) for w in words ]
words = [ w for w in words if w not in ["", "a", "the"]]
val = ' '.join(words)
ret.append(val)
return ret
def clear():
tag_map.clear()

View File

@ -100,3 +100,15 @@ class TestTrackTag(unittest.TestCase):
self.assertEqual(t["genre"], "Test")
self.assertEqual(t["albumartist"], "Test Artist")
self.assertIsNone(t["nokey"])
def test_track_sort_key(self):
t = tags.Track.lookup(os.path.join(test_tracks, "01 - Test Track.ogg"))
self.assertEqual(t.sort_key(["title"]), [ "test track" ])
self.assertEqual(t.sort_key(["title", "tracknumber"]), [ "test track", 1 ])
t.title = "The Test - Track!"
self.assertEqual(t.sort_key(["title"]), [ "test track" ])
t.title = "A \"Test\" Track"
self.assertEqual(t.sort_key(["title"]), [ "test track" ])
t.title = "Test Träck 01"
self.assertEqual(t.sort_key(["title"]), [ "test track 01" ])