Skip to content

OwnTV v4.1.3

Latest

Choose a tag to compare

@github-actions github-actions released this 19 Jul 08:40

v4.1.3 β€” 2026-07-19

πŸ’¬ External subtitles β€” OpenSubtitles search & local subtitle files

  • Search OpenSubtitles from the player. For any movie or series episode, open Subtitles β†’
    ADD SUBTITLES β†’ Search OpenSubtitles
    . The search is pre-filled from the item's identity (TMDB id
    when available, else title/year and season/episode), shows language, release name, Trusted/SDH/AI
    tags and download counts, and supports Edit search and All languages. Picking a result
    downloads the subtitle, attaches it live without interrupting playback, and remembers it for that
    profile and title. Never automatic: OwnTV only searches or downloads when you ask.
  • OpenSubtitles account, per profile. Sign in from Settings β†’ Video Player β†’ Subtitles β†’
    OpenSubtitles
    (free account at opensubtitles.com), with an optional Stay signed in.
    Each OwnTV profile connects its own account; the allowance display shows the provider's own
    remaining-downloads and reset values. Credentials sit in Android-Keystore-sealed storage, are wiped
    on sign-out/profile deletion, and are never logged. They enter a backup only when you set a backup
    password β€” encrypted per profile, and omitted entirely from a password-less backup. If you pick Search OpenSubtitles
    while signed out, a friendly dialog lets you add the account right there (or jump to a local
    file instead).
  • Local subtitle files β€” no account, no internet. ADD SUBTITLES β†’ Select local subtitle file
    opens OwnTV's TV-safe file browser for .srt / .ass / .ssa / .vtt / .webvtt files (USB or
    internal storage). Non-UTF-8 files (Windows-1256 Arabic, Windows-1252, ISO-8859…) are detected and
    converted automatically so they render correctly, and OwnTV keeps a managed copy so the subtitle
    keeps working after the USB stick is gone.
  • Subtitle timing. Subtitles β†’ ADJUST β†’ Subtitle timing nudges the active subtitle in
    Β±0.1 s / Β±0.5 s steps while the video keeps playing, with plain-language direction (earlier/later).
    The offset is remembered per profile, per title, per exact subtitle release β€” a WEB-DL sub and
    a Blu-ray sub keep separate offsets, and switching subs never inherits another's offset.
  • Smart caching, quota-friendly. Downloads are cached on the device and deduped: re-picking a
    subtitle any profile already downloaded re-uses the file and spends no download quota. On
    replay, a title's previously downloaded subtitles are re-listed in the Subtitles menu ready to pick.
    Everything works across both playback engines, including the in-player MPV/EXO toggle, and for
    OwnTV Downloads β€” offline, with the OpenSubtitles moviehash silently sharpening online matches
    for downloaded files.
  • Manage & delete. Settings β†’ OpenSubtitles β†’ Delete subtitles lists every downloaded
    subtitle by Movies/Series with per-item and bulk delete; long-press a movie or episode for
    Delete OpenSub subtitles. Deletion is per profile β€” a subtitle another profile also downloaded
    stays available for them.
  • Privacy: the OpenSubtitles API key lives only in an OwnTV-run Cloudflare Worker (like the TMDB
    proxy) β€” never in the app; only subtitle-search data is ever sent (no stream URLs or IPTV
    credentials). This product uses the OpenSubtitles API but is not endorsed or certified by
    OpenSubtitles.

πŸ‘₯ Profile-based backups (merge restore, PIN-protected)

  • Backup export now starts with a profile picker. Every backup is per-profile: choose which
    profiles ride in the file (none pre-ticked β€” you decide), then pick the data sections as before
    (the old "Profiles & sources" section is now just "Sources"). Only the selected profiles' data β€”
    favorites, history, resume positions, customizations, startup modes, Customize PINs β€” and only the
    sources they actually use are written.
  • Locked profiles need their PIN. Ticking a PIN-locked profile that isn't the one you're signed
    into prompts for that profile's PIN; a wrong PIN shows "PIN incorrect" and the profile stays out of
    the backup. Your current profile never re-asks (you already passed its gate). Profile PINs
    themselves are stored in the file only as salted hashes, never as the actual PIN.
  • Restore now MERGES β€” it never deletes existing profiles or sources. Profiles are matched by
    name: a profile already on the device is updated from the backup, and profiles only in the backup
    are added β€” your other profiles are left completely untouched. Sources match by address, so a
    shared playlist isn't duplicated. (Previously a restore replaced everything.)
  • Profile names are now unique. Creating or renaming a profile to a name that already exists is
    blocked with "This name is already taken" β€” names are how restore recognises the same profile.
  • OpenSubtitles logins now ride in encrypted backups. With a backup password, each ticked
    profile's OpenSubtitles sign-in (username + password/token) is included, sealed with your passphrase,
    and restored to the matching profile on the target device. Without a backup password it's omitted,
    exactly like source passwords, the Stalker MAC and the proxy/TMDB secrets.

πŸ“± Add a playlist from your phone (Remote setup)

  • "Add source" now starts with a Remote / Manual choice. Pick Manual to type Xtream / M3U /
    Stalker details with the remote as before, or Remote to fill everything on your phone. Both the
    first-run setup wizard and Settings β†’ Manage sources offer the choice.
  • Remote setup shows a QR code, a URL, and a one-time PIN. Open the server on the TV, then on a
    phone or laptop on the same Wi-Fi scan the QR (or type the URL). The page first asks for the 6-digit
    PIN shown on the TV, then shows an OwnTV-styled form with Xtream / M3U / Stalker tabs. Fill it,
    tap Send to TV, and the details appear in the Add Source screen on the TV β€” you press Start
    Import
    with the remote (the phone never starts the import itself).
  • Secure by design. The QR carries only the URL, never the PIN; every submission must carry the
    PIN or it's rejected (401). A fresh PIN is generated each time the server opens, passwords/MAC are
    never logged, and the listener stops automatically when you leave the screen.
  • Core idea from @zarga03 (PR #66) β€” reimplemented and hardened for OwnTV: added M3U support and
    the phone-side type picker, the one-time PIN gate, the QR onboarding, an app-matching web form, and
    "fill the form, you press Start Import" semantics.

⏱️ EPG sync: Run in background (onboarding)

  • The "Sync the TV guide now?" step during first-run setup can now Run in background. Once the
    guide starts downloading you no longer have to wait on the sync screen β€” press Run in background
    to enter the app while the guide keeps downloading (matching the playlist import's own background
    option).

πŸ—‚οΈ Categories grouped by provider + new-category control

  • Multi-provider category lists no longer interleave. When you view All playlists (or a profile
    with two or more linked sources), the category lists across Live/Movies/Series browse, Customize, EPG,
    Search and Home now stay grouped by provider (in the order you added them) instead of mixing two
    providers' categories together. A single selected playlist looks exactly as before.
  • Provider name on Customize rows. When more than one source is in scope, each Customize category row
    shows which provider it belongs to, so bulk-hiding across providers is easier to follow.
  • "New category behavior" (Show / Hide) β€” per profile. A new setting at the top of Settings β†’
    Customize
    decides what happens to a category the provider adds on a later re-sync: Show (default,
    the old behavior) or Hide it automatically. Useful if you keep only a few categories visible and
    don't want new ones appearing. It rides in the Customize backup/restore like other per-profile settings.
  • Re-sync tells you the category churn. The sync-complete message now shows "N categories added,
    M removed" when a re-sync changes them β€” so you still know new categories exist even when you hide them
    by default. (Never shown on a source's first sync, where everything is new.)
  • Community PR #70 by @pt5pnzghm6-sys (related to issue #60).

🎨 Smaller tweaks

  • Default UI zoom is now 90% (was 100%) so more of each screen fits on smaller TVs out of the box;
    adjustable any time in Settings.
  • The Player settings "OpenSubtitles account" row is now just "OpenSubtitles" β€” it holds sign-in
    and the downloaded-subtitle manager, so the shorter name fits what's inside.

πŸ“Ί Live TV β€” current programme in the channel list

  • Now-playing subtitle on every channel row. The Live TV channel list now shows the programme
    currently airing under each channel name (a small second line), sourced from your guide data. The
    channel-list column is also a little wider so the longer rows breathe, and the preview pane a
    little narrower to match. Channels without guide data look exactly as before β€” single line.
  • Same in the in-player channel overlay. Pressing Left (while the player controls are hidden)
    to open the side channel list now shows the same current-programme subtitle under each channel, so
    you can see what's on without leaving fullscreen.
  • Detail: the list uses the stored bulk guide only (one batched query, refreshed every 60 s); the
    focused-channel preview pane keeps its full provider short-EPG fallback. No per-row network calls.

πŸ”„ EPG / Guide sync status pill

  • Updating the guide now shows the status pill too. The small semi-transparent pill that already
    reports background playlist syncs now also reflects EPG/Guide downloads β€” manual resyncs from
    Settings β†’ EPG Sources and the automatic startup/staleness refreshes. It reads "Updating guide Β·
    source Β· N programmes" and disappears when the sync finishes. Catalog syncs keep priority; if both
    run at once the pill notes "Β· EPG too".

🎯 Smarter EPG matching

  • Match EPG picker suggests related channels first. Long-press a channel β†’ Match EPG (Live TV
    or Guide) no longer opens on a plain A-Z list: guide channels similar to the channel's name float
    to the top
    , best match first (e.g. opening it on "MTV FR" shows the MTV entries immediately). The
    ranking also applies while you type a search. The picker now scans the whole guide-channel set
    instead of only the first 300 alphabetical entries.
  • The name matcher itself is more robust (used by the picker ranking, the Guide's Auto-match
    all
    , and single-channel auto-match):
    • Spelled-out country names match their codes β€” "MTV France" ↔ "FR| MTV" is now an exact match
      (guarded so channels like France 24 / France 2 keep their name).
    • Number words β€” "BBC One" ↔ "BBC 1" now match.
    • Word-order tolerance β€” "France MTV" ↔ "MTV France" score highly via token overlap.
    • Channel-number guard β€” "Sky Sports 2" can no longer match "Sky Sports 3" (never even offered),
      and "MTV" vs "MTV 2" is capped below auto-apply so it goes to review instead of silently applying.
  • Dialog ergonomics on TV remotes. In the Match EPG picker and the Auto-match review popup,
    the action buttons (Close / Clear match, Accept all / Skip all / Done) moved to a right-hand
    column
    β€” press Right from any list row to reach them, no more scrolling to the bottom of a long
    list. Focus is also contained inside the popup now (a stray D-pad press can no longer drop focus
    onto the screen behind it).

🎬 Better TMDB title cleaning

  • The movie/series title normalizer (what builds the TMDB search query) strips more provider noise
    while keeping real titles intact: audio/language tags (VOSTFR, VF, SUBBED/DUBBED, DUBLADO/LEGENDADO,
    TRUEFRENCH, LAT
    ), release markers (HDCAM, CAMRIP, HDTC, HDLight, 10bit, 60fps, AAC/AC3/DTS, 5.1/7.1),
    trailing season/episode tails on series names ("Show S05", "Loki Season 2", "Dark Staffel 1",
    "Temporada 3", "S02E04"), and trailing uppercase language codes ("Movie FR"). Guarded so titles like
    Ocean's 8, Se7en, Area 51 and Sub Rosa are never touched.

πŸ—‚οΈ Storage access that works on more TVs

  • One-click "Grant full storage access." The file/folder picker (download folder, local M3U
    import, backup) now has a single grant action that opens OwnTV's own app-settings page, where
    you enable Allow management of all files yourself. This fixes OEM TVs (e.g. TCL Android 12)
    whose system "All files access" screen is hijacked or missing, which previously left no working
    way to grant storage from inside the app. On Android 10 and below the standard permission dialog
    appears instead (it grants full access there). A media-only grant is no longer treated as storage
    access β€” it hid .m3u/backup files behind scoped storage.
  • The picker is a real dialog window now. D-pad focus physically can't escape onto the screen
    behind it anymore, and access is re-checked when you come back from system settings, so the grant
    row disappears immediately after granting.

🎨 Compact popup menus in a new serif font

  • Popup menus are ~40% smaller and render in Lora (a free, open-licensed serif; only popups β€”
    the rest of the app keeps its sans-serif): the player's subtitle/audio/track menus, Settings
    option pickers and +/βˆ’ steppers, the playlist switcher, and the storage/file
    picker
    (now 300 dp with restacked footer buttons).
  • Match EPG picker (Live TV & Guide long-press) shrank 40%, the Guide's Review EPG matches
    popup 20%, and the Customize screen's PIN dialogs got a compact variant β€” all in the Lora
    serif. The profile "Who's watching?" PIN dialog is unchanged.

πŸ”€ CH+- key paging for browse panels

  • Page the category & item lists with the remote's CH+ / CHβˆ’ keys. In Live TV, Movies and Series,
    the CH+ / CHβˆ’ keys now page whichever panel currently has focus β€” the category rail or the item
    list/grid. Short press jumps a configurable number of items (clamped at the ends, so a short list
    reaches the end in one press for free); long-press CH+ jumps straight to the first item and
    long-press CHβˆ’ to the last. A lifesaver for big libraries (e.g. 50k live channels, 500+
    categories) where scrolling top-to-bottom was impractical.
  • Per-direction skip counts, typed or stepped. New Settings β†’ Content β†’ CH+- Key Paging: a
    master on/off, plus a separate skip count for CH+ and CHβˆ’ that you can type directly or nudge with
    βˆ’ / +. The dialog warns (advisory, never blocking) when a count exceeds 50, since large skips
    overshoot short lists and may feel jumpy on low-end TVs; a hard cap of 1000 guards against typos.
  • Apply to the focused panel only. The keys never fire when focus is elsewhere (e.g. the top bar),
    and a master toggle lets users whose remotes map CH keys to something else opt out entirely. The
    category rail moves focus only β€” selection still happens on OK, so a stray CH press never reloads
    a category's channels. All jumps use instant scrollToItem (no animation) to avoid jank on slow
    TVs over big distances. Defaults: enabled, skip 10 each direction.
  • Long-press is disabled on the "All" list. On the built-in All channels / All movies / All series
    list a long-press jump to the very last item (e.g. the 170,000th movie) is pointless and janks, so
    long-press does nothing there β€” short-press skipping still works normally. Real categories and
    folders keep long-press jump-to-first/last. (This checks the built-in All key, not the name, so a
    provider category literally called "All Hindi" is unaffected.)
  • Also pages the Customize category list. The same CH+ / CHβˆ’ paging now works in Settings β†’
    Customize Categories & Items
    , where the list is just the raw provider folders (no "All"). Handy
    with big provider category lists; long-press jumps to the first/last folder. The keys move focus
    within the list only β€” they can never push focus out of it β€” and the CH+- Key Paging settings screen
    notes this coverage.

πŸ› Fixes

  • "Grant full storage access" no longer dead-ends on OEM TVs. On TCL Android 12 the old grant
    button opened the OEM "Permission Shield" screen, which has no storage entry at all; the picker
    also showed a "grant" option that could only ever yield a useless media-only permission. Both
    replaced by the app-settings route above.
  • Storage picker focus could escape the popup. Moving focus (especially after returning from
    the permission screen) could land on the screen behind the picker; it's now hosted in its own
    window so that can't happen.
  • Deleting an EPG source now shows a "Deleting…" status and can't leave orphaned guide data.
    Removing an EPG source with a large guide (100k+ programmes) took a while to clear from the
    database, but the row vanished instantly with no indication, and leaving the screen mid-delete
    could orphan those programmes with no source left to clean them up. The row now stays with a
    Deleting… badge (its actions hidden) until the delete finishes, the guide rows are removed
    before the source leaves the list, and the delete completes even if you navigate away.
  • EPG match now falls back to a network re-sync when the cache has no data for it. After
    matching a channel, OwnTV fills its programmes from the cached XMLTV without a network call β€” but
    that step reported success even when the cache held none of the matched channel's programmes, so
    the network fallback never ran. It now re-syncs (with the just-saved match included in the sync
    filter) whenever the cache yields nothing for the matched channel. And when a matched channel
    genuinely has no current/upcoming programmes in the feed, the Guide now says so ("Matched β€” but
    this guide channel has no current programmes in the EPG feed yet") instead of leaving a silently
    empty row.
  • Match EPG from Live TV now takes effect immediately. Matching a channel's EPG from the Live TV
    list used to leave the details/preview pane without guide data until an app restart (the row's
    now-playing line updated, the pane didn't). The match now also tops up the matched guide channel's
    programmes from the cached EPG and refreshes the pane right away.
  • Focus returns to the channel after Match EPG. Closing the Match EPG dialog (pick, clear or
    back) lands D-pad focus back on the channel row it was opened for, instead of falling to the nav panel.
  • Customize screen showed categories from every playlist. When you'd picked one playlist (e.g.
    playlist A) via the top-bar switcher, Settings β†’ Customize Categories & Items still listed
    categories from all playlists. It now respects the selected playlist β€” same as the Live TV / Movies
    / Series rails. ("All playlists" still shows the merged set.) Existing reorders/hides are preserved.
  • Customize screen renamed to "Customize Categories & Items" (was "Customize & Hidden Items")
    for clarity β€” it's where you hide/unhide items, rename, and reorder categories.
  • Live TV "Now" no longer shows a future programme (#68). For channels without a configured guide,
    OwnTV falls back to the provider's short-EPG. When that data had a gap around the current moment, the
    "Now" slot could pick the next upcoming programme and mislabel it as live. It now correctly leaves
    "Now" blank on a genuine gap; the upcoming programme still shows under "Next". EPG display only β€” no
    playback impact.
  • CH+- skip dialog alignment. In the CH+- Key Paging skip-count popup, the βˆ’ / + buttons no longer
    sit above the number field β€” they now line up with it (the field's label was pushing them up).

πŸ”’ Security (community PR #65)

  • Customize PIN no longer stored in plaintext (community PR #65 by @aravindtri). The screen lock
    PIN is now stored as a salted SHA-256 hash, matching how profile PINs are already handled. Existing
    installs and imported backups with old plaintext PINs still verify correctly and migrate on use.
  • Hero preview URLs are redacted in error logs. A failed Home hero-preview playback no longer logs
    the raw stream URL (which can carry credentials); it's scrubbed via the existing redactUrl helper.

πŸ“Š Player diagnostics β€” measured fps/bitrate & top-bar bitrate chip (community PR #67)

  • ExoPlayer now shows real fps, bitrate and dropped-frame stats (community PR #67 by
    @pt5pnzghm6-sys). Raw MPEG-TS streams (most Xtream live TV) don't declare frameRate or bitrate,
    so ExoPlayer's Stream Info overlay and the preview's top-left chips used to be blank where mpv
    showed live values. This measures them on the fly β€” fps from decoder-rendered frame timing
    (snapped to a standard rate so a brief stall doesn't give a stray reading), bitrate from actual
    network bytes, and dropped frames since the start of playback β€” all with negligible CPU impact,
    and only computed while the info overlay is open. It also fixes a couple of mpv↔ExoPlayer handoff
    bugs that were blocking correct resolution/fps display for VOD on Exo.
  • Bitrate now appears in the player top-bar chips for all playback β€” Live TV (preview & full),
    movies and series, on both engines. The chip uses the stream's declared bitrate (free to read), so
    it adds no measurement overhead; raw live MPEG-TS streams that don't declare one stay blank in the
    chip (the overlay still shows the live measurement when opened).
  • New "Measured stream stats" toggle (Settings β†’ Video Player β†’ Diagnostics, on by default) β€”
    a one-switch escape hatch. On, the Stream Info overlay measures fps/bitrate/dropped frames as above.
    Off, no live measuring runs at all (declared values only), for the rare low-end TV where the
    measuring is ever suspected of causing stutter. It only gates the diagnostic numbers β€” never the
    actual video pipeline or the mpv↔ExoPlayer handoff.

πŸ“¦ Packaging

  • Smaller downloads β€” split ABI builds. Releases now ship a single arm APK (OwnTV.apk /
    OwnTV-vX.X.X.apk, arm64-v8a + armeabi-v7a β€” for all real Fire TV / Android TV devices, and what
    the Downloader code fetches) plus a separate OwnTV-x86_64-vX.X.X.apk (for emulators / rare Intel
    boxes). The main download roughly halves in size (~104 MB β†’ ~49 MB), which fixes the "parse error
    on install" reports caused by truncated large downloads on Fire TV's Downloader app. x86 (32-bit
    Intel) is dropped β€” even emulators use x86_64.
  • In-app updater picks the APK matching your device. With releases now carrying one APK per ABI,
    the updater selects the asset matching the device's ABI (arm on real TVs, x86_64 on emulators)
    instead of blindly taking the first APK β€” so an arm TV can never download the emulator build, and
    in-app updates now also work on an x86_64 emulator. Older single-APK releases still update fine.

What's Changed

  • Harden customize PIN storage and redact preview URL logs by @aravindtri in #65
  • Add measured fps, bitrate, and dropped-frame reporting for ExoPlayer by @pt5pnzghm6-sys in #67

New Contributors

Full Changelog: v4.1.2...v4.1.3