1
0
mirror of https://github.com/hanxi/xiaomusic.git synced 2026-03-15 08:13:16 +08:00

feat(api): support downloadonemusic dirname under music_path (#751)

Co-authored-by: pc hu <>
This commit is contained in:
hpcll
2026-02-11 22:58:53 +08:00
committed by GitHub
parent 681e0ae96c
commit ce3b4065b8
2 changed files with 22 additions and 18 deletions

View File

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

View File

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