1 Commits
Author SHA1 Message Date
LeoVasanko 73c6a55bce Quiet VIPS logging at import time. Ruff format. 2026-09-20 00:50:18 +00:00
8 changed files with 26 additions and 12 deletions
+1 -2
View File
@@ -32,14 +32,13 @@ from docopt import docopt
from mediapreview.backends import dispatch from mediapreview.backends import dispatch
from mediapreview.exceptions import PreviewError from mediapreview.exceptions import PreviewError
from mediapreview.util.logformat import EmojiFormatter, quiet_vips_logging from mediapreview.util.logformat import EmojiFormatter
def _configure_logging() -> None: def _configure_logging() -> None:
handler = logging.StreamHandler(sys.stderr) handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(EmojiFormatter()) handler.setFormatter(EmojiFormatter())
logging.basicConfig(level=logging.INFO, handlers=[handler]) logging.basicConfig(level=logging.INFO, handlers=[handler])
quiet_vips_logging()
def _oosetup(name: str) -> None: def _oosetup(name: str) -> None:
+3
View File
@@ -9,6 +9,9 @@ from time import perf_counter
import pyvips import pyvips
from mediapreview.protocol import PreviewResponse from mediapreview.protocol import PreviewResponse
from mediapreview.util.logformat import quiet_vips_logging
quiet_vips_logging()
AVIF_FAST_EFFORT = 0 AVIF_FAST_EFFORT = 0
+3 -1
View File
@@ -38,7 +38,9 @@ def process_pdf(path, *, maxsize, maxzoom, quality, page_number=0):
t_save_start = perf_counter() t_save_start = perf_counter()
try: try:
img = pyvips.Image.new_from_memory(samples, width, height, n, "uchar") 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: except Exception as e:
raise backend_error(BACKEND, str(e)) from e raise backend_error(BACKEND, str(e)) from e
t_save_end = perf_counter() t_save_end = perf_counter()
+6 -2
View File
@@ -145,7 +145,9 @@ def onlyoffice_unavailable_error(url: str | None = None) -> OnlyOfficeError:
def onlyoffice_http_error(status: int) -> 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: 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: 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
)
+1 -2
View File
@@ -40,7 +40,7 @@ except ImportError: # pragma: no cover - optional worker extra
from mediapreview.backends import dispatch from mediapreview.backends import dispatch
from mediapreview.exceptions import PreviewError from mediapreview.exceptions import PreviewError
from mediapreview.protocol import PreviewRequest, PreviewResponse 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__) logger = logging.getLogger(__name__)
@@ -171,7 +171,6 @@ def main() -> None:
handler = logging.StreamHandler(sys.stderr) handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(_WorkerLogFormatter()) handler.setFormatter(_WorkerLogFormatter())
logging.basicConfig(level=logging.INFO, handlers=[handler]) logging.basicConfig(level=logging.INFO, handlers=[handler])
quiet_vips_logging()
# NOTE: standalone package no longer depends on cista config loading. # NOTE: standalone package no longer depends on cista config loading.
# Consumers can load their own configuration before starting workers. # Consumers can load their own configuration before starting workers.
if len(sys.argv) > 1: if len(sys.argv) > 1:
+8 -4
View File
@@ -29,7 +29,9 @@ def run(cmd: list[str]) -> None:
subprocess.run(cmd, check=True, capture_output=True, text=True) 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) end = end or len(data)
i = start i = start
while i + 8 <= end: 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: if size == 1:
size = int.from_bytes(data[i + 8 : i + 16], "big") size = int.from_bytes(data[i + 8 : i + 16], "big")
if size < 8: 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 i += size
return -1 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_offset = tkhd_idx + 48
matrix = _matrix_90_cw() if degrees == 90 else _matrix_270_cw() matrix = _matrix_90_cw() if degrees == 90 else _matrix_270_cw()
for i, val in enumerate(matrix): for i, val in enumerate(matrix):
data[matrix_offset + i * 4 : matrix_offset + (i + 1) * 4] = val.to_bytes( data[matrix_offset + i * 4 : matrix_offset + (i + 1) * 4] = (
4, "big", signed=True val.to_bytes(4, "big", signed=True)
) )
out_path.write_bytes(data) out_path.write_bytes(data)
return return
+1
View File
@@ -95,6 +95,7 @@ def test_error_pickle_round_trip():
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_generate_office_preview_raises_structured_error(monkeypatch): async def test_generate_office_preview_raises_structured_error(monkeypatch):
"""On OnlyOffice failure, generate_office_preview raises OnlyOfficeError.""" """On OnlyOffice failure, generate_office_preview raises OnlyOfficeError."""
async def fake_convert(_filepath: Path, request_timeout: float = 5.0) -> bytes: async def fake_convert(_filepath: Path, request_timeout: float = 5.0) -> bytes:
raise onlyoffice_error_from_code("-8") raise onlyoffice_error_from_code("-8")
+3 -1
View File
@@ -107,7 +107,9 @@ VIDEO_FIXTURES = [
VIDEO_FIXTURES, VIDEO_FIXTURES,
ids=[f[0] for f in 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.""" """SDR and HDR video clips, with and without rotation, convert successfully."""
data, resp = process_video(FILES / filename, maxsize=512, quality=60) data, resp = process_video(FILES / filename, maxsize=512, quality=60)
_assert_ok(data, resp, backend="video") _assert_ok(data, resp, backend="video")