81 lines
2.1 KiB
Python
81 lines
2.1 KiB
Python
import os
|
|||
|
|
import shutil
|
||
|
|
import subprocess
|
||
|
|
import sys
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
|
||
|
|
# Ensure the project root is on sys.path when running tests.
|
||
|
|
ROOT = os.path.dirname(os.path.dirname(__file__))
|
||
|
|
if ROOT not in sys.path:
|
||
|
|
sys.path.insert(0, ROOT)
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.fixture(scope="session", autouse=True)
|
||
|
|
def require_ffmpeg():
|
||
|
|
"""The tests exercise real encodes; there is little point faking them."""
|
||
|
|
for tool in ("ffmpeg", "ffprobe"):
|
||
|
|
if shutil.which(tool) is None:
|
||
|
|
pytest.skip(f"{tool} is not on PATH", allow_module_level=True)
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.fixture
|
||
|
|
def make_flac():
|
||
|
|
"""Return a factory writing a short tagged FLAC file."""
|
||
|
|
|
||
|
|
def factory(path, title="Test Title", artist="Test Artist", album="Test Album", seconds=1):
|
||
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||
|
|
subprocess.run(
|
||
|
|
[
|
||
|
|
"ffmpeg",
|
||
|
|
"-nostdin",
|
||
|
|
"-hide_banner",
|
||
|
|
"-loglevel",
|
||
|
|
"error",
|
||
|
|
"-y",
|
||
|
|
"-f",
|
||
|
|
"lavfi",
|
||
|
|
"-i",
|
||
|
|
f"sine=frequency=440:duration={seconds}",
|
||
|
|
"-metadata",
|
||
|
|
f"title={title}",
|
||
|
|
"-metadata",
|
||
|
|
f"artist={artist}",
|
||
|
|
"-metadata",
|
||
|
|
f"album={album}",
|
||
|
|
"-metadata",
|
||
|
|
"track=3",
|
||
|
|
str(path),
|
||
|
|
],
|
||
|
|
check=True,
|
||
|
|
capture_output=True,
|
||
|
|
)
|
||
|
|
return path
|
||
|
|
|
||
|
|
return factory
|
||
|
|
|
||
|
|
|
||
|
|
@pytest.fixture
|
||
|
|
def probe_tag():
|
||
|
|
"""Return a helper reading a single metadata tag from a file."""
|
||
|
|
|
||
|
|
def reader(path, tag):
|
||
|
|
completed = subprocess.run(
|
||
|
|
[
|
||
|
|
"ffprobe",
|
||
|
|
"-v",
|
||
|
|
"error",
|
||
|
|
"-show_entries",
|
||
|
|
f"format_tags={tag}",
|
||
|
|
"-of",
|
||
|
|
"default=noprint_wrappers=1:nokey=1",
|
||
|
|
str(path),
|
||
|
|
],
|
||
|
|
check=True,
|
||
|
|
capture_output=True,
|
||
|
|
text=True,
|
||
|
|
)
|
||
|
|
return completed.stdout.strip()
|
||
|
|
|
||
|
|
return reader
|