Left over from #203 (PR #243) and named there as live-verified only.
MainWindow::openStreamUrl now records a Live TV channel in recent/ by its identity (livetv:<tvg-id> or the name fallback) rather than by the freshly minted stream URL — necessary because recent/ is a synced store whose #200 scrub takes the query off a URL and cannot touch a credential carried in the PATH, which is where IPTV providers put theirs. One guarded line; both arms were driven live on the worktree build. No probe reaches openStreamUrl, so a regression here would reintroduce a credential into a synced store silently.
What done looks like
Either the write moves into a pure helper (identity in, recent/ row out) that probe_iptv or probe_cloudmerge can call with a fixture whose URL carries a token in the path and assert the serialised row contains no :// and no token bytes — or a probe_uitest step opens a fixture channel and reads the recent/ row back from the ini. The first is smaller and matches how the rest of #203 was pinned.
Left over from #203 (PR #243) and named there as live-verified only.
MainWindow::openStreamUrlnow records a Live TV channel inrecent/by its identity (livetv:<tvg-id>or the name fallback) rather than by the freshly minted stream URL — necessary becauserecent/is a synced store whose #200 scrub takes the query off a URL and cannot touch a credential carried in the PATH, which is where IPTV providers put theirs. One guarded line; both arms were driven live on the worktree build. No probe reachesopenStreamUrl, so a regression here would reintroduce a credential into a synced store silently.What done looks like
Either the write moves into a pure helper (identity in,
recent/row out) thatprobe_iptvorprobe_cloudmergecan call with a fixture whose URL carries a token in the path and assert the serialised row contains no://and no token bytes — or aprobe_uiteststep opens a fixture channel and reads therecent/row back from the ini. The first is smaller and matches how the rest of #203 was pinned.