emby-cli 0.7.2__tar.gz → 0.8.0__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 (77) hide show
  1. emby_cli-0.8.0/.github/workflows/release.yml +183 -0
  2. {emby_cli-0.7.2 → emby_cli-0.8.0}/PKG-INFO +8 -2
  3. {emby_cli-0.7.2 → emby_cli-0.8.0}/README.md +7 -1
  4. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/_version.py +2 -2
  5. {emby_cli-0.7.2 → emby_cli-0.8.0}/.env.example +0 -0
  6. {emby_cli-0.7.2 → emby_cli-0.8.0}/.github/workflows/ci.yml +0 -0
  7. {emby_cli-0.7.2 → emby_cli-0.8.0}/.github/workflows/publish.yml +0 -0
  8. {emby_cli-0.7.2 → emby_cli-0.8.0}/.gitignore +0 -0
  9. {emby_cli-0.7.2 → emby_cli-0.8.0}/AGENTS.md +0 -0
  10. {emby_cli-0.7.2 → emby_cli-0.8.0}/CHANGELOG.md +0 -0
  11. {emby_cli-0.7.2 → emby_cli-0.8.0}/LICENSE +0 -0
  12. {emby_cli-0.7.2 → emby_cli-0.8.0}/pyproject.toml +0 -0
  13. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/__init__.py +0 -0
  14. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/__main__.py +0 -0
  15. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/__init__.py +0 -0
  16. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/collections.py +0 -0
  17. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/items.py +0 -0
  18. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/libraries.py +0 -0
  19. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/auth_cache.py +0 -0
  20. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/cli.py +0 -0
  21. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/client.py +0 -0
  22. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/collection_ops.py +0 -0
  23. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/__init__.py +0 -0
  24. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/collection.py +0 -0
  25. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/config.py +0 -0
  26. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/help.py +0 -0
  27. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/info.py +0 -0
  28. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/item.py +0 -0
  29. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/library.py +0 -0
  30. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/login.py +0 -0
  31. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/logout.py +0 -0
  32. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/version.py +0 -0
  33. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/constants.py +0 -0
  34. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/credentials.py +0 -0
  35. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/data_cache.py +0 -0
  36. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/detail_output.py +0 -0
  37. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/download_ops.py +0 -0
  38. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/item_ops.py +0 -0
  39. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/library_ops.py +0 -0
  40. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/media_sort.py +0 -0
  41. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/output.py +0 -0
  42. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/resolve.py +0 -0
  43. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/types.py +0 -0
  44. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/util.py +0 -0
  45. {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/version.py +0 -0
  46. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_auth_cache.py +0 -0
  47. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_auth_expired.py +0 -0
  48. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client.py +0 -0
  49. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_collection.py +0 -0
  50. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_item.py +0 -0
  51. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_library.py +0 -0
  52. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_retry.py +0 -0
  53. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_collection.py +0 -0
  54. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_collection_ops.py +0 -0
  55. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_config.py +0 -0
  56. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_credentials.py +0 -0
  57. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_data_cache.py +0 -0
  58. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_download_one.py +0 -0
  59. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_download_ops.py +0 -0
  60. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_info.py +0 -0
  61. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_item.py +0 -0
  62. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_item_ops.py +0 -0
  63. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_item_performance.py +0 -0
  64. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_library.py +0 -0
  65. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_library_ops.py +0 -0
  66. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_logout.py +0 -0
  67. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_media_sort.py +0 -0
  68. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_output.py +0 -0
  69. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_parser.py +0 -0
  70. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_resolve.py +0 -0
  71. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_resolve_table.py +0 -0
  72. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_resolve_titles.py +0 -0
  73. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_session_auth.py +0 -0
  74. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_urllib3_warning.py +0 -0
  75. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_util.py +0 -0
  76. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_validate_args.py +0 -0
  77. {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_version.py +0 -0
@@ -0,0 +1,183 @@
1
+ name: Release standalone binaries
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+ inputs:
9
+ test_version:
10
+ description: "Test version label (e.g. v0.0.0rc1)"
11
+ required: true
12
+ default: "v0.0.0rc1"
13
+
14
+ permissions:
15
+ contents: write
16
+
17
+ env:
18
+ PYTHON_VERSION: "3.12"
19
+
20
+ jobs:
21
+ resolve:
22
+ runs-on: ubuntu-latest
23
+ outputs:
24
+ tag: ${{ steps.v.outputs.tag }}
25
+ draft: ${{ steps.v.outputs.draft }}
26
+ pip_version: ${{ steps.v.outputs.pip_version }}
27
+ steps:
28
+ - name: Resolve version
29
+ id: v
30
+ run: |
31
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
32
+ TAG="${{ github.event.inputs.test_version }}"
33
+ echo "tag=$TAG" >> "$GITHUB_OUTPUT"
34
+ echo "draft=true" >> "$GITHUB_OUTPUT"
35
+ echo "pip_version=0.0.0" >> "$GITHUB_OUTPUT"
36
+ else
37
+ TAG="${GITHUB_REF#refs/tags/}"
38
+ echo "tag=$TAG" >> "$GITHUB_OUTPUT"
39
+ echo "draft=false" >> "$GITHUB_OUTPUT"
40
+ echo "pip_version=${TAG#v}" >> "$GITHUB_OUTPUT"
41
+ fi
42
+
43
+ build-macos:
44
+ needs: resolve
45
+ runs-on: macos-latest
46
+
47
+ steps:
48
+ - uses: actions/checkout@v6
49
+ with:
50
+ fetch-depth: 0
51
+
52
+ - uses: actions/setup-python@v6
53
+ with:
54
+ python-version: ${{ env.PYTHON_VERSION }}
55
+
56
+ - name: Install package and PyInstaller
57
+ run: pip install . pyinstaller
58
+ env:
59
+ SETUPTOOLS_SCM_PRETEND_VERSION: ${{ needs.resolve.outputs.pip_version }}
60
+
61
+ - name: Build standalone binary
62
+ run: |
63
+ pyinstaller --onefile --name emby-cli \
64
+ --hidden-import emby_cli \
65
+ --collect-submodules emby_cli \
66
+ src/emby_cli/__main__.py
67
+ mv dist/emby-cli dist/emby-cli-${{ needs.resolve.outputs.tag }}-macos-arm64
68
+
69
+ - name: Generate checksums
70
+ run: |
71
+ cd dist
72
+ for f in emby-cli-*; do shasum -a 256 "$f" > "$f.sha256"; done
73
+
74
+ - uses: actions/upload-artifact@v6
75
+ with:
76
+ name: binaries-macos-arm64
77
+ path: dist/emby-cli-*
78
+ if-no-files-found: error
79
+ retention-days: 1
80
+
81
+ build-linux:
82
+ needs: resolve
83
+ runs-on: ubuntu-latest
84
+
85
+ steps:
86
+ - uses: actions/checkout@v6
87
+ with:
88
+ fetch-depth: 0
89
+
90
+ - name: Build inside Debian 11 container (glibc 2.31)
91
+ run: |
92
+ docker run --rm \
93
+ -v "$PWD:/work" -w /work \
94
+ -e SETUPTOOLS_SCM_PRETEND_VERSION="${{ needs.resolve.outputs.pip_version }}" \
95
+ -e TAG="${{ needs.resolve.outputs.tag }}" \
96
+ python:${{ env.PYTHON_VERSION }}-slim-bullseye bash -c '
97
+ set -e
98
+ apt-get update -qq && apt-get install -y -qq binutils > /dev/null
99
+ pip install --quiet . pyinstaller
100
+
101
+ pyinstaller --onefile --name emby-cli \
102
+ --hidden-import emby_cli \
103
+ --collect-submodules emby_cli \
104
+ src/emby_cli/__main__.py
105
+ mv dist/emby-cli "dist/emby-cli-${TAG}-linux-x64"
106
+
107
+ cd dist
108
+ for f in emby-cli-*; do sha256sum "$f" > "$f.sha256"; done
109
+ '
110
+
111
+ - uses: actions/upload-artifact@v6
112
+ with:
113
+ name: binaries-linux-x64
114
+ path: dist/emby-cli-*
115
+ if-no-files-found: error
116
+ retention-days: 1
117
+
118
+ build-windows:
119
+ needs: resolve
120
+ runs-on: windows-latest
121
+
122
+ steps:
123
+ - uses: actions/checkout@v6
124
+ with:
125
+ fetch-depth: 0
126
+
127
+ - uses: actions/setup-python@v6
128
+ with:
129
+ python-version: ${{ env.PYTHON_VERSION }}
130
+
131
+ - name: Install package and PyInstaller
132
+ run: pip install . pyinstaller
133
+ env:
134
+ SETUPTOOLS_SCM_PRETEND_VERSION: ${{ needs.resolve.outputs.pip_version }}
135
+
136
+ - name: Build standalone binary
137
+ run: |
138
+ pyinstaller --onefile --name emby-cli `
139
+ --hidden-import emby_cli `
140
+ --collect-submodules emby_cli `
141
+ src/emby_cli/__main__.py
142
+ Move-Item dist/emby-cli.exe "dist/emby-cli-${{ needs.resolve.outputs.tag }}-windows-x64.exe"
143
+ shell: pwsh
144
+
145
+ - name: Generate checksums
146
+ run: |
147
+ Get-ChildItem dist/emby-cli-* -Exclude *.sha256 | ForEach-Object {
148
+ $hash = (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
149
+ "$hash $($_.Name)" | Out-File -Encoding ASCII "$($_.FullName).sha256"
150
+ }
151
+ shell: pwsh
152
+
153
+ - uses: actions/upload-artifact@v6
154
+ with:
155
+ name: binaries-windows-x64
156
+ path: dist/emby-cli-*
157
+ if-no-files-found: error
158
+ retention-days: 1
159
+
160
+ release:
161
+ name: Create GitHub Release
162
+ needs: [resolve, build-macos, build-linux, build-windows]
163
+ runs-on: ubuntu-latest
164
+
165
+ steps:
166
+ - name: Download all artifacts
167
+ uses: actions/download-artifact@v7
168
+ with:
169
+ pattern: binaries-*
170
+ merge-multiple: true
171
+ path: assets
172
+
173
+ - name: List assets
174
+ run: ls -lh assets/
175
+
176
+ - name: Publish GitHub Release
177
+ uses: softprops/action-gh-release@v3
178
+ with:
179
+ tag_name: ${{ needs.resolve.outputs.tag }}
180
+ name: ${{ needs.resolve.outputs.tag }}
181
+ draft: ${{ needs.resolve.outputs.draft }}
182
+ generate_release_notes: true
183
+ files: assets/*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: emby-cli
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: CLI to list, search, play, and download/backup original media from an Emby server via its REST API.
5
5
  Project-URL: Homepage, https://github.com/soukron/emby-cli
6
6
  Project-URL: Repository, https://github.com/soukron/emby-cli
@@ -44,6 +44,10 @@ port 8096): no SSH, shared folders, or rsync.
44
44
 
45
45
  ```bash
46
46
  pip install emby-cli
47
+
48
+ # Or, install in an isolated environment (recommended)
49
+ pipx install emby-cli # with pipx
50
+ uv tool install emby-cli # with uv (faster)
47
51
  ```
48
52
 
49
53
  ## Start in 60 seconds
@@ -261,7 +265,9 @@ python -m build && twine check dist/*
261
265
 
262
266
  Architecture, CLI contracts, testing rules, and the release process are in
263
267
  **[AGENTS.md](AGENTS.md)**. Releases are published to PyPI by pushing a
264
- `vX.Y.Z` tag; this project does not create GitHub Releases.
268
+ `vX.Y.Z` tag. Standalone binaries for macOS, Linux, and Windows are also
269
+ available on the [GitHub Releases](https://github.com/soukron/emby-cli/releases)
270
+ page.
265
271
 
266
272
  ## Responsible use
267
273
 
@@ -9,6 +9,10 @@ port 8096): no SSH, shared folders, or rsync.
9
9
 
10
10
  ```bash
11
11
  pip install emby-cli
12
+
13
+ # Or, install in an isolated environment (recommended)
14
+ pipx install emby-cli # with pipx
15
+ uv tool install emby-cli # with uv (faster)
12
16
  ```
13
17
 
14
18
  ## Start in 60 seconds
@@ -226,7 +230,9 @@ python -m build && twine check dist/*
226
230
 
227
231
  Architecture, CLI contracts, testing rules, and the release process are in
228
232
  **[AGENTS.md](AGENTS.md)**. Releases are published to PyPI by pushing a
229
- `vX.Y.Z` tag; this project does not create GitHub Releases.
233
+ `vX.Y.Z` tag. Standalone binaries for macOS, Linux, and Windows are also
234
+ available on the [GitHub Releases](https://github.com/soukron/emby-cli/releases)
235
+ page.
230
236
 
231
237
  ## Responsible use
232
238
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.7.2'
22
- __version_tuple__ = version_tuple = (0, 7, 2)
21
+ __version__ = version = '0.8.0'
22
+ __version_tuple__ = version_tuple = (0, 8, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None
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