import json import random import util import variables as var """ FORMAT OF A MUSIC INTO THE PLAYLIST type : url url title path duration artist thumbnail user ready (validation, no, downloading, yes, failed) from_playlist (yes,no) playlist_title playlist_url type : radio url name current_title user type : file path title artist duration thumbnail user """ class PlayList(list): current_index = -1 version = 0 # increase by one after each change mode = "one-shot" # "repeat", "random" def __init__(self, *args): super().__init__(*args) def is_empty(self): return True if len(self) == 0 else False def set_mode(self, mode): # modes are "one-shot", "repeat", "random" self.mode = mode if mode == "random": self.randomize() elif mode == "one-shot" and self.current_index > 0: # remove items before current item self.version += 1 for i in range(self.current_index): super().__delitem__(0) self.current_index = 0 def append(self, item): self.version += 1 item = util.get_music_tag_info(item) super().append(item) return item def insert(self, index, item): self.version += 1 if index == -1: index = self.current_index item = util.get_music_tag_info(item) super().insert(index, item) if index <= self.current_index: self.current_index += 1 return item def length(self): return len(self) def extend(self, items): self.version += 1 items = list(map( lambda item: util.get_music_tag_info(item), items)) super().extend(items) return items def next(self): if len(self) == 0: return False self.version += 1 #logging.debug("playlist: Next into the queue") if self.current_index < len(self) - 1: if self.mode == "one-shot" and self.current_index != -1: super().__delitem__(self.current_index) else: self.current_index += 1 return self[self.current_index] else: self.current_index = 0 if self.mode == "one-shot": self.clear() return False elif self.mode == "repeat": return self[0] elif self.mode == "random": self.randomize() return self[0] else: raise TypeError("Unknown playlist mode '%s'." % self.mode) def update(self, item, index=-1): self.version += 1 if index == -1: index = self.current_index self[index] = item def __delitem__(self, key): return self.remove(key) def remove(self, index=-1): self.version += 1 if index > len(self) - 1: return False if index == -1: index = self.current_index removed = self[index] super().__delitem__(index) if self.current_index > index: self.current_index -= 1 return removed def current_item(self): if len(self) == 0: return False return self[self.current_index] def current_item_downloading(self): if len(self) == 0: return False if self[self.current_index]['type'] == 'url' and self[self.current_index]['ready'] == 'downloading': return True return False def next_index(self): if len(self) == 0 or (len(self) == 1 and self.mode == 'one_shot'): return False if self.current_index < len(self) - 1: return self.current_index + 1 else: return 0 def next_item(self): if len(self) == 0 or (len(self) == 1 and self.mode == 'one_shot'): return False return self[self.next_index()] def jump(self, index): if self.mode == "one-shot": for i in range(index): super().__delitem__(0) self.current_index = 0 else: self.current_index = index self.version += 1 return self[self.current_index] def randomize(self): # current_index will lose track after shuffling, thus we take current music out before shuffling #current = self.current_item() #del self[self.current_index] random.shuffle(self) #self.insert(0, current) self.current_index = -1 self.version += 1 def clear(self): self.version += 1 self.current_index = -1 super().clear() def save(self): var.db.remove_section("playlist_item") var.db.set("playlist", "current_index", self.current_index) for index, music in enumerate(self): for music in self: if music['type'] == 'url' and music['ready'] == 'downloading': music['ready'] = 'no' var.db.set("playlist_item", str(index), json.dumps(music)) def load(self): current_index = var.db.getint("playlist", "current_index", fallback=-1) if current_index == -1: return items = list(var.db.items("playlist_item")) items.sort(key=lambda v: int(v[0])) self.extend(list(map(lambda v: json.loads(v[1]), items))) self.current_index = current_index def _debug_print(self): print("===== Playlist(%d) ====" % self.current_index) for index, item in enumerate(self): if index == self.current_index: print("-> %d %s" % (index, item['title'])) else: print("%d %s" % (index, item['title'])) print("===== End ====")