71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timedelta
|
|
from pathlib import Path
|
|
|
|
|
|
class BaseVideoUploader:
|
|
SUPPORTED_VIDEO_EXTENSIONS = {
|
|
".mp4",
|
|
".mov",
|
|
".avi",
|
|
".mkv",
|
|
".m4v",
|
|
".webm",
|
|
".flv",
|
|
".wmv",
|
|
}
|
|
SUPPORTED_IMAGE_EXTENSIONS = {
|
|
".jpg",
|
|
".jpeg",
|
|
".png",
|
|
".webp",
|
|
".bmp",
|
|
}
|
|
MIN_SCHEDULE_LEAD_TIME = timedelta(hours=2)
|
|
|
|
@classmethod
|
|
def validate_video_file(cls, file_path: str | Path) -> Path:
|
|
path = Path(file_path).expanduser().resolve()
|
|
if not path.exists():
|
|
raise FileNotFoundError(f"视频文件不存在: {path}")
|
|
if not path.is_file():
|
|
raise ValueError(f"视频路径不是文件: {path}")
|
|
if path.suffix.lower() not in cls.SUPPORTED_VIDEO_EXTENSIONS:
|
|
raise ValueError(
|
|
f"不支持的视频格式: {path.suffix},当前支持: {', '.join(sorted(cls.SUPPORTED_VIDEO_EXTENSIONS))}"
|
|
)
|
|
|
|
return path
|
|
|
|
@classmethod
|
|
def validate_image_file(cls, file_path: str | Path) -> Path:
|
|
path = Path(file_path).expanduser().resolve()
|
|
if not path.exists():
|
|
raise FileNotFoundError(f"图片文件不存在: {path}")
|
|
if not path.is_file():
|
|
raise ValueError(f"图片路径不是文件: {path}")
|
|
if path.suffix.lower() not in cls.SUPPORTED_IMAGE_EXTENSIONS:
|
|
raise ValueError(
|
|
f"不支持的图片格式: {path.suffix},当前支持: {', '.join(sorted(cls.SUPPORTED_IMAGE_EXTENSIONS))}"
|
|
)
|
|
return path
|
|
|
|
@classmethod
|
|
def validate_publish_date(cls, publish_date: datetime | int | None) -> datetime | int:
|
|
if publish_date in (None, 0):
|
|
return 0
|
|
|
|
if not isinstance(publish_date, datetime):
|
|
raise TypeError("publish_date 必须是 datetime 类型或 0")
|
|
|
|
now = datetime.now(tz=publish_date.tzinfo) if publish_date.tzinfo else datetime.now()
|
|
if publish_date <= now:
|
|
raise ValueError("定时发布时间必须晚于当前时间")
|
|
|
|
min_publish_time = now + cls.MIN_SCHEDULE_LEAD_TIME
|
|
if publish_date <= min_publish_time:
|
|
raise ValueError("定时发布时间必须大于当前时间 2 小时")
|
|
|
|
return publish_date
|