F6: coalesce whole-show/season Plex watch-pushes into ONE background task (push_bulk_state_to_plex) that reuses a single DB session + keep-alive Plex client, instead of scheduling one task (own session + HTTP client) per episode. F8: cache a show's live Plex enrichment (metadata + related) per rating_key for a short TTL and fetch the two calls in parallel; repeat opens skip the network. Raw payloads are cached; per-user shaping stays out. An empty related list is not cached (plex.related swallows a transient failure as [] — don't pin it for the TTL). F10: remove dead code — the pre-unified /browse route + browse(), the /people route + people() + _person_photo(), api.plexPeople, interface PlexPerson, and the orphaned plex.people i18n block. DRY: appendPlexFilters() shared by plexLibrary + plexFacets; one exported plexDetailUi.Filterable (was Fil + Filterable); PlexInfo migrated onto the shared plexDetailUi hooks/menu (DetailCustomizeMenu gained overlay + extra props; useDetailPrefs exposes savePref; PrefToggle exported). Reviewed (high) → clean. F7 (facet aggregate collapse) deferred: self-exclusion gives each sub-aggregate a distinct WHERE, and no measurement shows /facets slow.
235 lines
7.2 KiB
JSON
235 lines
7.2 KiB
JSON
{
|
||
"navLabel": "Plex",
|
||
"backToFeed": "YouTube feed",
|
||
"backToLibrary": "Back to library",
|
||
"searchPlaceholder": "Search Plex…",
|
||
"sort": {
|
||
"added": "Recently added",
|
||
"title": "Title",
|
||
"year": "Year",
|
||
"rating": "IMDb rating",
|
||
"duration": "Length",
|
||
"release": "Release date"
|
||
},
|
||
"filter": {
|
||
"library": "Library",
|
||
"scope": "Library",
|
||
"scopeOpt": {
|
||
"both": "All",
|
||
"movie": "Movies",
|
||
"show": "Shows"
|
||
},
|
||
"show": "Show",
|
||
"showOpt": {
|
||
"all": "All",
|
||
"unwatched": "Unwatched",
|
||
"in_progress": "In progress",
|
||
"watched": "Watched"
|
||
},
|
||
"sort": "Sort",
|
||
"clearAll": "Clear filters",
|
||
"active": "Active",
|
||
"any": "Any",
|
||
"rating": "IMDb rating",
|
||
"genre": "Genre",
|
||
"year": "Year",
|
||
"duration": "Length",
|
||
"durationOpt": {
|
||
"short": "Under 90m",
|
||
"mid": "90–120m",
|
||
"long": "Over 2h"
|
||
},
|
||
"added": "Added to Plex",
|
||
"addedOpt": {
|
||
"24h": "24h",
|
||
"1w": "1 week",
|
||
"1m": "1 month",
|
||
"6m": "6 months",
|
||
"1y": "1 year"
|
||
},
|
||
"contentRating": "Age rating",
|
||
"match": {
|
||
"any": "Any",
|
||
"all": "All"
|
||
},
|
||
"dir": {
|
||
"desc": "↓ Descending",
|
||
"asc": "↑ Ascending"
|
||
},
|
||
"collection": "Collection",
|
||
"collectionSearch": "Search collections…",
|
||
"collectionEmpty": "No collections"
|
||
},
|
||
"count": "{{count}} titles",
|
||
"searchCount": "{{count}} matches",
|
||
"noMatches": "No matches.",
|
||
"noMatchesFiltered_one": "No matches — a filter is also narrowing the results.",
|
||
"noMatchesFiltered_other": "No matches — {{count}} filters are also narrowing the results.",
|
||
"loading": "Loading…",
|
||
"empty": "Nothing here yet. Run a Plex sync from the admin Config page.",
|
||
"loadMore": "Load more",
|
||
"watched": "Watched",
|
||
"inProgress": "In progress",
|
||
"play": "Play",
|
||
"resume": "Resume",
|
||
"openShow": "Open show",
|
||
"markWatched": "Mark watched",
|
||
"markUnwatched": "Mark unwatched",
|
||
"seasons": "{{count}} seasons",
|
||
"unified": {
|
||
"titles": "Titles",
|
||
"episodes": "Episodes"
|
||
},
|
||
"series": {
|
||
"seasons": "Seasons",
|
||
"backToShow": "Back to show",
|
||
"episodeCount": "{{count}} episodes",
|
||
"playFromStart": "Play from start",
|
||
"related": "Related shows",
|
||
"markShowWatched": "Mark show watched",
|
||
"markShowUnwatched": "Mark show unwatched",
|
||
"markSeasonWatched": "Mark season watched",
|
||
"markSeasonUnwatched": "Mark season unwatched",
|
||
"addShowCollection": "Add to collection"
|
||
},
|
||
"playerSoon": "Player coming soon — “{{title}}”",
|
||
"collEditor": {
|
||
"manage": "Collections",
|
||
"title": "Collections — {{title}}",
|
||
"newPlaceholder": "New collection name…",
|
||
"create": "Create",
|
||
"search": "Filter collections…",
|
||
"none": "No editable collections yet. Create one above.",
|
||
"count": "{{count}} items",
|
||
"delete": "Delete",
|
||
"deleteConfirm": "Delete the collection \"{{title}}\" from Plex? This affects all users.",
|
||
"note": "Changes are written to Plex and shared across all clients and users.",
|
||
"others": "Manage {{count}} existing collections…",
|
||
"makeEditable": "Manage"
|
||
},
|
||
"player": {
|
||
"loading": "Loading…",
|
||
"back": "Back",
|
||
"skipIntro": "Skip intro",
|
||
"skipCredits": "Skip credits",
|
||
"playPause": "Play / pause (space)",
|
||
"restart": "Restart from beginning",
|
||
"prev": "Previous episode",
|
||
"next": "Next episode",
|
||
"mute": "Mute (m)",
|
||
"fullscreen": "Fullscreen (f)",
|
||
"download": "Download original file",
|
||
"tracks": "Audio & subtitles",
|
||
"audio": "Audio",
|
||
"subtitles": "Subtitles",
|
||
"subOff": "Off",
|
||
"errNotFound": "This file can't be played — the media isn't reachable on the server (the Plex media mount is missing or the path map is wrong). Ask the admin to check the Plex configuration.",
|
||
"errTranscode": "This file's format needs transcoding, which isn't supported yet.",
|
||
"errGeneric": "Playback couldn't start. Please try again.",
|
||
"stop": "Stop",
|
||
"help": "Keyboard shortcuts",
|
||
"infoBtn": "Media info",
|
||
"keys": {
|
||
"playPause": "Play / pause",
|
||
"seek": "Seek 10 seconds",
|
||
"episode": "Previous / next episode",
|
||
"volume": "Volume up / down",
|
||
"mute": "Mute",
|
||
"fullscreen": "Fullscreen",
|
||
"info": "Media info",
|
||
"back": "Stop & back to feed",
|
||
"help": "Show this help",
|
||
"audio": "Cycle audio track",
|
||
"subtitle": "Cycle subtitle",
|
||
"fineSeek": "Fine seek"
|
||
},
|
||
"settings": "Settings",
|
||
"sync": "Offsets",
|
||
"subOffset": "Subtitle delay",
|
||
"audioOffset": "Audio delay",
|
||
"playback": "Playback",
|
||
"seekStep": "Seek step",
|
||
"fineSeek": "Fine seek (Ctrl)",
|
||
"autoHide": "Auto-hide controls",
|
||
"subStyle": "Subtitles",
|
||
"subSize": "Text size",
|
||
"subPos": "Position",
|
||
"subColor": "Text color",
|
||
"subBg": "Background",
|
||
"subBgNone": "None",
|
||
"clock": "Clock",
|
||
"clockShow": "Show clock",
|
||
"clock24h": "24-hour",
|
||
"clockSize": "Size",
|
||
"clockColor": "Color",
|
||
"clockDate": "Show date",
|
||
"subShadow": "Shadow",
|
||
"subShadowColor": "Shadow color",
|
||
"autoSkipIntro": "Auto-skip intro",
|
||
"autoSkipCredits": "Auto-skip credits",
|
||
"autoSkipDelay": "Auto-skip delay"
|
||
},
|
||
"info": {
|
||
"title": "Media info",
|
||
"customize": "Customize view",
|
||
"prefArtBg": "Faint backdrop",
|
||
"prefCast": "Cast & crew",
|
||
"prefRelated": "Related shows",
|
||
"stripSource": {
|
||
"collection": "Collections",
|
||
"imdb": "IMDb",
|
||
"tmdb": "TMDb",
|
||
"tvdb": "TVDb",
|
||
"trakt": "Trakt",
|
||
"smart": "Smart lists"
|
||
},
|
||
"openImdb": "Open on IMDb",
|
||
"director": "Director",
|
||
"cast": "Cast & crew",
|
||
"markWatched": "Mark watched",
|
||
"markUnwatched": "Mark unwatched",
|
||
"clearResume": "Clear resume position",
|
||
"filterYear": "Show titles from {{year}}",
|
||
"filterRating": "Show titles rated {{n}}+",
|
||
"filterActor": "Show titles with {{name}}",
|
||
"browseCollection": "Browse collection →"
|
||
},
|
||
"playable": {
|
||
"direct": "Plays directly in the browser",
|
||
"remux": "Needs a light remux (no video re-encode)",
|
||
"transcode": "Needs transcoding (heavier)"
|
||
},
|
||
"playlistAdd": {
|
||
"manage": "Add to playlist",
|
||
"title": "Add to playlist — {{title}}",
|
||
"newPlaceholder": "New playlist name…",
|
||
"create": "Create",
|
||
"none": "No playlists yet. Create one above.",
|
||
"count": "{{count}} items",
|
||
"groupProgress": "{{in}} / {{size}}"
|
||
},
|
||
"playlist": {
|
||
"section": "Playlists",
|
||
"newPlaceholder": "New playlist…",
|
||
"create": "Create playlist",
|
||
"none": "No playlists yet.",
|
||
"deleteConfirm": "Delete the playlist \"{{title}}\"?",
|
||
"rename": "Rename",
|
||
"playAll": "Play all",
|
||
"delete": "Delete playlist",
|
||
"empty": "This playlist is empty. Add titles from their info page.",
|
||
"up": "Move up",
|
||
"down": "Move down",
|
||
"remove": "Remove",
|
||
"layoutAccordion": "Accordion view",
|
||
"layoutTree": "Tree view",
|
||
"removeShow": "Remove whole show",
|
||
"removeSeason": "Remove whole season",
|
||
"episodes": "{{count}} episodes",
|
||
"season": "Season {{n}}",
|
||
"seasonUnknown": "Episodes",
|
||
"addShow": "Add whole show to a playlist",
|
||
"addSeason": "Add season to a playlist",
|
||
"addEpisode": "Add episode to a playlist"
|
||
}
|
||
}
|