lib: Create a metadata parsing class

This will help make Track creation a bit easier

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-07-06 15:11:18 -04:00
parent 9fe3867eae
commit d51ee8e0e2
2 changed files with 79 additions and 0 deletions

47
lib/metadata.py Normal file
View File

@ -0,0 +1,47 @@
# Copyright 2021 (c) Anna Schumaker.
import mutagen
import re
class Metadata:
def __init__(self, filepath):
self.path = filepath
self.file = None
def __enter__(self):
self.file = mutagen.File(self.path)
return self
def __exit__(self, exp_type, exp_value, traceback):
self.file = None
return exp_type == None
def album(self):
return self.file.get("album", [ "Unknown Album" ])[0]
def artist(self):
artist = self.file.get("artist", [ "Unknown Artist" ])
return self.file.get("albumartist", artist)[0]
def decade(self):
return (self.year() // 10) * 10
def discnumber(self):
return int(self.file.get("discnumber", [ 1 ])[0])
def genres(self):
genre = self.file.get("genre", [ "" ])[0]
return [ g.strip() for g in re.split(",|;|/|:", genre) ]
def length(self):
return int(self.file.info.length)
def title(self):
return self.file.get("title", [ "" ])[0]
def tracknumber(self):
return int(self.file.get("tracknumber", [ 0 ])[0])
def year(self):
year = self.file.get("date", [ "0" ])
year = self.file.get("originalyear", year)[0]
return int(re.match("\d+", year).group(0))

32
lib/test_metadata.py Normal file
View File

@ -0,0 +1,32 @@
# Copyright 2021 (c) Anna Schumaker.
from . import metadata
import pathlib
import unittest
test_tracks = pathlib.Path("./trier/Test Album")
track_01 = test_tracks / "01 - Test Track.ogg"
track_02 = test_tracks / "02 - Test {Disc 2}.ogg"
class TestMetadata(unittest.TestCase):
def test_metadata_init(self):
mdf = metadata.Metadata(track_01)
self.assertEqual(mdf.path, track_01)
self.assertIsNone(mdf.file)
def test_metadata_track_01(self):
with metadata.Metadata(track_01) as mdf:
self.assertEqual(mdf.album(), "Test Album")
self.assertEqual(mdf.artist(), "Test Artist")
self.assertEqual(mdf.decade(), 2010)
self.assertEqual(mdf.discnumber(), 1)
self.assertEqual(mdf.genres(), [ "Test" ])
self.assertEqual(mdf.length(), 10)
self.assertEqual(mdf.title(), "Test Track")
self.assertEqual(mdf.tracknumber(), 1)
self.assertEqual(mdf.year(), 2019)
def test_metadata_track_02(self):
with metadata.Metadata(track_02) as mdf:
self.assertEqual(mdf.artist(), "Test Album Artist")
self.assertEqual(mdf.genres(), [ "Test", "Genre", "List" ])
self.assertEqual(mdf.year(), 2019)