Fix running with today's Python tooling and av module.
This commit is contained in:
@@ -18,8 +18,6 @@ from sanic.log import logger
|
||||
from cista import config
|
||||
from cista.util.filename import sanitize
|
||||
|
||||
DISPLAYMATRIX = av.stream.SideData.DISPLAYMATRIX
|
||||
|
||||
bp = Blueprint("preview", url_prefix="/preview")
|
||||
|
||||
|
||||
@@ -100,15 +98,39 @@ def process_video(path, *, maxsize, quality):
|
||||
with av.open(str(path)) as container:
|
||||
stream = container.streams.video[0]
|
||||
stream.codec_context.skip_frame = "NONKEY"
|
||||
rot = stream.side_data and stream.side_data.get(DISPLAYMATRIX) or 0
|
||||
|
||||
# Updated side data access for newer av versions
|
||||
rot = 0
|
||||
try:
|
||||
# Try newer API first
|
||||
if hasattr(stream, "side_data") and stream.side_data:
|
||||
display_matrix = stream.side_data.get("DISPLAYMATRIX")
|
||||
if display_matrix:
|
||||
rot = (
|
||||
display_matrix.rotation
|
||||
if hasattr(display_matrix, "rotation")
|
||||
else 0
|
||||
)
|
||||
except (AttributeError, KeyError):
|
||||
# Fallback for older API or missing side data
|
||||
rot = 0
|
||||
|
||||
container.seek(container.duration // 8)
|
||||
img = next(container.decode(stream)).to_image()
|
||||
try:
|
||||
frame = next(container.decode(stream))
|
||||
img = frame.to_image()
|
||||
except StopIteration:
|
||||
# If no frame found, try from beginning
|
||||
container.seek(0)
|
||||
frame = next(container.decode(stream))
|
||||
img = frame.to_image()
|
||||
|
||||
del stream
|
||||
|
||||
img.thumbnail((maxsize, maxsize))
|
||||
imgdata = io.BytesIO()
|
||||
if rot:
|
||||
img = img.rotate(rot, expand=True)
|
||||
if rot and rot != 0:
|
||||
img = img.rotate(-rot, expand=True) # Negative rotation for correct orientation
|
||||
img.save(imgdata, format="webp", quality=quality, method=4)
|
||||
del img
|
||||
ret = imgdata.getvalue()
|
||||
|
||||
Reference in New Issue
Block a user