| import secrets | |
| import string | |
| from urllib.parse import urlparse | |
| _ID_CHARS = string.ascii_letters + string.digits # base-62 | |
| def generate_id(prefix: str, length: int = 21) -> str: | |
| random_part = "".join(secrets.choice(_ID_CHARS) for _ in range(length)) | |
| return f"{prefix}_{random_part}" | |
| _VIDEO_EXTENSIONS = {".mp4", ".avi", ".mov", ".mkv", ".webm", ".flv", ".wmv", ".m4v"} | |
| def is_video_url(url: str) -> bool: | |
| path = urlparse(url).path.lower() | |
| return any(path.endswith(ext) for ext in _VIDEO_EXTENSIONS) | |