support png/jpg frames

This commit is contained in:
j 2026-01-13 12:02:33 +00:00
commit f99b48b746

52
views.py Normal file
View file

@ -0,0 +1,52 @@
import os
import ox
from django.conf import settings
from django.shortcuts import get_object_or_404
import requests
from oxdjango.http import HttpFileResponse
from item import models
from archive import extract
def extract_source_frame(self, position, format):
offset = 0
streams = self.streams()
for stream in streams:
if stream.duration + offset < position:
offset += stream.duration
else:
if not stream.file.is_video or not stream.file.info.get('video'):
return None
position = position - offset
path = None
if stream.file.data:
height = stream.file.info['video'][0]['height']
video_path = stream.file.data.path
path = os.path.join(settings.MEDIA_ROOT, stream.path(),
'source-frames', "%dp" % height, "%s.%s" % (position, format))
if not os.path.exists(path) and stream.media:
extract.frame(video_path, path, position, height, info=stream.file.info)
if not os.path.exists(path):
return None
return path
def source_frame(request, id, position=None, format="jpg"):
if format not in ("jpg", "png"):
format = "jpg"
content_type = "image/jpeg" if format == "jpg" else "image/png"
item = get_object_or_404(models.Item, public_id=id)
if not item.access(request.user):
return HttpResponseForbidden()
frame = None
if not position:
position = item.poster_frame
else:
position = float(position.replace(',', '.'))
frame = extract_source_frame(item, position, format)
response = HttpFileResponse(frame, content_type=content_type)
if request.method == 'OPTIONS':
response.allow_access()
return response