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.
- {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/aur.yml +5 -2
- plex_tui-0.3.6/.github/workflows/bump.yml +108 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/ci.yml +5 -2
- plex_tui-0.3.6/.github/workflows/post-release-aur.yml +141 -0
- plex_tui-0.3.6/.github/workflows/post-release-homebrew.yml +129 -0
- plex_tui-0.3.6/.github/workflows/publish-aur.yml +102 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/publish-pypi.yml +5 -2
- {plex_tui-0.2.1 → plex_tui-0.3.6}/.github/workflows/publish-testpypi.yml +5 -2
- {plex_tui-0.2.1 → plex_tui-0.3.6}/AGENTS.md +30 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/CHANGELOG.md +27 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/Makefile +5 -2
- {plex_tui-0.2.1 → plex_tui-0.3.6}/PACKAGING.md +17 -5
- {plex_tui-0.2.1 → plex_tui-0.3.6}/PKG-INFO +24 -4
- {plex_tui-0.2.1 → plex_tui-0.3.6}/README.md +23 -3
- plex_tui-0.3.6/RELEASE.md +170 -0
- plex_tui-0.3.6/ROADMAP.md +57 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/config.example.toml +1 -1
- {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/aur/.SRCINFO +3 -3
- {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/aur/PKGBUILD +2 -2
- {plex_tui-0.2.1 → plex_tui-0.3.6}/pyproject.toml +1 -1
- plex_tui-0.3.6/scripts/check_release.py +176 -0
- plex_tui-0.3.6/scripts/update_aur_package.py +67 -0
- plex_tui-0.3.6/scripts/update_homebrew_formula.py +192 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/__init__.py +1 -1
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/__main__.py +6 -1
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/app.py +501 -85
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/artwork.py +35 -13
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_app_helpers.py +235 -19
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_app_navigation.py +116 -1
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_artwork.py +51 -3
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_cli.py +16 -0
- plex_tui-0.3.6/tests/test_release_checks.py +210 -0
- plex_tui-0.2.1/RELEASE.md +0 -126
- plex_tui-0.2.1/ROADMAP.md +0 -32
- {plex_tui-0.2.1 → plex_tui-0.3.6}/.gitignore +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/LICENSE +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/docs/assets/grid-view.png +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/docs/assets/list-view.png +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/aur/README.md +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/packaging/homebrew/README.md +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/auth.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/config.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/models.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/player.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/plex_service.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/src/plextui/smoke.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_auth.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_config.py +0 -0
- {plex_tui-0.2.1 → plex_tui-0.3.6}/tests/test_player.py +0 -0
- {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@
|
|
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
|
|
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@
|
|
23
|
+
uses: actions/checkout@v5
|
|
21
24
|
|
|
22
25
|
- name: Set up Python
|
|
23
|
-
uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
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@
|
|
20
|
+
uses: actions/checkout@v5
|
|
18
21
|
|
|
19
22
|
- name: Set up Python
|
|
20
|
-
uses: actions/setup-python@
|
|
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:
|
|
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
|