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:
1 parent
1e28eb49e2
commit
a5566f3b99
8 files changed
+239
-100
No files matched your search
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user