Archived
refactor: geo 走原生异步 HTTP,清掉短链展开死链
「同步转异步」的残留清理: 1) auth_system/geo.query_ip_province 原经 core.sync_http 同步门面(在后台 事件循环桥接)查询归属地,但其唯一调用方 record_login_location 的入口 本来就是 async 的登录链路(web/routers/auth 里还套了一层 to_thread)。 改为直接 await core.http_client——桥接纯属多余,顺带把 record_login_location 转 async,落库仍走同步 sqlite 但经 asyncio.to_thread 卸载,避免 sqlite busy 等待(最长 15s)冻结事件循环。 调用方两处(普通用户/管理员登录)去掉 to_thread 包装,直接 await。 2) MusicAPIService._extract_music_id 是死代码:ID 归一化早已迁到 web.request_utils(注释里明说是它的迁移口径),全仓零调用。它也是 core.utils.expand_shortlink 的唯一调用方——一并删除,core.utils 由此 彻底不再 import core.sync_http。 门禁:ruff 全过 / pyright 0-0 / pytest 387 项全绿(0 失败)。
This commit is contained in:
1 parent
064a89d726
commit
b089dadac2
5 files changed
+29
-81
No files matched your search
@@ -3,14 +3,11 @@
|
||||
"""
|
||||
|
||||
import logging
|
||||
import re
|
||||
from pathlib import Path
|
||||
from urllib.parse import parse_qs, urlsplit
|
||||
|
||||
from core.config import (
|
||||
Settings,
|
||||
)
|
||||
from core.utils import expand_shortlink as _expand_shortlink
|
||||
from music_api import (
|
||||
NeteaseAPI,
|
||||
load_cookies,
|
||||
@@ -80,37 +77,6 @@ class MusicAPIService:
|
||||
self.logger.error(f"读取 cookie.txt 异常: {e}")
|
||||
return {}
|
||||
|
||||
def _extract_music_id(self, id_or_url: str) -> str:
|
||||
"""提取音乐ID(正规 URL 解析替代子串/删除非数字启发式)
|
||||
- 短链仅当整串就是一个 163cn.tv 短链 URL 时才请求展开(防 SSRF)
|
||||
- music.163.com 链接用 parse_qs 取 id 参数(参数顺序无关)
|
||||
"""
|
||||
raw = str(id_or_url or '').strip()
|
||||
try:
|
||||
# 短链展开:仅接受"整个输入就是 163cn.tv 链接"(子串包含不算)
|
||||
if re.match(r'^https?://(www\.)?163cn\.tv/\S+$', raw, re.IGNORECASE):
|
||||
raw = _expand_shortlink(raw)
|
||||
|
||||
# 网易云链接:正规解析 query 取 id(不再 find('id=') 误吃 userid= 尾部)
|
||||
if 'music.163.com' in raw:
|
||||
try:
|
||||
q = parse_qs(urlsplit(raw).query)
|
||||
for key in ('id', 'songid'):
|
||||
if q.get(key):
|
||||
return str(q[key][0]).strip()
|
||||
except Exception:
|
||||
pass
|
||||
# 兜底:老格式 #/song?id=xxx 的片段部分
|
||||
m = re.search(r'[?&#]id=(\d+)', raw)
|
||||
if m:
|
||||
return m.group(1)
|
||||
|
||||
# 纯数字/普通文本直接返回
|
||||
return raw
|
||||
except Exception as e:
|
||||
self.logger.error(f"提取音乐ID失败: {e}")
|
||||
return str(id_or_url or '').strip()
|
||||
|
||||
def _format_file_size(self, size_bytes) -> str:
|
||||
"""格式化文件大小(上游 size 可能为 null/垃圾值:容错返回"大小未知"而非 500)"""
|
||||
try:
|
||||
|
||||
Reference in new issue
Block a user