Local Media - roto31/EXStreamTV GitHub Wiki
Connect your local media libraries to EXStreamTV for organized, scheduled playback.
- Overview
- Supported Library Types
- Local Folder Library
- Plex Integration
- Jellyfin Integration
- Emby Integration
- Media Organization
- Metadata Management
- Scanning and Syncing
- Troubleshooting
EXStreamTV can stream content from multiple sources:
- Local folders - Direct access to video files on your system
- Plex - Connect to your Plex Media Server
- Jellyfin - Connect to your Jellyfin server
- Emby - Connect to your Emby server
Each library is scanned and indexed, allowing you to:
- Browse and search your media
- Create playlists and schedules
- Generate rich EPG data with metadata
- Stream in various qualities
| Source | Movies | TV Shows | Music Videos | Live TV |
|---|---|---|---|---|
| Local Folder | โ | โ | โ | โ |
| Plex | โ | โ | โ | โ |
| Jellyfin | โ | โ | โ | โ |
| Emby | โ | โ | โ | โ |
EXStreamTV supports any format FFmpeg can handle:
- Containers: MP4, MKV, AVI, MOV, WMV, FLV, WebM, M2TS
- Video Codecs: H.264, H.265/HEVC, VP9, AV1, MPEG-2, MPEG-4
- Audio Codecs: AAC, AC3, EAC3, DTS, FLAC, MP3, Opus
The simplest way to add mediaโpoint EXStreamTV at a folder.
Via Web UI:
- Go to Libraries in the sidebar
- Click + Add Library
- Select Local Folder
- Enter details:
-
Name:
Moviesor descriptive name -
Path:
/path/to/your/media - Media Type: Movies, TV Shows, or Mixed
-
Name:
- Click Save
- Click Scan to discover media
Via API:
curl -X POST http://localhost:8411/api/libraries \
-H "Content-Type: application/json" \
-d '{
"name": "Movies",
"library_type": "local",
"path": "/media/movies",
"media_type": "movie"
}'| Setting | Description | Default |
|---|---|---|
| Path | Root folder path | Required |
| Media Type | movie, show, mixed | mixed |
| File Extensions | Extensions to scan | mp4,mkv,avi,mov |
| Scan Interval | Hours between scans | 24 |
| Recursive | Scan subdirectories | true |
For best results, organize your files:
Movies:
/media/movies/
โโโ Movie Name (2024)/
โ โโโ Movie Name (2024).mkv
โ โโโ Movie Name (2024).nfo # Optional metadata
โโโ Another Movie (2023).mp4
TV Shows:
/media/tv/
โโโ Show Name/
โ โโโ Season 01/
โ โ โโโ Show Name - S01E01 - Episode Title.mkv
โ โ โโโ Show Name - S01E02 - Episode Title.mkv
โ โโโ Season 02/
โ โ โโโ Show Name - S02E01 - Episode Title.mkv
Connect your Plex Media Server for seamless library access.
- Plex Media Server running and accessible
- Plex authentication token
Option 1: From Plex Web
- Open Plex Web App
- Play any media
- Open browser developer tools (F12)
- Go to Network tab
- Look for requests to
plex.tv - Find
X-Plex-Tokenin headers
Option 2: Via API
curl -X POST 'https://plex.tv/users/sign_in.json' \
-H 'X-Plex-Client-Identifier: EXStreamTV' \
-d 'user[login]=your_email&user[password]=your_password'Via Web UI:
- Go to Libraries โ + Add Library
- Select Plex
- Enter connection details:
-
Server URL:
http://192.168.1.100:32400 - Token: Your Plex token
-
Server URL:
- Click Discover Libraries
- Select libraries to sync
- Click Save
Via API:
curl -X POST http://localhost:8411/api/libraries \
-H "Content-Type: application/json" \
-d '{
"name": "Plex Movies",
"library_type": "plex",
"server_url": "http://192.168.1.100:32400",
"token": "your-plex-token",
"library_key": "1"
}'- Direct Play: Stream optimized versions from Plex
- Transcoding: Use Plex's transcoding or EXStreamTV's
- Metadata Sync: Import Plex's rich metadata
- Watch State: Respect Plex's watched status (optional)
| Setting | Description |
|---|---|
| Server URL | Plex server address |
| Token | Authentication token |
| Use Direct Play | Stream directly vs transcode |
| Sync Metadata | Import Plex metadata |
| Sync Collections | Import Plex collections |
Connect to your Jellyfin server for free, open-source media management.
- Jellyfin server running
- API key or user credentials
- Open Jellyfin Dashboard
- Go to Administration โ API Keys
- Click + to create new key
- Name it
EXStreamTV - Copy the generated key
Via Web UI:
- Go to Libraries โ + Add Library
- Select Jellyfin
- Enter details:
-
Server URL:
http://192.168.1.100:8096 - API Key: Your Jellyfin API key
-
Server URL:
- Click Discover Libraries
- Select libraries to sync
- Click Save
Via API:
curl -X POST http://localhost:8411/api/libraries \
-H "Content-Type: application/json" \
-d '{
"name": "Jellyfin TV",
"library_type": "jellyfin",
"server_url": "http://192.168.1.100:8096",
"api_key": "your-jellyfin-api-key",
"user_id": "optional-user-id"
}'| Setting | Description |
|---|---|
| Server URL | Jellyfin server address |
| API Key | Authentication key |
| User ID | Specific user (optional) |
| Include Special Features | Import extras/featurettes |
Connect to your Emby server with similar functionality to Jellyfin.
- Emby server running
- API key
- Open Emby Dashboard
- Go to Advanced โ Security
- Under Api Keys, click New Api Key
- Name it
EXStreamTV - Copy the key
Via Web UI:
- Go to Libraries โ + Add Library
- Select Emby
- Enter details:
-
Server URL:
http://192.168.1.100:8096 - API Key: Your Emby API key
-
Server URL:
- Click Discover Libraries
- Select libraries to sync
- Click Save
EXStreamTV uses multiple methods to identify media:
- Filename Parsing: Extracts title, year, season, episode
- NFO Files: Reads Kodi-compatible metadata files
- Online Lookup: Queries TMDB, TVDB for matches
- Folder Structure: Infers organization from paths
For best automatic recognition:
Movies:
Movie Title (Year).ext
Movie Title (Year) - Quality.ext
Examples:
The Matrix (1999).mkv
Inception (2010) - 1080p BluRay.mkv
TV Shows:
Show Name - S##E## - Episode Title.ext
Show.Name.S##E##.Episode.Title.ext
Examples:
Breaking Bad - S01E01 - Pilot.mkv
Game.of.Thrones.S08E06.The.Iron.Throne.mkv
Group related content automatically:
- Movie franchises (Marvel, Star Wars)
- TV show seasons
- Custom collections
Create collections in Libraries โ Collections.
EXStreamTV fetches metadata from:
| Source | Movies | TV Shows | Priority |
|---|---|---|---|
| NFO Files | โ | โ | 1 (highest) |
| TMDB | โ | โ | 2 |
| TVDB | โ | โ | 3 |
| Embedded | โ | โ | 4 |
Create .nfo files alongside your media for manual metadata:
Movie NFO:
<?xml version="1.0" encoding="UTF-8"?>
<movie>
<title>Movie Title</title>
<year>2024</year>
<plot>Movie description goes here...</plot>
<genre>Action</genre>
<genre>Thriller</genre>
<rating>8.5</rating>
<runtime>120</runtime>
<thumb>poster.jpg</thumb>
</movie>TV Show NFO:
<?xml version="1.0" encoding="UTF-8"?>
<tvshow>
<title>Show Name</title>
<year>2020</year>
<plot>Show description...</plot>
<genre>Drama</genre>
</tvshow>- Go to Libraries
- Select a library
- Click Refresh Metadata
Or for individual items:
- Go to Browse โ Find the item
- Click the menu (โฎ) โ Refresh Metadata
Configure API keys in Settings โ Metadata:
- TMDB API Key: Get from themoviedb.org
- TVDB API Key: Get from thetvdb.com
Single Library:
- Go to Libraries
- Find the library
- Click Scan
All Libraries:
- Go to Settings โ Libraries
- Click Scan All Libraries
Configure scan intervals:
# config.yaml
libraries:
scan_on_startup: true
scan_interval_hours: 24
watch_for_changes: true # File system watcherMonitor scan progress:
- View in Libraries โ Library card shows progress
- Check System Monitor for background tasks
- API:
GET /api/libraries/{id}/scan/status
When connected to external servers:
- Initial Sync: Full library import
- Incremental Sync: Only changes synced
- Metadata Refresh: Updates from server
Configure in library settings:
- Sync Interval: How often to check for changes
- Sync Watched State: Track what's been played
Check path permissions:
ls -la /path/to/mediaVerify file extensions:
- Default:
.mp4, .mkv, .avi, .mov - Add custom extensions in library settings
Check scan logs:
- Go to Settings โ Logs
- Filter by "scan" or library name
- Verify Plex is running:
http://your-plex-ip:32400 - Check token is valid
- Ensure EXStreamTV can reach Plex (firewall)
- Try:
curl -H "X-Plex-Token: YOUR_TOKEN" http://plex:32400/identity
- Verify server URL (including port)
- Check API key has correct permissions
- Test:
curl -H "X-Emby-Token: YOUR_KEY" http://server:8096/System/Info
- Check internet connectivity
- Verify API keys are configured
- Manually refresh: Library โ Item โ Refresh Metadata
- Check filename matches expected format
- Reduce concurrent scans in settings
- Disable FFprobe analysis for initial scan
- Use SSD for database storage
- Exclude unnecessary directories
- Check for multiple library paths pointing to same content
- Remove overlapping library configurations
- Use Libraries โ Deduplicate tool
- Organize files properly - Use standard naming conventions
- Use NFO files - For custom or corrected metadata
- Configure API keys - Enable rich metadata lookup
- Regular scans - Keep library in sync with files
- Monitor logs - Catch issues early
Last Revised: 2026-03-01