diff --git a/.changes/collections-open-live-channel-in-playlist.md b/.changes/collections-open-live-channel-in-playlist.md deleted file mode 100644 index 76862304f..000000000 --- a/.changes/collections-open-live-channel-in-playlist.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: collections ---- - -A live channel you watch from Favorites or Recently viewed now says which playlist it belongs to: a chip with the playlist name sits in the programme panel next to the channel, and clicking it (or "Open in " in the channel's right-click menu) jumps to that channel inside its own playlist. Works for Xtream and M3U sources; Stalker follows in a later release. diff --git a/.changes/collections-open-stalker-live-channel-in-playlist.md b/.changes/collections-open-stalker-live-channel-in-playlist.md deleted file mode 100644 index 5295e1b16..000000000 --- a/.changes/collections-open-stalker-live-channel-in-playlist.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: collections ---- - -"Open in " for live channels in Favorites and Recently viewed now works for Stalker portals too: the chip in the programme panel and the channel's right-click menu jump to that channel inside its portal's Live TV, with its category selected and the channel playing. Radio stations keep the existing behaviour. diff --git a/.changes/collections-scope-switch-feedback.md b/.changes/collections-scope-switch-feedback.md deleted file mode 100644 index 8e29d48a9..000000000 --- a/.changes/collections-scope-switch-feedback.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: collections ---- - -Switching Favorites or Recently Viewed between "This playlist" and "All -playlists" now shows a thin progress bar under the header and dims the list -while the new items load, instead of leaving the old list on screen with no -sign that anything happened. The toggle reflects your choice at once, a -playing channel keeps playing, and quick switches show no indicator at all. diff --git a/.changes/dashboard-continue-watching-meta.md b/.changes/dashboard-continue-watching-meta.md deleted file mode 100644 index 4c2525bd2..000000000 --- a/.changes/dashboard-continue-watching-meta.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: dashboard ---- - -The dashboard no longer labels every title with "Xtream · Series" or "Stalker · Movie": the hero shows only the source name, and Continue Watching cards show the episode you are on plus the minutes left. Stalker shows filed under Movies now get that S·E badge, the progress bar, and a working "Resume episode" that opens the show at the saved episode. diff --git a/.changes/dashboard-live-epg-timestamp-units.md b/.changes/dashboard-live-epg-timestamp-units.md deleted file mode 100644 index a5b267810..000000000 --- a/.changes/dashboard-live-epg-timestamp-units.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: internal -area: dashboard ---- - -The dashboard's live "now playing" time range and progress bar now read -pre-computed EPG timestamps as unix seconds, matching the rest of the EPG -code. Today's dashboard lookups never carry those fields, so nothing changes -on screen; this closes the gap before a future data path supplies them. diff --git a/.changes/dashboard-live-rails-epg-any-source.md b/.changes/dashboard-live-rails-epg-any-source.md deleted file mode 100644 index e0dce1935..000000000 --- a/.changes/dashboard-live-rails-epg-any-source.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: dashboard ---- - -The dashboard's "Now on air on favorite channels" and "Recently watched Live -TV" rails now show the current programme for channels whose guide lives in an -XMLTV another playlist imported, not only in the global EPG sources from -Settings — the same lookup the "See all" pages already used. diff --git a/.changes/dashboard-portal-live-epg.md b/.changes/dashboard-portal-live-epg.md deleted file mode 100644 index 6b4547213..000000000 --- a/.changes/dashboard-portal-live-epg.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: feature -area: dashboard ---- - -On the desktop app, favourite and recently watched Xtream and Stalker channels -on the dashboard now show what is on air, with the programme's time and -progress. Each card asks its portal only once it scrolls into view and fills in -on its own, so a slow portal never holds up the page or the other cards. diff --git a/.changes/database-catalog-write-batches.md b/.changes/database-catalog-write-batches.md deleted file mode 100644 index ce695f522..000000000 --- a/.changes/database-catalog-write-batches.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: perf -area: database -issues: [1292] ---- - -Refreshing or removing a large Xtream playlist is several times faster: the -"Removing cached content" stage and the re-import now commit around 5,000 -rows at a time instead of 100, and progress updates arrive at most ten times a -second instead of once per batch. diff --git a/.changes/database-skipped-release-upgrades.md b/.changes/database-skipped-release-upgrades.md deleted file mode 100644 index 2e972dc95..000000000 --- a/.changes/database-skipped-release-upgrades.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: database -issues: [1580] ---- - -Updating directly from older versions no longer blocks playlist loading with a missing database column error. Existing sources, favorites, and playback history are preserved. diff --git a/.changes/deps-angular-22-nx-23.md b/.changes/deps-angular-22-nx-23.md deleted file mode 100644 index 586a84061..000000000 --- a/.changes/deps-angular-22-nx-23.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: internal -area: deps ---- - -The application uses Angular 22 and Nx 23 with updated build and test tooling. diff --git a/.changes/deps-node-gyp-devdependency.md b/.changes/deps-node-gyp-devdependency.md deleted file mode 100644 index b467983fc..000000000 --- a/.changes/deps-node-gyp-devdependency.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: internal -area: deps ---- - -The Embedded MPV native addon build now declares its `node-gyp` dependency -explicitly, so `node apps/electron-backend/build-embedded-mpv.js` and the -Homebrew development scripts work on a clean checkout instead of failing with -"Unable to resolve node-gyp". Packaged builds are unchanged. diff --git a/.changes/deps-security-2026-09.md b/.changes/deps-security-2026-09.md deleted file mode 100644 index b4e300c8f..000000000 --- a/.changes/deps-security-2026-09.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: internal -area: deps ---- - -Closes the eight open Dependabot alerts of September 2026: astro 7.2.4 → 7.2.10 -(website build), and pinned pnpm overrides moving js-yaml to 4.3.2 (the one -runtime path, via electron-updater), smol-toml to 1.7.1, svgo to 4.1.0 and hono -to 4.13.5. No application behavior changes. diff --git a/.changes/deps-transitive-cve-overrides.md b/.changes/deps-transitive-cve-overrides.md deleted file mode 100644 index 4a1234242..000000000 --- a/.changes/deps-transitive-cve-overrides.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: internal -area: deps ---- - -Closes the four open Dependabot alerts on transitive npm dependencies via -pinned pnpm overrides: browserslist (crash on untrusted stats), @xmldom/xmldom -(XML fragment injection — its existing override target had itself fallen into -the advisory range), @humanfs/node (recursive copy follows symlinks out of the -tree) and postcss-selector-parser (AST recursion DoS). diff --git a/.changes/downloads-xtream-archive.md b/.changes/downloads-xtream-archive.md deleted file mode 100644 index 3d0c4b0c2..000000000 --- a/.changes/downloads-xtream-archive.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: downloads ---- - -Download completed Xtream catch-up programmes as TS files from Live TV programme details. Find them in Downloads with the channel and broadcast date and play them offline. Interrupted archive downloads restart from the beginning. diff --git a/.changes/embedded-mpv-extra-options-reconnect.md b/.changes/embedded-mpv-extra-options-reconnect.md deleted file mode 100644 index 8e5d60152..000000000 --- a/.changes/embedded-mpv-extra-options-reconnect.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: embedded-mpv -highlight: Embedded MPV reconnects dropped streams ---- - -The embedded MPV player now reloads a live stream that drops mid-playback on -its own, with increasing delays and an "attempt N of 6" line instead of a -dead error screen; a new Settings > Playback toggle turns this off. The same -section gains an advanced field for extra libmpv options (one key=value per -line) that applies on every engine, with a short network timeout on by default. diff --git a/.changes/embedded-mpv-no-ytdl-hook.md b/.changes/embedded-mpv-no-ytdl-hook.md deleted file mode 100644 index 273e28c7d..000000000 --- a/.changes/embedded-mpv-no-ytdl-hook.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: embedded-mpv ---- - -When a stream refuses the connection, the embedded MPV player (frame-copy -engine) no longer hands the URL to yt-dlp before giving up: the failure -shows up right away and its error no longer reads "youtube-dl failed: -unexpected error occurred", matching the native-view engines and the -external MPV player. diff --git a/.changes/epg-copy-archive-url.md b/.changes/epg-copy-archive-url.md deleted file mode 100644 index 36ef5fd2f..000000000 --- a/.changes/epg-copy-archive-url.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: epg ---- - -Copy a catch-up programme’s URL from its EPG details in Xtream and supported M3U sources, including Favorites and Recent, without interrupting playback. The link can be used in an external player or download tool. diff --git a/.changes/epg-display-offset.md b/.changes/epg-display-offset.md deleted file mode 100644 index f90a8987a..000000000 --- a/.changes/epg-display-offset.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: feature -area: epg -issues: [50] ---- - -EPG settings now include a display-only time offset, making it easy to correct provider feeds with missing or incorrect timezone information without re-importing the guide. diff --git a/.changes/epg-double-gzip.md b/.changes/epg-double-gzip.md deleted file mode 100644 index 51f35e458..000000000 --- a/.changes/epg-double-gzip.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: epg -issues: [1586] ---- - -EPG guides now load when a server adds gzip compression to an already compressed XMLTV file. Sources using a single gzip layer continue to work. diff --git a/.changes/epg-import-panel-polish.md b/.changes/epg-import-panel-polish.md deleted file mode 100644 index 7e102563d..000000000 --- a/.changes/epg-import-panel-polish.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: epg ---- - -The EPG import panel no longer shows a horizontal scrollbar while sources download. Source names now read as host/file instead of running the two together, channel and programme counts use your locale's digit grouping, and the minimize button and summary are translated. diff --git a/.changes/epg-local-xmltv-sources.md b/.changes/epg-local-xmltv-sources.md deleted file mode 100644 index e609a2840..000000000 --- a/.changes/epg-local-xmltv-sources.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: feature -area: epg -highlight: Local XMLTV files as EPG sources ---- - -EPG sources no longer have to be URLs: point Settings → EPG or a playlist's EPG list at an XMLTV file on your computer, by absolute path, `file://` link, or the new folder button. Plain `.xml` and gzip `.xml.gz` both work. A typed path is confirmed once in a native dialog before it is read; the settings page spells out the accepted formats with examples. diff --git a/.changes/epg-programme-guide.md b/.changes/epg-programme-guide.md deleted file mode 100644 index 03da9d351..000000000 --- a/.changes/epg-programme-guide.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -type: feature -area: epg -issues: [171] -highlight: Programme guide, rebuilt ---- - -The programme guide now shows your playlist's own channels in their order, -with the current group or favorites one click away. Click a channel to -switch playback while the player stays on screen above the grid; -double-click switches and closes. Open it from the new Guide button, the -header, the command palette, or the G key. Hide channels without EPG and -pick comfortable or compact rows. diff --git a/.changes/epg-removed-source-cache.md b/.changes/epg-removed-source-cache.md deleted file mode 100644 index b2f7bd281..000000000 --- a/.changes/epg-removed-source-cache.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: epg ---- - -Removing and saving an EPG source now clears its cached programmes, including data left by previously removed sources on restart. Other configured sources and playlist guides are preserved, and Live TV stops showing programmes from the removed source. diff --git a/.changes/epg-timeline-compact-controls.md b/.changes/epg-timeline-compact-controls.md deleted file mode 100644 index 6acf207c3..000000000 --- a/.changes/epg-timeline-compact-controls.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: epg ---- - -The EPG timeline toolbar is more compact: "Now" is an icon button, and the zoom slider is replaced by a single button that cycles day overview → by hour → detailed. Ctrl/⌘ + scroll (or a trackpad pinch) over the timeline zooms smoothly around the cursor. The channel and programme title now use all the space the controls free up. diff --git a/.changes/host-health-live-trial.md b/.changes/host-health-live-trial.md deleted file mode 100644 index 482435dff..000000000 --- a/.changes/host-health-live-trial.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: host-health -issues: [1439] ---- - -Portal recovery now waits for an active probe to finish before sending another request, even when redirects or a slow response take longer than 45 seconds. Completed and cancelled requests release the probe slot reliably. diff --git a/.changes/live-tv-hidden-channel-list.md b/.changes/live-tv-hidden-channel-list.md deleted file mode 100644 index 108e7fee0..000000000 --- a/.changes/live-tv-hidden-channel-list.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: live-tv -issues: [1458] ---- - -A hidden channel list no longer looks like a playlist that lost its channels: the player now says the list is hidden and offers a "Show channels list" button, a toggle in the workspace header stays in place in both states, and hiding the list in one place (M3U player, portal Live TV, favorites/recent) no longer hides it everywhere else. diff --git a/.changes/m3u-clearkey-base64.md b/.changes/m3u-clearkey-base64.md deleted file mode 100644 index 245c4f153..000000000 --- a/.changes/m3u-clearkey-base64.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: m3u ---- - -ClearKey channels with ordinary Base64 keys now play when imported or refreshed, including JSON playlist exports that use + and / characters. Refresh an existing playlist once to apply the fix. diff --git a/.changes/m3u-collection-drm.md b/.changes/m3u-collection-drm.md deleted file mode 100644 index 76318a744..000000000 --- a/.changes/m3u-collection-drm.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: m3u -issues: [1590] ---- - -DASH channels, including ClearKey-protected streams, now play from Recently Viewed and Favorites using the compatible built-in player. Existing imports keep their DRM keys without needing to re-import the playlist. diff --git a/.changes/m3u-url-user-agent.md b/.changes/m3u-url-user-agent.md deleted file mode 100644 index bcc5e04b1..000000000 --- a/.changes/m3u-url-user-agent.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: m3u -issues: [465, 1120] ---- - -M3U URL imports now accept a custom User-Agent for providers that require it before downloading the playlist. The value is saved and reused for playlist refreshes in the desktop app and self-hosted web app. diff --git a/.changes/m3u-vod-playback-mode.md b/.changes/m3u-vod-playback-mode.md deleted file mode 100644 index 3bfe2dd46..000000000 --- a/.changes/m3u-vod-playback-mode.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: m3u ---- - -Movies and episodes recognized as video files in M3U playlists now offer playback time and seeking in built-in players, even when TMDB or movie details are disabled. Seeking remains dependent on the source's support. diff --git a/.changes/migration-legacy-electron-profiles.md b/.changes/migration-legacy-electron-profiles.md deleted file mode 100644 index d8d3b00dc..000000000 --- a/.changes/migration-legacy-electron-profiles.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: migration -issues: [1504] ---- - -Upgrades from older desktop versions retain all sources from the legacy profile. Already-upgraded users can choose to recover missing sources without replacing current sources or settings. Migration keeps the original data and retries safely after a failed write. diff --git a/.changes/migration-startup-feedback.md b/.changes/migration-startup-feedback.md deleted file mode 100644 index 97abad880..000000000 --- a/.changes/migration-startup-feedback.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: migration ---- - -Startup now shows a theme-aware preparation screen while loading sources and checking a large programme guide. Temporary source-read failures retry automatically; if loading still fails, you can retry without restarting the app. Recovery also completes any previously failed programme-guide cleanup before opening the library. diff --git a/.changes/packaging-appmanager-metadata.md b/.changes/packaging-appmanager-metadata.md deleted file mode 100644 index bd052761a..000000000 --- a/.changes/packaging-appmanager-metadata.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: packaging ---- - -AppImage builds now include an update source for AppManager, allowing it to discover new GitHub releases and download full application updates without manually configuring the repository. diff --git a/.changes/playback-controls-hide-after-button-click.md b/.changes/playback-controls-hide-after-button-click.md deleted file mode 100644 index 39a6cc15b..000000000 --- a/.changes/playback-controls-hide-after-button-click.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -The built-in player controls now hide on their own after you click a button -in the bar with the mouse, such as fullscreen or mute. Previously the clicked -button kept the bar pinned on screen until you clicked the video, which also -paused it. Applies to the shared controls in the web players and the -Embedded MPV frame-copy engine. diff --git a/.changes/playback-diagnostic-details.md b/.changes/playback-diagnostic-details.md deleted file mode 100644 index 9be70d132..000000000 --- a/.changes/playback-diagnostic-details.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: playback ---- - -Playback errors now explain confirmed access and DRM license failures, with stream codecs, DRM systems and failure stages in the details. Copy diagnostics creates a support report without stream URLs or credentials. No extra requests are made to your provider. diff --git a/.changes/playback-embedded-mpv-seek-steps.md b/.changes/playback-embedded-mpv-seek-steps.md deleted file mode 100644 index d8dd4bb7e..000000000 --- a/.changes/playback-embedded-mpv-seek-steps.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -Arrow keys and the ±10 s buttons in the Embedded MPV player now move by their -full step every time. Pressing an arrow repeatedly, or holding it, used to -advance only about a second per press because each step was computed from a -stale position; steps are now relative seeks executed by mpv itself, so rapid -presses add up. diff --git a/.changes/playback-fullscreen-channel-panel.md b/.changes/playback-fullscreen-channel-panel.md deleted file mode 100644 index 4ab8066fc..000000000 --- a/.changes/playback-fullscreen-channel-panel.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -type: feature -area: playback -issues: [48] -highlight: Channel list in fullscreen ---- - -Rest the mouse on the left edge (tap it on touch) or press C while a live -channel plays fullscreen: the channel list (M3U all/groups/favorites/recent, -Xtream, Stalker, global favorites) slides over the video with search, so you -can zap without leaving fullscreen. Nothing covers the video while it is -closed. M3U playlists also zap with PageUp/PageDown. diff --git a/.changes/playback-fullscreen-episode-panel.md b/.changes/playback-fullscreen-episode-panel.md deleted file mode 100644 index 543272186..000000000 --- a/.changes/playback-fullscreen-episode-panel.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: feature -area: playback -highlight: Episode list in fullscreen ---- - -Series playback now has the slide-in list in fullscreen too: rest the mouse on the left edge, click it, or press C to see the season tabs and episodes with stills, runtimes, descriptions and watch progress, and jump to another episode without leaving fullscreen. Works for Xtream and Stalker series with any built-in player. diff --git a/.changes/playback-fullscreen-panel-edge-hint.md b/.changes/playback-fullscreen-panel-edge-hint.md deleted file mode 100644 index 61f60c7bd..000000000 --- a/.changes/playback-fullscreen-panel-edge-hint.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -The fullscreen channel list is easier to find and calmer to use: moving the mouse shows a small tab on the left edge, a click on that edge opens the list at once, hover still opens it after a short rest, and the list now stays open for a full second after the mouse leaves. Opened with `C`, it no longer closes while the mouse only wanders over the video. diff --git a/.changes/playback-fullscreen-panel-hover.md b/.changes/playback-fullscreen-panel-hover.md deleted file mode 100644 index 36b9c34f1..000000000 --- a/.changes/playback-fullscreen-panel-hover.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -The fullscreen channel panel stays open under the pointer when its opening animation is delayed, instead of closing before the list appears. diff --git a/.changes/playback-fullscreen-survives-episode-switch.md b/.changes/playback-fullscreen-survives-episode-switch.md deleted file mode 100644 index 861bf88db..000000000 --- a/.changes/playback-fullscreen-survives-episode-switch.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -With the default shared player controls, the built-in player now stays in -fullscreen when you switch to another episode, when the next episode starts -automatically, and when a live channel or an alternative movie source is -switched — previously every switch dropped back to the page. The legacy -vendor-controls opt-out keeps its previous behavior. diff --git a/.changes/playback-legacy-pip-teardown.md b/.changes/playback-legacy-pip-teardown.md deleted file mode 100644 index a0ef28472..000000000 --- a/.changes/playback-legacy-pip-teardown.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playback ---- - -Switching channels or leaving playback now closes the old picture-in-picture window in HTML5, Video.js, and ArtPlayer even when shared player controls are disabled, preventing frozen or outdated video from remaining on top. This includes Safari’s legacy picture-in-picture mode. diff --git a/.changes/playback-light-theme-panels.md b/.changes/playback-light-theme-panels.md deleted file mode 100644 index 908c75598..000000000 --- a/.changes/playback-light-theme-panels.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: playback -issues: [1530] ---- - -Embedded MPV controls and programme-guide panels now follow the visual theme and stay readable in light and dark mode. Video overlays retain their contrasting dark backgrounds. diff --git a/.changes/playback-native-container-routing.md b/.changes/playback-native-container-routing.md deleted file mode 100644 index a70f3312a..000000000 --- a/.changes/playback-native-container-routing.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: playback ---- - -The built-in HTML5 player now plays `.mkv`, `.webm`, `.avi`, `.mov` and other -non-HLS video files directly instead of handing them to the HLS engine, which -failed with a "network or provider loading error" on many Xtream episodes and -movies. ArtPlayer and the HTML5 player now choose their engine by the same rule. diff --git a/.changes/playback-shortcuts-after-button-click.md b/.changes/playback-shortcuts-after-button-click.md deleted file mode 100644 index 0067f1a7a..000000000 --- a/.changes/playback-shortcuts-after-button-click.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -Keyboard shortcuts work again right after you click a button in the built-in -player controls. Previously the clicked button kept the keyboard: after -clicking fullscreen, Space left fullscreen instead of pausing, and the seek, -volume and mute keys did nothing until you clicked the video. Applies to the -shared controls in the web players and the Embedded MPV frame-copy engine. diff --git a/.changes/playback-videojs-shortcuts-after-button-click.md b/.changes/playback-videojs-shortcuts-after-button-click.md deleted file mode 100644 index 6a9e38625..000000000 --- a/.changes/playback-videojs-shortcuts-after-button-click.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: playback ---- - -With IPTVnator's shared controls turned off, the Video.js player's keyboard -shortcuts now work again right after you click a button in its control bar. -Previously the clicked button kept the keyboard: after clicking fullscreen, -Space left fullscreen instead of pausing, and the seek, volume and mute keys -did nothing until you clicked the video. diff --git a/.changes/playback-vlc-windows-console.md b/.changes/playback-vlc-windows-console.md deleted file mode 100644 index c29a9b86a..000000000 --- a/.changes/playback-vlc-windows-console.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: playback -issues: [871] ---- - -VLC now opens without an extra console window on Windows when playback progress tracking or Reuse VLC instance is enabled. diff --git a/.changes/player-stream-info-popover.md b/.changes/player-stream-info-popover.md deleted file mode 100644 index 9c1ed8b46..000000000 --- a/.changes/player-stream-info-popover.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: feature -area: playback -highlight: See what a stream really is while it plays ---- - -The player overlay now shows stream information: resolution, playback and source -frame rates, stream and codec bitrates, audio details, buffer and dropped frames. -Available in built-in web players and experimental frame-copy Embedded MPV. -Unknown or unavailable values stay hidden; measured frame rates reflect dropped frames and -stalls. diff --git a/.changes/playlist-inactive-source-cleanup.md b/.changes/playlist-inactive-source-cleanup.md deleted file mode 100644 index 0c1703673..000000000 --- a/.changes/playlist-inactive-source-cleanup.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: playlist ---- - -Desktop users can review inactive sources and delete selected ones together. The dialog checks the whole library, preselects confirmed expired or disabled accounts, and lets you keep individual sources. Busy sources are skipped, and deletion results are reported individually. diff --git a/.changes/playlist-network-source-status.md b/.changes/playlist-network-source-status.md deleted file mode 100644 index d5efc01db..000000000 --- a/.changes/playlist-network-source-status.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: playlist ---- - -Desktop playlist lists now show availability for Stalker portals and M3U links alongside Xtream accounts. Checks share cached results, run in the background, and explain when a source could not be verified. diff --git a/.changes/playlists-refresh-catalog-read.md b/.changes/playlists-refresh-catalog-read.md deleted file mode 100644 index aaa852144..000000000 --- a/.changes/playlists-refresh-catalog-read.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: playlists ---- - -Opening an M3U playlist immediately after refreshing now waits for its pending save, so the channel list does not revert to the previous catalog. diff --git a/.changes/portal-mark-movie-watched.md b/.changes/portal-mark-movie-watched.md deleted file mode 100644 index 37f0c5ce3..000000000 --- a/.changes/portal-mark-movie-watched.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: portal ---- - -Movies can now be marked as watched (or unwatched) by hand from their -detail page on Xtream and Stalker sources, including the Favorites and -Recently Viewed views — the same way seasons and episodes already could. The -catalog shows the green check right away, and a watched movie offers Play -instead of a Resume near the end. diff --git a/.changes/portal-season-dropdown-posters.md b/.changes/portal-season-dropdown-posters.md deleted file mode 100644 index f6348eb46..000000000 --- a/.changes/portal-season-dropdown-posters.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: portal ---- - -Series with more than six seasons now show a small season poster in the season -dropdown — on each row that has one and on the closed selector — so a long -list of "Season N" entries is easier to scan. The fullscreen episode panel's -season strip also gets its own "N episodes" translation instead of borrowing -the download manager's. diff --git a/.changes/portal-season-posters.md b/.changes/portal-season-posters.md deleted file mode 100644 index a605db813..000000000 --- a/.changes/portal-season-posters.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: portal -highlight: Season posters ---- - -Series pages now show each season's own poster next to the season tabs, and -the fullscreen episode list shows it above its tabs too. The picture comes -from TMDB when metadata enrichment is on, otherwise from your provider's -season art; one-season shows keep the page as it was. diff --git a/.changes/portals-concurrent-connectivity-failures.md b/.changes/portals-concurrent-connectivity-failures.md deleted file mode 100644 index 8b4324169..000000000 --- a/.changes/portals-concurrent-connectivity-failures.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: portals -issues: [1438] ---- - -Xtream and Stalker portals no longer enter a connection cooldown merely because several parallel requests fail in the same millisecond. This fixes false unavailability in both the desktop app and the self-hosted web version. diff --git a/.changes/portals-connectivity-setting.md b/.changes/portals-connectivity-setting.md deleted file mode 100644 index 65acde25c..000000000 --- a/.changes/portals-connectivity-setting.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: feature -area: portals ---- - -Desktop settings now let you disable the temporary pause after repeated Xtream or Stalker connection failures, without restarting. Account info explains when requests are paused and offers an immediate retry. diff --git a/.changes/portals-live-channel-return.md b/.changes/portals-live-channel-return.md deleted file mode 100644 index a5e093a3e..000000000 --- a/.changes/portals-live-channel-return.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: portals -issues: [1520] ---- - -Xtream and Stalker keep remote channel order while you browse other categories or search. Use Show playing channel to return to the current channel without restarting playback. Stalker radio supports the same behavior. diff --git a/.changes/portals-live-panel-collapse-levels.md b/.changes/portals-live-panel-collapse-levels.md deleted file mode 100644 index bec26b05d..000000000 --- a/.changes/portals-live-panel-collapse-levels.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: portals ---- - -Live TV panels now fold in steps: hide only the categories rail and keep the -channel list, or hide both for a player-only view. With categories hidden, the -list header becomes a category dropdown, so switching categories stays one -click away, and hiding both panels then bringing them back returns to the -level you had before. diff --git a/.changes/portals-posters-only-wall.md b/.changes/portals-posters-only-wall.md deleted file mode 100644 index ffe70c2df..000000000 --- a/.changes/portals-posters-only-wall.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: feature -area: portals -highlight: Posters-only cover wall ---- - -Movie and series grids can now drop the title row: turn off "Show titles under covers" in Settings > General and the catalog, favorites and recent grids become a wall of covers that shows more rows per screen. The title slides in on the cover when you point at it or focus it with the keyboard, and stays on for items whose cover is missing. Live channels and search results keep their labels. diff --git a/.changes/portals-slow-panel-not-dead.md b/.changes/portals-slow-panel-not-dead.md deleted file mode 100644 index fc77e38d9..000000000 --- a/.changes/portals-slow-panel-not-dead.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -type: fix -area: portals ---- - -A slow Xtream or Stalker panel is no longer mistaken for a dead one: a request -that reached the panel and then timed out no longer trips the 30-second -"portal is not responding" pause, which only fires when the panel never -accepts the connection. The desktop app also gives IPv4 fallback the same -2.5-second budget as the self-hosted backend, so dual-stack panels behind -VPNs stop failing in bursts. diff --git a/.changes/search-turkish-case-folding.md b/.changes/search-turkish-case-folding.md deleted file mode 100644 index 05a94724a..000000000 --- a/.changes/search-turkish-case-folding.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: search -issues: [609] ---- - -Search now returns the same results whether you type upper or lower case Turkish characters. Titles with the dotted capital I (for example "İnşaat") are found by typing a plain lower case i, so "inş" and "İnş" match the same channels and movies — in global search, in each portal's search, in the command palette, and in the channel, category, favorites and download list filters. diff --git a/.changes/settings-update-channel-save-and-check.md b/.changes/settings-update-channel-save-and-check.md deleted file mode 100644 index 5b6ea86d2..000000000 --- a/.changes/settings-update-channel-save-and-check.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: settings ---- - -The update status in Settings → About now names the channel it describes, and after picking another channel the check button becomes "Save and check": one click saves the choice and reports what that channel offers. Previously "Check again" silently re-checked the still-saved channel, so a fresh nightly could look like "no update". diff --git a/.changes/shell-reload-in-app-route.md b/.changes/shell-reload-in-app-route.md deleted file mode 100644 index 475da5b69..000000000 --- a/.changes/shell-reload-in-app-route.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: shell ---- - -Reloading the desktop app while on any page no longer breaks it: View › Reload -on macOS used to leave a blank, dead window until restart, and the reload -offered by the settings unsaved-changes dialog did nothing. Both now reload the -app back onto the page you were on. diff --git a/.changes/shell-startup-window-mode.md b/.changes/shell-startup-window-mode.md deleted file mode 100644 index fbe45baa0..000000000 --- a/.changes/shell-startup-window-mode.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: shell -issues: [1455] ---- - -Settings → General has a new "Window on startup" option: open the desktop app -at its last size, maximized, or fullscreen — handy on a TV or HTPC. Starting -with `--fullscreen` forces a single fullscreen launch without changing the -setting, and F11 now toggles fullscreen anywhere in the app. diff --git a/.changes/shell-zoom-level-persistence.md b/.changes/shell-zoom-level-persistence.md deleted file mode 100644 index 80c460c6c..000000000 --- a/.changes/shell-zoom-level-persistence.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: shell -issues: [1109] ---- - -The app now remembers your zoom level (Cmd/Ctrl and +/-): it holds when you -switch between sections or resize the window, and comes back after a -restart, so a larger font size no longer resets to the default. diff --git a/.changes/shell-zoom-shortcuts.md b/.changes/shell-zoom-shortcuts.md deleted file mode 100644 index 91693fe31..000000000 --- a/.changes/shell-zoom-shortcuts.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: feature -area: shell -issues: [1109] ---- - -Zoom the app from the keyboard on every platform: Ctrl (Cmd on macOS) with -+/- steps the size in about 10 % increments, including on the numpad, and -Ctrl/Cmd+0 returns to the default. Windows and Linux gain these shortcuts, -which previously existed only in the macOS menu. diff --git a/.changes/stalker-blank-provider-id.md b/.changes/stalker-blank-provider-id.md deleted file mode 100644 index b45639116..000000000 --- a/.changes/stalker-blank-provider-id.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: stalker ---- - -Stalker items whose portal sends an empty `id` next to a valid one are no longer lost: such a channel or movie can be favorited, played, resumed and found again, instead of being stored without an identity and quietly refusing to open. diff --git a/.changes/stalker-category-search.md b/.changes/stalker-category-search.md deleted file mode 100644 index a0a52e132..000000000 --- a/.changes/stalker-category-search.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: stalker -issues: [1543] ---- - -Stalker Live TV search stays within the selected category in the sidebar and fullscreen panel, including channels beyond the first page. All Items searches the whole catalog, and the two search fields work independently. diff --git a/.changes/stalker-keep-live-playback-on-category-switch.md b/.changes/stalker-keep-live-playback-on-category-switch.md deleted file mode 100644 index a6ae14ae9..000000000 --- a/.changes/stalker-keep-live-playback-on-category-switch.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: stalker ---- - -In Stalker portals, switching the Live TV or radio category in the sidebar no -longer stops the channel that is playing. The category only changes which -channels are listed, matching how Xtream portals and M3U playlists already -behave. diff --git a/.changes/stalker-season-marker-display.md b/.changes/stalker-season-marker-display.md deleted file mode 100644 index 0b0a1f4ce..000000000 --- a/.changes/stalker-season-marker-display.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: stalker ---- - -Stalker series with season markers such as “s02” or “2 сезон” now show the correct season in tabs and episode labels while preserving watch progress. TMDB updates no longer reset loaded episodes, and delayed portal responses cannot mix episodes from different series. diff --git a/.changes/stalker-seek-byte-ranges.md b/.changes/stalker-seek-byte-ranges.md deleted file mode 100644 index f95b140ee..000000000 --- a/.changes/stalker-seek-byte-ranges.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: stalker ---- - -Seeking in Stalker movies and series now reaches the selected position instead of jumping forward or skipping to the next episode after resuming playback. diff --git a/.changes/tmdb-cyrillic-search-spelling.md b/.changes/tmdb-cyrillic-search-spelling.md deleted file mode 100644 index 7ea93f6d2..000000000 --- a/.changes/tmdb-cyrillic-search-spelling.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -type: fix -area: tmdb ---- - -Russian titles containing "й" or "ё" and Arabic titles with hamza letters now -match on TMDB. The search used to send a folded spelling — dropping the breve -from "й", for instance — that TMDB never recognised, and cached the miss for a -week; those cached misses are cleared on the next start. diff --git a/.changes/tmdb-new-series-year-match.md b/.changes/tmdb-new-series-year-match.md deleted file mode 100644 index 89c8bb995..000000000 --- a/.changes/tmdb-new-series-year-match.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -type: fix -area: tmdb ---- - -A new series no longer picks up the poster, cast and plot of an older show -that happens to share its title. Metadata is looked up in your own language, -so an unrelated foreign series can be listed under the very same name — and -the better-known one used to win. The release year the provider states now -decides first. diff --git a/.changes/ui-keyboard-scroll.md b/.changes/ui-keyboard-scroll.md deleted file mode 100644 index 2a5ca3bf1..000000000 --- a/.changes/ui-keyboard-scroll.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: ui -issues: [1506] ---- - -Live TV now supports keyboard movement between categories and channels, and channel lists keep scrolling after mouse selection. Channel scrollbars and resize handles are independently accessible. Movie and series details support immediate keyboard scrolling and no longer hide their scrollbars. diff --git a/.changes/ui-light-detail-surfaces.md b/.changes/ui-light-detail-surfaces.md deleted file mode 100644 index 4602cd79a..000000000 --- a/.changes/ui-light-detail-surfaces.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: ui ---- - -Detail buttons, episode cards and episode rows now keep visible backgrounds and borders in the light theme. The grid/list switch also clearly highlights the selected view in both themes. diff --git a/.changes/ui-single-detail-back.md b/.changes/ui-single-detail-back.md deleted file mode 100644 index 80dfe35ba..000000000 --- a/.changes/ui-single-detail-back.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: ui ---- - -Movie and series detail pages now show one Back arrow instead of two. The floating arrow always returns to the list, while watching too, and the "Close player" button beside the player is the only control that returns to the description. Escape still closes the player first and then goes back. diff --git a/.changes/ui-sticky-detail-back.md b/.changes/ui-sticky-detail-back.md deleted file mode 100644 index e943bed2d..000000000 --- a/.changes/ui-sticky-detail-back.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: ui -issues: [1570] ---- - -Movie and series detail pages keep their Back button visible while scrolling. Escape closes the inline player to the description, then returns to the previous view. Open menus, dialogs and fullscreen retain priority. diff --git a/.changes/updater-nightly-channel.md b/.changes/updater-nightly-channel.md deleted file mode 100644 index 3041a169a..000000000 --- a/.changes/updater-nightly-channel.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: feature -area: updater -highlight: Nightly update channel ---- - -Settings → About now has an Update channel switch. Nightly follows every merge into master: the desktop updater offers each new build automatically, and About shows the build's commit for bug reports. Stable stays the default; a nightly build remains installed until the next stable release is newer. diff --git a/.changes/updater-release-notes-fresh-catalog.md b/.changes/updater-release-notes-fresh-catalog.md deleted file mode 100644 index 897bcacb5..000000000 --- a/.changes/updater-release-notes-fresh-catalog.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: updater ---- - -"What's new" no longer fails with a raw error for a build published after the app started: the release list is re-read from GitHub when the requested version is missing, so a freshly offered nightly shows its notes. When a version really has no release, the dialog now says so in plain words and links to the channel's releases page. diff --git a/.changes/web-backend-validated-redirects.md b/.changes/web-backend-validated-redirects.md deleted file mode 100644 index 83c83a659..000000000 --- a/.changes/web-backend-validated-redirects.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: web-backend -issues: [1436] ---- - -The self-hosted backend now checks every provider redirect and pins connections to validated addresses, preventing redirects or DNS changes from bypassing private-network restrictions. Trusted LAN access remains available through the existing opt-in. diff --git a/.changes/xtream-auto-live-ts-fallback.md b/.changes/xtream-auto-live-ts-fallback.md deleted file mode 100644 index 097814030..000000000 --- a/.changes/xtream-auto-live-ts-fallback.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: xtream -issues: [1513] ---- - -Xtream Live TV in Auto can try advertised TS once when HLS initially fails with an HTTP error in a web player. The selected player and stream headers are kept. Settings explain the manual TS workaround for external players, Embedded MPV, and HLS retries that never report a terminal failure. diff --git a/.changes/xtream-catchup-server-timezone.md b/.changes/xtream-catchup-server-timezone.md deleted file mode 100644 index 405f92f4d..000000000 --- a/.changes/xtream-catchup-server-timezone.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: xtream -issues: [1562] ---- - -Catch-up (timeshift) from the Favorites and Recent tabs now asks the panel for the programme you clicked: the start time is rendered in the panel's own timezone instead of your computer's. The panel's timezone is remembered per source, survives restarts, and panels that report an unusual timezone name are handled through their clock. diff --git a/.changes/xtream-epg-current-program-refresh.md b/.changes/xtream-epg-current-program-refresh.md deleted file mode 100644 index aac681249..000000000 --- a/.changes/xtream-epg-current-program-refresh.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: epg -issues: [767] ---- - -The current program shown under each channel in the Xtream Live TV list now moves on by itself once that program ends, and its progress bar keeps advancing. Previously both stayed frozen on the old program until you left the category and came back in. diff --git a/.changes/xtream-filtered-category-selection.md b/.changes/xtream-filtered-category-selection.md deleted file mode 100644 index 0cfa027ac..000000000 --- a/.changes/xtream-filtered-category-selection.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -type: fix -area: xtream -issues: [812, 816] ---- - -Xtream category management now selects or deselects only matching categories while searching, preserving the visibility of all other categories. Button labels and availability reflect the search results, and the counter clearly shows the total selected. diff --git a/.changes/xtream-http-connection-test.md b/.changes/xtream-http-connection-test.md deleted file mode 100644 index ddb44bc45..000000000 --- a/.changes/xtream-http-connection-test.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: xtream ---- - -The explicit HTTPS and HTTP connection test now detects Xtream portals that accept HTTP when HTTPS is unavailable and fills in the working address before you save. The saved address is used for catalog updates, provider EPG and playback. Connection failures now show a more specific explanation. diff --git a/.changes/xtream-live-auto-open-other-portal.md b/.changes/xtream-live-auto-open-other-portal.md deleted file mode 100644 index 2a9ae524b..000000000 --- a/.changes/xtream-live-auto-open-other-portal.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: xtream ---- - -Opening a live channel in another Xtream playlist (from global search, the dashboard or the new "open in playlist" chip) no longer lands on an empty Live TV page: the jump used to get lost while the app was still opening that playlist, and now waits for its catalog before selecting and playing the channel. diff --git a/.changes/xtream-sync-overlay-contrast.md b/.changes/xtream-sync-overlay-contrast.md deleted file mode 100644 index 52d3a31ad..000000000 --- a/.changes/xtream-sync-overlay-contrast.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -type: fix -area: xtream ---- - -The Xtream sync panel now keeps its status text, labels and Stop sync button clearly readable in both light and dark themes. diff --git a/.claude/skills/release-cut/SKILL.md b/.claude/skills/release-cut/SKILL.md index 0f1e76d9c..9a2b15540 100644 --- a/.claude/skills/release-cut/SKILL.md +++ b/.claude/skills/release-cut/SKILL.md @@ -7,6 +7,8 @@ description: Use when preparing, cutting, tagging, publishing, or verifying an I Full contract, asset table and rationale: `docs/architecture/release-pipeline.md`. +For imagegen announcement covers, reuse [the approved artwork prompt](../../../docs/development/release-cover-artwork.md). + The tag workflow authors the public GitHub body with `node tools/release/extract-changelog-section.mjs --public "${VERSION}"`. Keep the full changelog, including internal notes, committed before tagging. diff --git a/.codex/skills/release-cut/SKILL.md b/.codex/skills/release-cut/SKILL.md index 0f1e76d9c..9a2b15540 100644 --- a/.codex/skills/release-cut/SKILL.md +++ b/.codex/skills/release-cut/SKILL.md @@ -7,6 +7,8 @@ description: Use when preparing, cutting, tagging, publishing, or verifying an I Full contract, asset table and rationale: `docs/architecture/release-pipeline.md`. +For imagegen announcement covers, reuse [the approved artwork prompt](../../../docs/development/release-cover-artwork.md). + The tag workflow authors the public GitHub body with `node tools/release/extract-changelog-section.mjs --public "${VERSION}"`. Keep the full changelog, including internal notes, committed before tagging. diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aceeb659..ad49538cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,147 @@ this marker — see `.changes/README.md`. +# [0.24.0](https://github.com/4gray/iptvnator/compare/v0.23.0...v0.24.0) (2026-09-21) + + +![IPTVnator 0.24.0 — programme guide, fullscreen browsing and stream info](https://raw.githubusercontent.com/4gray/iptvnator/v0.24.0/apps/website/public/blog/v0-24/announce.png) + +## Highlights + +### Programme guide, rebuilt + +The M3U programme guide now follows your playlist's own channels and order, with groups and favorites one click away. Keep the player above the grid while you browse, click a channel to switch, or double-click to switch and close. Open the guide with **G**, hide channels without EPG and choose compact or comfortable rows. ([#1560](https://github.com/4gray/iptvnator/pull/1560), closes [#171](https://github.com/4gray/iptvnator/issues/171)) + +### Browse channels and episodes without leaving fullscreen + +Press **C** or use the left edge of the video to open a searchable channel list. Series get season tabs and an episode list with artwork and watch progress too. With the default shared controls, switching channels, episodes or alternative movie sources keeps the player fullscreen. ([#1519](https://github.com/4gray/iptvnator/pull/1519), [#1620](https://github.com/4gray/iptvnator/pull/1620), [#1509](https://github.com/4gray/iptvnator/pull/1509), closes [#48](https://github.com/4gray/iptvnator/issues/48)) + +### See what is playing while it plays + +The stream-info overlay shows resolution, frame rates, bitrates, audio details, buffer and dropped frames when the player can report them. Available in the built-in web players and experimental frame-copy Embedded MPV; unavailable values stay hidden. ([#1578](https://github.com/4gray/iptvnator/pull/1578)) + +--- + +**27 features · 54 fixes · 1 performance improvement** — including local XMLTV files, Xtream catch-up downloads, automatic reconnects for embedded MPV, season artwork and recovery for sources missing after an older upgrade. + +Read the 📝 [release story on the blog](https://4gray.github.io/iptvnator/blog/v0-24-release-notes/), the [full CHANGELOG](https://github.com/4gray/iptvnator/blob/v0.24.0/CHANGELOG.md), or the [changes since v0.23.0](https://github.com/4gray/iptvnator/compare/v0.23.0...v0.24.0). + +Before updating, back up your playlists and important data. Desktop startup applies database updates and clears outdated metadata matches; allow the preparation screen to finish and avoid downgrading an upgraded profile. + +## Thanks + +Thank you to [@Bpl5966](https://github.com/Bpl5966) for MPV reconnects and extra options ([#1515](https://github.com/4gray/iptvnator/pull/1515)), [@mark-jardine](https://github.com/mark-jardine) for the EPG time offset ([#1489](https://github.com/4gray/iptvnator/pull/1489)), and [@larsemig](https://github.com/larsemig) for stream information ([#1578](https://github.com/4gray/iptvnator/pull/1578)). A warm thank-you to everyone who reported issues, tested builds, helped in the [Telegram community](https://t.me/iptvnator), or supported development. 💙 + +If IPTVnator is useful to you, you can help keep it moving through [GitHub Sponsors](https://github.com/sponsors/4gray) or [Ko-fi](https://ko-fi.com/4gray). + +
+All features, fixes and performance improvements + +### Features + +- **collections** — A live channel you watch from Favorites or Recently viewed now says which playlist it belongs to: a chip with the playlist name sits in the programme panel next to the channel, and clicking it (or "Open in " in the channel's right-click menu) jumps to that channel inside its own playlist. Works for Xtream and M3U sources. ([#1634](https://github.com/4gray/iptvnator/pull/1634)) +- **collections** — "Open in " for live channels in Favorites and Recently viewed now works for Stalker portals too: the chip in the programme panel and the channel's right-click menu jump to that channel inside its portal's Live TV, with its category selected and the channel playing. Radio stations keep the existing behaviour. ([#1639](https://github.com/4gray/iptvnator/pull/1639)) +- **dashboard** — The dashboard no longer labels every title with "Xtream · Series" or "Stalker · Movie": the hero shows only the source name, and Continue Watching cards show the episode you are on plus the minutes left. Stalker shows filed under Movies now get that S·E badge, the progress bar, and a working "Resume episode" that opens the show at the saved episode. ([#1646](https://github.com/4gray/iptvnator/pull/1646)) +- **dashboard** — On the desktop app, favourite and recently watched Xtream and Stalker channels on the dashboard now show what is on air, with the programme's time and progress. Each card asks its portal only once it scrolls into view and fills in on its own, so a slow portal never holds up the page or the other cards. ([#1638](https://github.com/4gray/iptvnator/pull/1638)) +- **downloads** — Download completed Xtream catch-up programmes as TS files from Live TV programme details. Find them in Downloads with the channel and broadcast date and play them offline. Interrupted archive downloads restart from the beginning. ([#1572](https://github.com/4gray/iptvnator/pull/1572)) +- **embedded-mpv** — The embedded MPV player now reloads a live stream that drops mid-playback on its own, with increasing delays and an "attempt N of 6" line instead of a dead error screen; a new Settings > Playback toggle turns this off. The same section gains an advanced field for extra libmpv options (one key=value per line) that applies on every engine, with a short network timeout on by default. ([#1515](https://github.com/4gray/iptvnator/pull/1515)) +- **epg** — Copy a catch-up programme’s URL from its EPG details in Xtream and supported M3U sources, including Favorites and Recent, without interrupting playback. The link can be used in an external player or download tool. ([#1569](https://github.com/4gray/iptvnator/pull/1569)) +- **epg** — EPG settings now include a display-only time offset, making it easy to correct provider feeds with missing or incorrect timezone information without re-importing the guide. ([#1489](https://github.com/4gray/iptvnator/pull/1489), closes [#50](https://github.com/4gray/iptvnator/issues/50)) +- **epg** — EPG sources no longer have to be URLs: point Settings → EPG or a playlist's EPG list at an XMLTV file on your computer, by absolute path, `file://` link, or the new folder button. Plain `.xml` and gzip `.xml.gz` both work. A typed path is confirmed once in a native dialog before it is read; the settings page spells out the accepted formats with examples. ([#1600](https://github.com/4gray/iptvnator/pull/1600)) +- **epg** — The programme guide now shows your playlist's own channels in their order, with the current group or favorites one click away. Click a channel to switch playback while the player stays on screen above the grid; double-click switches and closes. Open it from the new Guide button, the header, the command palette, or the G key. Hide channels without EPG and pick comfortable or compact rows. ([#1560](https://github.com/4gray/iptvnator/pull/1560), closes [#171](https://github.com/4gray/iptvnator/issues/171)) +- **epg** — The EPG timeline toolbar is more compact: "Now" is an icon button, and the zoom slider is replaced by a single button that cycles day overview → by hour → detailed. Ctrl/⌘ + scroll (or a trackpad pinch) over the timeline zooms smoothly around the cursor. The channel and programme title now use all the space the controls free up. ([#1557](https://github.com/4gray/iptvnator/pull/1557)) +- **packaging** — AppImage builds now include an update source for AppManager, allowing it to discover new GitHub releases and download full application updates without manually configuring the repository. ([#1559](https://github.com/4gray/iptvnator/pull/1559)) +- **playback** — Playback errors now explain confirmed access and DRM license failures, with stream codecs, DRM systems and failure stages in the details. Copy diagnostics creates a support report without stream URLs or credentials. No extra requests are made to your provider. ([#1574](https://github.com/4gray/iptvnator/pull/1574)) +- **playback** — Rest the mouse on the left edge (tap it on touch) or press C while a live channel plays fullscreen: the channel list (M3U all/groups/favorites/recent, Xtream, Stalker, global favorites) slides over the video with search, so you can zap without leaving fullscreen. Nothing covers the video while it is closed. M3U playlists also zap with PageUp/PageDown. ([#1519](https://github.com/4gray/iptvnator/pull/1519), closes [#48](https://github.com/4gray/iptvnator/issues/48)) +- **playback** — Series playback now has the slide-in list in fullscreen too: rest the mouse on the left edge, click it, or press C to see the season tabs and episodes with stills, runtimes, descriptions and watch progress, and jump to another episode without leaving fullscreen. Works for Xtream and Stalker series with any built-in player. ([#1620](https://github.com/4gray/iptvnator/pull/1620)) +- **playback** — The player overlay now shows stream information: resolution, playback and source frame rates, stream and codec bitrates, audio details, buffer and dropped frames. Available in built-in web players and experimental frame-copy Embedded MPV. Unknown or unavailable values stay hidden; measured frame rates reflect dropped frames and stalls. ([#1578](https://github.com/4gray/iptvnator/pull/1578)) +- **playlist** — Desktop users can review inactive sources and delete selected ones together. The dialog checks the whole library, preselects confirmed expired or disabled accounts, and lets you keep individual sources. Busy sources are skipped, and deletion results are reported individually. ([#1596](https://github.com/4gray/iptvnator/pull/1596)) +- **playlist** — Desktop playlist lists now show availability for Stalker portals and M3U links alongside Xtream accounts. Checks share cached results, run in the background, and explain when a source could not be verified. ([#1592](https://github.com/4gray/iptvnator/pull/1592)) +- **portal** — Movies can now be marked as watched (or unwatched) by hand from their detail page on Xtream and Stalker sources, including the Favorites and Recently Viewed views — the same way seasons and episodes already could. The catalog shows the green check right away, and a watched movie offers Play instead of a Resume near the end. ([#1605](https://github.com/4gray/iptvnator/pull/1605)) +- **portal** — Series with more than six seasons now show a small season poster in the season dropdown — on each row that has one and on the closed selector — so a long list of "Season N" entries is easier to scan. The fullscreen episode panel's season strip also gets its own "N episodes" translation instead of borrowing the download manager's. ([#1633](https://github.com/4gray/iptvnator/pull/1633)) +- **portal** — Series pages now show each season's own poster next to the season tabs, and the fullscreen episode list shows it above its tabs too. The picture comes from TMDB when metadata enrichment is on, otherwise from your provider's season art; one-season shows keep the page as it was. ([#1628](https://github.com/4gray/iptvnator/pull/1628)) +- **portals** — Desktop settings now let you disable the temporary pause after repeated Xtream or Stalker connection failures, without restarting. Account info explains when requests are paused and offers an immediate retry. ([#1536](https://github.com/4gray/iptvnator/pull/1536)) +- **portals** — Live TV panels now fold in steps: hide only the categories rail and keep the channel list, or hide both for a player-only view. With categories hidden, the list header becomes a category dropdown, so switching categories stays one click away, and hiding both panels then bringing them back returns to the level you had before. ([#1556](https://github.com/4gray/iptvnator/pull/1556)) +- **portals** — Movie and series grids can now drop the title row: turn off "Show titles under covers" in Settings > General and the catalog, favorites and recent grids become a wall of covers that shows more rows per screen. The title slides in on the cover when you point at it or focus it with the keyboard, and stays on for items whose cover is missing. Live channels and search results keep their labels. ([#1604](https://github.com/4gray/iptvnator/pull/1604)) +- **shell** — Settings → General has a new "Window on startup" option: open the desktop app at its last size, maximized, or fullscreen — handy on a TV or HTPC. Starting with `--fullscreen` forces a single fullscreen launch without changing the setting, and F11 now toggles fullscreen anywhere in the app. ([#1514](https://github.com/4gray/iptvnator/pull/1514), closes [#1455](https://github.com/4gray/iptvnator/issues/1455)) +- **shell** — Zoom the app from the keyboard on every platform: Ctrl (Cmd on macOS) with +/- steps the size in about 10 % increments, including on the numpad, and Ctrl/Cmd+0 returns to the default. Windows and Linux gain these shortcuts, which previously existed only in the macOS menu. ([#1623](https://github.com/4gray/iptvnator/pull/1623), closes [#1109](https://github.com/4gray/iptvnator/issues/1109)) +- **updater** — Settings → About now has an Update channel switch. Nightly follows every merge into master: the desktop updater offers each new build automatically, and About shows the build's commit for bug reports. Stable stays the default; a nightly build remains installed until the next stable release is newer. ([#1608](https://github.com/4gray/iptvnator/pull/1608)) + +### Fixes + +- **collections** — Switching Favorites or Recently Viewed between "This playlist" and "All playlists" now shows a thin progress bar under the header and dims the list while the new items load, instead of leaving the old list on screen with no sign that anything happened. The toggle reflects your choice at once, a playing channel keeps playing, and quick switches show no indicator at all. ([#1636](https://github.com/4gray/iptvnator/pull/1636)) +- **dashboard** — The dashboard's "Now on air on favorite channels" and "Recently watched Live TV" rails now show the current programme for channels whose guide lives in an XMLTV another playlist imported, not only in the global EPG sources from Settings — the same lookup the "See all" pages already used. ([#1637](https://github.com/4gray/iptvnator/pull/1637)) +- **database** — Updating directly from older versions no longer blocks playlist loading with a missing database column error. Existing sources, favorites, and playback history are preserved. ([#1582](https://github.com/4gray/iptvnator/pull/1582), closes [#1580](https://github.com/4gray/iptvnator/issues/1580)) +- **embedded-mpv** — When a stream refuses the connection, the embedded MPV player (frame-copy engine) no longer hands the URL to yt-dlp before giving up: the failure shows up right away and its error no longer reads "youtube-dl failed: unexpected error occurred", matching the native-view engines and the external MPV player. ([#1526](https://github.com/4gray/iptvnator/pull/1526)) +- **epg** — EPG guides now load when a server adds gzip compression to an already compressed XMLTV file. Sources using a single gzip layer continue to work. ([#1589](https://github.com/4gray/iptvnator/pull/1589), closes [#1586](https://github.com/4gray/iptvnator/issues/1586)) +- **epg** — The EPG import panel no longer shows a horizontal scrollbar while sources download. Source names now read as host/file instead of running the two together, channel and programme counts use your locale's digit grouping, and the minimize button and summary are translated. ([#1599](https://github.com/4gray/iptvnator/pull/1599)) +- **epg** — Removing and saving an EPG source now clears its cached programmes, including data left by previously removed sources on restart. Other configured sources and playlist guides are preserved, and Live TV stops showing programmes from the removed source. ([#1548](https://github.com/4gray/iptvnator/pull/1548)) +- **host-health** — Portal recovery now waits for an active probe to finish before sending another request, even when redirects or a slow response take longer than 45 seconds. Completed and cancelled requests release the probe slot reliably. ([#1547](https://github.com/4gray/iptvnator/pull/1547), closes [#1439](https://github.com/4gray/iptvnator/issues/1439)) +- **live-tv** — A hidden channel list no longer looks like a playlist that lost its channels: the player now says the list is hidden and offers a "Show channels list" button, a toggle in the workspace header stays in place in both states, and hiding the list in one place (M3U player, portal Live TV, favorites/recent) no longer hides it everywhere else. ([#1555](https://github.com/4gray/iptvnator/pull/1555), closes [#1458](https://github.com/4gray/iptvnator/issues/1458)) +- **m3u** — ClearKey channels with ordinary Base64 keys now play when imported or refreshed, including JSON playlist exports that use + and / characters. Refresh an existing playlist once to apply the fix. ([#1575](https://github.com/4gray/iptvnator/pull/1575)) +- **m3u** — DASH channels, including ClearKey-protected streams, now play from Recently Viewed and Favorites using the compatible built-in player. Existing imports keep their DRM keys without needing to re-import the playlist. ([#1597](https://github.com/4gray/iptvnator/pull/1597), closes [#1590](https://github.com/4gray/iptvnator/issues/1590)) +- **m3u** — M3U URL imports now accept a custom User-Agent for providers that require it before downloading the playlist. The value is saved and reused for playlist refreshes in the desktop app and self-hosted web app. ([#1535](https://github.com/4gray/iptvnator/pull/1535), closes [#465](https://github.com/4gray/iptvnator/issues/465), closes [#1120](https://github.com/4gray/iptvnator/issues/1120)) +- **m3u** — Movies and episodes recognized as video files in M3U playlists now offer playback time and seeking in built-in players, even when TMDB or movie details are disabled. Seeking remains dependent on the source's support. ([#1594](https://github.com/4gray/iptvnator/pull/1594)) +- **migration** — Upgrades from older desktop versions retain all sources from the legacy profile. Already-upgraded users can choose to recover missing sources without replacing current sources or settings. Migration keeps the original data and retries safely after a failed write. ([#1550](https://github.com/4gray/iptvnator/pull/1550), closes [#1504](https://github.com/4gray/iptvnator/issues/1504)) +- **migration** — Startup now shows a theme-aware preparation screen while loading sources and checking a large programme guide. Temporary source-read failures retry automatically; if loading still fails, you can retry without restarting the app. Recovery also completes any previously failed programme-guide cleanup before opening the library. ([#1568](https://github.com/4gray/iptvnator/pull/1568)) +- **playback** — The built-in player controls now hide on their own after you click a button in the bar with the mouse, such as fullscreen or mute. Previously the clicked button kept the bar pinned on screen until you clicked the video, which also paused it. Applies to the shared controls in the web players and the Embedded MPV frame-copy engine. ([#1512](https://github.com/4gray/iptvnator/pull/1512)) +- **playback** — Arrow keys and the ±10 s buttons in the Embedded MPV player now move by their full step every time. Pressing an arrow repeatedly, or holding it, used to advance only about a second per press because each step was computed from a stale position; steps are now relative seeks executed by mpv itself, so rapid presses add up. ([#1518](https://github.com/4gray/iptvnator/pull/1518)) +- **playback** — The fullscreen channel list is easier to find and calmer to use: moving the mouse shows a small tab on the left edge, a click on that edge opens the list at once, hover still opens it after a short rest, and the list now stays open for a full second after the mouse leaves. Opened with `C`, it no longer closes while the mouse only wanders over the video. ([#1619](https://github.com/4gray/iptvnator/pull/1619)) +- **playback** — The fullscreen channel panel stays open under the pointer when its opening animation is delayed, instead of closing before the list appears. ([#1591](https://github.com/4gray/iptvnator/pull/1591)) +- **playback** — With the default shared player controls, the built-in player now stays in fullscreen when you switch to another episode, when the next episode starts automatically, and when a live channel or an alternative movie source is switched — previously every switch dropped back to the page. The legacy vendor-controls opt-out keeps its previous behavior. ([#1509](https://github.com/4gray/iptvnator/pull/1509)) +- **playback** — Switching channels or leaving playback now closes the old picture-in-picture window in HTML5, Video.js, and ArtPlayer even when shared player controls are disabled, preventing frozen or outdated video from remaining on top. This includes Safari’s legacy picture-in-picture mode. ([#1538](https://github.com/4gray/iptvnator/pull/1538)) +- **playback** — Embedded MPV controls and programme-guide panels now follow the visual theme and stay readable in light and dark mode. Video overlays retain their contrasting dark backgrounds. ([#1541](https://github.com/4gray/iptvnator/pull/1541), closes [#1530](https://github.com/4gray/iptvnator/issues/1530)) +- **playback** — The built-in HTML5 player now plays `.mkv`, `.webm`, `.avi`, `.mov` and other non-HLS video files directly instead of handing them to the HLS engine, which failed with a "network or provider loading error" on many Xtream episodes and movies. ArtPlayer and the HTML5 player now choose their engine by the same rule. ([#1510](https://github.com/4gray/iptvnator/pull/1510)) +- **playback** — Keyboard shortcuts work again right after you click a button in the built-in player controls. Previously the clicked button kept the keyboard: after clicking fullscreen, Space left fullscreen instead of pausing, and the seek, volume and mute keys did nothing until you clicked the video. Applies to the shared controls in the web players and the Embedded MPV frame-copy engine. ([#1516](https://github.com/4gray/iptvnator/pull/1516)) +- **playback** — With IPTVnator's shared controls turned off, the Video.js player's keyboard shortcuts now work again right after you click a button in its control bar. Previously the clicked button kept the keyboard: after clicking fullscreen, Space left fullscreen instead of pausing, and the seek, volume and mute keys did nothing until you clicked the video. ([#1523](https://github.com/4gray/iptvnator/pull/1523)) +- **playback** — VLC now opens without an extra console window on Windows when playback progress tracking or Reuse VLC instance is enabled. ([#1533](https://github.com/4gray/iptvnator/pull/1533), closes [#871](https://github.com/4gray/iptvnator/issues/871)) +- **playlists** — Opening an M3U playlist immediately after refreshing now waits for its pending save, so the channel list does not revert to the previous catalog. ([#1591](https://github.com/4gray/iptvnator/pull/1591)) +- **portals** — Xtream and Stalker portals no longer enter a connection cooldown merely because several parallel requests fail in the same millisecond. This fixes false unavailability in both the desktop app and the self-hosted web version. ([#1537](https://github.com/4gray/iptvnator/pull/1537), closes [#1438](https://github.com/4gray/iptvnator/issues/1438)) +- **portals** — Xtream and Stalker keep remote channel order while you browse other categories or search. Use Show playing channel to return to the current channel without restarting playback. Stalker radio supports the same behavior. ([#1554](https://github.com/4gray/iptvnator/pull/1554), closes [#1520](https://github.com/4gray/iptvnator/issues/1520)) +- **portals** — A slow Xtream or Stalker panel is no longer mistaken for a dead one: a request that reached the panel and then timed out no longer trips the 30-second "portal is not responding" pause, which only fires when the panel never accepts the connection. The desktop app also gives IPv4 fallback the same 2.5-second budget as the self-hosted backend, so dual-stack panels behind VPNs stop failing in bursts. ([#1621](https://github.com/4gray/iptvnator/pull/1621)) +- **search** — Search now returns the same results whether you type upper or lower case Turkish characters. Titles with the dotted capital I (for example "İnşaat") are found by typing a plain lower case i, so "inş" and "İnş" match the same channels and movies — in global search, in each portal's search, in the command palette, and in the channel, category, favorites and download list filters. ([#1640](https://github.com/4gray/iptvnator/pull/1640), closes [#609](https://github.com/4gray/iptvnator/issues/609)) +- **settings** — The update status in Settings → About now names the channel it describes, and after picking another channel the check button becomes "Save and check": one click saves the choice and reports what that channel offers. Previously "Check again" silently re-checked the still-saved channel, so a fresh nightly could look like "no update". ([#1631](https://github.com/4gray/iptvnator/pull/1631)) +- **shell** — Reloading the desktop app while on any page no longer breaks it: View › Reload on macOS used to leave a blank, dead window until restart, and the reload offered by the settings unsaved-changes dialog did nothing. Both now reload the app back onto the page you were on. ([#1622](https://github.com/4gray/iptvnator/pull/1622)) +- **shell** — The app now remembers your zoom level (Cmd/Ctrl and +/-): it holds when you switch between sections or resize the window, and comes back after a restart, so a larger font size no longer resets to the default. ([#1617](https://github.com/4gray/iptvnator/pull/1617), closes [#1109](https://github.com/4gray/iptvnator/issues/1109)) +- **stalker** — Stalker items whose portal sends an empty `id` next to a valid one are no longer lost: such a channel or movie can be favorited, played, resumed and found again, instead of being stored without an identity and quietly refusing to open. ([#1639](https://github.com/4gray/iptvnator/pull/1639)) +- **stalker** — Stalker Live TV search stays within the selected category in the sidebar and fullscreen panel, including channels beyond the first page. All Items searches the whole catalog, and the two search fields work independently. ([#1552](https://github.com/4gray/iptvnator/pull/1552), closes [#1543](https://github.com/4gray/iptvnator/issues/1543)) +- **stalker** — In Stalker portals, switching the Live TV or radio category in the sidebar no longer stops the channel that is playing. The category only changes which channels are listed, matching how Xtream portals and M3U playlists already behave. ([#1517](https://github.com/4gray/iptvnator/pull/1517)) +- **stalker** — Stalker series with season markers such as “s02” or “2 сезон” now show the correct season in tabs and episode labels while preserving watch progress. TMDB updates no longer reset loaded episodes, and delayed portal responses cannot mix episodes from different series. ([#1545](https://github.com/4gray/iptvnator/pull/1545)) +- **stalker** — Seeking in Stalker movies and series now reaches the selected position instead of jumping forward or skipping to the next episode after resuming playback. ([#1544](https://github.com/4gray/iptvnator/pull/1544)) +- **tmdb** — Russian titles containing "й" or "ё" and Arabic titles with hamza letters now match on TMDB. The search used to send a folded spelling — dropping the breve from "й", for instance — that TMDB never recognised, and cached the miss for a week; those cached misses are cleared on the next start. ([#1626](https://github.com/4gray/iptvnator/pull/1626)) +- **tmdb** — A new series no longer picks up the poster, cast and plot of an older show that happens to share its title. Metadata is looked up in your own language, so an unrelated foreign series can be listed under the very same name — and the better-known one used to win. The release year the provider states now decides first. ([#1648](https://github.com/4gray/iptvnator/pull/1648)) +- **ui** — Live TV now supports keyboard movement between categories and channels, and channel lists keep scrolling after mouse selection. Channel scrollbars and resize handles are independently accessible. Movie and series details support immediate keyboard scrolling and no longer hide their scrollbars. ([#1542](https://github.com/4gray/iptvnator/pull/1542), closes [#1506](https://github.com/4gray/iptvnator/issues/1506)) +- **ui** — Detail buttons, episode cards and episode rows now keep visible backgrounds and borders in the light theme. The grid/list switch also clearly highlights the selected view in both themes. ([#1549](https://github.com/4gray/iptvnator/pull/1549)) +- **ui** — Movie and series detail pages now show one Back arrow instead of two. The floating arrow always returns to the list, while watching too, and the "Close player" button beside the player is the only control that returns to the description. Escape still closes the player first and then goes back. ([#1627](https://github.com/4gray/iptvnator/pull/1627)) +- **ui** — Movie and series detail pages keep their Back button visible while scrolling. Escape closes the inline player to the description, then returns to the previous view. Open menus, dialogs and fullscreen retain priority. ([#1576](https://github.com/4gray/iptvnator/pull/1576), closes [#1570](https://github.com/4gray/iptvnator/issues/1570)) +- **updater** — "What's new" no longer fails with a raw error for a build published after the app started: the release list is re-read from GitHub when the requested version is missing, so a freshly offered nightly shows its notes. When a version really has no release, the dialog now says so in plain words and links to the channel's releases page. ([#1631](https://github.com/4gray/iptvnator/pull/1631)) +- **web-backend** — The self-hosted backend now checks every provider redirect and pins connections to validated addresses, preventing redirects or DNS changes from bypassing private-network restrictions. Trusted LAN access remains available through the existing opt-in. ([#1553](https://github.com/4gray/iptvnator/pull/1553), closes [#1436](https://github.com/4gray/iptvnator/issues/1436)) +- **xtream** — Xtream Live TV in Auto can try advertised TS once when HLS initially fails with an HTTP error in a web player. The selected player and stream headers are kept. Settings explain the manual TS workaround for external players, Embedded MPV, and HLS retries that never report a terminal failure. ([#1558](https://github.com/4gray/iptvnator/pull/1558), closes [#1513](https://github.com/4gray/iptvnator/issues/1513)) +- **xtream** — Catch-up (timeshift) from the Favorites and Recent tabs now asks the panel for the programme you clicked: the start time is rendered in the panel's own timezone instead of your computer's. The panel's timezone is remembered per source, survives restarts, and panels that report an unusual timezone name are handled through their clock. ([#1563](https://github.com/4gray/iptvnator/pull/1563), closes [#1562](https://github.com/4gray/iptvnator/issues/1562)) +- **epg** — The current program shown under each channel in the Xtream Live TV list now moves on by itself once that program ends, and its progress bar keeps advancing. Previously both stayed frozen on the old program until you left the category and came back in. ([#1647](https://github.com/4gray/iptvnator/pull/1647), closes [#767](https://github.com/4gray/iptvnator/issues/767)) +- **xtream** — Xtream category management now selects or deselects only matching categories while searching, preserving the visibility of all other categories. Button labels and availability reflect the search results, and the counter clearly shows the total selected. ([#1534](https://github.com/4gray/iptvnator/pull/1534), closes [#812](https://github.com/4gray/iptvnator/issues/812), closes [#816](https://github.com/4gray/iptvnator/issues/816)) +- **xtream** — The explicit HTTPS and HTTP connection test now detects Xtream portals that accept HTTP when HTTPS is unavailable and fills in the working address before you save. The saved address is used for catalog updates, provider EPG and playback. Connection failures now show a more specific explanation. ([#1588](https://github.com/4gray/iptvnator/pull/1588)) +- **xtream** — Opening a live channel in another Xtream playlist (from global search, the dashboard or the new "open in playlist" chip) no longer lands on an empty Live TV page: the jump used to get lost while the app was still opening that playlist, and now waits for its catalog before selecting and playing the channel. ([#1634](https://github.com/4gray/iptvnator/pull/1634)) +- **xtream** — The Xtream sync panel now keeps its status text, labels and Stop sync button clearly readable in both light and dark themes. ([#1546](https://github.com/4gray/iptvnator/pull/1546)) + +### Performance + +- **database** — Refreshing or removing a large Xtream playlist is several times faster: the "Removing cached content" stage and the re-import now commit around 5,000 rows at a time instead of 100, and progress updates arrive at most ten times a second instead of once per batch. ([#1511](https://github.com/4gray/iptvnator/pull/1511), closes [#1292](https://github.com/4gray/iptvnator/issues/1292)) + + +
+ +
+Internal changes + +- **dashboard** — The dashboard's live "now playing" time range and progress bar now read pre-computed EPG timestamps as unix seconds, matching the rest of the EPG code. Today's dashboard lookups never carry those fields, so nothing changes on screen; this closes the gap before a future data path supplies them. ([#1532](https://github.com/4gray/iptvnator/pull/1532)) +- **deps** — The application uses Angular 22 and Nx 23 with updated build and test tooling. ([#1603](https://github.com/4gray/iptvnator/pull/1603)) +- **deps** — The Embedded MPV native addon build now declares its `node-gyp` dependency explicitly, so `node apps/electron-backend/build-embedded-mpv.js` and the Homebrew development scripts work on a clean checkout instead of failing with "Unable to resolve node-gyp". Packaged builds are unchanged. ([#1625](https://github.com/4gray/iptvnator/pull/1625)) +- **deps** — Closes the eight open Dependabot alerts of September 2026: astro 7.2.4 → 7.2.10 (website build), and pinned pnpm overrides moving js-yaml to 4.3.2 (the one runtime path, via electron-updater), smol-toml to 1.7.1, svgo to 4.1.0 and hono to 4.13.5. No application behavior changes. ([#1635](https://github.com/4gray/iptvnator/pull/1635)) +- **deps** — Closes the four open Dependabot alerts on transitive npm dependencies via pinned pnpm overrides: browserslist (crash on untrusted stats), @xmldom/xmldom (XML fragment injection — its existing override target had itself fallen into the advisory range), @humanfs/node (recursive copy follows symlinks out of the tree) and postcss-selector-parser (AST recursion DoS). ([#1527](https://github.com/4gray/iptvnator/pull/1527)) + +
+ # [0.23.0](https://github.com/4gray/iptvnator/compare/v0.22.0...v0.23.0) (2026-08-30) ### Features diff --git a/apps/website/public/blog/v0-24/announce.png b/apps/website/public/blog/v0-24/announce.png new file mode 100644 index 000000000..6e5a5fd04 Binary files /dev/null and b/apps/website/public/blog/v0-24/announce.png differ diff --git a/apps/website/public/blog/v0-24/hero.jpg b/apps/website/public/blog/v0-24/hero.jpg new file mode 100644 index 000000000..cff15f129 Binary files /dev/null and b/apps/website/public/blog/v0-24/hero.jpg differ diff --git a/apps/website/public/blog/v0-24/screenshots/dashboard-dark.png b/apps/website/public/blog/v0-24/screenshots/dashboard-dark.png new file mode 100644 index 000000000..8b3477afc Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/dashboard-dark.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/dashboard-light.png b/apps/website/public/blog/v0-24/screenshots/dashboard-light.png new file mode 100644 index 000000000..595b33442 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/dashboard-light.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/m3u-live-groups-two-column-dark.png b/apps/website/public/blog/v0-24/screenshots/m3u-live-groups-two-column-dark.png new file mode 100644 index 000000000..6dad85ae3 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/m3u-live-groups-two-column-dark.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/m3u-live-groups-two-column-light.png b/apps/website/public/blog/v0-24/screenshots/m3u-live-groups-two-column-light.png new file mode 100644 index 000000000..57388d3ee Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/m3u-live-groups-two-column-light.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/settings-dark.png b/apps/website/public/blog/v0-24/screenshots/settings-dark.png new file mode 100644 index 000000000..2bb3adc88 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/settings-dark.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/settings-light.png b/apps/website/public/blog/v0-24/screenshots/settings-light.png new file mode 100644 index 000000000..bea653572 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/settings-light.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/xtream-series-season-open-dark.png b/apps/website/public/blog/v0-24/screenshots/xtream-series-season-open-dark.png new file mode 100644 index 000000000..67276bd6e Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/xtream-series-season-open-dark.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/xtream-series-season-open-light.png b/apps/website/public/blog/v0-24/screenshots/xtream-series-season-open-light.png new file mode 100644 index 000000000..1ca289928 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/xtream-series-season-open-light.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/xtream-vod-details-dark.png b/apps/website/public/blog/v0-24/screenshots/xtream-vod-details-dark.png new file mode 100644 index 000000000..beb12c8a4 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/xtream-vod-details-dark.png differ diff --git a/apps/website/public/blog/v0-24/screenshots/xtream-vod-details-light.png b/apps/website/public/blog/v0-24/screenshots/xtream-vod-details-light.png new file mode 100644 index 000000000..2b84cb751 Binary files /dev/null and b/apps/website/public/blog/v0-24/screenshots/xtream-vod-details-light.png differ diff --git a/apps/website/src/content/blog/v0-24-release-notes.mdx b/apps/website/src/content/blog/v0-24-release-notes.mdx new file mode 100644 index 000000000..8268a8b74 --- /dev/null +++ b/apps/website/src/content/blog/v0-24-release-notes.mdx @@ -0,0 +1,272 @@ +--- +title: v0.24 - Release Notes +description: A rebuilt programme guide, channels and episodes within reach in fullscreen, and live stream information — plus more dependable sources, playback and upgrades. +featured: true +pubDate: 2026-09-21 +author: 4gray +heroImage: /iptvnator/blog/v0-24/announce.png +tags: + - release +draft: true +--- + +import BlogImageSlider from '../../components/blog/BlogImageSlider.astro'; +import Alert from '../../components/blog/Alert.astro'; +import ChangeTable from '../../components/blog/ChangeTable.astro'; +import LinkCards from '../../components/blog/LinkCards.astro'; +import ReleaseMeta from '../../components/blog/ReleaseMeta.astro'; +import Spoiler from '../../components/blog/Spoiler.astro'; +import StatusPill from '../../components/blog/StatusPill.astro'; + +IPTVnator **v0.24** makes it easier to find what is on and keep watching. The **programme guide** follows your M3U playlist, **channels and episodes** are a keypress away in fullscreen, and **stream information** tells you what the player is receiving while it plays. + +There is plenty around those three changes: local XMLTV files, catch-up downloads, automatic reconnection for embedded MPV, richer season artwork, and fixes for sources that disappeared during an upgrade. This release brings **27 features, 54 fixes and one performance improvement**. + + + +## What changed + + + + +These screenshots were captured with the release mock servers and fictional demonstration content. IPTVnator does not provide streams, playlists or media; you bring your own sources. The announcement cover is an AI-generated illustration, not an application screenshot. + + +## Programme guide, rebuilt + + + +The programme guide now shows your playlist's own channels in their order, with the current group or favorites one click away. Click a channel to switch playback while the player stays on screen above the grid; double-click switches and closes. Open it from the new Guide button, the header, the command palette, or the G key. Hide channels without EPG and pick comfortable or compact rows. ([#1560](https://github.com/4gray/iptvnator/pull/1560), closes [#171](https://github.com/4gray/iptvnator/issues/171)) + +## Channels and episodes in fullscreen + + + +Rest the mouse on the left edge (tap it on touch) or press C while a live channel plays fullscreen: the channel list (M3U all/groups/favorites/recent, Xtream, Stalker, global favorites) slides over the video with search, so you can zap without leaving fullscreen. Nothing covers the video while it is closed. M3U playlists also zap with PageUp/PageDown. ([#1519](https://github.com/4gray/iptvnator/pull/1519), closes [#48](https://github.com/4gray/iptvnator/issues/48)) + +Series playback now has the slide-in list in fullscreen too: rest the mouse on the left edge, click it, or press C to see the season tabs and episodes with stills, runtimes, descriptions and watch progress, and jump to another episode without leaving fullscreen. Works for Xtream and Stalker series with any built-in player. ([#1620](https://github.com/4gray/iptvnator/pull/1620)) + +With the default shared controls, switching channels, episodes or alternative movie sources also keeps the player fullscreen ([#1509](https://github.com/4gray/iptvnator/pull/1509)). + +## Stream info while you watch + + + +The player overlay now shows stream information: resolution, playback and source frame rates, stream and codec bitrates, audio details, buffer and dropped frames. Available in built-in web players and experimental frame-copy Embedded MPV. Unknown or unavailable values stay hidden; measured frame rates reflect dropped frames and stalls. ([#1578](https://github.com/4gray/iptvnator/pull/1578)) + +## Downloads and recordings + + + +- **Keep a catch-up programme.** Download completed Xtream broadcasts as TS files and play them from Downloads. Interrupted archive downloads restart from the beginning. ([#1572](https://github.com/4gray/iptvnator/pull/1572)) + +## Playback + + + +- **Reconnect automatically.** Embedded MPV retries dropped live streams up to six times. Settings → Playback adds an opt-out and advanced extra MPV options. ([#1515](https://github.com/4gray/iptvnator/pull/1515)) +- **Share useful diagnostics.** Playback errors explain confirmed access and DRM failures; Copy diagnostics creates a support report without stream URLs or credentials. ([#1574](https://github.com/4gray/iptvnator/pull/1574)) + +## Movies, series and the dashboard + + + +- **Continue where you left off.** Continue Watching shows your episode and time remaining, including Stalker series filed under Movies. ([#1646](https://github.com/4gray/iptvnator/pull/1646)) +- **See what is on air.** Desktop dashboard cards for favorite and recent Xtream/Stalker channels show the programme and progress as they scroll into view. ([#1638](https://github.com/4gray/iptvnator/pull/1638)) +- **Mark movies as watched.** Set or clear watched status from Xtream and Stalker detail pages, including Favorites and Recently Viewed. ([#1605](https://github.com/4gray/iptvnator/pull/1605)) +- **Scan long season lists.** Series with more than six seasons show season thumbnails in the dropdown when artwork is available. ([#1633](https://github.com/4gray/iptvnator/pull/1633)) +- **Season artwork.** Multi-season series show each season’s poster beside the tabs and in the fullscreen episode panel, from TMDB when enabled or the provider. ([#1628](https://github.com/4gray/iptvnator/pull/1628)) +- **Control connection cooldowns.** Desktop settings can disable the temporary pause after repeated portal connection failures; account info offers an immediate retry. ([#1536](https://github.com/4gray/iptvnator/pull/1536)) +- **Fold Live TV panels in steps.** Hide categories alone or both panels; a category dropdown keeps browsing available in the narrower layout. ([#1556](https://github.com/4gray/iptvnator/pull/1556)) +- **Browse a wall of covers.** Turn off Show titles under covers in Settings → General; titles appear on hover or keyboard focus and remain visible when artwork is missing. ([#1604](https://github.com/4gray/iptvnator/pull/1604)) + +## Live TV, EPG and M3U + + + +- **Copy a catch-up link.** Programme details can copy an archive URL for Xtream and supported M3U sources without interrupting playback. ([#1569](https://github.com/4gray/iptvnator/pull/1569)) +- **Correct guide times.** A display-only EPG offset fixes feeds with missing or incorrect timezone information, without importing the guide again. ([#1489](https://github.com/4gray/iptvnator/pull/1489), closes [#50](https://github.com/4gray/iptvnator/issues/50)) +- **Use local XMLTV files.** Desktop EPG sources accept `.xml` and `.xml.gz` files through the file picker or a confirmed local path. ([#1600](https://github.com/4gray/iptvnator/pull/1600)) +- **A tidier timeline.** Cycle between day, hour and detailed views with one button, or use Ctrl/⌘ + scroll to zoom around the cursor. ([#1557](https://github.com/4gray/iptvnator/pull/1557)) + +## Settings, import and the desktop app + + + +- **AppManager discovery.** AppImages include the repository metadata AppManager needs to find and download complete updates. ([#1559](https://github.com/4gray/iptvnator/pull/1559)) +- **Review inactive sources together.** Desktop users can select sources to remove, retain individual entries and see the result for each deletion. ([#1596](https://github.com/4gray/iptvnator/pull/1596)) +- **Check source availability.** Desktop playlist lists show background availability checks for Stalker portals and M3U links alongside Xtream accounts. ([#1592](https://github.com/4gray/iptvnator/pull/1592)) +- **Try the nightly channel.** Settings → About offers builds from master. Stable remains the default; returning from nightly waits for a newer stable release. ([#1608](https://github.com/4gray/iptvnator/pull/1608)) + +## Other changes + + + +- **Return to the source.** Open a favorite or recently viewed live channel inside its Xtream or M3U playlist from the source chip or context menu. ([#1634](https://github.com/4gray/iptvnator/pull/1634)) +- **Stalker gets the same shortcut.** Open in playlist selects and plays the channel inside its portal’s Live TV category. ([#1639](https://github.com/4gray/iptvnator/pull/1639)) +- **Choose how the app starts.** Open at the last size, maximized or fullscreen. F11 toggles fullscreen; `--fullscreen` affects one launch. ([#1514](https://github.com/4gray/iptvnator/pull/1514), closes [#1455](https://github.com/4gray/iptvnator/issues/1455)) +- **Zoom from the keyboard.** Ctrl/Cmd +/− adjusts the app size, including numpad keys; Ctrl/Cmd+0 resets it. Windows and Linux now have these shortcuts too. ([#1623](https://github.com/4gray/iptvnator/pull/1623), closes [#1109](https://github.com/4gray/iptvnator/issues/1109)) + +## Performance + + + +- **Faster large catalogs.** Refreshing or removing a large Xtream playlist spends less time clearing and writing cached content. ([#1511](https://github.com/4gray/iptvnator/pull/1511), closes [#1292](https://github.com/4gray/iptvnator/issues/1292)) + +## A look around + + + +## Sources and upgrades + + + +- Upgrades from older desktop versions retain all sources from the legacy profile. Already-upgraded users can choose to recover missing sources without replacing current sources or settings. Migration keeps the original data and retries safely after a failed write. ([#1550](https://github.com/4gray/iptvnator/pull/1550), closes [#1504](https://github.com/4gray/iptvnator/issues/1504)) +- Startup now shows a theme-aware preparation screen while loading sources and checking a large programme guide. Temporary source-read failures retry automatically; if loading still fails, you can retry without restarting the app. Recovery also completes any previously failed programme-guide cleanup before opening the library. ([#1568](https://github.com/4gray/iptvnator/pull/1568)) +- Removing and saving an EPG source now clears its cached programmes, including data left by previously removed sources on restart. Other configured sources and playlist guides are preserved, and Live TV stops showing programmes from the removed source. ([#1548](https://github.com/4gray/iptvnator/pull/1548)) +- A slow Xtream or Stalker panel is no longer mistaken for a dead one: a request that reached the panel and then timed out no longer trips the 30-second "portal is not responding" pause, which only fires when the panel never accepts the connection. The desktop app also gives IPv4 fallback the same 2.5-second budget as the self-hosted backend, so dual-stack panels behind VPNs stop failing in bursts. ([#1621](https://github.com/4gray/iptvnator/pull/1621)) + +## Everything else + +The remaining fixes are grouped below. The full changelog also records maintenance and security dependency updates. + + + +**Playback** + +- When a stream refuses the connection, the embedded MPV player (frame-copy engine) no longer hands the URL to yt-dlp before giving up: the failure shows up right away and its error no longer reads "youtube-dl failed: unexpected error occurred", matching the native-view engines and the external MPV player. ([#1526](https://github.com/4gray/iptvnator/pull/1526)) +- The built-in player controls now hide on their own after you click a button in the bar with the mouse, such as fullscreen or mute. Previously the clicked button kept the bar pinned on screen until you clicked the video, which also paused it. Applies to the shared controls in the web players and the Embedded MPV frame-copy engine. ([#1512](https://github.com/4gray/iptvnator/pull/1512)) +- Arrow keys and the ±10 s buttons in the Embedded MPV player now move by their full step every time. Pressing an arrow repeatedly, or holding it, used to advance only about a second per press because each step was computed from a stale position; steps are now relative seeks executed by mpv itself, so rapid presses add up. ([#1518](https://github.com/4gray/iptvnator/pull/1518)) +- The fullscreen channel list is easier to find and calmer to use: moving the mouse shows a small tab on the left edge, a click on that edge opens the list at once, hover still opens it after a short rest, and the list now stays open for a full second after the mouse leaves. Opened with `C`, it no longer closes while the mouse only wanders over the video. ([#1619](https://github.com/4gray/iptvnator/pull/1619)) +- The fullscreen channel panel stays open under the pointer when its opening animation is delayed, instead of closing before the list appears. ([#1591](https://github.com/4gray/iptvnator/pull/1591)) +- With the default shared player controls, the built-in player now stays in fullscreen when you switch to another episode, when the next episode starts automatically, and when a live channel or an alternative movie source is switched — previously every switch dropped back to the page. The legacy vendor-controls opt-out keeps its previous behavior. ([#1509](https://github.com/4gray/iptvnator/pull/1509)) +- Switching channels or leaving playback now closes the old picture-in-picture window in HTML5, Video.js, and ArtPlayer even when shared player controls are disabled, preventing frozen or outdated video from remaining on top. This includes Safari’s legacy picture-in-picture mode. ([#1538](https://github.com/4gray/iptvnator/pull/1538)) +- Embedded MPV controls and programme-guide panels now follow the visual theme and stay readable in light and dark mode. Video overlays retain their contrasting dark backgrounds. ([#1541](https://github.com/4gray/iptvnator/pull/1541), closes [#1530](https://github.com/4gray/iptvnator/issues/1530)) +- The built-in HTML5 player now plays `.mkv`, `.webm`, `.avi`, `.mov` and other non-HLS video files directly instead of handing them to the HLS engine, which failed with a "network or provider loading error" on many Xtream episodes and movies. ArtPlayer and the HTML5 player now choose their engine by the same rule. ([#1510](https://github.com/4gray/iptvnator/pull/1510)) +- Keyboard shortcuts work again right after you click a button in the built-in player controls. Previously the clicked button kept the keyboard: after clicking fullscreen, Space left fullscreen instead of pausing, and the seek, volume and mute keys did nothing until you clicked the video. Applies to the shared controls in the web players and the Embedded MPV frame-copy engine. ([#1516](https://github.com/4gray/iptvnator/pull/1516)) +- With IPTVnator's shared controls turned off, the Video.js player's keyboard shortcuts now work again right after you click a button in its control bar. Previously the clicked button kept the keyboard: after clicking fullscreen, Space left fullscreen instead of pausing, and the seek, volume and mute keys did nothing until you clicked the video. ([#1523](https://github.com/4gray/iptvnator/pull/1523)) +- VLC now opens without an extra console window on Windows when playback progress tracking or Reuse VLC instance is enabled. ([#1533](https://github.com/4gray/iptvnator/pull/1533), closes [#871](https://github.com/4gray/iptvnator/issues/871)) + +**Movies, series and the dashboard** + +- The dashboard's "Now on air on favorite channels" and "Recently watched Live TV" rails now show the current programme for channels whose guide lives in an XMLTV another playlist imported, not only in the global EPG sources from Settings — the same lookup the "See all" pages already used. ([#1637](https://github.com/4gray/iptvnator/pull/1637)) +- Xtream and Stalker portals no longer enter a connection cooldown merely because several parallel requests fail in the same millisecond. This fixes false unavailability in both the desktop app and the self-hosted web version. ([#1537](https://github.com/4gray/iptvnator/pull/1537), closes [#1438](https://github.com/4gray/iptvnator/issues/1438)) +- Xtream and Stalker keep remote channel order while you browse other categories or search. Use Show playing channel to return to the current channel without restarting playback. Stalker radio supports the same behavior. ([#1554](https://github.com/4gray/iptvnator/pull/1554), closes [#1520](https://github.com/4gray/iptvnator/issues/1520)) +- Russian titles containing "й" or "ё" and Arabic titles with hamza letters now match on TMDB. The search used to send a folded spelling — dropping the breve from "й", for instance — that TMDB never recognised, and cached the miss for a week; those cached misses are cleared on the next start. ([#1626](https://github.com/4gray/iptvnator/pull/1626)) +- A new series no longer picks up the poster, cast and plot of an older show that happens to share its title. Metadata is looked up in your own language, so an unrelated foreign series can be listed under the very same name — and the better-known one used to win. The release year the provider states now decides first. ([#1648](https://github.com/4gray/iptvnator/pull/1648)) + +**Xtream** + +- Xtream Live TV in Auto can try advertised TS once when HLS initially fails with an HTTP error in a web player. The selected player and stream headers are kept. Settings explain the manual TS workaround for external players, Embedded MPV, and HLS retries that never report a terminal failure. ([#1558](https://github.com/4gray/iptvnator/pull/1558), closes [#1513](https://github.com/4gray/iptvnator/issues/1513)) +- Catch-up (timeshift) from the Favorites and Recent tabs now asks the panel for the programme you clicked: the start time is rendered in the panel's own timezone instead of your computer's. The panel's timezone is remembered per source, survives restarts, and panels that report an unusual timezone name are handled through their clock. ([#1563](https://github.com/4gray/iptvnator/pull/1563), closes [#1562](https://github.com/4gray/iptvnator/issues/1562)) +- Xtream category management now selects or deselects only matching categories while searching, preserving the visibility of all other categories. Button labels and availability reflect the search results, and the counter clearly shows the total selected. ([#1534](https://github.com/4gray/iptvnator/pull/1534), closes [#812](https://github.com/4gray/iptvnator/issues/812), closes [#816](https://github.com/4gray/iptvnator/issues/816)) +- The explicit HTTPS and HTTP connection test now detects Xtream portals that accept HTTP when HTTPS is unavailable and fills in the working address before you save. The saved address is used for catalog updates, provider EPG and playback. Connection failures now show a more specific explanation. ([#1588](https://github.com/4gray/iptvnator/pull/1588)) +- **Return to the source.** Open a favorite or recently viewed live channel inside its Xtream or M3U playlist from the source chip or context menu. ([#1634](https://github.com/4gray/iptvnator/pull/1634)) +- The Xtream sync panel now keeps its status text, labels and Stop sync button clearly readable in both light and dark themes. ([#1546](https://github.com/4gray/iptvnator/pull/1546)) + +**Stalker portals** + +- **Stalker gets the same shortcut.** Open in playlist selects and plays the channel inside its portal’s Live TV category. ([#1639](https://github.com/4gray/iptvnator/pull/1639)) +- Stalker Live TV search stays within the selected category in the sidebar and fullscreen panel, including channels beyond the first page. All Items searches the whole catalog, and the two search fields work independently. ([#1552](https://github.com/4gray/iptvnator/pull/1552), closes [#1543](https://github.com/4gray/iptvnator/issues/1543)) +- In Stalker portals, switching the Live TV or radio category in the sidebar no longer stops the channel that is playing. The category only changes which channels are listed, matching how Xtream portals and M3U playlists already behave. ([#1517](https://github.com/4gray/iptvnator/pull/1517)) +- Stalker series with season markers such as “s02” or “2 сезон” now show the correct season in tabs and episode labels while preserving watch progress. TMDB updates no longer reset loaded episodes, and delayed portal responses cannot mix episodes from different series. ([#1545](https://github.com/4gray/iptvnator/pull/1545)) +- Seeking in Stalker movies and series now reaches the selected position instead of jumping forward or skipping to the next episode after resuming playback. ([#1544](https://github.com/4gray/iptvnator/pull/1544)) + +**Live TV, EPG and M3U** + +- EPG guides now load when a server adds gzip compression to an already compressed XMLTV file. Sources using a single gzip layer continue to work. ([#1589](https://github.com/4gray/iptvnator/pull/1589), closes [#1586](https://github.com/4gray/iptvnator/issues/1586)) +- The EPG import panel no longer shows a horizontal scrollbar while sources download. Source names now read as host/file instead of running the two together, channel and programme counts use your locale's digit grouping, and the minimize button and summary are translated. ([#1599](https://github.com/4gray/iptvnator/pull/1599)) +- ClearKey channels with ordinary Base64 keys now play when imported or refreshed, including JSON playlist exports that use + and / characters. Refresh an existing playlist once to apply the fix. ([#1575](https://github.com/4gray/iptvnator/pull/1575)) +- DASH channels, including ClearKey-protected streams, now play from Recently Viewed and Favorites using the compatible built-in player. Existing imports keep their DRM keys without needing to re-import the playlist. ([#1597](https://github.com/4gray/iptvnator/pull/1597), closes [#1590](https://github.com/4gray/iptvnator/issues/1590)) +- M3U URL imports now accept a custom User-Agent for providers that require it before downloading the playlist. The value is saved and reused for playlist refreshes in the desktop app and self-hosted web app. ([#1535](https://github.com/4gray/iptvnator/pull/1535), closes [#465](https://github.com/4gray/iptvnator/issues/465), closes [#1120](https://github.com/4gray/iptvnator/issues/1120)) +- Movies and episodes recognized as video files in M3U playlists now offer playback time and seeking in built-in players, even when TMDB or movie details are disabled. Seeking remains dependent on the source's support. ([#1594](https://github.com/4gray/iptvnator/pull/1594)) +- The current program shown under each channel in the Xtream Live TV list now moves on by itself once that program ends, and its progress bar keeps advancing. Previously both stayed frozen on the old program until you left the category and came back in. ([#1647](https://github.com/4gray/iptvnator/pull/1647), closes [#767](https://github.com/4gray/iptvnator/issues/767)) + +**Search** + +- Search now returns the same results whether you type upper or lower case Turkish characters. Titles with the dotted capital I (for example "İnşaat") are found by typing a plain lower case i, so "inş" and "İnş" match the same channels and movies — in global search, in each portal's search, in the command palette, and in the channel, category, favorites and download list filters. ([#1640](https://github.com/4gray/iptvnator/pull/1640), closes [#609](https://github.com/4gray/iptvnator/issues/609)) + +**Settings, import and the desktop app** + +- Updating directly from older versions no longer blocks playlist loading with a missing database column error. Existing sources, favorites, and playback history are preserved. ([#1582](https://github.com/4gray/iptvnator/pull/1582), closes [#1580](https://github.com/4gray/iptvnator/issues/1580)) +- Opening an M3U playlist immediately after refreshing now waits for its pending save, so the channel list does not revert to the previous catalog. ([#1591](https://github.com/4gray/iptvnator/pull/1591)) +- The update status in Settings → About now names the channel it describes, and after picking another channel the check button becomes "Save and check": one click saves the choice and reports what that channel offers. Previously "Check again" silently re-checked the still-saved channel, so a fresh nightly could look like "no update". ([#1631](https://github.com/4gray/iptvnator/pull/1631)) +- Live TV now supports keyboard movement between categories and channels, and channel lists keep scrolling after mouse selection. Channel scrollbars and resize handles are independently accessible. Movie and series details support immediate keyboard scrolling and no longer hide their scrollbars. ([#1542](https://github.com/4gray/iptvnator/pull/1542), closes [#1506](https://github.com/4gray/iptvnator/issues/1506)) +- Detail buttons, episode cards and episode rows now keep visible backgrounds and borders in the light theme. The grid/list switch also clearly highlights the selected view in both themes. ([#1549](https://github.com/4gray/iptvnator/pull/1549)) +- Movie and series detail pages now show one Back arrow instead of two. The floating arrow always returns to the list, while watching too, and the "Close player" button beside the player is the only control that returns to the description. Escape still closes the player first and then goes back. ([#1627](https://github.com/4gray/iptvnator/pull/1627)) +- Movie and series detail pages keep their Back button visible while scrolling. Escape closes the inline player to the description, then returns to the previous view. Open menus, dialogs and fullscreen retain priority. ([#1576](https://github.com/4gray/iptvnator/pull/1576), closes [#1570](https://github.com/4gray/iptvnator/issues/1570)) +- "What's new" no longer fails with a raw error for a build published after the app started: the release list is re-read from GitHub when the requested version is missing, so a freshly offered nightly shows its notes. When a version really has no release, the dialog now says so in plain words and links to the channel's releases page. ([#1631](https://github.com/4gray/iptvnator/pull/1631)) + +**Self-hosted web version** + +- The self-hosted backend now checks every provider redirect and pins connections to validated addresses, preventing redirects or DNS changes from bypassing private-network restrictions. Trusted LAN access remains available through the existing opt-in. ([#1553](https://github.com/4gray/iptvnator/pull/1553), closes [#1436](https://github.com/4gray/iptvnator/issues/1436)) + +**Other changes** + +- Switching Favorites or Recently Viewed between "This playlist" and "All playlists" now shows a thin progress bar under the header and dims the list while the new items load, instead of leaving the old list on screen with no sign that anything happened. The toggle reflects your choice at once, a playing channel keeps playing, and quick switches show no indicator at all. ([#1636](https://github.com/4gray/iptvnator/pull/1636)) +- Portal recovery now waits for an active probe to finish before sending another request, even when redirects or a slow response take longer than 45 seconds. Completed and cancelled requests release the probe slot reliably. ([#1547](https://github.com/4gray/iptvnator/pull/1547), closes [#1439](https://github.com/4gray/iptvnator/issues/1439)) +- A hidden channel list no longer looks like a playlist that lost its channels: the player now says the list is hidden and offers a "Show channels list" button, a toggle in the workspace header stays in place in both states, and hiding the list in one place (M3U player, portal Live TV, favorites/recent) no longer hides it everywhere else. ([#1555](https://github.com/4gray/iptvnator/pull/1555), closes [#1458](https://github.com/4gray/iptvnator/issues/1458)) +- Reloading the desktop app while on any page no longer breaks it: View › Reload on macOS used to leave a blank, dead window until restart, and the reload offered by the settings unsaved-changes dialog did nothing. Both now reload the app back onto the page you were on. ([#1622](https://github.com/4gray/iptvnator/pull/1622)) +- The app now remembers your zoom level (Cmd/Ctrl and +/-): it holds when you switch between sections or resize the window, and comes back after a restart, so a larger font size no longer resets to the default. ([#1617](https://github.com/4gray/iptvnator/pull/1617), closes [#1109](https://github.com/4gray/iptvnator/issues/1109)) + + + + +Please back up your playlists and important data before updating. Desktop startup applies database updates for catch-up downloads and EPG source tracking, and clears outdated TMDB search matches. Direct upgrades from older releases are supported; missing sources from an earlier migration can be recovered without replacing your current library. Allow the preparation screen to finish, and avoid downgrading a profile after it has been upgraded. + + +## Thanks + +Thank you to [@Bpl5966](https://github.com/Bpl5966) for embedded MPV reconnects and extra options ([#1515](https://github.com/4gray/iptvnator/pull/1515)), [@mark-jardine](https://github.com/mark-jardine) for the EPG time offset ([#1489](https://github.com/4gray/iptvnator/pull/1489)), and [@larsemig](https://github.com/larsemig) for stream information ([#1578](https://github.com/4gray/iptvnator/pull/1578)). Welcome to Bpl5966 and mark-jardine, whose first contributions are included in this release. + +A warm thank-you to everyone who reported issues, tested builds and helped others in the [Telegram community](https://t.me/iptvnator), and to the sponsors and donors who make time for this project possible. 💙 If IPTVnator is useful to you, you can support its development through [GitHub Sponsors](https://github.com/sponsors/4gray) or [Ko-fi](https://ko-fi.com/4gray). + +## Download + + + diff --git a/docs/architecture/release-pipeline.md b/docs/architecture/release-pipeline.md index 58354bc01..ef36a3dec 100644 --- a/docs/architecture/release-pipeline.md +++ b/docs/architecture/release-pipeline.md @@ -136,6 +136,11 @@ fails on an unused import. ## Highlight cards +For an imagegen announcement cover, use the reusable +[release cover artwork recipe](../development/release-cover-artwork.md). +It preserves the selected visual direction and exact 0.24 prompt; the +deterministic cards and screenshot requirements below still apply. + `tools/release/highlight-cards.mjs` plans and lays out; `tools/release/generate-highlight-cards.mjs` renders through sharp. Output is 1200×630 (Open Graph), matching the website palette in `apps/website/tailwind.config.mjs`. diff --git a/docs/development/release-cover-artwork.md b/docs/development/release-cover-artwork.md new file mode 100644 index 000000000..7b9df9f01 --- /dev/null +++ b/docs/development/release-cover-artwork.md @@ -0,0 +1,95 @@ +# Release cover artwork + +Use this recipe for IPTVnator announcement covers in the sculptural graphite +style selected for 0.24. It is a reusable visual direction; adapt it when the +user requests another style. Release ordering and publication remain governed +by the [release pipeline](../architecture/release-pipeline.md). + +## References and inputs + +- [Approved 0.24 cover](../../apps/website/public/blog/v0-24/announce.png): + composition, material, lighting and typography reference. +- [Application icon](../../apps/website/src/assets/logo.png): identity reference; + retain the TV outline, short stand, horizontal foot and Wi-Fi symbol. +- [Exact successful 0.24 edit prompt](release-cover-prompt-0.24.txt): archival + wording. Its Image 1 was an intermediate abstract-ribbon cover. For future + releases, use the approved final cover above with the reusable prompt below; + the intermediate image is not required. + +Choose a display version and two or three short, verified release highlights. +For 0.24 the labels were “Programme guide”, “Fullscreen browsing” and “Stream +info”. The display version was **0.24**, while the package and tag remained +**0.24.0** and **v0.24.0**. Artwork text never changes the technical version. + +## Generate and review + +Use the imagegen skill and built-in image generation. Inspect both reference +images first and give each its stated role. Do not silently switch to an API +CLI or substitute a code-generated graphic. Produce one horizontal image. + +Fill every placeholder in the prompt; omit the third caption when there are +only two highlights. Preserve the style reference's typography as closely as +possible: the named fonts describe visual character, not an exact font-file +guarantee from the image model. + +```text +Use case: identity-preserve +Asset type: one horizontal 2:1 IPTVnator release cover, finished raster artwork. +Image 1: approved previous release cover; style and composition reference. +Image 2: authentic IPTVnator app icon; identity reference. + +Create the next release cover in the visual language of Image 1. Use warm +off-white uncoated paper, graphite ink, brushed graphite metal and one restrained +blue accent matching the small application logo. Use subtle directional daylight, +delicate contact shadows, crisp geometry and generous negative space. + +The main artwork is an unmistakable sculptural version of the TV-and-Wi-Fi icon. +Keep its broad rectangular TV outline with softly rounded corners, visible short +central stem and horizontal foot. Inside are three clearly separated nested +Wi-Fi arcs above a small diamond-like dot. Build the frame from thin layered +graphite ribbons. Extend the side edges into staggered parallel strips on the +left and a restrained flowing wave on the right. These extensions belong to one +continuous object; the TV, stand and Wi-Fi symbol must remain immediately legible. +Use slight relief depth and a mostly frontal editorial perspective. + +Keep the small authentic blue icon and IPTVnator wordmark at upper left. Place +the display version at lower right, in a distinctive heavy compressed industrial +sans with squared mechanical numerals, like Druk or Monument Grotesk. Set the +feature captions as a compact left-aligned stack at lower left, in a precise +JetBrains Mono-like monospaced face. Use a refined Cabinet Grotesk-like wordmark. +All lettering is solid graphite. Keep the central sculpture clear of every label. + +Render only these exact strings: +"IPTVnator" +"{{DISPLAY_VERSION}}" +"{{HIGHLIGHT_1}}" +"{{HIGHLIGHT_2}}" +"{{HIGHLIGHT_3}}" + +No other words, numbers or pseudo-text. Preserve exact capitalization and spelling. +No generic thin geometric sans, serif, gradient lettering, neon edges, purple/blue +glow, glass cards, floating balls, dashboard, screenshots, literal video content, +landscapes, old CRT knobs or antenna rods. This is conceptual brand artwork, +not an application screenshot. Keep the paper-and-graphite composition breathable, +asymmetric and readable at social-preview size. +``` + +Review the result for exact text, recognizable icon silhouette, separated Wi-Fi +arcs, visible stand, clear captions, safe margins and the intended type contrast. +Inspect the actual image; prompt compliance alone is not visual verification. + +Save candidates non-destructively in the release's asset directory, and retain +the exact filled prompt, input roles and generation mode alongside preparation +materials. Once a cover is selected, copy it to the canonical announcement asset +and update the blog hero reference if the blog uses it. Preserve earlier variants. +The usual path shapes are: + +```text +apps/website/public/blog//announce-v.png +apps/website/public/blog//announce.png +``` + +An imagegen cover complements the deterministic highlight cards and guarded +screenshots; it does not replace their release-pipeline steps. Cover generation +or selection does not authorize merging, tagging, publication or posting an +announcement. diff --git a/docs/development/release-cover-prompt-0.24.txt b/docs/development/release-cover-prompt-0.24.txt new file mode 100644 index 000000000..7153b6233 --- /dev/null +++ b/docs/development/release-cover-prompt-0.24.txt @@ -0,0 +1,16 @@ +Use case: identity-preserve +Asset type: horizontal 2:1 IPTVnator 0.24 release poster, finished raster artwork. +Edit target: Image 1, the off-white abstract graphite ribbon poster. Preserve its beautiful warm uncoated-paper background, monochrome graphite material, restrained blue logo accent, asymmetric editorial layout, lighting, precise typography and all five exact text strings. +Supporting identity reference: Image 2 is the actual IPTVnator app icon, a TV outline on a short stem and horizontal foot with a Wi-Fi symbol inside. +Primary change: Replace the ambiguous central rectangular ribbon aperture with an unmistakable SCULPTURAL VERSION OF THE IPTVnator TV-and-Wi-Fi ICON. Make the logo the central hero artwork in the same sophisticated folded graphite / brushed-metal lamella style. +Sculpture: a broad television outline, recognizably a wide rectangular TV frame with softly rounded corners, a visible short central stem and horizontal base/foot. Inside the TV is the exact familiar Wi-Fi motif, three clean nested curved arcs above a small diamond-like dot, built from the same refined graphite material. The arcs must remain clearly separated and immediately legible; do not fill the interior with random lines. The TV itself is formed from several thin layered metal ribbons with precise spacing and delicate shadows. Stretch its layered side edges horizontally into elegant parallel ribbons: longer staggered strips entering from the left, and a restrained flowing wave continuing to the right. The extension belongs naturally to the TV contour; keep the central TV shape, Wi-Fi symbol and stand intact and readable. The entire object is one sculptural physical artwork resting close to the paper plane, with subtle relief depth and soft directional daylight. Mostly front-facing, with a small editorial perspective angle. It should read first as the IPTVnator app icon, second as a layered abstract sculpture. +Composition invariants: keep the small original logo and “IPTVnator” wordmark at upper left. Keep the compressed heavy industrial “0.24” at lower right. Keep the three monospaced captions at lower left. Reserve clear whitespace around all lettering. The sculpture occupies the same central band, with TV stand visible above the lower caption/version region. Do not obscure the lettering. +Text must remain EXACTLY: +“IPTVnator” +“0.24” +“Programme guide” +“Fullscreen browsing” +“Stream info” +Keep the numeral's distinctive Druk/Monument-like condensed silhouette and the captions' precise monospaced character. Do not revert to thin geometric sans. No extra text. +Avoid: generic laptop, remote control, speaker, old CRT knobs, antenna rods, literal video or screen content, realistic app screenshot, technology dashboard, neon, glass panels, blue/purple glow, floating balls, new colors, decorative pseudo-text. Preserve the paper-and-graphite visual world of Image 1. The principal TV sculpture is graphite, with the existing small blue logo as the only color accent. + diff --git a/package.json b/package.json index 534972f64..9098a5518 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iptvnator", - "version": "0.23.0", + "version": "0.24.0", "engines": { "node": "^22.22.3 || ^24.15.0" },