emmental/tagdb/allocator.py

86 lines
2.4 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
from lib import publisher
from . import track
import threading
class TrackAllocator:
def __init__(self):
self.tracks = dict()
self.nextid = 0
self.lock = threading.Lock()
self.Added = publisher.Publisher()
self.Removed = publisher.Publisher()
self.Updated = publisher.Publisher()
def __alloc_track__(self, lib, filepath):
with self.lock:
trak = track.Track(self.nextid, filepath, lib)
self.tracks[self.nextid] = trak
self.nextid += 1
self.Added.publish(trak)
return trak
def __getitem__(self, id):
with self.lock:
return self.tracks.get(id, None)
def __getstate__(self):
with self.lock:
return { "tracks" : self.tracks,
"nextid" : self.nextid }
def __len__(self):
with self.lock:
return len(self.tracks)
def __setstate__(self, state):
self.__dict__.update(state)
self.lock = threading.Lock()
self.Added = publisher.Publisher()
self.Removed = publisher.Publisher()
self.Updated = publisher.Publisher()
def allocate(self, lib, filepath):
try:
return self.__alloc_track__(lib, filepath)
except Exception as e:
pass
def autoremove(self, lib):
with self.lock:
to_rm = [ trak for trak in self.tracks.values() \
if trak.library == lib and not trak.filepath().exists() ]
for trak in to_rm:
trak.about_to_remove()
del self.tracks[trak.trackid]
self.Removed.publish(trak)
return to_rm
def list_tracks(self, lib):
with self.lock:
for (id, track) in self.tracks.items():
if track.library ==lib:
yield track
def load_tags(self):
for (id, track) in self.tracks.items():
track.__set_tags__()
def played(self, track):
with self.lock:
track.played()
self.Updated.publish(track)
def remove(self, track):
with self.lock:
track.about_to_remove()
del self.tracks[track.trackid]
self.Removed.publish(track)
def reset(self):
with self.lock:
self.nextid = 0
self.tracks.clear()
self.Added.reset()
self.Removed.reset()