github LumoraPlayer/Lumora v6.6
Lumora v6.6

6 hours ago

Lumora v6.6

Setup

  • Settings lays its options out in columns where a row was mostly empty. The General pane puts Simple mode beside Disable VOD and the three language rows on one line, Playback puts its two skip toggles side by side, Regions lays its 50+ country checkboxes out three to a row, and the provider form puts Username beside Password and the three Stalker identity fields on one line. Columns use their own wider gap, because the focused card scales to 1.06 and its ring was crossing into the card beside it.
  • The settings screen is three quarters of its old size, with bigger labels and tighter boxes. On a TV every settings row was a tall card with one line of text floating in the middle of it - a checkbox row took ~85dp, and panes scrolled to reach their own buttons. The TV tier's boxes come down: rail 190dp to 142dp, card padding 12dp to 7dp, every gap, icon and target with it. The type goes the other way, back up to 9-16sp: the point was the air, not the labels, and the first pass at this took the labels down with the padding and made them hard to read. Phones are untouched; this is the values-sw540dp tier only.
  • The category picker is called Category Selection, and sits under the provider's name. The row used to be called Import and lived at the bottom of the Xtream form, below the credentials - it is now the second thing the form asks for, because it decides what this provider is, while the credentials below only say how to reach it. The dialog is titled the same, renders at three quarters of the panel's usual size (it is a long list of short labels and filled the screen for no extra information), carries no message line, and has two buttons instead of three (Select all already does what a separate "Import everything" did). Which regions the selection was narrowed by now shows in the row's own summary ("210 categories only · United Kingdom"), where it stays visible after the dialog is closed.
  • The dialog's buttons can no longer be clipped off the bottom edge. DialogChoiceList reserved 180dp for the title, message and button row, which was not enough once a dialog carried a real message: the panel measured taller than the window, and the actions were cut off below the screen - the category picker was the first dialog to hit it. It now reserves 300dp, and the picker's list is what shrinks. Also fixed: Select all / Unselect all updated the button label but not the rows, because the state was written before the adapter was told to repaint. The picker also drops its message line - a scrolled row could paint over it, and the hint it carried now lives in the row summary.
  • The category picker knows about regions. Rows are resolved with the same localityOf the Live tab filters with, so a UK-only region selection starts with the US and Arabic categories already unticked - the import then never asks the panel for them, which is the whole point of narrowing. Language tags (|EN|, EXYU) and brand buckets are never unticked: they are not places, and they are the cross-language rows a user notices missing first. A row whose categories disagree on their region (an AR| group holding both Arabic and Argentina) stays ticked rather than guessing. An explicit selection is never second-guessed - the region filter only decides the default.
  • Select all / Unselect all in the category picker. One button that ticks everything when anything is off and clears everything when all of it is on, without closing the list.
  • Unticking every category in a section now imports nothing from it. An empty selection already meant "no narrowing - import everything", so a section the user cleared silently came down in full. The cleared state is stored as a marker (IptvProviderConfig.NO_CATEGORIES) that the ingest reads as "skip this section", and the Import row says No categories instead of counting the marker as one.
  • Adding a provider now asks the two questions that decide what it imports. Saving a new panel opens a Regions popup and then a Categories popup built from the panel's own categories, and only then starts the import. The region step appears only while this is the first catalogue provider, since that selection is one global Live-tab filter; category narrowing is per provider, so it is asked on every add. Both steps are skippable and the import always runs, so a panel that will not authenticate (or a user who wants the lot) is never blocked - it says so and imports unfiltered. Nothing new is stored: the region picker writes the same preference as Settings > Regions, and the category picker the same per-provider narrowing the form's Import row uses. Editing an existing provider saves exactly as before, with no popups.

Detail

  • The content page now sits on the title's own artwork. The landscape backdrop fills the detail screen behind the cover, synopsis, cast and episode list, under a two-layer scrim (an even wash plus a vertical fade) that stays readable on bright stills and works in RTL. The cover card grows to 120x180 on TV, the title to 26sp, the synopsis to 14sp primary text, and cast faces to 64dp with 11sp names. A provider/TMDB backdrop replaces the poster fallback without being stretched into the 2:3 cover, fades in once rather than flashing when the metadata arrives, and is cached at 1280x720 (TMDB now requests w1280) alongside the other artwork caches.
  • The series page reads as one season view instead of a stack of stray controls. The selected season's chip scrolls into view and its name and episode count now head the list, season chips and their watched toggles are large enough to hit from the sofa, and each episode row leads with its number and title before a meta line for the air date and resume note, with the synopsis under it. Films no longer end on an empty divider and "Episodes" heading, and on a portrait phone the synopsis and action band stack instead of running off the right edge.
  • A film's page closes with a More Like This strip. TMDB's recommendations for the title sit below the versions row as poster cards carrying the year and score, and picking one opens that title's detail page - the library copy when a source carries it, Find Stream when none does - with Back unwinding the recommendation trail to the film it started from. The list is cached per title, drops the current film, artwork-less entries and duplicates, and stays hidden for series or when TMDB has nothing to recommend.

Live TV

  • The live preview is docked above the guide instead of covering it. The 16:9 preview now sits in its own glass shelf beside the channel name, what is airing now, the progress bar and the next listing, so the time ruler and programme blocks keep their full width and no row is ever hidden behind the video. The guide's channel column is wider (240dp on TV), and long provider category names get a third line instead of an ellipsis.
  • The Live TV dropdown is a proper remote menu. The translucent glass overlay that let guide text show through is now an opaque panel matched to the top chrome. Rows are 48dp with larger icons and 16sp labels, the current pane carries a selected row, one focus ring follows the D-pad (the anchor tab drops its ring while the menu owns focus), the caret flips while it is open, and the panel drops below the bar instead of cutting into it.
  • The Live TV tab opens on Live TV, not Multiview. Pressing the tab while already in the Live section opens its dropdown with the Live TV row focused, so a second OK returns to plain browsing; Multiview and Catch Up are one D-pad press down. Previously the menu focused Multiview (the first row after Live), so pressing the tab and then OK launched Multiview instead of selecting Live TV.
  • The player's guide rail respects a failed channel's backoff. The new controls-bar rail asked for a guide on every channel change even while the guide's five-minute failure backoff was running, so zapping through a panel that was refusing requests spent a fresh round of variant, table and short-EPG calls per channel. A fresh in-memory guide now opens the rail with no request at all, and a channel that just failed is left alone until its backoff expires - the same rule the guide rows already followed.

Multiview

  • A one-channel grid fills the screen, and the action bar has its own strip. The grid now uses one column for a single pane (two for 2–4), and the shell reserves a real bottom strip for the status line and actions instead of floating them over the last row. The five actions are 48dp labelled pills in a horizontal scroller with a readable indigo fill, a white focus ring and a pressed state, so they hold up on a 320/360dp phone and at large font scales.
  • A failed selected pane hands audio and focus to a working one. The pane shows a centered Offline / "retrying automatically" state, the Fullscreen action becomes Retry, and a grid with no working pane drops audio focus instead of leaving the whole grid silent. Closing the last pane restores its channel to the guide preview.
  • Multiview now reads its state and direction correctly. Pane content descriptions include screen number and audio/connecting/offline state, the status line is a polite live region, left/right follows RTL, and rotating during add mode re-flows the grid to the new column count.

Browsing

  • The top bar is an icon-first nav that names the section you are in. Tabs stay icon-only until selected; the active tab grows into a brand-tinted pill carrying its full name, so the row stays compact without hiding where you are. Search, Settings and Refresh are pinned 48dp icon buttons at the trailing edge, and the ambient clock steps aside on narrow tablet widths. Live TV now carries the television-screen mark, Sports a filled football, and Series a stacked-episode mark, so the icons are distinguishable at tab size.

Storage

  • About now shows what Lumora is using, and lets you clear it. A Storage row in About reports the app's whole footprint - cached files, downloads, local recordings, catalogue/guide databases and other app data - using the same accounting as Android's app-storage screen, and calculates it lazily when About is opened. Tapping it opens a breakdown with targeted actions: clear cached files, clear all downloads (including unfinished ones), clear local recordings (blocked while a recording is running, and NAS recordings are never touched), and compact the catalogue/guide databases. Every destructive action confirms first, and the breakdown refreshes with the space actually freed.

Catalogue

  • A bloated stored catalogue can no longer take the app down on cold start. The live read now filters by the enabled owners in SQL (providerId = '' OR providerId IN (...)), so rows left behind by a removed or switched-off provider are never turned into Channel objects before the deferred prune deletes them; provider-less anime/plugin rows still pass. EPG sync and the Android Auto media browser use the same owner list, so a background reader cannot reintroduce the unbounded read. This is the failure a 727 MB legacy catalogue produced: the live scan and the search-key backfill ran together, the heap filled, and the finalizer watchdog killed and restarted the activity in a loop.
  • The resident live list has a heap-scaled ceiling. CatalogRepository.live() stops at a quarter of the process heap, clamped to 40,000-200,000 rows (about 149,000 on a 512 MB TV stick), and liveForProvider() applies the same cap to the provider-toggle path. A pathological panel now stops with a LumoraCatalog warning instead of exhausting the heap; VOD and search stay database-backed. The ceiling is a safety valve, not the normal path - the SQL owner filter and the post-paint prune keep real catalogues under it.
  • The search-key backfill waits for the first live read. The whole-table pass now starts only after the live preload completes, so it cannot compete with the scan that paints Live TV on a large catalogue. Search keeps matching by name for rows the backfill has not reached yet.
  • The resident catalogue is capped by row count, not just playlist size. Payload bytes were the wrong unit: a panel under the 40 MB cutoff expanded into 372,042 rows, and RAM mode tried to hold every one - five minutes of CPU, ~600 MB of heap on a 3 GB TV and an ANR before the first paint, which read as the app being stuck on "Loading...". CatalogMode now also requires the last build's row count to fit a quarter of the process heap (~89,000 rows on a 512 MB heap), remembers that count after every resident build and ingest, and ResidentCatalog re-counts the table before it builds, refusing the resident model (and dropping the flat cache it would have loaded) when the catalogue is over the cap. That panel's first content went from 315 s to 3 s, and the Room path reads only the enabled owners' rows.

Providers

  • A narrowed import no longer hammers the panel. A selection that covers half or more of a section is now read in one request and filtered on the device, so unticking one row can no longer turn three bulk lists into hundreds of round trips. A genuinely small selection still reads one category at a time, but with a short gap between requests, and a category the panel rate-limits now waits out its Retry-After (up to a minute) and retries once - one 429 stops abandoning the section and re-downloading it in full on the next load.
  • A rate-limited provider says so. When a panel's brake is what fails the live list, the provider error now carries the panel's own message ("Provider is rate-limiting requests; try again in 45s") instead of a generic "live channels failed to load".
  • An Xtream panel handed out as an M3U link is added as Xtream, not M3U. get.php?username=...&password=...&type=m3u_plus is the same panel's playlist endpoint, so saving one now stores the server, username and password as an Xtream provider and reads the catalogue through player_api.php instead of downloading and classifying the whole playlist. The conversion keeps the provider's name, id, content gates, backup flag, connection limit, custom User-Agent and discovery provenance; it works for manual adds, edits, phone-QR pairing and plugin-discovered candidates; and it leaves ordinary M3U playlists, local files, embedded-credential URLs and Stalker get.php exports untouched. A panel mounted under a path keeps that path, and both the provider row and the save toast say Xtream so the change is visible.

Installation

Download the APK below and install on your Android TV, Fire TV Stick, or phone.

Don't miss a new Lumora release

NewReleases is sending notifications on new releases.