plex-tui 0.2.1__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.2.1 → plex_tui-0.3.6}/.github/workflows/aur.yml +5 -2
  2. plex_tui-0.3.6/.github/workflows/bump.yml +108 -0
  3. {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/ci.yml +5 -2
  4. plex_tui-0.3.6/.github/workflows/post-release-aur.yml +141 -0
  5. plex_tui-0.3.6/.github/workflows/post-release-homebrew.yml +129 -0
  6. plex_tui-0.3.6/.github/workflows/publish-aur.yml +102 -0
  7. {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/publish-pypi.yml +5 -2
  8. {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/publish-testpypi.yml +5 -2
  9. {plex_tui-0.2.1 → plex_tui-0.3.6}/AGENTS.md +30 -0
  10. {plex_tui-0.2.1 → plex_tui-0.3.6}/CHANGELOG.md +27 -0
  11. {plex_tui-0.2.1 → plex_tui-0.3.6}/Makefile +5 -2
  12. {plex_tui-0.2.1 → plex_tui-0.3.6}/PACKAGING.md +17 -5
  13. {plex_tui-0.2.1 → plex_tui-0.3.6}/PKG-INFO +24 -4
  14. {plex_tui-0.2.1 → plex_tui-0.3.6}/README.md +23 -3
  15. plex_tui-0.3.6/RELEASE.md +170 -0
  16. plex_tui-0.3.6/ROADMAP.md +57 -0
  17. {plex_tui-0.2.1 → plex_tui-0.3.6}/config.example.toml +1 -1
  18. {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/aur/.SRCINFO +3 -3
  19. {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/aur/PKGBUILD +2 -2
  20. {plex_tui-0.2.1 → plex_tui-0.3.6}/pyproject.toml +1 -1
  21. plex_tui-0.3.6/scripts/check_release.py +176 -0
  22. plex_tui-0.3.6/scripts/update_aur_package.py +67 -0
  23. plex_tui-0.3.6/scripts/update_homebrew_formula.py +192 -0
  24. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/__init__.py +1 -1
  25. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/__main__.py +6 -1
  26. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/app.py +501 -85
  27. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/artwork.py +35 -13
  28. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_app_helpers.py +235 -19
  29. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_app_navigation.py +116 -1
  30. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_artwork.py +51 -3
  31. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_cli.py +16 -0
  32. plex_tui-0.3.6/tests/test_release_checks.py +210 -0
  33. plex_tui-0.2.1/RELEASE.md +0 -126
  34. plex_tui-0.2.1/ROADMAP.md +0 -32
  35. {plex_tui-0.2.1 → plex_tui-0.3.6}/.gitignore +0 -0
  36. {plex_tui-0.2.1 → plex_tui-0.3.6}/LICENSE +0 -0
  37. {plex_tui-0.2.1 → plex_tui-0.3.6}/docs/assets/grid-view.png +0 -0
  38. {plex_tui-0.2.1 → plex_tui-0.3.6}/docs/assets/list-view.png +0 -0
  39. {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/aur/README.md +0 -0
  40. {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/homebrew/README.md +0 -0
  41. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/auth.py +0 -0
  42. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/config.py +0 -0
  43. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/models.py +0 -0
  44. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/player.py +0 -0
  45. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/plex_service.py +0 -0
  46. {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/smoke.py +0 -0
  47. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_auth.py +0 -0
  48. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_config.py +0 -0
  49. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_player.py +0 -0
  50. {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_plex_service.py +0 -0
@@ -13,6 +13,9 @@ on:
13
13
  - "packaging/aur/**"
14
14
  workflow_dispatch:
15
15
 
16
+ env:
17
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
18
+
16
19
  jobs:
17
20
  makepkg:
18
21
  runs-on: ubuntu-latest
@@ -24,7 +27,7 @@ jobs:
24
27
  pacman -Syu --noconfirm git namcap sudo
25
28
 
26
29
  - name: Check out repository
27
- uses: actions/checkout@v4
30
+ uses: actions/checkout@v5
28
31
 
29
32
  - name: Create build user
30
33
  run: |
@@ -40,7 +43,7 @@ jobs:
40
43
  - name: Generate .SRCINFO
41
44
  working-directory: packaging/aur
42
45
  run: |
43
- sudo -u builder makepkg --printsrcinfo > .SRCINFO.generated
46
+ sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO.generated > /dev/null
44
47
  diff -u .SRCINFO .SRCINFO.generated
45
48
 
46
49
  - name: Run namcap
@@ -0,0 +1,108 @@
1
+ name: Version Bump and Release
2
+
3
+ on:
4
+ pull_request:
5
+ types: ["closed"]
6
+ branches: ["main"]
7
+
8
+ env:
9
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
10
+
11
+ jobs:
12
+ bump-version:
13
+ if: |
14
+ github.event.pull_request.merged == true &&
15
+ (
16
+ contains(github.event.pull_request.title, '#patch') ||
17
+ contains(github.event.pull_request.title, '#minor') ||
18
+ contains(github.event.pull_request.title, '#major') ||
19
+ contains(github.event.pull_request.body, '#patch') ||
20
+ contains(github.event.pull_request.body, '#minor') ||
21
+ contains(github.event.pull_request.body, '#major')
22
+ )
23
+ runs-on: ubuntu-latest
24
+ permissions:
25
+ contents: write
26
+ outputs:
27
+ new_tag: ${{ steps.bump.outputs.new_version }}
28
+ previous_tag: ${{ steps.bump.outputs.previous_version }}
29
+ skipped: ${{ steps.bump.outputs.skipped }}
30
+ release_requested: ${{ steps.bump.outputs.should_release }}
31
+
32
+ steps:
33
+ - name: Check out repository
34
+ uses: actions/checkout@v5
35
+ with:
36
+ fetch-depth: 0
37
+
38
+ - name: Bump version tag
39
+ id: bump
40
+ uses: so1omon563/custom-semver-bumper@v1
41
+ with:
42
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
43
+ branch_name: ${{ github.event.pull_request.head.ref }}
44
+ # Floating pointer tags are owned by release-creator so they only move
45
+ # when a GitHub Release is intentionally published.
46
+
47
+ create-release:
48
+ name: Create GitHub Release
49
+ needs: bump-version
50
+ if: |
51
+ needs.bump-version.outputs.release_requested == 'true' &&
52
+ needs.bump-version.outputs.skipped != 'true'
53
+ runs-on: ubuntu-latest
54
+ permissions:
55
+ contents: write
56
+
57
+ steps:
58
+ - name: Check out repository
59
+ uses: actions/checkout@v5
60
+ with:
61
+ fetch-depth: 0
62
+
63
+ - name: Create release
64
+ uses: so1omon563/release-creator@v1
65
+ with:
66
+ token: ${{ secrets.GITHUB_TOKEN }}
67
+ tag: ${{ needs.bump-version.outputs.new_tag }}
68
+ from-tag: ${{ needs.bump-version.outputs.previous_tag }}
69
+ tag-prefix: v
70
+ notes-format: grouped
71
+ move-major-tag: "true"
72
+ move-minor-tag: "true"
73
+
74
+ publish-pypi:
75
+ name: Publish to PyPI
76
+ needs:
77
+ - bump-version
78
+ - create-release
79
+ runs-on: ubuntu-latest
80
+ environment: pypi
81
+ permissions:
82
+ contents: read
83
+ id-token: write
84
+
85
+ steps:
86
+ - name: Check out release tag
87
+ uses: actions/checkout@v5
88
+ with:
89
+ ref: ${{ needs.bump-version.outputs.new_tag }}
90
+
91
+ - name: Set up Python
92
+ uses: actions/setup-python@v6
93
+ with:
94
+ python-version: "3.13"
95
+
96
+ - name: Install build tools
97
+ run: |
98
+ python -m pip install --upgrade pip
99
+ python -m pip install build twine
100
+
101
+ - name: Build package
102
+ run: python -m build
103
+
104
+ - name: Check package metadata
105
+ run: python -m twine check dist/*
106
+
107
+ - name: Publish package
108
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -6,6 +6,9 @@ on:
6
6
  pull_request:
7
7
  branches: ["main"]
8
8
 
9
+ env:
10
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
11
+
9
12
  jobs:
10
13
  check:
11
14
  name: Python ${{ matrix.python-version }}
@@ -17,10 +20,10 @@ jobs:
17
20
 
18
21
  steps:
19
22
  - name: Check out repository
20
- uses: actions/checkout@v4
23
+ uses: actions/checkout@v5
21
24
 
22
25
  - name: Set up Python
23
- uses: actions/setup-python@v5
26
+ uses: actions/setup-python@v6
24
27
  with:
25
28
  python-version: ${{ matrix.python-version }}
26
29
 
@@ -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
@@ -14,6 +14,9 @@ permissions:
14
14
  contents: read
15
15
  id-token: write
16
16
 
17
+ env:
18
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
19
+
17
20
  jobs:
18
21
  publish:
19
22
  runs-on: ubuntu-latest
@@ -21,12 +24,12 @@ jobs:
21
24
 
22
25
  steps:
23
26
  - name: Check out repository
24
- uses: actions/checkout@v4
27
+ uses: actions/checkout@v5
25
28
  with:
26
29
  ref: ${{ github.event.release.tag_name || inputs.ref }}
27
30
 
28
31
  - name: Set up Python
29
- uses: actions/setup-python@v5
32
+ uses: actions/setup-python@v6
30
33
  with:
31
34
  python-version: "3.13"
32
35
 
@@ -7,6 +7,9 @@ permissions:
7
7
  contents: read
8
8
  id-token: write
9
9
 
10
+ env:
11
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
12
+
10
13
  jobs:
11
14
  publish:
12
15
  runs-on: ubuntu-latest
@@ -14,10 +17,10 @@ jobs:
14
17
 
15
18
  steps:
16
19
  - name: Check out repository
17
- uses: actions/checkout@v4
20
+ uses: actions/checkout@v5
18
21
 
19
22
  - name: Set up Python
20
- uses: actions/setup-python@v5
23
+ uses: actions/setup-python@v6
21
24
  with:
22
25
  python-version: "3.13"
23
26
 
@@ -78,6 +78,36 @@ Pull requests should include:
78
78
  - Screenshots or terminal notes for TUI changes when useful.
79
79
  - Any config, packaging, or migration impact.
80
80
 
81
+ Use PRs for repository changes. When publishing local commits, branch from
82
+ `main` with a scoped name such as `codex/release-prep`, push that branch, and
83
+ open a draft PR instead of pushing directly to `main`. Treat `main` as a
84
+ protected branch even before GitHub branch protection or rulesets are enabled.
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
+
100
+ GitHub CLI notes:
101
+
102
+ - `gh auth status` may fail inside the sandbox even when the user is logged in
103
+ via the macOS keyring. Re-run `gh` auth, PR, and push operations outside the
104
+ sandbox when keyring access is required.
105
+ - Prefer the GitHub connector for PR creation when it has access. If it returns
106
+ `403 Resource not accessible by integration`, fall back to
107
+ `gh pr create --draft` using the authenticated CLI session.
108
+ - Keep PR bodies explicit about validation, especially `make check` results and
109
+ release workflow checks such as `actionlint`.
110
+
81
111
  ## Security & Configuration Tips
82
112
 
83
113
  Never commit real Plex tokens, account tokens, debug logs, or local config files.
@@ -2,6 +2,33 @@
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
+
21
+ ## 0.3.0 - 2026-06-12
22
+
23
+ - Added `plex-tui --diagnostics` for collecting environment and playback setup details.
24
+ - Added PR-merge version tagging, GitHub Release creation, and PyPI publishing workflow automation.
25
+ - Added a local release workflow and version metadata verification target.
26
+ - Added targeted playback troubleshooting hints for common `mpv` and Plex stream failures.
27
+ - Added a compact active-playback footer while media is playing.
28
+ - Simplified Settings rows into inline controls for numeric values, toggles, and option cycling.
29
+ - Tuned grid density geometry and stabilized unloaded poster placeholders.
30
+ - Added explicit Kitty renderer fallback diagnostics while native images remain disabled inside Textual.
31
+
5
32
  ## 0.2.1 - 2026-06-11
6
33
 
7
34
  - Added GitHub Actions CI and PyPI Trusted Publishing workflow scaffolding.
@@ -1,4 +1,4 @@
1
- .PHONY: install-dev run test compile smoke build check-package check clean
1
+ .PHONY: install-dev run test compile smoke build check-package check-release check clean
2
2
 
3
3
  PYTHON ?= .venv/bin/python
4
4
 
@@ -23,7 +23,10 @@ build:
23
23
  check-package: build
24
24
  $(PYTHON) -m twine check dist/*
25
25
 
26
- check: smoke test compile check-package
26
+ check-release:
27
+ $(PYTHON) scripts/check_release.py
28
+
29
+ check: smoke test compile check-release check-package
27
30
 
28
31
  clean:
29
32
  rm -rf build dist *.egg-info src/*.egg-info