chore(deps): auto fix by pre-commit hooks
This commit is contained in:
committed by
MingxuanGame
parent
b4fd4e0256
commit
7625cd99f5
@@ -5,27 +5,29 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
from fastapi import Request
|
||||
|
||||
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)
|
||||
|
||||
@@ -47,7 +49,7 @@ def should_process_asset_proxy(path: str) -> bool:
|
||||
"/api/v2/beatmapsets/",
|
||||
# 可以根据需要添加更多端点
|
||||
]
|
||||
|
||||
|
||||
return any(path.startswith(endpoint) for endpoint in asset_proxy_endpoints)
|
||||
|
||||
|
||||
@@ -56,6 +58,7 @@ def asset_proxy_response(func):
|
||||
"""
|
||||
装饰器:自动处理响应中的资源URL
|
||||
"""
|
||||
|
||||
async def wrapper(*args, **kwargs):
|
||||
# 获取request对象
|
||||
request = None
|
||||
@@ -63,14 +66,14 @@ def asset_proxy_response(func):
|
||||
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
|
||||
|
||||
@@ -7,8 +7,8 @@ from __future__ import annotations
|
||||
|
||||
import re
|
||||
from typing import Any
|
||||
|
||||
from app.config import settings
|
||||
from app.log import logger
|
||||
|
||||
|
||||
class AssetProxyService:
|
||||
@@ -26,7 +26,7 @@ class AssetProxyService:
|
||||
递归替换数据中的osu!资源URL为自定义域名
|
||||
"""
|
||||
# 处理Pydantic模型
|
||||
if hasattr(data, 'model_dump'):
|
||||
if hasattr(data, "model_dump"):
|
||||
# 转换为字典,处理后再转换回模型
|
||||
data_dict = data.model_dump()
|
||||
processed_dict = await self.replace_asset_urls(data_dict)
|
||||
@@ -46,35 +46,25 @@ class AssetProxyService:
|
||||
elif isinstance(data, str):
|
||||
# 替换各种osu!资源域名
|
||||
result = data
|
||||
|
||||
|
||||
# 替换 assets.ppy.sh (用户头像、封面、奖章等)
|
||||
result = re.sub(
|
||||
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 预览音频 (保持//前缀)
|
||||
result = re.sub(
|
||||
r"//b\.ppy\.sh/",
|
||||
f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/",
|
||||
result
|
||||
)
|
||||
|
||||
result = re.sub(r"//b\.ppy\.sh/", f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/", result)
|
||||
|
||||
# 替换 https://b.ppy.sh 预览音频 (转换为//前缀)
|
||||
result = re.sub(
|
||||
r"https://b\.ppy\.sh/",
|
||||
f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/",
|
||||
result
|
||||
r"https://b\.ppy\.sh/", f"//{self.beatmap_proxy_prefix}.{self.custom_asset_domain}/", result
|
||||
)
|
||||
|
||||
|
||||
# 替换 a.ppy.sh 头像
|
||||
result = re.sub(
|
||||
r"https://a\.ppy\.sh/",
|
||||
f"https://{self.avatar_proxy_prefix}.{self.custom_asset_domain}/",
|
||||
result
|
||||
r"https://a\.ppy\.sh/", f"https://{self.avatar_proxy_prefix}.{self.custom_asset_domain}/", result
|
||||
)
|
||||
|
||||
|
||||
return result
|
||||
else:
|
||||
return data
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime, timedelta, UTC
|
||||
from datetime import UTC, datetime, timedelta
|
||||
import json
|
||||
|
||||
from app.dependencies.database import get_redis, get_redis_message
|
||||
|
||||
@@ -14,8 +14,8 @@ from app.config import settings
|
||||
from app.database.statistics import UserStatistics, UserStatisticsResp
|
||||
from app.log import logger
|
||||
from app.models.score import GameMode
|
||||
from app.utils import utcnow
|
||||
from app.service.asset_proxy_service import get_asset_proxy_service
|
||||
from app.utils import utcnow
|
||||
|
||||
from redis.asyncio import Redis
|
||||
from sqlmodel import col, select
|
||||
@@ -284,7 +284,7 @@ class RankingCacheService:
|
||||
ranking_data = []
|
||||
for statistics in statistics_data:
|
||||
user_stats_resp = await UserStatisticsResp.from_db(statistics, session, None, include)
|
||||
|
||||
|
||||
# 应用资源代理处理
|
||||
if settings.enable_asset_proxy:
|
||||
try:
|
||||
@@ -292,7 +292,7 @@ class RankingCacheService:
|
||||
user_stats_resp = await asset_proxy_service.replace_asset_urls(user_stats_resp)
|
||||
except Exception as e:
|
||||
logger.warning(f"Asset proxy processing failed for ranking cache: {e}")
|
||||
|
||||
|
||||
# 将 UserStatisticsResp 转换为字典,处理所有序列化问题
|
||||
user_dict = json.loads(user_stats_resp.model_dump_json())
|
||||
ranking_data.append(user_dict)
|
||||
|
||||
@@ -254,14 +254,16 @@ class RedisMessageSystem:
|
||||
# 键类型错误,需要清理
|
||||
logger.warning(f"Deleting Redis key {channel_messages_key} with wrong type: {key_type}")
|
||||
await self._redis_exec(self.redis.delete, channel_messages_key)
|
||||
|
||||
|
||||
# 验证删除是否成功
|
||||
verify_type = await self._redis_exec(self.redis.type, channel_messages_key)
|
||||
if verify_type != "none":
|
||||
logger.error(f"Failed to delete problematic key {channel_messages_key}, type is still {verify_type}")
|
||||
logger.error(
|
||||
f"Failed to delete problematic key {channel_messages_key}, type is still {verify_type}"
|
||||
)
|
||||
# 强制删除
|
||||
await self._redis_exec(self.redis.unlink, channel_messages_key)
|
||||
|
||||
|
||||
except Exception as type_check_error:
|
||||
logger.warning(f"Failed to check key type for {channel_messages_key}: {type_check_error}")
|
||||
# 如果检查失败,尝试强制删除键以确保清理
|
||||
@@ -597,13 +599,13 @@ class RedisMessageSystem:
|
||||
elif key_type != "zset":
|
||||
logger.warning(f"Cleaning up Redis key {key} with wrong type: {key_type}")
|
||||
await self._redis_exec(self.redis.delete, key)
|
||||
|
||||
|
||||
# 验证删除是否成功
|
||||
verify_type = await self._redis_exec(self.redis.type, key)
|
||||
if verify_type != "none":
|
||||
logger.error(f"Failed to delete problematic key {key}, trying unlink...")
|
||||
await self._redis_exec(self.redis.unlink, key)
|
||||
|
||||
|
||||
fixed_count += 1
|
||||
except Exception as cleanup_error:
|
||||
logger.warning(f"Failed to cleanup key {key}: {cleanup_error}")
|
||||
@@ -634,10 +636,10 @@ class RedisMessageSystem:
|
||||
await asyncio.sleep(300)
|
||||
if not self._running:
|
||||
break
|
||||
|
||||
|
||||
logger.debug("Running periodic Redis keys cleanup...")
|
||||
await self._cleanup_redis_keys()
|
||||
|
||||
|
||||
except asyncio.CancelledError:
|
||||
break
|
||||
except Exception as e:
|
||||
|
||||
@@ -299,7 +299,7 @@ class UserCacheService:
|
||||
"""缓存单个用户"""
|
||||
try:
|
||||
user_resp = await UserResp.from_db(user, session, include=SEARCH_INCLUDED)
|
||||
|
||||
|
||||
# 应用资源代理处理
|
||||
if settings.enable_asset_proxy:
|
||||
try:
|
||||
@@ -307,7 +307,7 @@ class UserCacheService:
|
||||
user_resp = await asset_proxy_service.replace_asset_urls(user_resp)
|
||||
except Exception as e:
|
||||
logger.warning(f"Asset proxy processing failed for user cache {user.id}: {e}")
|
||||
|
||||
|
||||
await self.cache_user(user_resp)
|
||||
except Exception as e:
|
||||
logger.error(f"Error caching single user {user.id}: {e}")
|
||||
|
||||
Reference in New Issue
Block a user