feat(plex): every card rail in the reader's language; an episode in a poster rail stands as its show (E30 S1b)
The grid served Hungarian titles, but every other card surface (Discover rails, the show page's episodes, search, collections, the person page, playlists, Home's resume rail, hero and comfort shelf) served English. The card serializers now take a required keyword-only lang (a forgotten call site fails instead of going English), and each of those reads takes ?lang=hu, with the language in its query key. A Hungarian search finds an episode by its Hungarian title too. An episode on a poster rail showed its 16:9 still cropped into a poster, titled only with the episode name; it now shows the show's poster and name, with S·E · title under it (option A). Plex's generic season names (Season 1, Specials) are rebuilt from the number in the reader's language; a season with a name of its own keeps it. Home's comfort-shelf move wrote its optimistic order to the key without the language, which nothing read any more; it writes the query's own key.
This commit is contained in:
@@ -34,7 +34,13 @@ import {
|
||||
Filterable,
|
||||
WatchedToggle,
|
||||
} from "./plexDetailUi";
|
||||
import { epLabel, tmdbBackdropUrl, useCrossfadeBackdrop, useDetailPrefs } from "../lib/plexDetail";
|
||||
import {
|
||||
epLabel,
|
||||
seasonTitle,
|
||||
tmdbBackdropUrl,
|
||||
useCrossfadeBackdrop,
|
||||
useDetailPrefs,
|
||||
} from "../lib/plexDetail";
|
||||
import { CastStrip, EpisodeCard, PlexPosterCard, RelatedStrip, SeasonCard } from "./plexCards";
|
||||
import { PlexMenu } from "./PlexMenu";
|
||||
import { usePlexCardActions } from "./usePlexCardActions";
|
||||
@@ -136,7 +142,9 @@ export function PlexPersonView({
|
||||
// lists on one screen, and the popover anchors where it opened, so a second controller would only
|
||||
// mean a second closed popover to keep shut (see ui/ContextMenu).
|
||||
const menu = useContextMenu<PlexCard>();
|
||||
const q = useQuery({ queryKey: qk.plexPerson(name), queryFn: () => api.plexPerson(name) });
|
||||
const lang = plexLang();
|
||||
const personKey = qk.plexPerson(name, lang);
|
||||
const q = useQuery({ queryKey: personKey, queryFn: () => api.plexPerson(name, lang) });
|
||||
// E5 S8: cross-dissolve the backdrop through the person's films' art (the touch the roadmap calls
|
||||
// out). Reuses the shared art-backdrop / crossfade prefs the detail pages own — no per-page control.
|
||||
const { artBg, crossfade } = useDetailPrefs();
|
||||
@@ -153,7 +161,7 @@ export function PlexPersonView({
|
||||
const toggle = (card: PlexCard) =>
|
||||
toggleWatchState(card, t, {
|
||||
optimistic: (next) =>
|
||||
qc.setQueryData<PlexPersonDetail>(qk.plexPerson(name), (old) =>
|
||||
qc.setQueryData<PlexPersonDetail>(personKey, (old) =>
|
||||
old
|
||||
? {
|
||||
...old,
|
||||
@@ -402,7 +410,7 @@ export function PlexShowView({
|
||||
setAddTarget({
|
||||
kind: "group",
|
||||
ratingKeys: se.episodes.map((e) => e.id),
|
||||
title: `${show.title} — ${se.title}`,
|
||||
title: `${show.title} — ${seasonTitle(se, t)}`,
|
||||
})
|
||||
: undefined;
|
||||
// A season's one action list (E28 C1): the rows its card shows on hover, plus copy.
|
||||
@@ -435,7 +443,7 @@ export function PlexShowView({
|
||||
},
|
||||
]
|
||||
: []),
|
||||
...copy(se.title, null).map((it) => ({ ...it, separatorBefore: true })),
|
||||
...copy(seasonTitle(se, t), null).map((it) => ({ ...it, separatorBefore: true })),
|
||||
];
|
||||
};
|
||||
|
||||
@@ -750,7 +758,9 @@ export function PlexSeasonView({
|
||||
<Button variant="link-muted" selectable onClick={onBack} className="text-sm">
|
||||
{d.show.title}
|
||||
</Button>
|
||||
<PageHeading className="text-2xl font-semibold leading-tight">{se.title}</PageHeading>
|
||||
<PageHeading className="text-2xl font-semibold leading-tight">
|
||||
{seasonTitle(se, t)}
|
||||
</PageHeading>
|
||||
<p className="text-sm text-muted mt-1">
|
||||
{t("plex.series.episodeCount", { count: se.episode_count })}
|
||||
</p>
|
||||
@@ -785,7 +795,7 @@ export function PlexSeasonView({
|
||||
setAddTarget({
|
||||
kind: "group",
|
||||
ratingKeys: seasonKeys,
|
||||
title: `${d.show.title} — ${se.title}`,
|
||||
title: `${d.show.title} — ${seasonTitle(se, t)}`,
|
||||
})
|
||||
}
|
||||
icon={ListPlus}
|
||||
|
||||
Reference in New Issue
Block a user