添加音频代理
This commit is contained in:
@@ -23,8 +23,6 @@ async def get_audio_proxy_dependency(redis_client: Annotated[redis.Redis, Depend
|
|||||||
return get_audio_proxy_service(redis_client)
|
return get_audio_proxy_service(redis_client)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/beatmapset/{beatmapset_id}")
|
@router.get("/beatmapset/{beatmapset_id}")
|
||||||
async def get_beatmapset_audio(
|
async def get_beatmapset_audio(
|
||||||
beatmapset_id: Annotated[int, Path(description="谱面集ID", ge=1)],
|
beatmapset_id: Annotated[int, Path(description="谱面集ID", ge=1)],
|
||||||
@@ -53,7 +51,7 @@ async def get_beatmapset_audio(
|
|||||||
headers={
|
headers={
|
||||||
"Cache-Control": "public, max-age=604800", # 7天缓存
|
"Cache-Control": "public, max-age=604800", # 7天缓存
|
||||||
"Content-Length": str(len(audio_data)),
|
"Content-Length": str(len(audio_data)),
|
||||||
"Content-Disposition": f"inline; filename=\"{beatmapset_id}.mp3\"",
|
"Content-Disposition": f'inline; filename="{beatmapset_id}.mp3"',
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ class AssetProxyService:
|
|||||||
self.asset_proxy_prefix = settings.asset_proxy_prefix
|
self.asset_proxy_prefix = settings.asset_proxy_prefix
|
||||||
self.avatar_proxy_prefix = settings.avatar_proxy_prefix
|
self.avatar_proxy_prefix = settings.avatar_proxy_prefix
|
||||||
self.beatmap_proxy_prefix = settings.beatmap_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:
|
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
|
r"https://assets\.ppy\.sh/", f"https://{self.asset_proxy_prefix}.{self.custom_asset_domain}/", result
|
||||||
)
|
)
|
||||||
|
|
||||||
# 替换 b.ppy.sh 预览音频 (保持//前缀)
|
# 替换 b.ppy.sh 预览音频为我们的音频代理接口
|
||||||
result = re.sub(r"//b\.ppy\.sh/", f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/", result)
|
# 匹配 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 预览音频 (转换为//前缀)
|
# 匹配 //b.ppy.sh/preview/{beatmapset_id}.mp3 格式
|
||||||
result = re.sub(
|
result = re.sub(r"//b\.ppy\.sh/preview/(\d+)\.mp3", rf"{self.audio_proxy_base_url}/\1", result)
|
||||||
r"https://b\.ppy\.sh/", f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/", result
|
|
||||||
)
|
|
||||||
|
|
||||||
# 替换 a.ppy.sh 头像
|
# 替换 a.ppy.sh 头像
|
||||||
result = re.sub(
|
result = re.sub(
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
import httpx
|
import httpx
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
@@ -123,7 +122,6 @@ class AudioProxyService:
|
|||||||
return audio_data, content_type
|
return audio_data, content_type
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_audio_proxy_service(redis_client: redis.Redis) -> AudioProxyService:
|
def get_audio_proxy_service(redis_client: redis.Redis) -> AudioProxyService:
|
||||||
"""获取音频代理服务实例"""
|
"""获取音频代理服务实例"""
|
||||||
# 每次创建新实例,避免全局状态
|
# 每次创建新实例,避免全局状态
|
||||||
|
|||||||
Reference in New Issue
Block a user