plex-tui 0.3.0__tar.gz → 0.3.6__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.3.0 → plex_tui-0.3.6}/.github/workflows/aur.yml +1 -1
  2. plex_tui-0.3.6/.github/workflows/post-release-aur.yml +141 -0
  3. plex_tui-0.3.6/.github/workflows/post-release-homebrew.yml +129 -0
  4. plex_tui-0.3.6/.github/workflows/publish-aur.yml +102 -0
  5. {plex_tui-0.3.0 → plex_tui-0.3.6}/AGENTS.md +14 -0
  6. {plex_tui-0.3.0 → plex_tui-0.3.6}/CHANGELOG.md +16 -0
  7. {plex_tui-0.3.0 → plex_tui-0.3.6}/PACKAGING.md +17 -5
  8. {plex_tui-0.3.0 → plex_tui-0.3.6}/PKG-INFO +8 -1
  9. {plex_tui-0.3.0 → plex_tui-0.3.6}/README.md +7 -0
  10. {plex_tui-0.3.0 → plex_tui-0.3.6}/RELEASE.md +23 -5
  11. plex_tui-0.3.6/ROADMAP.md +57 -0
  12. {plex_tui-0.3.0 → plex_tui-0.3.6}/packaging/aur/.SRCINFO +3 -3
  13. {plex_tui-0.3.0 → plex_tui-0.3.6}/packaging/aur/PKGBUILD +2 -2
  14. {plex_tui-0.3.0 → plex_tui-0.3.6}/pyproject.toml +1 -1
  15. {plex_tui-0.3.0 → plex_tui-0.3.6}/scripts/check_release.py +7 -3
  16. plex_tui-0.3.6/scripts/update_aur_package.py +67 -0
  17. plex_tui-0.3.6/scripts/update_homebrew_formula.py +192 -0
  18. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/__init__.py +1 -1
  19. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/app.py +154 -42
  20. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_app_helpers.py +91 -11
  21. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_app_navigation.py +1 -1
  22. plex_tui-0.3.6/tests/test_release_checks.py +210 -0
  23. plex_tui-0.3.0/ROADMAP.md +0 -39
  24. plex_tui-0.3.0/tests/test_release_checks.py +0 -109
  25. {plex_tui-0.3.0 → plex_tui-0.3.6}/.github/workflows/bump.yml +0 -0
  26. {plex_tui-0.3.0 → plex_tui-0.3.6}/.github/workflows/ci.yml +0 -0
  27. {plex_tui-0.3.0 → plex_tui-0.3.6}/.github/workflows/publish-pypi.yml +0 -0
  28. {plex_tui-0.3.0 → plex_tui-0.3.6}/.github/workflows/publish-testpypi.yml +0 -0
  29. {plex_tui-0.3.0 → plex_tui-0.3.6}/.gitignore +0 -0
  30. {plex_tui-0.3.0 → plex_tui-0.3.6}/LICENSE +0 -0
  31. {plex_tui-0.3.0 → plex_tui-0.3.6}/Makefile +0 -0
  32. {plex_tui-0.3.0 → plex_tui-0.3.6}/config.example.toml +0 -0
  33. {plex_tui-0.3.0 → plex_tui-0.3.6}/docs/assets/grid-view.png +0 -0
  34. {plex_tui-0.3.0 → plex_tui-0.3.6}/docs/assets/list-view.png +0 -0
  35. {plex_tui-0.3.0 → plex_tui-0.3.6}/packaging/aur/README.md +0 -0
  36. {plex_tui-0.3.0 → plex_tui-0.3.6}/packaging/homebrew/README.md +0 -0
  37. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/__main__.py +0 -0
  38. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/artwork.py +0 -0
  39. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/auth.py +0 -0
  40. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/config.py +0 -0
  41. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/models.py +0 -0
  42. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/player.py +0 -0
  43. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/plex_service.py +0 -0
  44. {plex_tui-0.3.0 → plex_tui-0.3.6}/src/plextui/smoke.py +0 -0
  45. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_artwork.py +0 -0
  46. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_auth.py +0 -0
  47. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_cli.py +0 -0
  48. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_config.py +0 -0
  49. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_player.py +0 -0
  50. {plex_tui-0.3.0 → plex_tui-0.3.6}/tests/test_plex_service.py +0 -0
@@ -43,7 +43,7 @@ jobs:
43
43
  - name: Generate .SRCINFO
44
44
  working-directory: packaging/aur
45
45
  run: |
46
- sudo -u builder makepkg --printsrcinfo > .SRCINFO.generated
46
+ sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO.generated > /dev/null
47
47
  diff -u .SRCINFO .SRCINFO.generated
48
48
 
49
49
  - name: Run namcap
@@ -0,0 +1,141 @@
1
+ name: Post-release AUR Update
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["Version Bump and Release"]
6
+ types: ["completed"]
7
+ workflow_dispatch:
8
+ inputs:
9
+ tag:
10
+ description: "Release tag to package, such as v0.3.0. Defaults to the latest GitHub Release."
11
+ required: false
12
+ type: string
13
+
14
+ env:
15
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
16
+
17
+ jobs:
18
+ aur-pr:
19
+ if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: write
23
+ pull-requests: write
24
+
25
+ steps:
26
+ - name: Check out repository
27
+ uses: actions/checkout@v5
28
+
29
+ - name: Check packaging PR token
30
+ env:
31
+ PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
32
+ run: |
33
+ if [ -z "$PACKAGING_PR_TOKEN" ]; then
34
+ echo "PACKAGING_PR_TOKEN secret is required to create, approve, and auto-merge packaging PRs" >&2
35
+ exit 1
36
+ fi
37
+
38
+ - name: Determine release tag
39
+ id: release
40
+ env:
41
+ GH_TOKEN: ${{ github.token }}
42
+ REQUESTED_TAG: ${{ github.event.inputs.tag }}
43
+ run: |
44
+ set -euo pipefail
45
+
46
+ if [ -n "$REQUESTED_TAG" ]; then
47
+ tag="$REQUESTED_TAG"
48
+ else
49
+ tag="$(gh release list --limit 1 --json tagName --jq '.[0].tagName')"
50
+ fi
51
+
52
+ if ! [[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
53
+ echo "Release tag must look like vX.Y.Z: $tag" >&2
54
+ exit 1
55
+ fi
56
+
57
+ version="${tag#v}"
58
+ echo "tag=$tag" >> "$GITHUB_OUTPUT"
59
+ echo "version=$version" >> "$GITHUB_OUTPUT"
60
+
61
+ - name: Download source archive and checksum
62
+ id: archive
63
+ env:
64
+ TAG: ${{ steps.release.outputs.tag }}
65
+ run: |
66
+ set -euo pipefail
67
+
68
+ url="https://github.com/${GITHUB_REPOSITORY}/archive/refs/tags/${TAG}.tar.gz"
69
+ curl --fail --location --retry 5 --retry-delay 2 --output source.tar.gz "$url"
70
+ sha256="$(sha256sum source.tar.gz | awk '{print $1}')"
71
+ echo "sha256=$sha256" >> "$GITHUB_OUTPUT"
72
+
73
+ - name: Update PKGBUILD
74
+ run: |
75
+ python scripts/update_aur_package.py \
76
+ "${{ steps.release.outputs.version }}" \
77
+ "${{ steps.archive.outputs.sha256 }}"
78
+
79
+ - name: Regenerate and validate AUR package
80
+ run: |
81
+ set -euo pipefail
82
+
83
+ docker run --rm \
84
+ -v "$PWD:/workspace" \
85
+ -w /workspace/packaging/aur \
86
+ archlinux:base-devel \
87
+ bash -lc '
88
+ set -euo pipefail
89
+ pacman -Syu --noconfirm git namcap sudo
90
+ useradd --create-home --shell /bin/bash builder
91
+ echo "builder ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/builder
92
+ chown -R builder:builder /workspace/packaging/aur
93
+ sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO > /dev/null
94
+ sudo -u builder makepkg --clean --syncdeps --noconfirm --check
95
+ namcap PKGBUILD ./*.pkg.tar.*
96
+ '
97
+
98
+ sudo chown -R "$(id -u):$(id -g)" packaging/aur
99
+
100
+ - name: Remove generated package artifacts
101
+ run: |
102
+ rm -f source.tar.gz
103
+ find packaging/aur -maxdepth 1 -type f \
104
+ \( -name "*.pkg.tar.*" -o -name "*.tar.gz" \) \
105
+ -delete
106
+
107
+ - name: Create packaging pull request
108
+ id: create-pr
109
+ uses: peter-evans/create-pull-request@v7
110
+ with:
111
+ token: ${{ secrets.PACKAGING_PR_TOKEN }}
112
+ branch: automation/aur-${{ steps.release.outputs.tag }}
113
+ delete-branch: true
114
+ commit-message: Update AUR package to ${{ steps.release.outputs.tag }}
115
+ title: Update AUR package to ${{ steps.release.outputs.tag }}
116
+ body: |
117
+ Updates Arch AUR packaging metadata for `${{ steps.release.outputs.tag }}`.
118
+
119
+ Validation performed by this workflow:
120
+ - downloaded the release source archive and computed the sha256
121
+ - regenerated `packaging/aur/.SRCINFO`
122
+ - ran `makepkg --clean --syncdeps --noconfirm --check`
123
+ - ran `namcap`
124
+
125
+ This is a packaging-only PR and intentionally has no semver bump marker.
126
+
127
+ - name: Approve packaging pull request
128
+ if: steps.create-pr.outputs.pull-request-number != ''
129
+ env:
130
+ GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
131
+ PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
132
+ run: |
133
+ gh pr review "$PR_NUMBER" --approve
134
+
135
+ - name: Enable packaging pull request auto-merge
136
+ if: steps.create-pr.outputs.pull-request-number != ''
137
+ env:
138
+ GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
139
+ PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
140
+ run: |
141
+ gh pr merge "$PR_NUMBER" --auto --squash --delete-branch
@@ -0,0 +1,129 @@
1
+ name: Post-release Homebrew Publish
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["Version Bump and Release"]
6
+ types: ["completed"]
7
+ workflow_dispatch:
8
+ inputs:
9
+ tag:
10
+ description: "Release tag to package, such as v0.3.0. Defaults to the latest GitHub Release."
11
+ required: false
12
+ type: string
13
+
14
+ env:
15
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
16
+
17
+ jobs:
18
+ publish-tap:
19
+ if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
20
+ runs-on: macos-latest
21
+ permissions:
22
+ contents: read
23
+
24
+ steps:
25
+ - name: Check out repository
26
+ uses: actions/checkout@v5
27
+
28
+ - name: Set up Python
29
+ uses: actions/setup-python@v6
30
+ with:
31
+ python-version: "3.13"
32
+
33
+ - name: Check packaging PR token
34
+ env:
35
+ PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
36
+ run: |
37
+ if [ -z "$PACKAGING_PR_TOKEN" ]; then
38
+ echo "PACKAGING_PR_TOKEN secret is required to publish the Homebrew tap" >&2
39
+ exit 1
40
+ fi
41
+
42
+ - name: Determine release tag
43
+ id: release
44
+ env:
45
+ GH_TOKEN: ${{ github.token }}
46
+ REQUESTED_TAG: ${{ github.event.inputs.tag }}
47
+ run: |
48
+ set -euo pipefail
49
+
50
+ if [ -n "$REQUESTED_TAG" ]; then
51
+ tag="$REQUESTED_TAG"
52
+ else
53
+ tag="$(gh release list --limit 1 --json tagName --jq '.[0].tagName')"
54
+ fi
55
+
56
+ if ! [[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
57
+ echo "Release tag must look like vX.Y.Z: $tag" >&2
58
+ exit 1
59
+ fi
60
+
61
+ version="${tag#v}"
62
+ echo "tag=$tag" >> "$GITHUB_OUTPUT"
63
+ echo "version=$version" >> "$GITHUB_OUTPUT"
64
+
65
+ - name: Tap Homebrew repository
66
+ id: tap
67
+ env:
68
+ PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
69
+ run: |
70
+ brew tap so1omon563/plex-tui "https://x-access-token:${PACKAGING_PR_TOKEN}@github.com/so1omon563/homebrew-plex-tui.git"
71
+ echo "path=$(brew --repo so1omon563/plex-tui)" >> "$GITHUB_OUTPUT"
72
+
73
+ - name: Update formula source
74
+ run: |
75
+ python scripts/update_homebrew_formula.py \
76
+ "${{ steps.tap.outputs.path }}/Formula/plex-tui.rb" \
77
+ "${{ steps.release.outputs.version }}"
78
+
79
+ - name: Audit formula
80
+ working-directory: ${{ steps.tap.outputs.path }}
81
+ run: |
82
+ brew audit --strict --online so1omon563/plex-tui/plex-tui
83
+
84
+ - name: Commit tap update
85
+ id: commit
86
+ working-directory: ${{ steps.tap.outputs.path }}
87
+ env:
88
+ VERSION: ${{ steps.release.outputs.version }}
89
+ run: |
90
+ set -euo pipefail
91
+
92
+ if git diff --quiet -- Formula/plex-tui.rb; then
93
+ echo "changed=false" >> "$GITHUB_OUTPUT"
94
+ echo "Homebrew tap is already up to date."
95
+ exit 0
96
+ fi
97
+
98
+ branch="automation/plex-tui-v${VERSION}"
99
+ git switch -c "$branch"
100
+ git config user.name "github-actions[bot]"
101
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
102
+ git add Formula/plex-tui.rb
103
+ git commit -m "Update plex-tui to ${VERSION}"
104
+ git push origin "$branch"
105
+
106
+ echo "changed=true" >> "$GITHUB_OUTPUT"
107
+ echo "branch=$branch" >> "$GITHUB_OUTPUT"
108
+
109
+ - name: Open and merge tap pull request
110
+ if: steps.commit.outputs.changed == 'true'
111
+ working-directory: ${{ steps.tap.outputs.path }}
112
+ env:
113
+ GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
114
+ VERSION: ${{ steps.release.outputs.version }}
115
+ BRANCH: ${{ steps.commit.outputs.branch }}
116
+ run: |
117
+ set -euo pipefail
118
+
119
+ pr_url="$(gh pr create \
120
+ --repo so1omon563/homebrew-plex-tui \
121
+ --base main \
122
+ --head "$BRANCH" \
123
+ --title "Update plex-tui to ${VERSION}" \
124
+ --body "Automated Homebrew tap update for plex-tui ${VERSION}.")"
125
+
126
+ gh pr merge "$pr_url" \
127
+ --repo so1omon563/homebrew-plex-tui \
128
+ --squash \
129
+ --delete-branch
@@ -0,0 +1,102 @@
1
+ name: Publish AUR Package
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["AUR Package"]
6
+ types: ["completed"]
7
+ workflow_dispatch:
8
+
9
+ env:
10
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
11
+
12
+ jobs:
13
+ publish:
14
+ if: |
15
+ github.event_name == 'workflow_dispatch' ||
16
+ (
17
+ github.event.workflow_run.conclusion == 'success' &&
18
+ github.event.workflow_run.head_branch == 'main' &&
19
+ github.event.workflow_run.event == 'push'
20
+ )
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+
25
+ steps:
26
+ - name: Check out repository
27
+ uses: actions/checkout@v5
28
+ with:
29
+ ref: ${{ github.event.workflow_run.head_sha || github.sha }}
30
+
31
+ - name: Read package version
32
+ id: package
33
+ run: |
34
+ set -euo pipefail
35
+
36
+ version="$(sed -n 's/^pkgver=//p' packaging/aur/PKGBUILD)"
37
+ release="$(sed -n 's/^pkgrel=//p' packaging/aur/PKGBUILD)"
38
+
39
+ if ! [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
40
+ echo "pkgver must look like X.Y.Z: $version" >&2
41
+ exit 1
42
+ fi
43
+ if ! [[ "$release" =~ ^[0-9]+$ ]]; then
44
+ echo "pkgrel must be numeric: $release" >&2
45
+ exit 1
46
+ fi
47
+
48
+ echo "version=$version" >> "$GITHUB_OUTPUT"
49
+ echo "release=$release" >> "$GITHUB_OUTPUT"
50
+
51
+ - name: Configure AUR SSH
52
+ env:
53
+ AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
54
+ run: |
55
+ set -euo pipefail
56
+
57
+ if [ -z "$AUR_SSH_PRIVATE_KEY" ]; then
58
+ echo "AUR_SSH_PRIVATE_KEY secret is required to publish to AUR" >&2
59
+ exit 1
60
+ fi
61
+
62
+ install -m 700 -d ~/.ssh
63
+ printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
64
+ chmod 600 ~/.ssh/aur
65
+ ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts
66
+
67
+ cat > ~/.ssh/config <<'EOF'
68
+ Host aur.archlinux.org
69
+ IdentityFile ~/.ssh/aur
70
+ IdentitiesOnly yes
71
+ User aur
72
+ EOF
73
+ chmod 600 ~/.ssh/config
74
+
75
+ - name: Clone AUR package repository
76
+ run: |
77
+ git clone ssh://aur@aur.archlinux.org/plex-tui.git aur-package
78
+
79
+ - name: Copy package metadata
80
+ run: |
81
+ cp packaging/aur/PKGBUILD aur-package/PKGBUILD
82
+ cp packaging/aur/.SRCINFO aur-package/.SRCINFO
83
+
84
+ - name: Commit and push AUR package
85
+ working-directory: aur-package
86
+ env:
87
+ VERSION: ${{ steps.package.outputs.version }}
88
+ RELEASE: ${{ steps.package.outputs.release }}
89
+ run: |
90
+ set -euo pipefail
91
+
92
+ git config user.name "github-actions[bot]"
93
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
94
+
95
+ if git diff --quiet -- PKGBUILD .SRCINFO; then
96
+ echo "AUR package repository is already up to date."
97
+ exit 0
98
+ fi
99
+
100
+ git add PKGBUILD .SRCINFO
101
+ git commit -m "Update to ${VERSION}-${RELEASE}"
102
+ git push origin master
@@ -83,6 +83,20 @@ Use PRs for repository changes. When publishing local commits, branch from
83
83
  open a draft PR instead of pushing directly to `main`. Treat `main` as a
84
84
  protected branch even before GitHub branch protection or rulesets are enabled.
85
85
 
86
+ By default, PR titles or bodies should include exactly one semver bump marker:
87
+ `#patch`, `#minor`, or `#major`. Most changes should advance tags when merged,
88
+ even when they do not publish a GitHub Release. Add `#release` only when the
89
+ merge should create the GitHub Release and publish package channels. Exceptions
90
+ are allowed for packaging-only follow-ups, automation repair, docs-only
91
+ maintenance, or other changes that should not create a new version tag; call out
92
+ the reason in the PR body when omitting a bump marker.
93
+
94
+ When preparing or estimating a release version, fetch remote tags first with
95
+ `git fetch --tags origin` and base the decision on the latest origin tag, not
96
+ only local tags or the latest GitHub Release. Non-release PRs with `#patch`,
97
+ `#minor`, or `#major` still create tags, so release prep files should match the
98
+ tag that the release PR merge will create.
99
+
86
100
  GitHub CLI notes:
87
101
 
88
102
  - `gh auth status` may fail inside the sandbox even when the user is logged in
@@ -2,6 +2,22 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.3.6 - 2026-06-12
6
+
7
+ - Polished grid cards so poster placeholders, cached artwork, titles,
8
+ subtitles, and selected status align more evenly in the media pane.
9
+ - Improved the details pane hierarchy with clearer playback readiness,
10
+ explicit empty metadata/stream states, tighter preference rows, and wrapped
11
+ summaries.
12
+ - Improved Settings detail feedback with consistent controls guidance, clearer
13
+ armed-confirmation text, and more useful saved-setting summaries.
14
+ - Polished playback diagnostics with clearer active playback status, structured
15
+ playback error details, and more direct debug-log follow-up guidance.
16
+ - Added shieldcn.dev README badges for CI, release, PyPI, AUR, Homebrew tap,
17
+ and license status.
18
+ - Documented release-prep guidance for fetching origin tags before deciding the
19
+ next release version.
20
+
5
21
  ## 0.3.0 - 2026-06-12
6
22
 
7
23
  - Added `plex-tui --diagnostics` for collecting environment and playback setup details.
@@ -90,13 +90,25 @@ Validation is handled by `.github/workflows/aur.yml`, which runs inside
90
90
  For each new app release:
91
91
 
92
92
  1. Publish and validate PyPI.
93
- 2. Update the Homebrew tap formula URL/hash and Python resources.
94
- 3. Update `packaging/aur/PKGBUILD` and `packaging/aur/.SRCINFO`.
95
- 4. Run packaging validation workflows.
96
- 5. Push the AUR package repo update after the workflow passes.
93
+ 2. Let the `Post-release Homebrew Publish` workflow update, validate, and merge
94
+ the Homebrew tap formula.
95
+ 3. Let the `Post-release AUR Update` workflow update AUR metadata, open the
96
+ packaging PR, approve it, and enable auto-merge.
97
+ 4. After the packaging PR merges and the `AUR Package` workflow passes on
98
+ `main`, the `Publish AUR Package` workflow pushes the validated `PKGBUILD`
99
+ and `.SRCINFO` to AUR.
100
+
101
+ The AUR automation requires:
102
+
103
+ - `PACKAGING_PR_TOKEN`: a token that can create, approve, and auto-merge the
104
+ generated packaging PR when branch protection requires those actions.
105
+ - `AUR_SSH_PRIVATE_KEY`: the private SSH key for pushing to
106
+ `ssh://aur@aur.archlinux.org/plex-tui.git`.
107
+
108
+ The Homebrew automation uses `PACKAGING_PR_TOKEN`; that token must also be able
109
+ to push branches and merge pull requests in `so1omon563/homebrew-plex-tui`.
97
110
 
98
111
  ## Known Follow-Up
99
112
 
100
- - Automate Homebrew tap updates after PyPI publishing.
101
113
  - Investigate faster Homebrew installs without compromising formula quality.
102
114
  - Consider standalone artifacts only after the app behavior stabilizes.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plex-tui
3
- Version: 0.3.0
3
+ Version: 0.3.6
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
@@ -36,6 +36,13 @@ Description-Content-Type: text/markdown
36
36
 
37
37
  # plex-tui
38
38
 
39
+ [![CI](https://shieldcn.dev/github/so1omon563/plex-tui/ci.png)](https://github.com/so1omon563/plex-tui/actions/workflows/ci.yml)
40
+ [![Release](https://shieldcn.dev/github/so1omon563/plex-tui/release.png)](https://github.com/so1omon563/plex-tui/releases/latest)
41
+ [![PyPI](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Fpypi.org%2Fpypi%2Fplex-tui%2Fjson&query=%24.info.version&label=PyPI&logo=pypi)](https://pypi.org/project/plex-tui/)
42
+ [![AUR](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Faur.archlinux.org%2Frpc%2Fv5%2Finfo%2Fplex-tui&query=%24.results%5B0%5D.Version&label=AUR&logo=archlinux)](https://aur.archlinux.org/packages/plex-tui)
43
+ [![Homebrew](https://shieldcn.dev/badge/Homebrew-tap-blue.png?logo=homebrew)](https://github.com/so1omon563/homebrew-plex-tui)
44
+ [![License](https://shieldcn.dev/github/so1omon563/plex-tui/license.png)](LICENSE)
45
+
39
46
  A standalone Python/Textual terminal UI for browsing Plex and launching playback
40
47
  through `mpv`.
41
48
 
@@ -1,5 +1,12 @@
1
1
  # plex-tui
2
2
 
3
+ [![CI](https://shieldcn.dev/github/so1omon563/plex-tui/ci.png)](https://github.com/so1omon563/plex-tui/actions/workflows/ci.yml)
4
+ [![Release](https://shieldcn.dev/github/so1omon563/plex-tui/release.png)](https://github.com/so1omon563/plex-tui/releases/latest)
5
+ [![PyPI](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Fpypi.org%2Fpypi%2Fplex-tui%2Fjson&query=%24.info.version&label=PyPI&logo=pypi)](https://pypi.org/project/plex-tui/)
6
+ [![AUR](https://shieldcn.dev/badge/dynamic/json.png?url=https%3A%2F%2Faur.archlinux.org%2Frpc%2Fv5%2Finfo%2Fplex-tui&query=%24.results%5B0%5D.Version&label=AUR&logo=archlinux)](https://aur.archlinux.org/packages/plex-tui)
7
+ [![Homebrew](https://shieldcn.dev/badge/Homebrew-tap-blue.png?logo=homebrew)](https://github.com/so1omon563/homebrew-plex-tui)
8
+ [![License](https://shieldcn.dev/github/so1omon563/plex-tui/license.png)](LICENSE)
9
+
3
10
  A standalone Python/Textual terminal UI for browsing Plex and launching playback
4
11
  through `mpv`.
5
12
 
@@ -100,24 +100,41 @@ python -m venv /tmp/plex-tui-pypi
100
100
 
101
101
  ## 6. Homebrew Tap
102
102
 
103
- Update `so1omon563/homebrew-plex-tui`:
103
+ The `Post-release Homebrew Publish` workflow updates
104
+ `so1omon563/homebrew-plex-tui` after a successful release workflow. It can also
105
+ be run manually with a release tag. The workflow updates:
104
106
 
105
107
  - Formula URL and sha256.
106
108
  - Python resource blocks if dependencies changed.
107
109
  - Formula test expectations if version output changed.
108
110
 
109
- Validate:
111
+ It then runs `brew audit --strict --online`, opens a tap PR, and merges it. This
112
+ uses `PACKAGING_PR_TOKEN`, which must have access to the tap repository.
113
+
114
+ If the automated workflow cannot run, update and validate manually:
110
115
 
111
116
  ```bash
112
117
  brew test so1omon563/plex-tui/plex-tui
113
118
  brew audit --strict --online so1omon563/plex-tui/plex-tui
114
119
  ```
115
120
 
116
- Open this as a packaging-only PR without a semver bump marker.
121
+ Open tap updates as packaging-only PRs without semver bump markers.
117
122
 
118
123
  ## 7. Arch AUR
119
124
 
120
- Update `packaging/aur/PKGBUILD` and regenerate `.SRCINFO`:
125
+ The `Post-release AUR Update` workflow opens a packaging-only PR after a
126
+ successful release workflow. It can also be run manually with a release tag. The
127
+ workflow updates `packaging/aur/PKGBUILD`, regenerates `.SRCINFO`, validates the
128
+ package with `makepkg`, runs `namcap`, opens a PR without a semver bump marker,
129
+ approves it, and enables auto-merge.
130
+
131
+ After that PR merges, the `AUR Package` workflow validates the merged metadata
132
+ on `main`. A successful `AUR Package` run triggers `Publish AUR Package`, which
133
+ pushes `PKGBUILD` and `.SRCINFO` to `ssh://aur@aur.archlinux.org/plex-tui.git`.
134
+ This requires the `AUR_SSH_PRIVATE_KEY` repository secret.
135
+
136
+ If the automated workflow cannot run, update `packaging/aur/PKGBUILD` and
137
+ regenerate `.SRCINFO` manually:
121
138
 
122
139
  ```bash
123
140
  cd packaging/aur
@@ -136,7 +153,8 @@ git commit -m "Update to X.Y.Z-1"
136
153
  git push
137
154
  ```
138
155
 
139
- Open this as a packaging-only PR without a semver bump marker.
156
+ Open repository metadata updates as packaging-only PRs without semver bump
157
+ markers.
140
158
 
141
159
  ## Manual Fallbacks
142
160
 
@@ -0,0 +1,57 @@
1
+ # Roadmap
2
+
3
+ ## App UX
4
+
5
+ - Rework grid view presentation so poster/title blocks feel balanced across
6
+ terminal sizes. The current grid is functional but visually uneven: poster
7
+ blocks, titles, and pane content can look lopsided or off-center.
8
+ - Continue tuning focus, row markers, and selection affordances based on real
9
+ terminal themes.
10
+ - Polish the details pane hierarchy for long summaries, missing metadata, and
11
+ playback readiness hints.
12
+ - Continue refining Settings ergonomics as new preferences are added, especially
13
+ grouping, current-value scanning, and change feedback.
14
+ - Tune real-library browsing only when verification shows a specific issue; the
15
+ latest perf pass showed fast grid rendering and poster fetches dominated by
16
+ network/cache timing.
17
+ - Tune grid artwork defaults such as `grid_prefetch_pages` only if future logs
18
+ show the current defaults are too aggressive or too conservative.
19
+ - Consider separate poster-size controls only if density presets are not enough
20
+ after real-library verification.
21
+ - Continue improving playback diagnostics as real-world `mpv` and Plex stream
22
+ failures show up in use.
23
+
24
+ ## Packaging & Distribution
25
+
26
+ - Keep planned releases moving through PRs so merged release PRs drive automatic
27
+ tagging, GitHub Release creation, PyPI publishing, Homebrew tap publishing,
28
+ and AUR publishing.
29
+ - Keep `main` protected in both `plex-tui` and `homebrew-plex-tui`; `plex-tui`
30
+ requires the Python 3.11 and 3.13 checks before merge.
31
+ - Improve Homebrew install time; the current formula works but builds native
32
+ Python resources such as `pillow` from source.
33
+ - Keep post-release package publishing fully automated across PyPI, Homebrew,
34
+ and AUR.
35
+ - Consider standalone artifacts only after the app behavior stabilizes.
36
+
37
+ ## Plex Integration Research
38
+
39
+ - Review the Plex module in
40
+ [`anthonycaccese/240-MP`](https://github.com/anthonycaccese/240-MP/tree/main)
41
+ for ideas that fit a terminal-first Plex client. Areas to evaluate include
42
+ profile switching, selective library display, Continue Watching/Resume, hubs,
43
+ playlists, collections, categories, movie editions, pre-play audio/subtitle
44
+ selection, alphabet browsing, show/season browsing, and direct-play versus
45
+ transcode quality choices.
46
+
47
+ ## Technical Follow-Up
48
+
49
+ - Use `PLEX_TUI_PERF_LOG=1` for focused regression checks when changing grid,
50
+ artwork, pagination, or detail-loading behavior.
51
+ - Revisit whether verbose `PLEX_TUI_ARTWORK_LOG=1` should expose more structured artwork counters.
52
+ - Revisit native terminal image support with a Kitty Unicode-placeholder
53
+ prototype. Direct Kitty graphics protocol placement inside Textual caused UI
54
+ hangs, so any future implementation should transmit images quietly, render
55
+ normal placeholder text that Textual can redraw safely, and keep block art as
56
+ the mandatory fallback.
57
+ - Add focused regression tests for any real-world Plex media edge cases discovered during use.
@@ -1,6 +1,6 @@
1
1
  pkgbase = plex-tui
2
2
  pkgdesc = Standalone Plex terminal UI with mpv playback
3
- pkgver = 0.2.1
3
+ pkgver = 0.3.0
4
4
  pkgrel = 1
5
5
  url = https://github.com/so1omon563/plex-tui
6
6
  arch = any
@@ -17,7 +17,7 @@ pkgbase = plex-tui
17
17
  depends = python-plexapi
18
18
  depends = python-rich
19
19
  depends = python-textual
20
- source = plex-tui-0.2.1.tar.gz::https://github.com/so1omon563/plex-tui/archive/refs/tags/v0.2.1.tar.gz
21
- sha256sums = f1b84354e5a0f7885fb7391d81f6d15ddece55822c8a5d5d08d01b4fadffbbeb
20
+ source = plex-tui-0.3.0.tar.gz::https://github.com/so1omon563/plex-tui/archive/refs/tags/v0.3.0.tar.gz
21
+ sha256sums = a8a9e104c97dcd57a1a1fc7e499a5afa32f86f11d14f79245f264335b36c97c0
22
22
 
23
23
  pkgname = plex-tui
@@ -1,6 +1,6 @@
1
1
  # Maintainer: so1omon
2
2
  pkgname=plex-tui
3
- pkgver=0.2.1
3
+ pkgver=0.3.0
4
4
  pkgrel=1
5
5
  pkgdesc="Standalone Plex terminal UI with mpv playback"
6
6
  arch=("any")
@@ -23,7 +23,7 @@ makedepends=(
23
23
  )
24
24
  checkdepends=("python-pytest")
25
25
  source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz")
26
- sha256sums=("f1b84354e5a0f7885fb7391d81f6d15ddece55822c8a5d5d08d01b4fadffbbeb")
26
+ sha256sums=("a8a9e104c97dcd57a1a1fc7e499a5afa32f86f11d14f79245f264335b36c97c0")
27
27
 
28
28
  build() {
29
29
  cd "$pkgname-$pkgver"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "plex-tui"
7
- version = "0.3.0"
7
+ version = "0.3.6"
8
8
  description = "A small standalone Plex terminal UI."
9
9
  readme = "README.md"
10
10
  license = "MIT"