1
0
mirror of https://github.com/hanxi/xiaomusic.git synced 2025-12-06 14:52:50 +08:00

Compare commits

...

5 Commits

Author SHA1 Message Date
涵曦
d799a85ab9 new version v0.1.49 2024-06-20 04:12:33 +00:00
涵曦
4ad6bcc636 播放列表排序显示,修复顺序播放问题 2024-06-20 04:12:23 +00:00
涵曦
d2473ec7e8 全部循环为顺序播放,和随机播放区分开 2024-06-18 07:06:16 +00:00
涵曦
28797edc7c new version v0.1.48 2024-06-16 06:14:37 +00:00
涵曦
be1a643071 忽略目录默认值修改 2024-06-16 06:14:33 +00:00
6 changed files with 65 additions and 10 deletions

View File

@@ -1,6 +1,6 @@
[project]
name = "xiaomusic"
version = "0.1.47"
version = "0.1.49"
description = "Play Music with xiaomi AI speaker"
authors = [
{name = "涵曦", email = "im.hanxi@gmail.com"},

View File

@@ -1 +1 @@
__version__ = "0.1.47"
__version__ = "0.1.49"

View File

@@ -95,7 +95,7 @@ class Config:
) # "bilisearch:" or "ytsearch:"
ffmpeg_location: str = os.getenv("XIAOMUSIC_FFMPEG_LOCATION", "./ffmpeg/bin")
active_cmd: str = os.getenv("XIAOMUSIC_ACTIVE_CMD", "play,random_play")
exclude_dirs: str = os.getenv("XIAOMUSIC_EXCLUDE_DIRS", "@eadir")
exclude_dirs: str = os.getenv("XIAOMUSIC_EXCLUDE_DIRS", "@eaDir")
def __post_init__(self) -> None:
if self.proxy:

View File

@@ -38,7 +38,8 @@ $(function(){
$('#music_list').change(function() {
const selectedValue = $(this).val();
$('#music_name').empty();
$.each(data[selectedValue], function(index, item) {
const sorted_musics = data[selectedValue].sort(custom_sort_key);
$.each(sorted_musics, function(index, item) {
$('#music_name').append($('<option></option>').val(item).text(item));
});
});
@@ -163,4 +164,23 @@ $(function(){
setInterval(() => {
get_playing_music();
}, 3000);
function custom_sort_key(a, b) {
// 使用正则表达式提取数字前缀
const numericPrefixA = a.match(/^(\d+)/) ? parseInt(a.match(/^(\d+)/)[1], 10) : null;
const numericPrefixB = b.match(/^(\d+)/) ? parseInt(b.match(/^(\d+)/)[1], 10) : null;
// 如果两个键都有数字前缀,则按数字大小排序
if (numericPrefixA !== null && numericPrefixB !== null) {
return numericPrefixA - numericPrefixB;
}
// 如果一个键有数字前缀而另一个没有,则有数字前缀的键排在前面
if (numericPrefixA !== null) return -1;
if (numericPrefixB !== null) return 1;
// 如果两个键都没有数字前缀,则按照常规字符串排序
return a.localeCompare(b);
}
});

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,14 @@ 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:
random.shuffle(self._play_list)
else:
self._play_list.sort(key=custom_sort_key)
self.log.debug("play_list:%s", self._play_list)
# 把下载的音乐加入播放列表
def add_download_music(self, name):
self._all_music[name] = os.path.join(self.music_path, f"{name}.mp3")
@@ -579,7 +589,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 +608,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 +645,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 = ""