80 lines
1.9 KiB
Python
80 lines
1.9 KiB
Python
"""
|
||
资源代理辅助函数和中间件
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from typing import Any
|
||
|
||
from app.config import settings
|
||
from app.service.asset_proxy_service import get_asset_proxy_service
|
||
|
||
from fastapi import Request
|
||
|
||
|
||
async def process_response_assets(data: Any, request: Request) -> Any:
|
||
"""
|
||
根据配置处理响应数据中的资源URL
|
||
|
||
Args:
|
||
data: API响应数据
|
||
request: FastAPI请求对象
|
||
|
||
Returns:
|
||
处理后的数据
|
||
"""
|
||
if not settings.enable_asset_proxy:
|
||
return data
|
||
|
||
asset_service = get_asset_proxy_service()
|
||
|
||
# 仅URL替换模式
|
||
return await asset_service.replace_asset_urls(data)
|
||
|
||
|
||
def should_process_asset_proxy(path: str) -> bool:
|
||
"""
|
||
判断路径是否需要处理资源代理
|
||
"""
|
||
# 只对特定的API端点处理资源代理
|
||
asset_proxy_endpoints = [
|
||
"/api/v1/users/",
|
||
"/api/v2/users/",
|
||
"/api/v1/me/",
|
||
"/api/v2/me/",
|
||
"/api/v2/beatmapsets/search",
|
||
"/api/v2/beatmapsets/lookup",
|
||
"/api/v2/beatmaps/",
|
||
"/api/v1/beatmaps/",
|
||
"/api/v2/beatmapsets/",
|
||
# 可以根据需要添加更多端点
|
||
]
|
||
|
||
return any(path.startswith(endpoint) for endpoint in asset_proxy_endpoints)
|
||
|
||
|
||
# 响应处理装饰器
|
||
def asset_proxy_response(func):
|
||
"""
|
||
装饰器:自动处理响应中的资源URL
|
||
"""
|
||
|
||
async def wrapper(*args, **kwargs):
|
||
# 获取request对象
|
||
request = None
|
||
for arg in args:
|
||
if isinstance(arg, Request):
|
||
request = arg
|
||
break
|
||
|
||
# 执行原函数
|
||
result = await func(*args, **kwargs)
|
||
|
||
# 如果有request对象且启用了资源代理,则处理响应
|
||
if request and settings.enable_asset_proxy and should_process_asset_proxy(request.url.path):
|
||
result = await process_response_assets(result, request)
|
||
|
||
return result
|
||
|
||
return wrapper
|