quasarr 1.28.0__py3-none-any.whl → 1.28.2__py3-none-any.whl
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/api/arr/__init__.py +3 -3
- quasarr/api/config/__init__.py +2 -4
- quasarr/providers/utils.py +4 -5
- quasarr/providers/version.py +1 -1
- quasarr/storage/setup.py +18 -6
- {quasarr-1.28.0.dist-info → quasarr-1.28.2.dist-info}/METADATA +4 -4
- {quasarr-1.28.0.dist-info → quasarr-1.28.2.dist-info}/RECORD +11 -11
- {quasarr-1.28.0.dist-info → quasarr-1.28.2.dist-info}/WHEEL +0 -0
- {quasarr-1.28.0.dist-info → quasarr-1.28.2.dist-info}/entry_points.txt +0 -0
- {quasarr-1.28.0.dist-info → quasarr-1.28.2.dist-info}/licenses/LICENSE +0 -0
- {quasarr-1.28.0.dist-info → quasarr-1.28.2.dist-info}/top_level.txt +0 -0
quasarr/api/arr/__init__.py
CHANGED
|
@@ -327,7 +327,7 @@ def setup_arr_routes(app):
|
|
|
327
327
|
else:
|
|
328
328
|
info(
|
|
329
329
|
f'Ignoring search request from {request_from} - only imdbid searches are supported')
|
|
330
|
-
releases = [
|
|
330
|
+
releases = [] # sonarr expects this but we will not support non-imdbid searches
|
|
331
331
|
|
|
332
332
|
items = ""
|
|
333
333
|
for release in releases:
|
|
@@ -353,8 +353,8 @@ def setup_arr_routes(app):
|
|
|
353
353
|
<enclosure url="{release.get("link", "")}" length="{release.get("size", 0)}" type="application/x-nzb" />
|
|
354
354
|
</item>'''
|
|
355
355
|
|
|
356
|
-
|
|
357
|
-
if
|
|
356
|
+
requires_placeholder_item = not getattr(request.query, 'imdbid', '') and not getattr(request.query, 'q', '')
|
|
357
|
+
if requires_placeholder_item and not items:
|
|
358
358
|
items = f'''
|
|
359
359
|
<item>
|
|
360
360
|
<title>No results found</title>
|
quasarr/api/config/__init__.py
CHANGED
|
@@ -54,16 +54,14 @@ def setup_config(app, shared_state):
|
|
|
54
54
|
if parsed.scheme not in ("http", "https") or not parsed.netloc:
|
|
55
55
|
return {"success": False, "error": "Invalid URL format"}
|
|
56
56
|
|
|
57
|
-
if "/raw/eX4Mpl3" in url:
|
|
58
|
-
return {"success": False, "error": "Example URL detected. Please provide a real URL."}
|
|
59
|
-
|
|
60
57
|
# Fetch content
|
|
61
58
|
try:
|
|
62
59
|
resp = requests.get(url, timeout=15)
|
|
63
60
|
resp.raise_for_status()
|
|
64
61
|
content = resp.text
|
|
65
62
|
except requests.RequestException as e:
|
|
66
|
-
|
|
63
|
+
info(f"Failed to fetch hostnames URL: {e}")
|
|
64
|
+
return {"success": False, "error": "Failed to fetch URL. Check the console log for details."}
|
|
67
65
|
|
|
68
66
|
# Parse hostnames
|
|
69
67
|
allowed_keys = extract_allowed_keys(Config._DEFAULT_CONFIG, 'Hostnames')
|
quasarr/providers/utils.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
# Quasarr
|
|
3
3
|
# Project by https://github.com/rix1337
|
|
4
4
|
|
|
5
|
+
import os
|
|
5
6
|
import re
|
|
6
7
|
import socket
|
|
7
8
|
import sys
|
|
@@ -31,10 +32,6 @@ class Unbuffered(object):
|
|
|
31
32
|
|
|
32
33
|
def is_valid_url(url):
|
|
33
34
|
"""Validate if a URL is properly formatted."""
|
|
34
|
-
if "/raw/eX4Mpl3" in url:
|
|
35
|
-
print("Example URL detected. Please provide a valid URL found on pastebin or any other public site!")
|
|
36
|
-
return False
|
|
37
|
-
|
|
38
35
|
parsed = urlparse(url)
|
|
39
36
|
return parsed.scheme in ("http", "https") and bool(parsed.netloc)
|
|
40
37
|
|
|
@@ -62,6 +59,7 @@ def extract_kv_pairs(input_text, allowed_keys):
|
|
|
62
59
|
"""
|
|
63
60
|
kv_pattern = re.compile(rf"^({'|'.join(map(re.escape, allowed_keys))})\s*=\s*(.*)$")
|
|
64
61
|
kv_pairs = {}
|
|
62
|
+
debug = os.getenv('DEBUG')
|
|
65
63
|
|
|
66
64
|
for line in input_text.splitlines():
|
|
67
65
|
match = kv_pattern.match(line.strip())
|
|
@@ -71,7 +69,8 @@ def extract_kv_pairs(input_text, allowed_keys):
|
|
|
71
69
|
elif "[Hostnames]" in line:
|
|
72
70
|
pass
|
|
73
71
|
else:
|
|
74
|
-
|
|
72
|
+
if debug:
|
|
73
|
+
print(f"Skipping line because it does not contain any supported hostname: {line}")
|
|
75
74
|
|
|
76
75
|
return kv_pairs
|
|
77
76
|
|
quasarr/providers/version.py
CHANGED
quasarr/storage/setup.py
CHANGED
|
@@ -264,12 +264,12 @@ def hostname_form_html(shared_state, message, show_restart_button=False, show_sk
|
|
|
264
264
|
<div class="url-import-section">
|
|
265
265
|
<h3>📥 Import from URL</h3>
|
|
266
266
|
<div class="url-import-row">
|
|
267
|
-
<input type="text" id="hostnamesUrl" placeholder="https://
|
|
267
|
+
<input type="text" id="hostnamesUrl" placeholder="https://quasarr-host.name/ini?token=123..." value="{stored_url}" autocorrect="off" autocomplete="off" onfocus="onHostnameFieldFocus()">
|
|
268
268
|
<button type="button" class="btn-secondary" id="importBtn" onclick="importHostnames()">Import</button>
|
|
269
269
|
</div>
|
|
270
270
|
<div id="importStatus" class="import-status"></div>
|
|
271
271
|
<p style="font-size:0.75rem; color:var(--secondary, #6c757d); margin:0.5rem 0 0 0;">
|
|
272
|
-
Paste a URL containing hostname definitions (
|
|
272
|
+
Paste a URL containing hostname definitions (one valid Hostname per line "ab = xyz")
|
|
273
273
|
</p>
|
|
274
274
|
</div>
|
|
275
275
|
|
|
@@ -307,6 +307,20 @@ def hostname_form_html(shared_state, message, show_restart_button=False, show_sk
|
|
|
307
307
|
return false;
|
|
308
308
|
}}
|
|
309
309
|
|
|
310
|
+
function onHostnameFieldFocus() {{
|
|
311
|
+
var urlInput = document.getElementById('hostnamesUrl');
|
|
312
|
+
if (urlInput.value.trim() === '') {{
|
|
313
|
+
var hasOpenedHelper = localStorage.getItem('hideHostnameHelperRedirect');
|
|
314
|
+
if (!hasOpenedHelper) {{
|
|
315
|
+
localStorage.setItem('hideHostnameHelperRedirect', 'true');
|
|
316
|
+
window.open('https://quasarr-host.name', '_blank');
|
|
317
|
+
var statusDiv = document.getElementById('importStatus');
|
|
318
|
+
statusDiv.className = 'import-status';
|
|
319
|
+
statusDiv.textContent = 'Opened hostname helper in new tab. Paste the URL here after setup.';
|
|
320
|
+
}}
|
|
321
|
+
}}
|
|
322
|
+
}}
|
|
323
|
+
|
|
310
324
|
function importHostnames() {{
|
|
311
325
|
var urlInput = document.getElementById('hostnamesUrl');
|
|
312
326
|
var url = urlInput.value.trim();
|
|
@@ -575,16 +589,14 @@ def hostnames_config(shared_state):
|
|
|
575
589
|
if parsed.scheme not in ("http", "https") or not parsed.netloc:
|
|
576
590
|
return {"success": False, "error": "Invalid URL format"}
|
|
577
591
|
|
|
578
|
-
if "/raw/eX4Mpl3" in url:
|
|
579
|
-
return {"success": False, "error": "Example URL detected. Please provide a real URL."}
|
|
580
|
-
|
|
581
592
|
# Fetch content
|
|
582
593
|
try:
|
|
583
594
|
resp = requests.get(url, timeout=15)
|
|
584
595
|
resp.raise_for_status()
|
|
585
596
|
content = resp.text
|
|
586
597
|
except requests.RequestException as e:
|
|
587
|
-
|
|
598
|
+
info(f"Failed to fetch hostnames URL: {e}")
|
|
599
|
+
return {"success": False, "error": "Failed to fetch URL. Check the console log for details."}
|
|
588
600
|
|
|
589
601
|
# Parse hostnames
|
|
590
602
|
allowed_keys = extract_allowed_keys(Config._DEFAULT_CONFIG, 'Hostnames')
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: quasarr
|
|
3
|
-
Version: 1.28.
|
|
3
|
+
Version: 1.28.2
|
|
4
4
|
Summary: Quasarr connects JDownloader with Radarr, Sonarr and LazyLibrarian. It also decrypts links protected by CAPTCHAs.
|
|
5
5
|
Home-page: https://github.com/rix1337/Quasarr
|
|
6
6
|
Author: rix1337
|
|
@@ -73,7 +73,7 @@ http://192.168.1.1:8191/v1
|
|
|
73
73
|
|
|
74
74
|
> ⚠️ Quasarr requires at least one valid hostname to start. It does not provide or endorse any specific sources, but community-maintained lists are available:
|
|
75
75
|
|
|
76
|
-
🔗 **[quasarr-
|
|
76
|
+
🔗 **[https://quasarr-host.name](https://quasarr-host.name)** — community guide for finding hostnames
|
|
77
77
|
|
|
78
78
|
📋 Alternatively, browse community suggestions via [pastebin search](https://pastebin.com/search?q=hostnames+quasarr) (login required).
|
|
79
79
|
|
|
@@ -172,7 +172,7 @@ docker run -d \
|
|
|
172
172
|
-e 'INTERNAL_ADDRESS'='http://192.168.0.1:8080' \
|
|
173
173
|
-e 'EXTERNAL_ADDRESS'='https://foo.bar/' \
|
|
174
174
|
-e 'DISCORD'='https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN' \
|
|
175
|
-
-e 'HOSTNAMES'='https://
|
|
175
|
+
-e 'HOSTNAMES'='https://quasarr-host.name/ini?token=123...'
|
|
176
176
|
-e 'SILENT'='True' \
|
|
177
177
|
-e 'DEBUG'='' \
|
|
178
178
|
-e 'TZ'='Europe/Berlin' \
|
|
@@ -202,7 +202,7 @@ Use this only in case you can't run the docker image.
|
|
|
202
202
|
--port=8080
|
|
203
203
|
--discord=https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN
|
|
204
204
|
--external_address=https://foo.bar/
|
|
205
|
-
--hostnames=https://
|
|
205
|
+
--hostnames=https://quasarr-host.name/ini?token=123...
|
|
206
206
|
```
|
|
207
207
|
|
|
208
208
|
* `--discord` see `DISCORD`docker variable
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
quasarr/__init__.py,sha256=cEtxN2AuwKvrxpIvAR7UL997VtYQ4iN3Eo3ZnP-WjZQ,14682
|
|
2
2
|
quasarr/api/__init__.py,sha256=UOyyuOjF2WN6Um2wwQNHjFA-Rj0prb11z8SCjbifKJU,6940
|
|
3
|
-
quasarr/api/arr/__init__.py,sha256=
|
|
3
|
+
quasarr/api/arr/__init__.py,sha256=BNEugX1hUF5kn8MIgdoyE1HeyabpojjxAa6RlXSem74,17518
|
|
4
4
|
quasarr/api/captcha/__init__.py,sha256=IhJVn9iWtb01P2yfoqtOF7wSsiXizES7HNn29BX1uHk,60268
|
|
5
|
-
quasarr/api/config/__init__.py,sha256=
|
|
5
|
+
quasarr/api/config/__init__.py,sha256=m0DrbanI0lK_PaZA6ey3osj5l1_tMjjYjoFKkzrdPu0,13692
|
|
6
6
|
quasarr/api/sponsors_helper/__init__.py,sha256=kAZabPlplPYRG6Uw7ZHTk5uypualwvhs-NoTOjQhhhA,6369
|
|
7
7
|
quasarr/api/statistics/__init__.py,sha256=NrBAjjHkIUE95HhPUGIfNqh2IqBqJ_zm00S90Y-Qnus,7038
|
|
8
8
|
quasarr/downloads/__init__.py,sha256=bpNg6LNqoqpnA-U7uVDhq9jM6VYB2bkekCw1XxZRpWM,11613
|
|
@@ -39,8 +39,8 @@ quasarr/providers/notifications.py,sha256=bohT-6yudmFnmZMc3BwCGX0n1HdzSVgQG_LDZm
|
|
|
39
39
|
quasarr/providers/obfuscated.py,sha256=xPI3WrteOiZN5BgNDp0CURcYfkRrdnRCz_cT7BpzIJU,1363310
|
|
40
40
|
quasarr/providers/shared_state.py,sha256=-TIiH2lkCfovq7bzUZicpUjXEjS87ZHCcevsFgySOqw,29944
|
|
41
41
|
quasarr/providers/statistics.py,sha256=cEQixYnDMDqtm5wWe40E_2ucyo4mD0n3SrfelhQi1L8,6452
|
|
42
|
-
quasarr/providers/utils.py,sha256=
|
|
43
|
-
quasarr/providers/version.py,sha256=
|
|
42
|
+
quasarr/providers/utils.py,sha256=Q5qjo0tP5DkrgIxXcM8jpm1-uSEswjaXlQ4VnzXwPAg,5741
|
|
43
|
+
quasarr/providers/version.py,sha256=u0sZ62rFCu3V0NR5y90OowKWGT6wpsBc2f9PlRjX5Us,4004
|
|
44
44
|
quasarr/providers/web_server.py,sha256=AYd0KRxdDWMBr87BP8wlSMuL4zZo0I_rY-vHBai6Pfg,1688
|
|
45
45
|
quasarr/providers/sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
quasarr/providers/sessions/al.py,sha256=WXue9LaT4y0BzsbKtHbN6bb_72c4AZZWR9NP-vg9-cg,12462
|
|
@@ -68,11 +68,11 @@ quasarr/search/sources/wd.py,sha256=O02j3irSlVw2qES82g_qHuavAk-njjSRH1dHSCnOUas,
|
|
|
68
68
|
quasarr/search/sources/wx.py,sha256=_h1M6GhkJzixwHscrt0lMOnPSEDP1Xl24OypEe8Jy7c,12906
|
|
69
69
|
quasarr/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
70
|
quasarr/storage/config.py,sha256=SSTgIce2FVYoVTK_6OCU3msknhxuLA3EC4Kcrrf_dxQ,6378
|
|
71
|
-
quasarr/storage/setup.py,sha256
|
|
71
|
+
quasarr/storage/setup.py,sha256=0Gm6sHLmlcKvOGeli9eVuRVEP0Slz8-K5jZG0cNXaew,42041
|
|
72
72
|
quasarr/storage/sqlite_database.py,sha256=yMqFQfKf0k7YS-6Z3_7pj4z1GwWSXJ8uvF4IydXsuTE,3554
|
|
73
|
-
quasarr-1.28.
|
|
74
|
-
quasarr-1.28.
|
|
75
|
-
quasarr-1.28.
|
|
76
|
-
quasarr-1.28.
|
|
77
|
-
quasarr-1.28.
|
|
78
|
-
quasarr-1.28.
|
|
73
|
+
quasarr-1.28.2.dist-info/licenses/LICENSE,sha256=QQFCAfDgt7lSA8oSWDHIZ9aTjFbZaBJdjnGOHkuhK7k,1060
|
|
74
|
+
quasarr-1.28.2.dist-info/METADATA,sha256=2z7TlOsXi5TN9t0vJddLZnNR-myXQ92pIh6SQEUSO1w,11025
|
|
75
|
+
quasarr-1.28.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
76
|
+
quasarr-1.28.2.dist-info/entry_points.txt,sha256=gXi8mUKsIqKVvn-bOc8E5f04sK_KoMCC-ty6b2Hf-jc,40
|
|
77
|
+
quasarr-1.28.2.dist-info/top_level.txt,sha256=dipJdaRda5ruTZkoGfZU60bY4l9dtPlmOWwxK_oGSF0,8
|
|
78
|
+
quasarr-1.28.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|