mnamer 2.7.1.dev26__tar.gz → 2.7.1.dev28__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 (81) hide show
  1. mnamer-2.7.1.dev28/.dockerignore +8 -0
  2. mnamer-2.7.1.dev28/.github/workflows/publish-docker.yml +251 -0
  3. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/workflows/push.yml +39 -0
  4. mnamer-2.7.1.dev28/Dockerfile +20 -0
  5. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/PKG-INFO +1 -1
  6. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/__version__.py +1 -1
  7. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer.egg-info/PKG-INFO +1 -1
  8. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer.egg-info/SOURCES.txt +2 -0
  9. mnamer-2.7.1.dev26/Dockerfile +0 -10
  10. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/actions/init/action.yml +0 -0
  11. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/actions/lint/action.yml +0 -0
  12. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/actions/test/action.yml +0 -0
  13. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/dependabot.yml +0 -0
  14. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/workflows/publish.yml +0 -0
  15. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.github/workflows/pull_request.yml +0 -0
  16. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.gitignore +0 -0
  17. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.python-version +0 -0
  18. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/.vscode/settings.json +0 -0
  19. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/AGENTS.md +0 -0
  20. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/CLAUDE.md +0 -0
  21. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/LICENSE.txt +0 -0
  22. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/MANIFEST.in +0 -0
  23. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/README.md +0 -0
  24. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/design.eps +0 -0
  25. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/logo-2.png +0 -0
  26. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/logo-3.png +0 -0
  27. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/logo.png +0 -0
  28. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/recording.mov +0 -0
  29. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/screenshot.eps +0 -0
  30. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/assets/screenshot.png +0 -0
  31. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/makefile +0 -0
  32. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/__init__.py +0 -0
  33. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/__main__.py +0 -0
  34. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/argument.py +0 -0
  35. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/const.py +0 -0
  36. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/endpoints.py +0 -0
  37. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/exceptions.py +0 -0
  38. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/frontends.py +0 -0
  39. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/language.py +0 -0
  40. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/metadata.py +0 -0
  41. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/providers.py +0 -0
  42. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/py.typed +0 -0
  43. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/setting_spec.py +0 -0
  44. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/setting_store.py +0 -0
  45. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/target.py +0 -0
  46. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/tty.py +0 -0
  47. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/types.py +0 -0
  48. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer/utils.py +0 -0
  49. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer.egg-info/dependency_links.txt +0 -0
  50. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer.egg-info/entry_points.txt +0 -0
  51. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer.egg-info/requires.txt +0 -0
  52. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/mnamer.egg-info/top_level.txt +0 -0
  53. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/pyproject.toml +0 -0
  54. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/pytest.ini +0 -0
  55. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/setup.cfg +0 -0
  56. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/__init__.py +0 -0
  57. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/conftest.py +0 -0
  58. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/e2e/__init__.py +0 -0
  59. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/e2e/conftest.py +0 -0
  60. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/e2e/test_directives.py +0 -0
  61. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/e2e/test_errors.py +0 -0
  62. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/e2e/test_moving.py +0 -0
  63. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/__init__.py +0 -0
  64. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_argument.py +0 -0
  65. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_language.py +0 -0
  66. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_metadata.py +0 -0
  67. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_setting_spec.py +0 -0
  68. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_setting_store.py +0 -0
  69. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_target.py +0 -0
  70. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_tty.py +0 -0
  71. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/local/test_utils.py +0 -0
  72. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/__init__.py +0 -0
  73. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_endpoints__omdb.py +0 -0
  74. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_endpoints__tmdb.py +0 -0
  75. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_endpoints__tvdb.py +0 -0
  76. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_endpoints__tvmaze.py +0 -0
  77. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_providers__omdb.py +0 -0
  78. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_providers__tmdb.py +0 -0
  79. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_providers__tvdb.py +0 -0
  80. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/tests/network/test_providers__tvmaze.py +0 -0
  81. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev28}/uv.lock +0 -0
@@ -0,0 +1,8 @@
1
+ .mypy_cache
2
+ .pytest_cache
3
+ .ruff_cache
4
+ .venv
5
+ build
6
+ dist
7
+ *.egg-info
8
+ __pycache__
@@ -0,0 +1,251 @@
1
+ name: publish docker
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ target:
7
+ required: true
8
+ type: string
9
+ release_tag:
10
+ required: false
11
+ type: string
12
+ default: ""
13
+ is_prerelease:
14
+ required: false
15
+ type: boolean
16
+ default: false
17
+ secrets:
18
+ DOCKERHUB_USERNAME:
19
+ required: true
20
+ DOCKERHUB_TOKEN:
21
+ required: true
22
+
23
+ workflow_dispatch:
24
+ inputs:
25
+ target:
26
+ description: What Docker image set to publish
27
+ required: true
28
+ type: choice
29
+ options:
30
+ - latest sha
31
+ - latest release
32
+
33
+ env:
34
+ DOCKERHUB_IMAGE: jkwill87/mnamer
35
+ GHCR_IMAGE: ghcr.io/jkwill87/mnamer/mnamer
36
+
37
+ jobs:
38
+ publish-docker:
39
+ runs-on: ubuntu-latest
40
+
41
+ permissions:
42
+ contents: read
43
+ packages: write
44
+
45
+ steps:
46
+ - name: Resolving Source
47
+ id: resolve
48
+ env:
49
+ GH_TOKEN: ${{ github.token }}
50
+ RAW_TARGET: ${{ inputs.target || github.event.inputs.target }}
51
+ RELEASE_TAG: ${{ inputs.release_tag }}
52
+ IS_PRERELEASE: ${{ inputs.is_prerelease }}
53
+ run: |
54
+ set -euo pipefail
55
+
56
+ target="$(printf '%s' "$RAW_TARGET" | tr ' ' '-')"
57
+ main_sha="$(git ls-remote "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git" refs/heads/main | awk '{print $1}')"
58
+
59
+ case "$target" in
60
+ latest-sha)
61
+ checkout_ref="$main_sha"
62
+ release_tag=""
63
+ is_prerelease="false"
64
+ ;;
65
+ latest-release)
66
+ release_json="$(gh release view --repo "$GITHUB_REPOSITORY" --json tagName,isPrerelease)"
67
+ release_tag="$(jq -r '.tagName' <<<"$release_json")"
68
+ is_prerelease="$(jq -r '.isPrerelease' <<<"$release_json")"
69
+ checkout_ref="$release_tag"
70
+ ;;
71
+ event-release)
72
+ release_tag="$RELEASE_TAG"
73
+ is_prerelease="$IS_PRERELEASE"
74
+ checkout_ref="$release_tag"
75
+ ;;
76
+ *)
77
+ echo "Unsupported Docker publish target: $RAW_TARGET" >&2
78
+ exit 1
79
+ ;;
80
+ esac
81
+
82
+ if [ -z "$checkout_ref" ]; then
83
+ echo "Could not resolve a checkout ref for target: $RAW_TARGET" >&2
84
+ exit 1
85
+ fi
86
+
87
+ {
88
+ echo "target=$target"
89
+ echo "checkout_ref=$checkout_ref"
90
+ echo "main_sha=$main_sha"
91
+ echo "release_tag=$release_tag"
92
+ echo "is_prerelease=$is_prerelease"
93
+ } >> "$GITHUB_OUTPUT"
94
+
95
+ - uses: actions/checkout@v6
96
+ with:
97
+ ref: ${{ steps.resolve.outputs.checkout_ref }}
98
+ fetch-depth: 0
99
+
100
+ - name: Finalizing Tags
101
+ id: tags
102
+ env:
103
+ TARGET: ${{ steps.resolve.outputs.target }}
104
+ MAIN_SHA: ${{ steps.resolve.outputs.main_sha }}
105
+ RELEASE_TAG: ${{ steps.resolve.outputs.release_tag }}
106
+ IS_PRERELEASE: ${{ steps.resolve.outputs.is_prerelease }}
107
+ run: |
108
+ set -euo pipefail
109
+
110
+ source_sha="$(git rev-parse HEAD)"
111
+ aliases=()
112
+
113
+ if [ "$TARGET" = "latest-sha" ]; then
114
+ python -m pip install --quiet setuptools-scm[toml]
115
+ version="$(python -m setuptools_scm)"
116
+ aliases+=("dev")
117
+ else
118
+ version="${RELEASE_TAG#v}"
119
+ aliases+=("$version")
120
+
121
+ if [ "$IS_PRERELEASE" != "true" ]; then
122
+ aliases+=("latest")
123
+ fi
124
+
125
+ if [ "$TARGET" = "latest-release" ] && [ "$source_sha" = "$MAIN_SHA" ]; then
126
+ aliases+=("dev")
127
+ fi
128
+ fi
129
+
130
+ {
131
+ echo "source_sha=$source_sha"
132
+ echo "version=$version"
133
+ echo "aliases<<EOF"
134
+ printf '%s\n' "${aliases[@]}"
135
+ echo "EOF"
136
+ } >> "$GITHUB_OUTPUT"
137
+
138
+ - name: Logging In To GHCR
139
+ uses: docker/login-action@v4
140
+ with:
141
+ registry: ghcr.io
142
+ username: ${{ github.actor }}
143
+ password: ${{ secrets.GITHUB_TOKEN }}
144
+
145
+ - name: Logging In To Docker Hub
146
+ uses: docker/login-action@v4
147
+ with:
148
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
149
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
150
+ scope: jkwill87/mnamer@push
151
+
152
+ - name: Setting Up QEMU
153
+ uses: docker/setup-qemu-action@v3
154
+
155
+ - name: Setting Up Docker Buildx
156
+ uses: docker/setup-buildx-action@v3
157
+
158
+ - name: Planning Docker Push
159
+ id: plan
160
+ env:
161
+ SOURCE_SHA: ${{ steps.tags.outputs.source_sha }}
162
+ ALIASES: ${{ steps.tags.outputs.aliases }}
163
+ run: |
164
+ set -euo pipefail
165
+
166
+ tag_is_current() {
167
+ local ref="$1"
168
+ local output
169
+ local error_file
170
+ error_file="$(mktemp)"
171
+
172
+ if ! output="$(docker buildx imagetools inspect "$ref" --raw 2>"$error_file")"; then
173
+ if grep -Eiq 'not found|manifest unknown|name unknown' "$error_file"; then
174
+ rm -f "$error_file"
175
+ return 1
176
+ fi
177
+
178
+ cat "$error_file" >&2
179
+ rm -f "$error_file"
180
+ return 2
181
+ fi
182
+
183
+ rm -f "$error_file"
184
+ revision="$(
185
+ jq -r '
186
+ .annotations["org.opencontainers.image.revision"]
187
+ // (.manifests[]?.annotations["org.opencontainers.image.revision"] // empty)
188
+ ' <<<"$output" | head -n 1
189
+ )"
190
+ [ "$revision" = "$SOURCE_SHA" ]
191
+ }
192
+
193
+ tags=()
194
+ while IFS= read -r alias; do
195
+ [ -n "$alias" ] || continue
196
+
197
+ tags+=("$GHCR_IMAGE:$alias")
198
+ tags+=("$DOCKERHUB_IMAGE:$alias")
199
+ done <<<"$ALIASES"
200
+
201
+ publish_tags=()
202
+ for tag in "${tags[@]}"; do
203
+ if tag_is_current "$tag"; then
204
+ echo "$tag is already current"
205
+ else
206
+ echo "$tag needs publishing"
207
+ publish_tags+=("$tag")
208
+ fi
209
+ done
210
+
211
+ if [ "${#publish_tags[@]}" -eq 0 ]; then
212
+ echo "All requested Docker tags are already current."
213
+ echo "should_push=false" >> "$GITHUB_OUTPUT"
214
+ else
215
+ echo "should_push=true" >> "$GITHUB_OUTPUT"
216
+ {
217
+ echo "tags<<EOF"
218
+ printf '%s\n' "${publish_tags[@]}"
219
+ echo "EOF"
220
+ } >> "$GITHUB_OUTPUT"
221
+ fi
222
+
223
+ - name: Extracting Docker Metadata
224
+ if: steps.plan.outputs.should_push == 'true'
225
+ id: meta
226
+ uses: docker/metadata-action@v6
227
+ with:
228
+ images: |
229
+ ${{ env.GHCR_IMAGE }}
230
+ ${{ env.DOCKERHUB_IMAGE }}
231
+ labels: |
232
+ org.opencontainers.image.title=mnamer
233
+ org.opencontainers.image.description=A command-line utility for organizing media files.
234
+ org.opencontainers.image.revision=${{ steps.tags.outputs.source_sha }}
235
+ org.opencontainers.image.version=${{ steps.tags.outputs.version }}
236
+
237
+ - name: Building And Publishing Docker Image
238
+ if: steps.plan.outputs.should_push == 'true'
239
+ uses: docker/build-push-action@v7
240
+ with:
241
+ context: .
242
+ platforms: linux/amd64,linux/arm64
243
+ push: true
244
+ tags: ${{ steps.plan.outputs.tags }}
245
+ labels: ${{ steps.meta.outputs.labels }}
246
+ annotations: |
247
+ org.opencontainers.image.revision=${{ steps.tags.outputs.source_sha }}
248
+ org.opencontainers.image.version=${{ steps.tags.outputs.version }}
249
+ org.opencontainers.image.source=https://github.com/${{ github.repository }}
250
+ cache-from: type=gha
251
+ cache-to: type=gha,mode=max
@@ -49,3 +49,42 @@ jobs:
49
49
  inherit
50
50
 
51
51
  uses: ./.github/workflows/publish.yml
52
+
53
+ publish-docker-main:
54
+ if: >-
55
+ success()
56
+ && github.event_name == 'push'
57
+ && github.ref == 'refs/heads/main'
58
+
59
+ needs:
60
+ - lint
61
+ - test
62
+
63
+ secrets:
64
+ inherit
65
+
66
+ uses: ./.github/workflows/publish-docker.yml
67
+ with:
68
+ target: latest-sha
69
+
70
+ publish-docker-release:
71
+ if: >-
72
+ success()
73
+ && github.event_name == 'release'
74
+ && (
75
+ github.event.action == 'published'
76
+ || github.event.action == 'prereleased'
77
+ )
78
+
79
+ needs:
80
+ - lint
81
+ - test
82
+
83
+ secrets:
84
+ inherit
85
+
86
+ uses: ./.github/workflows/publish-docker.yml
87
+ with:
88
+ target: event-release
89
+ release_tag: ${{ github.event.release.tag_name }}
90
+ is_prerelease: ${{ github.event.release.prerelease }}
@@ -0,0 +1,20 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ FROM python:alpine AS builder
4
+
5
+ RUN apk add --no-cache git
6
+ WORKDIR /src
7
+ COPY . .
8
+ RUN pip wheel --no-cache-dir --wheel-dir /wheels .
9
+
10
+ FROM python:alpine
11
+ ARG UID=1000
12
+ ARG GID=1000
13
+ RUN addgroup mnamer -g "$GID"
14
+ RUN adduser mnamer -u "$UID" -G mnamer --disabled-password
15
+ COPY --from=builder /wheels/*.whl /tmp/
16
+ RUN pip3 install --no-cache-dir --upgrade pip /tmp/*.whl \
17
+ && rm -f /tmp/*.whl
18
+ USER mnamer
19
+ ENTRYPOINT ["python", "-m", "mnamer"]
20
+ CMD ["--batch", "/mnt"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mnamer
3
- Version: 2.7.1.dev26
3
+ Version: 2.7.1.dev28
4
4
  Summary: A command-line utility for organizing media files.
5
5
  Author-email: Jessy Williams <jessy@jessywilliams.com>
6
6
  Maintainer-email: Jessy Williams <jessy@jessywilliams.com>
@@ -1,4 +1,4 @@
1
1
  # file generated by setuptools_scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __version__ = "2.7.1.dev26"
4
+ __version__ = "2.7.1.dev28"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mnamer
3
- Version: 2.7.1.dev26
3
+ Version: 2.7.1.dev28
4
4
  Summary: A command-line utility for organizing media files.
5
5
  Author-email: Jessy Williams <jessy@jessywilliams.com>
6
6
  Maintainer-email: Jessy Williams <jessy@jessywilliams.com>
@@ -1,3 +1,4 @@
1
+ .dockerignore
1
2
  .gitignore
2
3
  .python-version
3
4
  AGENTS.md
@@ -14,6 +15,7 @@ uv.lock
14
15
  .github/actions/init/action.yml
15
16
  .github/actions/lint/action.yml
16
17
  .github/actions/test/action.yml
18
+ .github/workflows/publish-docker.yml
17
19
  .github/workflows/publish.yml
18
20
  .github/workflows/pull_request.yml
19
21
  .github/workflows/push.yml
@@ -1,10 +0,0 @@
1
- FROM python:alpine
2
- ARG MNAMER_VERSION=2.5.5
3
- ARG UID=1000
4
- ARG GID=1000
5
- RUN addgroup mnamer -g $GID
6
- RUN adduser mnamer -u $UID -G mnamer --disabled-password
7
- USER mnamer
8
- RUN pip3 install --no-cache-dir --upgrade pip mnamer==${MNAMER_VERSION}
9
- ENTRYPOINT ["python", "-m", "mnamer"]
10
- CMD ["--batch", "/mnt"]
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