diff --git a/xiaomusic/config.py b/xiaomusic/config.py
index 6cf434c..eff5f77 100644
--- a/xiaomusic/config.py
+++ b/xiaomusic/config.py
@@ -43,6 +43,7 @@ KEY_WORD_DICT = {
"关机": "stop",
"停止播放": "stop",
"分钟后关机": "stop_after_minute",
+ "播放列表": "play_music_list",
"set_volume#": "set_volume",
"get_volume#": "get_volume",
}
@@ -65,6 +66,7 @@ KEY_MATCH_ORDER = [
"随机播放",
"关机",
"停止播放",
+ "播放列表",
]
SUPPORT_MUSIC_TYPE = [
diff --git a/xiaomusic/httpserver.py b/xiaomusic/httpserver.py
index 8bbe983..42b6ee2 100644
--- a/xiaomusic/httpserver.py
+++ b/xiaomusic/httpserver.py
@@ -95,6 +95,14 @@ async def savesetting():
await xiaomusic.saveconfig(data)
return "save success"
+@app.route("/musiclist", methods=["GET"])
+async def musiclist():
+ return xiaomusic.get_music_list()
+
+@app.route("/curplaylist", methods=["GET"])
+async def curplaylist():
+ return xiaomusic.get_cur_play_list()
+
def static_path_handler(filename):
log.debug(filename)
log.debug(static_path)
diff --git a/xiaomusic/static/app.js b/xiaomusic/static/app.js
index 9f33310..d0b70b9 100644
--- a/xiaomusic/static/app.js
+++ b/xiaomusic/static/app.js
@@ -1,11 +1,10 @@
$(function(){
$container=$("#cmds");
- append_op_button_name("下一首");
append_op_button_name("全部循环");
- append_op_button_name("关机");
append_op_button_name("单曲循环");
- append_op_button_name("播放歌曲");
append_op_button_name("随机播放");
+ append_op_button_name("下一首");
+ append_op_button_name("关机");
$container.append($("
"));
@@ -26,6 +25,36 @@ $(function(){
$("#version").text(`(${data.version})`);
});
+ // 拉取播放列表
+ $.get("/musiclist", function(data, status) {
+ console.log(data, status);
+ $.each(data, function(key, value) {
+ $('#music_list').append($('').val(key).text(key));
+ });
+
+ $('#music_list').change(function() {
+ const selectedValue = $(this).val();
+ $('#music_name').empty();
+ $.each(data[selectedValue], function(index, item) {
+ $('#music_name').append($('').val(item).text(item));
+ });
+ });
+
+ $('#music_list').trigger('change');
+
+ // 获取当前播放列表
+ $.get("curplaylist", function(data, status) {
+ $('#music_list').val(data);
+ $('#music_list').trigger('change');
+ })
+ })
+
+ $("#play_music_list").on("click", () => {
+ var music_list = $("#music_list").val();
+ var music_name = $("#music_name").val();
+ let cmd = "播放列表" + music_list + "|" + music_name;
+ sendcmd(cmd);
+ })
function append_op_button_name(name) {
append_op_button(name, name);
@@ -48,8 +77,8 @@ $(function(){
$("#play").on("click", () => {
var search_key = $("#music-name").val();
- var filename=$("#music-filename").val();
- let cmd = "播放歌曲"+search_key+"|"+filename;
+ var filename = $("#music-filename").val();
+ let cmd = "播放歌曲" + search_key + "|" + filename;
sendcmd(cmd);
});
diff --git a/xiaomusic/static/index.html b/xiaomusic/static/index.html
index ff82dee..1dba021 100644
--- a/xiaomusic/static/index.html
+++ b/xiaomusic/static/index.html
@@ -33,6 +33,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/xiaomusic/static/style.css b/xiaomusic/static/style.css
index c51ea56..62fbfc0 100644
--- a/xiaomusic/static/style.css
+++ b/xiaomusic/static/style.css
@@ -62,7 +62,6 @@ input,select {
}
footer {
- position: fixed;
bottom: 0;
width: 100%;
text-align: center;
diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py
index d0b0479..c76bb8b 100644
--- a/xiaomusic/xiaomusic.py
+++ b/xiaomusic/xiaomusic.py
@@ -75,6 +75,8 @@ class XiaoMusic:
self._volume = 0
self._all_music = {}
self._play_list = []
+ self._cur_play_list = ""
+ self._music_list = {} # 播放列表 key 为目录名, value 为 play_list
self._playing = False
# 关机定时器
@@ -94,7 +96,7 @@ class XiaoMusic:
self.try_init_setting()
# 启动时重新生成一次播放列表
- self.gen_all_music_list()
+ self._gen_all_music_list()
# 启动时初始化获取声音
self.set_last_record("get_volume#")
@@ -340,9 +342,16 @@ class XiaoMusic:
return f"http://{self.hostname}:{self.port}/{encoded_name}"
# 递归获取目录下所有歌曲,生成随机播放列表
- def gen_all_music_list(self):
+ def _gen_all_music_list(self):
self._all_music = {}
+ all_music_by_dir = {}
for root, dirs, filenames in os.walk(self.music_path):
+ self.log.debug("root:%s dirs:%s music_path:%s", root, dirs, self.music_path)
+ dir_name = os.path.basename(root)
+ if self.music_path == root:
+ dir_name = "其他"
+ if dir_name not in all_music_by_dir:
+ all_music_by_dir[dir_name] = {}
for filename in filenames:
self.log.debug("gen_all_music_list. filename:%s", filename)
# 过滤隐藏文件
@@ -361,10 +370,20 @@ class XiaoMusic:
# 歌曲名字相同会覆盖
self._all_music[name] = os.path.join(root, filename)
+ all_music_by_dir[dir_name][name] = True
+ pass
self._play_list = list(self._all_music.keys())
+ self._cur_play_list = "全部"
random.shuffle(self._play_list)
self.log.debug(self._all_music)
+ self._music_list = {}
+ self._music_list["全部"] = self._play_list
+ for dir_name,musics in all_music_by_dir.items():
+ self._music_list[dir_name] = list(musics.keys())
+ self.log.debug("dir_name:%s, list:%s", dir_name, self._music_list[dir_name])
+ pass
+
# 把下载的音乐加入播放列表
def add_download_music(self, name):
self._all_music[name] = os.path.join(self.music_path, f"{name}.mp3")
@@ -558,16 +577,38 @@ class XiaoMusic:
# 随机播放
async def random_play(self, **kwargs):
self.play_type = PLAY_TYPE_ALL
- await self.do_tts(f"已经设置为全部循环并随机播放")
- # 重新生成随机播放列表
- self.gen_all_music_list()
- await self.play_next()
+ random.shuffle(self._play_list)
+ await self.do_tts(f"已经设置为随机播放")
+
+ # 生成播放列表
+ async def gen_music_list(self, **kwargs):
+ self._gen_all_music_list()
+ await self.do_tts(f"生成播放列表完毕")
+
+ # 播放一个播放列表
+ async def play_music_list(self, **kwargs):
+ parts = kwargs["arg1"].split("|")
+ list_name = parts[0]
+ if list_name not in self._music_list:
+ await self.do_tts(f"播放列表{list_name}不存在")
+ return
+ self._play_list = self._music_list[list_name]
+ self._cur_play_list = list_name
+ self.log.info(f"开始播放列表{list_name}")
+
+ music_name = ""
+ if len(parts) > 1:
+ music_name = parts[1]
+ else:
+ music_name = self.get_next_music()
+ await self.play(arg1=music_name)
async def stop(self, **kwargs):
self._playing = False
if self._next_timer:
self._next_timer.cancel()
self.log.info(f"定时器已取消")
+ self.cur_music = ""
await self.force_stop_xiaoai()
async def stop_after_minute(self, **kwargs):
@@ -601,10 +642,19 @@ class XiaoMusic:
# 搜索音乐
def searchmusic(self, name):
- search_list = fuzzyfinder(name, self._play_list)
+ all_music_list = list(self._all_music.keys())
+ search_list = fuzzyfinder(name, all_music_list)
self.log.debug("searchmusic. name:%s search_list:%s", name, search_list)
return search_list
+ # 获取播放列表
+ def get_music_list(self):
+ return self._music_list
+
+ # 获取当前的播放列表
+ def get_cur_play_list(self):
+ return self._cur_play_list
+
# 正在播放中的音乐
def playingmusic(self):
self.log.debug("playingmusic. cur_music:%s", self.cur_music)