Major Performance & Reliability Release
M3U import matching reduced from 32 hours to 6 seconds (19K streams vs 31K channels).
Performance
- Token-based candidate pre-filter — Inverted index reduces fuzzy match candidates from 31K to ~50-200. Applied to all matching code paths. 19,200x speedup on M3U import.
rapidfuzzintegration — Conditional import:rapidfuzz(10-100x faster) →thefuzz→ built-in Levenshtein.- Early termination in Levenshtein —
min_ratioparameter with length pre-check and row-level abort. Dynamic cutoff raises as better scores are found. - Django query optimizations —
.only()on stream fetches, stream prefetching before import loop, removed unnecessaryselect_related. - Normalization caching — Pre-computed normalizations for all names in a single pass.
Reliability
- Atomic CSV writes —
tempfile+os.replace()prevents corrupt partial writes. Orphan temp files cleaned up on exception. - Background threading for Organize by Category — Prevents uwsgi worker timeout on long-running operations.
- Prefetch safety — Graceful handling of streams deleted between prefetch and import.
New Features
- Match sensitivity presets — Relaxed (70), Normal (80), Strict (90), Exact (95) dropdown.
- Dynamic M3U source dropdown — Populated from database instead of manual text input.
- ProgressTracker — WebSocket updates with percentage and ETA for long operations.
- SmartRateLimiter — Configurable delay between DB writes (None/Low/Medium/High).
match_all_streams()method — Returns all matches above threshold sorted by score.- PluginConfig class — Centralized configuration constants.
- Stop/cancel support — Background operations can be cancelled via the UI.
Cleanup
- Removed legacy files (
channels.json,channels.txt,networks.json). - Updated README with current features, settings, performance docs, and troubleshooting.
Upgrading from 0.7.0a
This is a major upgrade. Remove the old plugin, restart Dispatcharr, and install the new zip. All settings will need to be reconfigured.