1
0
mirror of https://github.com/hanxi/xiaomusic.git synced 2026-05-14 10:47:51 +08:00

重构搜索下载逻辑

This commit is contained in:
涵曦
2026-01-19 14:54:40 +08:00
parent 69d12189ce
commit fefdae7ba6

View File

@@ -209,46 +209,102 @@ class XiaoMusicDevice:
update_cur_list=update_cur_list,
)
async def _try_download_play(self, name="", search_key=""):
if not self.xiaomusic.music_library.is_music_exist(name):
self.log.info(f"本地不存在歌曲{name}")
if self.config.disable_download:
await self.do_tts(f"本地不存在歌曲{name}")
return
async def _check_and_download_music(self, name, search_key, allow_download):
"""检查本地歌曲是否存在,如果不存在则根据参数决定是否下载
# 如果插件播放失败,则执行下载流程
await self.download(search_key, name)
# 把文件插入到播放列表里
await self.add_download_music(name)
await self._playmusic(name)
Args:
name: 歌曲名称
search_key: 搜索关键词
allow_download: 是否允许下载
async def _play(self, name="", search_key="", exact=True, update_cur_list=False):
"""播放歌曲(内部实现)"""
Returns:
bool: True表示歌曲存在或下载成功False表示歌曲不存在且不允许下载
"""
if self.xiaomusic.music_library.is_music_exist(name):
return True
self.log.info(f"本地不存在歌曲{name}")
# 根据 allow_download 参数决定行为
if not allow_download:
# playlocal 的行为:不下载,直接提示
await self.do_tts(f"本地不存在歌曲{name}")
return False
# _play 的行为:检查配置决定是否下载
if self.config.disable_download:
await self.do_tts(f"本地不存在歌曲{name}")
return False
# 下载歌曲
await self.download(search_key, name)
# 把文件插入到播放列表里
await self.add_download_music(name)
return True
async def _play_internal(
self,
name="",
search_key="",
exact=True,
update_cur_list=False,
allow_download=True,
):
"""播放歌曲的内部统一实现
Args:
name: 歌曲名称
search_key: 搜索关键词
exact: 是否精确匹配
update_cur_list: 是否更新当前列表
allow_download: 是否允许下载True: _play行为False: playlocal行为
"""
# 初始检查逻辑
if not search_key and not name:
if self.check_play_next():
await self._play_next()
return
else:
name = self.get_cur_music()
self.log.info(f"play. search_key:{search_key} name:{name}: exact:{exact}")
self.log.info(
f"play_internal. search_key:{search_key} name:{name} exact:{exact} allow_download:{allow_download}"
)
if not name:
self.log.info(f"没有歌曲播放了 name:{name} search_key:{search_key}")
return
# 本地歌曲不存在时下载
# 精确匹配分支
if exact:
await self._try_download_play(name, search_key)
# 检查本地是否存在歌曲,不存在则根据参数决定是否下载
if not await self._check_and_download_music(
name, search_key, allow_download
):
return
# 播放歌曲
await self._playmusic(name)
return
# 模糊搜索分支
names = self.xiaomusic.find_real_music_name(
name, n=self.config.search_music_count
)
self.log.info(f"play. names:{names} {len(names)}")
self.log.info(f"play_internal. names:{names} {len(names)}")
if not names:
await self._try_download_play(name, search_key)
# 检查本地是否存在歌曲,不存在则根据参数决定是否下载
if not await self._check_and_download_music(
name, search_key, allow_download
):
return
# 播放歌曲
await self._playmusic(name)
return
# 处理搜索结果
if len(names) > 1: # 大于一首歌才更新
self._play_list = names
self.device.cur_playlist = "临时搜索列表"
@@ -258,17 +314,29 @@ class XiaoMusicDevice:
self._play_list = self._play_list + names
self.device.cur_playlist = "临时搜索列表"
self.update_playlist(reorder=False)
name = names[0]
if update_cur_list and (name not in self._play_list):
# 根据当前歌曲匹配歌曲列表
self.device.cur_playlist = self.find_cur_playlist(name)
self.update_playlist()
self.log.debug(
f"当前播放列表为:{list2str(self._play_list, self.config.verbose)}"
)
# 本地存在歌曲,直接播放
await self._playmusic(name)
async def _play(self, name="", search_key="", exact=True, update_cur_list=False):
"""播放歌曲(内部实现)- 支持下载"""
return await self._play_internal(
name=name,
search_key=search_key,
exact=exact,
update_cur_list=update_cur_list,
allow_download=True,
)
async def play_next(self):
"""播放下一首(外部接口)"""
return await self._play_next()
@@ -316,48 +384,16 @@ class XiaoMusicDevice:
return
await self._play(name, exact=True)
async def playlocal(self, name, exact=True, update_cur_list=False):
"""播放本地歌曲"""
async def playlocal(self, name="", exact=True, update_cur_list=False):
"""播放本地歌曲 - 不下载"""
self._last_cmd = "playlocal"
if name == "":
if self.check_play_next():
await self._play_next()
return
else:
name = self.get_cur_music()
self.log.info(f"playlocal. name:{name}")
# 本地歌曲不存在时下载
if exact:
names = self.xiaomusic.find_real_music_name(name, n=1)
else:
names = self.xiaomusic.find_real_music_name(
name, n=self.config.search_music_count
)
if len(names) > 0:
if not exact:
if len(names) > 1: # 大于一首歌才更新
self._play_list = names
self.device.cur_playlist = "临时搜索列表"
self.update_playlist()
else: # 只有一首歌append
self._play_list = self._play_list + names
self.device.cur_playlist = "临时搜索列表"
self.update_playlist(reorder=False)
name = names[0]
if update_cur_list:
# 根据当前歌曲匹配歌曲列表
self.device.cur_playlist = self.find_cur_playlist(name)
self.update_playlist()
self.log.debug(
f"当前播放列表为:{list2str(self._play_list, self.config.verbose)}"
)
elif not self.xiaomusic.music_library.is_music_exist(name):
self.log.info(f"本地不存在歌曲{name}")
await self.do_tts(f"本地不存在歌曲{name}")
return
await self._playmusic(name)
return await self._play_internal(
name=name,
search_key="",
exact=exact,
update_cur_list=update_cur_list,
allow_download=False,
)
async def _playmusic(self, name):
"""播放音乐的核心实现"""