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:
parent
5c89fc8d85
commit
7190feddb2
22
lib/tag.py
22
lib/tag.py
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue