dependabot/github_actions/actions/setup-java-6.0.0
3
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
595cd9fe24 |
feat(seerr): sign in with quick connect and accept schemeless urls
Linking a Seerr instance had two rough edges, both on the Jellyfin path. The URL step prepended https:// to anything without a scheme, so a plain-HTTP instance on the LAN — 192.168.1.5:5055, or a bare host on Seerr's default port — failed with "could not reach" unless the user knew to type the scheme. And the only way to sign in with a Jellyfin account was typing a username and password, which on a TV remote is misery. Schemeless input now expands into candidates that are probed together, but TLS wins by construction: a plaintext success is held while any https candidate is still in flight and is accepted only once they have all failed. The sign-in that follows posts a password to whichever URL wins here, so a slow-but-working https endpoint has to beat a fast plaintext one, and the wait is already bounded by the probe timeout. When nothing answers, the failure that reached a server outranks a transport error, so "this instance has not completed first-run setup" is not masked by "could not reach https://..." from a candidate the user never typed. Quick Connect goes through Seerr's own proxy routes (3.4+): initiate, then check polled at Seerr's own 2s cadence through the shared pollWithBackoff — a 404 mid-poll means the secret is gone and is terminal — then authenticate, which mints the session cookie through the existing sign-in path. The secret rides in a query string, so it is registered for log redaction the way the Jellyfin flow registers its own. An instance that predates the routes 404s the initiate and is told apart from a generic rejection. SeerrAuthMethod.quickConnect deliberately stores no secret: silent re-auth is impossible by construction, so an expired cookie lands in the existing "no stored credentials" arm, unlinks the session, and the connect flow asks for a fresh code. The affordance is limited to the Jellyfin credential form, since Seerr rejects Quick Connect for Emby, and is not auto-started on TV the way the MediaBrowser form is: /settings/public exposes no "Quick Connect enabled" flag to gate that on. The waiting panel and its attempt/cancel bookkeeping moved out of AddJellyfinScreen into QuickConnectCodePanel and QuickConnectFlowMixin so both screens share one implementation, and the post-frame focus helper both forms use moved to AsyncFormStateMixin. |
||
|
|
369c6279d6 |
fix(i18n): translate the player, downloads and server-setup text left in English
A Portuguese user reported "Skip Intro" rendering in English on Android TV.
The locale files were not the problem - all 22 were structurally complete.
skip_marker_button.dart simply never imported strings.g.dart and assigned
'Skip Intro' / 'Skip Credits' / 'Next Episode' as plain literals. An audit of
lib/ found ~120 more sites in the same state, in four shapes that need
different fixes:
A literal in a file that never imported the i18n layer is the easy one -
skip_marker_button, performance_stats, track_label_builder and codec_utils all
render text with no `t` in the file at all. TrackLabelBuilder._compose now takes
a fallbackLabel builder instead of an English fallbackPrefix, so the caller
supplies t.audioTracks.track / t.videoControls.subtitleTrack and every unnamed
audio and subtitle row in the track menus is localized.
English reaching the user through an exception message is the widest one, and
it needs care: MediaServerException.message feeds both toString() - logs and
Sentry grouping - and verbatim UI display. Localizing it in place would make
bug-report logs follow the user's locale and split one Sentry issue into 22.
The MediaServer and Seerr families instead gain a nullable `display` alongside
the English `message`, and the six screens that print these errors read
`display ?? message`. PlaybackException keeps the opposite rule, because it
already carries a PlaybackFailureReason for logic and classifyPlaybackFailure
already builds it from t.messages: its stragglers are localized at the throw
site. That also removes the literal "Exception: " prefix Live TV users saw on
a tune failure, since PlaybackException.toString() returns the bare message.
Localized parts hand-concatenated with bare English are the shape no search for
Text('...') can find: '${t.common.pause} auto-scroll' on the home carousel,
'${day} at ${time}' on the Live TV schedule row, and an actor-screen count that
hand-rolled its plural as `n == 1 ? 'title' : 'titles'` - wrong for ru and pl
regardless of translation, now a real Slang plural.
Finally a literal assigned to provider state that a widget renders later:
DownloadProgress.errorMessage, and the four background_downloader notification
bodies, which sit inside a plugin config call where no widget-shaped search
reaches them.
Two things surfaced while converting. track_chapter_controls compared a track
label against 'Audio Track N' to swap in a localized version; once the builder
localized its own fallback that branch became unreachable, so it and the
orphaned _joinTrackLabel are gone. And discovery_view's PeerError fallback arm
looks like a leak but is not - its producers already localize, and a test says
so - so it stays as it is.
All 21 non-base locales are translated, including the 21 keys left empty by
earlier commits that were falling back to English. No locale has an empty value.
scripts/check_hardcoded_strings.py guards the three shapes a structural check
can see, and runs in ci_checks.sh after translation hygiene. Its first draft
passed its own tests while missing this very bug, because 'Skip Intro' is bound
to a local rather than handed to Text(); the name-bound rule that closes that
gap is restricted to phrase-shaped literals, or it cannot tell copy from the
identifiers this codebase binds constantly ('cast_row', 'auto', 'liveTv'). It
cannot see English inside a throw or assigned to a provider field - neither is
distinguishable from a log message without dataflow analysis - and the docstring
says so. label: and actionLabel: are deliberately unscanned: here they name a
diagnostic operation, and a check that is chronically red is a check that gets
switched off.
One commit rather than one per area: the keys, the 22 locale files and the
generated output are a single unit, and any partial split fails the repo's own
unused-key scan on the way through.
close #1856
|
||
|
|
b4943f8c50 | feat(seerr): Seerr API, account provider, and Explore catalog source |