quasarr 0.1.5__tar.gz → 1.22.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 (102) hide show
  1. quasarr-1.22.0/PKG-INFO +306 -0
  2. quasarr-1.22.0/README.md +279 -0
  3. quasarr-1.22.0/quasarr/__init__.py +467 -0
  4. quasarr-1.22.0/quasarr/api/__init__.py +187 -0
  5. quasarr-1.22.0/quasarr/api/arr/__init__.py +387 -0
  6. quasarr-1.22.0/quasarr/api/captcha/__init__.py +1139 -0
  7. quasarr-1.22.0/quasarr/api/config/__init__.py +23 -0
  8. quasarr-1.22.0/quasarr/api/sponsors_helper/__init__.py +166 -0
  9. quasarr-1.22.0/quasarr/api/statistics/__init__.py +196 -0
  10. quasarr-1.22.0/quasarr/downloads/__init__.py +333 -0
  11. quasarr-1.22.0/quasarr/downloads/linkcrypters/al.py +237 -0
  12. quasarr-1.22.0/quasarr/downloads/linkcrypters/filecrypt.py +444 -0
  13. quasarr-1.22.0/quasarr/downloads/linkcrypters/hide.py +123 -0
  14. quasarr-1.22.0/quasarr/downloads/packages/__init__.py +476 -0
  15. quasarr-1.22.0/quasarr/downloads/sources/al.py +697 -0
  16. quasarr-1.22.0/quasarr/downloads/sources/by.py +106 -0
  17. quasarr-1.22.0/quasarr/downloads/sources/dd.py +76 -0
  18. quasarr-1.22.0/quasarr/downloads/sources/dj.py +7 -0
  19. quasarr-1.22.0/quasarr/downloads/sources/dl.py +198 -0
  20. quasarr-1.22.0/quasarr/downloads/sources/dt.py +66 -0
  21. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/downloads/sources/dw.py +14 -7
  22. quasarr-1.22.0/quasarr/downloads/sources/he.py +112 -0
  23. quasarr-1.22.0/quasarr/downloads/sources/mb.py +47 -0
  24. quasarr-1.22.0/quasarr/downloads/sources/nk.py +54 -0
  25. quasarr-1.22.0/quasarr/downloads/sources/nx.py +105 -0
  26. quasarr-1.22.0/quasarr/downloads/sources/sf.py +159 -0
  27. quasarr-1.22.0/quasarr/downloads/sources/sj.py +7 -0
  28. quasarr-1.22.0/quasarr/downloads/sources/sl.py +90 -0
  29. quasarr-1.22.0/quasarr/downloads/sources/wd.py +110 -0
  30. quasarr-1.22.0/quasarr/downloads/sources/wx.py +127 -0
  31. quasarr-1.22.0/quasarr/providers/cloudflare.py +204 -0
  32. quasarr-1.22.0/quasarr/providers/html_images.py +22 -0
  33. quasarr-1.22.0/quasarr/providers/html_templates.py +241 -0
  34. quasarr-1.22.0/quasarr/providers/imdb_metadata.py +142 -0
  35. quasarr-1.22.0/quasarr/providers/log.py +19 -0
  36. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/providers/myjd_api.py +201 -40
  37. quasarr-1.22.0/quasarr/providers/notifications.py +124 -0
  38. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/providers/obfuscated.py +50 -0
  39. quasarr-1.22.0/quasarr/providers/sessions/al.py +286 -0
  40. quasarr-1.22.0/quasarr/providers/sessions/dd.py +78 -0
  41. quasarr-1.22.0/quasarr/providers/sessions/dl.py +175 -0
  42. quasarr-1.22.0/quasarr/providers/sessions/nx.py +76 -0
  43. quasarr-1.22.0/quasarr/providers/shared_state.py +842 -0
  44. quasarr-1.22.0/quasarr/providers/statistics.py +154 -0
  45. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/providers/version.py +60 -1
  46. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/providers/web_server.py +1 -1
  47. quasarr-1.22.0/quasarr/search/__init__.py +162 -0
  48. quasarr-1.22.0/quasarr/search/sources/__init__.py +0 -0
  49. quasarr-1.22.0/quasarr/search/sources/al.py +448 -0
  50. quasarr-1.22.0/quasarr/search/sources/by.py +204 -0
  51. quasarr-1.22.0/quasarr/search/sources/dd.py +135 -0
  52. quasarr-1.22.0/quasarr/search/sources/dj.py +213 -0
  53. quasarr-1.22.0/quasarr/search/sources/dl.py +354 -0
  54. quasarr-1.22.0/quasarr/search/sources/dt.py +265 -0
  55. quasarr-1.22.0/quasarr/search/sources/dw.py +214 -0
  56. quasarr-1.22.0/quasarr/search/sources/fx.py +223 -0
  57. quasarr-1.22.0/quasarr/search/sources/he.py +196 -0
  58. quasarr-1.22.0/quasarr/search/sources/mb.py +195 -0
  59. quasarr-1.22.0/quasarr/search/sources/nk.py +188 -0
  60. quasarr-1.22.0/quasarr/search/sources/nx.py +197 -0
  61. quasarr-1.22.0/quasarr/search/sources/sf.py +374 -0
  62. quasarr-1.22.0/quasarr/search/sources/sj.py +213 -0
  63. quasarr-1.22.0/quasarr/search/sources/sl.py +246 -0
  64. quasarr-1.22.0/quasarr/search/sources/wd.py +208 -0
  65. quasarr-1.22.0/quasarr/search/sources/wx.py +337 -0
  66. quasarr-1.22.0/quasarr/storage/__init__.py +0 -0
  67. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/storage/config.py +39 -10
  68. quasarr-1.22.0/quasarr/storage/setup.py +466 -0
  69. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr/storage/sqlite_database.py +6 -1
  70. quasarr-1.22.0/quasarr.egg-info/PKG-INFO +306 -0
  71. quasarr-1.22.0/quasarr.egg-info/SOURCES.txt +81 -0
  72. quasarr-1.22.0/quasarr.egg-info/requires.txt +6 -0
  73. {quasarr-0.1.5 → quasarr-1.22.0}/setup.py +1 -1
  74. quasarr-0.1.5/PKG-INFO +0 -81
  75. quasarr-0.1.5/README.md +0 -63
  76. quasarr-0.1.5/quasarr/__init__.py +0 -193
  77. quasarr-0.1.5/quasarr/arr/__init__.py +0 -428
  78. quasarr-0.1.5/quasarr/captcha_solver/__init__.py +0 -284
  79. quasarr-0.1.5/quasarr/downloads/__init__.py +0 -270
  80. quasarr-0.1.5/quasarr/downloads/sources/nx.py +0 -146
  81. quasarr-0.1.5/quasarr/providers/html_templates.py +0 -134
  82. quasarr-0.1.5/quasarr/providers/imdb_metadata.py +0 -37
  83. quasarr-0.1.5/quasarr/providers/notifications.py +0 -36
  84. quasarr-0.1.5/quasarr/providers/shared_state.py +0 -265
  85. quasarr-0.1.5/quasarr/search/__init__.py +0 -33
  86. quasarr-0.1.5/quasarr/search/sources/dw.py +0 -187
  87. quasarr-0.1.5/quasarr/search/sources/fx.py +0 -167
  88. quasarr-0.1.5/quasarr/search/sources/nx.py +0 -143
  89. quasarr-0.1.5/quasarr/storage/setup.py +0 -294
  90. quasarr-0.1.5/quasarr.egg-info/PKG-INFO +0 -81
  91. quasarr-0.1.5/quasarr.egg-info/SOURCES.txt +0 -35
  92. quasarr-0.1.5/quasarr.egg-info/requires.txt +0 -5
  93. {quasarr-0.1.5 → quasarr-1.22.0}/LICENSE +0 -0
  94. {quasarr-0.1.5/quasarr/downloads/sources → quasarr-1.22.0/quasarr/downloads/linkcrypters}/__init__.py +0 -0
  95. {quasarr-0.1.5/quasarr/providers → quasarr-1.22.0/quasarr/downloads/sources}/__init__.py +0 -0
  96. {quasarr-0.1.5/quasarr/search/sources → quasarr-1.22.0/quasarr/providers}/__init__.py +0 -0
  97. {quasarr-0.1.5/quasarr/storage → quasarr-1.22.0/quasarr/providers/sessions}/__init__.py +0 -0
  98. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr.egg-info/dependency_links.txt +0 -0
  99. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr.egg-info/entry_points.txt +0 -0
  100. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr.egg-info/not-zip-safe +0 -0
  101. {quasarr-0.1.5 → quasarr-1.22.0}/quasarr.egg-info/top_level.txt +0 -0
  102. {quasarr-0.1.5 → quasarr-1.22.0}/setup.cfg +0 -0
@@ -0,0 +1,306 @@
1
+ Metadata-Version: 2.4
2
+ Name: quasarr
3
+ Version: 1.22.0
4
+ Summary: Quasarr connects JDownloader with Radarr, Sonarr and LazyLibrarian. It also decrypts links protected by CAPTCHAs.
5
+ Home-page: https://github.com/rix1337/Quasarr
6
+ Author: rix1337
7
+ Author-email:
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Operating System :: OS Independent
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: beautifulsoup4>=4.14.2
14
+ Requires-Dist: bottle>=0.13.4
15
+ Requires-Dist: dukpy>=0.5.0
16
+ Requires-Dist: pillow>=12.0.0
17
+ Requires-Dist: pycryptodomex>=3.23.0
18
+ Requires-Dist: requests>=2.32.5
19
+ Dynamic: author
20
+ Dynamic: classifier
21
+ Dynamic: description
22
+ Dynamic: description-content-type
23
+ Dynamic: home-page
24
+ Dynamic: license-file
25
+ Dynamic: requires-dist
26
+ Dynamic: summary
27
+
28
+ #
29
+
30
+ <img src="https://raw.githubusercontent.com/rix1337/Quasarr/main/Quasarr.png" data-canonical-src="https://raw.githubusercontent.com/rix1337/Quasarr/main/Quasarr.png" width="64" height="64" />
31
+
32
+ Quasarr connects JDownloader with Radarr, Sonarr and LazyLibrarian. It also decrypts links protected by CAPTCHAs.
33
+
34
+ [![PyPI version](https://badge.fury.io/py/quasarr.svg)](https://badge.fury.io/py/quasarr)
35
+ [![Discord](https://img.shields.io/discord/1075348594225315891)](https://discord.gg/eM4zA2wWQb)
36
+ [![GitHub Sponsorship](https://img.shields.io/badge/support-me-red.svg)](https://github.com/users/rix1337/sponsorship)
37
+
38
+ Quasarr pretends to be both `Newznab Indexer` and `SABnzbd client`. Therefore, do not try to use it with real usenet
39
+ indexers or download clients. It simply does not know what NZB or torrent files are.
40
+
41
+ Quasarr includes a solution to quickly and easily decrypt protected links.
42
+ [Active monthly Sponsors get access to SponsorsHelper to do so automatically.](https://github.com/rix1337/Quasarr?tab=readme-ov-file#sponsorshelper)
43
+ Alternatively, follow the link from the console output (or discord notification) to solve CAPTCHAs manually.
44
+ Quasarr will confidently handle the rest.
45
+
46
+ # Instructions
47
+ 1. Set up and run [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) 3.4.4 or later.
48
+ 2. Set up and run [JDownloader 2](https://jdownloader.org/download/index).
49
+ 3. Follow the next steps.
50
+
51
+ ---
52
+
53
+ ## FlareSolverr
54
+ 1. Ensure your running FlareSolverr is reachable by Quasarr.
55
+ 2. Provide your FlareSolverr URL to Quasarr during the setup process.
56
+ 3. The full URL must include the version path, e.g., `http://192.168.1.1:8191/v1`.
57
+
58
+ ---
59
+
60
+ ## Quasarr
61
+
62
+ Tell Quasarr which sites to search for releases. It requires at least one valid source to start up.
63
+
64
+ > - By default, Quasarr does **not** know which sites to scrape for download links.
65
+ > - The setup will guide you through the process of providing valid hostnames for Quasarr to scrape.
66
+ > - Do **not** ask for help here if you do not know which hostnames to use. Picking them is solely your responsibility.
67
+ > - You may check sites like [Pastebin](https://pastebin.com/search?q=hostnames+quasarr) for user‑submitted suggestions.
68
+
69
+ ---
70
+
71
+ ## JDownloader
72
+
73
+ 1. Ensure your running JDownloader is connected to the My JDownloader service.
74
+ 2. Provide your [My‑JDownloader‑Credentials](https://my.jdownloader.org) to Quasarr during the setup process.
75
+
76
+ > - Consider setting up a fresh JDownloader before you begin.
77
+ > - JDownloader must be running and available to Quasarr.
78
+ > - Quasarr will modify JDownloader’s settings so downloads can be handled by Radarr/Sonarr/LazyLibrarian.
79
+ > - If using Docker, ensure that JDownloader’s download path is available to Radarr/Sonarr/LazyLibrarian with **exactly the same** internal and external path mapping (matching only the external path is not enough).
80
+
81
+ ---
82
+
83
+ ## Radarr / Sonarr
84
+
85
+ Set up Quasarr as a **Newznab Indexer** and **SABnzbd Download Client**:
86
+
87
+ 1. **URL**: Use the `URL` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
88
+ 2. **API Key**: Use the `API Key` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
89
+ 3. Leave all other settings at their defaults.
90
+
91
+ > **Important notice for Sonarr**
92
+ > - Ensure all shows (including anime) are set to the **Standard** series type.
93
+ > - Quasarr will never find releases for shows set to **Anime / Absolute**.
94
+
95
+ ---
96
+
97
+ ## LazyLibrarian
98
+
99
+ > **Important notice**
100
+ > - This feature is experimental and may not work as expected.
101
+ > - Quasarr cannot help you with metadata issues, missing covers, or other LazyLibrarian problems.
102
+ > - Please report issues when one of your hostnames yields results through their website, but not in LazyLibrarian.
103
+
104
+ Set up Quasarr as a **SABnzbd+ Downloader**
105
+
106
+ 1. **SABnzbd URL/Port**: Use port and host parts from `URL` found in the **API Information** section of the console output (or copy it from the Quasarr web UI).
107
+ 2. **SABnzbd API Key**: Use the `API Key` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
108
+ 3. **SABnzbd Category**: Use `docs` to ensure LazyLibrarian does not interfere with Radarr/Sonarr.
109
+ 4. Press `Test SABnzbd` to verify the connection, then `Save changes`.
110
+
111
+ Set up Quasarr as a **Newznab Provider**:
112
+ 1. **Newznab URL**: Use the `URL` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
113
+ 2. **Newznab API** Use the `API Key` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
114
+ 3. Press `Test` to verify the connection, then `Save changes`.
115
+
116
+ Fix the `Importing` settings:
117
+ 1. Check `Enable OpenLibrary api for book/author information`
118
+ 2. Select `OpenLibrary` below `Primary Information Source`
119
+ 2. Under `Import languages` add `, Unknown` (and for German users: `, de, ger, de-DE`).
120
+
121
+ Fix the `Processing` settings:
122
+ 1. Under `Folders` add the full Quasarr download path, typically `/downloads/Quasarr/`
123
+ 2. If you do not do this, processing after the download will fail.
124
+
125
+
126
+
127
+ ---
128
+
129
+ ## Advanced Settings
130
+
131
+ To restrict results to a specific mirror, add the mirror name to the Newznab/indexer URL.
132
+ > **Example:** Appending `/api/dropbox/` will only return releases where `dropbox` is explicitly mentioned in a link.
133
+ > **Caution:** If a mirror is not available at a hostname, the release will be ignored or the download will fail. Use this option carefully.
134
+
135
+ To see download status information in Radarr/Sonarr
136
+ 1. Open `Activity` → `Queue` → `Options`
137
+ 2. Enable `Release Title`
138
+
139
+ # Docker
140
+
141
+ It is highly recommended to run the latest docker image with all optional variables set.
142
+
143
+ ```
144
+ docker run -d \
145
+ --name="Quasarr" \
146
+ -p port:8080 \
147
+ -v /path/to/config/:/config:rw \
148
+ -e 'INTERNAL_ADDRESS'='http://192.168.0.1:8080' \
149
+ -e 'EXTERNAL_ADDRESS'='https://foo.bar/' \
150
+ -e 'DISCORD'='https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN' \
151
+ -e 'HOSTNAMES'='https://pastebin.com/raw/eX4Mpl3'
152
+ -e 'SILENT'='True' \
153
+ -e 'DEBUG'='' \
154
+ -e 'TZ'='Europe/Berlin' \
155
+ ghcr.io/rix1337/quasarr:latest
156
+ ```
157
+
158
+ * `INTERNAL_ADDRESS` is required so Radarr/Sonarr/LazyLibrarian can reach Quasarr. **Must** include port!
159
+ * `EXTERNAL_ADDRESS` is optional and helpful if using a reverse proxy. Always protect external access with basic auth!
160
+ * `DISCORD` is optional and must be a valid Discord webhook URL.
161
+ * `HOSTNAMES` is optional and allows skipping the manual hostname step during setup.
162
+ * Must be a publicly available `HTTP` or `HTTPs` link
163
+ * Must be a raw `.ini` / text file (not HTML or JSON)
164
+ * Must contain at least one valid Hostname per line `ab = xyz`
165
+ * `SILENT` is optional and silences all discord notifications except for error messages from SponsorsHelper if `True`.
166
+ * `DEBUG` is optional and enables debug logging if `True`.
167
+ * `TZ` is optional, wrong timezone can cause HTTPS/SSL issues
168
+
169
+ # Manual setup
170
+
171
+ Use this only in case you can't run the docker image.
172
+
173
+ `pip install quasarr`
174
+
175
+ * Requires Python 3.12 or later
176
+ * Requires [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr)
177
+ * Requires [JDownloader 2](https://jdownloader.org/download/index) with [My JDownloader](https://my.jdownloader.org/)
178
+
179
+ ```
180
+ --port=8080
181
+ --discord=https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN
182
+ --external_address=https://foo.bar/
183
+ --hostnames=https://pastebin.com/raw/eX4Mpl3
184
+ ```
185
+
186
+ * `--discord` see `DISCORD`docker variable
187
+ * `--external_address` see `EXTERNAL_ADDRESS`docker variable
188
+ * `--hostnames` see `HOSTNAMES`docker variable
189
+
190
+ # Philosophy
191
+
192
+ Complexity is the killer of small projects like this one. It must be fought at all cost!
193
+
194
+ We will not waste precious time on features that will slow future development cycles down.
195
+ Most feature requests can be satisfied by:
196
+
197
+ - Existing settings in Radarr/Sonarr/LazyLibrarian
198
+ - Existing settings in JDownloader
199
+ - Existing tools from the *arr ecosystem that integrate directly with Radarr/Sonarr/LazyLibrarian
200
+
201
+ # Roadmap
202
+
203
+ - Assume there are zero known
204
+ issues [unless you find one or more open issues in this repository](https://github.com/rix1337/Quasarr/issues).
205
+ - Still having an issue? Provide a detailed report [here](https://github.com/rix1337/Quasarr/issues/new/choose)!
206
+ - There are no hostname integrations in active development unless you see an open pull request
207
+ [here](https://github.com/rix1337/Quasarr/pulls).
208
+ - Pull requests are welcome. Especially for popular hostnames.
209
+ - Always reach out on Discord before starting work on a new feature to prevent waste of time.
210
+ - Please follow the existing code style and project structure.
211
+ - Anti-bot measures must be circumvented fully by Quasarr. Thus you will need to provide a working solution for new
212
+ CAPTCHA types by integrating it in the Quasarr Web UI.
213
+ - Please provide proof of functionality (screenshots/examples) when submitting your pull request.
214
+
215
+ # SponsorsHelper
216
+
217
+ <img src="https://imgur.com/iHBqLwT.png" width="64" height="64" />
218
+
219
+ SponsorsHelper is a Docker image that solves CAPTCHAs and decrypts links for Quasarr.
220
+ Image access is limited to [active monthly GitHub sponsors](https://github.com/users/rix1337/sponsorship).
221
+
222
+ [![Github Sponsorship](https://img.shields.io/badge/support-me-red.svg)](https://github.com/users/rix1337/sponsorship)
223
+
224
+ ---
225
+
226
+ ## 🔑 GitHub Token Setup
227
+
228
+ 1. Start your [sponsorship](https://github.com/users/rix1337/sponsorship) first.
229
+ 2. Open [GitHub Classic Token Settings](https://github.com/settings/tokens/new?type=classic)
230
+ 3. Name it (e.g., `SponsorsHelper`) and choose unlimited expiration
231
+ 4. Enable these scopes:
232
+ - `read:packages`
233
+ - `read:user`
234
+ - `read:org`
235
+ 5. Click **Generate token** and copy it for the next steps
236
+
237
+ ---
238
+
239
+ ## 🐋 Docker Login
240
+
241
+ ```bash
242
+ echo "GITHUB_TOKEN" | docker login ghcr.io -u USERNAME --password-stdin
243
+ ````
244
+
245
+ * `USERNAME` → your GitHub username
246
+ * `GITHUB_TOKEN` → the token you just created
247
+
248
+ ---
249
+
250
+ ⚠️ **Before logging in, the image will not download.**
251
+
252
+ ---
253
+
254
+ ## ▶️ Run SponsorsHelper
255
+
256
+ ```bash
257
+ docker run -d \
258
+ --name='SponsorsHelper' \
259
+ -e 'QUASARR_URL'='http://192.168.0.1:8080' \
260
+ -e 'DEATHBYCAPTCHA_TOKEN'='2FMum5zuDBxMmbXDIsADnllEFl73bomydIpzo7...' \
261
+ -e 'GITHUB_TOKEN'='ghp_123.....456789' \
262
+ -e 'FLARESOLVERR_URL'='http://10.10.0.1:8191/v1' \
263
+ -e 'NX_USER'='your_nx_username' \
264
+ -e 'NX_PASS'='your_nx_password' \
265
+ -e 'JUNKIES_USER'='your_junkies_username' \
266
+ -e 'JUNKIES_PASS'='your_junkies_password' \
267
+ -e 'JUNKIES_HOSTER'='your_desired_hoster' \
268
+ ghcr.io/rix1337-sponsors/docker/helper:latest
269
+ ```
270
+
271
+ ### Required Parameters
272
+
273
+ * `QUASARR_URL` → Local URL of Quasarr
274
+ * `DEATHBYCAPTCHA_TOKEN` → [DeathByCaptcha](https://deathbycaptcha.com/register?refid=6184288242b) account token
275
+ * `GITHUB_TOKEN` → Classic GitHub PAT with the scopes listed above
276
+ * `FLARESOLVERR_URL` → Local URL of [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) - required!
277
+ * `NX_USER` / `NX_PASS` → NX account credentials
278
+ * `JUNKIES_USER` / `JUNKIES_PASS` → Junkies account credentials
279
+ * `JUNKIES_HOSTER` → Preferred hoster for Junkies links
280
+ ---
281
+
282
+ ⚠️ **Without a valid GitHub token linked to an active sponsorship, the image will not run.**
283
+
284
+ ---
285
+
286
+ # Development Setup for Pull Requests
287
+
288
+ To test your changes before submitting a pull request:
289
+
290
+ **Run Quasarr with the `--internal_address` parameter:**
291
+
292
+ ```bash
293
+ python Quasarr.py --internal_address=http://<host-ip>:<port>
294
+ ```
295
+
296
+ Replace `<host-ip>` and `<port>` with the scheme, IP, and port of your host machine.
297
+ The `--internal_address` parameter is **mandatory**.
298
+
299
+ **Start the required services using the `dev-services-compose.yml` file:**
300
+
301
+ ```bash
302
+ CONFIG_VOLUMES=/path/to/config docker-compose -f docker/dev-services-compose.yml up
303
+ ```
304
+
305
+ Replace `/path/to/config` with your desired configuration location.
306
+ The `CONFIG_VOLUMES` environment variable is **mandatory**.
@@ -0,0 +1,279 @@
1
+ #
2
+
3
+ <img src="https://raw.githubusercontent.com/rix1337/Quasarr/main/Quasarr.png" data-canonical-src="https://raw.githubusercontent.com/rix1337/Quasarr/main/Quasarr.png" width="64" height="64" />
4
+
5
+ Quasarr connects JDownloader with Radarr, Sonarr and LazyLibrarian. It also decrypts links protected by CAPTCHAs.
6
+
7
+ [![PyPI version](https://badge.fury.io/py/quasarr.svg)](https://badge.fury.io/py/quasarr)
8
+ [![Discord](https://img.shields.io/discord/1075348594225315891)](https://discord.gg/eM4zA2wWQb)
9
+ [![GitHub Sponsorship](https://img.shields.io/badge/support-me-red.svg)](https://github.com/users/rix1337/sponsorship)
10
+
11
+ Quasarr pretends to be both `Newznab Indexer` and `SABnzbd client`. Therefore, do not try to use it with real usenet
12
+ indexers or download clients. It simply does not know what NZB or torrent files are.
13
+
14
+ Quasarr includes a solution to quickly and easily decrypt protected links.
15
+ [Active monthly Sponsors get access to SponsorsHelper to do so automatically.](https://github.com/rix1337/Quasarr?tab=readme-ov-file#sponsorshelper)
16
+ Alternatively, follow the link from the console output (or discord notification) to solve CAPTCHAs manually.
17
+ Quasarr will confidently handle the rest.
18
+
19
+ # Instructions
20
+ 1. Set up and run [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) 3.4.4 or later.
21
+ 2. Set up and run [JDownloader 2](https://jdownloader.org/download/index).
22
+ 3. Follow the next steps.
23
+
24
+ ---
25
+
26
+ ## FlareSolverr
27
+ 1. Ensure your running FlareSolverr is reachable by Quasarr.
28
+ 2. Provide your FlareSolverr URL to Quasarr during the setup process.
29
+ 3. The full URL must include the version path, e.g., `http://192.168.1.1:8191/v1`.
30
+
31
+ ---
32
+
33
+ ## Quasarr
34
+
35
+ Tell Quasarr which sites to search for releases. It requires at least one valid source to start up.
36
+
37
+ > - By default, Quasarr does **not** know which sites to scrape for download links.
38
+ > - The setup will guide you through the process of providing valid hostnames for Quasarr to scrape.
39
+ > - Do **not** ask for help here if you do not know which hostnames to use. Picking them is solely your responsibility.
40
+ > - You may check sites like [Pastebin](https://pastebin.com/search?q=hostnames+quasarr) for user‑submitted suggestions.
41
+
42
+ ---
43
+
44
+ ## JDownloader
45
+
46
+ 1. Ensure your running JDownloader is connected to the My JDownloader service.
47
+ 2. Provide your [My‑JDownloader‑Credentials](https://my.jdownloader.org) to Quasarr during the setup process.
48
+
49
+ > - Consider setting up a fresh JDownloader before you begin.
50
+ > - JDownloader must be running and available to Quasarr.
51
+ > - Quasarr will modify JDownloader’s settings so downloads can be handled by Radarr/Sonarr/LazyLibrarian.
52
+ > - If using Docker, ensure that JDownloader’s download path is available to Radarr/Sonarr/LazyLibrarian with **exactly the same** internal and external path mapping (matching only the external path is not enough).
53
+
54
+ ---
55
+
56
+ ## Radarr / Sonarr
57
+
58
+ Set up Quasarr as a **Newznab Indexer** and **SABnzbd Download Client**:
59
+
60
+ 1. **URL**: Use the `URL` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
61
+ 2. **API Key**: Use the `API Key` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
62
+ 3. Leave all other settings at their defaults.
63
+
64
+ > **Important notice for Sonarr**
65
+ > - Ensure all shows (including anime) are set to the **Standard** series type.
66
+ > - Quasarr will never find releases for shows set to **Anime / Absolute**.
67
+
68
+ ---
69
+
70
+ ## LazyLibrarian
71
+
72
+ > **Important notice**
73
+ > - This feature is experimental and may not work as expected.
74
+ > - Quasarr cannot help you with metadata issues, missing covers, or other LazyLibrarian problems.
75
+ > - Please report issues when one of your hostnames yields results through their website, but not in LazyLibrarian.
76
+
77
+ Set up Quasarr as a **SABnzbd+ Downloader**
78
+
79
+ 1. **SABnzbd URL/Port**: Use port and host parts from `URL` found in the **API Information** section of the console output (or copy it from the Quasarr web UI).
80
+ 2. **SABnzbd API Key**: Use the `API Key` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
81
+ 3. **SABnzbd Category**: Use `docs` to ensure LazyLibrarian does not interfere with Radarr/Sonarr.
82
+ 4. Press `Test SABnzbd` to verify the connection, then `Save changes`.
83
+
84
+ Set up Quasarr as a **Newznab Provider**:
85
+ 1. **Newznab URL**: Use the `URL` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
86
+ 2. **Newznab API** Use the `API Key` from the **API Information** section of the console output (or copy it from the Quasarr web UI).
87
+ 3. Press `Test` to verify the connection, then `Save changes`.
88
+
89
+ Fix the `Importing` settings:
90
+ 1. Check `Enable OpenLibrary api for book/author information`
91
+ 2. Select `OpenLibrary` below `Primary Information Source`
92
+ 2. Under `Import languages` add `, Unknown` (and for German users: `, de, ger, de-DE`).
93
+
94
+ Fix the `Processing` settings:
95
+ 1. Under `Folders` add the full Quasarr download path, typically `/downloads/Quasarr/`
96
+ 2. If you do not do this, processing after the download will fail.
97
+
98
+
99
+
100
+ ---
101
+
102
+ ## Advanced Settings
103
+
104
+ To restrict results to a specific mirror, add the mirror name to the Newznab/indexer URL.
105
+ > **Example:** Appending `/api/dropbox/` will only return releases where `dropbox` is explicitly mentioned in a link.
106
+ > **Caution:** If a mirror is not available at a hostname, the release will be ignored or the download will fail. Use this option carefully.
107
+
108
+ To see download status information in Radarr/Sonarr
109
+ 1. Open `Activity` → `Queue` → `Options`
110
+ 2. Enable `Release Title`
111
+
112
+ # Docker
113
+
114
+ It is highly recommended to run the latest docker image with all optional variables set.
115
+
116
+ ```
117
+ docker run -d \
118
+ --name="Quasarr" \
119
+ -p port:8080 \
120
+ -v /path/to/config/:/config:rw \
121
+ -e 'INTERNAL_ADDRESS'='http://192.168.0.1:8080' \
122
+ -e 'EXTERNAL_ADDRESS'='https://foo.bar/' \
123
+ -e 'DISCORD'='https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN' \
124
+ -e 'HOSTNAMES'='https://pastebin.com/raw/eX4Mpl3'
125
+ -e 'SILENT'='True' \
126
+ -e 'DEBUG'='' \
127
+ -e 'TZ'='Europe/Berlin' \
128
+ ghcr.io/rix1337/quasarr:latest
129
+ ```
130
+
131
+ * `INTERNAL_ADDRESS` is required so Radarr/Sonarr/LazyLibrarian can reach Quasarr. **Must** include port!
132
+ * `EXTERNAL_ADDRESS` is optional and helpful if using a reverse proxy. Always protect external access with basic auth!
133
+ * `DISCORD` is optional and must be a valid Discord webhook URL.
134
+ * `HOSTNAMES` is optional and allows skipping the manual hostname step during setup.
135
+ * Must be a publicly available `HTTP` or `HTTPs` link
136
+ * Must be a raw `.ini` / text file (not HTML or JSON)
137
+ * Must contain at least one valid Hostname per line `ab = xyz`
138
+ * `SILENT` is optional and silences all discord notifications except for error messages from SponsorsHelper if `True`.
139
+ * `DEBUG` is optional and enables debug logging if `True`.
140
+ * `TZ` is optional, wrong timezone can cause HTTPS/SSL issues
141
+
142
+ # Manual setup
143
+
144
+ Use this only in case you can't run the docker image.
145
+
146
+ `pip install quasarr`
147
+
148
+ * Requires Python 3.12 or later
149
+ * Requires [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr)
150
+ * Requires [JDownloader 2](https://jdownloader.org/download/index) with [My JDownloader](https://my.jdownloader.org/)
151
+
152
+ ```
153
+ --port=8080
154
+ --discord=https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMN
155
+ --external_address=https://foo.bar/
156
+ --hostnames=https://pastebin.com/raw/eX4Mpl3
157
+ ```
158
+
159
+ * `--discord` see `DISCORD`docker variable
160
+ * `--external_address` see `EXTERNAL_ADDRESS`docker variable
161
+ * `--hostnames` see `HOSTNAMES`docker variable
162
+
163
+ # Philosophy
164
+
165
+ Complexity is the killer of small projects like this one. It must be fought at all cost!
166
+
167
+ We will not waste precious time on features that will slow future development cycles down.
168
+ Most feature requests can be satisfied by:
169
+
170
+ - Existing settings in Radarr/Sonarr/LazyLibrarian
171
+ - Existing settings in JDownloader
172
+ - Existing tools from the *arr ecosystem that integrate directly with Radarr/Sonarr/LazyLibrarian
173
+
174
+ # Roadmap
175
+
176
+ - Assume there are zero known
177
+ issues [unless you find one or more open issues in this repository](https://github.com/rix1337/Quasarr/issues).
178
+ - Still having an issue? Provide a detailed report [here](https://github.com/rix1337/Quasarr/issues/new/choose)!
179
+ - There are no hostname integrations in active development unless you see an open pull request
180
+ [here](https://github.com/rix1337/Quasarr/pulls).
181
+ - Pull requests are welcome. Especially for popular hostnames.
182
+ - Always reach out on Discord before starting work on a new feature to prevent waste of time.
183
+ - Please follow the existing code style and project structure.
184
+ - Anti-bot measures must be circumvented fully by Quasarr. Thus you will need to provide a working solution for new
185
+ CAPTCHA types by integrating it in the Quasarr Web UI.
186
+ - Please provide proof of functionality (screenshots/examples) when submitting your pull request.
187
+
188
+ # SponsorsHelper
189
+
190
+ <img src="https://imgur.com/iHBqLwT.png" width="64" height="64" />
191
+
192
+ SponsorsHelper is a Docker image that solves CAPTCHAs and decrypts links for Quasarr.
193
+ Image access is limited to [active monthly GitHub sponsors](https://github.com/users/rix1337/sponsorship).
194
+
195
+ [![Github Sponsorship](https://img.shields.io/badge/support-me-red.svg)](https://github.com/users/rix1337/sponsorship)
196
+
197
+ ---
198
+
199
+ ## 🔑 GitHub Token Setup
200
+
201
+ 1. Start your [sponsorship](https://github.com/users/rix1337/sponsorship) first.
202
+ 2. Open [GitHub Classic Token Settings](https://github.com/settings/tokens/new?type=classic)
203
+ 3. Name it (e.g., `SponsorsHelper`) and choose unlimited expiration
204
+ 4. Enable these scopes:
205
+ - `read:packages`
206
+ - `read:user`
207
+ - `read:org`
208
+ 5. Click **Generate token** and copy it for the next steps
209
+
210
+ ---
211
+
212
+ ## 🐋 Docker Login
213
+
214
+ ```bash
215
+ echo "GITHUB_TOKEN" | docker login ghcr.io -u USERNAME --password-stdin
216
+ ````
217
+
218
+ * `USERNAME` → your GitHub username
219
+ * `GITHUB_TOKEN` → the token you just created
220
+
221
+ ---
222
+
223
+ ⚠️ **Before logging in, the image will not download.**
224
+
225
+ ---
226
+
227
+ ## ▶️ Run SponsorsHelper
228
+
229
+ ```bash
230
+ docker run -d \
231
+ --name='SponsorsHelper' \
232
+ -e 'QUASARR_URL'='http://192.168.0.1:8080' \
233
+ -e 'DEATHBYCAPTCHA_TOKEN'='2FMum5zuDBxMmbXDIsADnllEFl73bomydIpzo7...' \
234
+ -e 'GITHUB_TOKEN'='ghp_123.....456789' \
235
+ -e 'FLARESOLVERR_URL'='http://10.10.0.1:8191/v1' \
236
+ -e 'NX_USER'='your_nx_username' \
237
+ -e 'NX_PASS'='your_nx_password' \
238
+ -e 'JUNKIES_USER'='your_junkies_username' \
239
+ -e 'JUNKIES_PASS'='your_junkies_password' \
240
+ -e 'JUNKIES_HOSTER'='your_desired_hoster' \
241
+ ghcr.io/rix1337-sponsors/docker/helper:latest
242
+ ```
243
+
244
+ ### Required Parameters
245
+
246
+ * `QUASARR_URL` → Local URL of Quasarr
247
+ * `DEATHBYCAPTCHA_TOKEN` → [DeathByCaptcha](https://deathbycaptcha.com/register?refid=6184288242b) account token
248
+ * `GITHUB_TOKEN` → Classic GitHub PAT with the scopes listed above
249
+ * `FLARESOLVERR_URL` → Local URL of [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) - required!
250
+ * `NX_USER` / `NX_PASS` → NX account credentials
251
+ * `JUNKIES_USER` / `JUNKIES_PASS` → Junkies account credentials
252
+ * `JUNKIES_HOSTER` → Preferred hoster for Junkies links
253
+ ---
254
+
255
+ ⚠️ **Without a valid GitHub token linked to an active sponsorship, the image will not run.**
256
+
257
+ ---
258
+
259
+ # Development Setup for Pull Requests
260
+
261
+ To test your changes before submitting a pull request:
262
+
263
+ **Run Quasarr with the `--internal_address` parameter:**
264
+
265
+ ```bash
266
+ python Quasarr.py --internal_address=http://<host-ip>:<port>
267
+ ```
268
+
269
+ Replace `<host-ip>` and `<port>` with the scheme, IP, and port of your host machine.
270
+ The `--internal_address` parameter is **mandatory**.
271
+
272
+ **Start the required services using the `dev-services-compose.yml` file:**
273
+
274
+ ```bash
275
+ CONFIG_VOLUMES=/path/to/config docker-compose -f docker/dev-services-compose.yml up
276
+ ```
277
+
278
+ Replace `/path/to/config` with your desired configuration location.
279
+ The `CONFIG_VOLUMES` environment variable is **mandatory**.