From 2e864eed7c20b7cc9b25bef5718808eead619b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Sun, 13 Oct 2024 01:06:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9E=8B=E5=8F=B7M01?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=8E=B7=E5=8F=96=E5=88=B0=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + xiaomusic/config.py | 3 + xiaomusic/const.py | 5 ++ xiaomusic/static/default/debug.html | 4 +- xiaomusic/static/default/downloadtool.html | 4 +- xiaomusic/static/default/index.html | 6 +- xiaomusic/static/default/m3u.html | 2 +- xiaomusic/static/default/setting.html | 12 +++- xiaomusic/xiaomusic.py | 76 ++++++++++++++++++---- 9 files changed, 89 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index bf798db..83e818b 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ docker build -t xiaomusic . | L05C | [小米小爱音箱Play 增强版](https://home.mi.com/baike/index.html#/detail?model=xiaomi.wifispeaker.l05c) | | L09A | [小米音箱Art](https://home.mi.com/webapp/content/baike/product/index.html?model=xiaomi.wifispeaker.l09a) | | LX04 X10A X08A | 已经支持的触屏版 | +| M01/XMYX01JY | 小米小爱音箱HD (获取对话记录的接口比较特殊) | 型号与产品名称对照可以在这里查询 diff --git a/xiaomusic/config.py b/xiaomusic/config.py index c0de842..67f9a5d 100644 --- a/xiaomusic/config.py +++ b/xiaomusic/config.py @@ -158,6 +158,9 @@ class Config: enable_yt_dlp_cookies: bool = ( os.getenv("XIAOMUSIC_ENABLE_YT_DLP_COOKIES", "false").lower() == "true" ) + get_ask_by_mina: bool = ( + os.getenv("XIAOMUSIC_GET_ASK_BY_MINA", "false").lower() == "true" + ) def append_keyword(self, keys, action): for key in keys.split(","): diff --git a/xiaomusic/const.py b/xiaomusic/const.py index 570952d..ce2b48f 100644 --- a/xiaomusic/const.py +++ b/xiaomusic/const.py @@ -19,3 +19,8 @@ PLAY_TYPE_TTS = { PLAY_TYPE_ALL: "已经设置为全部循环", PLAY_TYPE_RND: "已经设置为随机播放", } + +# 需要采用 mina 获取对话记录的设备型号 +GET_ASK_BY_MINA = { + "M01", +} diff --git a/xiaomusic/static/default/debug.html b/xiaomusic/static/default/debug.html index 40749ab..2afe8c7 100644 --- a/xiaomusic/static/default/debug.html +++ b/xiaomusic/static/default/debug.html @@ -6,9 +6,9 @@ Debug For XiaoMusic - + - + diff --git a/xiaomusic/static/default/downloadtool.html b/xiaomusic/static/default/downloadtool.html index 61f3086..abef970 100644 --- a/xiaomusic/static/default/downloadtool.html +++ b/xiaomusic/static/default/downloadtool.html @@ -4,8 +4,8 @@ 歌曲下载工具 - - + + diff --git a/xiaomusic/static/default/index.html b/xiaomusic/static/default/index.html index 5519abe..a9fee63 100644 --- a/xiaomusic/static/default/index.html +++ b/xiaomusic/static/default/index.html @@ -4,9 +4,9 @@ 小爱音箱操控面板 - - - + + + diff --git a/xiaomusic/static/default/m3u.html b/xiaomusic/static/default/m3u.html index 6738285..a5a8b79 100644 --- a/xiaomusic/static/default/m3u.html +++ b/xiaomusic/static/default/m3u.html @@ -5,7 +5,7 @@ M3U to JSON Converter - + diff --git a/xiaomusic/static/default/setting.html b/xiaomusic/static/default/setting.html index 8b15967..5c372e2 100644 --- a/xiaomusic/static/default/setting.html +++ b/xiaomusic/static/default/setting.html @@ -4,9 +4,9 @@ 小爱音箱操控面板 - - - + + + @@ -183,6 +183,12 @@ var vConsole = new window.VConsole(); + + + diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index ed5bbca..01c64e3 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -26,6 +26,7 @@ from xiaomusic.config import ( ) from xiaomusic.const import ( COOKIE_TEMPLATE, + GET_ASK_BY_MINA, LATEST_ASK_API, PLAY_TYPE_ALL, PLAY_TYPE_ONE, @@ -175,10 +176,15 @@ class XiaoMusic: session._cookie_jar = self.cookie_jar # 拉取所有音箱的对话记录 - tasks = [ - self.get_latest_ask_from_xiaoai(session, device_id) - for device_id in self.device_id_did - ] + tasks = [] + for device_id in self.device_id_did: + hardware = self.get_hardward(device_id) + if hardware in GET_ASK_BY_MINA or self.config.get_ask_by_mina: + tasks.append(self.get_latest_ask_by_mina(device_id)) + else: + tasks.append( + self.get_latest_ask_from_xiaoai(session, device_id) + ) await asyncio.gather(*tasks) start = time.perf_counter() @@ -315,6 +321,38 @@ class XiaoMusic: else: return self._get_last_query(device_id, data) + async def get_latest_ask_by_mina(self, device_id): + try: + did = self.get_did(device_id) + response = await self.mina_service.ubus_request( + device_id, "nlp_result_get", "mibrain", {} + ) + self.log.debug( + f"get_latest_ask_by_mina device_id:{device_id} did:{did} response:{response}" + ) + if d := response.get("data", {}).get("info", {}): + result = json.loads(d).get("result", []) + if result and len(result) > 0: + answers = ( + json.loads(result[0]["nlp"]) + .get("response", {}) + .get("answer", [{}]) + ) + if answers: + query = answers[0].get("intention", {}).get("query", "").strip() + timestamp = result[0]["timestamp"] + answer = answers[0].get("content", {}).get("to_speak") + last_record = { + "time": timestamp, + "did": did, + "query": query, + "answer": answer, + } + self._check_last_query(last_record) + except Exception as e: + self.log.exception(f"get_latest_ask_by_mina {e}") + return + def _get_last_query(self, device_id, data): did = self.get_did(device_id) self.log.debug(f"_get_last_query device_id:{device_id} did:{did} data:{data}") @@ -323,15 +361,26 @@ class XiaoMusic: if not records: return last_record = records[0] - timestamp = last_record.get("time") - # 首次用当前时间初始化 - if did not in self.last_timestamp: - self.last_timestamp[did] = int(time.time() * 1000) - if timestamp > self.last_timestamp[did]: - self.last_timestamp[did] = timestamp - last_record["did"] = did - self.last_record = last_record - self.new_record_event.set() + last_record["did"] = did + answers = last_record.get("answers", [{}]) + if answers: + answer = answers[0].get("tts", {}).get("text", "").strip() + last_record["answer"] = answer + self._check_last_query(last_record) + + def _check_last_query(self, last_record): + did = last_record["did"] + timestamp = last_record.get("time") + query = last_record.get("query", "").strip() + self.log.debug(f"获取到最后一条对话记录:{query} {timestamp}") + + # 首次用当前时间初始化 + if did not in self.last_timestamp: + self.last_timestamp[did] = int(time.time() * 1000) + if timestamp > self.last_timestamp[did]: + self.last_timestamp[did] = timestamp + self.last_record = last_record + self.new_record_event.set() def get_filename(self, name): if name not in self.all_music: @@ -662,6 +711,7 @@ class XiaoMusic: query = new_record.get("query", "").strip() did = new_record.get("did", "").strip() await self.do_check_cmd(did, query, False) + answer = new_record.get("answer") answers = new_record.get("answers", [{}]) if answers: answer = answers[0].get("tts", {}).get("text", "").strip()