From 3f3ac0efd25375404bd47590705d8fae8657e0d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Sat, 10 Jan 2026 02:27:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E6=AD=8C=E6=9B=B2=E9=93=BE=E6=8E=A5=E8=BD=AC=E6=8D=A2=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiaomusic/api/routers/file.py | 18 +++++++++++++++++- xiaomusic/api/routers/music.py | 2 ++ xiaomusic/online_music.py | 6 ++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/xiaomusic/api/routers/file.py b/xiaomusic/api/routers/file.py index 32881d2..8ccf9b2 100644 --- a/xiaomusic/api/routers/file.py +++ b/xiaomusic/api/routers/file.py @@ -4,7 +4,7 @@ import asyncio import base64 import os import shutil -from urllib.parse import urlparse +from urllib.parse import parse_qs, urlparse import aiohttp from fastapi import ( @@ -301,6 +301,21 @@ async def proxy(urlb64: str): status_code=400, detail="无效的URL格式" ) from invalid_url_exc + proxy_pre = f"{xiaomusic.hostname}:{xiaomusic.public_port}/api/proxy/openapi-url" + # 解决本地接口认证问题 + if url.startswith(proxy_pre): + query_params = parse_qs(parsed_url.query) + urlb64_value = query_params.get("urlb64", [""])[0] + url_bytes = base64.b64decode(urlb64_value) + origin_url = url_bytes.decode("utf-8") + log.info(f"origin_url: {origin_url}") + # 获取真正地址 + source_url = await xiaomusic.get_real_url_of_openapi(origin_url) + log.info(f"source_url: {source_url}") + parsed_url = urlparse(source_url) + url = source_url + log.info(f"parsed_url: {parsed_url}") + # 创建会话并确保关闭 session = aiohttp.ClientSession( timeout=aiohttp.ClientTimeout(total=600), @@ -325,6 +340,7 @@ async def proxy(urlb64: str): headers = get_wget_headers(parsed_url) resp = await session.get(url, headers=headers, allow_redirects=True) + log.info(f"proxy status: {resp.status}") if resp.status not in (200, 206): await close_session() status_exc = ValueError(f"服务器返回状态码: {resp.status}") diff --git a/xiaomusic/api/routers/music.py b/xiaomusic/api/routers/music.py index 659e15d..8ac9718 100644 --- a/xiaomusic/api/routers/music.py +++ b/xiaomusic/api/routers/music.py @@ -109,7 +109,9 @@ async def get_openapi_source_url( url_bytes = base64.b64decode(urlb64) origin_url = url_bytes.decode("utf-8") # 获取真正地址 + log.info(f"origin_url: {origin_url}") source_url = await xiaomusic.get_real_url_of_openapi(origin_url) + log.info(f"source_url: {source_url}") if not source_url: source_url = xiaomusic.default_url() # 直接重定向到真实URL diff --git a/xiaomusic/online_music.py b/xiaomusic/online_music.py index bf954dc..8da3b2b 100644 --- a/xiaomusic/online_music.py +++ b/xiaomusic/online_music.py @@ -382,10 +382,12 @@ class OnlineMusicService: source_url = item.get("url", "") is_open_api = item.get("isOpenAPI", False) music_item = {} - # 如果是开放接口,可能需要额外处理 - if is_open_api and source_url: + # 如果不是开放接口,可能需要额外处理 + if (not is_open_api) and source_url: # 使用代理url music_item["url"] = self._get_openapi_proxy_url(source_url) + elif source_url: + music_item["url"] = source_url else: # 返回插件源的代理接口 music_item["url"] = self._get_plugin_proxy_url(item)