From d2473ec7e8ce3c64aa0b50332f9e79dcced70e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Tue, 18 Jun 2024 07:06:16 +0000 Subject: [PATCH] =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=BE=AA=E7=8E=AF=E4=B8=BA?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E6=92=AD=E6=94=BE=EF=BC=8C=E5=92=8C=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E6=92=AD=E6=94=BE=E5=8C=BA=E5=88=86=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/utils.py | 20 ++++++++++++++++++++ xiaomusic/xiaomusic.py | 26 ++++++++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/xiaomusic/utils.py b/xiaomusic/utils.py index 1056270..d80ff95 100644 --- a/xiaomusic/utils.py +++ b/xiaomusic/utils.py @@ -64,3 +64,23 @@ def validate_proxy(proxy_str: str) -> bool: # 模糊搜索 def fuzzyfinder(user_input, collection): return difflib.get_close_matches(user_input, collection, 10, cutoff=0.1) + + +# 歌曲排序 +def custom_sort_key(s): + # 使用正则表达式分别提取字符串的数字前缀和数字后缀 + prefix_match = re.match(r"^(\d+)", s) + suffix_match = re.search(r"(\d+)$", s) + + numeric_prefix = int(prefix_match.group(0)) if prefix_match else None + numeric_suffix = int(suffix_match.group(0)) if suffix_match else None + + if numeric_prefix is not None: + # 如果前缀是数字,先按前缀数字排序,再按整个字符串排序 + return (0, numeric_prefix, s) + elif numeric_suffix is not None: + # 如果后缀是数字,先按前缀字符排序,再按后缀数字排序 + return (1, s[: suffix_match.start()], numeric_suffix) + else: + # 如果前缀和后缀都不是数字,按字典序排序 + return (2, s) diff --git a/xiaomusic/xiaomusic.py b/xiaomusic/xiaomusic.py index 2bec4b1..faea3c0 100644 --- a/xiaomusic/xiaomusic.py +++ b/xiaomusic/xiaomusic.py @@ -32,12 +32,14 @@ from xiaomusic.httpserver import StartHTTPServer from xiaomusic.utils import ( fuzzyfinder, parse_cookie_string, + custom_sort_key, ) EOF = object() PLAY_TYPE_ONE = 0 # 单曲循环 PLAY_TYPE_ALL = 1 # 全部循环 +PLAY_TYPE_RND = 2 # 随机播放 class XiaoMusic: @@ -67,7 +69,7 @@ class XiaoMusic: # 下载对象 self.download_proc = None # 单曲循环,全部循环 - self.play_type = PLAY_TYPE_ALL + self.play_type = PLAY_TYPE_RND self.cur_music = "" self._next_timer = None self._timeout = 0 @@ -377,7 +379,7 @@ class XiaoMusic: pass self._play_list = list(self._all_music.keys()) self._cur_play_list = "全部" - random.shuffle(self._play_list) + self._gen_play_list() self.log.debug(self._all_music) self._music_list = {} @@ -387,6 +389,13 @@ class XiaoMusic: self.log.debug("dir_name:%s, list:%s", dir_name, self._music_list[dir_name]) pass + # 歌曲排序或者打乱顺序 + def _gen_play_list(self): + if self.play_type == PLAY_TYPE_RND: + self._play_list.sort(key=custom_sort_key) + else: + random.shuffle(self._play_list) + # 把下载的音乐加入播放列表 def add_download_music(self, name): self._all_music[name] = os.path.join(self.music_path, f"{name}.mp3") @@ -579,7 +588,11 @@ class XiaoMusic: self.log.info("下一首") name = self.cur_music self.log.debug("play_next. name:%s, cur_music:%s", name, self.cur_music) - if self.play_type == PLAY_TYPE_ALL or name == "": + if ( + self.play_type == PLAY_TYPE_ALL + or self.play_type == PLAY_TYPE_RND + or name == "" + ): name = self.get_next_music() if name == "": await self.do_tts("本地没有歌曲") @@ -594,12 +607,13 @@ class XiaoMusic: # 全部循环 async def set_play_type_all(self, **kwargs): self.play_type = PLAY_TYPE_ALL + self._gen_play_list() await self.do_tts("已经设置为全部循环") # 随机播放 async def random_play(self, **kwargs): - self.play_type = PLAY_TYPE_ALL - random.shuffle(self._play_list) + self.play_type = PLAY_TYPE_RND + self._gen_play_list() await self.do_tts("已经设置为随机播放") # 刷新列表 @@ -630,7 +644,7 @@ class XiaoMusic: return self._play_list = self._music_list[list_name] self._cur_play_list = list_name - random.shuffle(self._play_list) + self._gen_play_list() self.log.info(f"开始播放列表{list_name}") music_name = ""