plex-tui 0.4.1__tar.gz → 0.4.2__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 (50) hide show
  1. {plex_tui-0.4.1 → plex_tui-0.4.2}/CHANGELOG.md +5 -0
  2. {plex_tui-0.4.1 → plex_tui-0.4.2}/PKG-INFO +1 -1
  3. {plex_tui-0.4.1 → plex_tui-0.4.2}/packaging/aur/.SRCINFO +3 -3
  4. {plex_tui-0.4.1 → plex_tui-0.4.2}/packaging/aur/PKGBUILD +2 -2
  5. {plex_tui-0.4.1 → plex_tui-0.4.2}/pyproject.toml +1 -1
  6. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/__init__.py +1 -1
  7. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/plex_service.py +7 -1
  8. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_plex_service.py +48 -1
  9. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/aur.yml +0 -0
  10. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/bump.yml +0 -0
  11. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/ci.yml +0 -0
  12. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/post-release-aur.yml +0 -0
  13. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/post-release-homebrew.yml +0 -0
  14. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/publish-aur.yml +0 -0
  15. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/publish-pypi.yml +0 -0
  16. {plex_tui-0.4.1 → plex_tui-0.4.2}/.github/workflows/publish-testpypi.yml +0 -0
  17. {plex_tui-0.4.1 → plex_tui-0.4.2}/.gitignore +0 -0
  18. {plex_tui-0.4.1 → plex_tui-0.4.2}/AGENTS.md +0 -0
  19. {plex_tui-0.4.1 → plex_tui-0.4.2}/LICENSE +0 -0
  20. {plex_tui-0.4.1 → plex_tui-0.4.2}/Makefile +0 -0
  21. {plex_tui-0.4.1 → plex_tui-0.4.2}/PACKAGING.md +0 -0
  22. {plex_tui-0.4.1 → plex_tui-0.4.2}/README.md +0 -0
  23. {plex_tui-0.4.1 → plex_tui-0.4.2}/RELEASE.md +0 -0
  24. {plex_tui-0.4.1 → plex_tui-0.4.2}/ROADMAP.md +0 -0
  25. {plex_tui-0.4.1 → plex_tui-0.4.2}/config.example.toml +0 -0
  26. {plex_tui-0.4.1 → plex_tui-0.4.2}/docs/assets/grid-view.png +0 -0
  27. {plex_tui-0.4.1 → plex_tui-0.4.2}/docs/assets/list-view.png +0 -0
  28. {plex_tui-0.4.1 → plex_tui-0.4.2}/docs/plex-integration-research.md +0 -0
  29. {plex_tui-0.4.1 → plex_tui-0.4.2}/packaging/aur/README.md +0 -0
  30. {plex_tui-0.4.1 → plex_tui-0.4.2}/packaging/homebrew/README.md +0 -0
  31. {plex_tui-0.4.1 → plex_tui-0.4.2}/scripts/check_release.py +0 -0
  32. {plex_tui-0.4.1 → plex_tui-0.4.2}/scripts/stage_release.py +0 -0
  33. {plex_tui-0.4.1 → plex_tui-0.4.2}/scripts/update_aur_package.py +0 -0
  34. {plex_tui-0.4.1 → plex_tui-0.4.2}/scripts/update_homebrew_formula.py +0 -0
  35. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/__main__.py +0 -0
  36. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/app.py +0 -0
  37. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/artwork.py +0 -0
  38. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/auth.py +0 -0
  39. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/config.py +0 -0
  40. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/models.py +0 -0
  41. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/player.py +0 -0
  42. {plex_tui-0.4.1 → plex_tui-0.4.2}/src/plextui/smoke.py +0 -0
  43. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_app_helpers.py +0 -0
  44. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_app_navigation.py +0 -0
  45. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_artwork.py +0 -0
  46. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_auth.py +0 -0
  47. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_cli.py +0 -0
  48. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_config.py +0 -0
  49. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_player.py +0 -0
  50. {plex_tui-0.4.1 → plex_tui-0.4.2}/tests/test_release_checks.py +0 -0
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.4.2 - 2026-06-18
6
+
7
+ - Prefer episode stills and season posters for TV artwork while keeping show art
8
+ as the fallback.
9
+
5
10
  ## 0.4.1 - 2026-06-18
6
11
 
7
12
  - Let explicit `artwork_renderer = "kitty"` try Kitty graphics even when
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plex-tui
3
- Version: 0.4.1
3
+ Version: 0.4.2
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
@@ -1,6 +1,6 @@
1
1
  pkgbase = plex-tui
2
2
  pkgdesc = Standalone Plex terminal UI with mpv playback
3
- pkgver = 0.4.0
3
+ pkgver = 0.4.1
4
4
  pkgrel = 1
5
5
  url = https://github.com/so1omon563/plex-tui
6
6
  arch = any
@@ -16,7 +16,7 @@ pkgbase = plex-tui
16
16
  depends = python-plexapi
17
17
  depends = python-rich
18
18
  depends = python-textual
19
- source = plex-tui-0.4.0.tar.gz::https://github.com/so1omon563/plex-tui/archive/refs/tags/v0.4.0.tar.gz
20
- sha256sums = 693b6d6f63d9e527393ac00c34f44bc3f8d1ba162befdf4929e13b609415c860
19
+ source = plex-tui-0.4.1.tar.gz::https://github.com/so1omon563/plex-tui/archive/refs/tags/v0.4.1.tar.gz
20
+ sha256sums = 2271c6413ec204ba1250b812e6b9e98af37afaeb44006d5c17fb0f82cf419282
21
21
 
22
22
  pkgname = plex-tui
@@ -1,6 +1,6 @@
1
1
  # Maintainer: so1omon
2
2
  pkgname=plex-tui
3
- pkgver=0.4.0
3
+ pkgver=0.4.1
4
4
  pkgrel=1
5
5
  pkgdesc="Standalone Plex terminal UI with mpv playback"
6
6
  arch=("any")
@@ -22,7 +22,7 @@ makedepends=(
22
22
  "python-wheel"
23
23
  )
24
24
  source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
25
- sha256sums=("693b6d6f63d9e527393ac00c34f44bc3f8d1ba162befdf4929e13b609415c860")
25
+ sha256sums=("2271c6413ec204ba1250b812e6b9e98af37afaeb44006d5c17fb0f82cf419282")
26
26
 
27
27
  build() {
28
28
  cd "$pkgname-$pkgver"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "plex-tui"
7
- version = "0.4.1"
7
+ version = "0.4.2"
8
8
  description = "A small standalone Plex terminal UI."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """Plex TUI prototype."""
2
2
 
3
- __version__ = "0.4.1"
3
+ __version__ = "0.4.2"
@@ -226,7 +226,13 @@ def media_details(item: MediaItem) -> MediaDetails:
226
226
 
227
227
 
228
228
  def artwork_path(raw: Any) -> str:
229
- for attr in ("grandparentThumb", "parentThumb", "thumb", "art"):
229
+ kind = str(getattr(raw, "TYPE", raw.__class__.__name__)).lower()
230
+ attrs = (
231
+ ("thumb", "parentThumb", "grandparentThumb", "art")
232
+ if kind in {"show", "season", "episode"}
233
+ else ("grandparentThumb", "parentThumb", "thumb", "art")
234
+ )
235
+ for attr in attrs:
230
236
  value = getattr(raw, attr, None)
231
237
  if value:
232
238
  return str(value)
@@ -1,7 +1,16 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from plextui.models import LibraryItem, MediaItem
4
- from plextui.plex_service import PlexService, kind_label, media_details, progress_label, row_progress_marker, watched_state
4
+ from plextui.plex_service import (
5
+ PlexService,
6
+ artwork_path,
7
+ kind_label,
8
+ media_details,
9
+ progress_label,
10
+ row_progress_marker,
11
+ to_media_item,
12
+ watched_state,
13
+ )
5
14
 
6
15
 
7
16
  class RawItem:
@@ -62,6 +71,18 @@ class DetailedRawItem(RawItem):
62
71
  return [Part()]
63
72
 
64
73
 
74
+ class TvEpisodeRawItem(DetailedRawItem):
75
+ TYPE = "episode"
76
+ title = "Episode"
77
+ thumb = "/library/metadata/episode/thumb"
78
+
79
+
80
+ class TvSeasonRawItem(DetailedRawItem):
81
+ TYPE = "season"
82
+ title = "Season 1"
83
+ thumb = "/library/metadata/season-own/thumb"
84
+
85
+
65
86
  class RawPage(list):
66
87
  totalSize = 250
67
88
 
@@ -219,6 +240,32 @@ def test_media_details_include_audio_and_subtitle_locations():
219
240
  assert details.artwork_path == "/library/metadata/show/thumb"
220
241
 
221
242
 
243
+ def test_tv_episode_artwork_prefers_episode_still():
244
+ assert artwork_path(TvEpisodeRawItem()) == "/library/metadata/episode/thumb"
245
+ assert to_media_item(TvEpisodeRawItem()).artwork_path == "/library/metadata/episode/thumb"
246
+
247
+
248
+ def test_tv_season_artwork_prefers_season_poster():
249
+ assert artwork_path(TvSeasonRawItem()) == "/library/metadata/season-own/thumb"
250
+ assert to_media_item(TvSeasonRawItem()).artwork_path == "/library/metadata/season-own/thumb"
251
+
252
+
253
+ def test_tv_artwork_falls_back_to_parent_then_show_art():
254
+ class EpisodeWithoutStill(TvEpisodeRawItem):
255
+ thumb = ""
256
+
257
+ class SeasonWithoutPoster(TvSeasonRawItem):
258
+ thumb = ""
259
+
260
+ class EpisodeWithoutSeasonArt(TvEpisodeRawItem):
261
+ thumb = ""
262
+ parentThumb = ""
263
+
264
+ assert artwork_path(EpisodeWithoutStill()) == "/library/metadata/season/thumb"
265
+ assert artwork_path(SeasonWithoutPoster()) == "/library/metadata/season/thumb"
266
+ assert artwork_path(EpisodeWithoutSeasonArt()) == "/library/metadata/show/thumb"
267
+
268
+
222
269
  def test_kind_label_humanizes_known_and_unknown_media_types():
223
270
  assert kind_label("movie") == "Movie"
224
271
  assert kind_label("show") == "TV Show"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes