quasarr 2.6.1__tar.gz → 2.7.1__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 (104) hide show
  1. quasarr-2.7.1/.env.example +54 -0
  2. {quasarr-2.6.1 → quasarr-2.7.1}/.github/workflows/HostnameRedaction.yml +1 -0
  3. {quasarr-2.6.1 → quasarr-2.7.1}/.github/workflows/PullRequests.yml +12 -1
  4. {quasarr-2.6.1 → quasarr-2.7.1}/.github/workflows/Release.yml +18 -0
  5. {quasarr-2.6.1 → quasarr-2.7.1}/.gitignore +1 -0
  6. {quasarr-2.6.1 → quasarr-2.7.1}/.pre-commit-config.yaml +1 -1
  7. {quasarr-2.6.1 → quasarr-2.7.1}/CONTRIBUTING.md +15 -6
  8. {quasarr-2.6.1 → quasarr-2.7.1}/PKG-INFO +4 -1
  9. quasarr-2.7.1/cli_tester.py +955 -0
  10. {quasarr-2.6.1 → quasarr-2.7.1}/docker/Dockerfile +1 -0
  11. quasarr-2.7.1/docker/dev-services-compose.yml +100 -0
  12. {quasarr-2.6.1 → quasarr-2.7.1}/pre-commit.py +24 -33
  13. {quasarr-2.6.1 → quasarr-2.7.1}/pyproject.toml +10 -2
  14. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/__init__.py +71 -61
  15. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/__init__.py +1 -2
  16. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/arr/__init__.py +66 -57
  17. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/captcha/__init__.py +203 -154
  18. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/__init__.py +12 -8
  19. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/linkcrypters/al.py +4 -4
  20. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/linkcrypters/filecrypt.py +1 -2
  21. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/packages/__init__.py +62 -88
  22. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/al.py +3 -3
  23. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/by.py +3 -3
  24. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/he.py +8 -9
  25. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/nk.py +3 -3
  26. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/sl.py +6 -1
  27. quasarr-2.7.1/quasarr/downloads/sources/wd.py +225 -0
  28. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/wx.py +11 -17
  29. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/auth.py +9 -13
  30. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/cloudflare.py +5 -4
  31. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/imdb_metadata.py +1 -3
  32. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/jd_cache.py +64 -90
  33. quasarr-2.7.1/quasarr/providers/log.py +237 -0
  34. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/myjd_api.py +116 -94
  35. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/sessions/al.py +20 -22
  36. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/sessions/dd.py +1 -1
  37. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/sessions/dl.py +8 -10
  38. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/sessions/nx.py +1 -1
  39. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/shared_state.py +26 -15
  40. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/utils.py +15 -6
  41. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/version.py +1 -1
  42. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/__init__.py +113 -82
  43. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/al.py +19 -23
  44. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/by.py +6 -6
  45. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/dd.py +8 -10
  46. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/dj.py +15 -18
  47. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/dl.py +25 -37
  48. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/dt.py +13 -15
  49. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/dw.py +24 -16
  50. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/fx.py +25 -11
  51. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/he.py +16 -14
  52. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/hs.py +7 -7
  53. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/mb.py +7 -7
  54. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/nk.py +24 -25
  55. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/nx.py +22 -15
  56. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/sf.py +18 -9
  57. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/sj.py +7 -7
  58. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/sl.py +26 -14
  59. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/wd.py +61 -31
  60. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/wx.py +33 -47
  61. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/storage/config.py +1 -3
  62. {quasarr-2.6.1 → quasarr-2.7.1}/uv.lock +126 -0
  63. quasarr-2.6.1/docker/dev-services-compose.yml +0 -98
  64. quasarr-2.6.1/quasarr/downloads/sources/wd.py +0 -169
  65. quasarr-2.6.1/quasarr/providers/log.py +0 -19
  66. {quasarr-2.6.1 → quasarr-2.7.1}/.github/FUNDING.yml +0 -0
  67. {quasarr-2.6.1 → quasarr-2.7.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  68. {quasarr-2.6.1 → quasarr-2.7.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  69. {quasarr-2.6.1 → quasarr-2.7.1}/LICENSE +0 -0
  70. {quasarr-2.6.1 → quasarr-2.7.1}/Quasarr.png +0 -0
  71. {quasarr-2.6.1 → quasarr-2.7.1}/Quasarr.py +0 -0
  72. {quasarr-2.6.1 → quasarr-2.7.1}/README.md +0 -0
  73. {quasarr-2.6.1 → quasarr-2.7.1}/docker/docker-compose.yml +0 -0
  74. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/config/__init__.py +0 -0
  75. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/jdownloader/__init__.py +0 -0
  76. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/packages/__init__.py +0 -0
  77. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/sponsors_helper/__init__.py +0 -0
  78. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/api/statistics/__init__.py +0 -0
  79. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/linkcrypters/__init__.py +0 -0
  80. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/linkcrypters/hide.py +0 -0
  81. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/__init__.py +0 -0
  82. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/dd.py +0 -0
  83. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/dj.py +0 -0
  84. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/dl.py +0 -0
  85. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/dt.py +0 -0
  86. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/dw.py +0 -0
  87. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/hs.py +0 -0
  88. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/mb.py +0 -0
  89. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/nx.py +0 -0
  90. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/sf.py +0 -0
  91. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/downloads/sources/sj.py +0 -0
  92. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/__init__.py +0 -0
  93. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/hostname_issues.py +0 -0
  94. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/html_images.py +0 -0
  95. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/html_templates.py +0 -0
  96. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/notifications.py +0 -0
  97. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/obfuscated.py +0 -0
  98. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/sessions/__init__.py +0 -0
  99. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/statistics.py +0 -0
  100. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/providers/web_server.py +0 -0
  101. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/search/sources/__init__.py +0 -0
  102. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/storage/__init__.py +0 -0
  103. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/storage/setup.py +0 -0
  104. {quasarr-2.6.1 → quasarr-2.7.1}/quasarr/storage/sqlite_database.py +0 -0
@@ -0,0 +1,54 @@
1
+ # Copy this file to .env and set your environment variables
2
+
3
+ # Available log levels:
4
+ # CRIT 50
5
+ # ERROR 40
6
+ # WARN 30
7
+ # INFO 20 (default)
8
+ # DEBUG 10
9
+ # TRACE 5
10
+ #
11
+ # Each log line can have multiple contexts, each context can have its own log level.
12
+ # The most verbose/lowest log level among the contexts will decide whether to log that line.
13
+
14
+ # Base log level
15
+ LOG=INFO
16
+
17
+ # Enable/disable colored log output
18
+ LOG_COLOR=1
19
+
20
+ # Maximum width of log lines (in characters)
21
+ #LOG_MAX_WIDTH=160
22
+
23
+ # Log levels per action:
24
+ #LOG_SEARCH = DEBUG
25
+ #LOG_SOURCES = DEBUG
26
+ #LOG_PROVIDERS = DEBUG
27
+ #LOG_DOWNLOADS = DEBUG
28
+ #LOG_PACKAGES = DEBUG
29
+ #LOG_SHARED_STATE = DEBUG
30
+ #LOG_API = DEBUG
31
+ #LOG_SESSIONS = DEBUG
32
+ #LOG_JD_CACHE = DEBUG
33
+ #LOG_JDPACKAGECACHE = DEBUG
34
+ #LOG_GET_PACKAGES = DEBUG
35
+
36
+ # Log levels per source:
37
+ #LOG_AL = DEBUG
38
+ #LOG_BY = DEBUG
39
+ #LOG_DD = DEBUG
40
+ #LOG_DJ = DEBUG
41
+ #LOG_DD = DEBUG
42
+ #LOG_DT = DEBUG
43
+ #LOG_DW = DEBUG
44
+ #LOG_FX = DEBUG
45
+ #LOG_HE = DEBUG
46
+ #LOG_HS = DEBUG
47
+ #LOG_MB = DEBUG
48
+ #LOG_NK = DEBUG
49
+ #LOG_NX = DEBUG
50
+ #LOG_SF = DEBUG
51
+ #LOG_SJ = DEBUG
52
+ #LOG_SL = DEBUG
53
+ #LOG_WD = DEBUG
54
+ #LOG_WX = DEBUG
@@ -13,6 +13,7 @@ on:
13
13
  jobs:
14
14
  redact-hostnames:
15
15
  runs-on: ubuntu-latest
16
+ timeout-minutes: 1
16
17
  permissions:
17
18
  issues: write
18
19
  pull-requests: write
@@ -16,6 +16,7 @@ jobs:
16
16
  quality-check:
17
17
  name: Check & Auto-Fix
18
18
  runs-on: ubuntu-latest
19
+ timeout-minutes: 1
19
20
  permissions:
20
21
  contents: write
21
22
  pull-requests: write
@@ -55,6 +56,7 @@ jobs:
55
56
  needs: [ quality-check ]
56
57
  if: needs.quality-check.outputs.changes_pushed != 'true' && ((github.head_ref == 'dev' && github.base_ref == 'main') || (github.event_name == 'workflow_dispatch' && github.ref_name == 'dev'))
57
58
  runs-on: ubuntu-latest
59
+ timeout-minutes: 1
58
60
  outputs:
59
61
  version: ${{ steps.version.outputs.version }}
60
62
  epoch: ${{ steps.version.outputs.epoch }}
@@ -78,6 +80,7 @@ jobs:
78
80
  needs: [ quality-check, version ]
79
81
  if: needs.quality-check.outputs.changes_pushed != 'true' && ((github.head_ref == 'dev' && github.base_ref == 'main') || (github.event_name == 'workflow_dispatch' && github.ref_name == 'dev'))
80
82
  runs-on: ubuntu-latest
83
+ timeout-minutes: 3
81
84
  outputs:
82
85
  attestation-id: ${{ steps.attest.outputs.attestation-id }}
83
86
  permissions:
@@ -108,9 +111,11 @@ jobs:
108
111
  needs: [ quality-check, version ]
109
112
  if: needs.quality-check.outputs.changes_pushed != 'true' && ((github.head_ref == 'dev' && github.base_ref == 'main') || (github.event_name == 'workflow_dispatch' && github.ref_name == 'dev'))
110
113
  runs-on: windows-latest
114
+ timeout-minutes: 3
111
115
  env:
112
116
  TMP: "D:\\a\\temp"
113
117
  TEMP: "D:\\a\\temp"
118
+ PYINSTALLER_CONFIG_DIR: ".pyinstaller-cache"
114
119
  steps:
115
120
  - run: mkdir D:\a\temp -Force
116
121
  - uses: actions/checkout@v6
@@ -126,7 +131,7 @@ jobs:
126
131
  with:
127
132
  path: |
128
133
  build
129
- ~\AppData\Local\pyinstaller
134
+ .pyinstaller-cache
130
135
  key: pyinstaller-analysis-${{ runner.os }}-${{ hashFiles('uv.lock') }}
131
136
  restore-keys: |
132
137
  pyinstaller-analysis-${{ runner.os }}-
@@ -151,6 +156,7 @@ jobs:
151
156
  beta-release:
152
157
  needs: [ version, build-wheel, build-exe ]
153
158
  runs-on: ubuntu-latest
159
+ timeout-minutes: 1
154
160
  permissions: { contents: write }
155
161
  steps:
156
162
  - uses: actions/checkout@v6
@@ -196,6 +202,7 @@ jobs:
196
202
  needs: [ quality-check, version, build-wheel ]
197
203
  if: needs.quality-check.outputs.changes_pushed != 'true' && ((github.head_ref == 'dev' && github.base_ref == 'main') || (github.event_name == 'workflow_dispatch' && github.ref_name == 'dev'))
198
204
  runs-on: ubuntu-latest
205
+ timeout-minutes: 3
199
206
  steps:
200
207
  - uses: actions/checkout@v6
201
208
  - uses: actions/download-artifact@v4
@@ -228,6 +235,7 @@ jobs:
228
235
  needs: [ quality-check, version, build-wheel ]
229
236
  if: needs.quality-check.outputs.changes_pushed != 'true' && ((github.head_ref == 'dev' && github.base_ref == 'main') || (github.event_name == 'workflow_dispatch' && github.ref_name == 'dev'))
230
237
  runs-on: ubuntu-24.04-arm
238
+ timeout-minutes: 3
231
239
  steps:
232
240
  - uses: actions/checkout@v6
233
241
  - uses: actions/download-artifact@v4
@@ -259,6 +267,7 @@ jobs:
259
267
  merge-docker-manifest:
260
268
  needs: [ version, build-docker-amd64, build-docker-arm64 ]
261
269
  runs-on: ubuntu-latest
270
+ timeout-minutes: 1
262
271
  steps:
263
272
  - uses: docker/setup-buildx-action@v3
264
273
  - uses: docker/login-action@v3
@@ -287,6 +296,7 @@ jobs:
287
296
  needs: [ quality-check, version, beta-release, merge-docker-manifest ]
288
297
  if: needs.quality-check.outputs.changes_pushed != 'true' && needs.beta-release.result == 'success'
289
298
  runs-on: ubuntu-latest
299
+ timeout-minutes: 1
290
300
  permissions:
291
301
  pull-requests: write
292
302
  contents: read
@@ -316,6 +326,7 @@ jobs:
316
326
  job-summary:
317
327
  name: 📊 Beta Summary
318
328
  runs-on: ubuntu-latest
329
+ timeout-minutes: 1
319
330
  needs: [ quality-check, version, beta-release ]
320
331
  if: always()
321
332
  steps:
@@ -23,6 +23,7 @@ jobs:
23
23
  version:
24
24
  name: Get Version
25
25
  runs-on: ubuntu-latest
26
+ timeout-minutes: 1
26
27
  outputs:
27
28
  version: ${{ steps.version.outputs.version }}
28
29
  steps:
@@ -44,6 +45,7 @@ jobs:
44
45
  build-wheel:
45
46
  name: Build Wheel
46
47
  runs-on: ubuntu-latest
48
+ timeout-minutes: 3
47
49
  outputs:
48
50
  attestation-id: ${{ steps.attest.outputs.attestation-id }}
49
51
  permissions:
@@ -76,7 +78,10 @@ jobs:
76
78
  build-exe:
77
79
  name: Build Exe (Windows)
78
80
  runs-on: windows-latest
81
+ timeout-minutes: 3
79
82
  needs: version
83
+ outputs:
84
+ cache-hit: ${{ steps.pyinstaller-cache.outputs.cache-hit }}
80
85
  env:
81
86
  BUILD_PATH: "build"
82
87
  steps:
@@ -121,6 +126,7 @@ jobs:
121
126
  build-docker-amd64:
122
127
  name: Build Docker (AMD64)
123
128
  runs-on: ubuntu-latest
129
+ timeout-minutes: 3
124
130
  needs: [ version, build-wheel ]
125
131
  steps:
126
132
  - uses: actions/checkout@v6
@@ -151,8 +157,10 @@ jobs:
151
157
  tags: |
152
158
  ${{ env.ENDPOINT }}:latest-amd64
153
159
  ${{ env.ENDPOINT }}:${{ needs.version.outputs.version }}-amd64
160
+ ${{ env.ENDPOINT }}:beta-amd64
154
161
  ${{ env.GHCR_ENDPOINT }}:latest-amd64
155
162
  ${{ env.GHCR_ENDPOINT }}:${{ needs.version.outputs.version }}-amd64
163
+ ${{ env.GHCR_ENDPOINT }}:beta-amd64
156
164
  build-args: VS=${{ needs.version.outputs.version }}
157
165
  cache-from: type=gha,scope=amd64
158
166
  cache-to: type=gha,mode=max,scope=amd64
@@ -160,6 +168,7 @@ jobs:
160
168
  build-docker-arm64:
161
169
  name: Build Docker (ARM64)
162
170
  runs-on: ubuntu-24.04-arm
171
+ timeout-minutes: 3
163
172
  needs: [ version, build-wheel ]
164
173
  steps:
165
174
  - uses: actions/checkout@v6
@@ -190,8 +199,10 @@ jobs:
190
199
  tags: |
191
200
  ${{ env.ENDPOINT }}:latest-arm64
192
201
  ${{ env.ENDPOINT }}:${{ needs.version.outputs.version }}-arm64
202
+ ${{ env.ENDPOINT }}:beta-arm64
193
203
  ${{ env.GHCR_ENDPOINT }}:latest-arm64
194
204
  ${{ env.GHCR_ENDPOINT }}:${{ needs.version.outputs.version }}-arm64
205
+ ${{ env.GHCR_ENDPOINT }}:beta-arm64
195
206
  build-args: VS=${{ needs.version.outputs.version }}
196
207
  cache-from: type=gha,scope=arm64
197
208
  cache-to: type=gha,mode=max,scope=arm64
@@ -199,6 +210,7 @@ jobs:
199
210
  merge-docker-manifest:
200
211
  name: Merge Docker Manifests
201
212
  runs-on: ubuntu-latest
213
+ timeout-minutes: 1
202
214
  needs: [ version, build-docker-amd64, build-docker-arm64 ]
203
215
  steps:
204
216
  - uses: docker/setup-buildx-action@v3
@@ -219,12 +231,15 @@ jobs:
219
231
  ANNOTATION="index:org.opencontainers.image.description=$DESCRIPTION"
220
232
  docker buildx imagetools create -t ${{ env.ENDPOINT }}:latest ${{ env.ENDPOINT }}:latest-amd64 ${{ env.ENDPOINT }}:latest-arm64
221
233
  docker buildx imagetools create -t ${{ env.ENDPOINT }}:${{ needs.version.outputs.version }} ${{ env.ENDPOINT }}:${TAG_AMD64} ${{ env.ENDPOINT }}:${TAG_ARM64}
234
+ docker buildx imagetools create -t ${{ env.ENDPOINT }}:beta ${{ env.ENDPOINT }}:beta-amd64 ${{ env.ENDPOINT }}:beta-arm64
222
235
  docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:latest --annotation "$ANNOTATION" ${{ env.GHCR_ENDPOINT }}:latest-amd64 ${{ env.GHCR_ENDPOINT }}:latest-arm64
223
236
  docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:${{ needs.version.outputs.version }} --annotation "$ANNOTATION" ${{ env.GHCR_ENDPOINT }}:${TAG_AMD64} ${{ env.GHCR_ENDPOINT }}:${TAG_ARM64}
237
+ docker buildx imagetools create -t ${{ env.GHCR_ENDPOINT }}:beta --annotation "$ANNOTATION" ${{ env.GHCR_ENDPOINT }}:beta-amd64 ${{ env.GHCR_ENDPOINT }}:beta-arm64
224
238
 
225
239
  release:
226
240
  name: Create Release
227
241
  runs-on: ubuntu-latest
242
+ timeout-minutes: 1
228
243
  needs: [ version, build-wheel, build-exe, build-docker-amd64, build-docker-arm64 ]
229
244
  permissions:
230
245
  contents: write
@@ -269,6 +284,7 @@ jobs:
269
284
  echo "### Python:" >> release_body.md
270
285
  echo "\`uv tool upgrade quasarr\`" >> release_body.md
271
286
  if [ -f pr_body.txt ]; then
287
+ echo "" >> release_body.md
272
288
  cat pr_body.txt >> release_body.md
273
289
  echo "" >> release_body.md
274
290
  fi
@@ -288,6 +304,7 @@ jobs:
288
304
  needs: [ version, release, merge-docker-manifest ]
289
305
  if: always() && needs.release.result == 'success'
290
306
  runs-on: ubuntu-latest
307
+ timeout-minutes: 1
291
308
  steps:
292
309
  - uses: actions/checkout@v6
293
310
  - name: Send Discord Webhook
@@ -313,6 +330,7 @@ jobs:
313
330
  job-summary:
314
331
  name: 📈 Build Report
315
332
  runs-on: ubuntu-latest
333
+ timeout-minutes: 1
316
334
  needs: [ version, build-wheel, build-exe, build-docker-amd64, build-docker-arm64, release ]
317
335
  if: always()
318
336
  steps:
@@ -18,3 +18,4 @@
18
18
  *.conf
19
19
  *.db
20
20
  *.ini
21
+ .env
@@ -3,7 +3,7 @@ repos:
3
3
  hooks:
4
4
  - id: pre-commit
5
5
  name: Pre-Commit Check
6
- entry: uv run python pre-commit.py
6
+ entry: uv run python -X utf8 pre-commit.py
7
7
  language: system
8
8
  pass_filenames: false
9
9
  always_run: true
@@ -16,15 +16,12 @@ Install the pre-commit hook that ensures linting, formatting and version upgrade
16
16
  uv run pre-commit install
17
17
  ```
18
18
 
19
- **2. Run Quasarr with the `--internal_address` parameter**
19
+ **2. Run Quasarr**
20
20
 
21
21
  ```bash
22
- uv run Quasarr.py --internal_address=http://<host-ip>:<port>
22
+ uv run Quasarr.py
23
23
  ```
24
24
 
25
- Replace `<host-ip>` and `<port>` with the scheme, IP, and port of your host machine.
26
- The `--internal_address` parameter is **mandatory**.
27
-
28
25
  **3. Start the required services using the `dev-services-compose.yml` file**
29
26
 
30
27
  ```bash
@@ -34,12 +31,24 @@ CONFIG_VOLUMES=/path/to/config docker-compose -f docker/dev-services-compose.yml
34
31
  Replace `/path/to/config` with your desired configuration location.
35
32
  The `CONFIG_VOLUMES` environment variable is **mandatory**.
36
33
 
34
+ By default only JDownloader and Flaresolverr are enabled. See next step how to emulate supported *arr services.
35
+
36
+ **4. Validate your changes**
37
+
38
+ Use the `cli_tester.py` script to simulate Radarr, Sonarr, and LazyLibrarian interactions.
39
+
40
+ ```bash
41
+ uv run cli_tester.py
42
+ ```
43
+
44
+ This tool allows you to test searches, feeds, and downloads without needing the full stack of services running.
45
+
37
46
  ---
38
47
 
39
48
  ### Code Quality & Maintenance
40
49
 
41
50
  The CI pipeline enforces strict code styling and import optimization. Please run this commands before pushing your
42
- changes. Alternatively, you should just set up the pre-commit hook as described above.
51
+ changes. Alternatively, set up the pre-commit hook as described above.
43
52
 
44
53
  **Format code AND upgrade dependencie manually:**
45
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: quasarr
3
- Version: 2.6.1
3
+ Version: 2.7.1
4
4
  Summary: Quasarr connects JDownloader with Radarr, Sonarr and LazyLibrarian. It also decrypts links protected by CAPTCHAs.
5
5
  Author-email: rix1337 <rix1337@users.noreply.github.com>
6
6
  License-File: LICENSE
@@ -11,9 +11,12 @@ Requires-Python: >=3.12
11
11
  Requires-Dist: beautifulsoup4>=4.14.3
12
12
  Requires-Dist: bottle>=0.13.4
13
13
  Requires-Dist: dukpy>=0.5.0
14
+ Requires-Dist: loguru>=0.7.3
14
15
  Requires-Dist: pillow>=12.1.0
15
16
  Requires-Dist: pycryptodomex>=3.23.0
17
+ Requires-Dist: python-dotenv>=1.2.1
16
18
  Requires-Dist: requests>=2.32.5
19
+ Requires-Dist: wcwidth>=0.5.3
17
20
  Description-Content-Type: text/markdown
18
21
 
19
22
  #