Fix Choppy streaming 2

This commit is contained in:
proitlab committed 2026-07-29 09:17:15 +07:00
1 parent 1d447fdba4
commit 0bca1bc6b9
2 files changed
+9 -12

No files matched your search

+8 -11
View File
@@ -4,7 +4,7 @@ import sys
from pathlib import Path
from dotenv import load_dotenv
from flask import Flask, Response, abort, render_template, request
from flask import Flask, Response, abort, render_template, request, send_file
load_dotenv()
@@ -52,12 +52,12 @@ def play(path):
@app.route("/video/<path:path>")
def serve_video(path):
full = _validate_path(path)
file_size = full.stat().st_size
range_header = request.headers.get("Range")
if not range_header:
return _stream_file(full, 0, file_size - 1, file_size, 200)
return send_file(full, mimetype="video/mp4", conditional=True)
file_size = full.stat().st_size
match = re.match(r"bytes=(\d+)-(\d*)", range_header)
if not match:
abort(416)
@@ -70,31 +70,28 @@ def serve_video(path):
abort(416)
content_length = end - start + 1
return _stream_file(full, start, end, content_length, 206)
return _stream_range(full, start, end, content_length, file_size)
def _stream_file(path, start, end, content_length, status):
def _stream_range(path, start, end, content_length, file_size):
def generate():
with open(path, "rb") as f:
f.seek(start)
remaining = content_length
while remaining > 0:
chunk_size = min(8192, remaining)
chunk_size = min(65536, remaining)
data = f.read(chunk_size)
if not data:
break
remaining -= len(data)
yield data
file_size = path.stat().st_size
headers = {
"Content-Range": f"bytes {start}-{end}/{file_size}",
"Accept-Ranges": "bytes",
"Content-Length": str(content_length),
"Content-Type": "video/mp4",
}
return Response(generate(), status=status, headers=headers)
return Response(generate(), status=206, headers=headers)
if __name__ == "__main__":
app.run(host=FLASK_HOST, port=FLASK_PORT, debug=True)
app.run(host=FLASK_HOST, port=FLASK_PORT, debug=True, threaded=True)
+1 -1
View File
@@ -12,7 +12,7 @@
<body>
<p><a href="/">&larr; Back to listing</a></p>
<h2>{{ filename|e }}</h2>
<video controls autoplay>
<video controls autoplay preload="auto">
<source src="/video/{{ path|e }}" type="video/mp4">
</video>
</body>