添加音频代理

This commit is contained in:
咕谷酱
2025-09-23 03:32:30 +08:00
parent 884a4cad2c
commit 7d6eeae073
3 changed files with 8 additions and 11 deletions

View File

@@ -23,8 +23,6 @@ async def get_audio_proxy_dependency(redis_client: Annotated[redis.Redis, Depend
return get_audio_proxy_service(redis_client)
@router.get("/beatmapset/{beatmapset_id}")
async def get_beatmapset_audio(
beatmapset_id: Annotated[int, Path(description="谱面集ID", ge=1)],
@@ -53,7 +51,7 @@ async def get_beatmapset_audio(
headers={
"Cache-Control": "public, max-age=604800", # 7天缓存
"Content-Length": str(len(audio_data)),
"Content-Disposition": f"inline; filename=\"{beatmapset_id}.mp3\"",
"Content-Disposition": f'inline; filename="{beatmapset_id}.mp3"',
},
)

View File

@@ -20,6 +20,8 @@ class AssetProxyService:
self.asset_proxy_prefix = settings.asset_proxy_prefix
self.avatar_proxy_prefix = settings.avatar_proxy_prefix
self.beatmap_proxy_prefix = settings.beatmap_proxy_prefix
# 音频代理接口URL
self.audio_proxy_base_url = f"{settings.server_url}api/private/audio/beatmapset"
async def replace_asset_urls(self, data: Any) -> Any:
"""
@@ -52,13 +54,12 @@ class AssetProxyService:
r"https://assets\.ppy\.sh/", f"https://{self.asset_proxy_prefix}.{self.custom_asset_domain}/", result
)
# 替换 b.ppy.sh 预览音频 (保持//前缀)
result = re.sub(r"//b\.ppy\.sh/", f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/", result)
# 替换 b.ppy.sh 预览音频为我们的音频代理接口
# 匹配 https://b.ppy.sh/preview/{beatmapset_id}.mp3 格式
result = re.sub(r"https://b\.ppy\.sh/preview/(\d+)\.mp3", rf"{self.audio_proxy_base_url}/\1", result)
# 替换 https://b.ppy.sh 预览音频 (转换为//前缀)
result = re.sub(
r"https://b\.ppy\.sh/", f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/", result
)
# 匹配 //b.ppy.sh/preview/{beatmapset_id}.mp3 格式
result = re.sub(r"//b\.ppy\.sh/preview/(\d+)\.mp3", rf"{self.audio_proxy_base_url}/\1", result)
# 替换 a.ppy.sh 头像
result = re.sub(

View File

@@ -5,7 +5,6 @@
from __future__ import annotations
from fastapi import HTTPException
import httpx
from loguru import logger
@@ -123,7 +122,6 @@ class AudioProxyService:
return audio_data, content_type
def get_audio_proxy_service(redis_client: redis.Redis) -> AudioProxyService:
"""获取音频代理服务实例"""
# 每次创建新实例,避免全局状态