π MediaFusion 6.0.0 Released
A complete Rust rewrite bringing major performance, reliability, and feature improvements.
π Major Highlights
- Full Rust rewrite β The entire backend is now a native Rust/Axum application replacing the legacy Python/FastAPI server for dramatically improved performance and stability.
- Embedded React frontend β The React SPA is now compiled directly into the server binary; no separate Node.js build or frontend server required.
- PostgreSQL-native types β All 14 Postgres enums now use native Rust enum types with compile-time SQL validation via sqlx macros, eliminating runtime type mismatches.
- Admin genre management β New admin-managed genre system with per-type hide/show toggles, replacing the hardcoded adult genre filter with a flexible seeded database.
- NSFW content filtering β ONNX-based NSFW classifier for poster scanning, stream keyword blocking with word-boundary matching, and admin review dashboard.
- Keyword blocklist system β Admin-managed keyword filter and whitelist with runtime reload, version-tagged cache invalidation, and a precomputed
is_keyword_blockedcolumn for fast queries. - M3U/IPTV import β Full M3U and Xtream playlist import with live channel classification, catalog linking, placeholder poster generation, and m3u_url re-sync support.
- Database Manager β Complete admin database UI with row counts, filters, bulk edit/delete, orphan cleanup, maintenance (VACUUM/ANALYZE), export (CSV/JSON/SQL), and import.
- Task Manager & Scheduler β Admin-controlled IMDb import settings, cron job management with live status, and scheduler panel for cron control.
- Torrin debrid provider β New Torrin file-based debrid service added alongside existing Real-Debrid, TorBox, Seedr, and others.
- Usenet playback support β Usenet stream playback with nzb_guid support and provider-aware playback URLs.
- DMM hashlist ingestion β Full DMM hashlist worker with strict metadata matching and local IMDB FTS search.
- Real-time SSE updates β Server-Sent Events for live task and scheduler updates, replacing frontend polling.
- My Streams revamp β Contributors now have direct controls over their streams with deep links and provider-aware stream ID pinning.
- Episode link clearing β Per-file episode metadata clearing for torrent files, with
clearvariant syntax in the frontend. - Browser-based scraper bypass β Cloudflare challenge solving via browserless v2 JS evaluation for sport-video.org.ua and ext_to.
- Contribution bot (Telegram) β Full Telegram contribution bot with multi-step wizard, webhook dispatcher, and per-user channel support.
- Metadata search & relinking β New metadata match search API, stream relink UI, and file-level episode annotation dialogs.
- MediaFlow proxy routing β All debrid/usenet API calls now optionally route through MediaFlow proxy with IP forwarding.
- Egress watchdog β TCP keepalive and egress watchdog for k8s/gost tunnel staleness prevention with configurable fail thresholds.
π Bug Fixes
- π§ Fixed MDBList catalog config sync and stale cache keys
- π§ Fixed series stream_media_link gap causing
total_streams = 0and hidden series in catalogs - π§ Fixed all metadata suggestion fields (poster, genres, cast, crew, catalogs) applying correctly on approval
- π§ Fixed media deletion cascade to clean up dependent streams and invalidate caches
- π§ Fixed adult genre blocking by propagating adult flag from genre link via new trigger
- π§ Fixed TVDB JWT auth flow β no longer logs users out on upstream 401
- π§ Fixed keyword-blocked recompute running unconditionally on every restart
- π§ Fixed advisory-lock leak in migrations that blocked restarts
- π§ Fixed AIOStreams header-based config being ignored on public stream routes
- π§ Fixed M3U analyze/import response contract mismatch causing false errors
- π§ Fixed web UI logout triggered by non-auth 401 responses from content endpoints
- π§ Fixed placeholder poster generation when upstream poster URL fetch fails
- π§ Fixed scheduler never enqueueing cron jobs when
last_enqueued_atis NULL - π§ Fixed stream validation rejecting valid torrents, usenet, and telegram streams
- π§ Fixed HDR multi-select format handling in the stream edit UI
- π§ Fixed DMM hashlist test keyword mapped to wrong field
- π§ Fixed RealDebrid filename block patterns breaking legitimate content
- π§ Fixed IMDb import COPY transaction lacking proper rollback handling
- π§ Fixed series episode metadata not persisting for user-created series
- π§ Fixed catalog search cache key missing search parameter
- π§ Fixed TorBox DIFF_ISSUE race condition causing silent failures
- π§ Fixed seedr cache check using wrong endpoint and form encoding
β‘ Performance
- π jemalloc allocator β Replaced glibc malloc with tikv-jemallocator to eliminate RSS memory growth
- π Database optimizations β HOT-update fixes,
lower(title,type)functional index, partial FK indexes, and fillfactor=85 for stream/media tables - π Catalog genre query β Replaced expensive 3-table JOIN with EXISTS subquery over small genre table
- π Live search cooldown β Stream cache lock now persists 5 minutes instead of clearing on every successful response (25Γ faster warm queries: ~2000ms β ~75ms)
- π Rate limiter cache β Replaced unbounded HashMap with moka cache (1024 entries, 1-hour TTL) to prevent memory growth
- π Connection pool hardening β Configurable pool settings with
after_connecthooks forstatement_timeoutand idle transaction cleanup - π Keyword filtering β Precomputed
is_keyword_blockedboolean column with partial index replaces O(N_rows Γ N_keywords) per-query scans
π Documentation
- π Complete MkDocs documentation site (28 pages) auto-deployed to GitHub Pages
- π Comprehensive environment reference covering 180+ configuration variables in 18 groups
- π Database ERD with Mermaid diagrams reflecting the v6 schema
- π Updated architecture docs reflecting the Rust/Axum/Tokio stack
- π New Telegram integration guide covering bot setup and channel scraping
- π Stream formatting documentation with full template variable reference
π€ Contributors
@IbbyLabs, @funkypenguin, @constantindjonkam, @luigibarretta, @vctrez, @karunthomas and @mhdzumair