youtube-transcript-api/utils/validators.py

29 lines
825 B
Python

from urllib.parse import urlparse, parse_qs
from core.errors import bad_request
YOUTUBE_DOMAINS = ("youtube.com", "www.youtube.com", "youtu.be")
def validate_youtube_url(url: str):
try:
parsed = urlparse(url)
except Exception:
bad_request("Invalid YouTube URL", "INVALID_URL")
if parsed.netloc not in YOUTUBE_DOMAINS:
bad_request("Invalid YouTube URL", "INVALID_URL")
if parsed.netloc == "youtu.be":
if not parsed.path.strip("/"):
bad_request("Invalid YouTube video URL", "INVALID_URL")
return
if parsed.path == "/watch":
qs = parse_qs(parsed.query)
if "v" not in qs or not qs["v"][0]:
bad_request("Invalid YouTube video URL", "INVALID_URL")
return
bad_request("Invalid YouTube video URL", "INVALID_URL")