From ce3b4065b8193ec48e993b6a4f94009df0038db7 Mon Sep 17 00:00:00 2001 From: hpcll <1471009316@qq.com> Date: Wed, 11 Feb 2026 22:58:53 +0800 Subject: [PATCH] feat(api): support downloadonemusic dirname under music_path (#751) Co-authored-by: pc hu <> --- xiaomusic/api/routers/file.py | 24 +++++++++++++++--------- xiaomusic/utils/network_utils.py | 16 +++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/xiaomusic/api/routers/file.py b/xiaomusic/api/routers/file.py index 39a8a84..7d196a7 100644 --- a/xiaomusic/api/routers/file.py +++ b/xiaomusic/api/routers/file.py @@ -172,23 +172,29 @@ async def downloadonemusic(data: DownloadOneMusic, Verifcation=Depends(verificat Args: data.name: 文件名(可选) data.url: 下载链接(必填) - data.dirname: 子目录名(可选),相对于下载目录 + data.dirname: 子目录名(可选),相对于 music 根目录 """ try: - download_proc = await download_one_music( - config, data.url, data.name, data.dirname - ) - - # 计算实际下载路径 - download_path = config.download_path + download_root = config.download_path if data.dirname: - download_path = os.path.join(config.download_path, data.dirname) + download_root = safe_join_path(config.music_path, data.dirname) + os.makedirs(download_root, exist_ok=True) + + download_proc = await download_one_music( + config, + data.url, + data.name, + download_root=download_root, + ) async def check_download_proc(): # 等待子进程完成 exit_code = await download_proc.wait() log.info(f"Download completed with exit code {exit_code}") - chmoddir(download_path) + try: + chmoddir(download_root) + except Exception: + pass asyncio.create_task(check_download_proc()) return {"ret": "OK"} diff --git a/xiaomusic/utils/network_utils.py b/xiaomusic/utils/network_utils.py index b674ba1..ddab972 100644 --- a/xiaomusic/utils/network_utils.py +++ b/xiaomusic/utils/network_utils.py @@ -191,7 +191,9 @@ async def download_playlist(config, url: str, dirname: str): return download_proc -async def download_one_music(config, url: str, name: str = "", dirname: str = ""): +async def download_one_music( + config, url: str, name: str = "", download_root: str | None = None +): """ 下载单首歌曲 @@ -199,20 +201,16 @@ async def download_one_music(config, url: str, name: str = "", dirname: str = "" config: 配置对象 url: 歌曲 URL name: 文件名(可选) - dirname: 子目录名(可选),相对于 download_path + download_root: 下载目录(可选),默认为 config.download_path Returns: 下载进程对象 """ - # 计算下载路径 - download_path = config.download_path - if dirname: - download_path = os.path.join(config.download_path, dirname) - os.makedirs(download_path, exist_ok=True) - title = "%(title)s.%(ext)s" if name: title = f"{name}.%(ext)s" + download_root = download_root or config.download_path + sbp_args = ( "yt-dlp", "--no-playlist", @@ -222,7 +220,7 @@ async def download_one_music(config, url: str, name: str = "", dirname: str = "" "--audio-quality", "0", "--paths", - download_path, + download_root, "-o", title, "--ffmpeg-location",