emmental/trackdb/track.py

67 lines
2.3 KiB
Python
Raw Normal View History

# Copyright 2020 (c) Anna Schumaker.
from lib import metadata
from lib import publisher
from . import tags
import datetime
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 = 0
with metadata.Metadata(filepath) as meta:
self.title = meta.title()
self.length = meta.length()
self.discnumber = meta.discnumber()
self.tracknumber = meta.tracknumber()
self.artist = tags.Artist.add(meta.artist(), self)
self.album = tags.Album.add(self.artist, meta.album(), self)
self.genres = [ tags.Genre.add(g, self) for g in meta.genres() ]
self.year = meta.year()
self.decade = tags.Decade.add(f"{meta.decade()}s", self)
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 == "genres":
return ", ".join([ str(g) for g in self.genres ])
return None if tag == None else str(tag)
def __getstate__(self):
state = self.__dict__.copy()
state["artist"] = str(self.artist)
state["album"] = str(self.album)
state["genres"] = [ str(g) for g in self.genres ]
state["decade"] = str(self.decade)
return state
def __setstate__(self, state):
self.__dict__.update(state)
self.artist = tags.Artist.init_track(self.artist, self)
self.album = tags.Album.init_track(self.artist, self.album, self)
self.genres = [ tags.Genre.init_track(g, self) for g in self.genres ]
self.decade = tags.Decade.init_track(self.decade, self)
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()