FEAT: AUTOPLAY MODE #91

This commit is contained in:
Terry Geng 2020-03-06 16:15:04 +08:00
parent 665edec684
commit e70727cfd1
4 changed files with 50 additions and 7 deletions

View File

@ -752,7 +752,7 @@ def cmd_mode(bot, user, text, command, parameter):
if not parameter:
bot.send_msg(constants.strings("current_mode", mode=var.playlist.mode), text)
return
if not parameter in ["one-shot", "repeat", "random"]:
if not parameter in ["one-shot", "repeat", "random", "autoplay"]:
bot.send_msg(constants.strings('unknown_mode', mode=parameter), text)
else:
var.db.set('playlist', 'playback_mode', parameter)

View File

@ -177,6 +177,13 @@ class MusicDatabase:
conn.commit()
conn.close()
def query_all_ids(self):
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
results = cursor.execute("SELECT id FROM music").fetchall()
conn.close()
return list(map(lambda i: i[0], results))
def query_music(self, **kwargs):
condition = []
filler = []

View File

@ -2,6 +2,7 @@ import json
import random
import threading
import logging
import random
import variables as var
from media.file import FileItem
@ -95,6 +96,8 @@ def get_playlist(mode, _list=None, index=None):
return RepeatPlaylist()
elif mode == "random":
return RandomPlaylist()
elif mode == "autoplay":
return AutoPlaylist()
else:
if mode == "one-shot":
return OneshotPlaylist().from_list(_list, index)
@ -102,9 +105,11 @@ def get_playlist(mode, _list=None, index=None):
return RepeatPlaylist().from_list(_list, index)
elif mode == "random":
return RandomPlaylist().from_list(_list, index)
elif mode == "autoplay":
return AutoPlaylist().from_list(_list, index)
raise
class BasePlayList(list):
class BasePlaylist(list):
def __init__(self):
super().__init__()
self.current_index = -1
@ -295,7 +300,7 @@ class BasePlayList(list):
self.validating_thread_lock.release()
class OneshotPlaylist(BasePlayList):
class OneshotPlaylist(BasePlaylist):
def __init__(self):
super().__init__()
self.mode = "one-shot"
@ -344,7 +349,7 @@ class OneshotPlaylist(BasePlayList):
super().__delitem__(0)
class RepeatPlaylist(BasePlayList):
class RepeatPlaylist(BasePlaylist):
def __init__(self):
super().__init__()
self.mode = "repeat"
@ -372,7 +377,7 @@ class RepeatPlaylist(BasePlayList):
return self[self.next_index()]
class RandomPlaylist(BasePlayList):
class RandomPlaylist(BasePlaylist):
def __init__(self):
super().__init__()
self.mode = "random"
@ -396,3 +401,34 @@ class RandomPlaylist(BasePlayList):
self.current_index = 0
return self[0]
class AutoPlaylist(BasePlaylist):
def __init__(self):
super().__init__()
self.mode = "autoplay"
def refresh(self):
_list = []
ids = var.music_db.query_all_ids()
for _ in range(20):
_list.append(get_item_wrapper_by_id(var.bot, ids[random.randint(0, len(ids)-1)], 'AutoPlay'))
self.from_list(_list, -1)
# def from_list(self, _list, current_index):
# self.version += 1
# self.refresh()
# return self
def next(self):
if len(self) == 0:
return False
self.version += 1
if self.current_index < len(self) - 1:
self.current_index += 1
return self[self.current_index]
else:
self.refresh()
self.current_index = 0
return self[0]

View File

@ -29,7 +29,7 @@ import media.url
import media.file
import media.radio
import media.system
from media.playlist import BasePlayList
from media.playlist import BasePlaylist
from media.library import MusicLibrary
@ -640,7 +640,7 @@ if __name__ == '__main__':
else:
playback_mode = var.config.get('bot', 'playback_mode', fallback="one-shot")
if playback_mode in ["one-shot", "repeat", "random"]:
if playback_mode in ["one-shot", "repeat", "random", "autoplay"]:
var.playlist = media.playlist.get_playlist(playback_mode)
else:
raise KeyError("Unknown playback mode '%s'" % playback_mode)