From 73c6a55bcefd5c796c6eed94a5e57be33d32cf8d Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Sun, 20 Sep 2026 00:50:18 +0000 Subject: [PATCH] Quiet VIPS logging at import time. Ruff format. --- mediapreview/__main__.py | 3 +-- mediapreview/backends/image.py | 3 +++ mediapreview/backends/pdf.py | 4 +++- mediapreview/exceptions.py | 8 ++++++-- mediapreview/worker.py | 3 +-- tests/files/generate_fixtures.py | 12 ++++++++---- tests/test_office.py | 1 + tests/test_previews.py | 4 +++- 8 files changed, 26 insertions(+), 12 deletions(-) diff --git a/mediapreview/__main__.py b/mediapreview/__main__.py index 1447b03..fc39528 100644 --- a/mediapreview/__main__.py +++ b/mediapreview/__main__.py @@ -32,14 +32,13 @@ from docopt import docopt from mediapreview.backends import dispatch from mediapreview.exceptions import PreviewError -from mediapreview.util.logformat import EmojiFormatter, quiet_vips_logging +from mediapreview.util.logformat import EmojiFormatter def _configure_logging() -> None: handler = logging.StreamHandler(sys.stderr) handler.setFormatter(EmojiFormatter()) logging.basicConfig(level=logging.INFO, handlers=[handler]) - quiet_vips_logging() def _oosetup(name: str) -> None: diff --git a/mediapreview/backends/image.py b/mediapreview/backends/image.py index 37218d2..02b1344 100644 --- a/mediapreview/backends/image.py +++ b/mediapreview/backends/image.py @@ -9,6 +9,9 @@ from time import perf_counter import pyvips from mediapreview.protocol import PreviewResponse +from mediapreview.util.logformat import quiet_vips_logging + +quiet_vips_logging() AVIF_FAST_EFFORT = 0 diff --git a/mediapreview/backends/pdf.py b/mediapreview/backends/pdf.py index d99289f..edeecba 100644 --- a/mediapreview/backends/pdf.py +++ b/mediapreview/backends/pdf.py @@ -38,7 +38,9 @@ def process_pdf(path, *, maxsize, maxzoom, quality, page_number=0): t_save_start = perf_counter() try: img = pyvips.Image.new_from_memory(samples, width, height, n, "uchar") - ret = img.write_to_buffer(".avif", Q=quality, effort=AVIF_FAST_EFFORT, keep="none") + ret = img.write_to_buffer( + ".avif", Q=quality, effort=AVIF_FAST_EFFORT, keep="none" + ) except Exception as e: raise backend_error(BACKEND, str(e)) from e t_save_end = perf_counter() diff --git a/mediapreview/exceptions.py b/mediapreview/exceptions.py index e6e13bc..a055c34 100644 --- a/mediapreview/exceptions.py +++ b/mediapreview/exceptions.py @@ -145,7 +145,9 @@ def onlyoffice_unavailable_error(url: str | None = None) -> OnlyOfficeError: def onlyoffice_http_error(status: int) -> OnlyOfficeError: - return OnlyOfficeError(f"OnlyOffice HTTP error: {status}", "http error", status=status) + return OnlyOfficeError( + f"OnlyOffice HTTP error: {status}", "http error", status=status + ) def onlyoffice_no_fileurl_error(snippet: str | None = None) -> OnlyOfficeError: @@ -191,4 +193,6 @@ def preview_timeout_error( def preview_cancelled_error(reason: str = "pool closed") -> PreviewCancelledError: - return PreviewCancelledError(f"Preview cancelled ({reason})", "cancelled", reason=reason) + return PreviewCancelledError( + f"Preview cancelled ({reason})", "cancelled", reason=reason + ) diff --git a/mediapreview/worker.py b/mediapreview/worker.py index 1d3f24a..3412e07 100644 --- a/mediapreview/worker.py +++ b/mediapreview/worker.py @@ -40,7 +40,7 @@ except ImportError: # pragma: no cover - optional worker extra from mediapreview.backends import dispatch from mediapreview.exceptions import PreviewError from mediapreview.protocol import PreviewRequest, PreviewResponse -from mediapreview.util.logformat import format_level_prefix, quiet_vips_logging +from mediapreview.util.logformat import format_level_prefix logger = logging.getLogger(__name__) @@ -171,7 +171,6 @@ def main() -> None: handler = logging.StreamHandler(sys.stderr) handler.setFormatter(_WorkerLogFormatter()) logging.basicConfig(level=logging.INFO, handlers=[handler]) - quiet_vips_logging() # NOTE: standalone package no longer depends on cista config loading. # Consumers can load their own configuration before starting workers. if len(sys.argv) > 1: diff --git a/tests/files/generate_fixtures.py b/tests/files/generate_fixtures.py index ef0d9a1..7f3c1bc 100644 --- a/tests/files/generate_fixtures.py +++ b/tests/files/generate_fixtures.py @@ -29,7 +29,9 @@ def run(cmd: list[str]) -> None: subprocess.run(cmd, check=True, capture_output=True, text=True) -def _find_box(data: bytearray, box_type: bytes, start: int = 0, end: int | None = None) -> int: +def _find_box( + data: bytearray, box_type: bytes, start: int = 0, end: int | None = None +) -> int: end = end or len(data) i = start while i + 8 <= end: @@ -42,7 +44,9 @@ def _find_box(data: bytearray, box_type: bytes, start: int = 0, end: int | None if size == 1: size = int.from_bytes(data[i + 8 : i + 16], "big") if size < 8: - raise ValueError(f"Invalid box size {size} for {btype.decode('ascii', errors='replace')}") + raise ValueError( + f"Invalid box size {size} for {btype.decode('ascii', errors='replace')}" + ) i += size return -1 @@ -88,8 +92,8 @@ def _patch_tkhd_rotation(in_path: Path, out_path: Path, degrees: int) -> None: matrix_offset = tkhd_idx + 48 matrix = _matrix_90_cw() if degrees == 90 else _matrix_270_cw() for i, val in enumerate(matrix): - data[matrix_offset + i * 4 : matrix_offset + (i + 1) * 4] = val.to_bytes( - 4, "big", signed=True + data[matrix_offset + i * 4 : matrix_offset + (i + 1) * 4] = ( + val.to_bytes(4, "big", signed=True) ) out_path.write_bytes(data) return diff --git a/tests/test_office.py b/tests/test_office.py index 39d382a..f0662c8 100644 --- a/tests/test_office.py +++ b/tests/test_office.py @@ -95,6 +95,7 @@ def test_error_pickle_round_trip(): @pytest.mark.asyncio async def test_generate_office_preview_raises_structured_error(monkeypatch): """On OnlyOffice failure, generate_office_preview raises OnlyOfficeError.""" + async def fake_convert(_filepath: Path, request_timeout: float = 5.0) -> bytes: raise onlyoffice_error_from_code("-8") diff --git a/tests/test_previews.py b/tests/test_previews.py index 5ea1ba8..af63487 100644 --- a/tests/test_previews.py +++ b/tests/test_previews.py @@ -107,7 +107,9 @@ VIDEO_FIXTURES = [ VIDEO_FIXTURES, ids=[f[0] for f in VIDEO_FIXTURES], ) -def test_process_video(filename: str, expected_width: int, expected_height: int) -> None: +def test_process_video( + filename: str, expected_width: int, expected_height: int +) -> None: """SDR and HDR video clips, with and without rotation, convert successfully.""" data, resp = process_video(FILES / filename, maxsize=512, quality=60) _assert_ok(data, resp, backend="video")