qBitrr2 5.3.2__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 +2 -2
- qBitrr/main.py +49 -2
- qbitrr2-5.3.3.dist-info/METADATA +911 -0
- {qbitrr2-5.3.2.dist-info → qbitrr2-5.3.3.dist-info}/RECORD +8 -8
- qbitrr2-5.3.2.dist-info/METADATA +0 -231
- {qbitrr2-5.3.2.dist-info → qbitrr2-5.3.3.dist-info}/WHEEL +0 -0
- {qbitrr2-5.3.2.dist-info → qbitrr2-5.3.3.dist-info}/entry_points.txt +0 -0
- {qbitrr2-5.3.2.dist-info → qbitrr2-5.3.3.dist-info}/licenses/LICENSE +0 -0
- {qbitrr2-5.3.2.dist-info → qbitrr2-5.3.3.dist-info}/top_level.txt +0 -0
qBitrr/bundled_data.py
CHANGED
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("
|
|
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
|
-
|
|
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
|
+
[](https://pypi.org/project/qBitrr2/)
|
|
88
|
+
[](https://pypi.org/project/qBitrr2/)
|
|
89
|
+
[](https://hub.docker.com/r/feramance/qbitrr)
|
|
90
|
+
[](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml)
|
|
91
|
+
[](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml)
|
|
92
|
+
[](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
|
|
93
|
+
[](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=
|
|
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=
|
|
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.
|
|
20
|
-
qbitrr2-5.3.
|
|
21
|
-
qbitrr2-5.3.
|
|
22
|
-
qbitrr2-5.3.
|
|
23
|
-
qbitrr2-5.3.
|
|
24
|
-
qbitrr2-5.3.
|
|
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,,
|
qbitrr2-5.3.2.dist-info/METADATA
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: qBitrr2
|
|
3
|
-
Version: 5.3.2
|
|
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
|
-
[](https://pypi.org/project/qBitrr2/)
|
|
76
|
-
[](https://pypi.org/project/qBitrr2/)
|
|
77
|
-
[](https://hub.docker.com/r/feramance/qbitrr)
|
|
78
|
-
[](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml)
|
|
79
|
-
[](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml)
|
|
80
|
-
[](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
|
|
81
|
-
[](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).
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|