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

fix: 解决在线歌曲链接转换问题

This commit is contained in:
涵曦
2026-01-10 02:27:19 +08:00
parent 1f3944b394
commit 3f3ac0efd2
3 changed files with 23 additions and 3 deletions

View File

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

View File

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

View File

@@ -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)