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.
- emby_cli-0.8.0/.github/workflows/release.yml +183 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/PKG-INFO +8 -2
- {emby_cli-0.7.2 → emby_cli-0.8.0}/README.md +7 -1
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/_version.py +2 -2
- {emby_cli-0.7.2 → emby_cli-0.8.0}/.env.example +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/.github/workflows/ci.yml +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/.github/workflows/publish.yml +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/.gitignore +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/AGENTS.md +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/CHANGELOG.md +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/LICENSE +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/pyproject.toml +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/__init__.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/__main__.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/__init__.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/collections.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/items.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/api/libraries.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/auth_cache.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/cli.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/client.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/collection_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/__init__.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/collection.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/config.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/help.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/info.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/item.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/library.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/login.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/logout.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/commands/version.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/constants.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/credentials.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/data_cache.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/detail_output.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/download_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/item_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/library_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/media_sort.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/output.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/resolve.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/types.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/util.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/src/emby_cli/version.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_auth_cache.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_auth_expired.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_collection.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_item.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_library.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_client_retry.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_collection.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_collection_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_config.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_credentials.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_data_cache.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_download_one.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_download_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_info.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_item.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_item_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_item_performance.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_library.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_library_ops.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_logout.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_media_sort.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_output.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_parser.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_resolve.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_resolve_table.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_resolve_titles.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_session_auth.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_urllib3_warning.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_util.py +0 -0
- {emby_cli-0.7.2 → emby_cli-0.8.0}/tests/test_validate_args.py +0 -0
- {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.
|
|
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
|
|
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
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0,
|
|
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
|
|
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
|
|
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
|
|
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
|