]> git.0d.be Git - botaradio.git/blob - playlist.py
fix: missed file.
[botaradio.git] / playlist.py
1 import json
2 import random
3
4 import util
5 import variables as var
6
7 """
8 FORMAT OF A MUSIC INTO THE PLAYLIST
9 type : url
10     url
11     title
12     path
13     duration
14     artist
15     thumbnail
16     user
17     ready (validation, no, downloading, yes, failed)
18     from_playlist (yes,no)
19     playlist_title
20     playlist_url
21
22 type : radio
23     url
24     name
25     current_title
26     user
27
28 type : file
29     path
30     title
31     artist
32     duration
33     thumbnail
34     user
35 """
36
37
38 class PlayList(list):
39     current_index = -1
40     version = 0 # increase by one after each change
41     mode = "one-shot" # "repeat", "random"
42
43
44     def __init__(self, *args):
45         super().__init__(*args)
46
47     def is_empty(self):
48         return True if len(self) == 0 else False
49
50     def set_mode(self, mode):
51         # modes are "one-shot", "repeat", "random"
52         self.mode = mode
53
54         if mode == "random":
55             self.randomize()
56
57         elif mode == "one-shot" and self.current_index > 0:
58             # remove items before current item
59             self.version += 1
60             for i in range(self.current_index):
61                 super().__delitem__(0)
62             self.current_index = 0
63
64     def append(self, item):
65         self.version += 1
66         item = util.get_music_tag_info(item)
67         super().append(item)
68
69         return item
70
71     def insert(self, index, item):
72         self.version += 1
73
74         if index == -1:
75             index = self.current_index
76
77         item = util.get_music_tag_info(item)
78         super().insert(index, item)
79
80         if index <= self.current_index:
81             self.current_index += 1
82
83         return item
84
85     def length(self):
86         return len(self)
87
88     def extend(self, items):
89         self.version += 1
90         items = list(map(
91             lambda item: util.get_music_tag_info(item),
92             items))
93         super().extend(items)
94         return items
95
96     def next(self):
97         if len(self) == 0:
98             return False
99
100         self.version += 1
101         #logging.debug("playlist: Next into the queue")
102
103         if self.current_index < len(self) - 1:
104             if self.mode == "one-shot" and self.current_index != -1:
105                 super().__delitem__(self.current_index)
106             else:
107                 self.current_index += 1
108
109             return self[self.current_index]
110         else:
111             self.current_index = 0
112             if self.mode == "one-shot":
113                 self.clear()
114                 return False
115             elif self.mode == "repeat":
116                 return self[0]
117             elif self.mode == "random":
118                 self.randomize()
119                 return self[0]
120             else:
121                 raise TypeError("Unknown playlist mode '%s'." % self.mode)
122
123     def update(self, item, index=-1):
124         self.version += 1
125         if index == -1:
126             index = self.current_index
127         self[index] = item
128
129     def __delitem__(self, key):
130         return self.remove(key)
131
132     def remove(self, index=-1):
133         self.version += 1
134         if index > len(self) - 1:
135             return False
136
137         if index == -1:
138             index = self.current_index
139
140         removed = self[index]
141         super().__delitem__(index)
142
143         if self.current_index > index:
144             self.current_index -= 1
145
146         return removed
147
148     def current_item(self):
149         if len(self) == 0:
150             return False
151
152         return self[self.current_index]
153
154     def current_item_downloading(self):
155         if len(self) == 0:
156             return False
157
158         if self[self.current_index]['type'] == 'url' and self[self.current_index]['ready'] == 'downloading':
159             return True
160         return False
161
162     def next_index(self):
163         if len(self) == 0 or (len(self) == 1 and self.mode == 'one_shot'):
164             return False
165
166         if self.current_index < len(self) - 1:
167             return self.current_index + 1
168         else:
169             return 0
170
171     def next_item(self):
172         if len(self) == 0 or (len(self) == 1 and self.mode == 'one_shot'):
173             return False
174
175         return self[self.next_index()]
176
177     def jump(self, index):
178         if self.mode == "one-shot":
179             for i in range(index):
180                 super().__delitem__(0)
181             self.current_index = 0
182         else:
183             self.current_index = index
184
185         self.version += 1
186         return self[self.current_index]
187
188     def randomize(self):
189         # current_index will lose track after shuffling, thus we take current music out before shuffling
190         #current = self.current_item()
191         #del self[self.current_index]
192
193         random.shuffle(self)
194
195         #self.insert(0, current)
196         self.current_index = -1
197         self.version += 1
198
199     def clear(self):
200         self.version += 1
201         self.current_index = -1
202         super().clear()
203
204     def save(self):
205         var.db.remove_section("playlist_item")
206         var.db.set("playlist", "current_index", self.current_index)
207
208         for index, music in enumerate(self):
209             for music in self:
210                 if music['type'] == 'url' and music['ready'] == 'downloading':
211                     music['ready'] = 'no'
212
213             var.db.set("playlist_item", str(index), json.dumps(music))
214
215     def load(self):
216         current_index = var.db.getint("playlist", "current_index", fallback=-1)
217         if current_index == -1:
218             return
219
220         items = list(var.db.items("playlist_item"))
221         items.sort(key=lambda v: int(v[0]))
222         self.extend(list(map(lambda v: json.loads(v[1]), items)))
223
224         self.current_index = current_index
225
226     def _debug_print(self):
227         print("===== Playlist(%d) ====" % self.current_index)
228         for index, item in enumerate(self):
229             if index == self.current_index:
230                 print("-> %d %s" % (index, item['title']))
231             else:
232                 print("%d %s" % (index, item['title']))
233         print("=====      End     ====")