]> git.0d.be Git - botaradio.git/commitdiff
fix: missed file.
authorTerry Geng <gengyanda@gmail.com>
Tue, 3 Mar 2020 08:36:44 +0000 (16:36 +0800)
committerTerry Geng <gengyanda@gmail.com>
Tue, 3 Mar 2020 08:36:44 +0000 (16:36 +0800)
playlist.py [new file with mode: 0644]

diff --git a/playlist.py b/playlist.py
new file mode 100644 (file)
index 0000000..42d2be1
--- /dev/null
@@ -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