From b813d83246848509df1378d4ec84d5971a0be54e Mon Sep 17 00:00:00 2001 From: Karasukaigan <80465610+Karasukaigan@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:03:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DB=E7=AB=99=E7=9F=AD?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E6=97=A0=E6=B3=95=E8=A7=A3=E6=9E=90=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加了对b23.tv短链接的解析。 --- backend/app/utils/url_parser.py | 22 +++++++++++++++++++ backend/app/validators/video_url_validator.py | 7 ++++++ 2 files changed, 29 insertions(+) diff --git a/backend/app/utils/url_parser.py b/backend/app/utils/url_parser.py index 9efdab6..8f76a16 100644 --- a/backend/app/utils/url_parser.py +++ b/backend/app/utils/url_parser.py @@ -1,5 +1,6 @@ import re from typing import Optional +import requests def extract_video_id(url: str, platform: str) -> Optional[str]: @@ -11,6 +12,12 @@ def extract_video_id(url: str, platform: str) -> Optional[str]: :return: 提取到的视频 ID 或 None """ if platform == "bilibili": + # 如果是短链接,则解析真实链接 + if "b23.tv" in url: + resolved_url = resolve_bilibili_short_url(url) + if resolved_url: + url = resolved_url + # 匹配 BV号(如 BV1vc411b7Wa) match = re.search(r"BV([0-9A-Za-z]+)", url) return f"BV{match.group(1)}" if match else None @@ -26,3 +33,18 @@ def extract_video_id(url: str, platform: str) -> Optional[str]: return match.group(1) if match else None return None + + +def resolve_bilibili_short_url(short_url: str) -> Optional[str]: + """ + 解析哔哩哔哩短链接以获取真实视频链接 + + :param short_url: Bilibili短链接(如"https://b23.tv/xxxxxx") + :return: 真实的视频链接或None + """ + try: + response = requests.head(short_url, allow_redirects=True) + return response.url + except requests.RequestException as e: + print(f"Error resolving short URL: {e}") + return None diff --git a/backend/app/validators/video_url_validator.py b/backend/app/validators/video_url_validator.py index 5e16682..205f786 100644 --- a/backend/app/validators/video_url_validator.py +++ b/backend/app/validators/video_url_validator.py @@ -1,5 +1,6 @@ from pydantic import AnyUrl, validator, BaseModel, field_validator import re +from urllib.parse import urlparse SUPPORTED_PLATFORMS = { "bilibili": r"(https?://)?(www\.)?bilibili\.com/video/[a-zA-Z0-9]+", @@ -10,6 +11,12 @@ SUPPORTED_PLATFORMS = { 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: