# Media Storage Architecture ## Overview MPR separates media into **input** and **output** paths, each independently configurable. File paths are stored **relative to their respective root** to ensure portability between local development and cloud deployments (AWS S3, etc.). ## Storage Strategy ### Input / Output Separation | Path | Env Var | Purpose | |------|---------|---------| | `MEDIA_IN` | `/app/media/in` | Source media files to process | | `MEDIA_OUT` | `/app/media/out` | Transcoded/trimmed output files | These can point to different locations or even different servers/buckets in production. ### File Path Storage - **Database**: Stores only the relative path (e.g., `videos/sample.mp4`) - **Input Root**: Configurable via `MEDIA_IN` env var - **Output Root**: Configurable via `MEDIA_OUT` env var - **Serving**: Base URL configurable via `MEDIA_BASE_URL` env var ### Why Relative Paths? 1. **Portability**: Same database works locally and in cloud 2. **Flexibility**: Easy to switch between storage backends 3. **Simplicity**: No need to update paths when migrating ## Local Development ### Configuration ```bash MEDIA_IN=/app/media/in MEDIA_OUT=/app/media/out ``` ### File Structure ``` /app/media/ ├── in/ # Source files │ ├── video1.mp4 │ ├── video2.mp4 │ └── subfolder/ │ └── video3.mp4 └── out/ # Transcoded output ├── video1_h264.mp4 └── video2_trimmed.mp4 ``` ### Database Storage ``` # Source assets (scanned from media/in) filename: video1.mp4 file_path: video1.mp4 filename: video3.mp4 file_path: subfolder/video3.mp4 ``` ### URL Serving - Nginx serves input via `location /media/in { alias /app/media/in; }` - Nginx serves output via `location /media/out { alias /app/media/out; }` - Frontend accesses: `http://mpr.local.ar/media/in/video1.mp4` - Video player: `