End-to-end pipeline to fetch DVD/CD dumps from Wasabi S3, extract video, transcode to high-quality MP4 with automatic deinterlacing, transcribe and translate to English using WhisperX, and embed English subtitles for Twitch-ready streaming output.
- Docker and docker-compose
- Wasabi S3 credentials (via environment variables or AWS profile)
Set your environment variables directly in docker-compose.yml or use the example file as a template.
docker compose build
To avoid committing real credentials or paths, use the example compose as a starting point:
cp docker-compose.example.yml docker-compose.yml
Then edit docker-compose.yml locally with your real environment values. The .gitignore excludes it from version control.
Process all items under the prefix from source bucket and upload final MP4s with embedded English subtitles to destination bucket:
# Normal run (processes and uploads)
docker compose up
# One-off job
docker compose run --rm worker
# Dry run (processes locally but doesn't upload)
docker compose run --rm worker --dry-runFolder structure support:
- Processes folders like
E3_2004/,F_WAVE_026/, etc. - Finds main media files (
.isoorVIDEO_TS.IFO) within each folder - Preserves folder structure locally to avoid filename collisions
- Skips metadata files (
.txt,.zip, etc.)
Data directories are mounted at ./data on the host.
- Resumable processing: Tracks completed files to avoid reprocessing
- Smart downloads: Skips re-downloading if file exists and is complete
- Folder structure support: Handles organized S3 buckets with multiple DVD/CD folders
- Dry run mode: Test processing without uploading to S3
- Automatic deinterlacing: Uses
bwdifwith automatic parity detection - Multi-language support: Auto-detects language and translates to English
- Twitch-ready output: MP4 with embedded English subtitles
- Transcoding: libx264 CRF 18, preset slow, AAC 192k, faststart
- Deinterlacing:
bwdifwith automatic parity detection; progressive sources pass through - Subtitles: Embedded as
mov_textwithlanguage=enganddefaultdisposition - Processing: Sequential (one file at a time) for memory efficiency
- Tracking: JSON file at
/data/processed_files.jsonrecords completed work