Skip to content

Integrate MyAnimeList tracking and enhance episode reporting - #21

Merged
professorDeveloper merged 7 commits into
masterfrom
improve-app-and-fix
Aug 24, 2026
Merged

Integrate MyAnimeList tracking and enhance episode reporting#21
professorDeveloper merged 7 commits into
masterfrom
improve-app-and-fix

Conversation

@professorDeveloper

Copy link
Copy Markdown
Owner

No description provided.

Live TV already told the player what it was handing over — `type: 'live'`
— and the player never read it. Whether a stream was live was guessed
from its duration alone, and plenty of live HLS carries a DVR window and
reports a perfectly finite one. Those channels were treated as files: a
scrub bar over something unscrubbable, frame-preview extraction against
an endless stream, and the live edge read as the end of the video.

So the declared type decides, and it is known before the first frame
rather than after it, because a channel that is down when you open it
fails during initialize() and that is exactly the path that needs to know.

Reconnection is the other half. A film either plays or is broken, so four
retries a session is generous; a channel drops because a segment was
late or a CDN failed over, and the only right answer is to open it again.
Four in a two-hour evening meant the player gave up for good on something
that was working seconds later. A broadcast now reconnects with a backoff,
on errors a file would call fatal — a 403 on a live edge is usually a
rotated token, and the next playlist fetch has the current one.

Seeking is refused outright. The double-tap gesture reached the same
seek as the scrub bar, and a tap landing outside the DVR window stalls
the stream with no way back but leaving the channel.

Channels also carry the headers their origin insists on, all the way to
the player and into the pinned-card cache — a header-gated channel used
to work once and 403 forever after being favourited.
It was reachable only through Profile, seven rows down a settings list.
That is a fine place for a preference and the wrong place for a thousand
channels: Live TV is content, and it belongs where the content is.

Home grows a rail of channel logos above the catalogue sections. A rail
rather than a link, because a channel is picked in a second and watched
immediately — tapping a logo plays it, and the header still opens the
full page for folders and search. Logo-forward and square, since a
channel is recognised by its mark long before its name is read.

It loads itself and renders nothing until it has channels, so a backend
with no line-up — or no network — leaves Home exactly as it was rather
than showing an empty shelf.

Live TV also remains available as a bottom-bar tab; it has been in the
registry all along, just not on by default.
AppColors.primary is a getter — the accent is a user setting — so it
cannot appear in a constant expression, which is exactly what
app_colors.dart says at the top. The LIVE dot's decoration claimed const
and failed to compile.
The screen was a search box, a folder grid and a paged wall of logos. It
told you a thousand channels exist and nothing about any of them, and the
guide the backend had started returning was not read at all.

Channels now carry their listing. A card shows what is on now, how far
through it is, and what follows; a long press opens the channel with its
schedule for the day. About 38% of the line-up has no guide, so every one
of those paths is written to look deliberate without one rather than to
show a gap where a title should be.

Around that: categories and countries are one index rather than two
competing navigations, pinned and recent channels lead, and the states
that were bare — first load, loading more, no results, offline — are all
drawn. Country names are in English, like the channel names beside them;
a strip reading "O'zbekiston" over a grid of "Pluto TV Comedy" was two
languages doing one job.

The clock is the part worth being careful about. Times arrive as UTC and
are converted on the way in, so an hour rendered is the viewer's own;
progress is clamped at both ends so a stale payload reads as finished
rather than as 140%; and a bar is only drawn for a slot between five
minutes and six hours, because a feed padding a thin guide with a
nine-hour block would otherwise show a bar that has not moved since
breakfast.
@professorDeveloper
professorDeveloper merged commit 35d39cd into master Aug 24, 2026
@professorDeveloper
professorDeveloper deleted the improve-app-and-fix branch August 24, 2026 11:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant