qBitrr2 5.3.1__py3-none-any.whl → 5.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
qBitrr/bundled_data.py CHANGED
@@ -1,5 +1,5 @@
1
- version = "5.3.1"
2
- git_hash = "5732b16"
1
+ version = "5.3.3"
2
+ git_hash = "7d1453ae"
3
3
  license_text = (
4
4
  "Licence can be found on:\n\nhttps://github.com/Feramance/qBitrr/blob/master/LICENSE"
5
5
  )
qBitrr/main.py CHANGED
@@ -212,20 +212,67 @@ class qBitManager:
212
212
  def _restart():
213
213
  if delay > 0:
214
214
  time.sleep(delay)
215
- self.logger.notice("Exiting to complete restart.")
215
+ self.logger.notice("Restarting qBitrr...")
216
+
217
+ # Set shutdown event to signal all loops to stop
216
218
  try:
217
219
  self.shutdown_event.set()
218
220
  except Exception:
219
221
  pass
222
+
223
+ # Wait for child processes to exit gracefully
220
224
  for proc in list(self.child_processes):
221
225
  with contextlib.suppress(Exception):
222
226
  proc.join(timeout=5)
227
+
228
+ # Force kill any remaining child processes
223
229
  for proc in list(self.child_processes):
224
230
  with contextlib.suppress(Exception):
225
231
  proc.kill()
226
232
  with contextlib.suppress(Exception):
227
233
  proc.terminate()
228
- os._exit(0)
234
+
235
+ # Close database connections explicitly
236
+ try:
237
+ if hasattr(self, "arr_manager") and self.arr_manager:
238
+ for arr in self.arr_manager.managed_objects.values():
239
+ if hasattr(arr, "db") and arr.db:
240
+ with contextlib.suppress(Exception):
241
+ arr.db.close()
242
+ except Exception:
243
+ pass
244
+
245
+ # Flush all log handlers
246
+ try:
247
+ for handler in logging.root.handlers[:]:
248
+ with contextlib.suppress(Exception):
249
+ handler.flush()
250
+ handler.close()
251
+ except Exception:
252
+ pass
253
+
254
+ # Prepare restart arguments
255
+ python = sys.executable
256
+ args = [python] + sys.argv
257
+
258
+ self.logger.notice("Executing restart: %s", " ".join(args))
259
+
260
+ # Flush logs one final time before exec
261
+ try:
262
+ for handler in self.logger.handlers[:]:
263
+ with contextlib.suppress(Exception):
264
+ handler.flush()
265
+ except Exception:
266
+ pass
267
+
268
+ # Replace current process with new instance
269
+ # This works in Docker, native installs, and systemd
270
+ try:
271
+ os.execv(python, args)
272
+ except Exception as e:
273
+ # If execv fails, fall back to exit and hope external supervisor restarts us
274
+ self.logger.critical("Failed to restart via execv: %s. Exiting instead.", e)
275
+ os._exit(1)
229
276
 
230
277
  self._restart_thread = Thread(target=_restart, name="qBitrr-Restart", daemon=True)
231
278
  self._restart_thread.start()
@@ -0,0 +1,911 @@
1
+ Metadata-Version: 2.4
2
+ Name: qBitrr2
3
+ Version: 5.3.3
4
+ Summary: Intelligent automation for qBittorrent and *Arr apps (Radarr/Sonarr/Lidarr) - health monitoring, instant imports, quality upgrades, request integration
5
+ Home-page: https://github.com/Feramance/qBitrr
6
+ Author: Feramance
7
+ Author-email: fera@fera.wtf
8
+ License: MIT
9
+ Project-URL: Homepage, https://github.com/Feramance/qBitrr
10
+ Project-URL: Documentation, https://github.com/Feramance/qBitrr/blob/master/API_DOCUMENTATION.md
11
+ Project-URL: Issue Tracker, https://github.com/Feramance/qBitrr/issues
12
+ Project-URL: Source Code, https://github.com/Feramance/qBitrr
13
+ Project-URL: Changelog, https://github.com/Feramance/qBitrr/blob/master/CHANGELOG.md
14
+ Project-URL: Docker Hub, https://hub.docker.com/r/feramance/qbitrr
15
+ Project-URL: PyPI, https://pypi.org/project/qBitrr2/
16
+ Project-URL: Systemd Guide, https://github.com/Feramance/qBitrr/blob/master/SYSTEMD_SERVICE.md
17
+ Keywords: qbittorrent,radarr,sonarr,lidarr,arr,automation,torrent,media,plex,jellyfin,overseerr,ombi
18
+ Classifier: Development Status :: 5 - Production/Stable
19
+ Classifier: Intended Audience :: Developers
20
+ Classifier: Intended Audience :: End Users/Desktop
21
+ Classifier: Intended Audience :: System Administrators
22
+ Classifier: License :: OSI Approved :: MIT License
23
+ Classifier: Natural Language :: English
24
+ Classifier: Operating System :: MacOS :: MacOS X
25
+ Classifier: Operating System :: Microsoft :: Windows
26
+ Classifier: Operating System :: POSIX :: Linux
27
+ Classifier: Programming Language :: Python :: 3 :: Only
28
+ Classifier: Programming Language :: Python :: 3.12
29
+ Classifier: Programming Language :: Python :: Implementation :: CPython
30
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
31
+ Classifier: Topic :: Communications
32
+ Classifier: Topic :: Internet
33
+ Classifier: Topic :: Multimedia :: Video
34
+ Classifier: Topic :: System :: Monitoring
35
+ Classifier: Topic :: Terminals
36
+ Classifier: Topic :: Utilities
37
+ Classifier: Typing :: Typed
38
+ Requires-Python: <4,>=3.12
39
+ Description-Content-Type: text/markdown
40
+ License-File: LICENSE
41
+ Requires-Dist: cachetools
42
+ Requires-Dist: colorama
43
+ Requires-Dist: coloredlogs
44
+ Requires-Dist: flask
45
+ Requires-Dist: environ-config
46
+ Requires-Dist: ffmpeg-python
47
+ Requires-Dist: jaraco.docker
48
+ Requires-Dist: packaging
49
+ Requires-Dist: pathos
50
+ Requires-Dist: peewee
51
+ Requires-Dist: ping3
52
+ Requires-Dist: pyarr
53
+ Requires-Dist: qbittorrent-api
54
+ Requires-Dist: requests
55
+ Requires-Dist: tomlkit
56
+ Requires-Dist: waitress
57
+ Requires-Dist: croniter
58
+ Provides-Extra: dev
59
+ Requires-Dist: black==24.3.0; extra == "dev"
60
+ Requires-Dist: bump2version==1.0.1; extra == "dev"
61
+ Requires-Dist: isort==5.10.1; extra == "dev"
62
+ Requires-Dist: pip-tools==7.3.0; extra == "dev"
63
+ Requires-Dist: pre-commit==3.3.3; extra == "dev"
64
+ Requires-Dist: pyinstaller==5.13.1; extra == "dev"
65
+ Requires-Dist: pyupgrade==2.31.0; extra == "dev"
66
+ Requires-Dist: twine==3.7.1; extra == "dev"
67
+ Requires-Dist: ujson==5.10.0; extra == "dev"
68
+ Requires-Dist: upgrade-pip==0.1.4; extra == "dev"
69
+ Provides-Extra: fast
70
+ Requires-Dist: ujson==5.10.0; extra == "fast"
71
+ Provides-Extra: all
72
+ Requires-Dist: black==24.3.0; extra == "all"
73
+ Requires-Dist: bump2version==1.0.1; extra == "all"
74
+ Requires-Dist: isort==5.10.1; extra == "all"
75
+ Requires-Dist: pip-tools==7.3.0; extra == "all"
76
+ Requires-Dist: pre-commit==3.3.3; extra == "all"
77
+ Requires-Dist: pyinstaller==5.13.1; extra == "all"
78
+ Requires-Dist: pyupgrade==2.31.0; extra == "all"
79
+ Requires-Dist: twine==3.7.1; extra == "all"
80
+ Requires-Dist: ujson==5.10.0; extra == "all"
81
+ Requires-Dist: upgrade-pip==0.1.4; extra == "all"
82
+ Requires-Dist: ujson==5.10.0; extra == "all"
83
+ Dynamic: license-file
84
+
85
+ # qBitrr
86
+
87
+ [![PyPI](https://img.shields.io/pypi/v/qBitrr2?label=PyPI)](https://pypi.org/project/qBitrr2/)
88
+ [![Downloads](https://img.shields.io/pypi/dm/qBitrr2)](https://pypi.org/project/qBitrr2/)
89
+ [![Docker Pulls](https://img.shields.io/docker/pulls/feramance/qbitrr.svg)](https://hub.docker.com/r/feramance/qbitrr)
90
+ [![CodeQL](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml/badge.svg?branch=master)](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml)
91
+ [![Nightly Build](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml/badge.svg?branch=master)](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml)
92
+ [![pre-commit.ci](https://results.pre-commit.ci/badge/github/Feramance/qBitrr/master.svg)](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
93
+ [![License: MIT](https://img.shields.io/pypi/l/qbitrr)](LICENSE)
94
+
95
+ > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, Lidarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
96
+
97
+ ## 📚 What's Inside
98
+ - [Overview](#-overview)
99
+ - [Core Features](#-core-features)
100
+ - [State of the Project](#-state-of-the-project)
101
+ - [Quickstart](#-quickstart)
102
+ - [Install with pip](#install-with-pip)
103
+ - [Run with Docker](#run-with-docker)
104
+ - [Native Systemd Service](#native-systemd-service)
105
+ - [Configuration](#-configuration)
106
+ - [Feature Deep Dive](#-feature-deep-dive)
107
+ - [Torrent Health Monitoring](#-torrent-health-monitoring)
108
+ - [Automated Search & Requests](#-automated-search--requests)
109
+ - [Quality Management](#-quality-management)
110
+ - [Seeding & Tracker Control](#-seeding--tracker-control)
111
+ - [Disk Space Management](#-disk-space-management)
112
+ - [Auto-Updates & Restarts](#-auto-updates--restarts)
113
+ - [Built-in Web UI](#-built-in-web-ui)
114
+ - [Day-to-day Operations](#-day-to-day-operations)
115
+ - [Troubleshooting](#-troubleshooting)
116
+ - [Contributing](#-contributing)
117
+ - [Support](#-support)
118
+ - [License](#-license)
119
+
120
+ ## 🧠 Overview
121
+ qBitrr is the intelligent glue between qBittorrent and the *Arr ecosystem (Radarr, Sonarr, Lidarr). It monitors torrent health, triggers instant imports when downloads complete, automates quality upgrades, manages disk space, integrates with request systems (Overseerr/Ombi), and provides a modern React dashboard for complete visibility and control.
122
+
123
+ ## ✨ Core Features
124
+
125
+ ### 🚑 Torrent Health & Import Management
126
+ - **Instant imports** – trigger `DownloadedMoviesScan`/`DownloadedEpisodesScan` the moment torrents finish
127
+ - **Stalled torrent detection** – identify and handle stuck/slow downloads with configurable thresholds
128
+ - **Failed download handling** – automatically blacklist failed torrents in Arr instances and trigger re-searches
129
+ - **FFprobe verification** – validate media files are playable before import (auto-downloads FFprobe binary)
130
+ - **Smart file filtering** – exclude samples, extras, trailers via regex and extension allowlists
131
+
132
+ ### 🔍 Automated Search & Request Integration
133
+ - **Missing media search** – automatically search for missing movies/episodes/albums on schedules
134
+ - **Quality upgrade search** – find better releases for existing media based on quality profiles
135
+ - **Custom format scoring** – search for releases meeting minimum custom format scores
136
+ - **Overseerr/Ombi integration** – auto-pull and prioritize user requests from request management tools
137
+ - **Smart search modes** – series-level or episode-level search for TV shows based on context
138
+ - **Temporary quality profiles** – use lower quality profiles for missing items, upgrade later
139
+
140
+ ### 📊 Quality & Metadata Management
141
+ - **RSS sync automation** – schedule periodic RSS feed refreshes across all Arr instances
142
+ - **Queue management** – auto-refresh download queues to keep Arr instances in sync
143
+ - **Custom format enforcement** – automatically remove torrents not meeting minimum CF scores
144
+ - **Quality profile switching** – dynamically change profiles for missing vs. upgrade searches
145
+ - **Year-based search ordering** – prioritize searches by release date (newest first or reverse)
146
+
147
+ ### 🌱 Seeding & Tracker Control
148
+ - **Per-tracker settings** – configure MaxETA, ratios, seeding time per tracker
149
+ - **Global seeding limits** – set upload/download rate limits, max ratios, and seeding times
150
+ - **Automatic removal** – remove torrents based on ratio, time, or both
151
+ - **Dead tracker cleanup** – auto-remove trackers with specific error messages
152
+ - **Tracker injection** – add missing trackers or remove existing ones per torrent
153
+ - **Super seed mode** – enable super seeding for specific trackers
154
+ - **Tag management** – auto-tag torrents by tracker or custom rules
155
+
156
+ ### 💾 Disk Space & Resource Management
157
+ - **Free space monitoring** – pause all torrents when disk space falls below threshold
158
+ - **Auto pause/resume** – intelligently manage torrent activity based on disk availability
159
+ - **Configurable thresholds** – set limits in KB, MB, GB, or TB
160
+ - **Path-specific monitoring** – watch specific directories for space issues
161
+
162
+ ### 🔄 Auto-Updates & Self-Healing
163
+ - **Scheduled auto-updates** – update qBitrr on a cron schedule (default: weekly Sunday 3 AM)
164
+ - **Manual update trigger** – one-click updates from WebUI
165
+ - **Smart restart mechanism** – uses `os.execv()` for true in-place restarts (no supervisor needed)
166
+ - **Cross-platform compatibility** – works in Docker, systemd, native installs, Windows, Linux, macOS
167
+ - **Graceful shutdown** – cleanly closes databases, flushes logs, terminates child processes
168
+
169
+ ### 💻 First-Party Web UI
170
+ - **Live process monitoring** – see all running Arr managers and their current activity
171
+ - **Log viewer** – tail logs in real-time with filtering and search
172
+ - **Arr insights** – view movies, series, albums with filtering by year, quality, status
173
+ - **Config editor** – edit configuration directly from the UI
174
+ - **Restart controls** – restart individual processes or the entire application
175
+ - **Dark/light theme** – customizable UI appearance
176
+ - **Token authentication** – optional API protection with bearer tokens
177
+
178
+ ## 📌 State of the Project
179
+ The long-term plan is still to ship a C# rewrite, but the Python edition isn't going anywhere—it gets regular fixes and features, and the Web UI is now production-ready. Ideas and PRs are welcome! Head over to the [issue templates](.github/ISSUE_TEMPLATE) or the [PR checklist](.github/pull_request_template.md) to get started.
180
+
181
+ ## ⚡ Quickstart
182
+ qBitrr supports Python 3.12+ on Linux, macOS, and Windows. Run it natively or in Docker—whatever fits your stack.
183
+
184
+ ### 🐍 Install with pip
185
+ ```bash
186
+ python -m venv .venv
187
+ source .venv/bin/activate # Windows: .venv\Scripts\activate
188
+ python -m pip install --upgrade pip
189
+ python -m pip install qBitrr2
190
+
191
+ # First run creates ~/config/config.toml
192
+ qBitrr2
193
+ ```
194
+
195
+ **Update later:**
196
+ ```bash
197
+ python -m pip install --upgrade qBitrr2
198
+ ```
199
+
200
+ **Or enable auto-updates** in `config.toml`:
201
+ ```toml
202
+ [Settings]
203
+ AutoUpdateEnabled = true
204
+ AutoUpdateCron = "0 3 * * 0" # Weekly on Sunday at 3 AM
205
+ ```
206
+
207
+ ### 🐳 Run with Docker
208
+ **Minimal setup:**
209
+ ```bash
210
+ docker run -d \
211
+ --name qbitrr \
212
+ --tty \
213
+ -e TZ=Europe/London \
214
+ -p 6969:6969 \
215
+ -v /etc/localtime:/etc/localtime:ro \
216
+ -v /path/to/appdata/qbitrr:/config \
217
+ -v /path/to/completed/downloads:/completed_downloads:rw \
218
+ --restart unless-stopped \
219
+ feramance/qbitrr:latest
220
+ ```
221
+
222
+ The container automatically binds its WebUI to `0.0.0.0`; exposing `6969` makes the dashboard reachable at `http://<host>:6969/ui`.
223
+
224
+ **Docker Compose example:**
225
+ ```yaml
226
+ services:
227
+ qbitrr:
228
+ image: feramance/qbitrr:latest
229
+ container_name: qbitrr
230
+ user: 1000:1000
231
+ restart: unless-stopped
232
+ tty: true
233
+ environment:
234
+ TZ: Europe/London
235
+ ports:
236
+ - "6969:6969"
237
+ volumes:
238
+ - /etc/localtime:/etc/localtime:ro
239
+ - /path/to/appdata/qbitrr:/config
240
+ - /path/to/completed/downloads:/completed_downloads:rw
241
+ logging:
242
+ driver: json-file
243
+ options:
244
+ max-size: 50m
245
+ max-file: "3"
246
+ depends_on:
247
+ - qbittorrent
248
+ - radarr
249
+ - sonarr
250
+ ```
251
+
252
+ > ℹ️ On first boot the container writes `config.toml` under `/config`. Update the values to match your mounts and restart the container.
253
+
254
+ ### ⚙️ Native Systemd Service
255
+ For Linux users running qBitrr natively (non-Docker), you can set up automatic startup and restart management using systemd.
256
+
257
+ **Quick setup:**
258
+ ```bash
259
+ # Install qBitrr
260
+ pip install qBitrr2
261
+
262
+ # Copy systemd service file
263
+ sudo cp qbitrr.service /etc/systemd/system/qbitrr.service
264
+
265
+ # Enable and start
266
+ sudo systemctl enable qbitrr
267
+ sudo systemctl start qbitrr
268
+
269
+ # Check status
270
+ sudo systemctl status qbitrr
271
+ ```
272
+
273
+ **Benefits:**
274
+ - ✅ Auto-start on boot
275
+ - ✅ Automatic restarts after crashes or updates
276
+ - ✅ Integrated logging with `journalctl`
277
+ - ✅ Resource limits and security hardening
278
+ - ✅ Works seamlessly with qBitrr's auto-update feature
279
+
280
+ **See the full guide:** [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md) for detailed setup instructions, troubleshooting, and security hardening options.
281
+
282
+ ## 🛠️ Configuration
283
+
284
+ ### 📂 Config Location
285
+ - **Native install:** `~/config/config.toml`
286
+ - **Docker:** `/config/config.toml`
287
+ - **First run:** Auto-generates a template config file
288
+ - **Manual generation:** `qbitrr --gen-config`
289
+
290
+ ### 🔧 Essential Setup
291
+ 1. **Configure qBittorrent connection** in `[qBit]` section:
292
+ - Set `Host`, `Port`, `UserName`, `Password`
293
+ - qBittorrent 5.x requires `Version5 = true` (4.6.7 is the latest validated 4.x build)
294
+
295
+ 2. **Configure Arr instances** (Radarr/Sonarr/Lidarr):
296
+ - Each instance needs: `URI`, `APIKey`, `Category`
297
+ - **Important:** Use matching categories in Arr's download client settings
298
+ - **Tagging:** Ensure Arr instances tag their downloads so qBitrr can track them
299
+
300
+ 3. **Set completed download folder:**
301
+ ```toml
302
+ [Settings]
303
+ CompletedDownloadFolder = "/path/to/completed"
304
+ ```
305
+
306
+ 4. **Enable logging** for troubleshooting:
307
+ ```toml
308
+ [Settings]
309
+ Logging = true
310
+ ConsoleLevel = "INFO" # or DEBUG for verbose output
311
+ ```
312
+
313
+ ### 📖 Configuration Reference
314
+ See [`config.example.toml`](config.example.toml) for comprehensive documentation of all settings, including:
315
+ - Torrent health check thresholds
316
+ - Search automation options
317
+ - Seeding limits and tracker rules
318
+ - Request system integration
319
+ - WebUI settings
320
+ - File filtering and exclusion rules
321
+
322
+ ## 🎯 Feature Deep Dive
323
+
324
+ ### 🚑 Torrent Health Monitoring
325
+
326
+ qBitrr continuously monitors your torrents and takes intelligent action when problems arise.
327
+
328
+ **Stalled Torrent Detection:**
329
+ ```toml
330
+ [Radarr-Movies.Torrent]
331
+ StalledDelay = 15 # Minutes before considering a torrent stalled
332
+ ReSearchStalled = true # Re-search before removing stalled torrents
333
+ MaximumETA = 604800 # Max ETA in seconds (7 days)
334
+ IgnoreTorrentsYoungerThan = 600 # Grace period for new torrents (10 min)
335
+ ```
336
+
337
+ **Automatic Blacklisting:**
338
+ When torrents fail or stall beyond thresholds, qBitrr:
339
+ 1. ✅ Marks the release as failed in the Arr instance
340
+ 2. ✅ Blacklists the release to prevent re-download
341
+ 3. ✅ Optionally triggers an automatic re-search
342
+ 4. ✅ Removes the failed torrent from qBittorrent
343
+
344
+ **Smart Completion Rules:**
345
+ ```toml
346
+ [Radarr-Movies.Torrent]
347
+ MaximumDeletablePercentage = 0.99 # Don't delete torrents >99% complete
348
+ DoNotRemoveSlow = true # Protect slow but active torrents
349
+ ```
350
+
351
+ **File Verification:**
352
+ ```toml
353
+ [Settings]
354
+ FFprobeAutoUpdate = true # Auto-download FFprobe binary
355
+ ```
356
+ - Validates media files are playable before import
357
+ - Detects corrupted or fake files
358
+ - Prevents broken media from being imported into Arr
359
+
360
+ **Error Code Handling:**
361
+ ```toml
362
+ [Radarr-Movies]
363
+ ArrErrorCodesToBlocklist = [
364
+ "Not an upgrade for existing movie file(s)",
365
+ "Unable to determine if file is a sample"
366
+ ]
367
+ ```
368
+ Automatically handle specific Arr error messages by removing failed files and triggering re-searches.
369
+
370
+ ---
371
+
372
+ ### 🔍 Automated Search & Requests
373
+
374
+ **Missing Media Search:**
375
+ ```toml
376
+ [Radarr-Movies.EntrySearch]
377
+ SearchMissing = true # Enable automated searching
378
+ SearchLimit = 5 # Max concurrent searches
379
+ SearchByYear = true # Order by release year
380
+ SearchInReverse = false # Newest first (true = oldest first)
381
+ SearchRequestsEvery = 300 # Delay between searches (seconds)
382
+ SearchAgainOnSearchCompletion = true # Loop continuously
383
+ ```
384
+
385
+ **Quality Upgrade Search:**
386
+ ```toml
387
+ [Radarr-Movies.EntrySearch]
388
+ DoUpgradeSearch = true # Search for better quality versions
389
+ QualityUnmetSearch = true # Search for unmet quality profiles
390
+ CustomFormatUnmetSearch = true # Search for better custom format scores
391
+ ForceMinimumCustomFormat = true # Auto-remove torrents below CF threshold
392
+ ```
393
+
394
+ **Overseerr Integration:**
395
+ ```toml
396
+ [Radarr-Movies.EntrySearch.Overseerr]
397
+ SearchOverseerrRequests = true
398
+ OverseerrURI = "http://overseerr:5055"
399
+ OverseerrAPIKey = "your-api-key"
400
+ ApprovedOnly = true # Only process approved requests
401
+ Is4K = false # Set true for 4K Arr instances
402
+ ```
403
+
404
+ **Ombi Integration:**
405
+ ```toml
406
+ [Radarr-Movies.EntrySearch.Ombi]
407
+ SearchOmbiRequests = true
408
+ OmbiURI = "http://ombi:3579"
409
+ OmbiAPIKey = "your-api-key"
410
+ ApprovedOnly = true
411
+ ```
412
+
413
+ **Smart Search Modes (Sonarr):**
414
+ ```toml
415
+ [Sonarr-TV.EntrySearch]
416
+ SearchBySeries = "smart" # auto | true (series) | false (episode)
417
+ # smart: Series search for full seasons, episode search for singles
418
+ PrioritizeTodaysReleases = true # Search today's episodes first (RSS-like)
419
+ AlsoSearchSpecials = false # Include season 00 episodes
420
+ Unmonitored = false # Include unmonitored items
421
+ ```
422
+
423
+ **Temporary Quality Profiles:**
424
+ ```toml
425
+ [Radarr-Movies.EntrySearch]
426
+ UseTempForMissing = true
427
+ KeepTempProfile = false
428
+ MainQualityProfile = ["Ultra-HD", "HD-1080p"]
429
+ TempQualityProfile = ["Web-DL", "HDTV-720p"]
430
+ # Searches missing items with temp profile, switches back after import
431
+ ```
432
+
433
+ ---
434
+
435
+ ### 📊 Quality Management
436
+
437
+ **RSS Sync Automation:**
438
+ ```toml
439
+ [Radarr-Movies]
440
+ RssSyncTimer = 5 # Minutes between RSS feed refreshes (0 = disabled)
441
+ ```
442
+ Keeps Arr instances checking indexers for new releases regularly.
443
+
444
+ **Queue Refresh:**
445
+ ```toml
446
+ [Radarr-Movies]
447
+ RefreshDownloadsTimer = 5 # Minutes between queue updates (0 = disabled)
448
+ ```
449
+ Ensures Arr instances stay in sync with qBittorrent's download state.
450
+
451
+ **Import Mode:**
452
+ ```toml
453
+ [Radarr-Movies]
454
+ importMode = "Auto" # Auto | Move | Copy
455
+ ```
456
+ - **Auto:** Let Arr decide based on its settings
457
+ - **Move:** Move files from download folder to library
458
+ - **Copy:** Copy files (preserves seeding torrents)
459
+
460
+ **Custom Format Score Enforcement:**
461
+ When `ForceMinimumCustomFormat = true`, qBitrr automatically removes torrents that don't meet the minimum custom format score defined in your Arr quality profile.
462
+
463
+ ---
464
+
465
+ ### 🌱 Seeding & Tracker Control
466
+
467
+ **Global Seeding Limits:**
468
+ ```toml
469
+ [Radarr-Movies.Torrent.SeedingMode]
470
+ DownloadRateLimitPerTorrent = -1 # -1 = unlimited, or KB/s
471
+ UploadRateLimitPerTorrent = -1 # -1 = unlimited, or KB/s
472
+ MaxUploadRatio = 2.0 # Stop seeding at 2.0 ratio
473
+ MaxSeedingTime = 604800 # Stop after 7 days (seconds)
474
+ RemoveTorrent = 3 # 1=ratio, 2=time, 3=either, 4=both, -1=never
475
+ ```
476
+
477
+ **Per-Tracker Settings:**
478
+ ```toml
479
+ [[Radarr-Movies.Torrent.Trackers]]
480
+ Name = "MyTracker"
481
+ Priority = 10 # Higher = processed first
482
+ URI = "https://tracker.example/announce"
483
+ MaximumETA = 18000 # Override global MaxETA for this tracker
484
+ DownloadRateLimit = 5000 # KB/s limit for this tracker
485
+ UploadRateLimit = 1000 # KB/s limit for this tracker
486
+ MaxUploadRatio = 1.5 # Tracker-specific ratio limit
487
+ MaxSeedingTime = 86400 # Tracker-specific time limit (1 day)
488
+ AddTrackerIfMissing = true # Inject this tracker into matching torrents
489
+ RemoveIfExists = false # Remove this tracker if found
490
+ SuperSeedMode = true # Enable super seeding for this tracker
491
+ AddTags = ["private", "MyTracker"] # Auto-tag matching torrents
492
+ ```
493
+
494
+ **Tracker Cleanup:**
495
+ ```toml
496
+ [Radarr-Movies.Torrent.SeedingMode]
497
+ RemoveDeadTrackers = true
498
+ RemoveTrackerWithMessage = [
499
+ "skipping tracker announce (unreachable)",
500
+ "No such host is known",
501
+ "unsupported URL protocol"
502
+ ]
503
+ ```
504
+
505
+ **File Filtering:**
506
+ ```toml
507
+ [Radarr-Movies.Torrent]
508
+ CaseSensitiveMatches = false
509
+ FolderExclusionRegex = ["\\bextras?\\b", "\\bsamples?\\b", "\\bfeaturettes?\\b"]
510
+ FileNameExclusionRegex = ["\\bsample\\b", "\\btrailer\\b"]
511
+ FileExtensionAllowlist = [".mp4", ".mkv", ".avi", ".sub", ".srt"]
512
+ AutoDelete = false # Auto-delete non-playable files (.exe, .png, etc.)
513
+ ```
514
+
515
+ ---
516
+
517
+ ### 💾 Disk Space Management
518
+
519
+ **Free Space Monitoring:**
520
+ ```toml
521
+ [Settings]
522
+ FreeSpace = "50G" # Pause when <50GB free (K/M/G/T units)
523
+ FreeSpaceFolder = "/downloads" # Path to monitor
524
+ AutoPauseResume = true # Required for FreeSpace to work
525
+ ```
526
+
527
+ **How it works:**
528
+ 1. 📊 Continuously monitors specified folder
529
+ 2. ⏸️ Pauses **all** torrents when space falls below threshold
530
+ 3. ▶️ Auto-resumes when space is reclaimed
531
+ 4. 🔔 Logs warnings when approaching limit
532
+
533
+ **Disable monitoring:**
534
+ ```toml
535
+ [Settings]
536
+ FreeSpace = "-1" # Disables free space checking
537
+ ```
538
+
539
+ ---
540
+
541
+ ### 🔄 Auto-Updates & Restarts
542
+
543
+ **Scheduled Updates:**
544
+ ```toml
545
+ [Settings]
546
+ AutoUpdateEnabled = true
547
+ AutoUpdateCron = "0 3 * * 0" # Cron expression (default: Sunday 3 AM)
548
+ ```
549
+
550
+ **Manual Updates:**
551
+ - Click "Update Now" in WebUI Config tab
552
+ - Automatically downloads latest version
553
+ - Performs graceful restart
554
+
555
+ **Restart Mechanism:**
556
+ - Uses `os.execv()` for in-place process replacement
557
+ - Maintains same PID (systemd-friendly)
558
+ - Works in Docker, systemd, native installs
559
+ - Cross-platform: Linux, macOS, Windows
560
+ - Graceful shutdown: closes databases, flushes logs, terminates child processes
561
+
562
+ **Restart via API:**
563
+ ```bash
564
+ # Restart entire application
565
+ curl -X POST http://localhost:6969/api/restart
566
+
567
+ # Restart specific Arr manager
568
+ curl -X POST http://localhost:6969/api/arr/radarr-movies/restart
569
+ ```
570
+
571
+ **For systemd users:** See [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md) for automatic restart configuration.
572
+
573
+ ---
574
+
575
+ ## 🖥️ Built-in Web UI
576
+ The React + Vite dashboard provides complete visibility and control over your qBitrr instance.
577
+
578
+ ### 🌐 Access & Authentication
579
+ - **Default URL:** `http://<host>:6969/ui`
580
+ - **Custom host/port:** Configure in `config.toml`:
581
+ ```toml
582
+ [WebUI]
583
+ Host = "0.0.0.0" # Bind address (0.0.0.0 for all interfaces)
584
+ Port = 6969 # Web server port
585
+ ```
586
+ - **Authentication:** Protect API endpoints with bearer token:
587
+ ```toml
588
+ [WebUI]
589
+ Token = "your-secret-token"
590
+ ```
591
+ When set, all `/api/*` endpoints require `Authorization: Bearer <token>` header.
592
+ The UI itself uses unauthenticated `/web/*` endpoints.
593
+
594
+ ### 🗂️ Dashboard Tabs
595
+
596
+ **📊 Processes Tab:**
597
+ - View all running Arr manager processes
598
+ - See current activity and search status
599
+ - Monitor queue counts and metrics
600
+ - Restart individual processes or all at once
601
+
602
+ **📝 Logs Tab:**
603
+ - Real-time log viewer with filtering
604
+ - View `Main.log`, `WebUI.log`, and per-Arr logs
605
+ - Search and navigate large log files
606
+ - Download logs for troubleshooting
607
+
608
+ **🎬 Radarr/Sonarr/Lidarr Tabs:**
609
+ - Browse your media library with advanced filtering
610
+ - Filter by year range, quality status, monitored state
611
+ - See custom format scores and upgrade availability
612
+ - Identify missing media and quality issues
613
+ - View request status for Overseerr/Ombi items
614
+
615
+ **⚙️ Config Tab:**
616
+ - Edit configuration directly in the UI
617
+ - Trigger manual updates
618
+ - View version and changelog
619
+ - Rebuild Arr metadata
620
+ - Restart application
621
+
622
+ ### 🎨 Customization
623
+ ```toml
624
+ [WebUI]
625
+ Theme = "dark" # or "light"
626
+ LiveArr = true # Enable live updates for Arr views
627
+ GroupSonarr = true # Group episodes by series
628
+ GroupLidarr = true # Group albums by artist
629
+ ```
630
+
631
+ ### 🧪 Development
632
+ The WebUI source lives in `webui/`:
633
+ ```bash
634
+ cd webui
635
+ npm ci # Install dependencies
636
+ npm run dev # Dev server with HMR at localhost:5173
637
+ npm run lint # ESLint check
638
+ npm run build # Build for production
639
+ ```
640
+ Build outputs to `webui/dist/`, which gets bundled into `qBitrr/static/`.
641
+
642
+ **API Documentation:** See [API_DOCUMENTATION.md](API_DOCUMENTATION.md) for complete API reference.
643
+
644
+ ---
645
+
646
+ ## 🔁 Day-to-day Operations
647
+
648
+ ### 🔄 Restart & Rebuild
649
+ - **Restart application:** WebUI → Config tab → "Restart All" button
650
+ - **Restart individual Arr manager:** WebUI → Processes tab → Click restart icon
651
+ - **Rebuild Arr metadata:** WebUI → Config tab → "Rebuild Arrs" button
652
+ - **API endpoints:**
653
+ ```bash
654
+ POST /api/restart # Restart qBitrr
655
+ POST /api/arr/<category>/restart # Restart specific manager
656
+ POST /api/arr/rebuild # Rebuild all Arr caches
657
+ ```
658
+
659
+ ### 📋 Monitoring
660
+ - **Logs location:** `~/logs/` (native) or `/config/logs` (Docker)
661
+ - **Log files:**
662
+ - `Main.log` – Main application logs
663
+ - `WebUI.log` – Web interface logs
664
+ - `<CategoryName>.log` – Per-Arr instance logs
665
+ - **View in UI:** WebUI → Logs tab → Select log file
666
+ - **View in terminal:**
667
+ ```bash
668
+ # Native
669
+ tail -f ~/logs/Main.log
670
+
671
+ # Docker
672
+ docker logs -f qbitrr
673
+ docker exec qbitrr tail -f /config/logs/Main.log
674
+
675
+ # Systemd
676
+ sudo journalctl -u qbitrr -f
677
+ ```
678
+
679
+ ### 🔍 Request Integration
680
+ Once configured, qBitrr automatically:
681
+ 1. 📥 Polls Overseerr/Ombi for new requests
682
+ 2. 🔍 Searches requested items in Arr instances
683
+ 3. ⭐ Prioritizes requests over general missing media searches
684
+ 4. 📊 Identifies requests in WebUI Arr tabs with `isRequest` flag
685
+
686
+ ### 🛠️ Special Categories
687
+ qBitrr monitors special qBittorrent categories for manual intervention:
688
+
689
+ **Failed Category:**
690
+ ```toml
691
+ [Settings]
692
+ FailedCategory = "failed"
693
+ ```
694
+ Manually move torrents here to mark them as failed and trigger blacklisting + re-search.
695
+
696
+ **Recheck Category:**
697
+ ```toml
698
+ [Settings]
699
+ RecheckCategory = "recheck"
700
+ ```
701
+ Manually move torrents here to trigger a proper recheck operation.
702
+
703
+ ### 🏷️ Tagless Operation
704
+ ```toml
705
+ [Settings]
706
+ Tagless = true
707
+ ```
708
+ Run qBitrr without requiring Arr instances to tag their torrents. Less precise but works without Arr configuration changes.
709
+
710
+ ---
711
+
712
+ ## 🆘 Troubleshooting
713
+
714
+ ### 🐛 Common Issues
715
+
716
+ **Torrents not being processed:**
717
+ 1. ✅ Verify Arr instance is using the correct **category** in download client settings
718
+ 2. ✅ Ensure Arr instance **tags** match qBitrr's category configuration
719
+ 3. ✅ Check `IgnoreTorrentsYoungerThan` – new torrents have a grace period
720
+ 4. ✅ Enable debug logging: `ConsoleLevel = "DEBUG"`
721
+ 5. ✅ Check category-specific log file in `~/logs/` or `/config/logs/`
722
+
723
+ **Imports not triggering:**
724
+ 1. ✅ Verify `CompletedDownloadFolder` path is correct and accessible
725
+ 2. ✅ Check file extensions against `FileExtensionAllowlist`
726
+ 3. ✅ Review `FolderExclusionRegex` and `FileNameExclusionRegex` for over-matching
727
+ 4. ✅ Enable FFprobe logging to see media validation results
728
+ 5. ✅ Check Arr instance has proper path mappings (especially in Docker)
729
+
730
+ **Search not finding releases:**
731
+ 1. ✅ Verify `SearchMissing = true` in the EntrySearch section
732
+ 2. ✅ Check `SearchLimit` isn't too low for your queue
733
+ 3. ✅ Review `SearchByYear` and `SearchInReverse` settings
734
+ 4. ✅ Ensure Arr instance has indexers configured and working
735
+ 5. ✅ Check for rate limiting in Arr instance logs
736
+
737
+ **High CPU/memory usage:**
738
+ 1. ✅ Reduce `SearchLimit` to lower concurrent searches
739
+ 2. ✅ Increase `LoopSleepTimer` to slow down processing
740
+ 3. ✅ Disable `DoUpgradeSearch` if not needed
741
+ 4. ✅ Set `LiveArr = false` in WebUI config to reduce refresh overhead
742
+
743
+ **Docker path issues:**
744
+ 1. ✅ Ensure volume mounts match between qBittorrent, Arr, and qBitrr
745
+ 2. ✅ Use consistent paths across all containers
746
+ 3. ✅ Example: All containers should see `/downloads` as the same physical path
747
+
748
+ **Updates failing:**
749
+ 1. ✅ Check internet connectivity
750
+ 2. ✅ Verify pip/Python installation is writable
751
+ 3. ✅ Review update logs in `Main.log` or `WebUI.log`
752
+ 4. ✅ Manual update: `pip install --upgrade qBitrr2` (native) or pull new Docker image
753
+
754
+ ### 📊 Enable Debug Logging
755
+ ```toml
756
+ [Settings]
757
+ Logging = true
758
+ ConsoleLevel = "DEBUG" # TRACE for even more detail
759
+ ```
760
+ Logs output to:
761
+ - **Native:** `~/logs/`
762
+ - **Docker:** `/config/logs/`
763
+ - **Systemd:** `sudo journalctl -u qbitrr -n 100`
764
+
765
+ ### 🐞 Reporting Issues
766
+ When reporting bugs:
767
+
768
+ 1. **Enable file logging** and reproduce the issue
769
+ 2. **Collect information:**
770
+ - qBitrr version: `qBitrr2 --version` or Docker tag
771
+ - OS and deployment method (Docker/native/systemd)
772
+ - qBittorrent version and API version (4.x vs 5.x)
773
+ - Arr instance versions (Radarr/Sonarr/Lidarr)
774
+ - Request tool versions (Overseerr/Ombi) if applicable
775
+ 3. **Grab relevant log snippets** (scrub API keys and tokens!)
776
+ 4. **Open an issue** using the [bug report template](.github/ISSUE_TEMPLATE/bug_report.yml)
777
+ 5. **Include:**
778
+ - Clear reproduction steps
779
+ - Expected vs. actual behavior
780
+ - Relevant config sections (with secrets removed)
781
+ - Error messages and stack traces
782
+
783
+ ### 💡 Feature Requests
784
+ Have an idea? Submit it via the [feature request template](.github/ISSUE_TEMPLATE/feature_request.yml)!
785
+
786
+ ### 📚 Additional Resources
787
+ - **API Documentation:** [API_DOCUMENTATION.md](API_DOCUMENTATION.md)
788
+ - **Systemd Setup:** [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md)
789
+ - **Example Config:** [config.example.toml](config.example.toml)
790
+ - **GitHub Issues:** [Search existing issues](https://github.com/Feramance/qBitrr/issues)
791
+
792
+ ---
793
+
794
+ ## 🤝 Contributing
795
+
796
+ We welcome contributions from the community! Whether it's code, documentation, bug reports, or feature ideas, your help makes qBitrr better.
797
+
798
+ ### 🔧 Development Setup
799
+
800
+ **Python Backend:**
801
+ ```bash
802
+ # Clone the repo
803
+ git clone https://github.com/Feramance/qBitrr.git
804
+ cd qBitrr
805
+
806
+ # Create virtual environment
807
+ make newenv
808
+ # or: python -m venv .venv && source .venv/bin/activate
809
+
810
+ # Install dependencies
811
+ make syncenv
812
+ # or: pip install -e .[all]
813
+
814
+ # Run linting and formatting
815
+ make reformat
816
+ # or: pre-commit run --all-files
817
+ ```
818
+
819
+ **TypeScript/React WebUI:**
820
+ ```bash
821
+ cd webui
822
+ npm ci # Install exact versions from package-lock.json
823
+ npm run dev # Dev server at localhost:5173
824
+ npm run lint # ESLint check
825
+ npm run build # Build for production
826
+ ```
827
+
828
+ ### 📝 Before Submitting a PR
829
+
830
+ 1. ✅ Read the [pull request template](.github/pull_request_template.md)
831
+ 2. ✅ **Format code:**
832
+ - Python: `make reformat` or `pre-commit run --all-files`
833
+ - TypeScript: `npm run lint` in `webui/`
834
+ 3. ✅ **Test your changes:**
835
+ - Run against live qBittorrent + Arr instances
836
+ - Test in both Docker and native environments if possible
837
+ 4. ✅ **Update documentation:**
838
+ - Add/update relevant sections in README.md
839
+ - Update `config.example.toml` if adding config options
840
+ - Document API changes in `API_DOCUMENTATION.md`
841
+ 5. ✅ **Clean commit history:**
842
+ - Use descriptive commit messages
843
+ - Follow [conventional commits](https://www.conventionalcommits.org/) format
844
+ - Squash WIP commits before submitting
845
+
846
+ ### 💡 Contribution Ideas
847
+
848
+ - 🐛 **Bug fixes** – check [open issues](https://github.com/Feramance/qBitrr/issues)
849
+ - ✨ **Features** – see [feature requests](https://github.com/Feramance/qBitrr/labels/enhancement)
850
+ - 📚 **Documentation** – improve guides, add examples, fix typos
851
+ - 🌍 **Translations** – help internationalize the WebUI
852
+ - 🧪 **Testing** – add test coverage, validate edge cases
853
+
854
+ **Unsure if an idea fits?** Open a [feature request](.github/ISSUE_TEMPLATE/feature_request.yml) first and let's discuss!
855
+
856
+ ### 📜 Code Guidelines
857
+
858
+ See [CONTRIBUTION.md](CONTRIBUTION.md) for comprehensive coding standards and architecture details.
859
+
860
+ **Quick summary:**
861
+ - **Python:** Black formatting (99 chars), type hints required, PEP 8 naming
862
+ - **TypeScript:** ESLint strict mode, explicit types, functional components only
863
+ - **Commits:** LF line endings, no trailing whitespace, EOF newline required
864
+ - **Errors:** Inherit from `qBitManagerError`, provide actionable messages
865
+
866
+ ---
867
+
868
+ ## ❤️ Support
869
+
870
+ ### 🌟 Show Your Support
871
+ - ⭐ **Star the repo** – helps others discover qBitrr
872
+ - 🐛 **Report bugs** – attach logs so we can fix issues faster
873
+ - 💬 **Share feedback** – tell us what works and what doesn't
874
+ - 🛠️ **Contribute** – code, docs, translations, or just good vibes
875
+
876
+ ### 💰 Sponsor Development
877
+ If qBitrr saves you time and headaches, consider supporting its development:
878
+
879
+ - 🎨 [Patreon](https://patreon.com/qBitrr) – monthly support
880
+ - 💸 [PayPal](https://www.paypal.me/feramance) – one-time donations
881
+
882
+ Your support keeps qBitrr maintained, updated, and improving. Thank you! 🙏
883
+
884
+ ---
885
+
886
+ ## 📄 License
887
+
888
+ qBitrr is released under the [MIT License](LICENSE).
889
+
890
+ **TL;DR:** Use it, modify it, share it—commercially or personally. Just keep the copyright notice and don't blame us if things break. 😊
891
+
892
+ ---
893
+
894
+ ## 🔗 Quick Links
895
+
896
+ - 📦 [PyPI Package](https://pypi.org/project/qBitrr2/)
897
+ - 🐳 [Docker Hub](https://hub.docker.com/r/feramance/qbitrr)
898
+ - 📚 [API Documentation](API_DOCUMENTATION.md)
899
+ - ⚙️ [Systemd Setup Guide](SYSTEMD_SERVICE.md)
900
+ - 📝 [Example Configuration](config.example.toml)
901
+ - 🐛 [Report a Bug](.github/ISSUE_TEMPLATE/bug_report.yml)
902
+ - ✨ [Request a Feature](.github/ISSUE_TEMPLATE/feature_request.yml)
903
+ - 💬 [Discussions](https://github.com/Feramance/qBitrr/discussions)
904
+
905
+ ---
906
+
907
+ <div align="center">
908
+
909
+ **Made with ❤️ by the qBitrr community**
910
+
911
+ </div>
@@ -1,7 +1,7 @@
1
1
  qBitrr/__init__.py,sha256=smiPIV7d2lMJ_KTtFdAVlxLEBobFTheILdgry1iqpjQ,405
2
2
  qBitrr/arss.py,sha256=vMDJp_0Qi3YmYUK49r3kgEgJXG2O_CAXcyDk7XtKYms,305714
3
3
  qBitrr/auto_update.py,sha256=hVAvAlKEdOHm6AJLlKvtkklbQhjotVcFOCH-MTigHQM,4419
4
- qBitrr/bundled_data.py,sha256=0N3GiJmjszT6GInb7wAerFJ-a7NHbm5NSOYaI8Yu9ik,220
4
+ qBitrr/bundled_data.py,sha256=zcBgptSVce-JDTdZ6anG72AiFrRpyIfGfQ8xmWMl6g8,221
5
5
  qBitrr/config.py,sha256=e_UL8Jjz2hWAhT53Du8XZpvyY4ULC5mpyus_7i2An18,6306
6
6
  qBitrr/db_lock.py,sha256=SRCDIoqg-AFLU-VDChAmGdfx8nhgLGETn6XKF3RdJT4,2449
7
7
  qBitrr/env_config.py,sha256=299u_uEoyxlM_ceTD0Z_i41JdYjSHmqO6FKe7qGFgTM,2866
@@ -10,15 +10,15 @@ qBitrr/ffprobe.py,sha256=2IM0iuPPTEb0xHmN1OetQoBd80-Nmv5Oq7P6o-mjBd0,4019
10
10
  qBitrr/gen_config.py,sha256=m14KIAgoXgJ3T2uQxErwz8AzEKLanndaxly85C4HZ1M,36903
11
11
  qBitrr/home_path.py,sha256=zvBheAR2xvr8LBZRk1FyqfnALE-eFzsY9CyqyZDjxiE,626
12
12
  qBitrr/logger.py,sha256=f3LNcvl4lizTxQMXjFzv5urpPbUYEkaSGVGFP39cNbk,9005
13
- qBitrr/main.py,sha256=lv4y7Ew5xOCFt37koFGdoqQcv6xULZwojt2ne0LmkD4,19976
13
+ qBitrr/main.py,sha256=xi-jzN7klPl_FkctqXA2g-_-qNy4px4ELNDDv9QscXo,21746
14
14
  qBitrr/search_activity_store.py,sha256=_7MD7fFna4uTSo_pRT7DqoytSVz7tPoU9D2AV2mn-oc,2474
15
15
  qBitrr/tables.py,sha256=cumrb5aqJ0Uufu2biDPCIgu1_TP0hlHVi7dgAQKK_bM,3969
16
16
  qBitrr/utils.py,sha256=T10win016yHwMMJlJ4yuPTRUI9m-AS_a_MouiAJAtC8,8190
17
17
  qBitrr/versioning.py,sha256=00um_zKic8mMrNZ7IHEUPx4ju5Yi_TWCgZxl81IfMaM,3362
18
18
  qBitrr/webui.py,sha256=zb9QvWwp2boEglhnm1qaAEiwjH4v9L9BWZNJ-ZRGJZY,95603
19
- qbitrr2-5.3.1.dist-info/licenses/LICENSE,sha256=P978aVGi7dPbKz8lfvdiryOS5IjTAU7AA47XhBhVBlI,1066
20
- qbitrr2-5.3.1.dist-info/METADATA,sha256=3IQmIPJpwMnTisfkfq3Oyia7ruOgPBrbCS756EpcMvA,10178
21
- qbitrr2-5.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
- qbitrr2-5.3.1.dist-info/entry_points.txt,sha256=MIR-l5s31VBs9qlv3HiAaMdpOOyy0MNGfM7Ib1-fKeQ,43
23
- qbitrr2-5.3.1.dist-info/top_level.txt,sha256=jIINodarzsPcQeTf-vvK8-_g7cQ8CvxEg41ms14K97g,7
24
- qbitrr2-5.3.1.dist-info/RECORD,,
19
+ qbitrr2-5.3.3.dist-info/licenses/LICENSE,sha256=P978aVGi7dPbKz8lfvdiryOS5IjTAU7AA47XhBhVBlI,1066
20
+ qbitrr2-5.3.3.dist-info/METADATA,sha256=ZP30eCUzcRm8-rmnh0AvkRsQGbRzef7PVEFux1ADtWI,33177
21
+ qbitrr2-5.3.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
22
+ qbitrr2-5.3.3.dist-info/entry_points.txt,sha256=MIR-l5s31VBs9qlv3HiAaMdpOOyy0MNGfM7Ib1-fKeQ,43
23
+ qbitrr2-5.3.3.dist-info/top_level.txt,sha256=jIINodarzsPcQeTf-vvK8-_g7cQ8CvxEg41ms14K97g,7
24
+ qbitrr2-5.3.3.dist-info/RECORD,,
@@ -1,231 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: qBitrr2
3
- Version: 5.3.1
4
- Summary: "A simple Python script to talk to qBittorrent and Arr's"
5
- Home-page: https://github.com/Feramance/qBitrr
6
- Author: Feramance
7
- Author-email: fera@fera.wtf
8
- License: MIT
9
- Project-URL: Issue Tracker, https://github.com/Feramance/qBitrr/issues
10
- Project-URL: Source Code, https://github.com/Feramance/qBitrr
11
- Classifier: Development Status :: 5 - Production/Stable
12
- Classifier: Intended Audience :: Developers
13
- Classifier: Intended Audience :: End Users/Desktop
14
- Classifier: License :: OSI Approved :: MIT License
15
- Classifier: Natural Language :: English
16
- Classifier: Operating System :: MacOS :: MacOS X
17
- Classifier: Operating System :: Microsoft :: Windows
18
- Classifier: Operating System :: POSIX :: Linux
19
- Classifier: Programming Language :: Python :: 3 :: Only
20
- Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: Implementation :: CPython
22
- Classifier: Programming Language :: Python :: Implementation :: PyPy
23
- Classifier: Topic :: Terminals
24
- Classifier: Topic :: Utilities
25
- Classifier: Typing :: Typed
26
- Requires-Python: <4,>=3.12
27
- Description-Content-Type: text/markdown
28
- License-File: LICENSE
29
- Requires-Dist: cachetools
30
- Requires-Dist: colorama
31
- Requires-Dist: coloredlogs
32
- Requires-Dist: flask
33
- Requires-Dist: environ-config
34
- Requires-Dist: ffmpeg-python
35
- Requires-Dist: jaraco.docker
36
- Requires-Dist: packaging
37
- Requires-Dist: pathos
38
- Requires-Dist: peewee
39
- Requires-Dist: ping3
40
- Requires-Dist: pyarr
41
- Requires-Dist: qbittorrent-api
42
- Requires-Dist: requests
43
- Requires-Dist: tomlkit
44
- Requires-Dist: waitress
45
- Requires-Dist: croniter
46
- Provides-Extra: dev
47
- Requires-Dist: black==24.3.0; extra == "dev"
48
- Requires-Dist: bump2version==1.0.1; extra == "dev"
49
- Requires-Dist: isort==5.10.1; extra == "dev"
50
- Requires-Dist: pip-tools==7.3.0; extra == "dev"
51
- Requires-Dist: pre-commit==3.3.3; extra == "dev"
52
- Requires-Dist: pyinstaller==5.13.1; extra == "dev"
53
- Requires-Dist: pyupgrade==2.31.0; extra == "dev"
54
- Requires-Dist: twine==3.7.1; extra == "dev"
55
- Requires-Dist: ujson==5.10.0; extra == "dev"
56
- Requires-Dist: upgrade-pip==0.1.4; extra == "dev"
57
- Provides-Extra: fast
58
- Requires-Dist: ujson==5.10.0; extra == "fast"
59
- Provides-Extra: all
60
- Requires-Dist: black==24.3.0; extra == "all"
61
- Requires-Dist: bump2version==1.0.1; extra == "all"
62
- Requires-Dist: isort==5.10.1; extra == "all"
63
- Requires-Dist: pip-tools==7.3.0; extra == "all"
64
- Requires-Dist: pre-commit==3.3.3; extra == "all"
65
- Requires-Dist: pyinstaller==5.13.1; extra == "all"
66
- Requires-Dist: pyupgrade==2.31.0; extra == "all"
67
- Requires-Dist: twine==3.7.1; extra == "all"
68
- Requires-Dist: ujson==5.10.0; extra == "all"
69
- Requires-Dist: upgrade-pip==0.1.4; extra == "all"
70
- Requires-Dist: ujson==5.10.0; extra == "all"
71
- Dynamic: license-file
72
-
73
- # qBitrr
74
-
75
- [![PyPI](https://img.shields.io/pypi/v/qBitrr2?label=PyPI)](https://pypi.org/project/qBitrr2/)
76
- [![Downloads](https://img.shields.io/pypi/dm/qBitrr2)](https://pypi.org/project/qBitrr2/)
77
- [![Docker Pulls](https://img.shields.io/docker/pulls/feramance/qbitrr.svg)](https://hub.docker.com/r/feramance/qbitrr)
78
- [![CodeQL](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml/badge.svg?branch=master)](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml)
79
- [![Nightly Build](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml/badge.svg?branch=master)](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml)
80
- [![pre-commit.ci](https://results.pre-commit.ci/badge/github/Feramance/qBitrr/master.svg)](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
81
- [![License: MIT](https://img.shields.io/pypi/l/qbitrr)](LICENSE)
82
-
83
- > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, Lidarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
84
-
85
- ## 📚 What's Inside
86
- - [Overview](#-overview)
87
- - [Highlights](#-highlights)
88
- - [State of the Project](#-state-of-the-project)
89
- - [Quickstart](#-quickstart)
90
- - [Install with pip](#install-with-pip)
91
- - [Run with Docker](#run-with-docker)
92
- - [Configuration](#-configuration)
93
- - [Built-in Web UI](#-built-in-web-ui)
94
- - [Day-to-day Ops](#-day-to-day-ops)
95
- - [Troubleshooting](#-troubleshooting)
96
- - [Contributing](#-contributing)
97
- - [Support](#-support)
98
- - [License](#-license)
99
-
100
- ## 🧠 Overview
101
- qBitrr is the glue that keeps the *Arr ecosystem tidy. It watches qBittorrent for stalled jobs, kicks Radarr/Sonarr/Lidarr when something finishes, prunes your completed folder, and even offers a slick React dashboard so you can see what's running at a glance.
102
-
103
- ## ✨ Highlights
104
- - 🚑 **Health checks** – spot stalled or broken torrents, blacklist them on the relevant Arr, and optionally trigger a re-search.
105
- - 📬 **Instant imports** – call `DownloadedMoviesScan` and `DownloadedEpisodesScan` the moment qBittorrent is done.
106
- - 🧹 **Smart skips & cleanup** – ignore by extension, folder, or regex and keep completed downloads tidy.
107
- - 🔍 **ffprobe verification** – confirm files are real media before handing them off.
108
- - 🔄 **Arr keep-alive** – schedule RSS refreshes, queue updates, missing-media searches, CF-score rescans, and more.
109
- - 🛰️ **Request automation** – pull in Overseerr/Ombi asks and auto-manage trackers.
110
- - 💾 **Disk guard rails** – pause torrenting when free space dips under your threshold.
111
- - 💻 **First-party Web UI** – live process monitoring, log tails, Arr insights, and config edits in one place.
112
-
113
- ## 📌 State of the Project
114
- The long-term plan is still to ship a C# rewrite, but the Python edition isn't going anywhere—it gets regular fixes and features, and the Web UI is now production-ready. Ideas and PRs are welcome! Head over to the [issue templates](.github/ISSUE_TEMPLATE) or the [PR checklist](.github/pull_request_template.md) to get started.
115
-
116
- ## ⚡ Quickstart
117
- qBitrr supports Python 3.12+ on Linux, macOS, and Windows. Run it natively or in Docker—whatever fits your stack.
118
-
119
- ### Install with pip
120
- ```bash
121
- python -m venv .venv
122
- source .venv/bin/activate # Windows: .venv\Scripts\activate
123
- python -m pip install --upgrade pip
124
- python -m pip install qBitrr2
125
-
126
- # First run creates ~/config/config.toml
127
- qBitrr2
128
- ```
129
-
130
- Update later with:
131
- ```bash
132
- python -m pip install --upgrade qBitrr2
133
- ```
134
-
135
- ### Run with Docker
136
- Minimal setup:
137
- ```bash
138
- docker run -d \
139
- --name qbitrr \
140
- --tty \
141
- -e TZ=Europe/London \
142
- -p 6969:6969 \
143
- -v /etc/localtime:/etc/localtime:ro \
144
- -v /path/to/appdata/qbitrr:/config \
145
- -v /path/to/completed/downloads:/completed_downloads:rw \
146
- --restart unless-stopped \
147
- feramance/qbitrr:latest
148
- ```
149
-
150
- The container automatically binds its WebUI to `0.0.0.0`; exposing `6969` makes the dashboard reachable at `http://<host>:6969/ui`.
151
-
152
- Compose example with a little more structure:
153
- ```yaml
154
- services:
155
- qbitrr:
156
- image: feramance/qbitrr:latest
157
- user: 1000:1000
158
- restart: unless-stopped
159
- tty: true
160
- environment:
161
- TZ: Europe/London
162
- ports:
163
- - "6969:6969"
164
- volumes:
165
- - /etc/localtime:/etc/localtime:ro
166
- - /path/to/appdata/qbitrr:/config
167
- - /path/to/completed/downloads:/completed_downloads:rw
168
- logging:
169
- driver: json-file
170
- options:
171
- max-size: 50m
172
- max-file: "3"
173
- depends_on:
174
- - qbittorrent
175
- - radarr-1080p
176
- - sonarr-1080p
177
- ```
178
-
179
- > ℹ️ On first boot the container writes `config.toml` under `/config`. Update the values to match your mounts and restart the container.
180
-
181
- ## 🛠️ Configuration
182
- - Default config path: `~/config/config.toml` (native) or `/config/config.toml` (Docker).
183
- - Tag new downloads in Radarr/Sonarr/Lidarr so qBitrr can map them correctly.
184
- - qBittorrent 5.x works via a config flag (will become default later). The latest validated build is **4.6.7**.
185
- - Turn on logging (`Settings.Logging = true`) when you need support—logs land in `~/logs/` or `/config/logs`.
186
-
187
- See `config.example.toml` for every knob and dial.
188
-
189
- ## 🖥️ Built-in Web UI
190
- The React + Vite dashboard listens on `http://<host>:6969/ui` by default.
191
-
192
- - 🔐 **Authentication** – set `Settings.WebUIToken` to protect `/api/*`. The UI itself uses the `/web/*` helpers.
193
- - 🗂️ **Tabs** – Processes, Logs, Radarr, Sonarr, Lidarr, and Config—all live data, all actionable.
194
- - 🧪 **Developing the UI** – the source lives in `webui/`. Run `npm ci && npm run dev` to hack locally, and `npm run build` (or `make syncenv`) before committing so the bundled assets stay current.
195
-
196
- ## 🔁 Day-to-day Ops
197
- - ♻️ Rebuild Arr metadata via "Rebuild Arrs" in the UI or `POST /api/arr/rebuild`.
198
- - 🔁 Restart individual loops or slam the "Restart All" button when something is stuck.
199
- - 📬 Overseerr/Ombi integration pulls new requests automatically once configured.
200
- - 🗃️ Logs roll into `~/logs/` (think `Main.log`, `WebUI.log`, etc.)—view them in the UI or right off disk.
201
-
202
- ## 🆘 Troubleshooting
203
- 1. Enable file logging, reproduce the issue, and grab the relevant snippets (scrub secrets).
204
- 2. Open the [bug report template](.github/ISSUE_TEMPLATE/bug_report.yml). Include:
205
- - qBitrr version (`qBitrr2 --version` or Docker tag)
206
- - OS / deployment details
207
- - qBittorrent + Arr versions (and request tools if used)
208
- - Reproduction steps and what you expected to happen
209
- 3. For feature ideas, hop over to the [feature request template](.github/ISSUE_TEMPLATE/feature_request.yml).
210
-
211
- ## 🤝 Contributing
212
- We'd love your help! Before opening a PR:
213
- - Read the [pull request template](.github/pull_request_template.md).
214
- - Run `make lint` or `pre-commit run --all-files` for Python changes; `npm run lint` for UI code.
215
- - Add or update tests when behaviour changes.
216
- - Mention docs or release notes updates if users should know about the change.
217
-
218
- Unsure whether an idea fits? File a feature request first and we'll chat.
219
-
220
- ## ❤️ Support
221
- - ⭐ Star the repo to spread the word.
222
- - 🐛 Report issues with logs attached so we can fix them faster.
223
- - 🛠️ Contribute code, docs, translations—whatever you enjoy.
224
- - ☕ Sponsor development:
225
- - [Patreon](https://patreon.com/qBitrr)
226
- - [PayPal](https://www.paypal.me/feramance)
227
-
228
- Every bit of support keeps qBitrr humming—thanks for being here!
229
-
230
- ## 📄 License
231
- qBitrr is released under the [MIT License](LICENSE).