v4.1.4 — 2026-07-24
🧊 Liquid Glass — frosted translucent interface over your own background photo
- An opt-in glass look: content panels, sidebar, preview panes, dialogs, top bar, cards and the
mini-player turn translucent with a real frosted-blur backdrop over an optional background
photo — glassmorphism on TV. Everything lives in one Settings → Glass Effect
dialog: Liquid glass On/Off, the background image, a Transparency stepper (20–95%), a
Blur / Frost stepper (0–100%), a Surfaces sub-menu, and Reset. - Background image — Local or Remote. Local picks a photo from USB/device storage (copied into
app-private storage so unplugging the stick can't blank it). Remote sends one from your phone:
the TV shows a PIN + QR (the same companion pairing as Remote Backup & Restore), the phone opens
the page on the same Wi-Fi and uploads a JPG/PNG/WebP/BMP, and it applies instantly. - Per-surface control. The Surfaces menu toggles glass individually for content panels,
sidebar, preview panes, dialogs & popups, top bar, cards and the mini-player — or all at once with
one master row. Turning every surface off turns glass off. - The frost is a real blurred slice of the photo aligned behind each panel, pre-processed with a
matching brightness scrim and a slight saturation lift so the glass blends with the scene instead of
reading backlit. It is computed once per image at a downscaled size, so it stays cheap on low-end
boxes. Backdrop blur needs Android 12+; older devices fall back to translucency without frost.
All glass settings persist per install and are included in backups. - Every focused/selected control now frosts, not just the big panels. The glass highlight was
extended to the focus rim itself: cards, list rows and chips on every content screen, every row and
list item inside popups/dialogs (pickers, storage browser, avatar/subtitle/backup/profile lists,
EPG match review), the sidebar's profile/avatar buttons, the action pill buttons (Save / Cancel /
Add / Edit / Delete / Done), and every search bar (category rail, Live/Movies/Series/Search/EPG
panels, and the in‑popup search fields) — so a pill or search field inside a dialog frosts with the
dialog and one on a panel frosts with the panel. The fullscreen player stays solid by design. Four
dialogs that previously kept a flat fill (Video Player pickers, EPG "Fill from playlist", Live
catch‑up, the Guide programme popup) now frost with the rest. - The player's Subtitles & Audio pickers are now glass too. Their track rows and the A/V-sync
buttons frost like the rest of the interface (they previously stayed flat inside the glass panel),
and the popups were tightened to the compact style used by the storage picker — a narrower box with
a smaller font.
⭐ Favorite from the player — add to Favorites without leaving the stream
- A star button in the fullscreen player's control bar favorites (or un-favorites) what you're
watching without backing out to the list — a live channel, a movie, or a series (an episode
favorites its parent show). The star fills when the item is already a favorite and updates
instantly, and it survives channel zapping. (community suggestion)
🗂️ Per-section sync scope — choose Now / Later / Off for each section (#74)
- Every source now controls Live, Movies and Series independently with a Now / Later /
Off scope instead of the old on/off sync toggles. Set a section to Off and it is never
synced or shown (the long-requested "don't load VOD" — turn Movies off and the huge movie catalog
is skipped entirely), Later keeps it available to sync on demand without running now, and
Now syncs it with the rest. Editable per source in Setup and Settings → Manage sources,
and from the LAN companion page (Now/Later/Off dropdowns replace the old checkboxes). - A source with every section Off does no sync work at all. Changing a section's scope resyncs
just that source. Backups carry the per-section scope forward, and upgrading preserves your existing
behaviour (all sections default to Now). (community PR #78)
🎨 Accent color — full HSV picker with a live preview
- The accent dialog is rebuilt around a proper color picker: a hue bar and a large
saturation / brightness square, each a D-pad "enter-to-edit" control — focus it, press OK to
step inside (it glows amber), move with the D-pad, OK/Back to step out — plus a live preview
circle and a trimmed set of 6 quick presets. Type an exact hex code at the top and Apply,
or dial one in and Use this color. - Custom hex accents now render exactly. Entering a hex code used to pin its lightness and show a
nearby shade; the seed color is now used verbatim as the accent (only the contrast roles are
derived). The dialog uses the shared Lora popup styling.
🎧 Audio Mode — listen with the screen free
- A new third player mode, alongside fullscreen and the docked mini-player: switch the current
stream to audio-only and keep browsing. Video decoding is stopped entirely (true audio-only, not a
hidden video), and a compact now-playing bar appears in the top bar — an animated equaliser,
the title, and transport controls (play/pause, previous, next, volume, fullscreen, close). The
equaliser dances while sound plays and freezes flat when paused. Live shows a pulsing LIVE
badge; movies/episodes show a slim progress line with remaining time. - Enter it from the headphones button on the fullscreen player controls or on the docked
mini-player. Two-stage D-pad focus: move onto the bar and it highlights as one target; press
OK to step inside, where Left/Right move between the buttons and OK runs the focused one; focus
stays locked in the bar and Back is the way out. Fullscreen returns to full video, close
stops playback. Works for Live TV (both engines), movies and series.
📤 Remote Backup & Restore — move a backup between TVs over Wi-Fi
- Remote restore. Settings → Backup & Restore → Restore from another device, and the same
option in the first-run / add-profile setup wizard, open the LAN companion server in
backup-upload mode and show a PIN, a QR code, and the URL. A phone or laptop on the same Wi-Fi
opens the page and uploads an OwnTV backup JSON straight to the TV; when it arrives it flows into
the normal restore path (section picker, backup-password prompt). No cloud, no USB stick, no file
browser on the TV. - Remote export. Settings → Backup & Restore → Send to another device serves the exported
backup from the TV so a remote device on the same Wi-Fi can download it — the mirror of remote
restore for getting a backup off the TV. - Both reuse the existing companion PIN + QR pairing, the profile / section pickers and the same
encryption as local backups; the listener stops automatically when you leave the screen. Local
backup/restore (USB, on-device file) is unchanged.
📡 Live TV latency control (#72)
- Settings → Video Player → Live latency trades how close to the live edge you play against
stability: Low latency, Balanced (default), Stable, or a Custom buffer in seconds.
It applies on the next channel open, to live streams only (VOD is never affected). - Works on both engines — ExoPlayer live uses it as the HLS live-edge target offset, mpv live as
the demuxer read-ahead. Balanced applies no override at all, so it can never regress a stream
that already plays well. Picking Low latency (or a below-Balanced custom value) shows a quick
heads-up that a smaller buffer can stutter on weaker connections.
🪟 Configurable mini-player
- The docked mini-player (live PiP) now has an adjustable size (percentage of screen width) and
screen position (six docking spots — the four corners plus top/bottom centre), set in
Settings → Playback → Mini-player and also changeable on the fly from the mini-player's own
resize / move controls. The window is laid out proportionally (fillMaxWidth% × 16:9), so it scales
consistently across TV sizes and the UI zoom instead of the old fixed box.
🖼️ Live TV preview pane — info-only, genre dots, EPG coverage
- The preview pane is now informational only — the action buttons are gone. Favorite / Rename /
Hide / Match EPG / Catch-up all moved to the long-press channel menu (where Move and Remove-from-History
already lived), so nothing in the pane is selectable or focusable any more. Right-arrow no longer
enters the pane — D-pad focus stays in the channel list — which fixes the common complaint that a
stray right press dropped you onto the buttons by accident. The pane instead shows a short note
("Press OK to watch fullscreen · Long-press for options"). - Channel metadata row. Under the channel name, a compact row of chips shows the channel's real
category (resolved from itscategoryId, so it's correct even when you're browsing via Favorites /
History / All — never the browse context), its inferred genre with a colour dot, catch-up
availability (with days, e.g. "Catch-up · 7d"), and EPG coverage ("EPG · Nd" from the stored guide
span, or plain "EPG" / "No EPG"). Every channel gets a genre marker — unmatched categories fall back to
a neutral grey Other dot rather than none. - Shared genre colour system. The Guide's category→colour inference and the preview's genre dot now
use one sharedChannelGenrehelper (sport→green, news→red, movies→violet, kids→amber, music→blue,
documentary→teal, other→grey), so the two surfaces agree. The chips use the Lora serif font and a
uniform fixed height so long category names never make one chip taller than the others.
🔄 Sync reliability — completion notices, restore visibility, concurrent sync
- Sync completion pill. When a catalog sync finishes — success, failure, or cancel — the global
status pill now shows the result for a few seconds ("Sync complete · Playlist · 3 categories added")
instead of silently disappearing. Multiple back-to-back completions queue and display one after
another. (community PR #73 by @pt5pnzghm6-sys) - Restoring a backup no longer hides all your channels. A restored source starts with empty
catalog tables, but its savedlastSyncAttimestamp made the first post-restore sync behave like a
re-sync — and with "hide new categories on resync" on, every category looked "new" and got hidden,
leaving the screen empty. Restored sources now take the fresh-install sync path, so your restored
show/hide preferences are honored exactly as they were. (community PR #73) - Concurrent playlist syncs no longer corrupt each other — and still run in parallel. Syncing
two or more playlists at once (manual resync, startup auto-refresh) used to race on the shared
SQLite tables: one source's index/FTS-trigger drop-and-restore cycled against another's concurrent
writes, throwingSQLiteDatabaseLockedExceptions that truncated the second source's movies and
skipped its series entirely — silently reported as success. PR #73 added a per-table index lock
that fixed the "trigger already exists" crash; this release closes the remaining race at its
source: a second sync arriving on a table in bulk-insert mode now joins that mode (writer-counted)
instead of bypassing the lock, and the index restore waits for the last writer. Sources download,
parse and insert fully in parallel — no app-wide queueing — with every playlist syncing to
completion regardless of how many run at once. (community PR #73 by @pt5pnzghm6-sys) - Incremental M3U resync — no more clear-and-reimport. M3U playlists used to be wiped and fully
reinserted on every resync (playlists carry no provider item ids), which was slow on big playlists,
briefly emptied the grids mid-sync, and re-created every row so favorites/history/manual order
pointed at dead entries. Each M3U item now gets a stable synthesized key (name + group), and
resyncs run the same hash-diffed upsert as Xtream/Stalker: unchanged items are skipped, changed
items (including reordered playlists and series that gained/lost episodes) update in place keeping
their identity, and removed items are pruned. Favorites, watch history, playback progress and
manual ordering on M3U content now survive resyncs. The first resync after this update migrates
old rows to stable keys once (that one resync still relinks like before; per-item hide/rename
customizations on M3U sources reset once); every resync after that is incremental. A failed
download or a playlist missing a content type still never wipes existing rows.
🐛 Fixes
- Settings → About shows the updated Telegram group QR code.
- Editing a source no longer shows the other source types. The Edit-source screen listed all the
type chips (Xtream / M3U / Stalker) even though the type can't change while editing. It now shows
only the chip matching the source you're editing. - Accent hex code field is no longer hidden behind the keyboard. The hex input sits above the
color picker so the on-screen keyboard can't cover it while you type a code. - Latency warning popup: focus returns to the Live latency row. After picking Low latency (or
a below-Balanced custom value) and dismissing the heads-up with "I understand", focus used to jump
to the first row of Video Player settings ("Hardware decoding") instead of the row you were on. The
picker→popup transition was clearing the pending return-focus target; it is now preserved through
the popup so focus lands back on the Live latency row. - Live preview off: audio no longer keeps playing after you leave a channel. With the in-pane
Live preview turned off in Settings, exiting a full-screen live channel left the ExoPlayer engine
decoding the stream's audio in the background (nothing re-took the engine to silence it, unlike when
preview is on). Leaving full-screen now stops that engine when the preview is disabled. - 4K live channels no longer lag/judder on mpv when a provider sends broken timestamps. Some IPTV
4K feeds send non-increasing / duplicate presentation timestamps; mpv is strict about PTS and was
dropping nearly every frame (render output collapsing to ~8–12 of 30 fps) while decode itself was
fine — so the channel looked laggy on mpv even though ExoPlayer played it cleanly. Live playback on
mpv now derives timing from the container FPS (correct-pts=no), stops chasing the audio clock
(video-sync=desync), and no longer drops frames (framedrop=no) — all live-only, so VOD keeps
accurate PTS/seeking and normal frame-dropping. Confirmed on Realtek 4K hardware across 24/30/50/60 fps
channels with zero frame drops. - Playlists & EPG Sources menus: focus now stays inside the list. Entering either sub-menu used to
land focus on the "Add" button instead of the list; after editing, re-syncing, or deleting a source,
focus escaped the menu to the "Add" button. Both screens now track the row you acted on (per-row
FocusRequester) and restore focus to that same row on edit/re-sync, move it to the nearest surviving
neighbour on delete, and fall inside the list on entry. - Settings dialogs no longer let D-pad escape behind the scrim. Every scrim dialog in Settings
(Zoom, Accent, Theme, About, Playback error log, Clear history, Catch-up time, plus the Backup,
Video Player picker/stepper, Customize and shared Number/Picker dialogs) was missing the focus trap,
so a D-pad press toward the edge could land on the settings rows behind the dialog. All now use
trapAllFocusExitlike the rest of the app. - No more "scroll animates from the top" when closing a Settings / Video Player dialog. Opening a
scrim dialog over a scrollable settings list reset the list's scroll to the top, so closing it made
the list visibly scroll back down to the row you came from. The scroll position is now snapshotted
when you tap a row and restored instantly on dialog close, so the list stays exactly where it was. - Settings dialog-close focus return hardened. The
dialogReturntarget (which row to refocus when
a dialog closes) was being cleared in the wrong place, so it leaked and could misroute the next
directional entry; it is now cleared in the restore effect itself. The entry fallback is also
search-aware (uses the always-bound search field while searching, instead of an unbound row). - OpenSubtitles, Network & Metadata settings: focus no longer escapes on entry / state changes.
These three screens had no focus-group safety net, so entry focus could fall to the sidebar. The
OpenSubtitles screen also stole focus back to the first row on every server state change (e.g. after
pressing Refresh) and never restored focus when returning from the Delete-subtitles screen with no
state change — all fixed. - Profiles, Mini-player, Customize, CH+- paging, Weather: focus returns to the row that opened a
dialog. Closing a dialog in these sub-menus used to send focus to the screen's first row. Each now
tracks its opener row and restores focus there; the CH+ / CH− skip rows also got their own
FocusRequesters (they had none). - Long-press context menus in Movies / Series / Live / Guide no longer let D-pad escape behind them.
The long-press menus used the OK-key guard but not the focus trap; D-pad could now escape behind the
scrim. All now trap focus inside. - Downloads: focus moves to the next download when you delete one. Deleting a download used to let
focus escape to the sidebar; it now moves to the nearest surviving download row (same slot, else the
last row). - Home & Customize category lists trap vertical focus. A held D-pad Up/Down that outran the lazy
composition could escape the list to the sidebar; both now usetrapVerticalFocusExitlike every
other browse list. - Category rail: abbreviation badges removed. Next to each category name the rail showed a short
2–3 letter code derived from the name (e.g.UPRbeside "UK PRIME RAW") in a fixed-width column.
This was left over from the old compact-pill rail and read as clutter on what was otherwise a
full-label column. Category folders now show just the name; Favorites and History keep their
star / clock icons inline before the name. The content-pane subtitle also shows the full category
name instead of the abbreviation. (#75) - Subtitle search overlay: sign-in moved to Settings only, local-file button removed. Opening
Search OpenSubtitles while signed out (or after the session expired) used to offer three buttons
— add account / select local file / skip — plus an in-place username+password sign-in popup. Sign-in
now lives only in Settings → Video Player → Subtitles → OpenSubtitles (which already had it):
the signed-out overlay shows a clear note pointing there with just a Close button, and the
in-overlay sign-in and sign-in-failed dialogs are gone. The overlay's Select local file button
was removed too — the dedicated Select local subtitle file row in the Subtitles menu (right
below Search OpenSubtitles) already covers local subs. - Catch-up dialog: D-pad focus no longer escapes the popup. Opening the catch-up programme picker
(long-press a channel → Catch-up) left the dialog without a hard focus boundary, so a stray D-pad
press — or the Live screen's own focus restoration — could drop focus onto the channel grid behind
the scrim. The dialog now wraps inPopup(focusable = true)and traps focus exit, matching the other
scrim dialogs. It also picks up the standard popup-menu styling: the Lora serif font at 75% scale
and a denser box, so it reads like the EPG-match and other popups. - Category rail highlight: sharper corners. The focused / selected box on the category rail (used
by Live TV, Series and Movies — one shared component) had a soft14dpcorner radius that read as
nearly pill-like; it's now8dp, crisper and closer to the channel-list item style next to it.
What's Changed
- Sync improvements by @pt5pnzghm6-sys in #73
Full Changelog: v4.1.3...v4.1.4