emmental/trackdb/track.py

57 lines
1.8 KiB
Python
Raw Normal View History

# Copyright 2020 (c) Anna Schumaker.
from lib import publisher
import datetime
import mutagen
import re
TrackUpdated = publisher.Publisher()
class Track:
def __init__(self, trackid, filepath, library):
self.trackid = trackid
self.path = filepath.relative_to(library.path)
self.library = library
self.lastplayed = None
self.playcount = None
f = mutagen.File(filepath)
self.album = f.get("album", ["Unknown Album"])[0]
self.artist = f.get("artist", ["Unknown Artist"])[0]
self.artist = f.get("albumartist", [self.artist])[0]
self.discnumber = int(f.get("discnumber", [1])[0])
self.genre = f.get("genre", [ "" ])[0]
self.genre = [ g.strip() for g in re.split(",|;|/|:", self.genre) ]
self.length = int(f.info.length)
self.title = f.get("title", [""])[0]
self.tracknumber = int(f.get("tracknumber", [0])[0])
self.year = f.get("date", ["0"])[0]
self.year = f.get("originalyear", [self.year])[0]
self.year = int(re.match("\d+", self.year).group(0))
def __getitem__(self, item):
tag = self.__dict__.get(item, None)
if item == "length":
(m, s) = divmod(tag, 60)
return f"{m}:{s:02}"
elif item in ("discnumber", "tracknumber"):
return f"{tag:02}"
elif item == "lastplayed":
return "Never" if tag == None else str(tag)
elif item == "genre":
return ", ".join(self.genre)
return None if tag == None else str(tag)
def decade(self):
return (self.year // 10) * 10
def filepath(self):
return self.library.path / self.path
def played(self):
self.playcount += 1
self.lastplayed = datetime.date.today()
TrackUpdated.publish(self)
def reset():
TrackUpdated.reset()