2021-06-22 16:13:15 -04:00
|
|
|
# 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()
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
2021-06-22 16:27:45 -04:00
|
|
|
def __getstate__(self):
|
|
|
|
with self.lock:
|
|
|
|
return { "tracks" : self.tracks,
|
|
|
|
"nextid" : self.nextid }
|
|
|
|
|
2021-06-23 10:34:18 -04:00
|
|
|
def __len__(self):
|
|
|
|
with self.lock:
|
|
|
|
return len(self.tracks)
|
|
|
|
|
2021-06-22 16:27:45 -04:00
|
|
|
def __setstate__(self, state):
|
|
|
|
self.__dict__.update(state)
|
|
|
|
self.lock = threading.Lock()
|
|
|
|
self.Added = publisher.Publisher()
|
|
|
|
self.Removed = publisher.Publisher()
|
|
|
|
|
2021-06-22 16:13:15 -04:00
|
|
|
def allocate(self, lib, filepath):
|
|
|
|
try:
|
|
|
|
return self.__alloc_track__(lib, filepath)
|
|
|
|
except Exception as e:
|
|
|
|
pass
|
|
|
|
|
2021-06-22 16:42:20 -04:00
|
|
|
def list_tracks(self, lib):
|
|
|
|
with self.lock:
|
|
|
|
for (id, track) in self.tracks.items():
|
|
|
|
if track.library ==lib:
|
|
|
|
yield track
|
|
|
|
|
2021-06-22 16:13:15 -04:00
|
|
|
def remove(self, track):
|
|
|
|
with self.lock:
|
|
|
|
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()
|