mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-08-28 19:46:57 +08:00
从"稍后再看"(/list/watchlater/?bvid=BV...)、收藏夹播放页等场景 复制的链接会被判为无效链接,尽管其中包含完整 BV 号;校验通过的 链接也会带着追踪参数原样传给 yt-dlp。 在请求入口新增 normalize_video_url():提取 BV 号重建标准 /video/BVxxx 链接,保留分 P 参数(?p=N),丢弃其余查询参数。 b23.tv 短链与其他平台行为不变,无 BV 号链接仍按原逻辑拒绝。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
from pydantic import AnyUrl, validator, BaseModel, field_validator, model_validator
|
|
import re
|
|
from urllib.parse import urlparse
|
|
|
|
from app.utils.url_parser import normalize_video_url
|
|
|
|
SUPPORTED_PLATFORMS = {
|
|
"bilibili": r"(https?://)?(www\.)?bilibili\.com/video/[a-zA-Z0-9]+",
|
|
"youtube": r"(https?://)?(www\.)?(youtube\.com/(watch\?v=|shorts/)|youtu\.be/)[\w\-]+",
|
|
"douyin": "douyin",
|
|
"kuaishou": "kuaishou"
|
|
}
|
|
|
|
|
|
def is_supported_video_url(url: str) -> bool:
|
|
parsed = urlparse(url)
|
|
|
|
# 检查是否为Bilibili的短链接
|
|
if parsed.netloc == "b23.tv":
|
|
return True
|
|
|
|
for name, pattern in SUPPORTED_PLATFORMS.items():
|
|
if pattern in ["douyin", "kuaishou"]:
|
|
if pattern in url:
|
|
return True
|
|
else:
|
|
if re.match(pattern, url):
|
|
return True
|
|
return False
|
|
|
|
|
|
class VideoRequest(BaseModel):
|
|
url: AnyUrl
|
|
platform: str
|
|
|
|
@model_validator(mode="before")
|
|
@classmethod
|
|
def normalize_url(cls, data):
|
|
if isinstance(data, dict) and data.get("platform") == "bilibili" and data.get("url"):
|
|
data["url"] = normalize_video_url(str(data["url"]))
|
|
return data
|
|
|
|
@field_validator("url")
|
|
def validate_video_url(cls, v):
|
|
if not is_supported_video_url(str(v)):
|
|
raise ValueError("暂不支持该视频平台或链接格式无效")
|
|
return v
|