Records rather than streams: each device records a clip WITH AUDIO and uploads
it; the normal offline pipeline takes over. Fits the design almost for free —
MediaRecorder's webm/mp4 are already ingestible, and audio-based sync means
devices need no clock sync and needn't start together.
- capture.py: POST /api/capture/upload (streamed, sanitized name, size cap,
partial cleanup), heartbeat/devices registry, GET /capture page.
- static/capture.html: standalone page (no build step) — device picker, live
preview, record->upload, 1fps snapshot heartbeat, 'who's shooting what'
monitor, and secure-context detection that tells you to use
(getUserMedia needs HTTPS — the #1 gotcha for phones).
- OPT-IN via FESTIVAL4D_CAPTURE=1; manifest reports has_capture and the viewer
only then shows a Capture link. Public deploy leaves it off (open upload
endpoint would be unsafe) — noted in DEPLOY.md.
- Adds python-multipart dep. Suite 103 -> 119.
Also fixes test_manifest_shape, which was already RED on main: f12b6e0 added
has_splat to the manifest without updating the exact-set lock. Updated to the
true set (now also has_capture); the lock is what caught both drifts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
40 lines
1002 B
TOML
40 lines
1002 B
TOML
[project]
|
|
name = "festival4d"
|
|
version = "0.1.0"
|
|
description = "Turn multiple fan-shot smartphone concert videos into a synchronized, explorable 4D experience."
|
|
readme = "README.md"
|
|
requires-python = ">=3.11"
|
|
dependencies = [
|
|
"fastapi>=0.110",
|
|
"uvicorn[standard]>=0.29",
|
|
"numpy>=1.26",
|
|
"scipy>=1.11",
|
|
"librosa>=0.10",
|
|
"soundfile>=0.12",
|
|
"sqlalchemy>=2.0",
|
|
"pydantic>=2.6",
|
|
"opencv-python-headless>=4.9",
|
|
"python-multipart>=0.0.9", # multipart uploads for live capture (backend/capture.py)
|
|
# classifier providers (lane D) — imported lazily, never at module load
|
|
"google-genai>=0.3",
|
|
"anthropic>=0.40",
|
|
"openai>=1.30",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
dev = ["pytest>=8.0"]
|
|
|
|
[project.scripts]
|
|
festival4d = "festival4d.cli:main"
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["backend/festival4d"]
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["backend/tests"]
|
|
addopts = "-q"
|