qBitrr2 5.3.2__tar.gz → 5.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qbitrr2-5.4.0/PKG-INFO +911 -0
- qbitrr2-5.4.0/README.md +827 -0
- qbitrr2-5.4.0/pyproject.toml +66 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/arss.py +18 -15
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/bundled_data.py +2 -2
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/main.py +49 -2
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/webui.py +335 -65
- qbitrr2-5.4.0/qBitrr2.egg-info/PKG-INFO +911 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/setup.cfg +26 -2
- qbitrr2-5.3.2/PKG-INFO +0 -231
- qbitrr2-5.3.2/README.md +0 -159
- qbitrr2-5.3.2/pyproject.toml +0 -43
- qbitrr2-5.3.2/qBitrr2.egg-info/PKG-INFO +0 -231
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/LICENSE +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/MANIFEST.in +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/config.example.toml +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/__init__.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/auto_update.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/config.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/db_lock.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/env_config.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/errors.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/ffprobe.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/gen_config.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/home_path.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/logger.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/search_activity_store.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/tables.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/utils.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr/versioning.py +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr2.egg-info/SOURCES.txt +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr2.egg-info/dependency_links.txt +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr2.egg-info/entry_points.txt +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr2.egg-info/requires.txt +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/qBitrr2.egg-info/top_level.txt +0 -0
- {qbitrr2-5.3.2 → qbitrr2-5.4.0}/setup.py +0 -0
qbitrr2-5.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,911 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: qBitrr2
|
|
3
|
+
Version: 5.4.0
|
|
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>
|