Modern media library manager with AI-powered organization
๐ฆ Note: Version 1.x code has been moved to
/old-codefor reference
Videorama is a self-hosted media library manager that combines powerful organization features with AI-driven classification. Import content from URLs or local filesystems, organize it automatically with configurable templates, and enjoy through an intuitive web interface.
- ๐ Configurable Libraries - Create custom libraries (Movies, Music, VideoClips, Private) with individual settings
- ๐ค AI-Powered Classification - Automatic categorization using LLM + external APIs (iTunes, TMDb, MusicBrainz)
- ๐ท๏ธ Hierarchical Tags - Separate automatic and user tags with full hierarchy support
- ๐ Flexible Organization - Configurable path templates per library
- ๐ Smart Import - From URLs, local filesystems, or monitored folders
- ๐ต Audio/Video Duality - Extract audio from videoclips to music library
- ๐ Dynamic Playlists - Create playlists with complex query filters
- ๐ฅ Inbox System - Review low-confidence imports before finalizing
- ๐ Integrations - Telegram bot, browser plugin, MCP server
Backend:
- FastAPI (Python 3.11+)
- PostgreSQL 16
- SQLAlchemy 2.0
- Celery + Redis (background tasks)
Frontend:
- React 18 + TypeScript
- Vite
- TanStack Query
- Tailwind CSS
libraries โ Media libraries (Movies, Music, etc.)
entries โ Media items (UUID-based)
entry_files โ Physical files (with content hash)
entry_relations โ Relationships between entries
tags โ Tag catalog (hierarchical)
entry_auto_tags โ Automatic tags (import/path/LLM/API)
entry_user_tags โ User-defined tags
entry_properties โ Flexible key-value properties
playlists โ Static and dynamic playlists
playlist_entries โ Entries in static playlists
inbox โ Items pending review
jobs โ Persistent async jobs
reindex_jobs โ Library re-indexation tracking
- Docker & Docker Compose
- (Optional) OpenAI-compatible API key for AI features
-
Clone the repository
git clone https://github.com/successbyfailure/Videorama.git cd Videorama -
Configure environment
cp .env.example .env # Edit .env with your settings -
Start services
docker-compose up -d
-
Access the application
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- API Docs: http://localhost:8000/docs
- Go to Settings โ Libraries
- Click + New Library
- Configure:
- Name and icon
- Storage path(s)
- Path template (e.g.,
{genre}/{artist}/{album}/{title}.{ext}) - Auto-organization settings
- LLM confidence threshold
From URL:
- Go to Import โ From URL
- Paste URL(s)
- Select library (or use "Auto" for AI detection)
- Preview and confirm
From Filesystem:
- Go to Import โ From Disk
- Select folder to scan
- Choose mode:
- Auto-organize: AI classifies and reorganizes files
- Copy as-is: Preserve original structure
- Index only: Leave files in place
- Review and import
- Auto Tags: Generated from imports, folder paths, LLM, or external APIs
- User Tags: Manually added, have priority over auto tags
- Hierarchical: Tags can have parent-child relationships
- Bulk Operations: Merge, rename, or clean up tags
Static Playlists:
- Manually add/remove entries
- Reorder as needed
Dynamic Playlists:
- Define complex filters (tags, platform, date range, etc.)
- Auto-updates with matching entries
- Example: "Rock from YouTube added in last 30 days"
Templates support variables that are populated by AI classification:
Music: {genre}/{artist}/{album}/{track_number:02d} - {title}.{ext}
Movies: {genre}/{year}/{title} ({year}).{ext}
VideoClips: {genre}/{artist}/{title}.{ext}
Series: {title}/Season {season:02d}/{title} - S{season:02d}E{episode:02d}.{ext}
Flat: {title}.{ext}
Available variables:
{title},{artist},{album},{genre},{year},{track_number}{director},{season},{episode},{platform},{uploader}{uuid},{date},{ext}, and more
Videorama uses OpenAI-compatible APIs for AI features:
OPENAI_API_KEY=sk-your-key
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4oCompatible with: OpenAI, Azure OpenAI, Anthropic (via proxy), local models (Ollama, LMStudio), etc.
- TMDb (movies/series):
TMDB_API_KEY - Spotify (music):
SPOTIFY_CLIENT_ID,SPOTIFY_CLIENT_SECRET - iTunes Search API: Built-in, no key required
- MusicBrainz: Built-in, no key required
- Title Extraction: LLM extracts clean title from filename/metadata
- External Enrichment: Queries iTunes, TMDb, MusicBrainz for metadata
- Full Classification: LLM classifies with all available context
- Determines library
- Suggests folder structure
- Generates tags
- Fills properties
- Returns confidence score
- Decision: High confidence โ Import | Low confidence โ Inbox
- Content-based: SHA256 hash of file content
- Smart handling:
- If video file matches existing โ check if audio extracted
- If audio matches video โ create relation without duplicating
- Full duplicates โ sent to inbox for review
- Configure folders to monitor per library
- Auto-import new files at defined intervals
- Supports multiple watch folders per library
- Can be enabled/disabled individually
Scan library to detect filesystem changes:
- Moved files: Update paths based on content hash
- Deleted files: Mark as unavailable
- New files: Auto-import if configured
- Corrupted files: Detect hash mismatches
- Metadata refresh: Re-query external APIs (optional)
Import content directly from Telegram:
TELEGRAM_BOT_TOKEN=your-tokenSend video/audio URLs to bot โ Select library โ Auto-import
Chrome extension for one-click imports from any website.
Claude AI can interact with your Videorama library via MCP protocol.
Full API documentation available at: http://localhost:8000/docs
Key endpoints:
GET /api/v1/libraries- List librariesPOST /api/v1/entries- Create entryGET /api/v1/entries/{uuid}- Get entry detailsPOST /api/v1/import/url- Import from URLPOST /api/v1/import/filesystem- Import from filesystemGET /api/v1/inbox- List inbox itemsGET /api/v1/playlists- List playlistsPOST /api/v1/playlists/dynamic/evaluate- Evaluate dynamic playlist
videorama/
โโโ backend/
โ โโโ app/
โ โ โโโ models/ # SQLAlchemy models
โ โ โโโ schemas/ # Pydantic schemas
โ โ โโโ api/v1/ # API endpoints
โ โ โโโ services/ # Business logic
โ โ โโโ utils/ # Utilities
โ โโโ alembic/ # Database migrations
โ โโโ requirements.txt
โโโ frontend/
โ โโโ src/
โ โ โโโ components/ # React components
โ โ โโโ pages/ # Page components
โ โ โโโ services/ # API clients
โ โ โโโ types/ # TypeScript types
โ โโโ package.json
โโโ old-code/ # Legacy v1.x code (archived)
โโโ docker-compose.yml
โโโ .env
Backend:
cd backend
python -m venv venv
source venv/bin/activate # or `venv\Scripts\activate` on Windows
pip install -r requirements.txt
uvicorn app.main:app --reloadFrontend:
cd frontend
npm install
npm run devcd backend
alembic revision --autogenerate -m "Description"
alembic upgrade headMajor Rewrite:
- Complete architecture redesign
- PostgreSQL instead of SQLite
- React frontend instead of Jinja2 templates
- Configurable libraries and path templates
- AI-powered classification with external API enrichment
- Hierarchical tags with auto/user separation
- Dynamic playlists with query builder
- Persistent job system and inbox
- Watch folders and re-indexation
- Audio/video duality for videoclips
Previous version archived in /old-code directory. See /old-code/README.md for v1.x documentation.
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
See LICENSE file for details.
Built with:
External APIs:
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Made with โค๏ธ for media enthusiasts