quasarr 1.21.2__tar.gz → 1.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (83) hide show
  1. {quasarr-1.21.2 → quasarr-1.23.0}/PKG-INFO +1 -1
  2. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/api/captcha/__init__.py +162 -48
  3. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/dl.py +4 -1
  4. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/obfuscated.py +30 -0
  5. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/version.py +1 -1
  6. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/wx.py +1 -6
  7. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/PKG-INFO +1 -1
  8. {quasarr-1.21.2 → quasarr-1.23.0}/LICENSE +0 -0
  9. {quasarr-1.21.2 → quasarr-1.23.0}/README.md +0 -0
  10. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/__init__.py +0 -0
  11. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/api/__init__.py +0 -0
  12. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/api/arr/__init__.py +0 -0
  13. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/api/config/__init__.py +0 -0
  14. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/api/sponsors_helper/__init__.py +0 -0
  15. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/api/statistics/__init__.py +0 -0
  16. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/__init__.py +0 -0
  17. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/linkcrypters/__init__.py +0 -0
  18. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/linkcrypters/al.py +0 -0
  19. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/linkcrypters/filecrypt.py +0 -0
  20. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/linkcrypters/hide.py +0 -0
  21. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/packages/__init__.py +0 -0
  22. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/__init__.py +0 -0
  23. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/al.py +0 -0
  24. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/by.py +0 -0
  25. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/dd.py +0 -0
  26. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/dj.py +0 -0
  27. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/dt.py +0 -0
  28. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/dw.py +0 -0
  29. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/he.py +0 -0
  30. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/mb.py +0 -0
  31. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/nk.py +0 -0
  32. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/nx.py +0 -0
  33. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/sf.py +0 -0
  34. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/sj.py +0 -0
  35. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/sl.py +0 -0
  36. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/wd.py +0 -0
  37. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/downloads/sources/wx.py +0 -0
  38. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/__init__.py +0 -0
  39. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/cloudflare.py +0 -0
  40. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/html_images.py +0 -0
  41. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/html_templates.py +0 -0
  42. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/imdb_metadata.py +0 -0
  43. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/log.py +0 -0
  44. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/myjd_api.py +0 -0
  45. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/notifications.py +0 -0
  46. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/sessions/__init__.py +0 -0
  47. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/sessions/al.py +0 -0
  48. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/sessions/dd.py +0 -0
  49. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/sessions/dl.py +0 -0
  50. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/sessions/nx.py +0 -0
  51. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/shared_state.py +0 -0
  52. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/statistics.py +0 -0
  53. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/providers/web_server.py +0 -0
  54. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/__init__.py +0 -0
  55. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/__init__.py +0 -0
  56. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/al.py +0 -0
  57. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/by.py +0 -0
  58. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/dd.py +0 -0
  59. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/dj.py +0 -0
  60. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/dl.py +0 -0
  61. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/dt.py +0 -0
  62. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/dw.py +0 -0
  63. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/fx.py +0 -0
  64. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/he.py +0 -0
  65. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/mb.py +0 -0
  66. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/nk.py +0 -0
  67. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/nx.py +0 -0
  68. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/sf.py +0 -0
  69. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/sj.py +0 -0
  70. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/sl.py +0 -0
  71. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/search/sources/wd.py +0 -0
  72. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/storage/__init__.py +0 -0
  73. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/storage/config.py +0 -0
  74. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/storage/setup.py +0 -0
  75. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr/storage/sqlite_database.py +0 -0
  76. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/SOURCES.txt +0 -0
  77. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/dependency_links.txt +0 -0
  78. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/entry_points.txt +0 -0
  79. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/not-zip-safe +0 -0
  80. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/requires.txt +0 -0
  81. {quasarr-1.21.2 → quasarr-1.23.0}/quasarr.egg-info/top_level.txt +0 -0
  82. {quasarr-1.21.2 → quasarr-1.23.0}/setup.cfg +0 -0
  83. {quasarr-1.21.2 → quasarr-1.23.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quasarr
3
- Version: 1.21.2
3
+ Version: 1.23.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
@@ -13,10 +13,10 @@ from bottle import request, response, redirect
13
13
  import quasarr.providers.html_images as images
14
14
  from quasarr.downloads.linkcrypters.filecrypt import get_filecrypt_links, DLC
15
15
  from quasarr.downloads.packages import delete_package
16
+ from quasarr.providers import obfuscated
16
17
  from quasarr.providers import shared_state
17
18
  from quasarr.providers.html_templates import render_button, render_centered_html
18
19
  from quasarr.providers.log import info, debug
19
- from quasarr.providers.obfuscated import captcha_js, captcha_values, filecrypt_user_js, junkies_user_js
20
20
  from quasarr.providers.statistics import StatsHelper
21
21
 
22
22
 
@@ -87,9 +87,27 @@ def setup_captcha_routes(app):
87
87
  for link in prioritized_links
88
88
  )
89
89
 
90
+ # KeepLinks uses nested arrays like FileCrypt: [["url", "mirror"]]
91
+ has_keeplinks_links = any(
92
+ ("keeplinks." in link[0] if isinstance(link, (list, tuple)) else "keeplinks." in link)
93
+ for link in prioritized_links
94
+ )
95
+
96
+ # ToLink uses nested arrays like FileCrypt: [["url", "mirror"]]
97
+ has_tolink_links = any(
98
+ ("tolink." in link[0] if isinstance(link, (list, tuple)) else "tolink." in link)
99
+ for link in prioritized_links
100
+ )
101
+
90
102
  if has_junkies_links:
91
103
  debug("Redirecting to Junkies CAPTCHA")
92
104
  redirect(f"/captcha/junkies?data={quote(encoded_payload)}")
105
+ elif has_keeplinks_links:
106
+ debug("Redirecting to KeepLinks CAPTCHA")
107
+ redirect(f"/captcha/keeplinks?data={quote(encoded_payload)}")
108
+ elif has_tolink_links:
109
+ debug("Redirecting to ToLink CAPTCHA")
110
+ redirect(f"/captcha/tolink?data={quote(encoded_payload)}")
93
111
  elif filecrypt_session:
94
112
  debug(f'Redirecting to circle CAPTCHA')
95
113
  redirect(f"/captcha/circle?data={quote(encoded_payload)}")
@@ -111,45 +129,25 @@ def setup_captcha_routes(app):
111
129
  except Exception as e:
112
130
  return {"error": f"Failed to decode payload: {str(e)}"}
113
131
 
114
- @app.get("/captcha/junkies")
115
- def serve_junkies_captcha():
116
- payload = decode_payload()
132
+ def render_userscript_section(url, package_id, title, password, provider_type="junkies"):
133
+ """Render the userscript UI section for Junkies, KeepLinks, or ToLink pages
117
134
 
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>''')
124
-
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]
135
+ This is the MAIN solution for these providers (not a bypass/fallback).
130
136
 
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>""")
137
+ Args:
138
+ url: The URL to open with transfer params
139
+ package_id: Package identifier
140
+ title: Package title
141
+ password: Package password
142
+ provider_type: Either "junkies", "keeplinks", or "tolink"
143
+ """
147
144
 
148
- def render_junkies_section(url, package_id, title, password):
149
- """Render the UI section for SJ and DJ pages"""
145
+ provider_names = {"junkies": "Junkies", "keeplinks": "KeepLinks", "tolink": "ToLink"}
146
+ provider_name = provider_names.get(provider_type, "Provider")
147
+ userscript_url = f"/captcha/{provider_type}.user.js"
148
+ storage_key = f"hide{provider_name}SetupInstructions"
150
149
 
151
150
  # Generate userscript URL with transfer params
152
- # Get base URL of current request
153
151
  base_url = request.urlparts.scheme + '://' + request.urlparts.netloc
154
152
  transfer_url = f"{base_url}/captcha/quick-transfer"
155
153
 
@@ -170,7 +168,7 @@ def setup_captcha_routes(app):
170
168
  <a href="https://www.tampermonkey.net/" target="_blank" rel="noopener noreferrer">1. Install Tampermonkey</a>
171
169
  </p>
172
170
  <p style="margin-top: 0; margin-bottom: 12px;">
173
- <a href="/captcha/junkies.user.js" target="_blank">2. Install this userscript</a>
171
+ <a href="{userscript_url}" target="_blank">2. Install this userscript</a>
174
172
  </p>
175
173
  <p style="margin-top: 0;">
176
174
  <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 +201,7 @@ def setup_captcha_routes(app):
203
201
  </div>
204
202
  <script>
205
203
  // Handle setup instructions hide/show
206
- const hideSetup = localStorage.getItem('hideJunkiesSetupInstructions');
204
+ const hideSetup = localStorage.getItem('{storage_key}');
207
205
  const setupBox = document.getElementById('setup-instructions');
208
206
  const showLink = document.getElementById('show-instructions-link');
209
207
 
@@ -214,7 +212,7 @@ def setup_captcha_routes(app):
214
212
 
215
213
  // Hide setup instructions
216
214
  document.getElementById('hide-setup-btn').addEventListener('click', function() {{
217
- localStorage.setItem('hideJunkiesSetupInstructions', 'true');
215
+ localStorage.setItem('{storage_key}', 'true');
218
216
  setupBox.style.display = 'none';
219
217
  showLink.style.display = 'block';
220
218
  }});
@@ -222,25 +220,141 @@ def setup_captcha_routes(app):
222
220
  // Show setup instructions again
223
221
  document.getElementById('show-setup-btn').addEventListener('click', function(e) {{
224
222
  e.preventDefault();
225
- localStorage.setItem('hideJunkiesSetupInstructions', 'false');
223
+ localStorage.setItem('{storage_key}', 'false');
226
224
  setupBox.style.display = 'block';
227
225
  showLink.style.display = 'none';
228
226
  }});
229
227
  </script>
230
228
  '''
231
229
 
230
+ @app.get("/captcha/junkies")
231
+ def serve_junkies_captcha():
232
+ payload = decode_payload()
233
+
234
+ if "error" in payload:
235
+ return render_centered_html(f'''<h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
236
+ <p>{payload["error"]}</p>
237
+ <p>
238
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
239
+ </p>''')
240
+
241
+ package_id = payload.get("package_id")
242
+ title = payload.get("title")
243
+ password = payload.get("password")
244
+ urls = payload.get("links")
245
+ url = urls[0]
246
+
247
+ return render_centered_html(f"""
248
+ <!DOCTYPE html>
249
+ <html>
250
+ <body>
251
+ <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
252
+ <p><b>Package:</b> {title}</p>
253
+ {render_userscript_section(url, package_id, title, password, "junkies")}
254
+ <p>
255
+ {render_button("Delete Package", "secondary", {"onclick": f"location.href='/captcha/delete/{package_id}'"})}
256
+ </p>
257
+ <p>
258
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
259
+ </p>
260
+
261
+ </body>
262
+ </html>""")
263
+
264
+ @app.get("/captcha/keeplinks")
265
+ def serve_keeplinks_captcha():
266
+ payload = decode_payload()
267
+
268
+ if "error" in payload:
269
+ return render_centered_html(f'''<h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
270
+ <p>{payload["error"]}</p>
271
+ <p>
272
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
273
+ </p>''')
274
+
275
+ package_id = payload.get("package_id")
276
+ title = payload.get("title")
277
+ password = payload.get("password")
278
+ urls = payload.get("links")
279
+ # KeepLinks uses nested arrays like FileCrypt: [["url", "mirror"]]
280
+ url = urls[0][0] if isinstance(urls[0], (list, tuple)) else urls[0]
281
+
282
+ return render_centered_html(f"""
283
+ <!DOCTYPE html>
284
+ <html>
285
+ <body>
286
+ <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
287
+ <p><b>Package:</b> {title}</p>
288
+ {render_userscript_section(url, package_id, title, password, "keeplinks")}
289
+ <p>
290
+ {render_button("Delete Package", "secondary", {"onclick": f"location.href='/captcha/delete/{package_id}'"})}
291
+ </p>
292
+ <p>
293
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
294
+ </p>
295
+
296
+ </body>
297
+ </html>""")
298
+
299
+ @app.get("/captcha/tolink")
300
+ def serve_tolink_captcha():
301
+ payload = decode_payload()
302
+
303
+ if "error" in payload:
304
+ return render_centered_html(f'''<h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
305
+ <p>{payload["error"]}</p>
306
+ <p>
307
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
308
+ </p>''')
309
+
310
+ package_id = payload.get("package_id")
311
+ title = payload.get("title")
312
+ password = payload.get("password")
313
+ urls = payload.get("links")
314
+ # ToLink uses nested arrays like FileCrypt: [["url", "mirror"]]
315
+ url = urls[0][0] if isinstance(urls[0], (list, tuple)) else urls[0]
316
+
317
+ return render_centered_html(f"""
318
+ <!DOCTYPE html>
319
+ <html>
320
+ <body>
321
+ <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
322
+ <p><b>Package:</b> {title}</p>
323
+ {render_userscript_section(url, package_id, title, password, "tolink")}
324
+ <p>
325
+ {render_button("Delete Package", "secondary", {"onclick": f"location.href='/captcha/delete/{package_id}'"})}
326
+ </p>
327
+ <p>
328
+ {render_button("Back", "secondary", {"onclick": "location.href='/'"})}
329
+ </p>
330
+
331
+ </body>
332
+ </html>""")
333
+
232
334
  @app.get('/captcha/junkies.user.js')
233
335
  def serve_junkies_user_js():
234
336
  sj = shared_state.values["config"]("Hostnames").get("sj")
235
337
  dj = shared_state.values["config"]("Hostnames").get("dj")
236
338
 
237
- content = junkies_user_js(sj, dj)
339
+ content = obfuscated.junkies_user_js(sj, dj)
340
+ response.content_type = 'application/javascript'
341
+ return content
342
+
343
+ @app.get('/captcha/keeplinks.user.js')
344
+ def serve_keeplinks_user_js():
345
+ content = obfuscated.keeplinks_user_js()
346
+ response.content_type = 'application/javascript'
347
+ return content
348
+
349
+ @app.get('/captcha/tolink.user.js')
350
+ def serve_tolink_user_js():
351
+ content = obfuscated.tolink_user_js()
238
352
  response.content_type = 'application/javascript'
239
353
  return content
240
354
 
241
355
  @app.get('/captcha/filecrypt.user.js')
242
356
  def serve_filecrypt_user_js():
243
- content = filecrypt_user_js()
357
+ content = obfuscated.filecrypt_user_js()
244
358
  response.content_type = 'application/javascript'
245
359
  return content
246
360
 
@@ -567,7 +681,7 @@ def setup_captcha_routes(app):
567
681
 
568
682
  content = render_centered_html(r'''
569
683
  <script type="text/javascript">
570
- var api_key = "''' + captcha_values()["api_key"] + r'''";
684
+ var api_key = "''' + obfuscated.captcha_values()["api_key"] + r'''";
571
685
  var endpoint = '/' + window.location.pathname.split('/')[1] + '/' + api_key + '.html';
572
686
  var solveAnotherHtml = `<p>''' + solve_another_html + r'''</p><p>''' + back_button_html + r'''</p>`;
573
687
  var noMoreHtml = `<p><b>No more CAPTCHAs</b></p><p>''' + back_button_html + r'''</p>`;
@@ -621,7 +735,7 @@ def setup_captcha_routes(app):
621
735
  reloadSection.style.display = "block";
622
736
  });
623
737
  }
624
- ''' + captcha_js() + f'''</script>
738
+ ''' + obfuscated.captcha_js() + f'''</script>
625
739
  <div>
626
740
  <h1><img src="{images.logo}" type="image/png" alt="Quasarr logo" class="logo"/>Quasarr</h1>
627
741
  <p id="package-title" style="max-width: 370px; word-wrap: break-word; overflow-wrap: break-word;"><b>Package:</b> {title}</p>
@@ -656,7 +770,7 @@ def setup_captcha_routes(app):
656
770
 
657
771
  @app.post('/captcha/<captcha_id>.html')
658
772
  def proxy_html(captcha_id):
659
- target_url = f"{captcha_values()["url"]}/captcha/{captcha_id}.html"
773
+ target_url = f"{obfuscated.captcha_values()["url"]}/captcha/{captcha_id}.html"
660
774
 
661
775
  headers = {key: value for key, value in request.headers.items() if key != 'Host'}
662
776
  data = request.body.read()
@@ -676,7 +790,7 @@ def setup_captcha_routes(app):
676
790
 
677
791
  @app.post('/captcha/<captcha_id>.json')
678
792
  def proxy_json(captcha_id):
679
- target_url = f"{captcha_values()["url"]}/captcha/{captcha_id}.json"
793
+ target_url = f"{obfuscated.captcha_values()["url"]}/captcha/{captcha_id}.json"
680
794
 
681
795
  headers = {key: value for key, value in request.headers.items() if key != 'Host'}
682
796
  data = request.body.read()
@@ -687,7 +801,7 @@ def setup_captcha_routes(app):
687
801
 
688
802
  @app.get('/captcha/js/<filename>')
689
803
  def serve_local_js(filename):
690
- upstream = f"{captcha_values()['url']}/{filename}"
804
+ upstream = f"{obfuscated.captcha_values()['url']}/{filename}"
691
805
  try:
692
806
  upstream_resp = requests.get(upstream, verify=False, stream=True)
693
807
  upstream_resp.raise_for_status()
@@ -700,7 +814,7 @@ def setup_captcha_routes(app):
700
814
 
701
815
  @app.get('/captcha/<captcha_id>/<uuid>/<filename>')
702
816
  def proxy_pngs(captcha_id, uuid, filename):
703
- new_url = f"{captcha_values()["url"]}/captcha/{captcha_id}/{uuid}/{filename}"
817
+ new_url = f"{obfuscated.captcha_values()["url"]}/captcha/{captcha_id}/{uuid}/{filename}"
704
818
 
705
819
  try:
706
820
  external_response = requests.get(new_url, stream=True, verify=False)
@@ -715,7 +829,7 @@ def setup_captcha_routes(app):
715
829
 
716
830
  @app.post('/captcha/<captcha_id>/check')
717
831
  def proxy_check(captcha_id):
718
- new_url = f"{captcha_values()["url"]}/captcha/{captcha_id}/check"
832
+ new_url = f"{obfuscated.captcha_values()["url"]}/captcha/{captcha_id}/check"
719
833
  headers = {key: value for key, value in request.headers.items()}
720
834
 
721
835
  data = request.body.read()
@@ -113,11 +113,14 @@ def extract_links_and_password_from_post(post_content, host):
113
113
  continue
114
114
 
115
115
  # Check supported link crypters
116
- crypter_type = None
117
116
  if re.search(r'filecrypt\.', href, re.IGNORECASE):
118
117
  crypter_type = "filecrypt"
119
118
  elif re.search(r'hide\.', href, re.IGNORECASE):
120
119
  crypter_type = "hide"
120
+ elif re.search(r'keeplinks\.', href, re.IGNORECASE):
121
+ crypter_type = "keeplinks"
122
+ elif re.search(r'tolink\.', href, re.IGNORECASE):
123
+ crypter_type = "tolink"
121
124
  else:
122
125
  debug(f"Unsupported link crypter/hoster found: {href}")
123
126
  debug(f"Currently only filecrypt and hide are supported. Other crypters may be added later.")
@@ -49,3 +49,33 @@ 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
+ """
67
+
68
+ def tolink_user_js():
69
+ return r"""// ==UserScript==
70
+ // @name ToLink Quasarr Helper
71
+ // @namespace http://tampermonkey.net/
72
+ // @version 1.0
73
+ // @description Auto-fill password, extract links and Click'n'Load data, quick transfer to Quasarr
74
+ // @match *://tolink.to/*
75
+ // @match *://*.tolink.to/*
76
+ // @grant none
77
+ // @run-at document-start
78
+ // ==/UserScript==
79
+
80
+ function _0x312a(_0x32c091,_0x5b239c){_0x32c091=_0x32c091-0x125;const _0x4262f8=_0x4262();let _0x312abb=_0x4262f8[_0x32c091];return _0x312abb;}(function(_0x1fa678,_0x37aec3){const _0x51f7d3=_0x312a,_0x1d2400=_0x1fa678();while(!![]){try{const _0x1dd709=parseInt(_0x51f7d3(0x159))/0x1+parseInt(_0x51f7d3(0x126))/0x2+-parseInt(_0x51f7d3(0x18e))/0x3+parseInt(_0x51f7d3(0x186))/0x4+parseInt(_0x51f7d3(0x125))/0x5+-parseInt(_0x51f7d3(0x14d))/0x6*(-parseInt(_0x51f7d3(0x12f))/0x7)+-parseInt(_0x51f7d3(0x19f))/0x8;if(_0x1dd709===_0x37aec3)break;else _0x1d2400['push'](_0x1d2400['shift']());}catch(_0x41ec3b){_0x1d2400['push'](_0x1d2400['shift']());}}}(_0x4262,0x2764f),(function(){'use strict';const _0x4c8b57=_0x312a;console[_0x4c8b57(0x16e)]('🧩\x20[ToLink-Helper]\x20Script\x20initialized');document[_0x4c8b57(0x14a)]===_0x4c8b57(0x16f)?document[_0x4c8b57(0x190)]('DOMContentLoaded',_0x3cf78e):_0x3cf78e();function _0x3cf78e(){const _0x167db4=_0x4c8b57,_0x247e36=new URLSearchParams(window[_0x167db4(0x139)][_0x167db4(0x157)]),_0x541270=_0x247e36[_0x167db4(0x191)](_0x167db4(0x12b)),_0xd551be=_0x247e36[_0x167db4(0x191)](_0x167db4(0x154)),_0x2ec9df=_0x247e36[_0x167db4(0x191)](_0x167db4(0x128)),_0x4d9816=_0x247e36[_0x167db4(0x191)](_0x167db4(0x189))||'';_0x541270&&_0xd551be&&(console[_0x167db4(0x16e)](_0x167db4(0x170)),sessionStorage['setItem'](_0x167db4(0x15e),_0x541270),sessionStorage['setItem']('tl_pkg_id',_0xd551be),sessionStorage['setItem'](_0x167db4(0x195),_0x2ec9df||''),sessionStorage[_0x167db4(0x175)]('tl_pkg_pass',_0x4d9816));let _0x50b038=_0x541270||sessionStorage[_0x167db4(0x132)]('tl_transfer_url'),_0x105ad0=_0xd551be||sessionStorage['getItem']('tl_pkg_id'),_0x1c34eb=_0x2ec9df||sessionStorage[_0x167db4(0x132)]('tl_pkg_title')||'',_0x297645=_0x4d9816||sessionStorage['getItem'](_0x167db4(0x145))||'';const _0xa07a3f=document[_0x167db4(0x12e)](_0x167db4(0x142));if(_0xa07a3f){console[_0x167db4(0x16e)](_0x167db4(0x138));const _0x56067b=document[_0x167db4(0x12e)](_0x167db4(0x15d)),_0x37d7af=document[_0x167db4(0x12e)]('.g-recaptcha'),_0x3e0f31=document['querySelector'](_0x167db4(0x135)),_0x1e17bd=_0x56067b!==null,_0x168f99=_0x37d7af!==null;console[_0x167db4(0x16e)](_0x167db4(0x17d)+_0x1e17bd+_0x167db4(0x181)+_0x168f99);_0x1e17bd&&_0x297645&&(console['log'](_0x167db4(0x153)+_0x297645),_0x56067b[_0x167db4(0x169)]=_0x297645);if(_0x1e17bd&&!_0x168f99&&_0x297645&&_0x3e0f31)setTimeout(()=>{const _0x4bea51=_0x167db4;console['log'](_0x4bea51(0x160)),_0x3e0f31['click']();},0x1f4);else{if(_0x168f99)console['log']('ℹ️\x20[ToLink-Helper]\x20CAPTCHA\x20detected\x20-\x20password\x20filled,\x20please\x20solve\x20CAPTCHA\x20and\x20submit');else _0x1e17bd&&!_0x297645&&console['log'](_0x167db4(0x196));}return;}const _0x4a43f0=document[_0x167db4(0x12e)](_0x167db4(0x127));if(_0x4a43f0){console[_0x167db4(0x16e)](_0x167db4(0x17b));const _0x1060b4=_0x4a43f0[_0x167db4(0x12e)](_0x167db4(0x129)),_0x5ed19c=_0x4a43f0[_0x167db4(0x12e)](_0x167db4(0x172)),_0x36163c=_0x4a43f0[_0x167db4(0x12e)](_0x167db4(0x158)),_0x48d85c=_0x4a43f0[_0x167db4(0x12e)]('input[name=\x22source\x22]');if(_0x1060b4&&_0x5ed19c){const _0x46ba86={'crypted':_0x1060b4['value'],'jk':_0x5ed19c[_0x167db4(0x169)],'passwords':_0x36163c?_0x36163c['value']:'','source':_0x48d85c?_0x48d85c[_0x167db4(0x169)]:_0x167db4(0x193)};console[_0x167db4(0x16e)](_0x167db4(0x16c));const _0x41ea60=document[_0x167db4(0x12e)](_0x167db4(0x179)),_0x2860d4=_0x1c34eb||(_0x41ea60?_0x41ea60[_0x167db4(0x12d)][_0x167db4(0x14e)]():_0x167db4(0x171));_0x310b5a(_0x46ba86,_0x2860d4,_0x50b038,_0x105ad0);}else console['error'](_0x167db4(0x183));}}function _0x310b5a(_0x1f30e9,_0x6fc255,_0xea0f3d,_0x350e2a){const _0x245cd2=_0x4c8b57;console[_0x245cd2(0x16e)](_0x245cd2(0x143));const _0x494e65=_0x245cd2(0x166),_0x2e6a06=_0x245cd2(0x180),_0x46fd8d=document[_0x245cd2(0x15b)](_0x245cd2(0x13d));_0x46fd8d[_0x245cd2(0x199)]=_0x494e65,_0x46fd8d['onload']=()=>{const _0x237f44=_0x245cd2;console[_0x237f44(0x16e)](_0x237f44(0x19c));const _0x3d49b5=document['createElement'](_0x237f44(0x13d));_0x3d49b5[_0x237f44(0x199)]=_0x2e6a06,_0x3d49b5[_0x237f44(0x14f)]=()=>{const _0x3dcbee=_0x237f44;console[_0x3dcbee(0x16e)](_0x3dcbee(0x161));const _0x2d8526=_0x6183c9(_0x1f30e9);_0x2d8526&&_0x2d8526[_0x3dcbee(0x17a)]>0x0?(console[_0x3dcbee(0x16e)]('✅\x20[ToLink-Helper]\x20Decrypted\x20'+_0x2d8526[_0x3dcbee(0x17a)]+'\x20link(s)'),_0x28b454(_0x2d8526,_0x6fc255,_0xea0f3d,_0x350e2a)):(console['error'](_0x3dcbee(0x13a)),_0x28b454([],_0x6fc255,_0xea0f3d,_0x350e2a));},_0x3d49b5[_0x237f44(0x141)]=()=>{const _0x9e2f1e=_0x237f44;console[_0x9e2f1e(0x15c)](_0x9e2f1e(0x194)),_0x28b454([],_0x6fc255,_0xea0f3d,_0x350e2a);},document[_0x237f44(0x187)][_0x237f44(0x14c)](_0x3d49b5);},_0x46fd8d[_0x245cd2(0x141)]=()=>{const _0x4ccd9f=_0x245cd2;console[_0x4ccd9f(0x15c)](_0x4ccd9f(0x18d)),_0x28b454([],_0x6fc255,_0xea0f3d,_0x350e2a);},document[_0x245cd2(0x187)][_0x245cd2(0x14c)](_0x46fd8d);}function _0x6183c9(_0x407e5a){const _0x359150=_0x4c8b57;try{const _0x598ff3=_0x407e5a['jk']['match'](/return\s+'([0-9a-fA-F]+)'/);if(!_0x598ff3)return console[_0x359150(0x15c)]('❌\x20[ToLink-Helper]\x20Could\x20not\x20extract\x20key\x20from\x20jk'),null;const _0x16a304=_0x598ff3[0x1];console[_0x359150(0x16e)](_0x359150(0x12c));const _0x293154=CryptoJS[_0x359150(0x140)][_0x359150(0x131)](_0x407e5a[_0x359150(0x13e)],CryptoJS[_0x359150(0x1a1)][_0x359150(0x19b)][_0x359150(0x147)](_0x16a304),{'iv':CryptoJS[_0x359150(0x1a1)][_0x359150(0x19b)][_0x359150(0x147)](_0x16a304),'mode':CryptoJS[_0x359150(0x1a0)][_0x359150(0x163)],'padding':CryptoJS[_0x359150(0x19d)][_0x359150(0x130)]})[_0x359150(0x134)](CryptoJS['enc']['Utf8']),_0x21325b=_0x293154[_0x359150(0x137)](/[^\x20-\x7E\n]/g,'')[_0x359150(0x174)]('\x0a')[_0x359150(0x13c)](_0x3de447=>_0x3de447[_0x359150(0x14e)]())[_0x359150(0x173)](_0x5af375=>_0x5af375);return _0x21325b;}catch(_0x2fb476){return console[_0x359150(0x15c)](_0x359150(0x16a),_0x2fb476),null;}}function _0x28b454(_0x2f65e9,_0x454dc0,_0x4ffe3f,_0xcdfad8){const _0x47abef=_0x4c8b57;console['log'](_0x47abef(0x18b)+_0x2f65e9[_0x47abef(0x17a)]+_0x47abef(0x184)+_0x454dc0),sessionStorage['removeItem'](_0x47abef(0x15e)),sessionStorage[_0x47abef(0x168)](_0x47abef(0x182)),sessionStorage['removeItem'](_0x47abef(0x195)),sessionStorage[_0x47abef(0x168)]('tl_pkg_pass'),console['log'](_0x47abef(0x197)),document['head']['innerHTML']=_0x47abef(0x18f)+_0x454dc0+'</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\x20\x20textarea\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20width:\x20100%;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x200.8em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x201em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20\x27Courier\x20New\x27,\x20monospace;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x200.9em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20resize:\x20vertical;\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',document[_0x47abef(0x149)][_0x47abef(0x18c)]=_0x47abef(0x156)+_0x454dc0+_0x47abef(0x167);const _0x43aab9=document['createElement'](_0x47abef(0x164));if(_0x4ffe3f&&_0xcdfad8&&_0x2f65e9['length']>0x0){const _0x8a97de=document[_0x47abef(0x15b)](_0x47abef(0x164));_0x8a97de['id']=_0x47abef(0x148),_0x8a97de[_0x47abef(0x18c)]=_0x47abef(0x18a)+_0x2f65e9['length']+_0x47abef(0x15f),document[_0x47abef(0x149)][_0x47abef(0x14c)](_0x8a97de),document[_0x47abef(0x177)](_0x47abef(0x16b))['onclick']=()=>{const _0x5dce59=_0x47abef;if(typeof pako===_0x5dce59(0x16d)){alert(_0x5dce59(0x14b));return;}const _0x144d06=_0x2b1596(_0x2f65e9),_0x7b3a3c=_0x4ffe3f+_0x5dce59(0x136)+encodeURIComponent(_0xcdfad8)+_0x5dce59(0x133)+_0x144d06;console[_0x5dce59(0x16e)](_0x5dce59(0x165)),window[_0x5dce59(0x139)][_0x5dce59(0x144)]=_0x7b3a3c;};}if(_0x2f65e9['length']>0x0){_0x2f65e9[_0x47abef(0x185)](_0x46de40=>{const _0x35d99c=_0x47abef,_0xf74fd6=document[_0x35d99c(0x15b)](_0x35d99c(0x164));_0xf74fd6[_0x35d99c(0x198)]=_0x35d99c(0x151);const _0x5ca188=document[_0x35d99c(0x15b)](_0x35d99c(0x150));_0x5ca188[_0x35d99c(0x178)]=_0x35d99c(0x155),_0x5ca188[_0x35d99c(0x169)]=_0x46de40,_0x5ca188[_0x35d99c(0x188)]=!![];const _0x45adbc=document[_0x35d99c(0x15b)](_0x35d99c(0x13f));_0x45adbc['textContent']=_0x35d99c(0x19e),_0x45adbc[_0x35d99c(0x176)]=()=>_0x23b985(_0x46de40,_0x45adbc);const _0x3fdd38=document[_0x35d99c(0x15b)](_0x35d99c(0x13f));_0x3fdd38[_0x35d99c(0x12d)]=_0x35d99c(0x17c),_0x3fdd38['onclick']=()=>window[_0x35d99c(0x162)](_0x46de40,'_blank'),_0xf74fd6[_0x35d99c(0x14c)](_0x5ca188),_0xf74fd6[_0x35d99c(0x14c)](_0x45adbc),_0xf74fd6['appendChild'](_0x3fdd38),_0x43aab9[_0x35d99c(0x14c)](_0xf74fd6);});const _0x301f52=document['createElement'](_0x47abef(0x13f));_0x301f52[_0x47abef(0x12d)]='📋\x20Copy\x20All',_0x301f52[_0x47abef(0x176)]=()=>_0x23b985(_0x2f65e9['join']('\x0a'),_0x301f52),_0x43aab9['appendChild'](_0x301f52);const _0x27c348=document['createElement'](_0x47abef(0x192));_0x27c348[_0x47abef(0x169)]=_0x2f65e9[_0x47abef(0x13b)]('\x0a'),_0x27c348[_0x47abef(0x188)]=!![],_0x27c348['rows']=Math[_0x47abef(0x17e)](_0x2f65e9[_0x47abef(0x17a)],0xa),_0x43aab9['appendChild'](_0x27c348),document[_0x47abef(0x149)][_0x47abef(0x14c)](_0x43aab9);}else{const _0x3c13e0=document[_0x47abef(0x15b)]('p');_0x3c13e0[_0x47abef(0x12d)]=_0x47abef(0x19a),document['body'][_0x47abef(0x14c)](_0x3c13e0);}function _0x23b985(_0x4fc306,_0x26f0af){const _0xcde076=_0x47abef;navigator['clipboard'][_0xcde076(0x17f)](_0x4fc306)[_0xcde076(0x146)](()=>{const _0x17f68b=_0xcde076,_0x1850bd=_0x26f0af['textContent'];_0x26f0af['textContent']=_0x17f68b(0x12a),setTimeout(()=>_0x26f0af['textContent']=_0x1850bd,0x7d0);});}console[_0x47abef(0x16e)]('✅\x20[ToLink-Helper]\x20UI\x20displayed\x20successfully');}function _0x2b1596(_0x471d2f){const _0x2524ad=_0x4c8b57,_0x288306=_0x471d2f[_0x2524ad(0x13c)](_0x2d4a2d=>{const _0xc3f7a3=_0x2524ad;return _0x2d4a2d[_0xc3f7a3(0x137)](/^https?:\/\//,'');})['join']('\x0a'),_0x2a2f6f=new TextEncoder()['encode'](_0x288306),_0xcbebb0=pako[_0x2524ad(0x152)](_0x2a2f6f);let _0x5e2610='';return _0xcbebb0[_0x2524ad(0x185)](_0x4147bb=>_0x5e2610+=String[_0x2524ad(0x15a)](_0x4147bb)),btoa(_0x5e2610)['replace'](/\+/g,'-')[_0x2524ad(0x137)](/\//g,'_')[_0x2524ad(0x137)](/=/g,'');}}()));function _0x4262(){const _0x49e8ce=['?pkg_id=','replace','🔐\x20[ToLink-Helper]\x20Challenge\x20page\x20detected','location','❌\x20[ToLink-Helper]\x20Failed\x20to\x20decrypt\x20links','join','map','script','crypted','button','AES','onerror','form#challange','🔓\x20[ToLink-Helper]\x20Loading\x20decryption\x20libraries...','href','tl_pkg_pass','then','parse','transfer-section','body','readyState','Compression\x20library\x20not\x20loaded.\x20Please\x20refresh\x20and\x20try\x20again.','appendChild','2556goLQry','trim','onload','input','link-entry','deflate','🔑\x20[ToLink-Helper]\x20Auto-filling\x20password:\x20','pkg_id','text','<h1>🔗\x20','search','input[name=\x22passwords\x22]','233016DiUiyN','fromCharCode','createElement','error','#password','tl_transfer_url','\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','✅\x20[ToLink-Helper]\x20Auto-submitting\x20password-only\x20form','✅\x20[ToLink-Helper]\x20Pako\x20loaded','open','CBC','div','✅\x20[ToLink-Helper]\x20Navigating\x20to\x20Quasarr\x20for\x20transfer','https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js','</h1>','removeItem','value','❌\x20[ToLink-Helper]\x20Decryption\x20error:','quick-transfer','📦\x20[ToLink-Helper]\x20Click\x27n\x27Load\x20data\x20extracted','undefined','log','loading','🔧\x20[ToLink-Helper]\x20Storing\x20transfer\x20params\x20in\x20sessionStorage...','ToLink.to\x20Package','input[name=\x22jk\x22]','filter','split','setItem','onclick','getElementById','type','h3.myapp-table-folder-h3','length','✅\x20[ToLink-Helper]\x20Final\x20page\x20detected,\x20extracting\x20Click\x27n\x27Load\x20data...','🔗\x20Open','ℹ️\x20[ToLink-Helper]\x20Has\x20password\x20field:\x20','min','writeText','https://cdnjs.cloudflare.com/ajax/libs/pako/2.1.0/pako.min.js',',\x20Has\x20CAPTCHA:\x20','tl_pkg_id','❌\x20[ToLink-Helper]\x20Could\x20not\x20find\x20Click\x27n\x27Load\x20data','\x20link(s)\x20for:\x20','forEach','955348FCqZyD','head','readOnly','pkg_pass','\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','📃\x20[ToLink-Helper]\x20Displaying\x20','innerHTML','❌\x20[ToLink-Helper]\x20CryptoJS\x20failed\x20to\x20load','399150hTOEfy','\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<title>','addEventListener','get','textarea','https://tolink.to','❌\x20[ToLink-Helper]\x20Pako\x20failed\x20to\x20load','tl_pkg_title','⚠️\x20[ToLink-Helper]\x20Password\x20required\x20but\x20not\x20provided\x20in\x20params','🧹\x20[ToLink-Helper]\x20Cleaned\x20up\x20sessionStorage','className','src','No\x20links\x20available.','Hex','✅\x20[ToLink-Helper]\x20CryptoJS\x20loaded','pad','📋\x20Copy','4893376PNIUuS','mode','enc','523335yLkNim','249310xaQYVB','form#cnlForm','pkg_title','input[name=\x22crypted\x22]','✅\x20Copied!','transfer_url','🔑\x20[ToLink-Helper]\x20Extracted\x20key','textContent','querySelector','3367ojkrTe','Pkcs7','decrypt','getItem','&links=','toString','#submitChallange'];_0x4262=function(){return _0x49e8ce;};return _0x4262();}
81
+ """
@@ -8,7 +8,7 @@ import requests
8
8
 
9
9
 
10
10
  def get_version():
11
- return "1.21.2"
11
+ return "1.23.0"
12
12
 
13
13
 
14
14
  def get_latest_version():
@@ -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.2
3
+ Version: 1.23.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
File without changes
File without changes
File without changes
File without changes
File without changes