feat: switch live preview from WebSocket to MJPEG streaming

- Pipeline writes JPEG to /tmp/feedmill_preview_{job_id}.jpg (atomic)
- Flask serves MJPEG stream at /api/preview/{job_id}
- Frontend uses native <img src> MJPEG — zero JS needed
- Removed flask-socketio, eventlet, socket.io CDN dependencies
- 33% less bandwidth per frame, native browser decode
- Same proven approach as original karung-counting project
This commit is contained in:
jetson committed 2026-09-22 10:09:22 +07:00
1 parent 1e28eb49e2
commit a5566f3b99
8 files changed
+239 -100

No files matched your search

-18
View File
@@ -358,24 +358,6 @@ function initStatusPage(jobId, initialStatus) {
if (!progressFill) return;
/* --- WebSocket live preview --- */
var socket = io();
socket.on('connect', function() {
socket.emit('join_job', {job_id: jobId});
});
socket.on('preview_frame', function(data) {
if (livePreviewImg && data.frame) {
livePreviewImg.src = 'data:image/jpeg;base64,' + data.frame;
if (previewPlaceholder) previewPlaceholder.style.display = 'none';
livePreviewImg.style.display = 'block';
}
});
window.addEventListener('beforeunload', function() {
socket.emit('leave_job', {job_id: jobId});
});
/* --- Cancel button --- */
if (cancelBtn) {
cancelBtn.addEventListener('click', function() {