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.
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/Beta.yml +20 -14
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/Release.yml +31 -21
- {quasarr-2.4.5 → quasarr-2.4.7}/.gitignore +2 -2
- {quasarr-2.4.5 → quasarr-2.4.7}/PKG-INFO +3 -3
- {quasarr-2.4.5 → quasarr-2.4.7}/README.md +2 -2
- {quasarr-2.4.5 → quasarr-2.4.7}/docker/Dockerfile +4 -1
- {quasarr-2.4.5 → quasarr-2.4.7}/pyproject.toml +1 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/__init__.py +1 -1
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/__init__.py +5 -5
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/auth.py +2 -2
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/shared_state.py +3 -2
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/version.py +1 -1
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/Changelog.md +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/FUNDING.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/HostnameRedaction.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/.github/workflows/PrVersionBumpCheck.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/LICENSE +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/Quasarr.png +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/Quasarr.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/docker/dev-services-compose.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/docker/dev-setup.md +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/docker/docker-compose.yml +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/arr/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/captcha/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/config/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/packages/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/sponsors_helper/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/api/statistics/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/al.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/filecrypt.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/hide.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/packages/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/al.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/by.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dd.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dj.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dl.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dt.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/dw.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/he.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/mb.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/nk.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/nx.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/sf.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/sj.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/sl.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/wd.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/downloads/sources/wx.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/cloudflare.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/hostname_issues.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/html_images.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/html_templates.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/imdb_metadata.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/jd_cache.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/log.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/myjd_api.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/notifications.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/obfuscated.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/al.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/dd.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/dl.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/sessions/nx.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/statistics.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/utils.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/providers/web_server.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/al.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/by.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dd.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dj.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dl.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dt.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/dw.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/fx.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/he.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/mb.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/nk.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/nx.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/sf.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/sj.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/sl.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/wd.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/search/sources/wx.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/__init__.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/config.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/setup.py +0 -0
- {quasarr-2.4.5 → quasarr-2.4.7}/quasarr/storage/sqlite_database.py +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name: Beta
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
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:
|
|
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 }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quasarr
|
|
3
|
-
Version: 2.4.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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"
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
466
|
-
'Are you sure you want to regenerate the API
|
|
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
|
|
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
|
|
322
|
+
return abort(401, "Missing API Key")
|
|
323
323
|
if request.query.apikey != api_key:
|
|
324
|
-
return abort(403, "Invalid API
|
|
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
|
|
78
|
+
info(f'API Key replaced with: "{api_key}!"')
|
|
78
79
|
return api_key
|
|
79
80
|
|
|
80
81
|
|
|
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
|
|
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
|