lib: Give tags support for sort order

Sometimes Musicbrainz will give us an albumsort, artistsort, or
albumartistsort field in the tags. We can use this for sorting sidebar
widgets.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-07-02 08:33:57 -04:00
parent 5c89fc8d85
commit 7190feddb2
2 changed files with 22 additions and 17 deletions

View File

@ -3,8 +3,9 @@ from . import publisher
import threading
class Tag:
def __init__(self, name):
def __init__(self, name, sort=None):
self.name = name
self.sort = sort.lower() if sort else str(name).lower()
self.tracks = [ ]
self.widgets = None
self.lock = threading.Lock()
@ -14,6 +15,7 @@ class Tag:
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"sort" : self.sort,
"tracks" : [ t.trackid for t in self.tracks ] }
def __len__(self):
@ -22,13 +24,14 @@ class Tag:
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):
return self.name < rhs.name
return self.sort < rhs.sort
if self == rhs.parent:
return True
return self.name < rhs.parent.name
return self.sort < rhs.parent.sort
def __setstate__(self, state):
self.name = state["name"]
self.sort = state["sort"]
self.tracks = state["tracks"]
self.widgets = None
self.lock = threading.Lock()
@ -58,22 +61,23 @@ class Tag:
class SuperTag(Tag):
def __init__(self, parent, name):
Tag.__init__(self, name)
def __init__(self, parent, name, sort=None):
Tag.__init__(self, name, sort)
self.parent = parent
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"sort" : self.sort,
"tracks" : [ t.trackid for t in self.tracks ],
"parent" : self.parent }
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):
return self.parent.name < rhs.name
if self.parent == rhs.parent:
return self.name < rhs.name
return self.parent.name < rhs.parent.name
return self.parent.sort < rhs.sort
if self.parent != rhs.parent:
return self.parent < rhs.parent
return self.sort < rhs.sort
def __setstate__(self, state):
Tag.__setstate__(self, state)

View File

@ -19,6 +19,7 @@ class TestTag(unittest.TestCase):
def test_tag_init(self):
t = tag.Tag("test")
self.assertEqual(t.name, "test")
self.assertEqual(t.sort, "test")
self.assertEqual(t.tracks, [ ])
self.assertIsNone(t.widgets)
self.assertIsInstance(t.lock, type(threading.Lock()))
@ -53,13 +54,16 @@ class TestTag(unittest.TestCase):
t.tracks = tracks
state = t.__getstate__()
self.assertEqual(set(state.keys()), set([ "name", "tracks" ]))
self.assertEqual(set(state.keys()), set([ "name", "sort", "tracks" ]))
self.assertEqual(state["name"], "test")
self.assertEqual(state["sort"], "test")
self.assertEqual(state["tracks"], [ 0, 1, 2, 3, 4 ])
state["sort"] = "sort"
t.__dict__.clear()
t.__setstate__(state)
self.assertEqual(t.name, "test")
self.assertEqual(t.sort, "sort")
self.assertEqual(t.tracks, [ 0, 1, 2, 3, 4 ])
self.assertEqual(t.widgets, None)
self.assertIsInstance(t.lock, type(threading.Lock()))
@ -99,7 +103,7 @@ class TestTag(unittest.TestCase):
class TestSuperTag(unittest.TestCase):
def test_super_tag(self):
parent = tag.Tag("parent")
st = tag.SuperTag(parent, "test")
st = tag.SuperTag(parent, "test", "sort")
st.tracks = [ FakeTrack(i) for i in range(5) ]
self.assertIsInstance(st, tag.Tag)
@ -107,17 +111,14 @@ class TestSuperTag(unittest.TestCase):
state = st.__getstate__()
self.assertEqual(state["name"], "test")
self.assertEqual(state["sort"], "sort")
self.assertEqual(state["tracks"], [ 0, 1, 2, 3, 4 ])
self.assertEqual(state["parent"], parent)
st.name = None
st.tracks = [ ]
st.widgets = 12345
st.lock = 67890
st.parent = None
st.__dict__.clear()
st.__setstate__(state)
self.assertEqual(st.name, "test")
self.assertEqual(st.sort, "sort")
self.assertEqual(st.tracks, [ 0, 1, 2, 3, 4 ])
self.assertEqual(st.widgets, None)
self.assertEqual(st.parent, parent)