2021-06-21 12:36:46 -04:00
|
|
|
# Copyright 2021 (c) Anna Schumaker.
|
2021-06-28 11:12:14 -04:00
|
|
|
from . import publisher
|
2021-07-06 13:14:18 -04:00
|
|
|
import random
|
2021-06-21 13:42:00 -04:00
|
|
|
import threading
|
2021-06-21 12:36:46 -04:00
|
|
|
|
|
|
|
class Tag:
|
2021-07-02 08:33:57 -04:00
|
|
|
def __init__(self, name, sort=None):
|
2021-06-21 12:36:46 -04:00
|
|
|
self.name = name
|
2021-07-02 08:33:57 -04:00
|
|
|
self.sort = sort.lower() if sort else str(name).lower()
|
2021-07-06 10:43:16 -04:00
|
|
|
self.current = -1
|
2021-07-08 16:55:56 -04:00
|
|
|
self.runtime = 0
|
2021-07-06 11:25:20 -04:00
|
|
|
self.loop = False
|
2021-07-06 13:14:18 -04:00
|
|
|
self.random = False
|
2021-06-21 12:36:46 -04:00
|
|
|
self.tracks = [ ]
|
|
|
|
self.widgets = None
|
2021-06-21 13:42:00 -04:00
|
|
|
self.lock = threading.Lock()
|
2021-06-28 11:12:14 -04:00
|
|
|
self.TrackAdded = publisher.Publisher()
|
|
|
|
self.TrackRemoved = publisher.Publisher()
|
2021-06-21 12:36:46 -04:00
|
|
|
|
2021-06-29 13:40:27 -04:00
|
|
|
def __getitem__(self, n):
|
|
|
|
with self.lock:
|
|
|
|
if n < len(self.tracks):
|
|
|
|
return self.tracks[n]
|
|
|
|
return None
|
|
|
|
|
2021-06-21 13:38:22 -04:00
|
|
|
def __getstate__(self):
|
2021-06-21 13:42:00 -04:00
|
|
|
with self.lock:
|
2021-07-06 10:43:16 -04:00
|
|
|
return { "name" : self.name,
|
|
|
|
"sort" : self.sort,
|
|
|
|
"current" : self.current,
|
2021-07-06 11:25:20 -04:00
|
|
|
"loop" : self.loop,
|
2021-07-06 13:14:18 -04:00
|
|
|
"random" : self.random,
|
2021-07-06 10:43:16 -04:00
|
|
|
"tracks" : [ t.trackid for t in self.tracks ] }
|
2021-06-21 13:38:22 -04:00
|
|
|
|
2021-06-21 12:36:46 -04:00
|
|
|
def __len__(self):
|
2021-06-21 13:42:00 -04:00
|
|
|
with self.lock:
|
|
|
|
return len(self.tracks)
|
2021-06-21 12:36:46 -04:00
|
|
|
|
|
|
|
def __lt__(self, rhs):
|
2021-07-01 16:58:21 -04:00
|
|
|
if not isinstance(rhs, SuperTag):
|
2021-07-02 08:33:57 -04:00
|
|
|
return self.sort < rhs.sort
|
2021-07-01 16:58:21 -04:00
|
|
|
if self == rhs.parent:
|
|
|
|
return True
|
2021-07-02 08:33:57 -04:00
|
|
|
return self.sort < rhs.parent.sort
|
2021-06-21 12:36:46 -04:00
|
|
|
|
2021-07-06 11:25:20 -04:00
|
|
|
def __next_track__(self):
|
|
|
|
if self.loop == True and self.current >= len(self.tracks):
|
|
|
|
return 0
|
|
|
|
return self.current + 1
|
|
|
|
|
2021-07-06 13:14:18 -04:00
|
|
|
def __random_track__(self):
|
|
|
|
i = 1
|
|
|
|
length = len(self.tracks)
|
|
|
|
if len(self.tracks) >= 3:
|
|
|
|
i = random.randint(1, length - 1)
|
|
|
|
return (self.current + i) % (1 if length == 0 else length)
|
|
|
|
|
2021-06-21 13:38:22 -04:00
|
|
|
def __setstate__(self, state):
|
|
|
|
self.name = state["name"]
|
2021-07-02 08:33:57 -04:00
|
|
|
self.sort = state["sort"]
|
2021-07-06 10:43:16 -04:00
|
|
|
self.current = state["current"]
|
2021-07-06 11:25:20 -04:00
|
|
|
self.loop = state["loop"]
|
2021-07-06 13:14:18 -04:00
|
|
|
self.random = state["random"]
|
2021-06-21 13:38:22 -04:00
|
|
|
self.tracks = state["tracks"]
|
2021-07-08 16:55:56 -04:00
|
|
|
self.runtime = 0
|
2021-06-21 13:38:22 -04:00
|
|
|
self.widgets = None
|
2021-06-21 13:42:00 -04:00
|
|
|
self.lock = threading.Lock()
|
2021-06-28 11:12:14 -04:00
|
|
|
self.TrackAdded = publisher.Publisher()
|
|
|
|
self.TrackRemoved = publisher.Publisher()
|
2021-06-21 13:38:22 -04:00
|
|
|
|
2021-06-21 14:57:01 -04:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
2021-06-21 12:36:46 -04:00
|
|
|
def add_track(self, track):
|
2021-06-21 13:42:00 -04:00
|
|
|
with self.lock:
|
2021-07-14 14:09:36 -04:00
|
|
|
if track in self.tracks:
|
|
|
|
return
|
2021-07-08 12:46:18 -04:00
|
|
|
pos = len(self.tracks)
|
2021-06-21 13:42:00 -04:00
|
|
|
self.tracks.append(track)
|
2021-07-08 16:55:56 -04:00
|
|
|
self.runtime += track.length
|
2021-07-08 12:46:18 -04:00
|
|
|
self.TrackAdded.publish(self, track, pos)
|
2021-06-21 12:36:46 -04:00
|
|
|
|
2021-07-06 11:25:20 -04:00
|
|
|
def can_loop(self): return True
|
2021-07-06 13:14:18 -04:00
|
|
|
def can_random(self): return True
|
2021-07-06 11:25:20 -04:00
|
|
|
|
2021-07-02 08:50:03 -04:00
|
|
|
def get_header(self):
|
|
|
|
return self.sort[0].upper() if len(self.sort) > 0 else ""
|
|
|
|
|
2021-06-23 11:08:35 -04:00
|
|
|
def init_track(self, track):
|
|
|
|
with self.lock:
|
|
|
|
try:
|
|
|
|
i = self.tracks.index(track.trackid)
|
|
|
|
self.tracks[i] = track
|
2021-07-08 16:55:56 -04:00
|
|
|
self.runtime += track.length
|
2021-06-23 11:08:35 -04:00
|
|
|
except Exception as e:
|
|
|
|
pass
|
|
|
|
|
2021-07-06 10:43:16 -04:00
|
|
|
def next(self):
|
|
|
|
with self.lock:
|
2021-07-06 13:14:18 -04:00
|
|
|
if self.random == True:
|
|
|
|
self.current = self.__random_track__()
|
|
|
|
else:
|
|
|
|
self.current = self.__next_track__()
|
|
|
|
|
2021-07-06 10:43:16 -04:00
|
|
|
if self.current < len(self.tracks):
|
|
|
|
return self.tracks[self.current]
|
|
|
|
return None
|
|
|
|
|
2021-06-21 12:36:46 -04:00
|
|
|
def remove_track(self, track):
|
2021-06-21 13:42:00 -04:00
|
|
|
with self.lock:
|
2021-07-08 12:46:18 -04:00
|
|
|
pos = self.tracks.index(track)
|
2021-06-21 13:42:00 -04:00
|
|
|
self.tracks.remove(track)
|
2021-07-08 16:55:56 -04:00
|
|
|
self.runtime -= track.length
|
2021-07-08 12:46:18 -04:00
|
|
|
self.TrackRemoved.publish(self, track, pos)
|
2021-06-23 15:14:51 -04:00
|
|
|
|
2021-07-06 16:14:39 -04:00
|
|
|
def stacked(self):
|
|
|
|
with self.lock:
|
|
|
|
if self.current >= len(self.tracks):
|
|
|
|
self.current = -1
|
|
|
|
|
2021-06-23 15:14:51 -04:00
|
|
|
|
|
|
|
class SuperTag(Tag):
|
2021-07-02 08:33:57 -04:00
|
|
|
def __init__(self, parent, name, sort=None):
|
|
|
|
Tag.__init__(self, name, sort)
|
2021-06-23 15:14:51 -04:00
|
|
|
self.parent = parent
|
|
|
|
|
|
|
|
def __getstate__(self):
|
2021-07-06 11:25:20 -04:00
|
|
|
state = Tag.__getstate__(self)
|
|
|
|
state["parent"] = self.parent
|
|
|
|
return state
|
2021-06-23 15:14:51 -04:00
|
|
|
|
2021-07-01 16:58:21 -04:00
|
|
|
def __lt__(self, rhs):
|
|
|
|
if not isinstance(rhs, SuperTag):
|
2021-07-02 08:33:57 -04:00
|
|
|
return self.parent.sort < rhs.sort
|
|
|
|
if self.parent != rhs.parent:
|
|
|
|
return self.parent < rhs.parent
|
|
|
|
return self.sort < rhs.sort
|
2021-07-01 16:58:21 -04:00
|
|
|
|
2021-06-23 15:14:51 -04:00
|
|
|
def __setstate__(self, state):
|
|
|
|
Tag.__setstate__(self, state)
|
|
|
|
self.parent = state["parent"]
|