From cef5278f168a91269ea710e8e57367e8952c24e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Sat, 21 Sep 2024 01:10:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=8F=A3=E4=BB=A4?= =?UTF-8?q?=E3=80=90=E6=92=AD=E6=94=BE=E5=88=97=E8=A1=A8=E7=AC=AC=E5=87=A0?= =?UTF-8?q?=E4=B8=AA+=E5=88=97=E8=A1=A8=E5=90=8D=E3=80=91=E6=9D=A5?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=88=97=E8=A1=A8=E9=87=8C=E7=9A=84=E7=AC=AC?= =?UTF-8?q?=E5=87=A0=E4=B8=AA=20#158?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/config.py | 5 ++++- xiaomusic/utils.py | 38 ++++++++++++++++++++++++++++++++++++++ xiaomusic/xiaomusic.py | 25 +++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/xiaomusic/config.py b/xiaomusic/config.py index 39a2418..163280c 100644 --- a/xiaomusic/config.py +++ b/xiaomusic/config.py @@ -25,6 +25,7 @@ def default_key_word_dict(): "刷新列表": "gen_music_list", "加入收藏": "add_to_favorites", "取消收藏": "del_from_favorites", + "播放列表第": "play_music_list_index", } @@ -53,6 +54,7 @@ def default_key_match_order(): "随机播放", "关机", "刷新列表", + "播放列表第", "播放列表", "加入收藏", "取消收藏", @@ -91,7 +93,8 @@ class Config: ) # "bilisearch:" or "ytsearch:" ffmpeg_location: str = os.getenv("XIAOMUSIC_FFMPEG_LOCATION", "./ffmpeg/bin") active_cmd: str = os.getenv( - "XIAOMUSIC_ACTIVE_CMD", "play,set_random_play,playlocal,play_music_list,stop" + "XIAOMUSIC_ACTIVE_CMD", + "play,set_random_play,playlocal,play_music_list,play_music_list_index,stop_after_minute,stop", ) exclude_dirs: str = os.getenv("XIAOMUSIC_EXCLUDE_DIRS", "@eaDir") music_path_depth: int = int(os.getenv("XIAOMUSIC_MUSIC_PATH_DEPTH", "10")) diff --git a/xiaomusic/utils.py b/xiaomusic/utils.py index 04985fe..c97da06 100644 --- a/xiaomusic/utils.py +++ b/xiaomusic/utils.py @@ -402,3 +402,41 @@ def convert_file_to_mp3(input_file: str, ffmpeg_location: str, music_path: str) relative_path = os.path.relpath(out_file_path, music_path) return relative_path + + +chinese_to_arabic = { + "零": 0, + "一": 1, + "二": 2, + "三": 3, + "四": 4, + "五": 5, + "六": 6, + "七": 7, + "八": 8, + "九": 9, + "十": 10, + "百": 100, + "千": 1000, + "万": 10000, + "亿": 100000000, +} + + +def chinese_to_number(chinese): + result = 0 + unit = 1 + num = 0 + for char in reversed(chinese): + if char in chinese_to_arabic: + val = chinese_to_arabic[char] + if val >= 10: + if val > unit: + unit = val + else: + unit *= val + else: + num += val * unit + result += num + num = 0 + return result diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index 8c3a9e2..45013dd 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -35,6 +35,7 @@ from xiaomusic.const import ( from xiaomusic.crontab import Crontab from xiaomusic.plugin import PluginManager from xiaomusic.utils import ( + chinese_to_number, convert_file_to_mp3, custom_sort_key, deepcopy_data_no_sensitive_info, @@ -741,6 +742,30 @@ class XiaoMusic: music_name = parts[1] await self.devices[did].play_music_list(list_name, music_name) + # 播放一个播放列表里第几个 + async def play_music_list_index(self, did="", arg1="", **kwargs): + patternarg = r"^([零一二三四五六七八九十百千万亿]+)个(.*)" + # 匹配参数 + matcharg = re.match(patternarg, arg1) + if not matcharg: + return await self.play_music_list(did, arg1) + + chinese_index = matcharg.groups()[0] + list_name = matcharg.groups()[1] + list_name = self._find_real_music_list_name(list_name) + if list_name not in self.music_list: + await self.do_tts(did, f"播放列表{list_name}不存在") + return + + index = chinese_to_number(chinese_index) + play_list = self.music_list[list_name] + if 0 <= index - 1 < len(play_list): + music_name = play_list[index - 1] + self.log.info(f"即将播放 ${arg1} 里的第 ${index} 个: ${music_name}") + await self.devices[did].play_music_list(list_name, music_name) + return + await self.do_tts(did, f"播放列表{list_name}中找不到第${index}个") + # 播放 async def play(self, did="", arg1="", **kwargs): parts = arg1.split("|")