From 26345e456f64453b73fe2513a8072d1782016772 Mon Sep 17 00:00:00 2001 From: Terry Geng Date: Tue, 3 Mar 2020 16:36:44 +0800 Subject: [PATCH] fix: missed file. --- playlist.py | 233 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 playlist.py diff --git a/playlist.py b/playlist.py new file mode 100644 index 0000000..42d2be1 --- /dev/null +++ b/playlist.py @@ -0,0 +1,233 @@ +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 ====") \ No newline at end of file