From 349a25ad583e063347381ddcb7fd46a1b8ac5af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Wed, 12 Jun 2024 17:12:07 +0000 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=92=AD=E6=94=BE=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8A=9F=E8=83=BD=20#51?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/config.py | 2 ++ xiaomusic/httpserver.py | 8 +++++ xiaomusic/static/app.js | 39 +++++++++++++++++++--- xiaomusic/static/index.html | 9 ++++++ xiaomusic/static/style.css | 1 - xiaomusic/xiaomusic.py | 64 +++++++++++++++++++++++++++++++++---- 6 files changed, 110 insertions(+), 13 deletions(-) diff --git a/xiaomusic/config.py b/xiaomusic/config.py index 6cf434c0e..eff5f7747 100644 --- a/xiaomusic/config.py +++ b/xiaomusic/config.py @@ -43,6 +43,7 @@ "关机": "stop", "停止播放": "stop", "分钟后关机": "stop_after_minute", + "播放列表": "play_music_list", "set_volume#": "set_volume", "get_volume#": "get_volume", } @@ -65,6 +66,7 @@ "随机播放", "关机", "停止播放", + "播放列表", ] SUPPORT_MUSIC_TYPE = [ diff --git a/xiaomusic/httpserver.py b/xiaomusic/httpserver.py index 8bbe98337..42b6ee2a9 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 9f33310bb..d0b70b9f6 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 ff82deea4..1dba021bf 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 c51ea56b4..62fbfc09a 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 d0b04792a..c76bb8b41 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -75,6 +75,8 @@ def __init__(self, config: Config): 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 @@ def __init__(self, config: Config): self.try_init_setting() # 启动时重新生成一次播放列表 - self.gen_all_music_list() + self._gen_all_music_list() # 启动时初始化获取声音 self.set_last_record("get_volume#") @@ -340,9 +342,16 @@ def get_file_url(self, name): 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 @@ def gen_all_music_list(self): # 歌曲名字相同会覆盖 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 @@ async def set_play_type_all(self, **kwargs): # 随机播放 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 @@ def get_volume_ret(self): # 搜索音乐 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)