quasarr 2.4.5__tar.gz → 2.4.7__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.

Potentially problematic release.


This version of quasarr might be problematic. Click here for more details.

Files changed (95) hide show
  1. {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/Beta.yml +20 -14
  2. {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/Release.yml +31 -21
  3. {quasarr-2.4.5 → quasarr-2.4.7}/.gitignore +2 -2
  4. {quasarr-2.4.5 → quasarr-2.4.7}/PKG-INFO +3 -3
  5. {quasarr-2.4.5 → quasarr-2.4.7}/README.md +2 -2
  6. {quasarr-2.4.5 → quasarr-2.4.7}/docker/Dockerfile +4 -1
  7. {quasarr-2.4.5 → quasarr-2.4.7}/pyproject.toml +1 -0
  8. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/__init__.py +1 -1
  9. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/__init__.py +5 -5
  10. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/auth.py +2 -2
  11. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/shared_state.py +3 -2
  12. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/version.py +1 -1
  13. {quasarr-2.4.5 → quasarr-2.4.7}/.github/Changelog.md +0 -0
  14. {quasarr-2.4.5 → quasarr-2.4.7}/.github/FUNDING.yml +0 -0
  15. {quasarr-2.4.5 → quasarr-2.4.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  16. {quasarr-2.4.5 → quasarr-2.4.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/HostnameRedaction.yml +0 -0
  18. {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/PrVersionBumpCheck.yml +0 -0
  19. {quasarr-2.4.5 → quasarr-2.4.7}/LICENSE +0 -0
  20. {quasarr-2.4.5 → quasarr-2.4.7}/Quasarr.png +0 -0
  21. {quasarr-2.4.5 → quasarr-2.4.7}/Quasarr.py +0 -0
  22. {quasarr-2.4.5 → quasarr-2.4.7}/docker/dev-services-compose.yml +0 -0
  23. {quasarr-2.4.5 → quasarr-2.4.7}/docker/dev-setup.md +0 -0
  24. {quasarr-2.4.5 → quasarr-2.4.7}/docker/docker-compose.yml +0 -0
  25. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/arr/__init__.py +0 -0
  26. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/captcha/__init__.py +0 -0
  27. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/config/__init__.py +0 -0
  28. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/packages/__init__.py +0 -0
  29. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/sponsors_helper/__init__.py +0 -0
  30. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/statistics/__init__.py +0 -0
  31. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/__init__.py +0 -0
  32. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/__init__.py +0 -0
  33. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/al.py +0 -0
  34. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/filecrypt.py +0 -0
  35. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/hide.py +0 -0
  36. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/packages/__init__.py +0 -0
  37. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/__init__.py +0 -0
  38. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/al.py +0 -0
  39. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/by.py +0 -0
  40. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dd.py +0 -0
  41. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dj.py +0 -0
  42. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dl.py +0 -0
  43. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dt.py +0 -0
  44. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dw.py +0 -0
  45. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/he.py +0 -0
  46. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/mb.py +0 -0
  47. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/nk.py +0 -0
  48. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/nx.py +0 -0
  49. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/sf.py +0 -0
  50. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/sj.py +0 -0
  51. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/sl.py +0 -0
  52. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/wd.py +0 -0
  53. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/wx.py +0 -0
  54. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/__init__.py +0 -0
  55. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/cloudflare.py +0 -0
  56. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/hostname_issues.py +0 -0
  57. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/html_images.py +0 -0
  58. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/html_templates.py +0 -0
  59. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/imdb_metadata.py +0 -0
  60. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/jd_cache.py +0 -0
  61. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/log.py +0 -0
  62. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/myjd_api.py +0 -0
  63. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/notifications.py +0 -0
  64. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/obfuscated.py +0 -0
  65. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/__init__.py +0 -0
  66. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/al.py +0 -0
  67. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/dd.py +0 -0
  68. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/dl.py +0 -0
  69. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/nx.py +0 -0
  70. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/statistics.py +0 -0
  71. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/utils.py +0 -0
  72. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/web_server.py +0 -0
  73. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/__init__.py +0 -0
  74. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/__init__.py +0 -0
  75. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/al.py +0 -0
  76. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/by.py +0 -0
  77. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dd.py +0 -0
  78. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dj.py +0 -0
  79. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dl.py +0 -0
  80. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dt.py +0 -0
  81. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dw.py +0 -0
  82. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/fx.py +0 -0
  83. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/he.py +0 -0
  84. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/mb.py +0 -0
  85. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/nk.py +0 -0
  86. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/nx.py +0 -0
  87. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/sf.py +0 -0
  88. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/sj.py +0 -0
  89. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/sl.py +0 -0
  90. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/wd.py +0 -0
  91. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/wx.py +0 -0
  92. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/__init__.py +0 -0
  93. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/config.py +0 -0
  94. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/setup.py +0 -0
  95. {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/sqlite_database.py +0 -0
@@ -1,4 +1,4 @@
1
- name: Beta Docker Build
1
+ name: Beta
2
2
 
3
3
  on:
4
4
  workflow_dispatch:
@@ -24,7 +24,6 @@ jobs:
24
24
  - name: Install uv
25
25
  uses: astral-sh/setup-uv@v5
26
26
  with:
27
- # Fixed: Added glob to silence warning since you might not have uv.lock
28
27
  enable-cache: true
29
28
  cache-dependency-glob: "pyproject.toml"
30
29
  - name: Get Version
@@ -35,6 +34,10 @@ jobs:
35
34
  build-wheel:
36
35
  name: Build Wheel
37
36
  runs-on: ubuntu-latest
37
+ permissions:
38
+ contents: read
39
+ id-token: write
40
+ attestations: write
38
41
  steps:
39
42
  - uses: actions/checkout@v6
40
43
  - uses: actions/setup-python@v5
@@ -47,6 +50,12 @@ jobs:
47
50
  cache-dependency-glob: "pyproject.toml"
48
51
  - name: Build wheel
49
52
  run: uv build
53
+
54
+ - name: Generate artifact attestation
55
+ uses: actions/attest-build-provenance@v2
56
+ with:
57
+ subject-path: "dist/*.whl"
58
+
50
59
  - uses: actions/upload-artifact@v4
51
60
  with:
52
61
  name: wheel
@@ -66,26 +75,27 @@ jobs:
66
75
  - uses: actions/setup-python@v5
67
76
  with:
68
77
  python-version: '3.12'
78
+
69
79
  - name: Install uv
70
80
  uses: astral-sh/setup-uv@v5
71
81
  with:
72
82
  enable-cache: true
73
83
  cache-dependency-glob: "pyproject.toml"
74
- - uses: actions/cache@v4
75
- with:
76
- path: ~\AppData\Local\pyinstaller
77
- key: ${{ runner.os }}-pyinstaller-${{ hashFiles('pyproject.toml') }}
78
- restore-keys: ${{ runner.os }}-pyinstaller-
84
+
79
85
  - name: Disable Windows Defender
80
86
  shell: powershell
81
87
  run: Set-MpPreference -DisableRealtimeMonitoring $true
88
+
82
89
  - name: Install dependencies
83
90
  run: |
84
91
  uv sync --group build
92
+
85
93
  - name: Build exe
86
94
  run: |
95
+ uv run python -c "from PIL import Image; Image.open('Quasarr.png').save('Quasarr.ico')"
87
96
  uv run python quasarr/providers/version.py --create-version-file
88
- uv run pyinstaller --clean --onefile -y --version-file "file_version_info.txt" "Quasarr.py" -n "quasarr-${{ needs.version.outputs.version }}-standalone-win64"
97
+ uv run pyinstaller --clean --onefile -y --version-file "file_version_info.txt" --icon "Quasarr.ico" "Quasarr.py" -n "quasarr-${{ needs.version.outputs.version }}-standalone-win64"
98
+
89
99
  - uses: actions/upload-artifact@v4
90
100
  with:
91
101
  name: exe-amd64
@@ -162,7 +172,6 @@ jobs:
162
172
  runs-on: ubuntu-latest
163
173
  needs: [ version, build-docker-amd64, build-docker-arm64 ]
164
174
  steps:
165
- # Fixed: Added setup-buildx-action to ensure 'imagetools' supports annotations correctly
166
175
  - uses: docker/setup-buildx-action@v3
167
176
  - uses: docker/login-action@v3
168
177
  with:
@@ -171,20 +180,17 @@ jobs:
171
180
  password: ${{ secrets.GITHUB_TOKEN }}
172
181
  - name: Create and Push Manifests
173
182
  run: |
174
- # 1. Define source tags
175
183
  TAG_AMD64="${{ needs.version.outputs.version }}-beta-amd64"
176
184
  TAG_ARM64="${{ needs.version.outputs.version }}-beta-arm64"
177
-
178
- # Fixed: Use shell variable directly and 'index:' prefix to strictly target the manifest list
179
185
  ANNOTATION="index:org.opencontainers.image.description=$DESCRIPTION"
180
186
 
181
- # 2. Create manifest for GHCR :beta
187
+ # Manifest for :beta
182
188
  docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:beta \
183
189
  --annotation "$ANNOTATION" \
184
190
  ${{ env.GHCR_ENDPOINT }}:beta-amd64 \
185
191
  ${{ env.GHCR_ENDPOINT }}:beta-arm64
186
192
 
187
- # 3. Create manifest for GHCR :version-beta
193
+ # Manifest for :version-beta
188
194
  docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:${{ needs.version.outputs.version }}-beta \
189
195
  --annotation "$ANNOTATION" \
190
196
  ${{ env.GHCR_ENDPOINT }}:${TAG_AMD64} \
@@ -33,7 +33,6 @@ jobs:
33
33
  - name: Install uv
34
34
  uses: astral-sh/setup-uv@v5
35
35
  with:
36
- # Fixed: Added glob to silence warning
37
36
  enable-cache: true
38
37
  cache-dependency-glob: "pyproject.toml"
39
38
  - name: Get Version
@@ -44,6 +43,10 @@ jobs:
44
43
  build-wheel:
45
44
  name: Build Wheel
46
45
  runs-on: ubuntu-latest
46
+ permissions:
47
+ contents: read
48
+ id-token: write
49
+ attestations: write
47
50
  steps:
48
51
  - uses: actions/checkout@v6
49
52
  - uses: actions/setup-python@v5
@@ -56,6 +59,10 @@ jobs:
56
59
  cache-dependency-glob: "pyproject.toml"
57
60
  - name: Build wheel
58
61
  run: uv build
62
+ - name: Generate artifact attestation
63
+ uses: actions/attest-build-provenance@v2
64
+ with:
65
+ subject-path: "dist/*.whl"
59
66
  - uses: actions/upload-artifact@v4
60
67
  with:
61
68
  name: wheel
@@ -75,26 +82,27 @@ jobs:
75
82
  - uses: actions/setup-python@v5
76
83
  with:
77
84
  python-version: '3.12'
85
+
78
86
  - name: Install uv
79
87
  uses: astral-sh/setup-uv@v5
80
88
  with:
81
89
  enable-cache: true
82
90
  cache-dependency-glob: "pyproject.toml"
83
- - uses: actions/cache@v4
84
- with:
85
- path: ~\AppData\Local\pyinstaller
86
- key: ${{ runner.os }}-pyinstaller-${{ hashFiles('pyproject.toml') }}
87
- restore-keys: ${{ runner.os }}-pyinstaller-
91
+
88
92
  - name: Disable Windows Defender
89
93
  shell: powershell
90
94
  run: Set-MpPreference -DisableRealtimeMonitoring $true
95
+
91
96
  - name: Install dependencies
92
97
  run: |
93
98
  uv sync --group build
99
+
94
100
  - name: Build exe
95
101
  run: |
102
+ uv run python -c "from PIL import Image; Image.open('Quasarr.png').save('Quasarr.ico')"
96
103
  uv run python quasarr/providers/version.py --create-version-file
97
- uv run pyinstaller --clean --onefile -y --version-file "file_version_info.txt" "Quasarr.py" -n "quasarr-${{ needs.version.outputs.version }}-standalone-win64"
104
+ uv run pyinstaller --clean --onefile -y --version-file "file_version_info.txt" --icon "Quasarr.ico" "Quasarr.py" -n "quasarr-${{ needs.version.outputs.version }}-standalone-win64"
105
+
98
106
  - uses: actions/upload-artifact@v4
99
107
  with:
100
108
  name: exe-amd64
@@ -183,7 +191,6 @@ jobs:
183
191
  runs-on: ubuntu-latest
184
192
  needs: [ version, build-docker-amd64, build-docker-arm64 ]
185
193
  steps:
186
- # Fixed: Added setup-buildx-action
187
194
  - uses: docker/setup-buildx-action@v3
188
195
  - uses: docker/login-action@v3
189
196
  with:
@@ -196,29 +203,23 @@ jobs:
196
203
  password: ${{ secrets.GITHUB_TOKEN }}
197
204
  - name: Create and Push Manifests
198
205
  run: |
199
- # 1. Define source tags
200
206
  TAG_AMD64="${{ needs.version.outputs.version }}-amd64"
201
207
  TAG_ARM64="${{ needs.version.outputs.version }}-arm64"
202
- # Fixed: Added index: prefix and using shell variable
203
208
  ANNOTATION="index:org.opencontainers.image.description=$DESCRIPTION"
204
209
 
205
- # 2. Create manifest for DockerHub :latest
206
210
  docker buildx imagetools create -t ${{ env.ENDPOINT }}:latest \
207
211
  ${{ env.ENDPOINT }}:latest-amd64 \
208
212
  ${{ env.ENDPOINT }}:latest-arm64
209
213
 
210
- # 3. Create manifest for DockerHub :version
211
214
  docker buildx imagetools create -t ${{ env.ENDPOINT }}:${{ needs.version.outputs.version }} \
212
215
  ${{ env.ENDPOINT }}:${TAG_AMD64} \
213
216
  ${{ env.ENDPOINT }}:${TAG_ARM64}
214
217
 
215
- # 4. Create manifest for GHCR :latest
216
218
  docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:latest \
217
219
  --annotation "$ANNOTATION" \
218
220
  ${{ env.GHCR_ENDPOINT }}:latest-amd64 \
219
221
  ${{ env.GHCR_ENDPOINT }}:latest-arm64
220
222
 
221
- # 5. Create manifest for GHCR :version
222
223
  docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:${{ needs.version.outputs.version }} \
223
224
  --annotation "$ANNOTATION" \
224
225
  ${{ env.GHCR_ENDPOINT }}:${TAG_AMD64} \
@@ -234,6 +235,7 @@ jobs:
234
235
  - uses: actions/checkout@v6
235
236
  with:
236
237
  fetch-depth: 0
238
+
237
239
  - uses: actions/download-artifact@v4
238
240
  with:
239
241
  name: wheel
@@ -242,6 +244,17 @@ jobs:
242
244
  with:
243
245
  name: exe-amd64
244
246
  path: ./exe-amd64
247
+
248
+ - name: Install uv
249
+ uses: astral-sh/setup-uv@v5
250
+ with:
251
+ enable-cache: true
252
+ cache-dependency-glob: "pyproject.toml"
253
+
254
+ - name: Publish to PyPI
255
+ if: ${{ !inputs.skip_pypi }}
256
+ run: uv publish ./wheel/* --token ${{ secrets.PYPI_TOKEN }}
257
+
245
258
  - name: Generate changelog
246
259
  id: changelog
247
260
  uses: metcalfc/changelog-generator@v4.6.2
@@ -256,7 +269,10 @@ jobs:
256
269
  echo -e "\n$PR_BODY" >> .github/Changelog.md
257
270
  fi
258
271
  - name: Append changelog
259
- run: echo -e "\n${{ steps.changelog.outputs.changelog }}" >> .github/Changelog.md
272
+ run: |
273
+ echo -e "\n${{ steps.changelog.outputs.changelog }}" >> .github/Changelog.md
274
+ echo -e "\n[Attestation](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/attestations)" >> .github/Changelog.md
275
+
260
276
  - name: Create Release
261
277
  uses: ncipollo/release-action@v1
262
278
  with:
@@ -264,9 +280,3 @@ jobs:
264
280
  artifactErrorsFailBuild: true
265
281
  bodyFile: ".github/Changelog.md"
266
282
  tag: v.${{ needs.version.outputs.version }}
267
- - name: Install uv
268
- uses: astral-sh/setup-uv@v5
269
- - name: Upload to PyPI
270
- if: ${{ !inputs.skip_pypi }}
271
- run: |
272
- uv run --with twine --with packaging python -m twine upload ./wheel/* -u __token__ -p ${{ secrets.PYPI_TOKEN }}
@@ -4,8 +4,8 @@
4
4
  *.pyc
5
5
  *.bak
6
6
 
7
- # Build Tools
8
- venv
7
+ # Virtual Environment by uv
8
+ uv.lock
9
9
  .venv
10
10
 
11
11
  # PyCharm
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quasarr
3
- Version: 2.4.5
3
+ Version: 2.4.7
4
4
  Summary: Quasarr connects JDownloader with Radarr, Sonarr and LazyLibrarian. It also decrypts links protected by CAPTCHAs.
5
5
  Author-email: rix1337 <rix1337@users.noreply.github.com>
6
6
  License-File: LICENSE
@@ -281,7 +281,7 @@ Image access is limited to [active monthly GitHub sponsors](https://github.com/u
281
281
  3. Copy the **API Key** value
282
282
  4. Use this value for the `QUASARR_API_KEY` environment variable
283
283
 
284
- > **Note:** The API key is required for SponsorsHelper to communicate securely with Quasarr. Without it, all requests
284
+ > **Note:** The API Key is required for SponsorsHelper to communicate securely with Quasarr. Without it, all requests
285
285
  > will be rejected with a 401/403 error.
286
286
 
287
287
  ---
@@ -320,7 +320,7 @@ docker run -d \
320
320
  | Parameter | Description |
321
321
  |---------------------------------|---------------------------------------------------------------------------------------|
322
322
  | `QUASARR_URL` | Local URL of Quasarr (e.g., `http://192.168.0.1:8080`) |
323
- | `QUASARR_API_KEY` | Your Quasarr API key (found in Quasarr web UI under "API Settings") |
323
+ | `QUASARR_API_KEY` | Your Quasarr API Key (found in Quasarr web UI under "API Settings") |
324
324
  | `DEATHBYCAPTCHA_TOKEN` | [DeathByCaptcha](https://deathbycaptcha.com/register?refid=6184288242b) account token |
325
325
  | `GITHUB_TOKEN` | Classic GitHub PAT with the scopes listed above |
326
326
  | `FLARESOLVERR_URL` | Local URL of [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) |
@@ -263,7 +263,7 @@ Image access is limited to [active monthly GitHub sponsors](https://github.com/u
263
263
  3. Copy the **API Key** value
264
264
  4. Use this value for the `QUASARR_API_KEY` environment variable
265
265
 
266
- > **Note:** The API key is required for SponsorsHelper to communicate securely with Quasarr. Without it, all requests
266
+ > **Note:** The API Key is required for SponsorsHelper to communicate securely with Quasarr. Without it, all requests
267
267
  > will be rejected with a 401/403 error.
268
268
 
269
269
  ---
@@ -302,7 +302,7 @@ docker run -d \
302
302
  | Parameter | Description |
303
303
  |---------------------------------|---------------------------------------------------------------------------------------|
304
304
  | `QUASARR_URL` | Local URL of Quasarr (e.g., `http://192.168.0.1:8080`) |
305
- | `QUASARR_API_KEY` | Your Quasarr API key (found in Quasarr web UI under "API Settings") |
305
+ | `QUASARR_API_KEY` | Your Quasarr API Key (found in Quasarr web UI under "API Settings") |
306
306
  | `DEATHBYCAPTCHA_TOKEN` | [DeathByCaptcha](https://deathbycaptcha.com/register?refid=6184288242b) account token |
307
307
  | `GITHUB_TOKEN` | Classic GitHub PAT with the scopes listed above |
308
308
  | `FLARESOLVERR_URL` | Local URL of [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) |
@@ -12,7 +12,10 @@ COPY --from=uv /uv /usr/local/bin/uv
12
12
 
13
13
  # install local package
14
14
  COPY dist/*.whl /tmp/
15
- RUN uv tool install /tmp/*.whl --force && rm /tmp/*.whl
15
+
16
+ # Updated: Added cache mount for uv to speed up installation
17
+ RUN --mount=type=cache,target=/root/.cache/uv \
18
+ uv tool install /tmp/*.whl --force && rm /tmp/*.whl
16
19
 
17
20
  # Ensure the binary is in the PATH
18
21
  ENV PATH="/root/.local/bin:$PATH"
@@ -37,4 +37,5 @@ packages = ["quasarr"]
37
37
  [dependency-groups]
38
38
  build = [
39
39
  "pyinstaller>=6.0.0",
40
+ "pillow>=12.0.0",
40
41
  ]
@@ -212,7 +212,7 @@ def run():
212
212
 
213
213
  print('Setup instructions: "https://github.com/rix1337/Quasarr?tab=readme-ov-file#instructions"')
214
214
  print(f'URL: "{shared_state.values['internal_address']}"')
215
- print(f'API key: "{api_key}" (without quotes)')
215
+ print(f'API Key: "{api_key}" (without quotes)')
216
216
 
217
217
  if external_address != internal_address:
218
218
  print(f'External URL: "{shared_state.values["external_address"]}"')
@@ -175,7 +175,7 @@ def get_api(shared_state_dict, shared_state_lock):
175
175
  </div>
176
176
 
177
177
  <p style="margin-top: 15px;">
178
- {render_button("Regenerate API key", "secondary", {"onclick": "confirmRegenerateApiKey()"})}
178
+ {render_button("Regenerate API Key", "secondary", {"onclick": "confirmRegenerateApiKey()"})}
179
179
  </p>
180
180
  </div>
181
181
  </details>
@@ -440,7 +440,7 @@ def get_api(shared_state_dict, shared_state_lock):
440
440
  if (copyKeyBtn) {{
441
441
  copyKeyBtn.onclick = function() {{
442
442
  copyToClipboard(apiInput.value, copyKeyBtn, function() {{
443
- // Re-hide the API key after copying
443
+ // Re-hide the API Key after copying
444
444
  apiInput.type = 'password';
445
445
  toggleBtn.innerText = 'Show';
446
446
  }});
@@ -462,8 +462,8 @@ def get_api(shared_state_dict, shared_state_lock):
462
462
 
463
463
  function confirmRegenerateApiKey() {{
464
464
  showModal(
465
- 'Regenerate API key?',
466
- 'Are you sure you want to regenerate the API key? This will invalidate the current key.',
465
+ 'Regenerate API Key?',
466
+ 'Are you sure you want to regenerate the API Key? This will invalidate the current key.',
467
467
  `<button class="btn-secondary" onclick="closeModal()">Cancel</button>
468
468
  <button class="btn-primary" onclick="location.href='/regenerate-api-key'">Regenerate</button>`
469
469
  );
@@ -477,6 +477,6 @@ def get_api(shared_state_dict, shared_state_lock):
477
477
  @app.get('/regenerate-api-key')
478
478
  def regenerate_api_key():
479
479
  shared_state.generate_api_key()
480
- return render_success(f'API key replaced!', 5)
480
+ return render_success(f'API Key replaced!', 5)
481
481
 
482
482
  Server(app, listen='0.0.0.0', port=shared_state.values["port"]).serve_forever()
@@ -319,9 +319,9 @@ def require_api_key(func):
319
319
  def decorated(*args, **kwargs):
320
320
  api_key = Config('API').get('key')
321
321
  if not request.query.apikey:
322
- return abort(401, "Missing API key")
322
+ return abort(401, "Missing API Key")
323
323
  if request.query.apikey != api_key:
324
- return abort(403, "Invalid API key")
324
+ return abort(403, "Invalid API Key")
325
325
  return func(*args, **kwargs)
326
326
 
327
327
  return decorated
@@ -7,10 +7,11 @@ import os
7
7
  import re
8
8
  import time
9
9
  import traceback
10
- import unicodedata
11
10
  from datetime import datetime, timedelta, date
12
11
  from urllib import parse
13
12
 
13
+ import unicodedata
14
+
14
15
  import quasarr
15
16
  from quasarr.providers.log import info, debug
16
17
  from quasarr.providers.myjd_api import Myjdapi, TokenExpiredException, RequestTimeoutException, MYJDException, Jddevice
@@ -74,7 +75,7 @@ def set_files(config_path):
74
75
  def generate_api_key():
75
76
  api_key = os.urandom(32).hex()
76
77
  Config('API').save("key", api_key)
77
- info(f'API key replaced with: "{api_key}!"')
78
+ info(f'API Key replaced with: "{api_key}!"')
78
79
  return api_key
79
80
 
80
81
 
@@ -5,7 +5,7 @@
5
5
  import re
6
6
  import sys
7
7
 
8
- __version__ = "2.4.5"
8
+ __version__ = "2.4.7"
9
9
 
10
10
 
11
11
  def get_version():
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes