curds: Improve extracting ints from mutagen metadata

Some tracks in my library aren't formatted as expected, so let's improve
our parsing code to better handle integers.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2019-03-14 16:59:43 -04:00
parent 31d7ae26fa
commit 414545818f
5 changed files with 25 additions and 6 deletions

View File

@ -50,5 +50,5 @@ class TestPlaylistManager(unittest.TestCase):
library.library_thread.join()
self.assertEqual(len(plist), 1250)
self.assertEqual(len(alist), 11)
self.assertEqual(len(alist), 12)
self.assertEqual(len(playman["Collection"]), len(alist) + len(plist))

View File

@ -12,6 +12,10 @@ class Tag:
def extract(info, key, default):
return info.get(key, [ default ])[0]
def extract_int(info, key, default):
match = re.match("\d+", Tag.extract(info, key, default))
return int(match.group(0)) if match else int(default)
def lookup(tag, cb):
ret = tag_map.setdefault(hash(tag), tag)
if ret == tag:
@ -23,8 +27,8 @@ class Album(Tag):
def __init__(self, info):
self.album = Tag.extract(info, "album", "Unknown Album")
self.genre = Tag.extract(info, "genre", "Unknown")
self.date = int(Tag.extract(info, "date", 0))
self.tracktotal = int(Tag.extract(info, "tracktotal", 0))
self.date = Tag.extract_int(info, "date", "0")
self.tracktotal = Tag.extract_int(info, "tracktotal", "0")
self.albumartist = Tag.extract(info, "albumartist",
Tag.extract(info, "album artist",
Tag.extract(info, "artist", "Unknown Artist")))
@ -48,8 +52,8 @@ class Track(Tag):
self.path = path
self.title = Tag.extract(info, "title", os.path.basename(path))
self.artist = Tag.extract(info, "artist", "Unknown Artist")
self.tracknumber = int(Tag.extract(info, "tracknumber", 0))
self.discnumber = int(Tag.extract(info, "discnumber", 1))
self.tracknumber = Tag.extract_int(info, "tracknumber", "0")
self.discnumber = Tag.extract_int(info, "discnumber", "1")
self.length = info.info.length
self.album = Album.lookup(info)
@ -61,7 +65,7 @@ class Track(Tag):
def __getitem__(self, key):
item = vars(self).get(key)
if not item or item == self.album:
if item == None or item == self.album:
item = vars(self.album).get(key)
return item

View File

@ -42,6 +42,11 @@ class TestAlbumTag(unittest.TestCase):
test_info.pop("artist")
self.assertEqual(tags.Album(test_info).albumartist, "Unknown Artist")
def test_album_init_extra(self):
a = tags.Album({"date" : [ "2019-03-14" ], "tracktotal" : [ "10.2" ]})
self.assertEqual(a.date, 2019)
self.assertEqual(a.tracktotal, 10)
def test_album_discno_detect(self):
self.assertEqual(tags.Album({"album" : [ "Test Album {Disc 1}" ]}).album, "Test Album")
self.assertEqual(tags.Album({"album" : [ "Test Album [Disk One]" ]}).album, "Test Album")

View File

@ -44,6 +44,12 @@ class TestTrackTag(unittest.TestCase):
self.assertEqual(t.album.albumartist, "Unknown Artist")
self.assertEqual(hash(t), hash((hash(t.album), "00 - Empty Track.ogg", "Unknown Artist", 0, 1)))
def test_track_init_extra(self):
p = [ test_tracks, "11 - Test Track 11.ogg" ]
t = tags.Track(os.path.join(*p))
self.assertEqual(t.tracknumber, 11)
self.assertEqual(t.discnumber, 1)
def test_track_discno_detect(self):
join = os.path.join
self.assertEqual(tags.Track(join(test_tracks, "02 - Test {Disc 2}.ogg")).discnumber, 2)

View File

@ -46,6 +46,10 @@ generate_track(50, "Test Album/09 - Test {Disc 02}.ogg", { "Title" : "Test {Disc
"album" : "Test Album {Disc 02}" })
generate_track(55, "Test Album/10 - Test {Disc 20}.ogg", { "Title" : "Test {Disc 20}",
"album" : "Test Album {Disc 20}" })
generate_track(60, "Test Album/11 - Test Track 11.ogg", { "Title" : "Test Track 11",
"album" : "Test Album 11",
"discnumber" : "1/1",
"tracknumber" : "11/100" })
# Create a giant library for testing
for artistno in range(1, 26):