quasarr 1.21.1__py3-none-any.whl → 1.22.0__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.

@@ -353,6 +353,17 @@ 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
+ if not items:
357
+ items = f'''
358
+ <item>
359
+ <title>No results found</title>
360
+ <guid isPermaLink="False">0</guid>
361
+ <link>https://github.com/rix1337/Quasarr</link>
362
+ <comments>No results matched your search criteria.</comments>
363
+ <pubDate>{datetime.now().strftime("%a, %d %b %Y %H:%M:%S +0000")}</pubDate>
364
+ <enclosure url="https://github.com/rix1337/Quasarr" length="0" type="application/x-nzb" />
365
+ </item>'''
366
+
356
367
  return f'''<?xml version="1.0" encoding="UTF-8"?>
357
368
  <rss>
358
369
  <channel>
@@ -16,7 +16,8 @@ from quasarr.downloads.packages import delete_package
16
16
  from quasarr.providers import shared_state
17
17
  from quasarr.providers.html_templates import render_button, render_centered_html
18
18
  from quasarr.providers.log import info, debug
19
- from quasarr.providers.obfuscated import captcha_js, captcha_values, filecrypt_user_js, junkies_user_js
19
+ from quasarr.providers.obfuscated import captcha_js, captcha_values, filecrypt_user_js, junkies_user_js, \
20
+ keeplinks_user_js
20
21
  from quasarr.providers.statistics import StatsHelper
21
22
 
22
23
 
@@ -87,9 +88,18 @@ def setup_captcha_routes(app):
87
88
  for link in prioritized_links
88
89
  )
89
90
 
91
+ # KeepLinks uses nested arrays like FileCrypt: [["url", "mirror"]]
92
+ has_keeplinks_links = any(
93
+ ("keeplinks." in link[0] if isinstance(link, (list, tuple)) else "keeplinks." in link)
94
+ for link in prioritized_links
95
+ )
96
+
90
97
  if has_junkies_links:
91
98
  debug("Redirecting to Junkies CAPTCHA")
92
99
  redirect(f"/captcha/junkies?data={quote(encoded_payload)}")
100
+ elif has_keeplinks_links:
101
+ debug("Redirecting to KeepLinks CAPTCHA")
102
+ redirect(f"/captcha/keeplinks?data={quote(encoded_payload)}")
93
103
  elif filecrypt_session:
94
104
  debug(f'Redirecting to circle CAPTCHA')
95
105
  redirect(f"/captcha/circle?data={quote(encoded_payload)}")
@@ -111,45 +121,24 @@ def setup_captcha_routes(app):
111
121
  except Exception as e:
112
122
  return {"error": f"Failed to decode payload: {str(e)}"}
113
123
 
114
- @app.get("/captcha/junkies")
115
- def serve_junkies_captcha():
116
- payload = decode_payload()
124
+ def render_userscript_section(url, package_id, title, password, provider_type="junkies"):
125
+ """Render the userscript UI section for Junkies or KeepLinks pages
117
126
 
118
- if "error" in payload:
119
- return render_centered_html(f'''<h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
120
- <p>{payload["error"]}</p>
121
- <p>
122
- {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
123
- </p>''')
127
+ This is the MAIN solution for these providers (not a bypass/fallback).
124
128
 
125
- package_id = payload.get("package_id")
126
- title = payload.get("title")
127
- password = payload.get("password")
128
- urls = payload.get("links")
129
- url = urls[0]
130
-
131
- return render_centered_html(f"""
132
- <!DOCTYPE html>
133
- <html>
134
- <body>
135
- <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
136
- <p><b>Package:</b> {title}</p>
137
- {render_junkies_section(url, package_id, title, password)}
138
- <p>
139
- {render_button("Delete Package", "secondary", {"onclick": f"location.href='/captcha/delete/{package_id}'"})}
140
- </p>
141
- <p>
142
- {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
143
- </p>
144
-
145
- </body>
146
- </html>""")
129
+ Args:
130
+ url: The URL to open with transfer params
131
+ package_id: Package identifier
132
+ title: Package title
133
+ password: Package password
134
+ provider_type: Either "junkies" or "keeplinks"
135
+ """
147
136
 
148
- def render_junkies_section(url, package_id, title, password):
149
- """Render the UI section for SJ and DJ pages"""
137
+ provider_name = "Junkies" if provider_type == "junkies" else "KeepLinks"
138
+ userscript_url = f"/captcha/{provider_type}.user.js"
139
+ storage_key = f"hide{provider_name}SetupInstructions"
150
140
 
151
141
  # Generate userscript URL with transfer params
152
- # Get base URL of current request
153
142
  base_url = request.urlparts.scheme + '://' + request.urlparts.netloc
154
143
  transfer_url = f"{base_url}/captcha/quick-transfer"
155
144
 
@@ -170,7 +159,7 @@ def setup_captcha_routes(app):
170
159
  <a href="https://www.tampermonkey.net/" target="_blank" rel="noopener noreferrer">1. Install Tampermonkey</a>
171
160
  </p>
172
161
  <p style="margin-top: 0; margin-bottom: 12px;">
173
- <a href="/captcha/junkies.user.js" target="_blank">2. Install this userscript</a>
162
+ <a href="{userscript_url}" target="_blank">2. Install this userscript</a>
174
163
  </p>
175
164
  <p style="margin-top: 0;">
176
165
  <button id="hide-setup-btn" type="button" style="background: #444; color: #fff; border: 1px solid #666; padding: 6px 12px; border-radius: 4px; cursor: pointer;">
@@ -203,7 +192,7 @@ def setup_captcha_routes(app):
203
192
  </div>
204
193
  <script>
205
194
  // Handle setup instructions hide/show
206
- const hideSetup = localStorage.getItem('hideJunkiesSetupInstructions');
195
+ const hideSetup = localStorage.getItem('{storage_key}');
207
196
  const setupBox = document.getElementById('setup-instructions');
208
197
  const showLink = document.getElementById('show-instructions-link');
209
198
 
@@ -214,7 +203,7 @@ def setup_captcha_routes(app):
214
203
 
215
204
  // Hide setup instructions
216
205
  document.getElementById('hide-setup-btn').addEventListener('click', function() {{
217
- localStorage.setItem('hideJunkiesSetupInstructions', 'true');
206
+ localStorage.setItem('{storage_key}', 'true');
218
207
  setupBox.style.display = 'none';
219
208
  showLink.style.display = 'block';
220
209
  }});
@@ -222,13 +211,82 @@ def setup_captcha_routes(app):
222
211
  // Show setup instructions again
223
212
  document.getElementById('show-setup-btn').addEventListener('click', function(e) {{
224
213
  e.preventDefault();
225
- localStorage.setItem('hideJunkiesSetupInstructions', 'false');
214
+ localStorage.setItem('{storage_key}', 'false');
226
215
  setupBox.style.display = 'block';
227
216
  showLink.style.display = 'none';
228
217
  }});
229
218
  </script>
230
219
  '''
231
220
 
221
+ @app.get("/captcha/junkies")
222
+ def serve_junkies_captcha():
223
+ payload = decode_payload()
224
+
225
+ if "error" in payload:
226
+ return render_centered_html(f'''<h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
227
+ <p>{payload["error"]}</p>
228
+ <p>
229
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
230
+ </p>''')
231
+
232
+ package_id = payload.get("package_id")
233
+ title = payload.get("title")
234
+ password = payload.get("password")
235
+ urls = payload.get("links")
236
+ url = urls[0]
237
+
238
+ return render_centered_html(f"""
239
+ <!DOCTYPE html>
240
+ <html>
241
+ <body>
242
+ <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
243
+ <p><b>Package:</b> {title}</p>
244
+ {render_userscript_section(url, package_id, title, password, "junkies")}
245
+ <p>
246
+ {render_button("Delete Package", "secondary", {"onclick": f"location.href='/captcha/delete/{package_id}'"})}
247
+ </p>
248
+ <p>
249
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
250
+ </p>
251
+
252
+ </body>
253
+ </html>""")
254
+
255
+ @app.get("/captcha/keeplinks")
256
+ def serve_keeplinks_captcha():
257
+ payload = decode_payload()
258
+
259
+ if "error" in payload:
260
+ return render_centered_html(f'''<h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
261
+ <p>{payload["error"]}</p>
262
+ <p>
263
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
264
+ </p>''')
265
+
266
+ package_id = payload.get("package_id")
267
+ title = payload.get("title")
268
+ password = payload.get("password")
269
+ urls = payload.get("links")
270
+ # KeepLinks uses nested arrays like FileCrypt: [["url", "mirror"]]
271
+ url = urls[0][0] if isinstance(urls[0], (list, tuple)) else urls[0]
272
+
273
+ return render_centered_html(f"""
274
+ <!DOCTYPE html>
275
+ <html>
276
+ <body>
277
+ <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
278
+ <p><b>Package:</b> {title}</p>
279
+ {render_userscript_section(url, package_id, title, password, "keeplinks")}
280
+ <p>
281
+ {render_button("Delete Package", "secondary", {"onclick": f"location.href='/captcha/delete/{package_id}'"})}
282
+ </p>
283
+ <p>
284
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
285
+ </p>
286
+
287
+ </body>
288
+ </html>""")
289
+
232
290
  @app.get('/captcha/junkies.user.js')
233
291
  def serve_junkies_user_js():
234
292
  sj = shared_state.values["config"]("Hostnames").get("sj")
@@ -238,6 +296,12 @@ def setup_captcha_routes(app):
238
296
  response.content_type = 'application/javascript'
239
297
  return content
240
298
 
299
+ @app.get('/captcha/keeplinks.user.js')
300
+ def serve_keeplinks_user_js():
301
+ content = keeplinks_user_js()
302
+ response.content_type = 'application/javascript'
303
+ return content
304
+
241
305
  @app.get('/captcha/filecrypt.user.js')
242
306
  def serve_filecrypt_user_js():
243
307
  content = filecrypt_user_js()
@@ -118,6 +118,8 @@ def extract_links_and_password_from_post(post_content, host):
118
118
  crypter_type = "filecrypt"
119
119
  elif re.search(r'hide\.', href, re.IGNORECASE):
120
120
  crypter_type = "hide"
121
+ elif re.search(r'keeplinks\.', href, re.IGNORECASE):
122
+ crypter_type = "keeplinks"
121
123
  else:
122
124
  debug(f"Unsupported link crypter/hoster found: {href}")
123
125
  debug(f"Currently only filecrypt and hide are supported. Other crypters may be added later.")
@@ -49,3 +49,18 @@ def filecrypt_user_js():
49
49
 
50
50
  function _0x5e74(_0x5130a2,_0x4a32ed){_0x5130a2=_0x5130a2-0x96;const _0x3d2762=_0x3d27();let _0x5e74b=_0x3d2762[_0x5130a2];return _0x5e74b;}function _0x3d27(){const _0x2e0fa5=['value','search','marginTop','button.dlcdownload','🛡️\x20[FC-Blocker]\x20Initializing\x20script\x20blocker','✅\x20[FC-Helper]\x20Built\x20DLC\x20link:','replace','toLowerCase','type','length','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<title>','📋\x20Copy\x20All','[FC-Blocker]\x20🛑\x20createElement(\x22script\x22)\x20blocked,\x20returning\x20dummy','\x20link(s)\x20directly\x20to\x20your\x20Quasarr\x20instance</p>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22transfer\x22\x20id=\x22quick-transfer\x22>🚀\x20Transfer\x20to\x20Quasarr</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','style','/DLC/','✅\x20[FC-Helper]\x20Found\x20DLC\x20secret\x20in\x20data-jcyi:','filter','forEach','_blank','addEventListener','episode','then','onclick','❌\x20[FC-Helper]\x20Could\x20not\x20extract\x20DLC\x20link:','enc','</h1>','25752qcmEAf','🔓\x20[FC-Helper]\x20Encrypted\x20data\x20found,\x20loading\x20libraries...','CBC','click','https://','open','[FC-Blocker]\x20🚫\x20Blocked\x20dynamic\x20script:','quick-transfer','readOnly','AES','.dlc','100%','rows','pkg_id','✅\x20Copied!','ℹ️\x20[FC-Helper]\x20No\x20password\x20provided\x20in\x20params,\x20skipping\x20auto-fill','data-','split','2559eXMpgP','❌\x20[FC-Helper]\x20CryptoJS\x20not\x20available','join','textarea','trim','_fcsecret','log','documentElement','3172CcusSo','965nOPXPW','prototype','getAttribute','pkg_pass','loading','text','createElement','decrypt','src','FileCrypt\x20Package','link-entry','onload','getElementById','warn','</title>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<style>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20body\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20sans-serif;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x202em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#f9f9f9;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#333;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20h1\x20{\x20font-size:\x201.5em;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20input\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2080%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-right:\x200.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.5em\x201em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#007bff;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20white;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x205px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#0056b3;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.transfer\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#6f42c1;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x201.1em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.7em\x201.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x201em\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.transfer:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#5a32a3;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20div.link-entry\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-bottom:\x201em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#transfer-section\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x202em\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x201.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#e7f3ff;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x202px\x20solid\x20#6f42c1;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</style>\x0a\x20\x20\x20\x20\x20\x20\x20\x20','\x22\x20set\x20and\x20submitted','head','observe','appendChild','58347wpzrbr','transfer-section','?pkg_id=','clipboard','[inline]','transfer_url','data-jcyi','div','❌\x20[FC-Helper]\x20No\x20encrypted\x20data\x20or\x20DLC\x20link\x20found','body','https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js','1838000NBHktQ','https://v2.cutcaptcha.net','281392ZysajP','input','1em','error','get','✅\x20[FC-Helper]\x20Found\x20DLC\x20secret\x20in\x20','attributes','innerHTML','5734701LtLdrq','&links=','✅\x20[FC-Blocker]\x20Script\x20blocker\x20initialized','📦\x20[FC-Helper]\x20Looking\x20for\x20DLC\x20button...','11208258OWbhyG','parse','readyState','some','📃\x20[FC-Helper]\x20Showing\x20','season','Hex','https://cdnjs.cloudflare.com','title','matchAll','name','parentNode','❌\x20[FC-Helper]\x20Pako\x20failed\x20to\x20load:','script','DOMContentLoaded','startsWith','🔑\x20[FC-Helper]\x20Checking\x20for\x20password\x20input...','✅\x20[FC-Helper]\x20Pako\x20loaded','📋\x20Copy','tagName','✅\x20[FC-Helper]\x20Password\x20\x22','map','addedNodes','width','📥\x20Download\x20DLC','button','encode','pad','className','querySelector','location','Utf8','textContent','getElementsByTagName','test','call','\x20final\x20link(s)','remove'];_0x3d27=function(){return _0x2e0fa5;};return _0x3d27();}(function(_0x3cfdc9,_0x56941a){const _0x3509b4=_0x5e74,_0x5efe9b=_0x3cfdc9();while(!![]){try{const _0x2fe0a7=parseInt(_0x3509b4(0xc4))/0x1+-parseInt(_0x3509b4(0xd1))/0x2+-parseInt(_0x3509b4(0xa8))/0x3*(-parseInt(_0x3509b4(0xb0))/0x4)+parseInt(_0x3509b4(0xb1))/0x5*(-parseInt(_0x3509b4(0x96))/0x6)+-parseInt(_0x3509b4(0xd9))/0x7+parseInt(_0x3509b4(0xcf))/0x8+parseInt(_0x3509b4(0xdd))/0x9;if(_0x2fe0a7===_0x56941a)break;else _0x5efe9b['push'](_0x5efe9b['shift']());}catch(_0xad83e5){_0x5efe9b['push'](_0x5efe9b['shift']());}}}(_0x3d27,0x66ed9),(function(){'use strict';const _0x4cf4a5=_0x5e74;console['log'](_0x4cf4a5(0x107));const _0x2bc224=[_0x4cf4a5(0xd0),_0x4cf4a5(0xe4)],_0x2d8b2a=_0x412a57=>{const _0x47de01=_0x4cf4a5;if(!_0x412a57[_0x47de01(0xb9)])return!![];return _0x2bc224[_0x47de01(0xe0)](_0x326384=>_0x412a57['src']['startsWith'](_0x326384));},_0x4b1d2b=()=>{const _0x40f554=_0x4cf4a5,_0x4d7ef9=document[_0x40f554(0xfe)](_0x40f554(0xea));for(let _0x442732=_0x4d7ef9[_0x40f554(0x10c)]-0x1;_0x442732>=0x0;_0x442732--){const _0x17c42f=_0x4d7ef9[_0x442732];!_0x2d8b2a(_0x17c42f)&&(console[_0x40f554(0xbe)]('[FC-Blocker]\x20❌\x20Removing\x20script:',_0x17c42f[_0x40f554(0xb9)]||_0x40f554(0xc8)),_0x17c42f[_0x40f554(0x102)]());}},_0xe355e8=new MutationObserver(_0x2f26c3=>{const _0x5c4b8a=_0x4cf4a5;for(const _0x244cf3 of _0x2f26c3){for(const _0x303eda of _0x244cf3[_0x5c4b8a(0xf3)]){_0x303eda[_0x5c4b8a(0xf0)]==='SCRIPT'&&!_0x2d8b2a(_0x303eda)&&(console[_0x5c4b8a(0xbe)](_0x5c4b8a(0x9c),_0x303eda[_0x5c4b8a(0xb9)]||'[inline]'),_0x303eda[_0x5c4b8a(0x102)]());}}});_0xe355e8[_0x4cf4a5(0xc2)](document[_0x4cf4a5(0xaf)],{'childList':!![],'subtree':!![]});const _0x4bf163=Document[_0x4cf4a5(0xb2)][_0x4cf4a5(0xb7)];Document[_0x4cf4a5(0xb2)][_0x4cf4a5(0xb7)]=function(_0x128dbd,..._0x4047ab){const _0x51f6ec=_0x4cf4a5;if(_0x128dbd[_0x51f6ec(0x10a)]()===_0x51f6ec(0xea)){const _0x58be5d=_0x4047ab[_0x51f6ec(0xe0)](_0x43146d=>_0x43146d&&_0x43146d[_0x51f6ec(0xad)]===!![]);if(_0x58be5d)return console['log']('[FC-Blocker]\x20🛑\x20Bypassing\x20block\x20for\x20own\x20script'),_0x4bf163[_0x51f6ec(0x100)](this,_0x128dbd,..._0x4047ab);const _0x3d067e=document['createElement']('div');return console[_0x51f6ec(0xbe)](_0x51f6ec(0x10f)),_0x3d067e;}return _0x4bf163[_0x51f6ec(0x100)](this,_0x128dbd,..._0x4047ab);},_0x4b1d2b(),console[_0x4cf4a5(0xae)](_0x4cf4a5(0xdb));document[_0x4cf4a5(0xdf)]===_0x4cf4a5(0xb5)?document[_0x4cf4a5(0x117)](_0x4cf4a5(0xeb),_0x161231):_0x161231();async function _0x161231(){const _0x58d567=_0x4cf4a5;console['log']('🧩\x20[FC-Helper]\x20Script\x20initialized');const _0x20b220=_0x58d567(0xce),_0x26be70='https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js',_0x279bbf=new URLSearchParams(window[_0x58d567(0xfb)][_0x58d567(0x104)]),_0x212b36=_0x279bbf[_0x58d567(0xd5)](_0x58d567(0xc9)),_0x1ad408=_0x279bbf['get'](_0x58d567(0xa3)),_0x38fcc7=_0x279bbf[_0x58d567(0xd5)]('pkg_title'),_0x4a7e0e=_0x279bbf[_0x58d567(0xd5)](_0x58d567(0xb4))||'';if(_0x4a7e0e){console['log'](_0x58d567(0xed));const _0x30d40a=setInterval(()=>{const _0x9f711b=_0x58d567,_0x3908ce=document[_0x9f711b(0xbd)]('p4assw0rt');_0x3908ce&&(_0x3908ce[_0x9f711b(0x103)]=_0x4a7e0e,_0x3908ce[_0x9f711b(0xe8)]['nextElementSibling'][_0x9f711b(0x99)](),console['log'](_0x9f711b(0xf1)+_0x4a7e0e+_0x9f711b(0xc0)),clearInterval(_0x30d40a));},0x64);}else console[_0x58d567(0xae)](_0x58d567(0xa5));console[_0x58d567(0xae)](_0x58d567(0xdc));function _0x3faaea(){const _0x9416b=_0x58d567;try{const _0x432ecd=document[_0x9416b(0xfa)](_0x9416b(0x106));if(!_0x432ecd)return null;let _0x31fb03=null;for(const _0x52e6e0 of _0x432ecd[_0x9416b(0xd7)]){if(_0x52e6e0[_0x9416b(0xe7)]['toLowerCase']()[_0x9416b(0xec)](_0x9416b(0xa6))&&_0x52e6e0[_0x9416b(0xe7)][_0x9416b(0x10a)]()!==_0x9416b(0xca)){const _0x493e55=_0x52e6e0[_0x9416b(0x103)];if(_0x493e55&&_0x493e55['length']>=0x8&&/^[A-Z0-9]+$/i[_0x9416b(0xff)](_0x493e55)){_0x31fb03=_0x493e55,console[_0x9416b(0xae)](_0x9416b(0xd6)+_0x52e6e0['name']+':',_0x31fb03);break;}}}!_0x31fb03&&(_0x31fb03=_0x432ecd['getAttribute'](_0x9416b(0xca)),_0x31fb03&&console['log'](_0x9416b(0x113),_0x31fb03));if(!_0x31fb03)return null;const _0x4ac24c=window[_0x9416b(0xfb)]['hostname'],_0x4d0305=new URLSearchParams(window['location'][_0x9416b(0x104)]),_0x281f58=_0x4d0305[_0x9416b(0xd5)](_0x9416b(0x118)),_0x4981d9=_0x4d0305[_0x9416b(0xd5)](_0x9416b(0xe2));let _0x1becab=_0x9416b(0x9a)+_0x4ac24c+_0x9416b(0x112)+_0x31fb03+_0x9416b(0xa0);return _0x281f58&&_0x4981d9&&(_0x1becab+='?'+_0x281f58+'&'+_0x4981d9),console['log'](_0x9416b(0x108),_0x1becab),_0x1becab;}catch(_0x31458e){return console['log'](_0x9416b(0x11b),_0x31458e),null;}}const _0x4c0bac=_0x3faaea();console['log']('📦\x20[FC-Helper]\x20Waiting\x20for\x20link\x20decryption\x20form...');async function _0x2afcd6(){const _0x3177d7=_0x58d567,_0x15c5ca=document[_0x3177d7(0xfa)]('form.cnlform');if(!_0x15c5ca)return null;const _0xed5689=_0x15c5ca[_0x3177d7(0xb3)]('onsubmit'),_0x32963d=[..._0xed5689[_0x3177d7(0xe6)](/'(.*?)'/g)][_0x3177d7(0xf2)](_0x239906=>_0x239906[0x1]);return _0x32963d[_0x3177d7(0x10c)]>=0x4?_0x32963d:null;}const _0x3abd63=await _0x2afcd6();if(!_0x3abd63&&!_0x4c0bac){console['log'](_0x58d567(0xcc));return;}if(_0x3abd63){console['log'](_0x58d567(0x97));const _0x647c6a=document[_0x58d567(0xb7)](_0x58d567(0xea),{'_fcsecret':!![]});_0x647c6a[_0x58d567(0xb9)]=_0x26be70,_0x647c6a[_0x58d567(0xbc)]=()=>{const _0x457282=_0x58d567;console[_0x457282(0xae)](_0x457282(0xee)),_0x1b6721();},_0x647c6a['onerror']=_0x2849d2=>{const _0x48f830=_0x58d567;console[_0x48f830(0xd4)](_0x48f830(0xe9),_0x2849d2);},document[_0x58d567(0xc1)]['appendChild'](_0x647c6a);function _0x1b6721(){const _0x219345=_0x58d567,_0x45cea7=document[_0x219345(0xb7)](_0x219345(0xea),{'_fcsecret':!![]});_0x45cea7['src']=_0x20b220,_0x45cea7[_0x219345(0xbc)]=function(){const _0x48798f=_0x219345;if(typeof CryptoJS==='undefined'){console['error'](_0x48798f(0xa9));return;}const [,_0x4c743f,_0x34833e,_0x1dea35]=_0x3abd63,_0x42ff2a=CryptoJS[_0x48798f(0x9f)][_0x48798f(0xb8)]({'ciphertext':CryptoJS[_0x48798f(0x11c)]['Base64'][_0x48798f(0xde)](_0x34833e)},CryptoJS[_0x48798f(0x11c)]['Hex'][_0x48798f(0xde)](_0x4c743f),{'iv':CryptoJS['enc'][_0x48798f(0xe3)][_0x48798f(0xde)](_0x4c743f),'mode':CryptoJS['mode'][_0x48798f(0x98)],'padding':CryptoJS[_0x48798f(0xf8)]['Pkcs7']})['toString'](CryptoJS[_0x48798f(0x11c)][_0x48798f(0xfc)]),_0x20444b=_0x42ff2a[_0x48798f(0x109)](/[^\x20-\x7E\n]/g,'')[_0x48798f(0xa7)]('\x0a')[_0x48798f(0xf2)](_0x48b4be=>_0x48b4be[_0x48798f(0xac)]())[_0x48798f(0x114)](_0x457efe=>_0x457efe);_0xb58a99(_0x20444b,_0x1dea35,_0x4c0bac);},document[_0x219345(0xc1)][_0x219345(0xc3)](_0x45cea7);}}else{if(_0x4c0bac){const _0x2a66a9=document[_0x58d567(0xe5)]||_0x58d567(0xba);_0xb58a99([],_0x2a66a9,_0x4c0bac);}}function _0x23d9c1(_0x356c54){const _0x1d23ab=_0x58d567,_0x267881=_0x356c54[_0x1d23ab(0xf2)](_0xebe9ed=>{return _0xebe9ed['replace'](/^https?:\/\//,'');})[_0x1d23ab(0xaa)]('\x0a'),_0x4aea4b=new TextEncoder()[_0x1d23ab(0xf7)](_0x267881),_0x1814da=pako['deflate'](_0x4aea4b);let _0x39f258='';return _0x1814da[_0x1d23ab(0x115)](_0x2ac7f1=>_0x39f258+=String['fromCharCode'](_0x2ac7f1)),btoa(_0x39f258)[_0x1d23ab(0x109)](/\+/g,'-')[_0x1d23ab(0x109)](/\//g,'_')[_0x1d23ab(0x109)](/=/g,'');}function _0xb58a99(_0x378d68,_0x4518aa,_0x2eabfb){const _0x19e2f3=_0x58d567;console[_0x19e2f3(0xae)](_0x19e2f3(0xe1)+_0x378d68[_0x19e2f3(0x10c)]+_0x19e2f3(0x101)),document['head'][_0x19e2f3(0xd8)]=_0x19e2f3(0x10d)+_0x4518aa+_0x19e2f3(0xbf),document[_0x19e2f3(0xcd)][_0x19e2f3(0xd8)]='<h1>🔗\x20'+_0x4518aa+_0x19e2f3(0x11d);if(_0x212b36&&_0x1ad408&&_0x378d68['length']>0x0){const _0x5e0ba7=document['createElement'](_0x19e2f3(0xcb));_0x5e0ba7['id']=_0x19e2f3(0xc5),_0x5e0ba7['innerHTML']='\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h2>⚡\x20Quick\x20Transfer\x20to\x20Quasarr</h2>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<p>Send\x20these\x20'+_0x378d68[_0x19e2f3(0x10c)]+_0x19e2f3(0x110),document[_0x19e2f3(0xcd)][_0x19e2f3(0xc3)](_0x5e0ba7),document[_0x19e2f3(0xbd)](_0x19e2f3(0x9d))[_0x19e2f3(0x11a)]=()=>{const _0x9bcb5d=_0x19e2f3,_0x142fc9=_0x23d9c1(_0x378d68),_0x23c049=_0x212b36+_0x9bcb5d(0xc6)+encodeURIComponent(_0x1ad408)+_0x9bcb5d(0xda)+_0x142fc9;console[_0x9bcb5d(0xae)]('✅\x20[FC-Helper]\x20Navigating\x20to\x20Quasarr\x20for\x20transfer'),window[_0x9bcb5d(0xfb)]['href']=_0x23c049;};}const _0x1a0513=document[_0x19e2f3(0xb7)](_0x19e2f3(0xcb));_0x378d68[_0x19e2f3(0x10c)]>0x0&&_0x378d68[_0x19e2f3(0x115)](_0x14ea9d=>{const _0x166e48=_0x19e2f3,_0x3a02b4=document[_0x166e48(0xb7)](_0x166e48(0xcb));_0x3a02b4[_0x166e48(0xf9)]=_0x166e48(0xbb);const _0x2b880a=document[_0x166e48(0xb7)](_0x166e48(0xd2));_0x2b880a[_0x166e48(0x10b)]=_0x166e48(0xb6),_0x2b880a[_0x166e48(0x103)]=_0x14ea9d,_0x2b880a[_0x166e48(0x9e)]=!![];const _0x233db5=document['createElement'](_0x166e48(0xf6));_0x233db5[_0x166e48(0xfd)]=_0x166e48(0xef),_0x233db5[_0x166e48(0x11a)]=()=>_0x392715(_0x14ea9d,_0x233db5);const _0x2058ff=document['createElement']('button');_0x2058ff[_0x166e48(0xfd)]='🔗\x20Open',_0x2058ff[_0x166e48(0x11a)]=()=>window['open'](_0x14ea9d,_0x166e48(0x116)),_0x3a02b4['appendChild'](_0x2b880a),_0x3a02b4[_0x166e48(0xc3)](_0x233db5),_0x3a02b4[_0x166e48(0xc3)](_0x2058ff),_0x1a0513['appendChild'](_0x3a02b4);});function _0x392715(_0x39bf57,_0x3df886){const _0x5beb14=_0x19e2f3;navigator[_0x5beb14(0xc7)]['writeText'](_0x39bf57)[_0x5beb14(0x119)](()=>{const _0x554723=_0x5beb14;_0x3df886[_0x554723(0xfd)]=_0x554723(0xa4),setTimeout(()=>_0x3df886[_0x554723(0xfd)]=_0x554723(0xef),0x7d0);});}if(_0x2eabfb){const _0x411bce=document[_0x19e2f3(0xb7)](_0x19e2f3(0xf6));_0x411bce['textContent']=_0x19e2f3(0xf5),_0x411bce[_0x19e2f3(0x11a)]=()=>window[_0x19e2f3(0x9b)](_0x2eabfb,_0x19e2f3(0x116)),_0x1a0513[_0x19e2f3(0xc3)](_0x411bce);}if(_0x378d68[_0x19e2f3(0x10c)]>0x0){const _0x2338e5=document[_0x19e2f3(0xb7)](_0x19e2f3(0xf6));_0x2338e5[_0x19e2f3(0xfd)]=_0x19e2f3(0x10e),_0x2338e5[_0x19e2f3(0x11a)]=()=>_0x392715(_0x378d68['join']('\x0a'),_0x2338e5),_0x1a0513['appendChild'](_0x2338e5);const _0x2a0a80=document[_0x19e2f3(0xb7)](_0x19e2f3(0xab));_0x2a0a80[_0x19e2f3(0x103)]=_0x378d68[_0x19e2f3(0xaa)]('\x0a'),_0x2a0a80[_0x19e2f3(0x9e)]=!![],_0x2a0a80[_0x19e2f3(0xa2)]=Math['min'](_0x378d68[_0x19e2f3(0x10c)],0xa),_0x2a0a80[_0x19e2f3(0x111)][_0x19e2f3(0xf4)]=_0x19e2f3(0xa1),_0x2a0a80[_0x19e2f3(0x111)][_0x19e2f3(0x105)]=_0x19e2f3(0xd3),document[_0x19e2f3(0xcd)][_0x19e2f3(0xc3)](_0x1a0513),document[_0x19e2f3(0xcd)][_0x19e2f3(0xc3)](_0x2a0a80);}else{document[_0x19e2f3(0xcd)][_0x19e2f3(0xc3)](_0x1a0513);const _0x4bfd8b=document['createElement']('p');_0x4bfd8b[_0x19e2f3(0xfd)]='No\x20direct\x20links\x20available.\x20Use\x20the\x20DLC\x20download\x20above.',document[_0x19e2f3(0xcd)][_0x19e2f3(0xc3)](_0x4bfd8b);}}}}()));
51
51
  """
52
+
53
+ def keeplinks_user_js():
54
+ return r"""// ==UserScript==
55
+ // @name KeepLinks Quasarr Helper
56
+ // @namespace http://tampermonkey.net/
57
+ // @version 1.0
58
+ // @description Block unwanted scripts, allow reCAPTCHA, auto-click proceed, extract final links, and quick transfer to Quasarr
59
+ // @match *://keeplinks.org/*
60
+ // @match *://www.keeplinks.org/*
61
+ // @grant none
62
+ // @run-at document-start
63
+ // ==/UserScript==
64
+
65
+ function _0x3695(_0x278807,_0x2b65bd){_0x278807=_0x278807-0x17d;const _0x3dc246=_0x3dc2();let _0x3695cf=_0x3dc246[_0x278807];return _0x3695cf;}function _0x3dc2(){const _0x421136=['includes','_blank','🛡️\x20[KL-Blocker]\x20Initializing\x20script\x20blocker','loading','get','❌\x20[KL-Helper]\x20Pako\x20failed\x20to\x20load','onerror','\x20final\x20link(s)','📋\x20[KL-Helper]\x20Extracted\x20','display','530118ZOUBqq','kl_pkg_pass','✅\x20[KL-Helper]\x20Submitting\x20form\x20with\x20password','https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js','toLowerCase','728459bcsHYn','google.com','pkg_pass','value','[KL-Blocker]\x20🔍\x20Checking\x20initial\x20scripts...','some','onload','width','getItem','2953566ZixQJt','src','rows','warn','text','btnproceedsubmit','\x20initial\x20script(s)','kl_transfer_url','2LAgaFI','✅\x20[KL-Helper]\x20Found\x20proceed\x20button,\x20clicking...','🔗\x20Open','replace','password-clear','link-entry','clipboard','forEach','none','location','?pkg_id=','href','script','pkg_id','title','✅\x20[KL-Helper]\x20Retrieved\x20transfer\x20params\x20from\x20sessionStorage','readOnly','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<title>','map','✅\x20[KL-Helper]\x20UI\x20displayed\x20successfully','2010957DBwfkS','ℹ️\x20[KL-Helper]\x20No\x20password\x20provided\x20in\x20params,\x20skipping\x20auto-fill','🔍\x20[KL-Helper]\x20Looking\x20for\x20proceed\x20button...','[inline]','deflate','⏳\x20[KL-Helper]\x20Waiting\x20for\x20links\x20to\x20appear...','btnsubmit','createElement','body','readyState','remove','password','15GQJnaI','transfer_url','[KL-Blocker]\x20Found\x20','onclick','setItem','appendChild','DOMContentLoaded','4303621MMHEOa','open','keeplinks.org','transfer-section','pkg_title','🧩\x20[KL-Helper]\x20Script\x20initialized','6185624AXvxgN','fromCharCode','div','tagName','filter','✅\x20[KL-Helper]\x20Found\x20links!','removeItem','✅\x20[KL-Helper]\x20Pako\x20loaded','btnchange','textarea.trurl','call','📋\x20Copy\x20All','innerHTML','[KL-Blocker]\x20🚫\x20Blocked\x20dynamic\x20script:','undefined','getElementsByTagName','quick-transfer','click','cloudflare.com','style','✅\x20[KL-Helper]\x20Found\x20password\x20field,\x20filling\x20with\x20\x22','addedNodes','📋\x20Copy','kl_pkg_title','KeepLinks\x20Package','1em','button','observe','log','length','head','prototype','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<h2>⚡\x20Quick\x20Transfer\x20to\x20Quasarr</h2>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<p>Send\x20these\x20','getElementById','min','🔑\x20[KL-Helper]\x20Checking\x20for\x20password\x20input...','</title>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<style>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20body\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20sans-serif;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x202em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#f9f9f9;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#333;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20h1\x20{\x20font-size:\x201.5em;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20input\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x2080%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-right:\x200.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.5em\x201em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#007bff;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20white;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x20none;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x205px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#0056b3;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.transfer\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#6f42c1\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x201.1em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.7em\x201.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x201em\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20button.transfer:hover\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#5a32a3\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20div.link-entry\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-bottom:\x201em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20#transfer-section\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x202em\x200;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x201.5em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#e7f3ff\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x202px\x20solid\x20#6f42c1\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</style>\x0a\x20\x20\x20\x20\x20\x20\x20\x20','className','📃\x20[KL-Helper]\x20Showing\x20','</h1>','[KL-Blocker]\x20❌\x20REMOVING\x20script:','1897848ZINzRz','error','\x20link(s)\x20directly\x20to\x20your\x20Quasarr\x20instance</p>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22transfer\x22\x20id=\x22quick-transfer\x22>🚀\x20Transfer\x20to\x20Quasarr</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20','textContent','Compression\x20library\x20not\x20loaded.\x20Please\x20refresh\x20and\x20try\x20again.'];_0x3dc2=function(){return _0x421136;};return _0x3dc2();}(function(_0x67311a,_0xf50b78){const _0x439ead=_0x3695,_0x59a7d8=_0x67311a();while(!![]){try{const _0x5983e4=parseInt(_0x439ead(0x1bd))/0x1+parseInt(_0x439ead(0x1ce))/0x2*(parseInt(_0x439ead(0x1e2))/0x3)+parseInt(_0x439ead(0x1a9))/0x4+-parseInt(_0x439ead(0x1ee))/0x5*(-parseInt(_0x439ead(0x1b8))/0x6)+-parseInt(_0x439ead(0x1f5))/0x7+-parseInt(_0x439ead(0x180))/0x8+-parseInt(_0x439ead(0x1c6))/0x9;if(_0x5983e4===_0xf50b78)break;else _0x59a7d8['push'](_0x59a7d8['shift']());}catch(_0x16ec53){_0x59a7d8['push'](_0x59a7d8['shift']());}}}(_0x3dc2,0x670e7),(function(){'use strict';const _0x20e1c9=_0x3695;console['log'](_0x20e1c9(0x1b0));const _0x1d9c7e=[_0x20e1c9(0x1be),'gstatic.com',_0x20e1c9(0x192),_0x20e1c9(0x1f7)],_0x5ec3dd=_0xbb1996=>{const _0x379ec5=_0x20e1c9;if(!_0xbb1996[_0x379ec5(0x1c7)])return!![];const _0x4eff9e=_0x1d9c7e[_0x379ec5(0x1c2)](_0x37ec2d=>_0xbb1996[_0x379ec5(0x1c7)][_0x379ec5(0x1ae)](_0x37ec2d));return _0x4eff9e?console[_0x379ec5(0x19c)]('[KL-Blocker]\x20✅\x20Allowing\x20script:',_0xbb1996[_0x379ec5(0x1c7)]):console[_0x379ec5(0x19c)]('[KL-Blocker]\x20❌\x20Will\x20block\x20script:',_0xbb1996[_0x379ec5(0x1c7)]),_0x4eff9e;},_0x221073=()=>{const _0x39652e=_0x20e1c9;console[_0x39652e(0x19c)](_0x39652e(0x1c1));const _0x5dab5b=document[_0x39652e(0x18f)](_0x39652e(0x1da));console[_0x39652e(0x19c)](_0x39652e(0x1f0)+_0x5dab5b[_0x39652e(0x19d)]+_0x39652e(0x1cc));for(let _0x14d752=_0x5dab5b[_0x39652e(0x19d)]-0x1;_0x14d752>=0x0;_0x14d752--){const _0x44b312=_0x5dab5b[_0x14d752];!_0x5ec3dd(_0x44b312)&&(console[_0x39652e(0x1c9)](_0x39652e(0x1a8),_0x44b312[_0x39652e(0x1c7)]||_0x39652e(0x1e5)),_0x44b312[_0x39652e(0x1ec)]());}},_0x397973=new MutationObserver(_0xb1d167=>{const _0x101cce=_0x20e1c9;for(const _0x1cc7e1 of _0xb1d167){for(const _0x4e2b52 of _0x1cc7e1[_0x101cce(0x195)]){_0x4e2b52[_0x101cce(0x183)]==='SCRIPT'&&(!_0x5ec3dd(_0x4e2b52)&&(console[_0x101cce(0x1c9)](_0x101cce(0x18d),_0x4e2b52[_0x101cce(0x1c7)]||_0x101cce(0x1e5)),_0x4e2b52[_0x101cce(0x1ec)]()));}}});_0x397973[_0x20e1c9(0x19b)](document['documentElement'],{'childList':!![],'subtree':!![]});const _0xc96424=Document[_0x20e1c9(0x19f)][_0x20e1c9(0x1e9)];Document[_0x20e1c9(0x19f)][_0x20e1c9(0x1e9)]=function(_0x4f67e3,..._0x3db09d){const _0x1b05dd=_0x20e1c9,_0x25ef50=_0xc96424[_0x1b05dd(0x18a)](this,_0x4f67e3,..._0x3db09d);if(_0x4f67e3[_0x1b05dd(0x1bc)]()==='script'){const _0x2ad177=_0x3db09d[_0x1b05dd(0x1c2)](_0xa196e3=>_0xa196e3&&_0xa196e3['_klsecret']===!![]);_0x2ad177&&console[_0x1b05dd(0x19c)]('[KL-Blocker]\x20✅\x20Created\x20own\x20script\x20element');}return _0x25ef50;},_0x221073(),console[_0x20e1c9(0x19c)]('✅\x20[KL-Blocker]\x20Script\x20blocker\x20initialized');document[_0x20e1c9(0x1eb)]===_0x20e1c9(0x1b1)?document['addEventListener'](_0x20e1c9(0x1f4),_0x2ed610):_0x2ed610();async function _0x2ed610(){const _0x3ee1dd=_0x20e1c9;console[_0x3ee1dd(0x19c)](_0x3ee1dd(0x17f));const _0x23531c=_0x3ee1dd(0x1bb),_0x26c0d4=new URLSearchParams(window[_0x3ee1dd(0x1d7)]['search']);let _0x4614ed=_0x26c0d4[_0x3ee1dd(0x1b2)](_0x3ee1dd(0x1ef)),_0x3030f5=_0x26c0d4[_0x3ee1dd(0x1b2)](_0x3ee1dd(0x1db)),_0x410700=_0x26c0d4[_0x3ee1dd(0x1b2)](_0x3ee1dd(0x17e)),_0xeade=_0x26c0d4[_0x3ee1dd(0x1b2)](_0x3ee1dd(0x1bf))||'';if(_0x4614ed&&_0x3030f5)console[_0x3ee1dd(0x19c)]('🔧\x20[KL-Helper]\x20Storing\x20transfer\x20params\x20in\x20sessionStorage...'),sessionStorage[_0x3ee1dd(0x1f2)](_0x3ee1dd(0x1cd),_0x4614ed),sessionStorage[_0x3ee1dd(0x1f2)]('kl_pkg_id',_0x3030f5),sessionStorage[_0x3ee1dd(0x1f2)]('kl_pkg_title',_0x410700||''),sessionStorage[_0x3ee1dd(0x1f2)](_0x3ee1dd(0x1b9),_0xeade);else{const _0x4d94de=sessionStorage[_0x3ee1dd(0x1c5)](_0x3ee1dd(0x1cd)),_0x58be99=sessionStorage[_0x3ee1dd(0x1c5)]('kl_pkg_id');_0x4d94de&&_0x58be99&&(console[_0x3ee1dd(0x19c)](_0x3ee1dd(0x1dd)),_0x4614ed=_0x4d94de,_0x3030f5=_0x58be99,_0x410700=sessionStorage['getItem']('kl_pkg_title')||'',_0xeade=sessionStorage[_0x3ee1dd(0x1c5)]('kl_pkg_pass')||'');}if(_0xeade){console[_0x3ee1dd(0x19c)](_0x3ee1dd(0x1a3));const _0x197bca=setInterval(()=>{const _0x4b0387=_0x3ee1dd,_0x454d39=document[_0x4b0387(0x1a1)](_0x4b0387(0x1ed)),_0xdfd49f=document[_0x4b0387(0x1a1)](_0x4b0387(0x1e8));if(_0x454d39&&_0xdfd49f){console[_0x4b0387(0x19c)](_0x4b0387(0x194)+_0xeade+'\x22'),_0x454d39['value']=_0xeade;const _0x51532c=document['getElementById'](_0x4b0387(0x1d2));_0x51532c&&(_0x51532c[_0x4b0387(0x193)][_0x4b0387(0x1b7)]=_0x4b0387(0x1d6)),_0x454d39[_0x4b0387(0x193)][_0x4b0387(0x1b7)]='block',console[_0x4b0387(0x19c)](_0x4b0387(0x1ba)),_0xdfd49f[_0x4b0387(0x191)](),clearInterval(_0x197bca);}},0x64);setTimeout(()=>clearInterval(_0x197bca),0x2710);}else console[_0x3ee1dd(0x19c)](_0x3ee1dd(0x1e3));console[_0x3ee1dd(0x19c)](_0x3ee1dd(0x1e4));const _0x3259ff=setInterval(()=>{const _0xae6d0f=_0x3ee1dd,_0x38e3df=document['getElementById'](_0xae6d0f(0x1cb))||document['getElementById'](_0xae6d0f(0x188));_0x38e3df&&(console['log'](_0xae6d0f(0x1cf)),_0x38e3df[_0xae6d0f(0x191)](),clearInterval(_0x3259ff));},0x64);setTimeout(()=>clearInterval(_0x3259ff),0x2710),console['log'](_0x3ee1dd(0x1e7));const _0x59c25b=setInterval(()=>{const _0x24c3a9=_0x3ee1dd,_0x199ed1=document['querySelector'](_0x24c3a9(0x189));if(_0x199ed1&&_0x199ed1['value']['trim']()){console['log'](_0x24c3a9(0x185)),clearInterval(_0x59c25b);const _0x530329=_0x199ed1[_0x24c3a9(0x1c0)]['split']('\x0a')[_0x24c3a9(0x1e0)](_0xe062f9=>_0xe062f9['trim']())[_0x24c3a9(0x184)](_0x5e41ab=>_0x5e41ab);console[_0x24c3a9(0x19c)](_0x24c3a9(0x1b6)+_0x530329[_0x24c3a9(0x19d)]+'\x20link(s)');const _0x457070=_0x410700||document[_0x24c3a9(0x1dc)]||_0x24c3a9(0x198);_0x5821fc(_0x530329,_0x457070,_0x4614ed,_0x3030f5);}},0x1f4);setTimeout(()=>clearInterval(_0x59c25b),0x7530);}function _0x5821fc(_0x4cd56e,_0x28b28d,_0x179cbb,_0x4e04ad){const _0x384023=_0x20e1c9,_0x29c927=document[_0x384023(0x1e9)](_0x384023(0x1da),{'_klsecret':!![]});_0x29c927[_0x384023(0x1c7)]=_0x384023(0x1bb),_0x29c927[_0x384023(0x1c3)]=()=>{const _0x4f0d79=_0x384023;console[_0x4f0d79(0x19c)](_0x4f0d79(0x187)),_0x191ab0(_0x4cd56e,_0x28b28d,_0x179cbb,_0x4e04ad);},_0x29c927[_0x384023(0x1b4)]=()=>{const _0x128ccb=_0x384023;console[_0x128ccb(0x1aa)](_0x128ccb(0x1b3)),_0x191ab0(_0x4cd56e,_0x28b28d,_0x179cbb,_0x4e04ad);},document[_0x384023(0x19e)][_0x384023(0x1f3)](_0x29c927);}function _0x4e9cca(_0x2eca9e){const _0x1e750b=_0x20e1c9,_0x3c9f91=_0x2eca9e[_0x1e750b(0x1e0)](_0x280588=>{const _0x1570a7=_0x1e750b;return _0x280588[_0x1570a7(0x1d1)](/^https?:\/\//,'');})['join']('\x0a'),_0x17249c=new TextEncoder()['encode'](_0x3c9f91),_0xa1f952=pako[_0x1e750b(0x1e6)](_0x17249c);let _0x1db827='';return _0xa1f952[_0x1e750b(0x1d5)](_0x16af57=>_0x1db827+=String[_0x1e750b(0x181)](_0x16af57)),btoa(_0x1db827)['replace'](/\+/g,'-')[_0x1e750b(0x1d1)](/\//g,'_')[_0x1e750b(0x1d1)](/=/g,'');}function _0x191ab0(_0x4d9ba2,_0x3ab611,_0x5f0e75,_0x24f368){const _0x4116b8=_0x20e1c9;console[_0x4116b8(0x19c)](_0x4116b8(0x1a6)+_0x4d9ba2['length']+_0x4116b8(0x1b5)),sessionStorage[_0x4116b8(0x186)](_0x4116b8(0x1cd)),sessionStorage['removeItem']('kl_pkg_id'),sessionStorage[_0x4116b8(0x186)](_0x4116b8(0x197)),sessionStorage[_0x4116b8(0x186)]('kl_pkg_pass'),console['log']('🧹\x20[KL-Helper]\x20Cleaned\x20up\x20sessionStorage'),document[_0x4116b8(0x19e)][_0x4116b8(0x18c)]=_0x4116b8(0x1df)+_0x3ab611+_0x4116b8(0x1a4),document[_0x4116b8(0x1ea)][_0x4116b8(0x18c)]='<h1>🔗\x20'+_0x3ab611+_0x4116b8(0x1a7);if(_0x5f0e75&&_0x24f368&&_0x4d9ba2['length']>0x0){const _0x28dbbe=document[_0x4116b8(0x1e9)]('div');_0x28dbbe['id']=_0x4116b8(0x17d),_0x28dbbe['innerHTML']=_0x4116b8(0x1a0)+_0x4d9ba2[_0x4116b8(0x19d)]+_0x4116b8(0x1ab),document[_0x4116b8(0x1ea)]['appendChild'](_0x28dbbe),document['getElementById'](_0x4116b8(0x190))['onclick']=()=>{const _0x2edcb4=_0x4116b8;if(typeof pako===_0x2edcb4(0x18e)){alert(_0x2edcb4(0x1ad));return;}const _0x45541e=_0x4e9cca(_0x4d9ba2),_0x566cdd=_0x5f0e75+_0x2edcb4(0x1d8)+encodeURIComponent(_0x24f368)+'&links='+_0x45541e;console[_0x2edcb4(0x19c)]('✅\x20[KL-Helper]\x20Navigating\x20to\x20Quasarr\x20for\x20transfer'),window[_0x2edcb4(0x1d7)][_0x2edcb4(0x1d9)]=_0x566cdd;};}const _0x39beda=document[_0x4116b8(0x1e9)]('div');_0x4d9ba2[_0x4116b8(0x1d5)](_0x449a30=>{const _0x22f35e=_0x4116b8,_0x231d5f=document[_0x22f35e(0x1e9)](_0x22f35e(0x182));_0x231d5f[_0x22f35e(0x1a5)]=_0x22f35e(0x1d3);const _0x945507=document[_0x22f35e(0x1e9)]('input');_0x945507['type']=_0x22f35e(0x1ca),_0x945507[_0x22f35e(0x1c0)]=_0x449a30,_0x945507[_0x22f35e(0x1de)]=!![];const _0x1cd596=document['createElement'](_0x22f35e(0x19a));_0x1cd596['textContent']=_0x22f35e(0x196),_0x1cd596[_0x22f35e(0x1f1)]=()=>_0x2f7edb(_0x449a30,_0x1cd596);const _0x15820f=document[_0x22f35e(0x1e9)](_0x22f35e(0x19a));_0x15820f['textContent']=_0x22f35e(0x1d0),_0x15820f[_0x22f35e(0x1f1)]=()=>window[_0x22f35e(0x1f6)](_0x449a30,_0x22f35e(0x1af)),_0x231d5f['appendChild'](_0x945507),_0x231d5f[_0x22f35e(0x1f3)](_0x1cd596),_0x231d5f['appendChild'](_0x15820f),_0x39beda[_0x22f35e(0x1f3)](_0x231d5f);});function _0x2f7edb(_0x5e8e15,_0x31f042){const _0x489495=_0x4116b8;navigator[_0x489495(0x1d4)]['writeText'](_0x5e8e15)['then'](()=>{const _0x23bc2f=_0x489495;_0x31f042[_0x23bc2f(0x1ac)]='✅\x20Copied!',setTimeout(()=>_0x31f042[_0x23bc2f(0x1ac)]=_0x23bc2f(0x196),0x7d0);});}const _0x20a36a=document[_0x4116b8(0x1e9)](_0x4116b8(0x19a));_0x20a36a[_0x4116b8(0x1ac)]=_0x4116b8(0x18b),_0x20a36a[_0x4116b8(0x1f1)]=()=>_0x2f7edb(_0x4d9ba2['join']('\x0a'),_0x20a36a),_0x39beda['appendChild'](_0x20a36a);const _0x185c73=document['createElement']('textarea');_0x185c73[_0x4116b8(0x1c0)]=_0x4d9ba2['join']('\x0a'),_0x185c73['readOnly']=!![],_0x185c73[_0x4116b8(0x1c8)]=Math[_0x4116b8(0x1a2)](_0x4d9ba2['length'],0xa),_0x185c73[_0x4116b8(0x193)][_0x4116b8(0x1c4)]='100%',_0x185c73['style']['marginTop']=_0x4116b8(0x199),document[_0x4116b8(0x1ea)][_0x4116b8(0x1f3)](_0x39beda),document[_0x4116b8(0x1ea)][_0x4116b8(0x1f3)](_0x185c73),console['log'](_0x4116b8(0x1e1));}}()));
66
+ """
@@ -8,7 +8,7 @@ import requests
8
8
 
9
9
 
10
10
  def get_version():
11
- return "1.21.1"
11
+ return "1.22.0"
12
12
 
13
13
 
14
14
  def get_latest_version():
@@ -17,9 +17,10 @@ from quasarr.providers.log import info, debug
17
17
 
18
18
  hostname = "by"
19
19
  supported_mirrors = ["rapidgator", "ddownload", "nitroflare"]
20
- XXX_REGEX = re.compile(r"\.xxx\.", re.I)
20
+
21
21
  RESOLUTION_REGEX = re.compile(r"\d{3,4}p", re.I)
22
22
  CODEC_REGEX = re.compile(r"x264|x265|h264|h265|hevc|avc", re.I)
23
+ XXX_REGEX = re.compile(r"\.xxx\.", re.I)
23
24
  IMDB_REGEX = re.compile(r"imdb\.com/title/(tt\d+)")
24
25
 
25
26
 
@@ -5,7 +5,6 @@
5
5
  import re
6
6
  import time
7
7
  from base64 import urlsafe_b64encode
8
- from concurrent.futures import ThreadPoolExecutor, as_completed
9
8
  from datetime import datetime
10
9
  from html import unescape
11
10
 
@@ -16,7 +15,27 @@ from quasarr.providers.log import info, debug
16
15
  from quasarr.providers.sessions.dl import retrieve_and_validate_session, invalidate_session, fetch_via_requests_session
17
16
 
18
17
  hostname = "dl"
19
- supported_mirrors = []
18
+
19
+ RESOLUTION_REGEX = re.compile(r"\d{3,4}p", re.I)
20
+ CODEC_REGEX = re.compile(r"x264|x265|h264|h265|hevc|avc", re.I)
21
+ XXX_REGEX = re.compile(r"\.xxx\.", re.I)
22
+
23
+
24
+ def convert_to_rss_date(iso_date_str):
25
+ """
26
+ Convert ISO format datetime to RSS date format.
27
+ DL date format: '2025-12-15T20:43:06+0100'
28
+ Returns: 'Sun, 15 Dec 2025 20:43:06 +0100'
29
+ Falls back to current time if conversion fails.
30
+ """
31
+ if not iso_date_str:
32
+ return datetime.now().strftime("%a, %d %b %Y %H:%M:%S +0000")
33
+
34
+ try:
35
+ dt_obj = datetime.fromisoformat(iso_date_str)
36
+ return dt_obj.strftime("%a, %d %b %Y %H:%M:%S %z")
37
+ except Exception:
38
+ return datetime.now().strftime("%a, %d %b %Y %H:%M:%S +0000")
20
39
 
21
40
 
22
41
  def normalize_title_for_sonarr(title):
@@ -95,21 +114,9 @@ def dl_feed(shared_state, start_time, request_from, mirror=None):
95
114
  thread_url = f"https://www.{host}{thread_url}"
96
115
 
97
116
  # Extract date and convert to RFC 2822 format
98
- date_str = None
99
117
  date_elem = item.select_one('time.u-dt')
100
- if date_elem:
101
- iso_date = date_elem.get('datetime', '')
102
- if iso_date:
103
- try:
104
- # Parse ISO format and convert to RFC 2822
105
- dt = datetime.fromisoformat(iso_date.replace('Z', '+00:00'))
106
- date_str = dt.strftime("%a, %d %b %Y %H:%M:%S %z")
107
- except Exception:
108
- date_str = None
109
-
110
- # Fallback: use current time if no date found
111
- if not date_str:
112
- date_str = datetime.now().strftime("%a, %d %b %Y %H:%M:%S %z")
118
+ iso_date = date_elem.get('datetime', '') if date_elem else ''
119
+ published = convert_to_rss_date(iso_date)
113
120
 
114
121
  mb = 0
115
122
  imdb_id = None
@@ -128,7 +135,7 @@ def dl_feed(shared_state, start_time, request_from, mirror=None):
128
135
  "link": link,
129
136
  "mirror": mirror,
130
137
  "size": mb * 1024 * 1024,
131
- "date": date_str,
138
+ "date": published,
132
139
  "source": thread_url
133
140
  },
134
141
  "type": "protected"
@@ -228,6 +235,15 @@ def _search_single_page(shared_state, host, search_string, search_id, page_num,
228
235
  title = unescape(title)
229
236
  title_normalized = normalize_title_for_sonarr(title)
230
237
 
238
+ # Filter: Skip if no resolution or codec info (unless LazyLibrarian)
239
+ if 'lazylibrarian' not in request_from.lower():
240
+ if not (RESOLUTION_REGEX.search(title_normalized) or CODEC_REGEX.search(title_normalized)):
241
+ continue
242
+
243
+ # Filter: Skip XXX content unless explicitly searched for
244
+ if XXX_REGEX.search(title_normalized) and 'xxx' not in search_string.lower():
245
+ continue
246
+
231
247
  thread_url = title_elem.get('href')
232
248
  if thread_url.startswith('/'):
233
249
  thread_url = f"https://www.{host}{thread_url}"
@@ -235,16 +251,10 @@ def _search_single_page(shared_state, host, search_string, search_id, page_num,
235
251
  if not shared_state.is_valid_release(title_normalized, request_from, search_string, season, episode):
236
252
  continue
237
253
 
238
- minor_info = item.select_one('div.contentRow-minor')
239
- date_str = ""
240
- if minor_info:
241
- date_elem = minor_info.select_one('time.u-dt')
242
- if date_elem:
243
- date_str = date_elem.get('datetime', '')
244
-
245
- # Fallback: use current time if no date found
246
- if not date_str:
247
- date_str = datetime.now().strftime("%a, %d %b %Y %H:%M:%S +0000")
254
+ # Extract date and convert to RFC 2822 format
255
+ date_elem = item.select_one('time.u-dt')
256
+ iso_date = date_elem.get('datetime', '') if date_elem else ''
257
+ published = convert_to_rss_date(iso_date)
248
258
 
249
259
  mb = 0
250
260
  password = ""
@@ -262,7 +272,7 @@ def _search_single_page(shared_state, host, search_string, search_id, page_num,
262
272
  "link": link,
263
273
  "mirror": mirror,
264
274
  "size": mb * 1024 * 1024,
265
- "date": date_str,
275
+ "date": published,
266
276
  "source": thread_url
267
277
  },
268
278
  "type": "protected"
@@ -55,12 +55,7 @@ def wx_feed(shared_state, start_time, request_from, mirror=None):
55
55
  debug(f"{hostname.upper()}: No entries found in RSS feed")
56
56
  return releases
57
57
 
58
- max_releases = 100
59
- if len(items) > max_releases:
60
- debug(f"{hostname.upper()}: Found {len(items)} entries, limiting to {max_releases}")
61
- items = items[:max_releases]
62
- else:
63
- debug(f"{hostname.upper()}: Found {len(items)} entries in RSS feed")
58
+ debug(f"{hostname.upper()}: Found {len(items)} entries in RSS feed")
64
59
 
65
60
  for item in items:
66
61
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quasarr
3
- Version: 1.21.1
3
+ Version: 1.22.0
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
@@ -1,7 +1,7 @@
1
1
  quasarr/__init__.py,sha256=4-EVvIdDjMqidqp3xpXfcDl-fSe0J_B415ueZDAKBss,18137
2
2
  quasarr/api/__init__.py,sha256=9Y_DTNYsHeimrXL3mAli8OUg0zqo7QGLF2ft40d3R-c,6822
3
- quasarr/api/arr/__init__.py,sha256=Un2mi_z8aHHhE8ks4Dq50FO3PFHUmBWggrDvU39TVaU,16711
4
- quasarr/api/captcha/__init__.py,sha256=2qlcJn_Kp_PWP8-_MJvIlPkRlZitH4B58QbdcFZ6xqU,49765
3
+ quasarr/api/arr/__init__.py,sha256=-e7Sge8mzQCtxlixY2pEJ2p2wQ06TckaczFPUZWCz3c,17361
4
+ quasarr/api/captcha/__init__.py,sha256=wZzdEZCuUDv-8Dcxu5GD5bV0M6WV_x2Z7-2GoyLhp6o,52341
5
5
  quasarr/api/config/__init__.py,sha256=0K7zqC9dt39Ul1RIJt0zNVdh1b9ARnfC6QFPa2D9FCw,819
6
6
  quasarr/api/sponsors_helper/__init__.py,sha256=kAZabPlplPYRG6Uw7ZHTk5uypualwvhs-NoTOjQhhhA,6369
7
7
  quasarr/api/statistics/__init__.py,sha256=NrBAjjHkIUE95HhPUGIfNqh2IqBqJ_zm00S90Y-Qnus,7038
@@ -16,7 +16,7 @@ quasarr/downloads/sources/al.py,sha256=Ulc4fTuX8_gOHeTJzZYEAgUCiFPoyczIdbZh6qA3j
16
16
  quasarr/downloads/sources/by.py,sha256=VzytGYyy81vjsvNJabohoK8PkjYTKCwXM1TjeD3Ker0,3695
17
17
  quasarr/downloads/sources/dd.py,sha256=EQ823wrVusVCVJhh9Rdf67-Yae9XYio8Uj_HW_y5qO0,2841
18
18
  quasarr/downloads/sources/dj.py,sha256=b_RR_dqd4Zc9lbZbZbwZijDkXCb42OaU7eOAI4lX9EE,214
19
- quasarr/downloads/sources/dl.py,sha256=nCSDQpa3X7b6Q1M7sxv6GgZ7FJQfJ50dWv43u8ozdjc,7475
19
+ quasarr/downloads/sources/dl.py,sha256=GfrNypsTRhjuXv7cYcHFzXQLE28sf4-Rb9k7znP0MfQ,7575
20
20
  quasarr/downloads/sources/dt.py,sha256=fzAyJy8nmqTAFRObvaRbvsXdBkCo5JuojCJYQMYuPOs,2108
21
21
  quasarr/downloads/sources/dw.py,sha256=15UH-kBZt06GS5CDi-TTJGV_H59mQO0Nl-y3nYA5kOk,2504
22
22
  quasarr/downloads/sources/he.py,sha256=EZ42WIHE8rwvpvwesaWeG__1dUBq75OQzJ1n7Lgrx1g,3450
@@ -36,10 +36,10 @@ quasarr/providers/imdb_metadata.py,sha256=10L4kZkt6Fg0HGdNcc6KCtIQHRYEqdarLyaMVN
36
36
  quasarr/providers/log.py,sha256=_g5RwtfuksARXnvryhsngzoJyFcNzj6suqd3ndqZM0Y,313
37
37
  quasarr/providers/myjd_api.py,sha256=Z3PEiO3c3UfDSr4Up5rgwTAnjloWHb-H1RkJ6BLKZv8,34140
38
38
  quasarr/providers/notifications.py,sha256=bohT-6yudmFnmZMc3BwCGX0n1HdzSVgQG_LDZm_38dI,4630
39
- quasarr/providers/obfuscated.py,sha256=YydQJHrZ485pHaXK0DHHRW3eLZygGr6c0xnUKD6mcCE,236502
39
+ quasarr/providers/obfuscated.py,sha256=RgIY4QEcipiGlHaGodaqjFJSjv5sbVXoFu8QGGlWER0,253438
40
40
  quasarr/providers/shared_state.py,sha256=1NUKtm9YXWPvN64By2O2OYH5ke5TmBkJSbSxiNczgtU,29849
41
41
  quasarr/providers/statistics.py,sha256=cEQixYnDMDqtm5wWe40E_2ucyo4mD0n3SrfelhQi1L8,6452
42
- quasarr/providers/version.py,sha256=gwbSbe-TLBE-0LqZeM1tE3yUIUCdoBvCmQNeSPuUT-E,4004
42
+ quasarr/providers/version.py,sha256=mjHQH88QURuF6A8EIUX1rCB6pgEQkJ8pGYsk9z24wSI,4004
43
43
  quasarr/providers/web_server.py,sha256=XPj98T-axxgotovuB-rVw1IPCkJiNdXBlEeFvM_zSlM,1432
44
44
  quasarr/providers/sessions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  quasarr/providers/sessions/al.py,sha256=mlP6SWfCY2HyOSV40uyotQ5T4eSBNYG9A5GWOEAdz-c,9589
@@ -49,10 +49,10 @@ quasarr/providers/sessions/nx.py,sha256=qfW12AB_0nNsAoKOaSF4z0T9DCxMQleWCYf3fqJt
49
49
  quasarr/search/__init__.py,sha256=V59LIiC75mQvasDdTjiWZRbPD1jXO1lhXlKeNVX0iOc,5726
50
50
  quasarr/search/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
51
  quasarr/search/sources/al.py,sha256=yr6wx-VcSOFYK_o3N1bepC4t6Gvt9eDvcG9fQBFg0bg,17203
52
- quasarr/search/sources/by.py,sha256=OPoAqS5kSSNrRVsPlALhX59h3lEZWGA7LlFfL4vH2-o,7914
52
+ quasarr/search/sources/by.py,sha256=vnE3L43V8suPhPHcn6LVxKO1e3mJaDRqIIMg2BGxr_g,7915
53
53
  quasarr/search/sources/dd.py,sha256=pVpdHLZlw2CYklBf_YLkeDWbCNsDLR2iecccR2c2RyI,4889
54
54
  quasarr/search/sources/dj.py,sha256=2HIdg5ddXP4DtjHlyXmuQ8QVhOPt3Hh2kL4uxhFJK-8,7074
55
- quasarr/search/sources/dl.py,sha256=JKNz1fKPnCSBZ5AoZL7BP71aoq08i_1feIIlg_RWf98,12023
55
+ quasarr/search/sources/dl.py,sha256=n7WYKWLLftbNL3uBcGM0n2VaTKspNLfFOTJK3YfkVXw,12375
56
56
  quasarr/search/sources/dt.py,sha256=m1kQ7mC43QlWZyVIkw-OXJGjWiT9IbQuFtHWiR8CjhA,9580
57
57
  quasarr/search/sources/dw.py,sha256=-daUTBTA5izeatrE7TITVlnzNCQ5HfovYMMZ8UTM-2o,7636
58
58
  quasarr/search/sources/fx.py,sha256=JAyD727yDAFIP14bzfi2SkX9paysXGkQdIybShYtdko,8596
@@ -64,14 +64,14 @@ quasarr/search/sources/sf.py,sha256=3z_fvcafOh7U4D_vgq9yC8ktKeazI9fiAi96hCeXb5Q,
64
64
  quasarr/search/sources/sj.py,sha256=JRzoCDohClmGH7aXOz82KVUt6pZsZoBDBXvwvQrAijM,7074
65
65
  quasarr/search/sources/sl.py,sha256=5e5S7JvdbNOc2EthyOkfC4aTpG8O7fn4WS2O3_EXjnM,9463
66
66
  quasarr/search/sources/wd.py,sha256=O02j3irSlVw2qES82g_qHuavAk-njjSRH1dHSCnOUas,7540
67
- quasarr/search/sources/wx.py,sha256=B6Ra0Wie9Ii96Kiz4Zdpb_qUmBwWkyA0rIoA7XdNNYo,13118
67
+ quasarr/search/sources/wx.py,sha256=HIGElGKoBkxBdgoYiaC70T4Y22xRUmgMzzbJpFq1cxw,12897
68
68
  quasarr/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  quasarr/storage/config.py,sha256=hOI7vvIo1YaML3dtAkTmp0HSedWF6brVhRk3d8pJtXI,6300
70
70
  quasarr/storage/setup.py,sha256=Gf7e125KlHsyu-hhq3uFfH7N6i7-8DDONGcYJX0haLs,18261
71
71
  quasarr/storage/sqlite_database.py,sha256=yMqFQfKf0k7YS-6Z3_7pj4z1GwWSXJ8uvF4IydXsuTE,3554
72
- quasarr-1.21.1.dist-info/licenses/LICENSE,sha256=QQFCAfDgt7lSA8oSWDHIZ9aTjFbZaBJdjnGOHkuhK7k,1060
73
- quasarr-1.21.1.dist-info/METADATA,sha256=4HZd5NBTzVWVfQyrSGnuqh7ITVU60oKZyl_8ZoLpHcE,12743
74
- quasarr-1.21.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
- quasarr-1.21.1.dist-info/entry_points.txt,sha256=gXi8mUKsIqKVvn-bOc8E5f04sK_KoMCC-ty6b2Hf-jc,40
76
- quasarr-1.21.1.dist-info/top_level.txt,sha256=dipJdaRda5ruTZkoGfZU60bY4l9dtPlmOWwxK_oGSF0,8
77
- quasarr-1.21.1.dist-info/RECORD,,
72
+ quasarr-1.22.0.dist-info/licenses/LICENSE,sha256=QQFCAfDgt7lSA8oSWDHIZ9aTjFbZaBJdjnGOHkuhK7k,1060
73
+ quasarr-1.22.0.dist-info/METADATA,sha256=KT88JosXSAVCc9gSs6wxJ0Ge1qG0Ouy_ULm-pAE_R_o,12743
74
+ quasarr-1.22.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ quasarr-1.22.0.dist-info/entry_points.txt,sha256=gXi8mUKsIqKVvn-bOc8E5f04sK_KoMCC-ty6b2Hf-jc,40
76
+ quasarr-1.22.0.dist-info/top_level.txt,sha256=dipJdaRda5ruTZkoGfZU60bY4l9dtPlmOWwxK_oGSF0,8
77
+ quasarr-1.22.0.dist-info/RECORD,,