2020-10-12 16:22:00 -04:00
|
|
|
# Copyright 2020 (c) Anna Schumaker.
|
2020-10-20 11:10:04 -04:00
|
|
|
from lib import publisher
|
2020-10-12 16:22:00 -04:00
|
|
|
import datetime
|
2020-10-12 17:02:13 -04:00
|
|
|
import mutagen
|
2020-10-18 12:53:57 -04:00
|
|
|
import re
|
2020-10-12 16:22:00 -04:00
|
|
|
|
2020-10-20 11:10:04 -04:00
|
|
|
TrackUpdated = publisher.Publisher()
|
|
|
|
|
2020-10-12 16:22:00 -04:00
|
|
|
class Track:
|
|
|
|
def __init__(self, trackid, filepath):
|
|
|
|
self.trackid = trackid
|
|
|
|
self.filepath = filepath
|
2020-10-18 12:53:57 -04:00
|
|
|
self.tags = { "lastplayed" : None, "playcount" : 0 }
|
2020-10-12 16:22:00 -04:00
|
|
|
|
2020-10-12 17:02:13 -04:00
|
|
|
f = mutagen.File(filepath)
|
2020-10-18 12:53:57 -04:00
|
|
|
self.tags["album"] = f.get("album", ["Unknown Album"])[0]
|
|
|
|
self.tags["artist"] = f.get("artist", ["Unknown Artist"])[0]
|
|
|
|
self.tags["artist"] = f.get("albumartist", [self.tags["artist"]])[0]
|
|
|
|
self.tags["discnumber"] = int(f.get("discnumber", [1])[0])
|
2020-10-18 13:26:40 -04:00
|
|
|
self.tags["genre"] = f.get("genre", [ "" ])[0]
|
|
|
|
self.tags["genre"] = [ g.strip() for g in re.split(",|;|/|:", self.tags["genre"]) ]
|
2020-10-18 12:53:57 -04:00
|
|
|
self.tags["length"] = int(f.info.length)
|
|
|
|
self.tags["title"] = f.get("title", [""])[0]
|
|
|
|
self.tags["tracknumber"] = int(f.get("tracknumber", [0])[0])
|
|
|
|
self.tags["year"] = f.get("date", ["0"])[0]
|
|
|
|
self.tags["year"] = f.get("originalyear", [self.tags["year"]])[0]
|
|
|
|
self.tags["year"] = int(re.match("\d+", self.tags["year"]).group(0))
|
|
|
|
|
|
|
|
def __getitem__(self, item):
|
|
|
|
tag = self.tags.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)
|
2020-10-18 13:26:40 -04:00
|
|
|
elif item == "genre":
|
|
|
|
return ", ".join(self.tags["genre"])
|
2020-10-18 12:53:57 -04:00
|
|
|
return None if tag == None else str(tag)
|
2020-10-12 17:02:13 -04:00
|
|
|
|
2020-10-18 13:38:27 -04:00
|
|
|
def decade(self):
|
|
|
|
return (self.tags["year"] // 10) * 10
|
|
|
|
|
2020-10-18 13:26:40 -04:00
|
|
|
def genres(self):
|
|
|
|
for g in self.tags["genre"]:
|
|
|
|
yield g
|
|
|
|
|
2020-10-12 16:22:00 -04:00
|
|
|
def played(self):
|
2020-10-18 12:53:57 -04:00
|
|
|
self.tags["playcount"] += 1
|
|
|
|
self.tags["lastplayed"] = datetime.date.today()
|
2020-10-20 11:10:04 -04:00
|
|
|
TrackUpdated.publish(self)
|
|
|
|
|
|
|
|
def reset():
|
|
|
|
TrackUpdated.reset()
|