Skip to content

OwnTV v4.1.4

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Jul 15:34

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 its categoryId, 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 shared ChannelGenre helper (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 saved lastSyncAt timestamp 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, throwing SQLiteDatabaseLockedExceptions 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
    trapAllFocusExit like 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 dialogReturn target (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 use trapVerticalFocusExit like 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. UPR beside "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 in Popup(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 soft 14dp corner radius that read as
    nearly pill-like; it's now 8dp, crisper and closer to the channel-list item style next to it.

What's Changed

Full Changelog: v4.1.3...v4.1.4