18 KiB
Stream Mapparr
A Dispatcharr plugin that automatically matches and assigns streams to channels based on intelligent name matching, quality prioritization, and timezone filtering.
Features
- Intelligent Stream Matching: Automatically finds and assigns streams to channels using sophisticated name-matching algorithms
- Unlimited Stream Support: Fetches and processes ALL available streams regardless of quantity (no 10,000 stream limit)
- OTA Callsign Matching: Direct callsign extraction and matching for Over-The-Air broadcast channels
- Multiple Streams Per Channel: Assigns all matching streams to each channel, sorted by quality
- Quality Prioritization: Sorts matched streams by quality (4K → FHD → HD → (H) → (F) → (D) → SD → Slow)
- Channel Visibility Management: Automatically enables/disables channels based on stream assignments and duplicate detection
- Timezone Filtering: Automatically excludes West/Pacific coast feeds unless explicitly requested
- Networks.json Integration: FCC broadcast station database for OTA channel validation
- Channels.txt Integration: Distinguishes between similar channel names (e.g., FX vs FXX vs FX Movie Channel)
- Customizable Ignore Tags: Filter out unwanted tags during matching
- Profile & Group Filtering: Target specific channel profiles and groups
- Preview Mode: Dry-run CSV export to review matches before applying changes
- CSV Export Management: Built-in cleanup tool to delete old export files
- Real-time Updates: WebSocket-based frontend refresh for immediate visual feedback
- Comprehensive Logging: Detailed matching logic and debug information
Requirements
- Active Dispatcharr installation
- Admin username and password for API access
- A Channels Profile other than "All" (Profile Documentation)
- Multiple streams of the same channel available in your setup
channels.txtfile (curated channel list) - includednetworks.jsonfile (FCC broadcast station database) - included for OTA support
Recommendation
It is recommended to use the Channel Mapparr Plugin before using this plugin to standardize channel names. Standardized channel names significantly improve matching accuracy.
Installation
- Log in to Dispatcharr's web UI
- Navigate to Plugins
- Click Import Plugin and upload the plugin zip file
- Enable the plugin after installation
Settings Reference
| Setting | Type | Default | Description |
|---|---|---|---|
| Dispatcharr URL | string |
- | Full URL of your Dispatcharr instance (e.g., http://192.168.1.10:9191) |
| Dispatcharr Admin Username | string |
- | Username for API authentication |
| Dispatcharr Admin Password | password |
- | Password for API authentication |
| Profile Name | string |
- | Name of an existing Channel Profile to process (e.g., "Primary", "Sports") |
| Channel Groups | string |
- | Comma-separated group names to process, or leave empty for all groups |
| Ignore Tags | string |
- | Comma-separated tags to ignore during matching (e.g., 4K, [4K], [Dead]) |
| Visible Channel Limit | number |
1 | Number of channels per callsign group that will be visible and have streams added |
Usage Guide
Step-by-Step Workflow
-
Configure Settings
- Enter your Dispatcharr URL, username, and password
- Specify an existing Profile Name (cannot be "All")
- Optionally specify Channel Groups (leave empty to process all)
- Optionally configure Ignore Tags to filter out unwanted tags
- Set Visible Channel Limit (default: 1 channel per callsign group)
- Click Save Settings
-
Load and Process Channels
- Click Run on
Load/Process Channels - The plugin loads channels from the specified profile and groups
- Fetches all available streams (handles pagination automatically with no limit)
- Review the summary showing channel and stream counts
- Click Run on
-
Preview Changes (Dry Run)
- Click Run on
Preview Changes (Dry Run) - Exports a CSV to
/data/exports/stream_mapparr_preview_YYYYMMDD_HHMMSS.csv - Review matched streams for each channel
- Shows which channels will be updated vs skipped
- Identifies channels without matches
- Click Run on
-
Add Streams to Channels
- Click Run on
Add Stream(s) to Channels - Adds all matched streams to each channel (sorted by quality)
- Only updates channels within the visible channel limit
- Enables updated channels in the profile
- Triggers real-time frontend refresh via WebSocket
- Exports results to
/data/exports/stream_mapparr_results_YYYYMMDD_HHMMSS.csv
- Click Run on
-
Manage Channel Visibility (Optional)
- Click Run on
Manage Channel Visibility - Disables all channels in the profile
- Enables only channels with 0-1 streams (not attached to other channels)
- Enables only the highest priority channel per callsign group
- Useful for cleaning up duplicate channels
- Triggers real-time frontend refresh via WebSocket
- Exports visibility report to
/data/exports/stream_mapparr_visibility_YYYYMMDD_HHMMSS.csv
- Click Run on
-
Clear CSV Exports (Optional)
- Click Run on
Clear CSV Exports - Deletes all CSV files created by this plugin from
/data/exports/ - Shows list of deleted files (up to 10 listed with count of additional files)
- Useful for cleaning up old reports and freeing disk space
- Click Run on
Matching Logic
OTA Channel Matching (Priority Method)
For broadcast channels like "CBS - IN South Bend (WSBT) [HD]":
-
Callsign Extraction: Parses channel name BEFORE any cleaning to extract callsign
- Pattern:
NETWORK - STATE City (CALLSIGN) [Quality] - Example:
CBS - IN South Bend (WSBT) [HD]→ Callsign:WSBT
- Pattern:
-
Direct Callsign Matching: Searches all streams for the exact callsign using word boundaries
- Matches:
US CBS 22 (WSBT) South Bend/Elkhart Area (H) - Matches:
CBS: IN SOUTH BEND WSBT - Excludes:
WSBTV(different callsign)
- Matches:
-
Fallback to Networks.json: If direct matching fails, validates against FCC database
- Confirms network affiliation
- Validates state and callsign combination
- Searches streams for validated callsign
-
Quality Sorting: All matched streams sorted by quality precedence
Standard Channel Matching
For non-OTA channels, the plugin uses a multi-stage process:
-
Exact Match After Cleaning: Matches channel names after removing quality tags
- Example: "TBS [FHD]" → "TBS" matches "US: TBS"
-
Word Boundary Matching: Ensures complete word matches to avoid false positives
- Example: "FX" matches "US: FX" but NOT "FXX" or "WFXR"
-
Longer Channel Filtering: Uses
channels.txtto distinguish similar names- Example: "FX" does NOT match "FX Movie Channel" (different channel)
-
Call Sign Filtering: Excludes local TV station call signs
- Example: "FX" does NOT match "WBKB FX (WBKBDT4)" (local FOX affiliate)
-
Timezone Filtering: Automatically excludes West/Pacific feeds
- Example: "SYFY [HD]" matches "US NBC SYFY (East)" but NOT "US NBC SYFY (West)"
Channel Grouping and Priority
Channels are grouped by callsign (OTA) or cleaned name (regular):
- Within each group, channels are sorted by quality tag priority:
[4K]→[FHD]→[HD]→[SD]→[Unknown]→[Slow]→ No tag
- Then by channel number (ascending)
- Only the highest priority channels (up to Visible Channel Limit) receive streams
Quality Sorting
Matched streams are automatically sorted by quality precedence:
- 4K:
[4K],(4K),4K - FHD:
[FHD],(FHD),FHD - HD:
[HD],(HD),HD,(H) - SD:
[SD],(SD),SD - Other:
(F),(D) - Slow:
Slow,[Slow],(Slow)
Example Transformations
OTA Channels (Callsign Matching)
Channel: CBS - IN South Bend (WSBT) [HD]
Matched Streams: US CBS 22 (WSBT) South Bend/Elkhart Area (H), US CBS 22 (WSBT) South Bend/Elkhart Area (F), CBS: IN SOUTH BEND WSBT
Channel: CBS - CA Monterey (KION) [FHD]
Matched Streams: US CBS 46 (KION) Monterey (H), US CBS 46 (KION) Monterey (F), CBS: CA MONTEREY KION, US: FOX Monterey (KION)
Channel: CBS - NM Albuquerque (KRQE) [HD]
Matched Streams: US FOX (KRQE) Albuquerque Santa Fe (H), US CBS 13 (KRQE) Albuquerque Santa Fe (H), US FOX (KRQE) Alburquerque (F), US CBS (KRQE) Albuquerque (F), CBS: NM ALBUQUERQUE KRQE, FOX: ALBUQUERQUE NM KRQE, US: CBS 13 Albuquerque (KRQE), US: FOX 13 Albuquerque (KRQE)
Standard Channels
Channel: TBS [FHD]
Matched Streams: USA: TBS, US: TBS, US: TBS
Channel: FX (East) [HD]
Matched Streams: US: FX, US: FX, US FX (East) (S), US FX (East) (H), US FX (East) (A), US (F2) FX (East)
Excluded: US: FX Movie Channel, (US) (FOX1) WBKB FX (WBKBDT4)
Channel: SYFY [HD]
Matched Streams: USA SYFY, US: SYFY, US: SYFY, US NBC SYFY (East) (D)
Excluded: US NBC SYFY (West) (D)
Duplicate Channel Handling
Channels in Profile:
CBS - AL Birmingham (WIAT) [FHD]← Highest priority (enabled, receives streams)CBS - AL Birmingham (WIAT) [HD]← Lower priority (skipped)CBS - AL Birmingham (WIAT) [Slow] [HD]← Lower priority (skipped)
Result: Only the [FHD] channel receives streams and is visible
Action Reference
| Action | Description |
|---|---|
| Load/Process Channels | Load channels from specified profile/groups and fetch all available streams (unlimited) |
| Preview Changes (Dry Run) | Export CSV showing which streams will be matched to each channel |
| Add Stream(s) to Channels | Apply matched streams to channels, enabling highest priority channels in each group |
| Manage Channel Visibility | Disable all channels, then enable only channels with 0-1 streams (excluding duplicates and attached channels) |
| Clear CSV Exports | Delete all CSV export files created by this plugin to free up disk space |
File Locations
- Processing Cache:
/data/stream_mapparr_processed.json - Preview Export:
/data/exports/stream_mapparr_preview_YYYYMMDD_HHMMSS.csv - Results Report:
/data/exports/stream_mapparr_results_YYYYMMDD_HHMMSS.csv - Visibility Report:
/data/exports/stream_mapparr_visibility_YYYYMMDD_HHMMSS.csv - Plugin Files:
/data/plugins/stream_mapparr/plugin.py/data/plugins/stream_mapparr/__init__.py/data/plugins/stream_mapparr/channels.txt/data/plugins/stream_mapparr/networks.json
CSV Export Format
Preview CSV
| Column | Description |
|---|---|
| channel_id | Internal Dispatcharr channel ID |
| channel_name | Channel name |
| channel_number | Channel number |
| matched_streams_count | Number of streams matched |
| stream_names | Pipe-separated list of matched stream names |
| stream_ids | Comma-separated list of matched stream IDs |
| will_update | Yes if channel will be updated, No if skipped |
Results CSV
| Column | Description |
|---|---|
| channel_id | Internal Dispatcharr channel ID |
| channel_name | Channel name |
| channel_number | Channel number |
| matched_streams_count | Number of streams added |
| stream_names | Pipe-separated list of added stream names |
| stream_ids | Comma-separated list of added stream IDs |
| will_update | Yes if channel was updated, No if skipped |
| status | Updated, Skipped (over limit), No matches, or error details |
Visibility Report CSV
| Column | Description |
|---|---|
| channel_id | Internal Dispatcharr channel ID |
| channel_name | Channel name |
| stream_count | Number of streams attached to channel |
| reason | Why channel was enabled/disabled |
| enabled | Yes if channel is visible, No if hidden |
Troubleshooting
Common Issues
"Profile Name must be configured"
- Enter an existing profile name in the settings
- Profile name is case-sensitive
- Cannot use "All" - must create a separate profile
"None of the specified groups were found"
- Verify group names are spelled correctly (case-sensitive)
- Check available groups in the error message
- Leave field empty to process all groups
OTA channels not matching streams
- Verify channel name format:
NETWORK - STATE City (CALLSIGN) - Example:
CBS - IN South Bend (WSBT) [HD] - Check that callsign exists in stream names
- Review logs for "Extracted callsign" and "Found callsign match" messages
- Ensure
networks.jsoncontains the station data (fallback method)
Too many duplicate channels visible
- Run "Manage Channel Visibility" action
- Adjust "Visible Channel Limit" setting (default: 1)
- Only highest priority channels per callsign group will remain visible
Channels not matching streams
- Run Channel Mapparr first to standardize channel names
- Check that streams exist for your channels
- Use Preview mode to see matching details in logs
- Verify
channels.txtcontains your channel names
Too many false positives
- Add entries to
channels.txtto distinguish similar names - Use Ignore Tags to filter out quality indicators
- Check logs for matching logic details
Frontend not updating after changes
- Plugin uses WebSocket-based updates for real-time refresh
- If changes are not immediately visible, refresh your browser
- Check logs for "Frontend refresh triggered via WebSocket" message
Many old CSV export files
- Use the "Clear CSV Exports" action to delete all old reports
- This will free up disk space in
/data/exports/
"Plugin 'stream-mapparr' not found" error
- Log out of Dispatcharr
- Refresh your browser or close and reopen it
- Log back in and try again
Updating the Plugin
To update Stream-Mapparr from a previous version:
-
Remove Old Version
- Navigate to Plugins in Dispatcharr
- Click the trash icon next to the old Stream-Mapparr plugin
- Confirm deletion
-
Restart Dispatcharr
- Log out of Dispatcharr
- Restart the Docker container:
docker restart dispatcharr
-
Install New Version
- Log back into Dispatcharr
- Navigate to Plugins
- Click Import Plugin and upload the new plugin zip file
- Enable the plugin after installation
-
Verify Installation
- Check that the new version number appears in the plugin list
- Reconfigure your settings if needed
- Run "Load/Process Channels" to test
FAQ
How do I improve matching accuracy?
Option 1: Use Channel Mapparr Plugin (Recommended)
- Install and run the Channel Mapparr Plugin
- This automatically standardizes channel names across your entire setup
- Provides consistent naming that Stream-Mapparr can reliably match
Option 2: Edit channels.txt manually
- Navigate to
/data/plugins/stream_mapparr/channels.txt - Add standardized channel names (one per line)
- Example entries:
TBS FX FX Movie Channel SYFY USA Network - This helps the plugin distinguish between similar channel names
- Restart the plugin after editing
How many streams can the plugin handle?
Stream-Mapparr has no stream limit. The plugin automatically handles pagination and will fetch all available streams regardless of quantity. It has been successfully tested with libraries containing 10,000+ streams.
Why use Visible Channel Limit?
The Visible Channel Limit setting controls how many channels per group receive streams and remain visible. For example, if you have:
CBS - AL Birmingham (WIAT) [FHD]CBS - AL Birmingham (WIAT) [HD]CBS - AL Birmingham (WIAT) [SD]
With a limit of 1, only the highest priority channel ([FHD]) receives streams and stays visible. This prevents duplicate channels from cluttering your guide.
What happens to existing stream assignments?
When you run "Add Stream(s) to Channels", the plugin:
- Removes all existing stream assignments from matched channels
- Adds the new matched streams (sorted by quality)
- Only affects channels within the Visible Channel Limit
Channels outside the limit or without matches are left unchanged.
Can I undo changes?
The plugin exports CSV reports for every action:
- Preview reports show what will change
- Results reports show what was changed
- Visibility reports show which channels were enabled/disabled
You can use these reports to manually revert changes if needed. However, there is no built-in "undo" function.
How do I clean up old export files?
Use the "Clear CSV Exports" action to delete all CSV files created by Stream-Mapparr. This removes files from /data/exports/ that start with stream_mapparr_ and helps free up disk space.
Debugging Commands
# Check plugin files
docker exec dispatcharr ls -la /data/plugins/stream_mapparr/
# Monitor plugin activity
docker logs -f dispatcharr | grep -i stream_mapparr
# View processing cache
docker exec dispatcharr cat /data/stream_mapparr_processed.json | jq
# Check OTA callsign extraction
docker logs -f dispatcharr | grep "Extracted callsign"
# Check stream matches
docker logs -f dispatcharr | grep "Found callsign match"
# Check CSV exports
docker exec dispatcharr ls -lh /data/exports/stream_mapparr_*
Performance Notes
- No Stream Limit: Version 0.3 removes the previous 10,000 stream limitation
- Automatic Pagination: Plugin handles API pagination automatically, fetching all available streams
- Large Libraries: Successfully tested with 10,000+ streams
- WebSocket Updates: Real-time frontend refresh eliminates need for manual page refresh after changes