| |
| |
| |
| |
|
|
| import os |
| import shutil |
| import subprocess |
| from glob import glob |
| from pathlib import Path |
| from typing import Dict, Optional |
|
|
| import imagesize |
| from app_conf import GALLERY_PATH, POSTERS_PATH, POSTERS_PREFIX |
| from data.data_types import Video |
| from tqdm import tqdm |
|
|
|
|
| def preload_data() -> Dict[str, Video]: |
| """ |
| Preload data including gallery videos and their posters. |
| """ |
| |
| |
| |
| |
| all_videos = {} |
|
|
| video_path_pattern = os.path.join(GALLERY_PATH, "**/*.mp4") |
| video_paths = glob(video_path_pattern, recursive=True) |
|
|
| for p in tqdm(video_paths): |
| video = get_video(p, GALLERY_PATH) |
| all_videos[video.code] = video |
|
|
| return all_videos |
|
|
|
|
| def get_video( |
| filepath: os.PathLike, |
| absolute_path: Path, |
| file_key: Optional[str] = None, |
| generate_poster: bool = True, |
| width: Optional[int] = None, |
| height: Optional[int] = None, |
| verbose: Optional[bool] = False, |
| ) -> Video: |
| """ |
| Get video object given |
| """ |
| |
| video_path = os.path.relpath(filepath, absolute_path.parent) |
| poster_path = None |
| if generate_poster: |
| poster_id = os.path.splitext(os.path.basename(filepath))[0] |
| poster_filename = f"{str(poster_id)}.jpg" |
| poster_path = f"{POSTERS_PREFIX}/{poster_filename}" |
|
|
| |
| poster_output_path = os.path.join(POSTERS_PATH, poster_filename) |
| ffmpeg = shutil.which("ffmpeg") |
| subprocess.call( |
| [ |
| ffmpeg, |
| "-y", |
| "-i", |
| str(filepath), |
| "-pix_fmt", |
| "yuv420p", |
| "-frames:v", |
| "1", |
| "-update", |
| "1", |
| "-strict", |
| "unofficial", |
| str(poster_output_path), |
| ], |
| stdout=None if verbose else subprocess.DEVNULL, |
| stderr=None if verbose else subprocess.DEVNULL, |
| ) |
|
|
| |
| |
| width, height = imagesize.get(poster_output_path) |
|
|
| return Video( |
| code=video_path, |
| path=video_path if file_key is None else file_key, |
| poster_path=poster_path, |
| width=width, |
| height=height, |
| ) |
|
|