Mirrors the existing HM QC batch pattern so Video QC now supports
queueing and processing multiple videos from a single upload.
New:
- batch_executor.py — BatchVideoQCExecutor, sequential processing
(gc.collect() between videos, cooldown between batches), stamps
a shared batch_id into each report's metadata_json.
- /video-qc/execute/batch — kicks off a BatchVideoQCExecutor thread.
- /video-qc/results/batch/<session_id> — batch summary card, per-file
list (filename, score, status, view/download), ZIP download link.
Reuses results.html with is_batch flag.
- /video-qc/report/<id>/download, /video-qc/report/batch/<id>/download
(ZIP), /video-qc/report/batch/<id> DELETE.
Changed:
- VideoQCExecutor accepts batch_id; writes it into metadata when set.
- /video-qc/upload accepts multi-file (request.files.getlist('files'))
with single-file fallback; returns is_batch/filenames/file_count.
- Upload template: drag-and-drop list UI (same pattern as HM QC upload).
- Configure template: shows file count + list, swaps button text and
POST endpoint based on file_count; redirects to results/batch when
batch, results when single.
- Video QC index uses QCReport.get_recent_grouped to render "Batch
Reports" (collapsible per-batch table) + "Individual Reports".
Post-run destinations:
- 1 file -> /video-qc/results/<session_id> (unchanged)
- N files -> /video-qc/results/batch/<session_id> (batch summary +
list of reports from the run)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>