diff --git a/.changes/backup-hidden-categories.md b/.changes/backup-hidden-categories.md deleted file mode 100644 index 064f99137..000000000 --- a/.changes/backup-hidden-categories.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: backup -issues: [1017] ---- - -Backups carry hidden Xtream categories correctly. An export used to lose which -categories you had hidden, and restoring such a backup then hid every category -of that kind. diff --git a/.changes/build-shared-style-cache-inputs.md b/.changes/build-shared-style-cache-inputs.md deleted file mode 100644 index c0761ce13..000000000 --- a/.changes/build-shared-style-cache-inputs.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: internal -area: build ---- - -Shared UI stylesheets are now part of the build cache key. Edits to them -previously produced a cache hit, so a style fix could be silently missing from -a rebuilt app until the cache was bypassed. A CI check now fails any stylesheet -import that escapes its build's inputs. diff --git a/.changes/build-vite-dev-filter.md b/.changes/build-vite-dev-filter.md deleted file mode 100644 index e1cf2fd2d..000000000 --- a/.changes/build-vite-dev-filter.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: internal -area: build ---- - -Electron development serve no longer crashes while Vite transforms a large -lazy chunk. The pinned Vite release now carries a backtracking-safe transform -filter fix, with a regression check guarding dependency updates. diff --git a/.changes/components-confirm-dialog-width.md b/.changes/components-confirm-dialog-width.md deleted file mode 100644 index 3ed0d545a..000000000 --- a/.changes/components-confirm-dialog-width.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: components ---- - -Confirmation dialogs are wider by default, so their action buttons sit side by -side instead of wrapping into a vertical stack with longer translated labels. diff --git a/.changes/dashboard-continue-watching-actions.md b/.changes/dashboard-continue-watching-actions.md deleted file mode 100644 index edf1a0ced..000000000 --- a/.changes/dashboard-continue-watching-actions.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: dashboard -issues: [1441] ---- - -Continue Watching cards on the dashboard now open the detail page on click, -just like movie cards — no more accidental episode playback. Resuming the -saved episode moved to a new ⋮ menu on each card, next to "Mark as Watched" -and "Remove from history". diff --git a/.changes/dashboard-hero-backdrop-stalker.md b/.changes/dashboard-hero-backdrop-stalker.md deleted file mode 100644 index 63a712acc..000000000 --- a/.changes/dashboard-hero-backdrop-stalker.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: dashboard ---- - -The dashboard hero now shows the same backdrop as the detail page. Stalker -movies and series reuse the artwork saved when you opened them, and the -metadata lookup behind the hero uses the release year and original title -instead of the bare title — so titles TMDB knows more than once ("Холод") -no longer come up empty. diff --git a/.changes/dashboard-source-expiry-badge.md b/.changes/dashboard-source-expiry-badge.md deleted file mode 100644 index 7ea44e806..000000000 --- a/.changes/dashboard-source-expiry-badge.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: dashboard ---- - -Dashboard source cards now warn when a portal subscription is about to lapse: -an amber "Expires in N d" chip appears within a week of the expiry date, and -an "Expired" chip once it has passed. Xtream expirations come from the same -cached status check the playlist switcher uses; Stalker portals reuse the -account info saved at import. diff --git a/.changes/dashboard-tmdb-identity.md b/.changes/dashboard-tmdb-identity.md deleted file mode 100644 index ca2cebb5d..000000000 --- a/.changes/dashboard-tmdb-identity.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: dashboard ---- - -Movies and series you have opened before now show their artwork, rating and -genres on the dashboard far more reliably, and seed the recommendations rail. -Previously the dashboard searched TMDB by title alone, so common titles like -"Inside Out" matched nothing — it now reuses what the detail page already -found. diff --git a/.changes/dashboard-tmdb-recommendations.md b/.changes/dashboard-tmdb-recommendations.md deleted file mode 100644 index cc8bc69a4..000000000 --- a/.changes/dashboard-tmdb-recommendations.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: dashboard ---- - -The dashboard gains a "Because you watched" rail: TMDB recommendations seeded -from your recently watched movies and series, showing only titles that actually -exist in your imported libraries. It appears once at least five matches are -found, can be turned off under Settings → Dashboard, and requires the TMDB -metadata opt-in (desktop app only). diff --git a/.changes/dashboard-trending-remake-matches.md b/.changes/dashboard-trending-remake-matches.md deleted file mode 100644 index 27449ee91..000000000 --- a/.changes/dashboard-trending-remake-matches.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: dashboard ---- - -Trending cards, the "Similar" rail and actor filmographies no longer show a -title as missing from your library when your playlists hold several versions of -it. A catalog with both "Dune 1984" and "Dune 2021" used to keep whichever came -first, so the other one lost its link even though you had it. diff --git a/.changes/database-redact-sql-traces.md b/.changes/database-redact-sql-traces.md deleted file mode 100644 index 89d7c484c..000000000 --- a/.changes/database-redact-sql-traces.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: database ---- - -SQLite diagnostics now record only statement types, preventing playlist credentials and other private values from appearing in trace logs. diff --git a/.changes/deps-better-sqlite3-13.md b/.changes/deps-better-sqlite3-13.md deleted file mode 100644 index aa5aaeb2a..000000000 --- a/.changes/deps-better-sqlite3-13.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: deps ---- - -Database workers now use updated SQLite bindings that avoid a crash during worker shutdown. diff --git a/.changes/deps-dependabot-security-sweep.md b/.changes/deps-dependabot-security-sweep.md deleted file mode 100644 index d043f0d23..000000000 --- a/.changes/deps-dependabot-security-sweep.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: internal -area: deps ---- - -Coordinated security dependency sweep closing all open Dependabot alerts: the -two runtime-scope advisories (js-yaml YAML-parsing DoS reached through -electron-updater, fast-uri host confusion reached through electron-conf) plus -the dev-only clusters — Astro 5→7 for the website, hono, undici, postcss and -a dozen other transitive bumps via pnpm overrides. diff --git a/.changes/deps-electron-43.md b/.changes/deps-electron-43.md deleted file mode 100644 index e7e0de40e..000000000 --- a/.changes/deps-electron-43.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: deps ---- - -Linux desktops with client-side decoration support now show native rounded corners on the IPTVnator window. Desktop builds now run on Electron 43. diff --git a/.changes/deps-epg-parser-0-5-0.md b/.changes/deps-epg-parser-0-5-0.md deleted file mode 100644 index 0eb47360f..000000000 --- a/.changes/deps-epg-parser-0-5-0.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: internal -area: deps ---- - -The web backend now uses the current structured XMLTV parser output, covered by a route-level contract test for future PWA EPG support. diff --git a/.changes/deps-ngx-indexed-db-22.md b/.changes/deps-ngx-indexed-db-22.md deleted file mode 100644 index b8ed6b335..000000000 --- a/.changes/deps-ngx-indexed-db-22.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: internal -area: deps ---- - -Updated ngx-indexed-db (the PWA's IndexedDB storage library) from 21 to 22. No behavior change. diff --git a/.changes/deps-npm-minor-patch-group.md b/.changes/deps-npm-minor-patch-group.md deleted file mode 100644 index 1e2eb2a84..000000000 --- a/.changes/deps-npm-minor-patch-group.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: internal -area: deps ---- - -Updated 43 dependencies, including the HTTP client behind every playlist and -portal request — that one closes seven advisories that affect the shipped app, -among them a proxy-credential leak on redirects. Also refreshes the ArtPlayer, -hls.js, Video.js and Shaka player engines. No behaviour change intended. diff --git a/.changes/deps-transitive-cve-overrides.md b/.changes/deps-transitive-cve-overrides.md deleted file mode 100644 index 8be3e46d5..000000000 --- a/.changes/deps-transitive-cve-overrides.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: internal -area: deps ---- - -Patched five vulnerable transitive dependencies that ship with the app — -including the YAML parser `electron-updater` uses to read update manifests, and -the HTTP form encoder behind portal requests. No behaviour change. diff --git a/.changes/downloads-library-cards-cleanup.md b/.changes/downloads-library-cards-cleanup.md deleted file mode 100644 index 9f14fb53c..000000000 --- a/.changes/downloads-library-cards-cleanup.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: downloads ---- - -The download manager got a visual cleanup: "Ready to watch" cards are compact -poster cards — file actions live in the poster's ⋮ menu, and clicking any card -(episodes included) opens its offline detail. Queue rows show one primary -action (pause/resume/retry) with cancel and remove in the menu, and all -sections share one heading style with item counts. diff --git a/.changes/downloads-live-tv-recordings.md b/.changes/downloads-live-tv-recordings.md deleted file mode 100644 index b17364cf9..000000000 --- a/.changes/downloads-live-tv-recordings.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: downloads ---- - -Live-TV recordings made with the Embedded MPV player now live in the download -manager: an in-progress row with elapsed time and Stop, a Recordings library -with channel logos and the programs captured from the EPG at recording time, -a focused detail page, and Needs attention when a file goes missing. -Recordings interrupted by a crash survive as playable partials. diff --git a/.changes/downloads-manager-mvp.md b/.changes/downloads-manager-mvp.md deleted file mode 100644 index 30613e4d9..000000000 --- a/.changes/downloads-manager-mvp.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: downloads ---- - -Downloads now separate active transfers from a grouped offline library, move -missing files to Needs attention with Download again, and open movies and -series in focused offline details with saved metadata. Series show only local -episodes; View in portal returns to provider playback when the source can be -recovered. -Completed-file checks stay responsive on slow or unavailable storage. diff --git a/.changes/downloads-pause-resume.md b/.changes/downloads-pause-resume.md deleted file mode 100644 index 2bde5dffb..000000000 --- a/.changes/downloads-pause-resume.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: downloads ---- - -Downloads can be paused and picked up later. A paused transfer keeps what it -already fetched and continues from that point instead of starting over, and -downloads cut short by a crash or a closed app come back as paused rather than -lost. diff --git a/.changes/downloads-reconnect-no-validator-resume.md b/.changes/downloads-reconnect-no-validator-resume.md deleted file mode 100644 index 10dfded58..000000000 --- a/.changes/downloads-reconnect-no-validator-resume.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: downloads ---- - -Downloads from portals that cut long connections no longer die with "aborted": the app now reconnects automatically and continues from where the transfer stopped. Resume also works on servers that send no ETag/Last-Modified — the app re-checks a 256 KiB overlap against the saved partial before appending, and only gives up after repeated reconnects make no progress. diff --git a/.changes/downloads-season-queue.md b/.changes/downloads-season-queue.md deleted file mode 100644 index b6658cd92..000000000 --- a/.changes/downloads-season-queue.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: downloads ---- - -Series downloads now let you queue several episodes in a row or add every available episode from the selected season. Already queued, paused, or downloaded episodes are skipped without duplicates, and the app reports the batch result. diff --git a/.changes/downloads-vod-reliability.md b/.changes/downloads-vod-reliability.md deleted file mode 100644 index 899f97e5a..000000000 --- a/.changes/downloads-vod-reliability.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: downloads -issues: [897, 1289] ---- - -Xtream movie and episode downloads now keep their provider-compatible identity from the first request through legacy retries after source removal. Recoverable connection drops retain validated partials and show a credential-safe code; Retry resumes only with ETag or Last-Modified, otherwise it safely restarts. diff --git a/.changes/electron-backend-zero-delay-cancellation.md b/.changes/electron-backend-zero-delay-cancellation.md deleted file mode 100644 index 6f5aef92e..000000000 --- a/.changes/electron-backend-zero-delay-cancellation.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: fix -area: electron-backend ---- - -Cancelling a large Xtream import now stops database work even while it is -running at full speed, instead of letting the import finish before processing -the cancel request. diff --git a/.changes/electron-remote-static-paths.md b/.changes/electron-remote-static-paths.md deleted file mode 100644 index 70313de33..000000000 --- a/.changes/electron-remote-static-paths.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: electron ---- - -The desktop remote-control server now blocks crafted static paths from escaping -bundled web files on Windows. diff --git a/.changes/embedded-mpv-dock-menus.md b/.changes/embedded-mpv-dock-menus.md deleted file mode 100644 index 4245137af..000000000 --- a/.changes/embedded-mpv-dock-menus.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: embedded-mpv -issues: [1139] ---- - -Opening the volume, audio, subtitle, speed or aspect menu in the Embedded MPV -player no longer makes the video jump or leave a black bar above the controls: -the menus now unfold inside the control bar instead of floating over the video. diff --git a/.changes/embedded-mpv-frame-copy.md b/.changes/embedded-mpv-frame-copy.md deleted file mode 100644 index 6a866ae2f..000000000 --- a/.changes/embedded-mpv-frame-copy.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: embedded-mpv ---- - -Experimental Embedded MPV can draw video inside the app window instead of into a -separate layer pinned on top of it, so menus, dialogs and the player controls -stop being swallowed by the picture. Available on macOS (Apple Silicon), Windows -and Linux x64; switching it on needs a restart. diff --git a/.changes/embedded-mpv-scaled-displays.md b/.changes/embedded-mpv-scaled-displays.md deleted file mode 100644 index bb8f1b535..000000000 --- a/.changes/embedded-mpv-scaled-displays.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: embedded-mpv -issues: [1139, 1145] ---- - -On Windows and Linux displays scaled above 100%, the Embedded MPV video was -drawn toward the top-left corner at a fraction of its size, in windowed and -fullscreen mode alike. The video now fills the player area correctly at any -display scale and page zoom, with no need for a high-DPI compatibility -workaround. diff --git a/.changes/epg-manual-channel-mapping.md b/.changes/epg-manual-channel-mapping.md deleted file mode 100644 index 7cb429b15..000000000 --- a/.changes/epg-manual-channel-mapping.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: epg ---- - -Channels whose guide never matched can be mapped by hand: right-click a channel -in any list and pick "Map EPG channel" to attach it to a channel from your -uploaded XMLTV guide. The mapping is remembered and used everywhere the guide is -read — M3U playlists, Xtream and Stalker portals alike. diff --git a/.changes/epg-mapping-fail-soft.md b/.changes/epg-mapping-fail-soft.md deleted file mode 100644 index 253aacde3..000000000 --- a/.changes/epg-mapping-fail-soft.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: epg ---- - -A database error while looking up manual EPG channel mappings no longer breaks -the request that triggered it. Searching for a channel in the "Map EPG channel" -dialog, or saving and removing a mapping, now degrades gracefully instead of -failing outright. diff --git a/.changes/epg-mapping-lookup-fail-soft.md b/.changes/epg-mapping-lookup-fail-soft.md deleted file mode 100644 index dc35aebbe..000000000 --- a/.changes/epg-mapping-lookup-fail-soft.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: epg ---- - -A database error while reading or saving a manual EPG channel mapping no longer -surfaces as a failed request. Looking up, saving, deleting, and searching -mappings now fall back quietly, so a transient storage hiccup can no longer take -down the EPG panel or the "Map EPG channel" dialog. diff --git a/.changes/favorites-lost-updates.md b/.changes/favorites-lost-updates.md deleted file mode 100644 index a54c32de3..000000000 --- a/.changes/favorites-lost-updates.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: favorites -issues: [1137] ---- - -Favorites stop losing changes. The custom drag-and-drop order of an Xtream -playlist's own favorites is saved again, and two favorites or history entries -added at almost the same moment no longer quietly overwrite each other. diff --git a/.changes/i18n-hungarian.md b/.changes/i18n-hungarian.md deleted file mode 100644 index 691f77900..000000000 --- a/.changes/i18n-hungarian.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: feature -area: i18n -issues: [1192] ---- - -IPTVnator speaks Hungarian, its 19th language — contributed by @htibcsike. diff --git a/.changes/i18n-translation-fixes.md b/.changes/i18n-translation-fixes.md deleted file mode 100644 index df57dbe02..000000000 --- a/.changes/i18n-translation-fixes.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: i18n ---- - -Translations across the app are clearer and more consistent in supported languages. diff --git a/.changes/m3u-dash-clearkey.md b/.changes/m3u-dash-clearkey.md deleted file mode 100644 index c2853da6b..000000000 --- a/.changes/m3u-dash-clearkey.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: m3u -issues: [86, 614, 656, 733, 752] ---- - -MPEG-DASH channels play in the built-in player, ClearKey-encrypted ones -included — the keys are read from the playlist's #KODIPROP lines, whether they -sit above or below the channel entry. Streams locked with Widevine or PlayReady -still cannot be played, but they now say so instead of failing silently. diff --git a/.changes/m3u-external-player-user-agent.md b/.changes/m3u-external-player-user-agent.md deleted file mode 100644 index d0ec019d3..000000000 --- a/.changes/m3u-external-player-user-agent.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: m3u -issues: [1221] ---- - -When a channel plays in MPV, VLC or the embedded MPV player, the custom -User-Agent, Referer and Origin saved on the M3U playlist now reach the player. -Per-channel `#EXTVLCOPT` headers still win; the playlist values only fill the -gaps. VLC now also sends the Origin value as a real HTTP header, as MPV -already did. diff --git a/.changes/m3u-favorites-hydration.md b/.changes/m3u-favorites-hydration.md deleted file mode 100644 index 97d9deb64..000000000 --- a/.changes/m3u-favorites-hydration.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: perf -area: m3u ---- - -Importing large M3U playlists is faster because IPTVnator no longer rewrites -the entire playlist when loading saved favorites. diff --git a/.changes/m3u-long-stream-urls.md b/.changes/m3u-long-stream-urls.md deleted file mode 100644 index e084e55ee..000000000 --- a/.changes/m3u-long-stream-urls.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: m3u -issues: [1189] ---- - -Playlists with very long stream URLs — Pluto TV style lists that carry a session -token in every link — import in full again instead of collapsing into a single -channel. diff --git a/.changes/m3u-refresh-cancellation.md b/.changes/m3u-refresh-cancellation.md deleted file mode 100644 index 6029dad22..000000000 --- a/.changes/m3u-refresh-cancellation.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: perf -area: m3u ---- - -Cancelling a large M3U refresh now stops its background worker before parsed -channels can be copied or saved, keeping the interface responsive and leaving -the existing playlist unchanged. diff --git a/.changes/matching-abbreviation-titles.md b/.changes/matching-abbreviation-titles.md deleted file mode 100644 index 5255f01b8..000000000 --- a/.changes/matching-abbreviation-titles.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: matching ---- - -Movies whose name is a short abbreviation — AKA, RRR, IO, VFW, Y2K — are no -longer mistaken for a language tag and filed under their release year alone. -They now match their own copies in your other playlists, so alternative -sources, recommendations and pinned sources land on the right film instead of -an unrelated one that happens to share that year. diff --git a/.changes/packaging-electron-builder-snap-runtime.md b/.changes/packaging-electron-builder-snap-runtime.md deleted file mode 100644 index 1aedf3405..000000000 --- a/.changes/packaging-electron-builder-snap-runtime.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: packaging ---- - -Snap packages now launch correctly with the desktop runtime scripts required by their generated startup command. diff --git a/.changes/playback-accurate-source-errors.md b/.changes/playback-accurate-source-errors.md deleted file mode 100644 index 5ed9b8a70..000000000 --- a/.changes/playback-accurate-source-errors.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: playback -issues: [1159] ---- - -Unavailable streams no longer appear as unsupported codecs. When Video.js exposes a server error such as HTTP 404, the player shows that status; otherwise ambiguous source errors remain unidentified instead of guessing. diff --git a/.changes/playback-advanced-subtitles.md b/.changes/playback-advanced-subtitles.md deleted file mode 100644 index e4f29890a..000000000 --- a/.changes/playback-advanced-subtitles.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: playback -issues: [1408] ---- - -The shared player controls' subtitle menu now loads external subtitle files -(.srt/.vtt in the built-in web players, plus .ass in Embedded MPV), adjusts the -subtitle timing offset in ±0.5 s steps, and sets the subtitle text size and -color — size/color persist across sessions and are shared between engines. diff --git a/.changes/playback-embedded-mpv-position-drift.md b/.changes/playback-embedded-mpv-position-drift.md deleted file mode 100644 index 6da47542f..000000000 --- a/.changes/playback-embedded-mpv-position-drift.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback -issues: [1428] ---- - -The embedded MPV video no longer drifts out of its frame when the layout -shifts around it — for example when the channel sidebar or the EPG panel -finishes loading after playback has started. The player now notices such -moves and snaps the video back into place within half a second. diff --git a/.changes/playback-external-launch-feedback.md b/.changes/playback-external-launch-feedback.md deleted file mode 100644 index fb8d5ec28..000000000 --- a/.changes/playback-external-launch-feedback.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -MPV and VLC recovery actions now stay available, show precise opening, started, playing, and failure feedback, and prevent overlapping launches. The dock keeps Stop available when teardown is still needed and lets terminal errors be dismissed. diff --git a/.changes/playback-keep-display-awake.md b/.changes/playback-keep-display-awake.md deleted file mode 100644 index 7372c3921..000000000 --- a/.changes/playback-keep-display-awake.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: playback -issues: [1095] ---- - -The screen no longer dims or goes to sleep while a built-in player is playing -video — including on Linux desktops, where the system idle timer used to -ignore the app. Pausing or stopping hands control back to the system -immediately, and radio playback deliberately leaves the display free to -sleep. Works in both the desktop app and the PWA. diff --git a/.changes/playback-keyboard-shortcuts-default-players.md b/.changes/playback-keyboard-shortcuts-default-players.md deleted file mode 100644 index e81531cee..000000000 --- a/.changes/playback-keyboard-shortcuts-default-players.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -Playback keyboard shortcuts now work with the default player setup: Space/K -(play/pause), F (fullscreen), ←/→ (seek 5s in VOD), ↑/↓ (volume), and M (mute) -act on the built-in HTML5, Video.js, and ArtPlayer players without turning on -shared player controls — matching what the in-app shortcut list already -promised. diff --git a/.changes/playback-live-player-switch.md b/.changes/playback-live-player-switch.md deleted file mode 100644 index 9012e77f7..000000000 --- a/.changes/playback-live-player-switch.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -Switching the video player — from the command palette or the settings page — -now takes effect immediately on an already-playing Xtream or Stalker stream -instead of waiting for the player to be reopened. Playback also starts with -the saved player right away, without briefly mounting the default engine -first. diff --git a/.changes/playback-mpegts-1-8-1.md b/.changes/playback-mpegts-1-8-1.md deleted file mode 100644 index 3768c9635..000000000 --- a/.changes/playback-mpegts-1-8-1.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -MPEG-TS playback is now more reliable on newer Safari versions when streams contain audio timestamp gaps. diff --git a/.changes/playback-mpv-header-comma-escape.md b/.changes/playback-mpv-header-comma-escape.md deleted file mode 100644 index ca79c7d6b..000000000 --- a/.changes/playback-mpv-header-comma-escape.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: playback -issues: [910] ---- - -External MPV and the embedded MPV frame-copy engine no longer truncate HTTP -headers that contain commas — most notably the Stalker MAG user agent. Strict -portals validated that header and rejected live streams with HTTP 400, so -channels that only worked in VLC now also play through MPV. Completes the same -fix that landed for the native embedded MPV view. diff --git a/.changes/playback-quality-selection.md b/.changes/playback-quality-selection.md deleted file mode 100644 index 3e62cf2ef..000000000 --- a/.changes/playback-quality-selection.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: playback ---- - -The built-in web players' shared controls gain a quality menu: multi-bitrate -HLS and DASH streams can be pinned to a specific rendition ("1080p", "720p", …) -or left on Auto, which keeps the player's adaptive selection. The menu appears -only when the stream actually offers more than one quality, and the choice -lasts for the current playback session. diff --git a/.changes/playback-recovery-recommendations.md b/.changes/playback-recovery-recommendations.md deleted file mode 100644 index 477529b25..000000000 --- a/.changes/playback-recovery-recommendations.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback -issues: [1159] ---- - -When playback fails, IPTVnator now ranks useful next steps from the reported -error, including another compatible built-in player, MPV/VLC, Retry, or another -source. Trying a built-in recommendation affects only the current item and -does not change the saved player setting. diff --git a/.changes/playback-runtime-guidance-fixes.md b/.changes/playback-runtime-guidance-fixes.md deleted file mode 100644 index 428250984..000000000 --- a/.changes/playback-runtime-guidance-fixes.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -Playback recovery now removes old error actions as soon as a new source or player starts, even while Electron prepares stream headers. Stalker series playing inline now picks up refreshed episode names and navigation, and safely disables episode commands if the playing episode disappears. diff --git a/.changes/playback-shaka-5-2-4.md b/.changes/playback-shaka-5-2-4.md deleted file mode 100644 index 1a5ea18e2..000000000 --- a/.changes/playback-shaka-5-2-4.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -DASH playback now resets a failed media buffer before switching variants, avoiding repeated append failures and crashes on affected platforms. diff --git a/.changes/playback-shared-controls-default-on.md b/.changes/playback-shared-controls-default-on.md deleted file mode 100644 index f86beabaa..000000000 --- a/.changes/playback-shared-controls-default-on.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: playback -issues: [1408] ---- - -The new player controls are now the default for the built-in web players — one -consistent bar with quality selection, external subtitles, subtitle delay and -styling, speed, and picture-in-picture. They are touch-friendly too: tapping -the video shows or hides the controls instead of pausing, and narrow players -get a two-row layout. Prefer the old look? Switch back in Settings > Playback. diff --git a/.changes/playback-shared-player-controls.md b/.changes/playback-shared-player-controls.md deleted file mode 100644 index d2f27b104..000000000 --- a/.changes/playback-shared-player-controls.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: playback ---- - -An optional new set of player controls that looks and behaves the same in the -HTML5, Video.js and ArtPlayer players, with picture-in-picture and, in -fullscreen, the name of what you are watching. Enable it in Settings → Playback; -left off, each of the three keeps its own controls exactly as before. diff --git a/.changes/playback-stable-session-ownership.md b/.changes/playback-stable-session-ownership.md deleted file mode 100644 index cc914c765..000000000 --- a/.changes/playback-stable-session-ownership.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playback -issues: [1159] ---- - -Playback recovery no longer crosses into a different selected channel, movie, -or exact Stalker episode. Switching content while a stream resolves no longer -restores stale playback or shows an error from the previous selection. diff --git a/.changes/playback-stalker-stream-credentials.md b/.changes/playback-stalker-stream-credentials.md deleted file mode 100644 index dc4bfde8e..000000000 --- a/.changes/playback-stalker-stream-credentials.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -type: fix -area: playback -issues: [849, 910, 732] ---- - -Stalker streams that require the portal session now play in the built-in -players (HTML5, Video.js, ArtPlayer), not only in VLC/MPV: the player's -requests carry the portal cookie and token, scoped to that stream and -dropped when the player closes or the channel changes. VOD, series and -radio get the same headers live TV had — also from Favorites and Recently -Viewed. diff --git a/.changes/playback-structured-hls-diagnostics.md b/.changes/playback-structured-hls-diagnostics.md deleted file mode 100644 index 3446f43fa..000000000 --- a/.changes/playback-structured-hls-diagnostics.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -HLS failures now use confirmed player evidence such as the failed stage, timeout, and HTTP status. Recoverable retries stay silent, and technical details no longer include raw provider error payloads. diff --git a/.changes/playback-structured-mpegts-diagnostics.md b/.changes/playback-structured-mpegts-diagnostics.md deleted file mode 100644 index 2b445d295..000000000 --- a/.changes/playback-structured-mpegts-diagnostics.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playback -issues: [1159] ---- - -MPEG-TS playback errors now show exact engine evidence, including HTTP status, -without exposing provider response details. Format, codec, truncated-stream, -and MediaSource failures now produce more accurate fallback guidance. diff --git a/.changes/playback-structured-shaka-diagnostics.md b/.changes/playback-structured-shaka-diagnostics.md deleted file mode 100644 index b6336b0f4..000000000 --- a/.changes/playback-structured-shaka-diagnostics.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -Shaka playback errors now use exact engine evidence, including subtitle parsing, preserve external-player fallback when browser prerequisites are missing, keep recoverable retries non-terminal, and omit provider URLs, credentials, and response data from technical details. diff --git a/.changes/playback-structured-videojs-diagnostics.md b/.changes/playback-structured-videojs-diagnostics.md deleted file mode 100644 index e8370df30..000000000 --- a/.changes/playback-structured-videojs-diagnostics.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playback ---- - -The default web player now reports safer, more accurate streaming errors: -confirmed network and encrypted-segment failures keep structured details, -while ambiguous Video.js errors remain unknown instead of suggesting the -wrong cause. diff --git a/.changes/playback-subtitle-preference.md b/.changes/playback-subtitle-preference.md deleted file mode 100644 index 8c320a9d1..000000000 --- a/.changes/playback-subtitle-preference.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: playback -issues: [1155] ---- - -The "Show subtitles" setting now works in the built-in players: turning it off -hides subtitles a stream switched on by itself, and the preference finally -applies on Xtream and Stalker pages too. Previously it only reached the M3U -player, and even there Video.js and ArtPlayer ignored it. The player's own -subtitle menu still overrides the setting for the current stream. diff --git a/.changes/playback-theater-stage.md b/.changes/playback-theater-stage.md deleted file mode 100644 index b8f67a5c4..000000000 --- a/.changes/playback-theater-stage.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: playback ---- - -The inline player on movie and series pages fills the whole content area like a -theater: the video sits centered in black instead of leaving a strip of app -background beside it. In the built-in web players, an optional ambient mode -fills that space with a blurred, dimmed copy of the poster. diff --git a/.changes/playback-up-next-rail.md b/.changes/playback-up-next-rail.md deleted file mode 100644 index 13738a792..000000000 --- a/.changes/playback-up-next-rail.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: playback ---- - -A series playing inline on a wide window shows an "Up Next" rail beside the -video: the rest of the season and the start of the next one, the current episode -highlighted, watch progress on every card. Click one to jump straight to it. -Built-in web players only; switch the rail off in Settings → Playback. diff --git a/.changes/playback-vjs-live-controls.md b/.changes/playback-vjs-live-controls.md deleted file mode 100644 index 3a4ef07e0..000000000 --- a/.changes/playback-vjs-live-controls.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playback ---- - -Video.js now shows its own control bar (play/pause, seek, volume, quality, -fullscreen) on Live TV channels. Previously live streams played with no visible -controls at all, because switching to a live source rebuilt the video element -and the controls never came back. diff --git a/.changes/playlist-auto-detect-import.md b/.changes/playlist-auto-detect-import.md deleted file mode 100644 index da8dbf145..000000000 --- a/.changes/playlist-auto-detect-import.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: playlist ---- - -The Add playlist dialog has a new "Auto-detect" method: paste whatever your -provider sent you — links, Xtream credentials, a MAC address with device IDs — -and IPTVnator recognizes the source type and fills the matching import form -for you to review. Detection runs entirely inside the app; nothing you paste -is sent anywhere. diff --git a/.changes/playlist-m3u-movie-details.md b/.changes/playlist-m3u-movie-details.md deleted file mode 100644 index da459361f..000000000 --- a/.changes/playlist-m3u-movie-details.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: playlist ---- - -M3U entries that are movie files now open in the same movie detail view the -portals use: playback starts immediately with plot, cast, rating and artwork -from TMDB below the player instead of the empty program guide, and closing the -player reveals the full poster page. Requires TMDB metadata to be enabled; a -toggle in Settings → Metadata (TMDB) turns recognition off. diff --git a/.changes/playlist-open-from-file-association.md b/.changes/playlist-open-from-file-association.md deleted file mode 100644 index 412344500..000000000 --- a/.changes/playlist-open-from-file-association.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playlist ---- - -Opening an .m3u/.m3u8 file from the command line or by double-clicking it now -actually imports the playlist — previously nothing happened at all. Opening a -playlist while IPTVnator is already running works too, and on macOS the file -arrives through the system "open with" event. diff --git a/.changes/playlist-register-m3u-file-type.md b/.changes/playlist-register-m3u-file-type.md deleted file mode 100644 index 6eae6beee..000000000 --- a/.changes/playlist-register-m3u-file-type.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playlist ---- - -IPTVnator now registers itself with the operating system as a handler for .m3u -and .m3u8 files, so Finder, Explorer and Linux file managers offer it in "Open -with" and a double-click actually opens the playlist. Installing or updating the -app is enough — no manual file-type setup. diff --git a/.changes/playlists-auto-refresh.md b/.changes/playlists-auto-refresh.md deleted file mode 100644 index 2104099f2..000000000 --- a/.changes/playlists-auto-refresh.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playlists -issues: [931] ---- - -One unreachable playlist no longer holds up the rest. Refreshes give up after 30 -seconds and run a few at a time, so your other playlists still update, and the -message on startup names how many actually failed instead of always claiming -success. diff --git a/.changes/portals-atomic-fresh-import-pins.md b/.changes/portals-atomic-fresh-import-pins.md deleted file mode 100644 index 9ba031ca1..000000000 --- a/.changes/portals-atomic-fresh-import-pins.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: portals ---- - -Importing an Xtream backup now restores all preferred VOD sources together. If -restoration or cleanup fails, the catalog stays retryable and remains blocked -until the parked state is safely consumed, preventing stale replay from -overwriting newer choices. diff --git a/.changes/portals-clickable-metadata-discover.md b/.changes/portals-clickable-metadata-discover.md deleted file mode 100644 index 12527db7f..000000000 --- a/.changes/portals-clickable-metadata-discover.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: portals -issues: [1449] ---- - -Year, genre, and country on movie and series detail pages are now clickable -(with TMDB metadata enabled): each chip opens a Discover page of popular -titles for that facet, marked with what's already in your library — matches -jump straight to their detail page, the rest open the portal search. Works -in Xtream and Stalker, like the existing actor and director chips. diff --git a/.changes/portals-collection-view-in-portal.md b/.changes/portals-collection-view-in-portal.md deleted file mode 100644 index 1bd7ea5d7..000000000 --- a/.changes/portals-collection-view-in-portal.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: portals ---- - -Movie and series details opened from the dashboard, global favorites, history, -or a portal's favorites/recent tabs now offer a "View in portal" button below -the main actions. It jumps straight to the title inside its own portal, with -the matching category selected in the sidebar. diff --git a/.changes/portals-compact-request-error-logs.md b/.changes/portals-compact-request-error-logs.md deleted file mode 100644 index b4d5a2294..000000000 --- a/.changes/portals-compact-request-error-logs.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: internal -area: portals ---- - -Failed Stalker portal requests now log a compact, credential-free summary -(action, host, error code, HTTP status) in the desktop backend instead of -dumping the full multi-page network error object, matching the existing -Xtream request logging. diff --git a/.changes/portals-dead-host-fast-fail.md b/.changes/portals-dead-host-fast-fail.md deleted file mode 100644 index b2afcf095..000000000 --- a/.changes/portals-dead-host-fast-fail.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: perf -area: portals ---- - -Unreachable Xtream and Stalker portals no longer cost a 30-second wait per -request. After a host fails to answer twice, further requests to it fail -immediately for 30 seconds, so browsing a dead portal stops filling the screen -with long spinners. Retrying, testing the connection, or editing the portal -address contacts it again right away. diff --git a/.changes/portals-greek-sigma-matching.md b/.changes/portals-greek-sigma-matching.md deleted file mode 100644 index e61fa18c9..000000000 --- a/.changes/portals-greek-sigma-matching.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: portals ---- - -Greek titles now match no matter which sigma the provider typed. A word-final -`ς` and a medial `σ` at the end of a word are treated as the same letter, so -finding a film in your other playlists, the "Similar" rail, actor filmographies -and TMDB enrichment no longer miss a Greek movie purely because two catalogues -spelled its last letter differently. diff --git a/.changes/portals-pwa-request-timeouts.md b/.changes/portals-pwa-request-timeouts.md deleted file mode 100644 index c1e69e22b..000000000 --- a/.changes/portals-pwa-request-timeouts.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: portals ---- - -In the self-hosted web version, a provider that accepted a connection and then -went silent could hang a request until the operating system gave up, with no -way to cancel it. Requests now time out on the same schedule as the desktop app, -and a host that fails to answer twice is skipped for a short while instead of -stalling every following request. diff --git a/.changes/portals-season-auto-select.md b/.changes/portals-season-auto-select.md deleted file mode 100644 index 8fe40b3ce..000000000 --- a/.changes/portals-season-auto-select.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: portals -issues: [1441] ---- - -Opening a series now lands on the season you'd actually continue: the -earliest season with unwatched episodes, or the latest season once -everything is watched — instead of always starting at season 1. diff --git a/.changes/portals-season-watched-toggle.md b/.changes/portals-season-watched-toggle.md deleted file mode 100644 index 5bdbe6387..000000000 --- a/.changes/portals-season-watched-toggle.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: portals -issues: [1442] ---- - -Series detail pages can now mark a whole season as watched (or unwatched) in -one click — the new button next to "Download season" works for both Xtream and -Stalker portals. Handy when you start a show mid-way: mark the earlier seasons -watched and the Play button jumps straight to your next unwatched episode. diff --git a/.changes/portals-series-watched-toggle.md b/.changes/portals-series-watched-toggle.md deleted file mode 100644 index acefce7fd..000000000 --- a/.changes/portals-series-watched-toggle.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: portals -issues: [1442] ---- - -The series pages' season header now has a ⋮ menu that marks the WHOLE series -as watched (or unwatched) in one click, for both Xtream and Stalker portals. -On Ministra portals that load seasons lazily, the app first fetches the -remaining seasons and then marks everything — so catching up on a show you -started mid-way is a single action. diff --git a/.changes/portals-view-in-portal-back.md b/.changes/portals-view-in-portal-back.md deleted file mode 100644 index e44ee31d0..000000000 --- a/.changes/portals-view-in-portal-back.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: fix -area: portals ---- - -Going back from a Stalker title you reached with "View in portal" now returns -you to exactly where you were — the same favorites or history tab, with the -title still open — instead of dropping you on the Live TV tab. diff --git a/.changes/portals-vod-multi-source.md b/.changes/portals-vod-multi-source.md deleted file mode 100644 index ffc37abdc..000000000 --- a/.changes/portals-vod-multi-source.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: portals ---- - -Movies that exist in several of your playlists now show a "Sources" chip on the -detail page. Switch playlist mid-film and playback continues from the same -timecode, pin a preferred source per movie, and when a stream dies the error -screen offers the alternatives instead of a dead end. Optional auto-switching is -off by default. diff --git a/.changes/portals-vod-sources-popup.md b/.changes/portals-vod-sources-popup.md deleted file mode 100644 index dba9956e3..000000000 --- a/.changes/portals-vod-sources-popup.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: portals ---- - -The movie page's Sources popup now always fits on screen — only the source list scrolls, and it flips below the button in short windows — and gains All / Available / HD+ / language filters ("Available" checks every source on first use). Expanded copies show the stream title with only what differs, availability results are remembered, and Favorites/Download became icon buttons with live progress. diff --git a/.changes/portals-xtream-refresh-race.md b/.changes/portals-xtream-refresh-race.md deleted file mode 100644 index 96627bd76..000000000 --- a/.changes/portals-xtream-refresh-race.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: portals ---- - -Refreshing an Xtream source keeps your favorites, watch history, hidden -categories and playback positions. Starting the same refresh twice at once — -from the header and from the sources page — used to wipe them, because the -second run saved an already-emptied catalog over the first run's copy. diff --git a/.changes/pwa-ipv6-ipv4-fallback.md b/.changes/pwa-ipv6-ipv4-fallback.md deleted file mode 100644 index 70af96192..000000000 --- a/.changes/pwa-ipv6-ipv4-fallback.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: pwa -issues: [1400] ---- - -The self-hosted web backend now gives each provider connection attempt enough -time to fall back from an unreachable IPv6 route to working IPv4 — common -behind VPN containers like Gluetun — instead of failing with a bare -"Bad Gateway". Provider errors now name the underlying network code (for -example ETIMEDOUT) in the app and in the container logs. diff --git a/.changes/pwa-self-hosted-cors-default.md b/.changes/pwa-self-hosted-cors-default.md deleted file mode 100644 index 48280a8ec..000000000 --- a/.changes/pwa-self-hosted-cors-default.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: pwa ---- - -Self-hosted web backends started without `CLIENT_URL` now allow the documented -`http://localhost:4333` origin instead of the retired public demo URL, so a -manual (non-Docker) deployment no longer fails every provider request with a -CORS error. diff --git a/.changes/pwa-stalker-transport-parity.md b/.changes/pwa-stalker-transport-parity.md deleted file mode 100644 index db031f76b..000000000 --- a/.changes/pwa-stalker-transport-parity.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: pwa ---- - -The self-hosted web app now talks to Stalker portals exactly like the desktop -app: MAG User-Agent, full STB cookie, serial-number header, and the -`JsHttpRequest` marker every real client sends — so portals that worked only in -the desktop app now work in the PWA too. Portal credentials (MAC and session -token) no longer travel in the portal request URL, keeping them out of server -logs. diff --git a/.changes/remote-control-live-collections.md b/.changes/remote-control-live-collections.md deleted file mode 100644 index 4c41c1946..000000000 --- a/.changes/remote-control-live-collections.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: remote-control ---- - -The mobile remote now works in live TV favorites and recently viewed — per-portal and global — for M3U, Xtream and Stalker: channel switching, number select, and now-playing status follow the on-screen list. The remote no longer shows a channel as playing after leaving the player, Stalker radio reports its status, and volume buttons grey out when an external player owns the audio. diff --git a/.changes/search-keeps-typing-during-navigation.md b/.changes/search-keeps-typing-during-navigation.md deleted file mode 100644 index 00fa9dc8a..000000000 --- a/.changes/search-keeps-typing-during-navigation.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: search ---- - -The search box no longer loses what you are typing when the page updates its -address at the same moment — switching a downloads filter and immediately -typing used to wipe the term, and fast typing could snap back to an earlier -word. diff --git a/.changes/search-punctuation-words.md b/.changes/search-punctuation-words.md deleted file mode 100644 index b33302a09..000000000 --- a/.changes/search-punctuation-words.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: search -issues: [1161] ---- - -Searching for names that carry punctuation inside them — "A&E", "X-Men", -"L'Equipe" — finds them anywhere in a title, including channels the provider -prefixes, like "US: A&E". diff --git a/.changes/search-trailing-space-typing.md b/.changes/search-trailing-space-typing.md deleted file mode 100644 index 005d8d24a..000000000 --- a/.changes/search-trailing-space-typing.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: search -issues: [1338] ---- - -Typing a space in the portal search box and pausing briefly no longer deletes -the space — continuing to type "Bein Sports" no longer collapses into -"BeinSports". diff --git a/.changes/settings-persistence-feedback.md b/.changes/settings-persistence-feedback.md deleted file mode 100644 index 896e3ee77..000000000 --- a/.changes/settings-persistence-feedback.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: settings -issues: [1156, 102] ---- - -Launching IPTVnator a second time now brings the running window to the front -instead of starting a rival copy that could not save anything — a common reason -settings appeared to reset on restart. If saving or loading settings does fail, -the app now says so instead of silently showing defaults. diff --git a/.changes/settings-section-pages.md b/.changes/settings-section-pages.md deleted file mode 100644 index c63e6f9b4..000000000 --- a/.changes/settings-section-pages.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: settings ---- - -Settings sections are now separate pages with shareable URLs and a floating Save/Discard bar that appears only when you have unsaved changes; leaving settings with pending edits asks whether to save, discard, or keep editing. The EPG panel's "Open EPG settings" button now jumps straight to the EPG settings page. diff --git a/.changes/settings-strip-country-prefix.md b/.changes/settings-strip-country-prefix.md deleted file mode 100644 index bc8980306..000000000 --- a/.changes/settings-strip-country-prefix.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: settings ---- - -A new setting drops the country prefix from live channel names, turning -"UK - BBC One" into "BBC One" in lists, the guide and the player. Movie and -series titles are left alone, and names that only look like a prefix — "Sky - -Sports F1" — stay intact. diff --git a/.changes/settings-unsaved-close-protection.md b/.changes/settings-unsaved-close-protection.md deleted file mode 100644 index 37f62e770..000000000 --- a/.changes/settings-unsaved-close-protection.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: settings ---- - -Unsaved settings edits no longer vanish silently when you close the window, -quit the app, or reload the page. The desktop app now asks whether to save, -discard, or keep editing — the same dialog in-app navigation shows — and only -closes once your choice is applied; a failed save keeps the window open. In the -browser, the native leave-page warning appears instead. diff --git a/.changes/stalker-account-info-dialog.md b/.changes/stalker-account-info-dialog.md deleted file mode 100644 index 17fdbffb4..000000000 --- a/.changes/stalker-account-info-dialog.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: stalker ---- - -Stalker portals now have an Account info dialog — subscription status, -tariff plan, expiry date with a days-left counter, login, and portal -details. Open it from the header playlist menu, the dashboard source card, -or the command palette, same as for Xtream. If the portal is unreachable, -the data saved when the portal was added is shown instead. diff --git a/.changes/stalker-auth-failure-detection.md b/.changes/stalker-auth-failure-detection.md deleted file mode 100644 index 84097a3d7..000000000 --- a/.changes/stalker-auth-failure-detection.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: fix -area: stalker ---- - -A Stalker portal is no longer re-probed and reclassified because something -in front of it — a proxy or firewall, not the portal — answered with a short -"Access denied" page. Only the portal's own authorization replies count now. diff --git a/.changes/stalker-auth-lifecycle.md b/.changes/stalker-auth-lifecycle.md deleted file mode 100644 index 3b62dc566..000000000 --- a/.changes/stalker-auth-lifecycle.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: stalker ---- - -Stalker portals that ask for a login and password now work: the import dialog -gained username/password fields and the app completes the portal's do_auth -step. When a portal refuses access, its own explanation is shown instead of a -generic error, saved sessions resume without re-authenticating, and the -keep-alive ping follows the portal's cadence. diff --git a/.changes/stalker-cmd-encoding.md b/.changes/stalker-cmd-encoding.md deleted file mode 100644 index d265b0b0f..000000000 --- a/.changes/stalker-cmd-encoding.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: stalker ---- - -Stalker portals now receive channel commands exactly as a real set-top box -sends them: already-encoded parts of a channel's `cmd` are no longer -double-encoded, so strict portals and reseller panels that compare the command -literally work again. Playing Stalker channels from Favorites or global -collections now also handles portals that answer with relative stream paths. diff --git a/.changes/stalker-detail-requests.md b/.changes/stalker-detail-requests.md deleted file mode 100644 index f8651f05d..000000000 --- a/.changes/stalker-detail-requests.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: perf -area: stalker ---- - -Detail pages for anything that is not a series — a movie, a live channel, a VOD -item that only looks like a series — no longer fire an episode-list request -before they can show anything, so they open faster on every route in, from -browsing and search to Favorites, Recent and the dashboard. diff --git a/.changes/stalker-embedded-series-episodes.md b/.changes/stalker-embedded-series-episodes.md deleted file mode 100644 index f808d4cbf..000000000 --- a/.changes/stalker-embedded-series-episodes.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: stalker ---- - -Series opened from Favorites, Recent or the dashboard show their current -episodes. One saved back when a single episode existed used to keep showing that -one episode forever; the list is refreshed from the portal in the background -instead. diff --git a/.changes/stalker-endpoint-discovery.md b/.changes/stalker-endpoint-discovery.md deleted file mode 100644 index ed93eb173..000000000 --- a/.changes/stalker-endpoint-discovery.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: stalker -issues: [850, 686, 755] ---- - -Stalker portals are no longer classified by their URL shape: importing probes -the real API endpoint (`portal.php` vs `server/load.php`) and checks whether -the portal actually requires authentication. Canonical Ministra URLs finally -load content, `…/c` addresses resolve correctly, and misclassified existing -portals repair themselves on first failure — keeping favorites and history. diff --git a/.changes/stalker-identity-hardening.md b/.changes/stalker-identity-hardening.md deleted file mode 100644 index 2d7e16ee8..000000000 --- a/.changes/stalker-identity-hardening.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: stalker -issues: [927, 860] ---- - -Stalker portals now check the MAC address as you type it and fix hyphens or -lowercase for you, with a warning when it sits outside the range most portals -accept. Device IDs can optionally be generated from the MAC the way StbEmu does, -and a portal that already has a different device ID on file finally says so -instead of reporting damaged hardware. diff --git a/.changes/stalker-infinite-scroll-catalog.md b/.changes/stalker-infinite-scroll-catalog.md deleted file mode 100644 index 738003614..000000000 --- a/.changes/stalker-infinite-scroll-catalog.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: stalker ---- - -Stalker movie and series catalogs now load continuously as you scroll — -portal pages append into one seamless list, tall windows fill themselves, and -a failed page keeps what's loaded and offers a retry. The Live TV "all -channels" grid and portal search follow the same style, and search can page -past its first hundred results. Pagination is gone from the app entirely. diff --git a/.changes/stalker-itv-epg-current-program.md b/.changes/stalker-itv-epg-current-program.md deleted file mode 100644 index ae1349cf9..000000000 --- a/.changes/stalker-itv-epg-current-program.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: stalker ---- - -Stalker Live TV now shows the currently airing programme even on portals whose -bulk EPG only lists upcoming shows: channel rows fall back to a per-channel -short-EPG lookup, and the EPG panel merges "what's on now" into the schedule -instead of showing future programmes only. diff --git a/.changes/stalker-live-tv-channel-list.md b/.changes/stalker-live-tv-channel-list.md deleted file mode 100644 index d93bfe8c4..000000000 --- a/.changes/stalker-live-tv-channel-list.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: stalker ---- - -The Live TV section loads its full channel list up front: search covers every -channel instead of only the page you are on, genres show how many channels they -hold, and Live TV opens on a grid of all channels. Guide data for the visible -rows loads in bulk, so it shows up without playing a channel first. diff --git a/.changes/stalker-mpv-header-comma-escape.md b/.changes/stalker-mpv-header-comma-escape.md deleted file mode 100644 index e6612cd18..000000000 --- a/.changes/stalker-mpv-header-comma-escape.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -Stalker live TV plays again in the embedded MPV player. The MAG250 user agent -contains a comma (`KHTML, like Gecko`), which MPV splits in its comma-separated -`--http-header-fields` list, truncating `X-User-Agent` so strict portals reject -the stream with HTTP 400. Commas and backslashes in header values are now -escaped on the Windows/Linux and macOS embedded-MPV paths. diff --git a/.changes/stalker-same-host-redirect-auth.md b/.changes/stalker-same-host-redirect-auth.md deleted file mode 100644 index f9a04444f..000000000 --- a/.changes/stalker-same-host-redirect-auth.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: stalker -issues: [1158] ---- - -Stalker portals whose server redirects to https or to another port no longer -lose their session mid-request. Since 0.22 such redirects silently dropped the -portal's MAC cookie and auth token, so categories failed to load and streams -never reached any player. Downgrade redirects from https to plain http still -strip credentials, so a secure session is never sent in cleartext. diff --git a/.changes/stalker-series-position-identity.md b/.changes/stalker-series-position-identity.md deleted file mode 100644 index b2fb0624f..000000000 --- a/.changes/stalker-series-position-identity.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: stalker ---- - -Stalker VOD series now report progress correctly when portals return boolean series flags, keep episode progress separate between shows, and resume positions saved by earlier versions. diff --git a/.changes/stalker-smart-discovery.md b/.changes/stalker-smart-discovery.md deleted file mode 100644 index 356e131eb..000000000 --- a/.changes/stalker-smart-discovery.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: stalker ---- - -Stalker setup now accepts hosts or `/c`, discovers the working API endpoint and -authentication mode, and rechecks edited connection details. Canceled or failed -edits leave saved and active sessions unchanged. Completed edits reject old -configuration requests and late responses. Timed-out authentication stays -fenced until its transport settles. diff --git a/.changes/stalker-static-channel-links.md b/.changes/stalker-static-channel-links.md deleted file mode 100644 index 7b38e1328..000000000 --- a/.changes/stalker-static-channel-links.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: stalker ---- - -Stalker channels that the portal serves directly now start without an extra -link request to the portal, so they open faster and no longer fail when that -request does. Channels the portal does proxy still get their temporary link, -and radio stations the portal proxies now get one too instead of playing a URL -the portal never meant to serve. diff --git a/.changes/tmdb-broken-provider-id.md b/.changes/tmdb-broken-provider-id.md deleted file mode 100644 index cbc5b6cf4..000000000 --- a/.changes/tmdb-broken-provider-id.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: tmdb ---- - -Movies whose provider ships a dead or wrong TMDB id are enriched again. The -id is weighed against the title and release year: a dead one falls back to -the title search, a stale one that clearly points at another film loses to -it, and a working id is no longer thrown away just because the provider -spells the title differently. diff --git a/.changes/tmdb-cache-panel.md b/.changes/tmdb-cache-panel.md deleted file mode 100644 index 0156ea055..000000000 --- a/.changes/tmdb-cache-panel.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: feature -area: tmdb ---- - -Settings → Metadata (TMDB) now shows how many entries the metadata cache -holds and how much space they take, with a button to empty it. Clearing -costs nothing but the next few lookups — enrichment refetches on demand. diff --git a/.changes/tmdb-detail-page-extras.md b/.changes/tmdb-detail-page-extras.md deleted file mode 100644 index 8b57a6181..000000000 --- a/.changes/tmdb-detail-page-extras.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: tmdb ---- - -Series pages show whether a show has ended or is still returning, so you know -before committing to it. Directors and creators became clickable avatar chips -like the cast — they open the person's page, where directing credits now sit -alongside acting ones. diff --git a/.changes/tmdb-series-cast.md b/.changes/tmdb-series-cast.md deleted file mode 100644 index 037ad2f8a..000000000 --- a/.changes/tmdb-series-cast.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: tmdb ---- - -Series detail pages now list the cast of the whole show instead of only its -newest season, so actors who left partway through stop disappearing from -long-running shows — while people who joined for the current season still -show up. diff --git a/.changes/tmdb-title-matching.md b/.changes/tmdb-title-matching.md deleted file mode 100644 index 025cb790a..000000000 --- a/.changes/tmdb-title-matching.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: tmdb ---- - -Titles that providers dress up with language or quality tags — "|ALB| Fallout", -"4K-DE - The Pitt (2025)", "Breaking Bad-eng" — now match against TMDB, so they -get artwork, plot and cast like the rest of the catalog. Shows split into one -entry per season also pull the season that entry really contains. diff --git a/.changes/ui-live-row-vertical-actions.md b/.changes/ui-live-row-vertical-actions.md deleted file mode 100644 index 763b73c07..000000000 --- a/.changes/ui-live-row-vertical-actions.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: ui -issues: [1128] ---- - -Live channel rows now stack their action buttons vertically — favorite on -top, programme info below — so the extra button costs no horizontal space. -The programme-info button is now also available in the Xtream and Stalker -channel sidebars, and its slot stays reserved while EPG data loads, so -buttons never jump. diff --git a/.changes/ui-mobile-layout.md b/.changes/ui-mobile-layout.md deleted file mode 100644 index a6ae38203..000000000 --- a/.changes/ui-mobile-layout.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: ui -issues: [1100] ---- - -IPTVnator is usable on a phone again. The navigation bar no longer sits off -screen, category and channel lists take the full width instead of squeezing -the content into a sliver, the video keeps a usable share of the screen, and -the M3U channel list can be reopened after hiding it. diff --git a/.changes/ui-narrow-channel-epg.md b/.changes/ui-narrow-channel-epg.md deleted file mode 100644 index 52e05c173..000000000 --- a/.changes/ui-narrow-channel-epg.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: ui ---- - -Narrow EPG channel rows now keep the current programme, progress, and enabled -channel actions visible instead of dropping useful context. diff --git a/.changes/ui-phone-context-drawer.md b/.changes/ui-phone-context-drawer.md deleted file mode 100644 index 24fb14fac..000000000 --- a/.changes/ui-phone-context-drawer.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: ui -issues: [1100] ---- - -On phone-sized screens the categories and filters panel no longer sits stacked -above the content — it is now a slide-in drawer, opened from a new button in -the header and closed by picking an entry, tapping outside it, or pressing -Escape. The content gets the whole screen while browsing. diff --git a/.changes/window-controls-fullscreen-exit.md b/.changes/window-controls-fullscreen-exit.md deleted file mode 100644 index 65607da9b..000000000 --- a/.changes/window-controls-fullscreen-exit.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: window-controls ---- - -On Windows, the minimize, maximize and close buttons disappeared for good after -leaving fullscreen video playback — the only way to get them back was to restart -the app. They now reappear as soon as you exit fullscreen, and the maximize -button no longer gets stuck on the wrong icon afterwards. diff --git a/.changes/workspace-playlist-info-menu-item.md b/.changes/workspace-playlist-info-menu-item.md deleted file mode 100644 index 2a67ed63d..000000000 --- a/.changes/workspace-playlist-info-menu-item.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -type: fix -area: workspace ---- - -The playlist dropdown in the header shows a "Playlist info" entry for the -active playlist again, next to "Account info" and "Add playlist" — it had -disappeared when playlist actions moved into the per-row menu. diff --git a/.changes/workspace-sync-overlay-local-phase.md b/.changes/workspace-sync-overlay-local-phase.md deleted file mode 100644 index 477c56a2d..000000000 --- a/.changes/workspace-sync-overlay-local-phase.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: workspace ---- - -The playlist sync overlay no longer shows a bare "Syncing playlist" card when -an Xtream playlist is loaded from the local library. Reading the saved catalog -from this device now reports its own phase, so the overlay always shows a -source badge and explains what is happening — remote fetch or local read. diff --git a/.changes/xtream-catchup-collections.md b/.changes/xtream-catchup-collections.md deleted file mode 100644 index b8aa5dda6..000000000 --- a/.changes/xtream-catchup-collections.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: xtream -issues: [1138] ---- - -Catch-up is available from Favorites and Recent, not just Live TV, so an -archived programme is reachable wherever the channel is. The programme currently -on air can also be restarted from the beginning. diff --git a/.changes/xtream-catchup-indicator.md b/.changes/xtream-catchup-indicator.md deleted file mode 100644 index 47461d763..000000000 --- a/.changes/xtream-catchup-indicator.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: xtream -issues: [1128] ---- - -Live channels with provider catch-up now show a small archive badge — in the -channel sidebar next to the channel name, on the "all channels" grid cards, -and in the favorites and recently-viewed lists (including global favorites). -Hovering it shows the catch-up window in days. diff --git a/.changes/xtream-infinite-scroll-catalog.md b/.changes/xtream-infinite-scroll-catalog.md deleted file mode 100644 index 2d99ebc2c..000000000 --- a/.changes/xtream-infinite-scroll-catalog.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: xtream ---- - -Xtream movie, series, and live catalogs now load continuously as you scroll -instead of flipping through pages — more items appear automatically as you near -the bottom, and taller windows fill themselves on open. Opening a title and -going back returns you to the exact spot in the list. In-category search and -the in-portal search results follow the same continuous style. diff --git a/.changes/xtream-portal-connection.md b/.changes/xtream-portal-connection.md deleted file mode 100644 index 6d680359d..000000000 --- a/.changes/xtream-portal-connection.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: xtream ---- - -Portals sitting behind Cloudflare or a similar firewall connect again. Those -setups answered the app with a challenge page instead of data, so "Test -connection" failed on portals that worked fine in every other player; requests -now identify themselves the way an ordinary IPTV player does. diff --git a/.changes/xtream-season-description-url.md b/.changes/xtream-season-description-url.md deleted file mode 100644 index 51db2d589..000000000 --- a/.changes/xtream-season-description-url.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: xtream ---- - -Series pages no longer show a raw image link under the season tabs when the -provider fills the season description with a cover URL. URL-only descriptions -are dropped, and with TMDB metadata enabled the missing season description is -filled from TMDB instead. diff --git a/.changes/xtream-series-resume.md b/.changes/xtream-series-resume.md deleted file mode 100644 index 8f4b89b8a..000000000 --- a/.changes/xtream-series-resume.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: xtream ---- - -Continue Watching resumes a series where you left it: opening one from the -dashboard starts the exact episode at its saved position, and the series page -offers "Play episode N" instead of always starting at the first one. Episodes -launched in MPV or VLC count towards this too. diff --git a/.changes/xtream-sparse-vod-playback.md b/.changes/xtream-sparse-vod-playback.md deleted file mode 100644 index dd9239630..000000000 --- a/.changes/xtream-sparse-vod-playback.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: xtream ---- - -Xtream movies remain playable when a portal omits extended VOD metadata, -using catalog stream details to build the playback URL. diff --git a/.changes/xtream-vod-source-language-detection.md b/.changes/xtream-vod-source-language-detection.md deleted file mode 100644 index 42850cb27..000000000 --- a/.changes/xtream-vod-source-language-detection.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: xtream ---- - -The movie sources popover now recognizes more language tags: prefixes with -Unicode pipes, brackets or dashes ("EN │ …", "[EN] …", "EN - …"), Cyrillic -tags ("РУС | …") and MULTI. It also reads the language off category names -("EN | Netflix"), and a tag welded to a title ("EN|Movie") no longer hides -that copy from the other playlists' copies of the same movie. diff --git a/CHANGELOG.md b/CHANGELOG.md index 854fbf7e0..0aceeb659 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,157 @@ this marker — see `.changes/README.md`. +# [0.23.0](https://github.com/4gray/iptvnator/compare/v0.22.0...v0.23.0) (2026-08-30) + +### Features + +- **dashboard** — Continue Watching cards on the dashboard now open the detail page on click, just like movie cards — no more accidental episode playback. Resuming the saved episode moved to a new ⋮ menu on each card, next to "Mark as Watched" and "Remove from history". ([#1469](https://github.com/4gray/iptvnator/pull/1469), closes [#1441](https://github.com/4gray/iptvnator/issues/1441)) +- **dashboard** — Dashboard source cards now warn when a portal subscription is about to lapse: an amber "Expires in N d" chip appears within a week of the expiry date, and an "Expired" chip once it has passed. Xtream expirations come from the same cached status check the playlist switcher uses; Stalker portals reuse the account info saved at import. ([#1342](https://github.com/4gray/iptvnator/pull/1342)) +- **dashboard** — The dashboard gains a "Because you watched" rail: TMDB recommendations seeded from your recently watched movies and series, showing only titles that actually exist in your imported libraries. It appears once at least five matches are found, can be turned off under Settings → Dashboard, and requires the TMDB metadata opt-in (desktop app only). ([#1419](https://github.com/4gray/iptvnator/pull/1419)) +- **deps** — Linux desktops with client-side decoration support now show native rounded corners on the IPTVnator window. Desktop builds now run on Electron 43. ([#1414](https://github.com/4gray/iptvnator/pull/1414)) +- **downloads** — The download manager got a visual cleanup: "Ready to watch" cards are compact poster cards — file actions live in the poster's ⋮ menu, and clicking any card (episodes included) opens its offline detail. Queue rows show one primary action (pause/resume/retry) with cancel and remove in the menu, and all sections share one heading style with item counts. ([#1448](https://github.com/4gray/iptvnator/pull/1448)) +- **downloads** — Live-TV recordings made with the Embedded MPV player now live in the download manager: an in-progress row with elapsed time and Stop, a Recordings library with channel logos and the programs captured from the EPG at recording time, a focused detail page, and Needs attention when a file goes missing. Recordings interrupted by a crash survive as playable partials. ([#1452](https://github.com/4gray/iptvnator/pull/1452)) +- **downloads** — Downloads now separate active transfers from a grouped offline library, move missing files to Needs attention with Download again, and open movies and series in focused offline details with saved metadata. Series show only local episodes; View in portal returns to provider playback when the source can be recovered. Completed-file checks stay responsive on slow or unavailable storage. ([#1313](https://github.com/4gray/iptvnator/pull/1313)) +- **downloads** — Downloads can be paused and picked up later. A paused transfer keeps what it already fetched and continues from that point instead of starting over, and downloads cut short by a crash or a closed app come back as paused rather than lost. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **downloads** — Series downloads now let you queue several episodes in a row or add every available episode from the selected season. Already queued, paused, or downloaded episodes are skipped without duplicates, and the app reports the batch result. ([#1357](https://github.com/4gray/iptvnator/pull/1357)) +- **embedded-mpv** — Experimental Embedded MPV can draw video inside the app window instead of into a separate layer pinned on top of it, so menus, dialogs and the player controls stop being swallowed by the picture. Available on macOS (Apple Silicon), Windows and Linux x64; switching it on needs a restart. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **epg** — Channels whose guide never matched can be mapped by hand: right-click a channel in any list and pick "Map EPG channel" to attach it to a channel from your uploaded XMLTV guide. The mapping is remembered and used everywhere the guide is read — M3U playlists, Xtream and Stalker portals alike. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **i18n** — IPTVnator speaks Hungarian, its 19th language — contributed by @htibcsike. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1192](https://github.com/4gray/iptvnator/issues/1192)) +- **m3u** — MPEG-DASH channels play in the built-in player, ClearKey-encrypted ones included — the keys are read from the playlist's #KODIPROP lines, whether they sit above or below the channel entry. Streams locked with Widevine or PlayReady still cannot be played, but they now say so instead of failing silently. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#86](https://github.com/4gray/iptvnator/issues/86), closes [#614](https://github.com/4gray/iptvnator/issues/614), closes [#656](https://github.com/4gray/iptvnator/issues/656), closes [#733](https://github.com/4gray/iptvnator/issues/733), closes [#752](https://github.com/4gray/iptvnator/issues/752)) +- **playback** — The shared player controls' subtitle menu now loads external subtitle files (.srt/.vtt in the built-in web players, plus .ass in Embedded MPV), adjusts the subtitle timing offset in ±0.5 s steps, and sets the subtitle text size and color — size/color persist across sessions and are shared between engines. ([#1471](https://github.com/4gray/iptvnator/pull/1471), closes [#1408](https://github.com/4gray/iptvnator/issues/1408)) +- **playback** — The built-in web players' shared controls gain a quality menu: multi-bitrate HLS and DASH streams can be pinned to a specific rendition ("1080p", "720p", …) or left on Auto, which keeps the player's adaptive selection. The menu appears only when the stream actually offers more than one quality, and the choice lasts for the current playback session. ([#1470](https://github.com/4gray/iptvnator/pull/1470)) +- **playback** — The new player controls are now the default for the built-in web players — one consistent bar with quality selection, external subtitles, subtitle delay and styling, speed, and picture-in-picture. They are touch-friendly too: tapping the video shows or hides the controls instead of pausing, and narrow players get a two-row layout. Prefer the old look? Switch back in Settings > Playback. ([#1485](https://github.com/4gray/iptvnator/pull/1485), closes [#1408](https://github.com/4gray/iptvnator/issues/1408)) +- **playback** — An optional new set of player controls that looks and behaves the same in the HTML5, Video.js and ArtPlayer players, with picture-in-picture and, in fullscreen, the name of what you are watching. Enable it in Settings → Playback; left off, each of the three keeps its own controls exactly as before. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **playback** — The inline player on movie and series pages fills the whole content area like a theater: the video sits centered in black instead of leaving a strip of app background beside it. In the built-in web players, an optional ambient mode fills that space with a blurred, dimmed copy of the poster. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **playback** — A series playing inline on a wide window shows an "Up Next" rail beside the video: the rest of the season and the start of the next one, the current episode highlighted, watch progress on every card. Click one to jump straight to it. Built-in web players only; switch the rail off in Settings → Playback. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **playlist** — The Add playlist dialog has a new "Auto-detect" method: paste whatever your provider sent you — links, Xtream credentials, a MAC address with device IDs — and IPTVnator recognizes the source type and fills the matching import form for you to review. Detection runs entirely inside the app; nothing you paste is sent anywhere. ([#1445](https://github.com/4gray/iptvnator/pull/1445)) +- **playlist** — M3U entries that are movie files now open in the same movie detail view the portals use: playback starts immediately with plot, cast, rating and artwork from TMDB below the player instead of the empty program guide, and closing the player reveals the full poster page. Requires TMDB metadata to be enabled; a toggle in Settings → Metadata (TMDB) turns recognition off. ([#1420](https://github.com/4gray/iptvnator/pull/1420)) +- **portals** — Year, genre, and country on movie and series detail pages are now clickable (with TMDB metadata enabled): each chip opens a Discover page of popular titles for that facet, marked with what's already in your library — matches jump straight to their detail page, the rest open the portal search. Works in Xtream and Stalker, like the existing actor and director chips. ([#1453](https://github.com/4gray/iptvnator/pull/1453), closes [#1449](https://github.com/4gray/iptvnator/issues/1449)) +- **portals** — Movie and series details opened from the dashboard, global favorites, history, or a portal's favorites/recent tabs now offer a "View in portal" button below the main actions. It jumps straight to the title inside its own portal, with the matching category selected in the sidebar. ([#1422](https://github.com/4gray/iptvnator/pull/1422)) +- **portals** — Opening a series now lands on the season you'd actually continue: the earliest season with unwatched episodes, or the latest season once everything is watched — instead of always starting at season 1. ([#1469](https://github.com/4gray/iptvnator/pull/1469), closes [#1441](https://github.com/4gray/iptvnator/issues/1441)) +- **portals** — Series detail pages can now mark a whole season as watched (or unwatched) in one click — the new button next to "Download season" works for both Xtream and Stalker portals. Handy when you start a show mid-way: mark the earlier seasons watched and the Play button jumps straight to your next unwatched episode. ([#1447](https://github.com/4gray/iptvnator/pull/1447), closes [#1442](https://github.com/4gray/iptvnator/issues/1442)) +- **portals** — The series pages' season header now has a ⋮ menu that marks the WHOLE series as watched (or unwatched) in one click, for both Xtream and Stalker portals. On Ministra portals that load seasons lazily, the app first fetches the remaining seasons and then marks everything — so catching up on a show you started mid-way is a single action. ([#1451](https://github.com/4gray/iptvnator/pull/1451), closes [#1442](https://github.com/4gray/iptvnator/issues/1442)) +- **portals** — Movies that exist in several of your playlists now show a "Sources" chip on the detail page. Switch playlist mid-film and playback continues from the same timecode, pin a preferred source per movie, and when a stream dies the error screen offers the alternatives instead of a dead end. Optional auto-switching is off by default. ([#1286](https://github.com/4gray/iptvnator/pull/1286)) +- **portals** — The movie page's Sources popup now always fits on screen — only the source list scrolls, and it flips below the button in short windows — and gains All / Available / HD+ / language filters ("Available" checks every source on first use). Expanded copies show the stream title with only what differs, availability results are remembered, and Favorites/Download became icon buttons with live progress. ([#1359](https://github.com/4gray/iptvnator/pull/1359)) +- **remote-control** — The mobile remote now works in live TV favorites and recently viewed — per-portal and global — for M3U, Xtream and Stalker: channel switching, number select, and now-playing status follow the on-screen list. The remote no longer shows a channel as playing after leaving the player, Stalker radio reports its status, and volume buttons grey out when an external player owns the audio. ([#1399](https://github.com/4gray/iptvnator/pull/1399)) +- **settings** — Settings sections are now separate pages with shareable URLs and a floating Save/Discard bar that appears only when you have unsaved changes; leaving settings with pending edits asks whether to save, discard, or keep editing. The EPG panel's "Open EPG settings" button now jumps straight to the EPG settings page. ([#1384](https://github.com/4gray/iptvnator/pull/1384)) +- **settings** — A new setting drops the country prefix from live channel names, turning "UK - BBC One" into "BBC One" in lists, the guide and the player. Movie and series titles are left alone, and names that only look like a prefix — "Sky - Sports F1" — stay intact. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **stalker** — Stalker portals now have an Account info dialog — subscription status, tariff plan, expiry date with a days-left counter, login, and portal details. Open it from the header playlist menu, the dashboard source card, or the command palette, same as for Xtream. If the portal is unreachable, the data saved when the portal was added is shown instead. ([#1330](https://github.com/4gray/iptvnator/pull/1330)) +- **stalker** — Stalker portals that ask for a login and password now work: the import dialog gained username/password fields and the app completes the portal's do_auth step. When a portal refuses access, its own explanation is shown instead of a generic error, saved sessions resume without re-authenticating, and the keep-alive ping follows the portal's cadence. ([#1354](https://github.com/4gray/iptvnator/pull/1354)) +- **stalker** — Stalker portals now check the MAC address as you type it and fix hyphens or lowercase for you, with a warning when it sits outside the range most portals accept. Device IDs can optionally be generated from the MAC the way StbEmu does, and a portal that already has a different device ID on file finally says so instead of reporting damaged hardware. ([#1370](https://github.com/4gray/iptvnator/pull/1370), closes [#927](https://github.com/4gray/iptvnator/issues/927), closes [#860](https://github.com/4gray/iptvnator/issues/860)) +- **stalker** — Stalker movie and series catalogs now load continuously as you scroll — portal pages append into one seamless list, tall windows fill themselves, and a failed page keeps what's loaded and offers a retry. The Live TV "all channels" grid and portal search follow the same style, and search can page past its first hundred results. Pagination is gone from the app entirely. ([#1395](https://github.com/4gray/iptvnator/pull/1395)) +- **stalker** — The Live TV section loads its full channel list up front: search covers every channel instead of only the page you are on, genres show how many channels they hold, and Live TV opens on a grid of all channels. Guide data for the visible rows loads in bulk, so it shows up without playing a channel first. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **stalker** — Stalker setup now accepts hosts or `/c`, discovers the working API endpoint and authentication mode, and rechecks edited connection details. Canceled or failed edits leave saved and active sessions unchanged. Completed edits reject old configuration requests and late responses. Timed-out authentication stays fenced until its transport settles. ([#1391](https://github.com/4gray/iptvnator/pull/1391)) +- **tmdb** — Settings → Metadata (TMDB) now shows how many entries the metadata cache holds and how much space they take, with a button to empty it. Clearing costs nothing but the next few lookups — enrichment refetches on demand. ([#1244](https://github.com/4gray/iptvnator/pull/1244)) +- **tmdb** — Series pages show whether a show has ended or is still returning, so you know before committing to it. Directors and creators became clickable avatar chips like the cast — they open the person's page, where directing credits now sit alongside acting ones. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **ui** — Live channel rows now stack their action buttons vertically — favorite on top, programme info below — so the extra button costs no horizontal space. The programme-info button is now also available in the Xtream and Stalker channel sidebars, and its slot stays reserved while EPG data loads, so buttons never jump. ([#1341](https://github.com/4gray/iptvnator/pull/1341), closes [#1128](https://github.com/4gray/iptvnator/issues/1128)) +- **ui** — On phone-sized screens the categories and filters panel no longer sits stacked above the content — it is now a slide-in drawer, opened from a new button in the header and closed by picking an entry, tapping outside it, or pressing Escape. The content gets the whole screen while browsing. ([#1332](https://github.com/4gray/iptvnator/pull/1332), closes [#1100](https://github.com/4gray/iptvnator/issues/1100)) +- **xtream** — Catch-up is available from Favorites and Recent, not just Live TV, so an archived programme is reachable wherever the channel is. The programme currently on air can also be restarted from the beginning. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1138](https://github.com/4gray/iptvnator/issues/1138)) +- **xtream** — Live channels with provider catch-up now show a small archive badge — in the channel sidebar next to the channel name, on the "all channels" grid cards, and in the favorites and recently-viewed lists (including global favorites). Hovering it shows the catch-up window in days. ([#1341](https://github.com/4gray/iptvnator/pull/1341), closes [#1128](https://github.com/4gray/iptvnator/issues/1128)) +- **xtream** — Xtream movie, series, and live catalogs now load continuously as you scroll instead of flipping through pages — more items appear automatically as you near the bottom, and taller windows fill themselves on open. Opening a title and going back returns you to the exact spot in the list. In-category search and the in-portal search results follow the same continuous style. ([#1392](https://github.com/4gray/iptvnator/pull/1392)) +- **xtream** — Continue Watching resumes a series where you left it: opening one from the dashboard starts the exact episode at its saved position, and the series page offers "Play episode N" instead of always starting at the first one. Episodes launched in MPV or VLC count towards this too. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **xtream** — The movie sources popover now recognizes more language tags: prefixes with Unicode pipes, brackets or dashes ("EN │ …", "[EN] …", "EN - …"), Cyrillic tags ("РУС | …") and MULTI. It also reads the language off category names ("EN | Netflix"), and a tag welded to a title ("EN|Movie") no longer hides that copy from the other playlists' copies of the same movie. ([#1417](https://github.com/4gray/iptvnator/pull/1417)) + +### Fixes + +- **backup** — Backups carry hidden Xtream categories correctly. An export used to lose which categories you had hidden, and restoring such a backup then hid every category of that kind. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1017](https://github.com/4gray/iptvnator/issues/1017)) +- **components** — Confirmation dialogs are wider by default, so their action buttons sit side by side instead of wrapping into a vertical stack with longer translated labels. ([#1448](https://github.com/4gray/iptvnator/pull/1448)) +- **dashboard** — The dashboard hero now shows the same backdrop as the detail page. Stalker movies and series reuse the artwork saved when you opened them, and the metadata lookup behind the hero uses the release year and original title instead of the bare title — so titles TMDB knows more than once ("Холод") no longer come up empty. ([#1362](https://github.com/4gray/iptvnator/pull/1362)) +- **dashboard** — Movies and series you have opened before now show their artwork, rating and genres on the dashboard far more reliably, and seed the recommendations rail. Previously the dashboard searched TMDB by title alone, so common titles like "Inside Out" matched nothing — it now reuses what the detail page already found. ([#1423](https://github.com/4gray/iptvnator/pull/1423)) +- **dashboard** — Trending cards, the "Similar" rail and actor filmographies no longer show a title as missing from your library when your playlists hold several versions of it. A catalog with both "Dune 1984" and "Dune 2021" used to keep whichever came first, so the other one lost its link even though you had it. ([#1425](https://github.com/4gray/iptvnator/pull/1425)) +- **database** — SQLite diagnostics now record only statement types, preventing playlist credentials and other private values from appearing in trace logs. ([#1315](https://github.com/4gray/iptvnator/pull/1315)) +- **deps** — Database workers now use updated SQLite bindings that avoid a crash during worker shutdown. ([#1415](https://github.com/4gray/iptvnator/pull/1415)) +- **downloads** — Downloads from portals that cut long connections no longer die with "aborted": the app now reconnects automatically and continues from where the transfer stopped. Resume also works on servers that send no ETag/Last-Modified — the app re-checks a 256 KiB overlap against the saved partial before appending, and only gives up after repeated reconnects make no progress. ([#1446](https://github.com/4gray/iptvnator/pull/1446)) +- **downloads** — Xtream movie and episode downloads now keep their provider-compatible identity from the first request through legacy retries after source removal. Recoverable connection drops retain validated partials and show a credential-safe code; Retry resumes only with ETag or Last-Modified, otherwise it safely restarts. ([#1329](https://github.com/4gray/iptvnator/pull/1329), closes [#897](https://github.com/4gray/iptvnator/issues/897), closes [#1289](https://github.com/4gray/iptvnator/issues/1289)) +- **electron-backend** — Cancelling a large Xtream import now stops database work even while it is running at full speed, instead of letting the import finish before processing the cancel request. ([#1295](https://github.com/4gray/iptvnator/pull/1295)) +- **electron** — The desktop remote-control server now blocks crafted static paths from escaping bundled web files on Windows. ([#1267](https://github.com/4gray/iptvnator/pull/1267)) +- **embedded-mpv** — Opening the volume, audio, subtitle, speed or aspect menu in the Embedded MPV player no longer makes the video jump or leave a black bar above the controls: the menus now unfold inside the control bar instead of floating over the video. ([#1339](https://github.com/4gray/iptvnator/pull/1339), closes [#1139](https://github.com/4gray/iptvnator/issues/1139)) +- **embedded-mpv** — On Windows and Linux displays scaled above 100%, the Embedded MPV video was drawn toward the top-left corner at a fraction of its size, in windowed and fullscreen mode alike. The video now fills the player area correctly at any display scale and page zoom, with no need for a high-DPI compatibility workaround. ([#1339](https://github.com/4gray/iptvnator/pull/1339), closes [#1139](https://github.com/4gray/iptvnator/issues/1139), closes [#1145](https://github.com/4gray/iptvnator/issues/1145)) +- **epg** — A database error while looking up manual EPG channel mappings no longer breaks the request that triggered it. Searching for a channel in the "Map EPG channel" dialog, or saving and removing a mapping, now degrades gracefully instead of failing outright. ([#1291](https://github.com/4gray/iptvnator/pull/1291)) +- **epg** — A database error while reading or saving a manual EPG channel mapping no longer surfaces as a failed request. Looking up, saving, deleting, and searching mappings now fall back quietly, so a transient storage hiccup can no longer take down the EPG panel or the "Map EPG channel" dialog. ([#1279](https://github.com/4gray/iptvnator/pull/1279)) +- **favorites** — Favorites stop losing changes. The custom drag-and-drop order of an Xtream playlist's own favorites is saved again, and two favorites or history entries added at almost the same moment no longer quietly overwrite each other. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1137](https://github.com/4gray/iptvnator/issues/1137)) +- **i18n** — Translations across the app are clearer and more consistent in supported languages. ([#1390](https://github.com/4gray/iptvnator/pull/1390)) +- **m3u** — When a channel plays in MPV, VLC or the embedded MPV player, the custom User-Agent, Referer and Origin saved on the M3U playlist now reach the player. Per-channel `#EXTVLCOPT` headers still win; the playlist values only fill the gaps. VLC now also sends the Origin value as a real HTTP header, as MPV already did. ([#1397](https://github.com/4gray/iptvnator/pull/1397), closes [#1221](https://github.com/4gray/iptvnator/issues/1221)) +- **m3u** — Playlists with very long stream URLs — Pluto TV style lists that carry a session token in every link — import in full again instead of collapsing into a single channel. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1189](https://github.com/4gray/iptvnator/issues/1189)) +- **matching** — Movies whose name is a short abbreviation — AKA, RRR, IO, VFW, Y2K — are no longer mistaken for a language tag and filed under their release year alone. They now match their own copies in your other playlists, so alternative sources, recommendations and pinned sources land on the right film instead of an unrelated one that happens to share that year. ([#1426](https://github.com/4gray/iptvnator/pull/1426)) +- **packaging** — Snap packages now launch correctly with the desktop runtime scripts required by their generated startup command. ([#1406](https://github.com/4gray/iptvnator/pull/1406)) +- **playback** — Unavailable streams no longer appear as unsupported codecs. When Video.js exposes a server error such as HTTP 404, the player shows that status; otherwise ambiguous source errors remain unidentified instead of guessing. ([#1314](https://github.com/4gray/iptvnator/pull/1314), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — The embedded MPV video no longer drifts out of its frame when the layout shifts around it — for example when the channel sidebar or the EPG panel finishes loading after playback has started. The player now notices such moves and snaps the video back into place within half a second. ([#1476](https://github.com/4gray/iptvnator/pull/1476), closes [#1428](https://github.com/4gray/iptvnator/issues/1428)) +- **playback** — MPV and VLC recovery actions now stay available, show precise opening, started, playing, and failure feedback, and prevent overlapping launches. The dock keeps Stop available when teardown is still needed and lets terminal errors be dismissed. ([#1388](https://github.com/4gray/iptvnator/pull/1388)) +- **playback** — The screen no longer dims or goes to sleep while a built-in player is playing video — including on Linux desktops, where the system idle timer used to ignore the app. Pausing or stopping hands control back to the system immediately, and radio playback deliberately leaves the display free to sleep. Works in both the desktop app and the PWA. ([#1405](https://github.com/4gray/iptvnator/pull/1405), closes [#1095](https://github.com/4gray/iptvnator/issues/1095)) +- **playback** — Playback keyboard shortcuts now work with the default player setup: Space/K (play/pause), F (fullscreen), ←/→ (seek 5s in VOD), ↑/↓ (volume), and M (mute) act on the built-in HTML5, Video.js, and ArtPlayer players without turning on shared player controls — matching what the in-app shortcut list already promised. ([#1398](https://github.com/4gray/iptvnator/pull/1398)) +- **playback** — Switching the video player — from the command palette or the settings page — now takes effect immediately on an already-playing Xtream or Stalker stream instead of waiting for the player to be reopened. Playback also starts with the saved player right away, without briefly mounting the default engine first. ([#1437](https://github.com/4gray/iptvnator/pull/1437)) +- **playback** — MPEG-TS playback is now more reliable on newer Safari versions when streams contain audio timestamp gaps. ([#1412](https://github.com/4gray/iptvnator/pull/1412)) +- **playback** — External MPV and the embedded MPV frame-copy engine no longer truncate HTTP headers that contain commas — most notably the Stalker MAG user agent. Strict portals validated that header and rejected live streams with HTTP 400, so channels that only worked in VLC now also play through MPV. Completes the same fix that landed for the native embedded MPV view. ([#1323](https://github.com/4gray/iptvnator/pull/1323), closes [#910](https://github.com/4gray/iptvnator/issues/910)) +- **playback** — When playback fails, IPTVnator now ranks useful next steps from the reported error, including another compatible built-in player, MPV/VLC, Retry, or another source. Trying a built-in recommendation affects only the current item and does not change the saved player setting. ([#1374](https://github.com/4gray/iptvnator/pull/1374), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — Playback recovery now removes old error actions as soon as a new source or player starts, even while Electron prepares stream headers. Stalker series playing inline now picks up refreshed episode names and navigation, and safely disables episode commands if the playing episode disappears. ([#1374](https://github.com/4gray/iptvnator/pull/1374)) +- **playback** — DASH playback now resets a failed media buffer before switching variants, avoiding repeated append failures and crashes on affected platforms. ([#1411](https://github.com/4gray/iptvnator/pull/1411)) +- **playback** — Playback recovery no longer crosses into a different selected channel, movie, or exact Stalker episode. Switching content while a stream resolves no longer restores stale playback or shows an error from the previous selection. ([#1374](https://github.com/4gray/iptvnator/pull/1374), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — Stalker streams that require the portal session now play in the built-in players (HTML5, Video.js, ArtPlayer), not only in VLC/MPV: the player's requests carry the portal cookie and token, scoped to that stream and dropped when the player closes or the channel changes. VOD, series and radio get the same headers live TV had — also from Favorites and Recently Viewed. ([#1335](https://github.com/4gray/iptvnator/pull/1335), closes [#849](https://github.com/4gray/iptvnator/issues/849), closes [#910](https://github.com/4gray/iptvnator/issues/910), closes [#732](https://github.com/4gray/iptvnator/issues/732)) +- **playback** — HLS failures now use confirmed player evidence such as the failed stage, timeout, and HTTP status. Recoverable retries stay silent, and technical details no longer include raw provider error payloads. ([#1316](https://github.com/4gray/iptvnator/pull/1316)) +- **playback** — MPEG-TS playback errors now show exact engine evidence, including HTTP status, without exposing provider response details. Format, codec, truncated-stream, and MediaSource failures now produce more accurate fallback guidance. ([#1327](https://github.com/4gray/iptvnator/pull/1327), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — Shaka playback errors now use exact engine evidence, including subtitle parsing, preserve external-player fallback when browser prerequisites are missing, keep recoverable retries non-terminal, and omit provider URLs, credentials, and response data from technical details. ([#1318](https://github.com/4gray/iptvnator/pull/1318)) +- **playback** — The default web player now reports safer, more accurate streaming errors: confirmed network and encrypted-segment failures keep structured details, while ambiguous Video.js errors remain unknown instead of suggesting the wrong cause. ([#1317](https://github.com/4gray/iptvnator/pull/1317)) +- **playback** — The "Show subtitles" setting now works in the built-in players: turning it off hides subtitles a stream switched on by itself, and the preference finally applies on Xtream and Stalker pages too. Previously it only reached the M3U player, and even there Video.js and ArtPlayer ignored it. The player's own subtitle menu still overrides the setting for the current stream. ([#1269](https://github.com/4gray/iptvnator/pull/1269), closes [#1155](https://github.com/4gray/iptvnator/issues/1155)) +- **playback** — Video.js now shows its own control bar (play/pause, seek, volume, quality, fullscreen) on Live TV channels. Previously live streams played with no visible controls at all, because switching to a live source rebuilt the video element and the controls never came back. ([#1385](https://github.com/4gray/iptvnator/pull/1385)) +- **playlist** — Opening an .m3u/.m3u8 file from the command line or by double-clicking it now actually imports the playlist — previously nothing happened at all. Opening a playlist while IPTVnator is already running works too, and on macOS the file arrives through the system "open with" event. ([#1299](https://github.com/4gray/iptvnator/pull/1299)) +- **playlist** — IPTVnator now registers itself with the operating system as a handler for .m3u and .m3u8 files, so Finder, Explorer and Linux file managers offer it in "Open with" and a double-click actually opens the playlist. Installing or updating the app is enough — no manual file-type setup. ([#1301](https://github.com/4gray/iptvnator/pull/1301)) +- **playlists** — One unreachable playlist no longer holds up the rest. Refreshes give up after 30 seconds and run a few at a time, so your other playlists still update, and the message on startup names how many actually failed instead of always claiming success. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#931](https://github.com/4gray/iptvnator/issues/931)) +- **portals** — Importing an Xtream backup now restores all preferred VOD sources together. If restoration or cleanup fails, the catalog stays retryable and remains blocked until the parked state is safely consumed, preventing stale replay from overwriting newer choices. ([#1311](https://github.com/4gray/iptvnator/pull/1311)) +- **portals** — Greek titles now match no matter which sigma the provider typed. A word-final `ς` and a medial `σ` at the end of a word are treated as the same letter, so finding a film in your other playlists, the "Similar" rail, actor filmographies and TMDB enrichment no longer miss a Greek movie purely because two catalogues spelled its last letter differently. ([#1310](https://github.com/4gray/iptvnator/pull/1310)) +- **portals** — In the self-hosted web version, a provider that accepted a connection and then went silent could hang a request until the operating system gave up, with no way to cancel it. Requests now time out on the same schedule as the desktop app, and a host that fails to answer twice is skipped for a short while instead of stalling every following request. ([#1424](https://github.com/4gray/iptvnator/pull/1424)) +- **portals** — Going back from a Stalker title you reached with "View in portal" now returns you to exactly where you were — the same favorites or history tab, with the title still open — instead of dropping you on the Live TV tab. ([#1435](https://github.com/4gray/iptvnator/pull/1435)) +- **portals** — Refreshing an Xtream source keeps your favorites, watch history, hidden categories and playback positions. Starting the same refresh twice at once — from the header and from the sources page — used to wipe them, because the second run saved an already-emptied catalog over the first run's copy. ([#1431](https://github.com/4gray/iptvnator/pull/1431)) +- **pwa** — The self-hosted web backend now gives each provider connection attempt enough time to fall back from an unreachable IPv6 route to working IPv4 — common behind VPN containers like Gluetun — instead of failing with a bare "Bad Gateway". Provider errors now name the underlying network code (for example ETIMEDOUT) in the app and in the container logs. ([#1404](https://github.com/4gray/iptvnator/pull/1404), closes [#1400](https://github.com/4gray/iptvnator/issues/1400)) +- **pwa** — Self-hosted web backends started without `CLIENT_URL` now allow the documented `http://localhost:4333` origin instead of the retired public demo URL, so a manual (non-Docker) deployment no longer fails every provider request with a CORS error. ([cb37f62](https://github.com/4gray/iptvnator/commit/cb37f628ed9d63673d365923828ce7a793192459)) +- **pwa** — The self-hosted web app now talks to Stalker portals exactly like the desktop app: MAG User-Agent, full STB cookie, serial-number header, and the `JsHttpRequest` marker every real client sends — so portals that worked only in the desktop app now work in the PWA too. Portal credentials (MAC and session token) no longer travel in the portal request URL, keeping them out of server logs. ([#1348](https://github.com/4gray/iptvnator/pull/1348)) +- **search** — The search box no longer loses what you are typing when the page updates its address at the same moment — switching a downloads filter and immediately typing used to wipe the term, and fast typing could snap back to an earlier word. ([#1432](https://github.com/4gray/iptvnator/pull/1432)) +- **search** — Searching for names that carry punctuation inside them — "A&E", "X-Men", "L'Equipe" — finds them anywhere in a title, including channels the provider prefixes, like "US: A&E". ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1161](https://github.com/4gray/iptvnator/issues/1161)) +- **search** — Typing a space in the portal search box and pausing briefly no longer deletes the space — continuing to type "Bein Sports" no longer collapses into "BeinSports". ([#1474](https://github.com/4gray/iptvnator/pull/1474), closes [#1338](https://github.com/4gray/iptvnator/issues/1338)) +- **settings** — Launching IPTVnator a second time now brings the running window to the front instead of starting a rival copy that could not save anything — a common reason settings appeared to reset on restart. If saving or loading settings does fail, the app now says so instead of silently showing defaults. ([#1272](https://github.com/4gray/iptvnator/pull/1272), closes [#1156](https://github.com/4gray/iptvnator/issues/1156), closes [#102](https://github.com/4gray/iptvnator/issues/102)) +- **settings** — Unsaved settings edits no longer vanish silently when you close the window, quit the app, or reload the page. The desktop app now asks whether to save, discard, or keep editing — the same dialog in-app navigation shows — and only closes once your choice is applied; a failed save keeps the window open. In the browser, the native leave-page warning appears instead. ([#1394](https://github.com/4gray/iptvnator/pull/1394)) +- **stalker** — A Stalker portal is no longer re-probed and reclassified because something in front of it — a proxy or firewall, not the portal — answered with a short "Access denied" page. Only the portal's own authorization replies count now. ([#1358](https://github.com/4gray/iptvnator/pull/1358)) +- **stalker** — Stalker portals now receive channel commands exactly as a real set-top box sends them: already-encoded parts of a channel's `cmd` are no longer double-encoded, so strict portals and reseller panels that compare the command literally work again. Playing Stalker channels from Favorites or global collections now also handles portals that answer with relative stream paths. ([#1334](https://github.com/4gray/iptvnator/pull/1334)) +- **stalker** — Series opened from Favorites, Recent or the dashboard show their current episodes. One saved back when a single episode existed used to keep showing that one episode forever; the list is refreshed from the portal in the background instead. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **stalker** — Stalker portals are no longer classified by their URL shape: importing probes the real API endpoint (`portal.php` vs `server/load.php`) and checks whether the portal actually requires authentication. Canonical Ministra URLs finally load content, `…/c` addresses resolve correctly, and misclassified existing portals repair themselves on first failure — keeping favorites and history. ([#1344](https://github.com/4gray/iptvnator/pull/1344), closes [#850](https://github.com/4gray/iptvnator/issues/850), closes [#686](https://github.com/4gray/iptvnator/issues/686), closes [#755](https://github.com/4gray/iptvnator/issues/755)) +- **stalker** — Stalker Live TV now shows the currently airing programme even on portals whose bulk EPG only lists upcoming shows: channel rows fall back to a per-channel short-EPG lookup, and the EPG panel merges "what's on now" into the schedule instead of showing future programmes only. ([#1386](https://github.com/4gray/iptvnator/pull/1386)) +- **playback** — Stalker live TV plays again in the embedded MPV player. The MAG250 user agent contains a comma (`KHTML, like Gecko`), which MPV splits in its comma-separated `--http-header-fields` list, truncating `X-User-Agent` so strict portals reject the stream with HTTP 400. Commas and backslashes in header values are now escaped on the Windows/Linux and macOS embedded-MPV paths. ([#1321](https://github.com/4gray/iptvnator/pull/1321)) +- **stalker** — Stalker portals whose server redirects to https or to another port no longer lose their session mid-request. Since 0.22 such redirects silently dropped the portal's MAC cookie and auth token, so categories failed to load and streams never reached any player. Downgrade redirects from https to plain http still strip credentials, so a secure session is never sent in cleartext. ([#1322](https://github.com/4gray/iptvnator/pull/1322), closes [#1158](https://github.com/4gray/iptvnator/issues/1158)) +- **stalker** — Stalker VOD series now report progress correctly when portals return boolean series flags, keep episode progress separate between shows, and resume positions saved by earlier versions. ([#1315](https://github.com/4gray/iptvnator/pull/1315)) +- **stalker** — Stalker channels that the portal serves directly now start without an extra link request to the portal, so they open faster and no longer fail when that request does. Channels the portal does proxy still get their temporary link, and radio stations the portal proxies now get one too instead of playing a URL the portal never meant to serve. ([#1364](https://github.com/4gray/iptvnator/pull/1364)) +- **tmdb** — Movies whose provider ships a dead or wrong TMDB id are enriched again. The id is weighed against the title and release year: a dead one falls back to the title search, a stale one that clearly points at another film loses to it, and a working id is no longer thrown away just because the provider spells the title differently. ([#1239](https://github.com/4gray/iptvnator/pull/1239)) +- **tmdb** — Series detail pages now list the cast of the whole show instead of only its newest season, so actors who left partway through stop disappearing from long-running shows — while people who joined for the current season still show up. ([#1242](https://github.com/4gray/iptvnator/pull/1242)) +- **tmdb** — Titles that providers dress up with language or quality tags — "|ALB| Fallout", "4K-DE - The Pitt (2025)", "Breaking Bad-eng" — now match against TMDB, so they get artwork, plot and cast like the rest of the catalog. Shows split into one entry per season also pull the season that entry really contains. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **ui** — IPTVnator is usable on a phone again. The navigation bar no longer sits off screen, category and channel lists take the full width instead of squeezing the content into a sliver, the video keeps a usable share of the screen, and the M3U channel list can be reopened after hiding it. ([#1326](https://github.com/4gray/iptvnator/pull/1326), closes [#1100](https://github.com/4gray/iptvnator/issues/1100)) +- **ui** — Narrow EPG channel rows now keep the current programme, progress, and enabled channel actions visible instead of dropping useful context. ([#1312](https://github.com/4gray/iptvnator/pull/1312)) +- **window-controls** — On Windows, the minimize, maximize and close buttons disappeared for good after leaving fullscreen video playback — the only way to get them back was to restart the app. They now reappear as soon as you exit fullscreen, and the maximize button no longer gets stuck on the wrong icon afterwards. ([#1178](https://github.com/4gray/iptvnator/pull/1178)) +- **workspace** — The playlist dropdown in the header shows a "Playlist info" entry for the active playlist again, next to "Account info" and "Add playlist" — it had disappeared when playlist actions moved into the per-row menu. ([#1328](https://github.com/4gray/iptvnator/pull/1328)) +- **workspace** — The playlist sync overlay no longer shows a bare "Syncing playlist" card when an Xtream playlist is loaded from the local library. Reading the saved catalog from this device now reports its own phase, so the overlay always shows a source badge and explains what is happening — remote fetch or local read. ([#1345](https://github.com/4gray/iptvnator/pull/1345)) +- **xtream** — Portals sitting behind Cloudflare or a similar firewall connect again. Those setups answered the app with a challenge page instead of data, so "Test connection" failed on portals that worked fine in every other player; requests now identify themselves the way an ordinary IPTV player does. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **xtream** — Series pages no longer show a raw image link under the season tabs when the provider fills the season description with a cover URL. URL-only descriptions are dropped, and with TMDB metadata enabled the missing season description is filled from TMDB instead. ([#1382](https://github.com/4gray/iptvnator/pull/1382)) +- **xtream** — Xtream movies remain playable when a portal omits extended VOD metadata, using catalog stream details to build the playback URL. ([#1303](https://github.com/4gray/iptvnator/pull/1303)) + +### Performance + +- **m3u** — Importing large M3U playlists is faster because IPTVnator no longer rewrites the entire playlist when loading saved favorites. ([#1232](https://github.com/4gray/iptvnator/pull/1232)) +- **m3u** — Cancelling a large M3U refresh now stops its background worker before parsed channels can be copied or saved, keeping the interface responsive and leaving the existing playlist unchanged. ([#1268](https://github.com/4gray/iptvnator/pull/1268)) +- **portals** — Unreachable Xtream and Stalker portals no longer cost a 30-second wait per request. After a host fails to answer twice, further requests to it fail immediately for 30 seconds, so browsing a dead portal stops filling the screen with long spinners. Retrying, testing the connection, or editing the portal address contacts it again right away. ([#1421](https://github.com/4gray/iptvnator/pull/1421)) +- **stalker** — Detail pages for anything that is not a series — a movie, a live channel, a VOD item that only looks like a series — no longer fire an episode-list request before they can show anything, so they open faster on every route in, from browsing and search to Favorites, Recent and the dashboard. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) + +
+Internal changes + +- **build** — Shared UI stylesheets are now part of the build cache key. Edits to them previously produced a cache hit, so a style fix could be silently missing from a rebuilt app until the cache was bypassed. A CI check now fails any stylesheet import that escapes its build's inputs. ([#1360](https://github.com/4gray/iptvnator/pull/1360)) +- **build** — Electron development serve no longer crashes while Vite transforms a large lazy chunk. The pinned Vite release now carries a backtracking-safe transform filter fix, with a regression check guarding dependency updates. ([#1379](https://github.com/4gray/iptvnator/pull/1379)) +- **deps** — Coordinated security dependency sweep closing all open Dependabot alerts: the two runtime-scope advisories (js-yaml YAML-parsing DoS reached through electron-updater, fast-uri host confusion reached through electron-conf) plus the dev-only clusters — Astro 5→7 for the website, hono, undici, postcss and a dozen other transitive bumps via pnpm overrides. ([#1475](https://github.com/4gray/iptvnator/pull/1475)) +- **deps** — The web backend now uses the current structured XMLTV parser output, covered by a route-level contract test for future PWA EPG support. ([#1413](https://github.com/4gray/iptvnator/pull/1413)) +- **deps** — Updated ngx-indexed-db (the PWA's IndexedDB storage library) from 21 to 22. No behavior change. ([#1472](https://github.com/4gray/iptvnator/pull/1472)) +- **deps** — Updated 43 dependencies, including the HTTP client behind every playlist and portal request — that one closes seven advisories that affect the shipped app, among them a proxy-credential leak on redirects. Also refreshes the ArtPlayer, hls.js, Video.js and Shaka player engines. No behaviour change intended. ([#1270](https://github.com/4gray/iptvnator/pull/1270)) +- **deps** — Patched five vulnerable transitive dependencies that ship with the app — including the YAML parser `electron-updater` uses to read update manifests, and the HTTP form encoder behind portal requests. No behaviour change. ([#1258](https://github.com/4gray/iptvnator/pull/1258)) +- **portals** — Failed Stalker portal requests now log a compact, credential-free summary (action, host, error code, HTTP status) in the desktop backend instead of dumping the full multi-page network error object, matching the existing Xtream request logging. ([#1418](https://github.com/4gray/iptvnator/pull/1418)) + +
+ # [0.12.0](https://github.com/4gray/iptvnator/compare/v0.11.1...v0.12.0) (2023-03-11) diff --git a/apps/website/public/blog/v0-23/hero.jpg b/apps/website/public/blog/v0-23/hero.jpg new file mode 100644 index 000000000..d0b590bd0 Binary files /dev/null and b/apps/website/public/blog/v0-23/hero.jpg differ diff --git a/apps/website/public/blog/v0-23/screenshots/dashboard-dark.png b/apps/website/public/blog/v0-23/screenshots/dashboard-dark.png new file mode 100644 index 000000000..8266c2bc5 Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/dashboard-dark.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/dashboard-light.png b/apps/website/public/blog/v0-23/screenshots/dashboard-light.png new file mode 100644 index 000000000..71777871f Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/dashboard-light.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/m3u-live-groups-two-column-dark.png b/apps/website/public/blog/v0-23/screenshots/m3u-live-groups-two-column-dark.png new file mode 100644 index 000000000..11e294f07 Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/m3u-live-groups-two-column-dark.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/m3u-live-groups-two-column-light.png b/apps/website/public/blog/v0-23/screenshots/m3u-live-groups-two-column-light.png new file mode 100644 index 000000000..dfcf22279 Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/m3u-live-groups-two-column-light.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/settings-dark.png b/apps/website/public/blog/v0-23/screenshots/settings-dark.png new file mode 100644 index 000000000..a7eb0aad4 Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/settings-dark.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/settings-light.png b/apps/website/public/blog/v0-23/screenshots/settings-light.png new file mode 100644 index 000000000..8b82d9f43 Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/settings-light.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/xtream-series-season-open-dark.png b/apps/website/public/blog/v0-23/screenshots/xtream-series-season-open-dark.png new file mode 100644 index 000000000..dd955edd0 Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/xtream-series-season-open-dark.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/xtream-series-season-open-light.png b/apps/website/public/blog/v0-23/screenshots/xtream-series-season-open-light.png new file mode 100644 index 000000000..5b789bb4d Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/xtream-series-season-open-light.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/xtream-vod-details-dark.png b/apps/website/public/blog/v0-23/screenshots/xtream-vod-details-dark.png new file mode 100644 index 000000000..b7fe230cc Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/xtream-vod-details-dark.png differ diff --git a/apps/website/public/blog/v0-23/screenshots/xtream-vod-details-light.png b/apps/website/public/blog/v0-23/screenshots/xtream-vod-details-light.png new file mode 100644 index 000000000..da76ae3da Binary files /dev/null and b/apps/website/public/blog/v0-23/screenshots/xtream-vod-details-light.png differ diff --git a/apps/website/src/content/blog/v0-23-release-notes.mdx b/apps/website/src/content/blog/v0-23-release-notes.mdx new file mode 100644 index 000000000..3fe4432cf --- /dev/null +++ b/apps/website/src/content/blog/v0-23-release-notes.mdx @@ -0,0 +1,211 @@ +--- +title: v0.23 - Release Notes +description: A download manager with an offline library and Live-TV recordings, new default player controls, alternative sources for movies, and catalogs that scroll without pages. +featured: true +pubDate: 2026-08-30 +author: 4gray +heroImage: /iptvnator/blog/v0-23/hero.jpg +tags: + - release + - release-notes + - v0.23 +draft: true +--- + +import BlogImageSlider from '../../components/blog/BlogImageSlider.astro'; +import ReleaseMeta from '../../components/blog/ReleaseMeta.astro'; + +v0.23 is about watching on your own terms. Movies and episodes can now leave +the stream behind: a full download manager keeps an offline library, records +live TV, and survives flaky providers by pausing, resuming and reconnecting on +its own. When you do stream, the built-in players finally share one set of +controls — quality selection, external subtitles, picture-in-picture — turned +on by default, and a film that exists in several of your playlists offers its +alternative sources right where playback fails. Around all of that, browsing +got calmer: catalogs scroll endlessly instead of flipping pages, series open on +the season you would actually continue, and Stalker portals authenticate, +recover and explain themselves far more like real set-top boxes do. + + + + + +## Features + +- **dashboard** — Continue Watching cards on the dashboard now open the detail page on click, just like movie cards — no more accidental episode playback. Resuming the saved episode moved to a new ⋮ menu on each card, next to "Mark as Watched" and "Remove from history". ([#1469](https://github.com/4gray/iptvnator/pull/1469), closes [#1441](https://github.com/4gray/iptvnator/issues/1441)) +- **dashboard** — Dashboard source cards now warn when a portal subscription is about to lapse: an amber "Expires in N d" chip appears within a week of the expiry date, and an "Expired" chip once it has passed. Xtream expirations come from the same cached status check the playlist switcher uses; Stalker portals reuse the account info saved at import. ([#1342](https://github.com/4gray/iptvnator/pull/1342)) +- **dashboard** — The dashboard gains a "Because you watched" rail: TMDB recommendations seeded from your recently watched movies and series, showing only titles that actually exist in your imported libraries. It appears once at least five matches are found, can be turned off under Settings → Dashboard, and requires the TMDB metadata opt-in (desktop app only). ([#1419](https://github.com/4gray/iptvnator/pull/1419)) +- **deps** — Linux desktops with client-side decoration support now show native rounded corners on the IPTVnator window. Desktop builds now run on Electron 43. ([#1414](https://github.com/4gray/iptvnator/pull/1414)) +- **downloads** — The download manager got a visual cleanup: "Ready to watch" cards are compact poster cards — file actions live in the poster's ⋮ menu, and clicking any card (episodes included) opens its offline detail. Queue rows show one primary action (pause/resume/retry) with cancel and remove in the menu, and all sections share one heading style with item counts. ([#1448](https://github.com/4gray/iptvnator/pull/1448)) +- **downloads** — Live-TV recordings made with the Embedded MPV player now live in the download manager: an in-progress row with elapsed time and Stop, a Recordings library with channel logos and the programs captured from the EPG at recording time, a focused detail page, and Needs attention when a file goes missing. Recordings interrupted by a crash survive as playable partials. ([#1452](https://github.com/4gray/iptvnator/pull/1452)) +- **downloads** — Downloads can be paused and picked up later. A paused transfer keeps what it already fetched and continues from that point instead of starting over, and downloads cut short by a crash or a closed app come back as paused rather than lost. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **downloads** — Series downloads now let you queue several episodes in a row or add every available episode from the selected season. Already queued, paused, or downloaded episodes are skipped without duplicates, and the app reports the batch result. ([#1357](https://github.com/4gray/iptvnator/pull/1357)) +- **embedded-mpv** — Experimental Embedded MPV can draw video inside the app window instead of into a separate layer pinned on top of it, so menus, dialogs and the player controls stop being swallowed by the picture. Available on macOS (Apple Silicon), Windows and Linux x64; switching it on needs a restart. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **epg** — Channels whose guide never matched can be mapped by hand: right-click a channel in any list and pick "Map EPG channel" to attach it to a channel from your uploaded XMLTV guide. The mapping is remembered and used everywhere the guide is read — M3U playlists, Xtream and Stalker portals alike. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **i18n** — IPTVnator speaks Hungarian, its 19th language — contributed by @htibcsike. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1192](https://github.com/4gray/iptvnator/issues/1192)) +- **m3u** — MPEG-DASH channels play in the built-in player, ClearKey-encrypted ones included — the keys are read from the playlist's #KODIPROP lines, whether they sit above or below the channel entry. Streams locked with Widevine or PlayReady still cannot be played, but they now say so instead of failing silently. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#86](https://github.com/4gray/iptvnator/issues/86), closes [#614](https://github.com/4gray/iptvnator/issues/614), closes [#656](https://github.com/4gray/iptvnator/issues/656), closes [#733](https://github.com/4gray/iptvnator/issues/733), closes [#752](https://github.com/4gray/iptvnator/issues/752)) +- **playback** — The shared player controls' subtitle menu now loads external subtitle files (.srt/.vtt in the built-in web players, plus .ass in Embedded MPV), adjusts the subtitle timing offset in ±0.5 s steps, and sets the subtitle text size and color — size/color persist across sessions and are shared between engines. ([#1471](https://github.com/4gray/iptvnator/pull/1471), closes [#1408](https://github.com/4gray/iptvnator/issues/1408)) +- **playback** — The built-in web players' shared controls gain a quality menu: multi-bitrate HLS and DASH streams can be pinned to a specific rendition ("1080p", "720p", …) or left on Auto, which keeps the player's adaptive selection. The menu appears only when the stream actually offers more than one quality, and the choice lasts for the current playback session. ([#1470](https://github.com/4gray/iptvnator/pull/1470)) +- **playback** — An optional new set of player controls that looks and behaves the same in the HTML5, Video.js and ArtPlayer players, with picture-in-picture and, in fullscreen, the name of what you are watching. Enable it in Settings → Playback; left off, each of the three keeps its own controls exactly as before. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **playback** — The inline player on movie and series pages fills the whole content area like a theater: the video sits centered in black instead of leaving a strip of app background beside it. In the built-in web players, an optional ambient mode fills that space with a blurred, dimmed copy of the poster. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **playback** — A series playing inline on a wide window shows an "Up Next" rail beside the video: the rest of the season and the start of the next one, the current episode highlighted, watch progress on every card. Click one to jump straight to it. Built-in web players only; switch the rail off in Settings → Playback. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **playlist** — The Add playlist dialog has a new "Auto-detect" method: paste whatever your provider sent you — links, Xtream credentials, a MAC address with device IDs — and IPTVnator recognizes the source type and fills the matching import form for you to review. Detection runs entirely inside the app; nothing you paste is sent anywhere. ([#1445](https://github.com/4gray/iptvnator/pull/1445)) +- **playlist** — M3U entries that are movie files now open in the same movie detail view the portals use: playback starts immediately with plot, cast, rating and artwork from TMDB below the player instead of the empty program guide, and closing the player reveals the full poster page. Requires TMDB metadata to be enabled; a toggle in Settings → Metadata (TMDB) turns recognition off. ([#1420](https://github.com/4gray/iptvnator/pull/1420)) +- **portals** — Year, genre, and country on movie and series detail pages are now clickable (with TMDB metadata enabled): each chip opens a Discover page of popular titles for that facet, marked with what's already in your library — matches jump straight to their detail page, the rest open the portal search. Works in Xtream and Stalker, like the existing actor and director chips. ([#1453](https://github.com/4gray/iptvnator/pull/1453), closes [#1449](https://github.com/4gray/iptvnator/issues/1449)) +- **portals** — Movie and series details opened from the dashboard, global favorites, history, or a portal's favorites/recent tabs now offer a "View in portal" button below the main actions. It jumps straight to the title inside its own portal, with the matching category selected in the sidebar. ([#1422](https://github.com/4gray/iptvnator/pull/1422)) +- **portals** — Opening a series now lands on the season you'd actually continue: the earliest season with unwatched episodes, or the latest season once everything is watched — instead of always starting at season 1. ([#1469](https://github.com/4gray/iptvnator/pull/1469), closes [#1441](https://github.com/4gray/iptvnator/issues/1441)) +- **portals** — Series detail pages can now mark a whole season as watched (or unwatched) in one click — the new button next to "Download season" works for both Xtream and Stalker portals. Handy when you start a show mid-way: mark the earlier seasons watched and the Play button jumps straight to your next unwatched episode. ([#1447](https://github.com/4gray/iptvnator/pull/1447), closes [#1442](https://github.com/4gray/iptvnator/issues/1442)) +- **portals** — The series pages' season header now has a ⋮ menu that marks the WHOLE series as watched (or unwatched) in one click, for both Xtream and Stalker portals. On Ministra portals that load seasons lazily, the app first fetches the remaining seasons and then marks everything — so catching up on a show you started mid-way is a single action. ([#1451](https://github.com/4gray/iptvnator/pull/1451), closes [#1442](https://github.com/4gray/iptvnator/issues/1442)) +- **portals** — The movie page's Sources popup now always fits on screen — only the source list scrolls, and it flips below the button in short windows — and gains All / Available / HD+ / language filters ("Available" checks every source on first use). Expanded copies show the stream title with only what differs, availability results are remembered, and Favorites/Download became icon buttons with live progress. ([#1359](https://github.com/4gray/iptvnator/pull/1359)) +- **remote-control** — The mobile remote now works in live TV favorites and recently viewed — per-portal and global — for M3U, Xtream and Stalker: channel switching, number select, and now-playing status follow the on-screen list. The remote no longer shows a channel as playing after leaving the player, Stalker radio reports its status, and volume buttons grey out when an external player owns the audio. ([#1399](https://github.com/4gray/iptvnator/pull/1399)) +- **settings** — Settings sections are now separate pages with shareable URLs and a floating Save/Discard bar that appears only when you have unsaved changes; leaving settings with pending edits asks whether to save, discard, or keep editing. The EPG panel's "Open EPG settings" button now jumps straight to the EPG settings page. ([#1384](https://github.com/4gray/iptvnator/pull/1384)) +- **settings** — A new setting drops the country prefix from live channel names, turning "UK - BBC One" into "BBC One" in lists, the guide and the player. Movie and series titles are left alone, and names that only look like a prefix — "Sky - Sports F1" — stay intact. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **stalker** — Stalker portals now have an Account info dialog — subscription status, tariff plan, expiry date with a days-left counter, login, and portal details. Open it from the header playlist menu, the dashboard source card, or the command palette, same as for Xtream. If the portal is unreachable, the data saved when the portal was added is shown instead. ([#1330](https://github.com/4gray/iptvnator/pull/1330)) +- **stalker** — Stalker portals that ask for a login and password now work: the import dialog gained username/password fields and the app completes the portal's do_auth step. When a portal refuses access, its own explanation is shown instead of a generic error, saved sessions resume without re-authenticating, and the keep-alive ping follows the portal's cadence. ([#1354](https://github.com/4gray/iptvnator/pull/1354)) +- **stalker** — Stalker portals now check the MAC address as you type it and fix hyphens or lowercase for you, with a warning when it sits outside the range most portals accept. Device IDs can optionally be generated from the MAC the way StbEmu does, and a portal that already has a different device ID on file finally says so instead of reporting damaged hardware. ([#1370](https://github.com/4gray/iptvnator/pull/1370), closes [#927](https://github.com/4gray/iptvnator/issues/927), closes [#860](https://github.com/4gray/iptvnator/issues/860)) +- **stalker** — Stalker movie and series catalogs now load continuously as you scroll — portal pages append into one seamless list, tall windows fill themselves, and a failed page keeps what's loaded and offers a retry. The Live TV "all channels" grid and portal search follow the same style, and search can page past its first hundred results. Pagination is gone from the app entirely. ([#1395](https://github.com/4gray/iptvnator/pull/1395)) +- **stalker** — The Live TV section loads its full channel list up front: search covers every channel instead of only the page you are on, genres show how many channels they hold, and Live TV opens on a grid of all channels. Guide data for the visible rows loads in bulk, so it shows up without playing a channel first. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **stalker** — Stalker setup now accepts hosts or `/c`, discovers the working API endpoint and authentication mode, and rechecks edited connection details. Canceled or failed edits leave saved and active sessions unchanged. Completed edits reject old configuration requests and late responses. Timed-out authentication stays fenced until its transport settles. ([#1391](https://github.com/4gray/iptvnator/pull/1391)) +- **tmdb** — Settings → Metadata (TMDB) now shows how many entries the metadata cache holds and how much space they take, with a button to empty it. Clearing costs nothing but the next few lookups — enrichment refetches on demand. ([#1244](https://github.com/4gray/iptvnator/pull/1244)) +- **tmdb** — Series pages show whether a show has ended or is still returning, so you know before committing to it. Directors and creators became clickable avatar chips like the cast — they open the person's page, where directing credits now sit alongside acting ones. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **ui** — Live channel rows now stack their action buttons vertically — favorite on top, programme info below — so the extra button costs no horizontal space. The programme-info button is now also available in the Xtream and Stalker channel sidebars, and its slot stays reserved while EPG data loads, so buttons never jump. ([#1341](https://github.com/4gray/iptvnator/pull/1341), closes [#1128](https://github.com/4gray/iptvnator/issues/1128)) +- **ui** — On phone-sized screens the categories and filters panel no longer sits stacked above the content — it is now a slide-in drawer, opened from a new button in the header and closed by picking an entry, tapping outside it, or pressing Escape. The content gets the whole screen while browsing. ([#1332](https://github.com/4gray/iptvnator/pull/1332), closes [#1100](https://github.com/4gray/iptvnator/issues/1100)) +- **xtream** — Catch-up is available from Favorites and Recent, not just Live TV, so an archived programme is reachable wherever the channel is. The programme currently on air can also be restarted from the beginning. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1138](https://github.com/4gray/iptvnator/issues/1138)) +- **xtream** — Live channels with provider catch-up now show a small archive badge — in the channel sidebar next to the channel name, on the "all channels" grid cards, and in the favorites and recently-viewed lists (including global favorites). Hovering it shows the catch-up window in days. ([#1341](https://github.com/4gray/iptvnator/pull/1341), closes [#1128](https://github.com/4gray/iptvnator/issues/1128)) +- **xtream** — Continue Watching resumes a series where you left it: opening one from the dashboard starts the exact episode at its saved position, and the series page offers "Play episode N" instead of always starting at the first one. Episodes launched in MPV or VLC count towards this too. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **xtream** — The movie sources popover now recognizes more language tags: prefixes with Unicode pipes, brackets or dashes ("EN │ …", "[EN] …", "EN - …"), Cyrillic tags ("РУС | …") and MULTI. It also reads the language off category names ("EN | Netflix"), and a tag welded to a title ("EN|Movie") no longer hides that copy from the other playlists' copies of the same movie. ([#1417](https://github.com/4gray/iptvnator/pull/1417)) + +### Download manager with offline library + +Downloads now separate active transfers from a grouped offline library, move missing files to Needs attention with Download again, and open movies and series in focused offline details with saved metadata. Series show only local episodes; View in portal returns to provider playback when the source can be recovered. Completed-file checks stay responsive on slow or unavailable storage. ([#1313](https://github.com/4gray/iptvnator/pull/1313)) + +### New player controls by default + +The new player controls are now the default for the built-in web players — one consistent bar with quality selection, external subtitles, subtitle delay and styling, speed, and picture-in-picture. They are touch-friendly too: tapping the video shows or hides the controls instead of pausing, and narrow players get a two-row layout. Prefer the old look? Switch back in Settings > Playback. ([#1485](https://github.com/4gray/iptvnator/pull/1485), closes [#1408](https://github.com/4gray/iptvnator/issues/1408)) + +### Alternative sources for movies + +Movies that exist in several of your playlists now show a "Sources" chip on the detail page. Switch playlist mid-film and playback continues from the same timecode, pin a preferred source per movie, and when a stream dies the error screen offers the alternatives instead of a dead end. Optional auto-switching is off by default. ([#1286](https://github.com/4gray/iptvnator/pull/1286)) + +### Catalogs scroll without pages + +Xtream movie, series, and live catalogs now load continuously as you scroll instead of flipping through pages — more items appear automatically as you near the bottom, and taller windows fill themselves on open. Opening a title and going back returns you to the exact spot in the list. In-category search and the in-portal search results follow the same continuous style. ([#1392](https://github.com/4gray/iptvnator/pull/1392)) + +## Fixes + +- **backup** — Backups carry hidden Xtream categories correctly. An export used to lose which categories you had hidden, and restoring such a backup then hid every category of that kind. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1017](https://github.com/4gray/iptvnator/issues/1017)) +- **components** — Confirmation dialogs are wider by default, so their action buttons sit side by side instead of wrapping into a vertical stack with longer translated labels. ([#1448](https://github.com/4gray/iptvnator/pull/1448)) +- **dashboard** — The dashboard hero now shows the same backdrop as the detail page. Stalker movies and series reuse the artwork saved when you opened them, and the metadata lookup behind the hero uses the release year and original title instead of the bare title — so titles TMDB knows more than once ("Холод") no longer come up empty. ([#1362](https://github.com/4gray/iptvnator/pull/1362)) +- **dashboard** — Movies and series you have opened before now show their artwork, rating and genres on the dashboard far more reliably, and seed the recommendations rail. Previously the dashboard searched TMDB by title alone, so common titles like "Inside Out" matched nothing — it now reuses what the detail page already found. ([#1423](https://github.com/4gray/iptvnator/pull/1423)) +- **dashboard** — Trending cards, the "Similar" rail and actor filmographies no longer show a title as missing from your library when your playlists hold several versions of it. A catalog with both "Dune 1984" and "Dune 2021" used to keep whichever came first, so the other one lost its link even though you had it. ([#1425](https://github.com/4gray/iptvnator/pull/1425)) +- **database** — SQLite diagnostics now record only statement types, preventing playlist credentials and other private values from appearing in trace logs. ([#1315](https://github.com/4gray/iptvnator/pull/1315)) +- **deps** — Database workers now use updated SQLite bindings that avoid a crash during worker shutdown. ([#1415](https://github.com/4gray/iptvnator/pull/1415)) +- **downloads** — Downloads from portals that cut long connections no longer die with "aborted": the app now reconnects automatically and continues from where the transfer stopped. Resume also works on servers that send no ETag/Last-Modified — the app re-checks a 256 KiB overlap against the saved partial before appending, and only gives up after repeated reconnects make no progress. ([#1446](https://github.com/4gray/iptvnator/pull/1446)) +- **downloads** — Xtream movie and episode downloads now keep their provider-compatible identity from the first request through legacy retries after source removal. Recoverable connection drops retain validated partials and show a credential-safe code; Retry resumes only with ETag or Last-Modified, otherwise it safely restarts. ([#1329](https://github.com/4gray/iptvnator/pull/1329), closes [#897](https://github.com/4gray/iptvnator/issues/897), closes [#1289](https://github.com/4gray/iptvnator/issues/1289)) +- **electron-backend** — Cancelling a large Xtream import now stops database work even while it is running at full speed, instead of letting the import finish before processing the cancel request. ([#1295](https://github.com/4gray/iptvnator/pull/1295)) +- **electron** — The desktop remote-control server now blocks crafted static paths from escaping bundled web files on Windows. ([#1267](https://github.com/4gray/iptvnator/pull/1267)) +- **embedded-mpv** — Opening the volume, audio, subtitle, speed or aspect menu in the Embedded MPV player no longer makes the video jump or leave a black bar above the controls: the menus now unfold inside the control bar instead of floating over the video. ([#1339](https://github.com/4gray/iptvnator/pull/1339), closes [#1139](https://github.com/4gray/iptvnator/issues/1139)) +- **embedded-mpv** — On Windows and Linux displays scaled above 100%, the Embedded MPV video was drawn toward the top-left corner at a fraction of its size, in windowed and fullscreen mode alike. The video now fills the player area correctly at any display scale and page zoom, with no need for a high-DPI compatibility workaround. ([#1339](https://github.com/4gray/iptvnator/pull/1339), closes [#1139](https://github.com/4gray/iptvnator/issues/1139), closes [#1145](https://github.com/4gray/iptvnator/issues/1145)) +- **epg** — A database error while looking up manual EPG channel mappings no longer breaks the request that triggered it. Searching for a channel in the "Map EPG channel" dialog, or saving and removing a mapping, now degrades gracefully instead of failing outright. ([#1291](https://github.com/4gray/iptvnator/pull/1291)) +- **epg** — A database error while reading or saving a manual EPG channel mapping no longer surfaces as a failed request. Looking up, saving, deleting, and searching mappings now fall back quietly, so a transient storage hiccup can no longer take down the EPG panel or the "Map EPG channel" dialog. ([#1279](https://github.com/4gray/iptvnator/pull/1279)) +- **favorites** — Favorites stop losing changes. The custom drag-and-drop order of an Xtream playlist's own favorites is saved again, and two favorites or history entries added at almost the same moment no longer quietly overwrite each other. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1137](https://github.com/4gray/iptvnator/issues/1137)) +- **i18n** — Translations across the app are clearer and more consistent in supported languages. ([#1390](https://github.com/4gray/iptvnator/pull/1390)) +- **m3u** — When a channel plays in MPV, VLC or the embedded MPV player, the custom User-Agent, Referer and Origin saved on the M3U playlist now reach the player. Per-channel `#EXTVLCOPT` headers still win; the playlist values only fill the gaps. VLC now also sends the Origin value as a real HTTP header, as MPV already did. ([#1397](https://github.com/4gray/iptvnator/pull/1397), closes [#1221](https://github.com/4gray/iptvnator/issues/1221)) +- **m3u** — Playlists with very long stream URLs — Pluto TV style lists that carry a session token in every link — import in full again instead of collapsing into a single channel. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1189](https://github.com/4gray/iptvnator/issues/1189)) +- **matching** — Movies whose name is a short abbreviation — AKA, RRR, IO, VFW, Y2K — are no longer mistaken for a language tag and filed under their release year alone. They now match their own copies in your other playlists, so alternative sources, recommendations and pinned sources land on the right film instead of an unrelated one that happens to share that year. ([#1426](https://github.com/4gray/iptvnator/pull/1426)) +- **packaging** — Snap packages now launch correctly with the desktop runtime scripts required by their generated startup command. ([#1406](https://github.com/4gray/iptvnator/pull/1406)) +- **playback** — Unavailable streams no longer appear as unsupported codecs. When Video.js exposes a server error such as HTTP 404, the player shows that status; otherwise ambiguous source errors remain unidentified instead of guessing. ([#1314](https://github.com/4gray/iptvnator/pull/1314), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — The embedded MPV video no longer drifts out of its frame when the layout shifts around it — for example when the channel sidebar or the EPG panel finishes loading after playback has started. The player now notices such moves and snaps the video back into place within half a second. ([#1476](https://github.com/4gray/iptvnator/pull/1476), closes [#1428](https://github.com/4gray/iptvnator/issues/1428)) +- **playback** — MPV and VLC recovery actions now stay available, show precise opening, started, playing, and failure feedback, and prevent overlapping launches. The dock keeps Stop available when teardown is still needed and lets terminal errors be dismissed. ([#1388](https://github.com/4gray/iptvnator/pull/1388)) +- **playback** — The screen no longer dims or goes to sleep while a built-in player is playing video — including on Linux desktops, where the system idle timer used to ignore the app. Pausing or stopping hands control back to the system immediately, and radio playback deliberately leaves the display free to sleep. Works in both the desktop app and the PWA. ([#1405](https://github.com/4gray/iptvnator/pull/1405), closes [#1095](https://github.com/4gray/iptvnator/issues/1095)) +- **playback** — Playback keyboard shortcuts now work with the default player setup: Space/K (play/pause), F (fullscreen), ←/→ (seek 5s in VOD), ↑/↓ (volume), and M (mute) act on the built-in HTML5, Video.js, and ArtPlayer players without turning on shared player controls — matching what the in-app shortcut list already promised. ([#1398](https://github.com/4gray/iptvnator/pull/1398)) +- **playback** — Switching the video player — from the command palette or the settings page — now takes effect immediately on an already-playing Xtream or Stalker stream instead of waiting for the player to be reopened. Playback also starts with the saved player right away, without briefly mounting the default engine first. ([#1437](https://github.com/4gray/iptvnator/pull/1437)) +- **playback** — MPEG-TS playback is now more reliable on newer Safari versions when streams contain audio timestamp gaps. ([#1412](https://github.com/4gray/iptvnator/pull/1412)) +- **playback** — External MPV and the embedded MPV frame-copy engine no longer truncate HTTP headers that contain commas — most notably the Stalker MAG user agent. Strict portals validated that header and rejected live streams with HTTP 400, so channels that only worked in VLC now also play through MPV. Completes the same fix that landed for the native embedded MPV view. ([#1323](https://github.com/4gray/iptvnator/pull/1323), closes [#910](https://github.com/4gray/iptvnator/issues/910)) +- **playback** — When playback fails, IPTVnator now ranks useful next steps from the reported error, including another compatible built-in player, MPV/VLC, Retry, or another source. Trying a built-in recommendation affects only the current item and does not change the saved player setting. ([#1374](https://github.com/4gray/iptvnator/pull/1374), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — Playback recovery now removes old error actions as soon as a new source or player starts, even while Electron prepares stream headers. Stalker series playing inline now picks up refreshed episode names and navigation, and safely disables episode commands if the playing episode disappears. ([#1374](https://github.com/4gray/iptvnator/pull/1374)) +- **playback** — DASH playback now resets a failed media buffer before switching variants, avoiding repeated append failures and crashes on affected platforms. ([#1411](https://github.com/4gray/iptvnator/pull/1411)) +- **playback** — Playback recovery no longer crosses into a different selected channel, movie, or exact Stalker episode. Switching content while a stream resolves no longer restores stale playback or shows an error from the previous selection. ([#1374](https://github.com/4gray/iptvnator/pull/1374), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — Stalker streams that require the portal session now play in the built-in players (HTML5, Video.js, ArtPlayer), not only in VLC/MPV: the player's requests carry the portal cookie and token, scoped to that stream and dropped when the player closes or the channel changes. VOD, series and radio get the same headers live TV had — also from Favorites and Recently Viewed. ([#1335](https://github.com/4gray/iptvnator/pull/1335), closes [#849](https://github.com/4gray/iptvnator/issues/849), closes [#910](https://github.com/4gray/iptvnator/issues/910), closes [#732](https://github.com/4gray/iptvnator/issues/732)) +- **playback** — HLS failures now use confirmed player evidence such as the failed stage, timeout, and HTTP status. Recoverable retries stay silent, and technical details no longer include raw provider error payloads. ([#1316](https://github.com/4gray/iptvnator/pull/1316)) +- **playback** — MPEG-TS playback errors now show exact engine evidence, including HTTP status, without exposing provider response details. Format, codec, truncated-stream, and MediaSource failures now produce more accurate fallback guidance. ([#1327](https://github.com/4gray/iptvnator/pull/1327), closes [#1159](https://github.com/4gray/iptvnator/issues/1159)) +- **playback** — Shaka playback errors now use exact engine evidence, including subtitle parsing, preserve external-player fallback when browser prerequisites are missing, keep recoverable retries non-terminal, and omit provider URLs, credentials, and response data from technical details. ([#1318](https://github.com/4gray/iptvnator/pull/1318)) +- **playback** — The default web player now reports safer, more accurate streaming errors: confirmed network and encrypted-segment failures keep structured details, while ambiguous Video.js errors remain unknown instead of suggesting the wrong cause. ([#1317](https://github.com/4gray/iptvnator/pull/1317)) +- **playback** — The "Show subtitles" setting now works in the built-in players: turning it off hides subtitles a stream switched on by itself, and the preference finally applies on Xtream and Stalker pages too. Previously it only reached the M3U player, and even there Video.js and ArtPlayer ignored it. The player's own subtitle menu still overrides the setting for the current stream. ([#1269](https://github.com/4gray/iptvnator/pull/1269), closes [#1155](https://github.com/4gray/iptvnator/issues/1155)) +- **playback** — Video.js now shows its own control bar (play/pause, seek, volume, quality, fullscreen) on Live TV channels. Previously live streams played with no visible controls at all, because switching to a live source rebuilt the video element and the controls never came back. ([#1385](https://github.com/4gray/iptvnator/pull/1385)) +- **playlist** — Opening an .m3u/.m3u8 file from the command line or by double-clicking it now actually imports the playlist — previously nothing happened at all. Opening a playlist while IPTVnator is already running works too, and on macOS the file arrives through the system "open with" event. ([#1299](https://github.com/4gray/iptvnator/pull/1299)) +- **playlist** — IPTVnator now registers itself with the operating system as a handler for .m3u and .m3u8 files, so Finder, Explorer and Linux file managers offer it in "Open with" and a double-click actually opens the playlist. Installing or updating the app is enough — no manual file-type setup. ([#1301](https://github.com/4gray/iptvnator/pull/1301)) +- **playlists** — One unreachable playlist no longer holds up the rest. Refreshes give up after 30 seconds and run a few at a time, so your other playlists still update, and the message on startup names how many actually failed instead of always claiming success. ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#931](https://github.com/4gray/iptvnator/issues/931)) +- **portals** — Importing an Xtream backup now restores all preferred VOD sources together. If restoration or cleanup fails, the catalog stays retryable and remains blocked until the parked state is safely consumed, preventing stale replay from overwriting newer choices. ([#1311](https://github.com/4gray/iptvnator/pull/1311)) +- **portals** — Greek titles now match no matter which sigma the provider typed. A word-final `ς` and a medial `σ` at the end of a word are treated as the same letter, so finding a film in your other playlists, the "Similar" rail, actor filmographies and TMDB enrichment no longer miss a Greek movie purely because two catalogues spelled its last letter differently. ([#1310](https://github.com/4gray/iptvnator/pull/1310)) +- **portals** — In the self-hosted web version, a provider that accepted a connection and then went silent could hang a request until the operating system gave up, with no way to cancel it. Requests now time out on the same schedule as the desktop app, and a host that fails to answer twice is skipped for a short while instead of stalling every following request. ([#1424](https://github.com/4gray/iptvnator/pull/1424)) +- **portals** — Going back from a Stalker title you reached with "View in portal" now returns you to exactly where you were — the same favorites or history tab, with the title still open — instead of dropping you on the Live TV tab. ([#1435](https://github.com/4gray/iptvnator/pull/1435)) +- **portals** — Refreshing an Xtream source keeps your favorites, watch history, hidden categories and playback positions. Starting the same refresh twice at once — from the header and from the sources page — used to wipe them, because the second run saved an already-emptied catalog over the first run's copy. ([#1431](https://github.com/4gray/iptvnator/pull/1431)) +- **pwa** — The self-hosted web backend now gives each provider connection attempt enough time to fall back from an unreachable IPv6 route to working IPv4 — common behind VPN containers like Gluetun — instead of failing with a bare "Bad Gateway". Provider errors now name the underlying network code (for example ETIMEDOUT) in the app and in the container logs. ([#1404](https://github.com/4gray/iptvnator/pull/1404), closes [#1400](https://github.com/4gray/iptvnator/issues/1400)) +- **pwa** — Self-hosted web backends started without `CLIENT_URL` now allow the documented `http://localhost:4333` origin instead of the retired public demo URL, so a manual (non-Docker) deployment no longer fails every provider request with a CORS error. ([cb37f62](https://github.com/4gray/iptvnator/commit/cb37f628ed9d63673d365923828ce7a793192459)) +- **pwa** — The self-hosted web app now talks to Stalker portals exactly like the desktop app: MAG User-Agent, full STB cookie, serial-number header, and the `JsHttpRequest` marker every real client sends — so portals that worked only in the desktop app now work in the PWA too. Portal credentials (MAC and session token) no longer travel in the portal request URL, keeping them out of server logs. ([#1348](https://github.com/4gray/iptvnator/pull/1348)) +- **search** — The search box no longer loses what you are typing when the page updates its address at the same moment — switching a downloads filter and immediately typing used to wipe the term, and fast typing could snap back to an earlier word. ([#1432](https://github.com/4gray/iptvnator/pull/1432)) +- **search** — Searching for names that carry punctuation inside them — "A&E", "X-Men", "L'Equipe" — finds them anywhere in a title, including channels the provider prefixes, like "US: A&E". ([#1263](https://github.com/4gray/iptvnator/pull/1263), closes [#1161](https://github.com/4gray/iptvnator/issues/1161)) +- **search** — Typing a space in the portal search box and pausing briefly no longer deletes the space — continuing to type "Bein Sports" no longer collapses into "BeinSports". ([#1474](https://github.com/4gray/iptvnator/pull/1474), closes [#1338](https://github.com/4gray/iptvnator/issues/1338)) +- **settings** — Launching IPTVnator a second time now brings the running window to the front instead of starting a rival copy that could not save anything — a common reason settings appeared to reset on restart. If saving or loading settings does fail, the app now says so instead of silently showing defaults. ([#1272](https://github.com/4gray/iptvnator/pull/1272), closes [#1156](https://github.com/4gray/iptvnator/issues/1156), closes [#102](https://github.com/4gray/iptvnator/issues/102)) +- **settings** — Unsaved settings edits no longer vanish silently when you close the window, quit the app, or reload the page. The desktop app now asks whether to save, discard, or keep editing — the same dialog in-app navigation shows — and only closes once your choice is applied; a failed save keeps the window open. In the browser, the native leave-page warning appears instead. ([#1394](https://github.com/4gray/iptvnator/pull/1394)) +- **stalker** — A Stalker portal is no longer re-probed and reclassified because something in front of it — a proxy or firewall, not the portal — answered with a short "Access denied" page. Only the portal's own authorization replies count now. ([#1358](https://github.com/4gray/iptvnator/pull/1358)) +- **stalker** — Stalker portals now receive channel commands exactly as a real set-top box sends them: already-encoded parts of a channel's `cmd` are no longer double-encoded, so strict portals and reseller panels that compare the command literally work again. Playing Stalker channels from Favorites or global collections now also handles portals that answer with relative stream paths. ([#1334](https://github.com/4gray/iptvnator/pull/1334)) +- **stalker** — Series opened from Favorites, Recent or the dashboard show their current episodes. One saved back when a single episode existed used to keep showing that one episode forever; the list is refreshed from the portal in the background instead. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **stalker** — Stalker portals are no longer classified by their URL shape: importing probes the real API endpoint (`portal.php` vs `server/load.php`) and checks whether the portal actually requires authentication. Canonical Ministra URLs finally load content, `…/c` addresses resolve correctly, and misclassified existing portals repair themselves on first failure — keeping favorites and history. ([#1344](https://github.com/4gray/iptvnator/pull/1344), closes [#850](https://github.com/4gray/iptvnator/issues/850), closes [#686](https://github.com/4gray/iptvnator/issues/686), closes [#755](https://github.com/4gray/iptvnator/issues/755)) +- **stalker** — Stalker Live TV now shows the currently airing programme even on portals whose bulk EPG only lists upcoming shows: channel rows fall back to a per-channel short-EPG lookup, and the EPG panel merges "what's on now" into the schedule instead of showing future programmes only. ([#1386](https://github.com/4gray/iptvnator/pull/1386)) +- **playback** — Stalker live TV plays again in the embedded MPV player. The MAG250 user agent contains a comma (`KHTML, like Gecko`), which MPV splits in its comma-separated `--http-header-fields` list, truncating `X-User-Agent` so strict portals reject the stream with HTTP 400. Commas and backslashes in header values are now escaped on the Windows/Linux and macOS embedded-MPV paths. ([#1321](https://github.com/4gray/iptvnator/pull/1321)) +- **stalker** — Stalker portals whose server redirects to https or to another port no longer lose their session mid-request. Since 0.22 such redirects silently dropped the portal's MAC cookie and auth token, so categories failed to load and streams never reached any player. Downgrade redirects from https to plain http still strip credentials, so a secure session is never sent in cleartext. ([#1322](https://github.com/4gray/iptvnator/pull/1322), closes [#1158](https://github.com/4gray/iptvnator/issues/1158)) +- **stalker** — Stalker VOD series now report progress correctly when portals return boolean series flags, keep episode progress separate between shows, and resume positions saved by earlier versions. ([#1315](https://github.com/4gray/iptvnator/pull/1315)) +- **stalker** — Stalker channels that the portal serves directly now start without an extra link request to the portal, so they open faster and no longer fail when that request does. Channels the portal does proxy still get their temporary link, and radio stations the portal proxies now get one too instead of playing a URL the portal never meant to serve. ([#1364](https://github.com/4gray/iptvnator/pull/1364)) +- **tmdb** — Movies whose provider ships a dead or wrong TMDB id are enriched again. The id is weighed against the title and release year: a dead one falls back to the title search, a stale one that clearly points at another film loses to it, and a working id is no longer thrown away just because the provider spells the title differently. ([#1239](https://github.com/4gray/iptvnator/pull/1239)) +- **tmdb** — Series detail pages now list the cast of the whole show instead of only its newest season, so actors who left partway through stop disappearing from long-running shows — while people who joined for the current season still show up. ([#1242](https://github.com/4gray/iptvnator/pull/1242)) +- **tmdb** — Titles that providers dress up with language or quality tags — "|ALB| Fallout", "4K-DE - The Pitt (2025)", "Breaking Bad-eng" — now match against TMDB, so they get artwork, plot and cast like the rest of the catalog. Shows split into one entry per season also pull the season that entry really contains. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **ui** — IPTVnator is usable on a phone again. The navigation bar no longer sits off screen, category and channel lists take the full width instead of squeezing the content into a sliver, the video keeps a usable share of the screen, and the M3U channel list can be reopened after hiding it. ([#1326](https://github.com/4gray/iptvnator/pull/1326), closes [#1100](https://github.com/4gray/iptvnator/issues/1100)) +- **ui** — Narrow EPG channel rows now keep the current programme, progress, and enabled channel actions visible instead of dropping useful context. ([#1312](https://github.com/4gray/iptvnator/pull/1312)) +- **window-controls** — On Windows, the minimize, maximize and close buttons disappeared for good after leaving fullscreen video playback — the only way to get them back was to restart the app. They now reappear as soon as you exit fullscreen, and the maximize button no longer gets stuck on the wrong icon afterwards. ([#1178](https://github.com/4gray/iptvnator/pull/1178)) +- **workspace** — The playlist dropdown in the header shows a "Playlist info" entry for the active playlist again, next to "Account info" and "Add playlist" — it had disappeared when playlist actions moved into the per-row menu. ([#1328](https://github.com/4gray/iptvnator/pull/1328)) +- **workspace** — The playlist sync overlay no longer shows a bare "Syncing playlist" card when an Xtream playlist is loaded from the local library. Reading the saved catalog from this device now reports its own phase, so the overlay always shows a source badge and explains what is happening — remote fetch or local read. ([#1345](https://github.com/4gray/iptvnator/pull/1345)) +- **xtream** — Portals sitting behind Cloudflare or a similar firewall connect again. Those setups answered the app with a challenge page instead of data, so "Test connection" failed on portals that worked fine in every other player; requests now identify themselves the way an ordinary IPTV player does. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +- **xtream** — Series pages no longer show a raw image link under the season tabs when the provider fills the season description with a cover URL. URL-only descriptions are dropped, and with TMDB metadata enabled the missing season description is filled from TMDB instead. ([#1382](https://github.com/4gray/iptvnator/pull/1382)) +- **xtream** — Xtream movies remain playable when a portal omits extended VOD metadata, using catalog stream details to build the playback URL. ([#1303](https://github.com/4gray/iptvnator/pull/1303)) + +## Performance + +- **m3u** — Importing large M3U playlists is faster because IPTVnator no longer rewrites the entire playlist when loading saved favorites. ([#1232](https://github.com/4gray/iptvnator/pull/1232)) +- **m3u** — Cancelling a large M3U refresh now stops its background worker before parsed channels can be copied or saved, keeping the interface responsive and leaving the existing playlist unchanged. ([#1268](https://github.com/4gray/iptvnator/pull/1268)) +- **portals** — Unreachable Xtream and Stalker portals no longer cost a 30-second wait per request. After a host fails to answer twice, further requests to it fail immediately for 30 seconds, so browsing a dead portal stops filling the screen with long spinners. Retrying, testing the connection, or editing the portal address contacts it again right away. ([#1421](https://github.com/4gray/iptvnator/pull/1421)) +- **stalker** — Detail pages for anything that is not a series — a movie, a live channel, a VOD item that only looks like a series — no longer fire an episode-list request before they can show anything, so they open faster on every route in, from browsing and search to Favorites, Recent and the dashboard. ([#1263](https://github.com/4gray/iptvnator/pull/1263)) +