| """Tests for video_format — MP4 -> GIF/WebM delivery transcode.
|
|
|
| Runs against the real bundled ffmpeg (via imageio_ffmpeg). The module is shared
|
| byte-for-byte with the wan2.2 Space, so this also covers that Space's behaviour.
|
| """
|
|
|
| import pathlib
|
| import subprocess
|
| import sys
|
|
|
| import pytest
|
|
|
| sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent))
|
|
|
| import video_format
|
|
|
|
|
| def _ffmpeg() -> str:
|
| imageio_ffmpeg = pytest.importorskip("imageio_ffmpeg")
|
| return imageio_ffmpeg.get_ffmpeg_exe()
|
|
|
|
|
| @pytest.fixture
|
| def sample_mp4(tmp_path: pathlib.Path) -> str:
|
| """A tiny 1s 128x128 H.264 MP4 generated with ffmpeg's testsrc."""
|
| out = tmp_path / "sample.mp4"
|
| subprocess.run(
|
| [
|
| _ffmpeg(), "-hide_banner", "-y",
|
| "-f", "lavfi", "-i", "testsrc=duration=1:size=128x128:rate=10",
|
| "-pix_fmt", "yuv420p", str(out),
|
| ],
|
| check=True,
|
| capture_output=True,
|
| )
|
| return str(out)
|
|
|
|
|
| def _decodes(path: str) -> bool:
|
| """True if ffmpeg can fully decode `path` without errors."""
|
| proc = subprocess.run(
|
| [_ffmpeg(), "-hide_banner", "-v", "error", "-i", path, "-f", "null", "-"],
|
| capture_output=True,
|
| )
|
| return proc.returncode == 0
|
|
|
|
|
|
|
|
|
| @pytest.mark.parametrize(
|
| "raw,expected",
|
| [
|
| ("mp4", "mp4"), ("gif", "gif"), ("webm", "webm"),
|
| ("MP4", "mp4"), (" WebM ", "webm"), (".gif", "gif"),
|
| ("", "mp4"), (None, "mp4"), ("mov", "mp4"), ("avi", "mp4"),
|
| ],
|
| )
|
| def test_normalize_format(raw, expected):
|
| assert video_format.normalize_format(raw) == expected
|
|
|
|
|
| def test_ext_and_content_type():
|
| assert video_format.ext_for("gif") == ".gif"
|
| assert video_format.ext_for("webm") == ".webm"
|
| assert video_format.ext_for("anything-unknown") == ".mp4"
|
| assert video_format.content_type_for("gif") == "image/gif"
|
| assert video_format.content_type_for("webm") == "video/webm"
|
| assert video_format.content_type_for("mp4") == "video/mp4"
|
|
|
|
|
| def test_supported_formats_mp4_first():
|
| assert video_format.supported_formats()[0] == "mp4"
|
| assert set(video_format.supported_formats()) == {"mp4", "gif", "webm"}
|
|
|
|
|
|
|
|
|
| def test_mp4_is_passthrough(sample_mp4):
|
| """mp4 (and unknown formats) return the input path unchanged — no transcode."""
|
| assert video_format.convert(sample_mp4, "mp4") == sample_mp4
|
| assert video_format.convert(sample_mp4, "mov") == sample_mp4
|
|
|
|
|
| def test_convert_to_gif(sample_mp4, tmp_path):
|
| out = str(tmp_path / "out.gif")
|
| result = video_format.convert(sample_mp4, "gif", out)
|
| assert result == out
|
| data = pathlib.Path(out).read_bytes()
|
| assert data[:4] == b"GIF8"
|
| assert len(data) > 0
|
|
|
|
|
| def test_convert_to_webm(sample_mp4, tmp_path):
|
| out = str(tmp_path / "out.webm")
|
| result = video_format.convert(sample_mp4, "webm", out)
|
| assert result == out
|
| data = pathlib.Path(out).read_bytes()
|
| assert data[:4] == b"\x1a\x45\xdf\xa3"
|
| assert _decodes(out)
|
|
|
|
|
| def test_convert_self_allocates_path_with_right_suffix(sample_mp4):
|
| """With no out_path, a temp file with the format's extension is created."""
|
| result = video_format.convert(sample_mp4, "webm")
|
| assert result != sample_mp4
|
| assert result.endswith(".webm")
|
| assert pathlib.Path(result).exists()
|
| pathlib.Path(result).unlink()
|
|
|
|
|
| def test_failure_falls_back_to_input(tmp_path):
|
| """A non-video input can't be transcoded -> caller keeps the original path."""
|
| bogus = tmp_path / "not-a-video.mp4"
|
| bogus.write_text("this is not an mp4")
|
| out = str(tmp_path / "out.gif")
|
| result = video_format.convert(str(bogus), "gif", out)
|
| assert result == str(bogus)
|
| assert not pathlib.Path(out).exists()
|
|
|