//! Video frame extraction port. //! //! Pulls a single representative still frame out of a video so the existing //! image thumbnail pipeline (shrink-on-load → SIMD resize → WebP → blob-hash //! storage → HTTP content negotiation) can treat videos exactly like photos — //! eagerly, server-side, on upload. Keeping this behind a port lets the //! composition root swap in a no-op when `ffmpeg` is absent or the feature is //! off, so video uploads degrade gracefully (no thumbnail) instead of erroring. use crate::common::errors::DomainError; use async_trait::async_trait; use bytes::Bytes; use std::path::Path; /// Extracts a representative still frame from a video file. /// /// Implementations: /// - `FfmpegVideoFrameService` — shells out to the system `ffmpeg`, covering /// every container/codec (incl. HEVC/MOV, which a browser `