Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73c6a55bce |
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user