64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
# Copyright 2021 (c) Anna Schumaker.
|
|
import datetime
|
|
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 if self.file else None
|
|
|
|
def __exit__(self, exp_type, exp_value, traceback):
|
|
self.file = None
|
|
return (exp_type == None) or (exp_type == AttributeError)
|
|
|
|
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 artistsort(self):
|
|
sort = self.file.get("artistsort", [ self.artist() ])
|
|
return self.file.get("albumartistsort", sort)[0]
|
|
|
|
def decade(self):
|
|
return (self.year() // 10) * 10
|
|
|
|
def discnumber(self):
|
|
return int(self.file.get("discnumber", [ 1 ])[0])
|
|
|
|
def discsubtitle(self):
|
|
return self.file.get("discsubtitle", [ None ])[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 release(self):
|
|
date = self.file.get("date", [ "0" ])
|
|
date = self.file.get("originalyear", date)[0].split("-")
|
|
year = int(date[0]) if len(date) > 0 else 1
|
|
month = int(date[1]) if len(date) > 1 else 1
|
|
day = int(date[2]) if len(date) > 2 else 1
|
|
return datetime.date(max(year, 1), month, day)
|
|
|
|
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))
|