Enhanced Channel Manager v0.17.1 — a bugfix and hardening rollup over v0.17.0 (53 changelog entries). Highlights below; see CHANGELOG.md for full per-entry detail.
Added
- Stats: surface the real requestor device IP from media-server sessions as a separate "Client IP" field (bd-7ncci, v0.17.1-0072).
- CI: gate mcp-server/tests/ suite before any OAuth work (bd-ak7xa, v0.17.1-0067).
Fixed
- SMTP "Test Connection" failed with 530 Authentication Required even though scheduled notification emails sent fine (bd-air4z, GH #380, v0.17.1-0090).
- Per-connection Dispatcharr-account discriminator: a genuine direct XC subscriber no longer absorbs a media-server viewer it shares a channel with (bd-rools, re-fix for the bd-cat70 direct-client cross-attribution, v0.17.1-0071).
- Attribution integration gap: an XC-credentialed UPSTREAM channel URL silently excluded every media-server viewer from reconciliation → "User #0" (bd-4w9w6, fix-forward for bd-mlcla, v0.17.1-0070).
- Media-server attribution is now networking-agnostic — per-channel set reconciliation replaces the brittle IP gate (bd-mlcla, supersedes bd-podx3/bd-ost8o/bd-cat70 attribution model, v0.17.1-0069).
- Stats attribution collapse: distinct client IPs all mapped to one media-server user — revert bd-ost8o two-mode dispatch (bd-podx3, fixes bd-ost8o, v0.17.1-0068).
- README: surface MCP_HOST upgrade callout for host-networking operators (bd-0eimc, v0.17.1-0066).
- MCP Integration: copy buttons silently failed on plain-HTTP deployments + missing Node.js prerequisite docs (bd-rowlk + bd-fpjz3, v0.17.1-0065).
- MCP Integration status badge always showed "not reachable" on canonical Docker compose (bd-d2171, v0.17.1-0064).
- Stats page shows "Unknown" provider on live channels — replace broken proxy-session-UUID channel-streams fallback with URL-hostname matching against M3U accounts (bd-gy5nd, v0.17.1-0063).
- Resolver IP-gate too strict for browser-direct-play attribution (bd-ost8o, v0.17.1-0062).
- Jellyfin attribution: resolve NowPlayingQueue item IDs when NowPlayingItem is absent + comprehensive enrichment forensic logging (bd-dok7u, v0.17.1-0061).
- Stats: Connected Clients header counts actual upstream viewers, not ECM-side proxy connections (bd-w9c2a, v0.17.1-0060).
- Jellyfin / Emby / Plex Live TV attribution: parse ECM channel_name pipe-prefix as Tier-2 channel-number candidate (bd-f68c8, v0.17.1-0059).
- Stats attribution: per-IP scoping for per-client emby/plex/jellyfin enrichment + channel-header dedup (bd-cat70, v0.17.1-0057).
- Plex Live TV attribution: extract channel name from
@grandparentTitle+@parentTitleso the Plex resolver can match (bd-2zcvf, v0.17.1-0056). - Per-client Emby attribution: surface emby_user_name in Connected Clients list (bd-5kbyf, fix-forward for v0.17.1-0035).
- Emby resolver: channel-name primary match (bd-zldrq, fix-forward for v0.17.1-0033 live test).
Added
- Emby usernames in Stats endpoints + UI — FINAL bead of EPIC bd-2cenq (bd-fm23o).
- BandwidthTracker Emby attribution wiring (bd-gih6d, epic bd-2cenq).
- Emby cross-ref resolver: ECM stream → Emby user (bd-6802c, epic bd-2cenq).
- Emby Settings UI + persistence + test-connection endpoint (bd-8wc6q, epic bd-2cenq — operator-facing surface for the v0.17.x Emby user-attribution feature).
- Emby session cache with TTL + thundering-herd guard (bd-gpeot, epic bd-2cenq).
- Emby user attribution columns on
session_telemetry(bd-k026g, parent epic bd-2cenq). - Emby API client + auth (bd-6c0g6, epic bd-2cenq — foundational module for the v0.17.x Emby user-attribution feature).
ecm_pending_merges_queue_depthgauge instrumentation (bd-wvr1d, BD-F follow-up).- End-to-end test coverage for the v0.17.1 stream-dedup epic (bd-etdeb, BLOCKING gate for v0.17.1 release).
- BD-I "Add Stream" dedup integration on the Streams pane (bd-1lznl, ADR-008 §D1
trigger_context='add_stream'). - Pending Merges page + Channel Manager subnav + post-M3U-refresh toast (bd-gfxrz / BD-J, ADR-008 §D1).
- Drag-drop integration for the stream-to-channel dedup modal (bd-u6ftw / BD-H, ADR-008 §D1 + §D5).
- BD-I "Add Stream" dedup integration on the Streams pane (bd-1lznl, ADR-008 §D1
trigger_context='add_stream'). - MCP
add_streamtool withdedup_actionparameter (bd-7u8ms / BD-P, ADR-008 §D7). - Pending Channel Merges API
- Stats v2 nightly rollup extended to cover per-type event counters (bd-d0ha9).
- Bulk M3U import dedup hook populates the
pending_mergesqueue (bd-a5lb2 / BD-F). - SLO-10 + Prometheus alert rules for the v0.17.1 dedup epic (bd-ft3hk / BD-M).
GET /api/channel-merges/candidates— synchronous dedup candidate lookup (bd-kbqwb, BD-D).- MCP dedup tools:
list_pending_channel_merges,accept_channel_merge,dismiss_channel_merge(bd-70ylc / BD-O, ADR-008 §D7).
Documentation
- Worktree bootstrap script + docs for agents spawned into
.claude/worktrees/agent-*(bd-scv37). - Stream deduplication documentation for v0.17.1 (bd-0lsas / BD-N, ADR-008).
Fixed
- Auto-creation Smart Sort: custom streams (operator-added, non-M3U) are now included in priority ordering (bd-sgtmx, GH #244).
settings.jsonapi_keyfield-name collision with the MCP integration (bd-jmi1c, GH #273).- Bulk channel merge: pre-validate source IDs to return 422 instead of silently producing DELETE 404 noise on stale rows (bd-ozhkf — follow-up to bd-ct9wl).
- Channel merge UX: surface backend 422 detail to operator instead of swallowing into generic "Merge failed" error (bd-7j6v1 — follow-up to bd-ct9wl).
- Plex user attribution (bd-r5f0c.2/r5f0c.4).
- Jellyfin user attribution (bd-r5f0c.3/r5f0c.4).
- Multi-viewer attribution display (bd-r5f0c.9).
AttributionBadgeUI component (bd-r5f0c.5).- Operator integrations documentation (bd-r5f0c.7).
Security
- SSRF mitigation on test-connection endpoints (bd-r5f0c.4).
Changed
_resolve_emby_attributions→_resolve_attributions(bd-r5f0c.4)._enrich_channels_with_emby→_enrich_channels_with_attribution(bd-r5f0c.4).