Automated video-editing pipeline: upload a video, extract audio, transcribe it, detect silence and filler words, build an EDL, and render the cut.
server/— Python (FastAPI) backend, built as a hexagonal / ports-and-adapters architecture. Seeserver/pyproject.tomlandCLAUDE.mdfor the architecture map.client/— static HTML/JS upload page (no build step), served directly by the FastAPI app at/. Uploads a video, polls job progress, and plays back the rendered result once done.docker-compose.yml— Redis, used as the RQ job queue's broker.
-
Start Redis (or run a native
redis-serveron the same port instead of Docker):docker compose up -d redis -
Create and activate a Python virtual environment, then install the backend and set the required env vars (an absolute path to an installed
ffmpegbinary is required;ffprobeis expected alongside it) via aserver/.envfile:cd server python -m venv .venv source .venv/bin/activate # macOS/Linux .venv\Scripts\Activate.ps1 # Windows PowerShell pip install -e ".[dev]"(On a fresh Windows machine,
Activate.ps1may fail with "running scripts is disabled on this system" — runSet-ExecutionPolicy -Scope CurrentUser RemoteSignedonce to allow it.)Then create
server/.envwith at least:DEADAIR_FFMPEG_BINARY_PATH=/path/to/ffmpegActivate the same virtual environment in every new terminal you open for this project (API, worker, tests) before running the commands below.
-
Run the API:
uvicorn deadair.presentation.main:app --reload -
In a separate terminal, activate the same virtual environment (
.envis picked up automatically fromserver/), then run the worker that actually executes the pipeline for each uploaded video:cd server source .venv/bin/activate # macOS/Linux .venv\Scripts\Activate.ps1 # Windows PowerShell python -m deadair.worker -
Open
http://localhost:8000/in a browser — the FastAPI app serves the client directly, so no separate client process is needed. Upload a video and watch it progress through extraction, transcription, silence/filler detection, EDL building, and rendering.
cd server
pytest -q # fast suite (default; skips tests needing real ffmpeg/whisper/redis)
pytest -m slow -q # tests against real ffmpeg, faster-whisper, and fixture media