全部循环为顺序播放,和随机播放区分开

This commit is contained in:
涵曦 2024-06-18 07:06:16 +00:00
parent 28797edc7c
commit d2473ec7e8
2 changed files with 40 additions and 6 deletions

View File

@ -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)

View File

@ -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 = ""