quasarr 2.4.6__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.6 → quasarr-2.4.7}/.github/workflows/Beta.yml +3 -2
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/workflows/Release.yml +8 -2
- {quasarr-2.4.6 → quasarr-2.4.7}/PKG-INFO +3 -3
- {quasarr-2.4.6 → quasarr-2.4.7}/README.md +2 -2
- {quasarr-2.4.6 → quasarr-2.4.7}/pyproject.toml +1 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/__init__.py +1 -1
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/__init__.py +5 -5
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/auth.py +2 -2
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/shared_state.py +1 -1
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/version.py +1 -1
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/Changelog.md +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/FUNDING.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/workflows/HostnameRedaction.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/.github/workflows/PrVersionBumpCheck.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/.gitignore +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/LICENSE +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/Quasarr.png +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/Quasarr.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/docker/Dockerfile +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/docker/dev-services-compose.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/docker/dev-setup.md +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/docker/docker-compose.yml +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/arr/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/captcha/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/config/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/packages/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/sponsors_helper/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/api/statistics/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/al.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/filecrypt.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/linkcrypters/hide.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/packages/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/al.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/by.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/dd.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/dj.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/dl.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/dt.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/dw.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/he.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/mb.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/nk.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/nx.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/sf.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/sj.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/sl.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/wd.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/downloads/sources/wx.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/cloudflare.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/hostname_issues.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/html_images.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/html_templates.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/imdb_metadata.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/jd_cache.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/log.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/myjd_api.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/notifications.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/obfuscated.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/sessions/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/sessions/al.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/sessions/dd.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/sessions/dl.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/sessions/nx.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/statistics.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/utils.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/providers/web_server.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/al.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/by.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/dd.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/dj.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/dl.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/dt.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/dw.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/fx.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/he.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/mb.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/nk.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/nx.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/sf.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/sj.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/sl.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/wd.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/search/sources/wx.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/storage/__init__.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/storage/config.py +0 -0
- {quasarr-2.4.6 → quasarr-2.4.7}/quasarr/storage/setup.py +0 -0
- {quasarr-2.4.6 → 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:
|
|
@@ -92,8 +92,9 @@ jobs:
|
|
|
92
92
|
|
|
93
93
|
- name: Build exe
|
|
94
94
|
run: |
|
|
95
|
+
uv run python -c "from PIL import Image; Image.open('Quasarr.png').save('Quasarr.ico')"
|
|
95
96
|
uv run python quasarr/providers/version.py --create-version-file
|
|
96
|
-
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"
|
|
97
98
|
|
|
98
99
|
- uses: actions/upload-artifact@v4
|
|
99
100
|
with:
|
|
@@ -99,8 +99,9 @@ jobs:
|
|
|
99
99
|
|
|
100
100
|
- name: Build exe
|
|
101
101
|
run: |
|
|
102
|
+
uv run python -c "from PIL import Image; Image.open('Quasarr.png').save('Quasarr.ico')"
|
|
102
103
|
uv run python quasarr/providers/version.py --create-version-file
|
|
103
|
-
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"
|
|
104
105
|
|
|
105
106
|
- uses: actions/upload-artifact@v4
|
|
106
107
|
with:
|
|
@@ -246,6 +247,9 @@ jobs:
|
|
|
246
247
|
|
|
247
248
|
- name: Install uv
|
|
248
249
|
uses: astral-sh/setup-uv@v5
|
|
250
|
+
with:
|
|
251
|
+
enable-cache: true
|
|
252
|
+
cache-dependency-glob: "pyproject.toml"
|
|
249
253
|
|
|
250
254
|
- name: Publish to PyPI
|
|
251
255
|
if: ${{ !inputs.skip_pypi }}
|
|
@@ -265,7 +269,9 @@ jobs:
|
|
|
265
269
|
echo -e "\n$PR_BODY" >> .github/Changelog.md
|
|
266
270
|
fi
|
|
267
271
|
- name: Append changelog
|
|
268
|
-
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
|
|
269
275
|
|
|
270
276
|
- name: Create Release
|
|
271
277
|
uses: ncipollo/release-action@v1
|
|
@@ -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) |
|
|
@@ -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
|
|
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
|
|
File without changes
|
|
File without changes
|