From 9229392ee65309cd64bc2131046b8e82c3e9f174 Mon Sep 17 00:00:00 2001 From: mwjdot888 Date: Mon, 4 May 2026 16:25:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(api):=20=E4=BC=98=E5=8C=96=E9=9F=B3?= =?UTF-8?q?=E4=B9=90=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E9=99=A4TailWind=E4=B8=BB=E9=A2=98=E4=B8=8B?= =?UTF-8?q?=E4=BB=85=E6=94=AF=E6=8C=81mp3=E6=96=87=E4=BB=B6=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E7=9A=84=E9=99=90=E5=88=B6=20(#852)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 支持自定义temp_path路径,临时文件不再依赖music_path挂载 以前临时文件需挂载在music_path下才能访问,现在temp/前缀的文件直接从 config.temp_path提供访问,支持自定义任意临时目录路径。 Co-Authored-By: Claude Opus 4.7 * feat: 增强OGG封面解析,支持FLAC二进制结构的metadata_block_picture 解析metadata_block_picture标签时,先尝试JSON格式再尝试FLAC二进制结构格式, 兼容更多工具生成的OGG文件封面数据。 Co-Authored-By: Claude Opus 4.7 * feat(api): 优化音乐信息获取接口 - 将 musicinfos 接口从 GET 请求改为 POST 请求以支持批量查询 - 添加 MusicInfosQuery 模型用于接收音乐信息查询参数 - 在前端 API 调用中使用 JSON 格式传输歌曲名称数组 - 扩展音频文件格式验证,支持 mp3、flac、wav、ogg、aac、m4a、wma、ape 等格式 - 保留 musictag 参数功能以控制是否返回音乐标签信息 --------- Co-authored-by: mwjdot888 Co-authored-by: Claude Opus 4.7 Co-authored-by: maowenjun --- xiaomusic/api/models.py | 5 +++++ xiaomusic/api/routers/music.py | 17 +++++++++++++++++ xiaomusic/static/tailwind/api.js | 14 ++++++++------ xiaomusic/static/tailwind/index.html | 3 ++- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/xiaomusic/api/models.py b/xiaomusic/api/models.py index 13d3f1f..adf9d06 100644 --- a/xiaomusic/api/models.py +++ b/xiaomusic/api/models.py @@ -72,3 +72,8 @@ class PlayListUpdateObj(BaseModel): class PlayListMusicObj(BaseModel): name: str = "" # 歌单名 music_list: list[str] # 歌曲名列表 + + +class MusicInfosQuery(BaseModel): + name: list[str] + musictag: bool = False diff --git a/xiaomusic/api/routers/music.py b/xiaomusic/api/routers/music.py index c2cd504..0c08417 100644 --- a/xiaomusic/api/routers/music.py +++ b/xiaomusic/api/routers/music.py @@ -21,6 +21,7 @@ from xiaomusic.api.dependencies import ( from xiaomusic.api.models import ( DidPlayMusic, MusicInfoObj, + MusicInfosQuery, MusicItem, ) @@ -267,6 +268,22 @@ async def musicinfos( return ret +@router.post("/musicinfos") +async def musicinfos_post(data: MusicInfosQuery): + """批量音乐信息(POST,避免 URL 过长)""" + ret = [] + for music_name in data.name: + url, _ = await xiaomusic.music_library.get_music_url(music_name) + info = { + "name": music_name, + "url": url, + } + if data.musictag: + info["tags"] = await xiaomusic.music_library.get_music_tags(music_name) + ret.append(info) + return ret + + @router.post("/setmusictag") async def setmusictag(info: MusicInfoObj): """设置音乐标签""" diff --git a/xiaomusic/static/tailwind/api.js b/xiaomusic/static/tailwind/api.js index 6ac9b9d..6931939 100644 --- a/xiaomusic/static/tailwind/api.js +++ b/xiaomusic/static/tailwind/api.js @@ -11,12 +11,14 @@ const API = { if (!Array.isArray(songNames)) { throw new Error('songNames must be an array'); } - - const queryParams = songNames - .map(name => `name=${encodeURIComponent(name)}`) - .join('&'); - - const response = await fetch(`/musicinfos?${queryParams}&musictag=true`); + + const response = await fetch('/musicinfos', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ name: songNames, musictag: true }) + }); return response.json(); }, diff --git a/xiaomusic/static/tailwind/index.html b/xiaomusic/static/tailwind/index.html index 94df40a..fb5706a 100644 --- a/xiaomusic/static/tailwind/index.html +++ b/xiaomusic/static/tailwind/index.html @@ -927,7 +927,8 @@ // 验证URL是否有效 const validUrl = new URL(musicInfo.url); - if (!validUrl.pathname.endsWith('.mp3')) { + const audioExts = ['.mp3', '.flac', '.wav', '.ogg', '.aac', '.m4a', '.wma', '.ape']; + if (!audioExts.some(ext => validUrl.pathname.endsWith(ext))) { console.error('Invalid music URL format:', validUrl); showMessage('音乐文件格式不支持', 'alert-error'); return;