A lightweight, directory-based media server built with FastAPI, serving TV shows and movies directly from your file system. It supports streaming .mp4 files with automatic thumbnail generation via ffmpeg and a modern dark-mode friendly UI — all without a database.

- 📂 Directory-based UI — No config or metadata files needed
- 🔍 Auto thumbnail generation using
ffmpeg - 📺 TV Shows with seasons and episodes
- 🎞 Movies with or without folders
- 🌗 Automatic dark mode
- 🔥 Streams video using HTTP Range requests
- 📱 Fully accessible over your local network
- FastAPI — Python web framework
- Jinja2 — Template rendering
- Vanilla JS/CSS — No frontend frameworks
- ffmpeg — Generates thumbnails from videos
Just drop your media into the shows/ folder:
shows/
├── Invincible/
│ └── season_1/
│ ├── ep1.mp4
│ └── ep2.mp4
├── Rick and Morty/
│ └── season_2/
│ ├── ep1.mp4
│ └── ep2.mp4
├── Movies/
│ ├── Spider-Man.mp4
│ └── Interstellar.mp4
- Each video can optionally include a
<filename>-thumbnail.jpg - Movies live in the
/Moviesfolder with.mp4files directly - TV shows follow
/Show/Season/Episode.mp4
python -m venv venv
source venv/bin/activate
pip install -r requirements.txtsudo apt update
sudo apt install ffmpeg -ypython main.pyAccess the app at: http://localhost:8000 or http://:8000 from another device on the network.
On startup, the app:
- Scans all media files
- Generates thumbnails if
*-thumbnail.jpgis missing - Uses the 5-second mark for thumbnail extraction
Thumbnails are saved next to the video file automatically.
pip install uvicorn
pm2 start main.py --interpreter python3MIT — Free to use, fork, and hack on.
![Screenshot 2025-![Uploading Screenshot 2025-06-27 at 10.19.13 AM.png…]()
06-27 at 10 16 37 AM](https://private-user-images.githubusercontent.com/37863173/460064047-afffd7b0-8ca9-40c3-9dbb-ad6bcff40278.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ5MTM3NDUsIm5iZiI6MTc3NDkxMzQ0NSwicGF0aCI6Ii8zNzg2MzE3My80NjAwNjQwNDctYWZmZmQ3YjAtOGNhOS00MGMzLTlkYmItYWQ2YmNmZjQwMjc4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMzAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzMwVDIzMzA0NVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQwZmU3YTBmYjQzMWRhNDBkYzQ4YjkwMDE4NGY0YmNmNzk0MjhmZDZjYzc1ZjNlMjgwM2ZjM2E0MDgyMWI3YTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.xKbgHxjaifa_bTWbHQNfp57QBQpXmtuig3_bgK2GJ6k)
