emmental/lib/tag.py

147 lines
4.3 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
from . import publisher
import random
import threading
class Tag:
def __init__(self, name, sort=None):
self.name = name
self.sort = sort.lower() if sort else str(name).lower()
self.current = -1
self.runtime = 0
self.loop = False
self.random = False
self.tracks = [ ]
self.widgets = None
self.lock = threading.Lock()
self.TrackAdded = publisher.Publisher()
self.TrackRemoved = publisher.Publisher()
def __getitem__(self, n):
with self.lock:
if n < len(self.tracks):
return self.tracks[n]
return None
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"sort" : self.sort,
"current" : self.current,
"loop" : self.loop,
"random" : self.random,
"tracks" : [ t.trackid for t in self.tracks ] }
def __len__(self):
with self.lock:
return len(self.tracks)
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):
return self.sort < rhs.sort
if self == rhs.parent:
return True
return self.sort < rhs.parent.sort
def __next_track__(self):
if self.loop == True and self.current >= len(self.tracks):
return 0
return self.current + 1
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)
def __setstate__(self, state):
self.name = state["name"]
self.sort = state["sort"]
self.current = state["current"]
self.loop = state["loop"]
self.random = state["random"]
self.tracks = state["tracks"]
self.runtime = 0
self.widgets = None
self.lock = threading.Lock()
self.TrackAdded = publisher.Publisher()
self.TrackRemoved = publisher.Publisher()
def __str__(self):
return self.name
def add_track(self, track):
with self.lock:
if track in self.tracks:
return
pos = len(self.tracks)
self.tracks.append(track)
self.runtime += track.length
self.TrackAdded.publish(self, track, pos)
def can_loop(self): return True
def can_random(self): return True
def get_header(self):
return self.sort[0].upper() if len(self.sort) > 0 else ""
def init_track(self, track):
with self.lock:
try:
i = self.tracks.index(track.trackid)
self.tracks[i] = track
self.runtime += track.length
except Exception as e:
pass
def next(self):
with self.lock:
if self.random == True:
self.current = self.__random_track__()
else:
self.current = self.__next_track__()
if self.current < len(self.tracks):
return self.tracks[self.current]
return None
def remove_track(self, track):
with self.lock:
pos = self.tracks.index(track)
self.tracks.remove(track)
self.runtime -= track.length
self.TrackRemoved.publish(self, track, pos)
def stacked(self):
with self.lock:
if self.current >= len(self.tracks):
self.current = -1
def track_selected(self, track):
with self.lock:
self.current = self.tracks.index(track)
track.add_to_playlist("Previous")
class SuperTag(Tag):
def __init__(self, parent, name, sort=None):
Tag.__init__(self, name, sort)
self.parent = parent
def __getstate__(self):
state = Tag.__getstate__(self)
state["parent"] = self.parent
return state
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):
return self.parent.sort < rhs.sort
if self.parent != rhs.parent:
return self.parent < rhs.parent
return self.sort < rhs.sort
def __setstate__(self, state):
Tag.__setstate__(self, state)
self.parent = state["parent"]