У меня проблема с получением источника потокового видео с помощью django

У меня возникла проблема с тегом video в chrome, потому что я хочу иметь возможность переходить к определенному времени на видео, google chrome не позволяет это сделать, потому что это требует определенного вида ответа, после проведения некоторых исследований я пришел к этому посту на stackoverflow

после добавления кода, я установил конечную точку на исходном теге видео вот так <source src="{% url 'namespace:stream_video' obj.video.path %}" type="video/mp4" /> даже сделал это следующим образом <source src="{% url 'namespace:stream_video' path=obj.video.path %}" type="video/mp4" /> Но я получаю NoReversMatch

'stream_video' with arguments '('/home/UserName/Work/projectName/media/uploads/2022/8/3/b3f10ea2-b323-4398-a86c-c5fb5936cfd723.mp4',)' not found. 1 pattern(s) tried: ['video\\-stream/(?P<path>[^/]+)\\Z']

Путь path("stream/<str:path>", views.stream_video, name="stream_video")

А это мой взгляд, он буквально копирует взгляд из поста:

def stream_video(request, path):
    range_header = request.META.get('HTTP_RANGE', '').strip()
    range_match = range_re.match(range_header)
    size = os.path.getsize(path)
    content_type, encoding = mimetypes.guess_type(path)
    content_type = content_type or 'application/octet-stream'
    if range_match:
        first_byte, last_byte = range_match.groups()
        first_byte = int(first_byte) if first_byte else 0
        last_byte = int(last_byte) if last_byte else size - 1
        if last_byte >= size:
            last_byte = size - 1
        length = last_byte - first_byte + 1
        resp = StreamingHttpResponse(RangeFileWrapper(open(path, 'rb'), offset=first_byte, length=length), status=206, content_type=content_type)
        resp['Content-Length'] = str(length)
        resp['Content-Range'] = 'bytes %s-%s/%s' % (first_byte, last_byte, size)
    else:
        resp = StreamingHttpResponse(FileWrapper(open(path, 'rb')), content_type=content_type)
        resp['Content-Length'] = str(size)
    resp['Accept-Ranges'] = 'bytes'
    return resp

По какой-то странной причине, возможно из-за косой черты в пути, это вызывает ошибку NoReverseMatch. Поэтому я сделал следующее: использовал id объекта в представлении для получения объекта и установил путь для stream_video в none, затем передал путь в функцию. Вот как теперь выглядит функция.

def stream_video(request, video_id):
    vid = Video.objects.get(id=video_id)
    path = vid.field_name.path
    ...

path("video-stream/<video_id>/", views.stream_video, name="stream_video")

<source src="{% url 'namespace:stream_video' video_id=video.id %}" type="video/mp4" />

Вот что у меня получилось в итоге.

Вернуться на верх