From 02c5e484b56f62eb85ab26613bc1d4d4b350eda1 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Tue, 21 Nov 2023 12:22:03 +0000 Subject: [PATCH] Attempt to reduce leak of ffmpeg previews --- cista/preview.py | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/cista/preview.py b/cista/preview.py index fed9c8e..cb541e3 100644 --- a/cista/preview.py +++ b/cista/preview.py @@ -1,5 +1,4 @@ import asyncio -import gc import io import mimetypes import urllib.parse @@ -10,6 +9,7 @@ from wsgiref.handlers import format_date_time import av import av.datasets import fitz # PyMuPDF +from av.streams import SideData from PIL import Image from sanic import Blueprint, empty, raw from sanic.exceptions import NotFound @@ -97,24 +97,17 @@ def process_pdf(path, *, maxsize, maxzoom, quality, page_number=0): def process_video(path, *, maxsize, quality): with av.open(str(path)) as container: stream = container.streams.video[0] - rotation = ( - stream.side_data - and stream.side_data.get(av.stream.SideData.DISPLAYMATRIX) - or 0 - ) + rot = stream.side_data and stream.side_data.get(SideData.DISPLAYMATRIX) or 0 stream.codec_context.skip_frame = "NONKEY" container.seek(container.duration // 8) - frame = next(container.decode(stream)) - img = frame.to_image() - del frame, stream + img = next(container.decode(stream)).to_image() + del stream - img.thumbnail((maxsize, maxsize)) - imgdata = io.BytesIO() - if rotation: - img = img.rotate(rotation, expand=True) - img.save(imgdata, format="webp", quality=quality, method=4) - del img + img.thumbnail((maxsize, maxsize)) + imgdata = io.BytesIO() + if rot: + img = img.rotate(rot, expand=True) + img.save(imgdata, format="webp", quality=quality, method=4) + del img - ret = imgdata.getvalue() - gc.collect() - return ret + return imgdata.getvalue()