plex-tui 0.4.4__tar.gz → 0.4.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/post-release-homebrew.yml +49 -7
  2. {plex_tui-0.4.4 → plex_tui-0.4.9}/CHANGELOG.md +15 -0
  3. {plex_tui-0.4.4 → plex_tui-0.4.9}/PKG-INFO +158 -75
  4. {plex_tui-0.4.4 → plex_tui-0.4.9}/README.md +157 -74
  5. {plex_tui-0.4.4 → plex_tui-0.4.9}/RELEASE.md +7 -0
  6. {plex_tui-0.4.4 → plex_tui-0.4.9}/ROADMAP.md +7 -4
  7. plex_tui-0.4.9/docs/assets/collection-categories.png +0 -0
  8. plex_tui-0.4.9/docs/assets/collection-recommended.png +0 -0
  9. plex_tui-0.4.9/docs/assets/grid-tv-shows.png +0 -0
  10. plex_tui-0.4.9/docs/assets/grid-view.png +0 -0
  11. plex_tui-0.4.9/docs/assets/list-view.png +0 -0
  12. plex_tui-0.4.9/docs/collection-artwork-design.md +73 -0
  13. {plex_tui-0.4.4 → plex_tui-0.4.9}/docs/plex-integration-research.md +2 -1
  14. {plex_tui-0.4.4 → plex_tui-0.4.9}/packaging/aur/.SRCINFO +3 -3
  15. {plex_tui-0.4.4 → plex_tui-0.4.9}/packaging/aur/PKGBUILD +2 -2
  16. {plex_tui-0.4.4 → plex_tui-0.4.9}/pyproject.toml +1 -1
  17. {plex_tui-0.4.4 → plex_tui-0.4.9}/scripts/check_release.py +4 -0
  18. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/__init__.py +1 -1
  19. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/app.py +476 -21
  20. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/plex_service.py +15 -0
  21. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_app_helpers.py +112 -11
  22. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_app_navigation.py +132 -2
  23. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_plex_service.py +57 -0
  24. plex_tui-0.4.4/docs/assets/grid-view.png +0 -0
  25. plex_tui-0.4.4/docs/assets/list-view.png +0 -0
  26. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/aur.yml +0 -0
  27. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/bump.yml +0 -0
  28. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/ci.yml +0 -0
  29. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/post-release-aur.yml +0 -0
  30. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/publish-aur.yml +0 -0
  31. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/publish-pypi.yml +0 -0
  32. {plex_tui-0.4.4 → plex_tui-0.4.9}/.github/workflows/publish-testpypi.yml +0 -0
  33. {plex_tui-0.4.4 → plex_tui-0.4.9}/.gitignore +0 -0
  34. {plex_tui-0.4.4 → plex_tui-0.4.9}/AGENTS.md +0 -0
  35. {plex_tui-0.4.4 → plex_tui-0.4.9}/LICENSE +0 -0
  36. {plex_tui-0.4.4 → plex_tui-0.4.9}/Makefile +0 -0
  37. {plex_tui-0.4.4 → plex_tui-0.4.9}/PACKAGING.md +0 -0
  38. {plex_tui-0.4.4 → plex_tui-0.4.9}/config.example.toml +0 -0
  39. {plex_tui-0.4.4 → plex_tui-0.4.9}/docs/homebrew-install-time.md +0 -0
  40. {plex_tui-0.4.4 → plex_tui-0.4.9}/packaging/aur/README.md +0 -0
  41. {plex_tui-0.4.4 → plex_tui-0.4.9}/packaging/homebrew/README.md +0 -0
  42. {plex_tui-0.4.4 → plex_tui-0.4.9}/scripts/measure_homebrew_install.py +0 -0
  43. {plex_tui-0.4.4 → plex_tui-0.4.9}/scripts/prepare_homebrew_bottle_assets.py +0 -0
  44. {plex_tui-0.4.4 → plex_tui-0.4.9}/scripts/stage_release.py +0 -0
  45. {plex_tui-0.4.4 → plex_tui-0.4.9}/scripts/update_aur_package.py +0 -0
  46. {plex_tui-0.4.4 → plex_tui-0.4.9}/scripts/update_homebrew_formula.py +0 -0
  47. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/__main__.py +0 -0
  48. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/artwork.py +0 -0
  49. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/auth.py +0 -0
  50. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/config.py +0 -0
  51. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/models.py +0 -0
  52. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/player.py +0 -0
  53. {plex_tui-0.4.4 → plex_tui-0.4.9}/src/plextui/smoke.py +0 -0
  54. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_artwork.py +0 -0
  55. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_auth.py +0 -0
  56. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_cli.py +0 -0
  57. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_config.py +0 -0
  58. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_homebrew_bottle_assets.py +0 -0
  59. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_player.py +0 -0
  60. {plex_tui-0.4.4 → plex_tui-0.4.9}/tests/test_release_checks.py +0 -0
@@ -34,12 +34,34 @@ jobs:
34
34
  - name: Check packaging PR token
35
35
  env:
36
36
  PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
37
+ GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
37
38
  run: |
39
+ set -euo pipefail
40
+
38
41
  if [ -z "$PACKAGING_PR_TOKEN" ]; then
39
42
  echo "PACKAGING_PR_TOKEN secret is required to publish the Homebrew tap" >&2
40
43
  exit 1
41
44
  fi
42
45
 
46
+ pr_query="$(cat <<'GRAPHQL'
47
+ query($owner: String!, $name: String!) {
48
+ repository(owner: $owner, name: $name) {
49
+ nameWithOwner
50
+ pullRequests(first: 1) {
51
+ totalCount
52
+ }
53
+ }
54
+ }
55
+ GRAPHQL
56
+ )"
57
+
58
+ gh api repos/so1omon563/homebrew-plex-tui --jq '.full_name' >/dev/null
59
+ gh api graphql \
60
+ -f owner=so1omon563 \
61
+ -f name=homebrew-plex-tui \
62
+ -f query="$pr_query" >/dev/null
63
+ gh pr list --repo so1omon563/homebrew-plex-tui --limit 1 >/dev/null
64
+
43
65
  - name: Determine release tag
44
66
  id: release
45
67
  env:
@@ -269,11 +291,23 @@ jobs:
269
291
  fi
270
292
 
271
293
  branch="automation/plex-tui-v${VERSION}"
272
- git switch -c "$branch"
294
+ formula_update="$(mktemp)"
295
+ cp Formula/plex-tui.rb "$formula_update"
273
296
  git config user.name "github-actions[bot]"
274
297
  git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
275
- git add Formula/plex-tui.rb
276
- git commit -m "Update plex-tui to ${VERSION}"
298
+
299
+ if git ls-remote --exit-code --heads origin "$branch" >/dev/null 2>&1; then
300
+ git fetch origin "$branch"
301
+ git switch -C "$branch" "origin/$branch"
302
+ cp "$formula_update" Formula/plex-tui.rb
303
+ else
304
+ git switch -c "$branch"
305
+ fi
306
+
307
+ if ! git diff --quiet -- Formula/plex-tui.rb; then
308
+ git add Formula/plex-tui.rb
309
+ git commit -m "Update plex-tui to ${VERSION}"
310
+ fi
277
311
  git push origin "$branch"
278
312
 
279
313
  echo "changed=true" >> "$GITHUB_OUTPUT"
@@ -292,12 +326,20 @@ jobs:
292
326
 
293
327
  pr_body="$(printf 'Automated Homebrew tap update for plex-tui %s.\n\nIncludes the generated bottle metadata for %s.\n' "$VERSION" "$BOTTLE_RELEASE")"
294
328
 
295
- pr_url="$(gh pr create \
329
+ pr_url="$(gh pr list \
296
330
  --repo so1omon563/homebrew-plex-tui \
297
- --base main \
298
331
  --head "$BRANCH" \
299
- --title "Update plex-tui to ${VERSION}" \
300
- --body "$pr_body")"
332
+ --json url \
333
+ --jq '.[0].url // ""')"
334
+
335
+ if [ -z "$pr_url" ]; then
336
+ pr_url="$(gh pr create \
337
+ --repo so1omon563/homebrew-plex-tui \
338
+ --base main \
339
+ --head "$BRANCH" \
340
+ --title "Update plex-tui to ${VERSION}" \
341
+ --body "$pr_body")"
342
+ fi
301
343
 
302
344
  gh pr merge "$pr_url" \
303
345
  --repo so1omon563/homebrew-plex-tui \
@@ -2,6 +2,21 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.4.9 - 2026-06-19
6
+
7
+ - Improved playlist-management discoverability in the details pane, Help view,
8
+ and README usage docs.
9
+ - Fixed a crash when selecting playlist container cards whose PlexAPI objects
10
+ do not expose media stream parts.
11
+
12
+ ## 0.4.7 - 2026-06-19
13
+
14
+ - Added playlist management for creating playlists from selected media, adding
15
+ selected media to existing playlists, and removing items from playlist views.
16
+ - Added intentional collection-card artwork for hub, playlist, category, and
17
+ other container grid cards, with geometric glyphs and roomier spacing for
18
+ all-container grids such as Recommended.
19
+
5
20
  ## 0.4.4 - 2026-06-18
6
21
 
7
22
  - Added a keyboard action to mark the selected playable Plex item watched or
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plex-tui
3
- Version: 0.4.4
3
+ Version: 0.4.9
4
4
  Summary: A small standalone Plex terminal UI.
5
5
  Project-URL: Homepage, https://github.com/so1omon563/plex-tui
6
6
  Project-URL: Issues, https://github.com/so1omon563/plex-tui/issues
@@ -44,23 +44,86 @@ Description-Content-Type: text/markdown
44
44
  [![Homebrew](https://shieldcn.dev/badge/Homebrew-tap-blue.png?logo=homebrew)](https://github.com/so1omon563/homebrew-plex-tui)
45
45
  [![License](https://shieldcn.dev/github/so1omon563/plex-tui/license.png)](LICENSE)
46
46
 
47
- A standalone Python/Textual terminal UI for browsing Plex and launching playback
48
- through `mpv`.
47
+ A terminal Plex client built for watching media, not managing servers.
49
48
 
50
- plex-tui is an early release. It supports Plex login, server selection, paged
51
- library browsing, search, list/grid views, stream preferences, terminal poster
52
- artwork, and playback progress reporting.
49
+ There are plenty of tools for administering Plex from the command line.
50
+ Surprisingly few are built for sitting down, browsing your library, and watching
51
+ something without leaving the terminal.
52
+
53
+ plex-tui is a standalone Textual application that brings Plex browsing, poster
54
+ artwork, collection cards, playlists, search, stream preferences, and `mpv`
55
+ playback into a keyboard-first terminal interface.
56
+
57
+ Built for people who spend their day in a terminal and would rather stay there.
58
+
59
+ ## Why?
60
+
61
+ Most terminal Plex tools are built for administration, automation, or quick
62
+ status checks. Those are useful jobs, but they are not the same as browsing a
63
+ library, comparing options, and choosing something to watch.
64
+
65
+ Meanwhile, terminal applications got better. Tools like lazygit, gitui, btop,
66
+ and modern Textual apps raised the bar for what a TUI can be: rich layouts,
67
+ keyboard-first workflows, responsive interfaces, and even artwork are no longer
68
+ unusual.
69
+
70
+ plex-tui exists because browsing Plex and choosing something to watch deserves
71
+ that same kind of terminal-native experience.
72
+
73
+ ## Project Status
74
+
75
+ plex-tui is still early, but already usable. Login, server selection, library
76
+ browsing, search, playlists, artwork, stream preferences, and playback are
77
+ working today. Expect rough edges, but expect progress too.
53
78
 
54
79
  ## Screenshots
55
80
 
56
- ### Grid view
81
+ ### Movie grid
57
82
 
58
83
  ![plex-tui grid view](docs/assets/grid-view.png)
59
84
 
85
+ ### TV show grid
86
+
87
+ ![plex-tui TV show grid view](docs/assets/grid-tv-shows.png)
88
+
89
+ ### Collection cards
90
+
91
+ ![plex-tui Recommended collection cards](docs/assets/collection-recommended.png)
92
+
93
+ ![plex-tui Categories collection cards](docs/assets/collection-categories.png)
94
+
60
95
  ### List view
61
96
 
62
97
  ![plex-tui list view](docs/assets/list-view.png)
63
98
 
99
+ ## Features
100
+
101
+ - Plex PIN login and server selection.
102
+ - Paged library browsing with automatic loading near the end of loaded items.
103
+ - Library submenu entrypoints for all items, Recommended, Collections,
104
+ Playlists, and Categories. Library rows open all items by default; Space
105
+ opens the browse-mode menu, and Settings can swap the primary and alternate
106
+ actions.
107
+ - Current-library search and bounded global search.
108
+ - List view plus configurable-density grid view with terminal poster artwork,
109
+ missing-artwork placeholders, and intentional glyph cards for collections and
110
+ hubs.
111
+ - External subtitle support and direct playback for embedded PGS/VOBSUB tracks.
112
+ - Audio and subtitle pickers with saved language preferences.
113
+ - Separate play-from-start and resume actions with Plex progress reporting.
114
+ - Watched/unwatched toggling for selected playable Plex items.
115
+ - Continue Watching episode rows show their show, season, and episode context,
116
+ and items can be removed from the Continue Watching view.
117
+ - Playlist management for creating playlists from selected media, adding media
118
+ to existing playlists, and removing items while browsing a playlist.
119
+ - Movie editions appear as distinct variants when Plex reports multiple
120
+ editions for a selected movie.
121
+ - Settings screen for stream preferences, playback mode and transcode quality,
122
+ artwork modes, grid density, page size, auto-load threshold, grid artwork
123
+ prefetching, media view, library Enter behavior, and `mpv` window size.
124
+ - App diagnostics view for version, paths, `mpv`, Plex connection, artwork, and
125
+ browsing settings.
126
+
64
127
  ## Requirements
65
128
 
66
129
  - Python 3.11 or newer
@@ -95,9 +158,9 @@ plex-tui
95
158
  ```
96
159
 
97
160
  This is the recommended cross-platform install path. It keeps Python
98
- dependencies isolated, but you still need to install `mpv` separately.
99
- If `pipx` is not installed, install it with your platform package manager first
100
- or follow the pipx installation guide.
161
+ dependencies isolated, but you still need to install `mpv` separately. If
162
+ `pipx` is not installed, install it with your platform package manager first or
163
+ follow the pipx installation guide.
101
164
 
102
165
  ### Homebrew
103
166
 
@@ -108,14 +171,11 @@ brew install plex-tui
108
171
  plex-tui --smoke
109
172
  ```
110
173
 
111
- The Homebrew formula installs `mpv` automatically. Apple Silicon macOS installs
112
- use prebuilt bottles when available so Homebrew can pour the app virtualenv
113
- instead of rebuilding native Python dependencies such as `pillow` from source.
114
- Intel macOS installs still use Homebrew's source-build path while that platform
115
- continues to be supported.
116
- Homebrew 6 requires non-official taps to be trusted before Homebrew loads
117
- formulae from them. `plex-tui` only depends on formulae from Homebrew/core, so no
118
- additional tap trust is required for its dependencies.
174
+ The Homebrew formula installs `mpv` automatically. Apple Silicon macOS uses
175
+ prebuilt bottles when available, while Intel macOS still uses Homebrew's
176
+ source-build path. Homebrew 6 requires non-official taps to be trusted before
177
+ loading formulae from them; `plex-tui` only depends on formulae from
178
+ Homebrew/core, so no additional tap trust is required for dependencies.
119
179
 
120
180
  ### Arch Linux
121
181
 
@@ -131,7 +191,7 @@ example.
131
191
 
132
192
  ```bash
133
193
  pipx install "git+https://github.com/so1omon563/plex-tui.git"
134
- pipx install "git+https://github.com/so1omon563/plex-tui.git@v0.2.1"
194
+ pipx install "git+https://github.com/so1omon563/plex-tui.git@v0.4.4"
135
195
  ```
136
196
 
137
197
  Use this path for testing `main` before a tagged/PyPI release.
@@ -199,22 +259,52 @@ See `config.example.toml` for optional settings.
199
259
  ## Playback
200
260
 
201
261
  Playback is launched through `mpv`; plex-tui does not embed a video player.
202
- Use `p` to start the selected item from the beginning, or `r` to resume from
203
- the saved Plex position when one is available. While playback is active, Plex
204
- progress is updated in the background. Saved audio/subtitle language
205
- preferences are applied when matching streams are available, and the details
206
- pane shows the effective playback choices. Playback mode defaults to
207
- direct/default behavior and can be changed in Settings to force Plex
208
- transcoding with Original, 1080p 8 Mbps, 720p 4 Mbps, or 480p 2 Mbps quality
209
- presets. The default `mpv` launch uses `--autofit=80%` so videos open at a
210
- comfortable size on modern displays; Settings can override this with values
211
- such as `90%`, `1280x720`, or `80%x80%`. If an older config has an exact
212
- `mpv_window_size = "1280x720"` override, cycle the mpv window-size setting once
213
- to return to the Default preset.
214
- Use `w` from a playable movie or episode to toggle its Plex watched state.
215
- When playback is active, choosing an audio or subtitle track from the picker
216
- also asks mpv to switch the active track when the launched stream exposes a
217
- matching track.
262
+
263
+ Common playback actions:
264
+
265
+ | Key | Action |
266
+ | --- | --- |
267
+ | `p` | Play the selected item from the beginning |
268
+ | `r` | Resume from the saved Plex position when available |
269
+ | `x` | Stop the launched `mpv` process |
270
+ | `w` | Toggle watched / unwatched for the selected playable Plex item |
271
+
272
+ Playback behavior:
273
+
274
+ - Plex progress is updated in the background while playback is active.
275
+ - Saved audio/subtitle language preferences are applied when matching streams
276
+ are available.
277
+ - The details pane shows the effective playback choices for the selected item.
278
+ - Choosing an audio or subtitle track while playback is active also asks `mpv`
279
+ to switch the active track when the launched stream exposes a matching track.
280
+
281
+ Playback mode and window sizing:
282
+
283
+ - Playback mode defaults to Plex direct/default behavior.
284
+ - Settings can force Plex transcoding with Original, 1080p 8 Mbps, 720p
285
+ 4 Mbps, or 480p 2 Mbps quality presets.
286
+ - The default `mpv` launch uses `--autofit=80%` so videos open at a comfortable
287
+ size on modern displays.
288
+ - Settings can override the window size with values such as `90%`,
289
+ `1280x720`, or `80%x80%`.
290
+ - If an older config has an exact `mpv_window_size = "1280x720"` override,
291
+ cycle the mpv window-size setting once to return to the Default preset.
292
+
293
+ ## Playlist Management
294
+
295
+ Playlist actions are available from selected playable media and from inside
296
+ playlist views.
297
+
298
+ | Key | Where | Action |
299
+ | --- | --- | --- |
300
+ | `P` | Playable media item | Open the Add to Playlist picker |
301
+ | `enter` | Add to Playlist picker | Add the selected media to an existing playlist |
302
+ | `enter` | `New playlist...` row | Prompt for a name and create a playlist containing the selected media |
303
+ | `backspace` / `delete` | Playlist contents | Remove the selected item from that playlist |
304
+
305
+ The Add to Playlist picker lists `New playlist...` first, followed by existing
306
+ Plex playlists. Playlist browsing itself is available from a library's browse
307
+ modes: select a library, press `space`, then open `Playlists`.
218
308
 
219
309
  ## Key Bindings
220
310
 
@@ -237,52 +327,45 @@ matching track.
237
327
  | `p` | Play selected item from the beginning |
238
328
  | `r` | Resume selected item from the saved Plex position |
239
329
  | `w` | Mark selected item watched / unwatched |
240
- | `backspace` / `delete` | Remove selected item from Continue Watching |
330
+ | `P` | Add selected playable item to a playlist |
331
+ | `backspace` / `delete` | Remove selected item from Continue Watching or a playlist |
241
332
  | `a` / `s` | Choose audio / subtitle preference |
242
333
  | `A` / `S` | Clear audio preference / cycle subtitle mode |
243
334
  | `x` | Stop launched `mpv` |
244
335
 
245
- ## Features
246
-
247
- - Plex PIN login and server selection.
248
- - Paged library browsing with automatic loading near the end of loaded items.
249
- - Library submenu entrypoints for all items, Recommended, Collections,
250
- Playlists, and Categories. Library rows open all items by default; Space
251
- opens the browse-mode menu, and Settings can swap the primary and alternate
252
- actions.
253
- - Current-library search and bounded global search.
254
- - List view plus configurable-density grid view with terminal poster artwork.
255
- - External subtitle support and direct playback for embedded PGS/VOBSUB tracks.
256
- - Audio and subtitle pickers with saved language preferences.
257
- - Separate play-from-start and resume actions with Plex progress reporting.
258
- - Watched/unwatched toggling for selected playable Plex items.
259
- - Continue Watching episode rows show their show, season, and episode context,
260
- and items can be removed from the Continue Watching view.
261
- - Movie editions appear as distinct variants when Plex reports multiple
262
- editions for a selected movie.
263
- - Settings screen for stream preferences, playback mode and transcode quality,
264
- artwork modes, grid density, page size, auto-load threshold, grid artwork
265
- prefetching, media view, library Enter behavior, and `mpv` window size.
266
- - App diagnostics view for version, paths, `mpv`, Plex connection, artwork, and
267
- browsing settings.
268
-
269
336
  ## Artwork
270
337
 
271
- Poster artwork renders as portable colored block art by default, so it works in
272
- ordinary terminals without native image support. In Kitty and Ghostty, set
273
- `artwork_renderer` to `auto` to render native terminal images through Kitty
274
- Unicode placeholders. Set `artwork_renderer` to `kitty` to explicitly try the
275
- Kitty graphics protocol in other compatible terminals. This keeps Textual in
276
- charge of layout and redraws while the terminal paints the poster inside those
277
- cells. Outside detected Kitty-compatible terminals, `auto` falls back to block
278
- art; `plex-tui --diagnostics` reports the active renderer status.
279
-
280
- Grid view prefetches artwork for the visible page immediately and, by default,
281
- prepares three pages ahead in the background. `grid_prefetch_pages` can be set
282
- from `0` to `5`; use `0` to fetch only the visible page on slower systems.
283
- Compact, comfortable, and large density modes adjust card and poster sizing. The
284
- artwork cache is bounded and stored in the app cache directory shown in
285
- Settings.
338
+ plex-tui has two artwork paths: poster rendering for real media and glyph cards
339
+ for Plex objects that are not posters.
340
+
341
+ Poster rendering:
342
+
343
+ - Default mode renders portable colored block art, so it works in ordinary
344
+ terminals without native image support.
345
+ - In Kitty and Ghostty, set `artwork_renderer` to `auto` to render native
346
+ terminal images through Kitty Unicode placeholders.
347
+ - Set `artwork_renderer` to `kitty` to explicitly try the Kitty graphics
348
+ protocol in other compatible terminals.
349
+ - Outside detected Kitty-compatible terminals, `auto` falls back to block art.
350
+ - `plex-tui --diagnostics` reports the active renderer status.
351
+
352
+ Collection-style cards:
353
+
354
+ - Collections, playlists, categories, hubs, and query shelves use geometric
355
+ glyph artwork instead of pretending to be missing posters.
356
+ - Rows made entirely of those cards use roomier navigation-grid spacing.
357
+ - See `docs/collection-artwork-design.md` for the design notes behind that
358
+ visual language.
359
+
360
+ Grid behavior and cache:
361
+
362
+ - Grid view fetches artwork for the visible page immediately.
363
+ - By default, it prepares three pages ahead in the background.
364
+ - `grid_prefetch_pages` can be set from `0` to `5`; use `0` to fetch only the
365
+ visible page on slower systems.
366
+ - Compact, comfortable, and large density modes adjust card and poster sizing.
367
+ - The artwork cache is bounded and stored in the app cache directory shown in
368
+ Settings.
286
369
 
287
370
  ## Diagnostics
288
371