qBitrr2 5.6.1__py3-none-any.whl → 5.6.2__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.
@@ -1,1210 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: qBitrr2
3
- Version: 5.6.1
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://feramance.github.io/qBitrr/
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://feramance.github.io/qBitrr/getting-started/installation/systemd/
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.11
29
- Classifier: Programming Language :: Python :: 3.12
30
- Classifier: Programming Language :: Python :: Implementation :: CPython
31
- Classifier: Programming Language :: Python :: Implementation :: PyPy
32
- Classifier: Topic :: Communications
33
- Classifier: Topic :: Internet
34
- Classifier: Topic :: Multimedia :: Video
35
- Classifier: Topic :: System :: Monitoring
36
- Classifier: Topic :: Terminals
37
- Classifier: Topic :: Utilities
38
- Classifier: Typing :: Typed
39
- Requires-Python: <4,>=3.11
40
- Description-Content-Type: text/markdown
41
- License-File: LICENSE
42
- Requires-Dist: cachetools
43
- Requires-Dist: colorama
44
- Requires-Dist: coloredlogs
45
- Requires-Dist: flask
46
- Requires-Dist: environ-config
47
- Requires-Dist: ffmpeg-python
48
- Requires-Dist: jaraco.docker
49
- Requires-Dist: packaging
50
- Requires-Dist: pathos
51
- Requires-Dist: peewee
52
- Requires-Dist: ping3
53
- Requires-Dist: pyarr
54
- Requires-Dist: qbittorrent-api
55
- Requires-Dist: requests
56
- Requires-Dist: tomlkit
57
- Requires-Dist: waitress
58
- Requires-Dist: croniter
59
- Provides-Extra: dev
60
- Requires-Dist: black==24.3.0; extra == "dev"
61
- Requires-Dist: bump2version==1.0.1; extra == "dev"
62
- Requires-Dist: isort==5.10.1; extra == "dev"
63
- Requires-Dist: pip-tools==7.3.0; extra == "dev"
64
- Requires-Dist: pre-commit==3.3.3; extra == "dev"
65
- Requires-Dist: pyinstaller==5.13.1; extra == "dev"
66
- Requires-Dist: pyupgrade==2.31.0; extra == "dev"
67
- Requires-Dist: twine==3.7.1; extra == "dev"
68
- Requires-Dist: ujson==5.10.0; extra == "dev"
69
- Requires-Dist: upgrade-pip==0.1.4; extra == "dev"
70
- Provides-Extra: fast
71
- Requires-Dist: ujson==5.10.0; extra == "fast"
72
- Provides-Extra: docs
73
- Requires-Dist: mkdocs>=1.5.3; extra == "docs"
74
- Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
75
- Requires-Dist: mkdocs-material-extensions>=1.3.0; extra == "docs"
76
- Requires-Dist: mkdocs-git-revision-date-localized-plugin>=1.2.0; extra == "docs"
77
- Requires-Dist: mkdocs-minify-plugin>=0.7.0; extra == "docs"
78
- Requires-Dist: mkdocs-redirects>=1.2.0; extra == "docs"
79
- Requires-Dist: mkdocs-include-markdown-plugin>=6.0.0; extra == "docs"
80
- Requires-Dist: pymdown-extensions>=10.0.0; extra == "docs"
81
- Requires-Dist: markdown-include>=0.8.0; extra == "docs"
82
- Provides-Extra: all
83
- Requires-Dist: black==24.3.0; extra == "all"
84
- Requires-Dist: bump2version==1.0.1; extra == "all"
85
- Requires-Dist: isort==5.10.1; extra == "all"
86
- Requires-Dist: pip-tools==7.3.0; extra == "all"
87
- Requires-Dist: pre-commit==3.3.3; extra == "all"
88
- Requires-Dist: pyinstaller==5.13.1; extra == "all"
89
- Requires-Dist: pyupgrade==2.31.0; extra == "all"
90
- Requires-Dist: twine==3.7.1; extra == "all"
91
- Requires-Dist: ujson==5.10.0; extra == "all"
92
- Requires-Dist: upgrade-pip==0.1.4; extra == "all"
93
- Requires-Dist: ujson==5.10.0; extra == "all"
94
- Requires-Dist: mkdocs>=1.5.3; extra == "all"
95
- Requires-Dist: mkdocs-material>=9.5.0; extra == "all"
96
- Requires-Dist: mkdocs-material-extensions>=1.3.0; extra == "all"
97
- Requires-Dist: mkdocs-git-revision-date-localized-plugin>=1.2.0; extra == "all"
98
- Requires-Dist: mkdocs-minify-plugin>=0.7.0; extra == "all"
99
- Requires-Dist: mkdocs-redirects>=1.2.0; extra == "all"
100
- Requires-Dist: mkdocs-include-markdown-plugin>=6.0.0; extra == "all"
101
- Requires-Dist: pymdown-extensions>=10.0.0; extra == "all"
102
- Requires-Dist: markdown-include>=0.8.0; extra == "all"
103
- Dynamic: license-file
104
-
105
- # <img src="assets/logov2-clean.png" alt="qBitrr Logo" width="40" style="vertical-align: middle;"/> qBitrr
106
-
107
- [![PyPI](https://img.shields.io/pypi/v/qBitrr2?label=PyPI)](https://pypi.org/project/qBitrr2/)
108
- [![Downloads](https://img.shields.io/pypi/dm/qBitrr2)](https://pypi.org/project/qBitrr2/)
109
- [![Docker Pulls](https://img.shields.io/docker/pulls/feramance/qbitrr.svg)](https://hub.docker.com/r/feramance/qbitrr)
110
- [![CodeQL](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml/badge.svg?branch=master)](https://github.com/Feramance/qBitrr/actions/workflows/codeql.yml)
111
- [![Nightly Build](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml/badge.svg?branch=master)](https://github.com/Feramance/qBitrr/actions/workflows/nightly.yml)
112
- [![pre-commit.ci](https://results.pre-commit.ci/badge/github/Feramance/qBitrr/master.svg)](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
113
- [![License: MIT](https://img.shields.io/pypi/l/qbitrr)](LICENSE)
114
-
115
- > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, Lidarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
116
-
117
- ## 📚 What's Inside
118
- - [Overview](#-overview)
119
- - [Core Features](#-core-features)
120
- - [State of the Project](#-state-of-the-project)
121
- - [Quickstart](#-quickstart)
122
- - [Install with pip](#install-with-pip)
123
- - [Run with Docker](#run-with-docker)
124
- - [Native Systemd Service](#native-systemd-service)
125
- - [Configuration](#-configuration)
126
- - [Feature Deep Dive](#-feature-deep-dive)
127
- - [Torrent Health Monitoring](#-torrent-health-monitoring)
128
- - [Automated Search & Requests](#-automated-search--requests)
129
- - [Quality Management](#-quality-management)
130
- - [Seeding & Tracker Control](#-seeding--tracker-control)
131
- - [Disk Space Management](#-disk-space-management)
132
- - [Auto-Updates & Restarts](#-auto-updates--restarts)
133
- - [Built-in Web UI](#-built-in-web-ui)
134
- - [Day-to-day Operations](#-day-to-day-operations)
135
- - [Troubleshooting](#-troubleshooting)
136
- - [Contributing](#-contributing)
137
- - [Support](#-support)
138
- - [License](#-license)
139
-
140
- ## 🧠 Overview
141
- 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.
142
-
143
- ## ✨ Core Features
144
-
145
- ### 🚑 Torrent Health & Import Management
146
- - **Instant imports** – trigger `DownloadedMoviesScan`/`DownloadedEpisodesScan` the moment torrents finish
147
- - **Stalled torrent detection** – identify and handle stuck/slow downloads with configurable thresholds
148
- - **Failed download handling** – automatically blacklist failed torrents in Arr instances and trigger re-searches
149
- - **FFprobe verification** – validate media files are playable before import (auto-downloads FFprobe binary)
150
- - **Smart file filtering** – exclude samples, extras, trailers via regex and extension allowlists
151
-
152
- ### 🔍 Automated Search & Request Integration
153
- - **Missing media search** – automatically search for missing movies/episodes/albums on schedules
154
- - **Quality upgrade search** – find better releases for existing media based on quality profiles
155
- - **Custom format scoring** – search for releases meeting minimum custom format scores
156
- - **Overseerr/Ombi integration** – auto-pull and prioritize user requests from request management tools
157
- - **Smart search modes** – series-level or episode-level search for TV shows based on context
158
- - **Temporary quality profiles** – use lower quality profiles for missing items, upgrade later with flexible mapping
159
-
160
- ### 📊 Quality & Metadata Management
161
- - **RSS sync automation** – schedule periodic RSS feed refreshes across all Arr instances
162
- - **Queue management** – auto-refresh download queues to keep Arr instances in sync
163
- - **Custom format enforcement** – automatically remove torrents not meeting minimum CF scores
164
- - **Quality profile switching** – dynamically change profiles for missing vs. upgrade searches with per-profile mapping
165
- - **Interactive profile configuration** – test Arr connections and select quality profiles from dropdowns in WebUI
166
- - **Auto-reset profiles** – force reset temp profiles on startup or after configurable timeouts
167
- - **Year-based search ordering** – prioritize searches by release date (newest first or reverse)
168
-
169
- ### 🌱 Seeding & Tracker Control
170
- - **Per-tracker settings** – configure MaxETA, ratios, seeding time per tracker
171
- - **Global seeding limits** – set upload/download rate limits, max ratios, and seeding times
172
- - **Automatic removal** – remove torrents based on ratio, time, or both
173
- - **Dead tracker cleanup** – auto-remove trackers with specific error messages
174
- - **Tracker injection** – add missing trackers or remove existing ones per torrent
175
- - **Super seed mode** – enable super seeding for specific trackers
176
- - **Tag management** – auto-tag torrents by tracker or custom rules
177
-
178
- ### 💾 Disk Space & Resource Management
179
- - **Free space monitoring** – pause all torrents when disk space falls below threshold
180
- - **Auto pause/resume** – intelligently manage torrent activity based on disk availability
181
- - **Configurable thresholds** – set limits in KB, MB, GB, or TB
182
- - **Path-specific monitoring** – watch specific directories for space issues
183
-
184
- ### 🔄 Auto-Updates & Self-Healing
185
- - **GitHub release-based updates** – automatically checks for published (non-draft) releases via GitHub API
186
- - **Scheduled auto-updates** – update qBitrr on a cron schedule (default: weekly Sunday 3 AM)
187
- - **Manual update trigger** – one-click updates from WebUI
188
- - **Installation-aware updates** – detects git/pip/binary installs and uses appropriate update method
189
- - **Version verification** – confirms installed version matches target before restart
190
- - **Smart restart mechanism** – uses `os.execv()` for true in-place restarts (no supervisor needed)
191
- - **Cross-platform compatibility** – works in Docker, systemd, native installs, Windows, Linux, macOS
192
- - **Graceful shutdown** – cleanly closes databases, flushes logs, terminates child processes
193
- - **Process auto-restart** – automatically restarts crashed Arr manager processes with crash loop protection
194
- - **Crash loop detection** – prevents infinite restart loops with configurable max restart limits and time windows
195
- - **Configurable restart behavior** – control restart delays, maximum attempts, and monitoring windows via WebUI
196
-
197
- ### 💻 First-Party Web UI
198
- - **Live process monitoring** – see all running Arr managers and their current activity
199
- - **Log viewer** – tail logs in real-time with filtering and search
200
- - **Arr insights** – view movies, series, albums with filtering by year, quality, status, and quality profiles
201
- - **Config editor** – edit configuration directly from the UI with validation and helpful tooltips
202
- - **Test connections** – validate Arr credentials and load quality profiles with one click
203
- - **Restart controls** – restart individual processes or the entire application
204
- - **Dark/light theme** – customizable UI appearance
205
- - **Token authentication** – optional API protection with bearer tokens
206
-
207
- ## 📌 State of the Project
208
- 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.
209
-
210
-
211
-
212
- ## ⚡ Quickstart
213
- qBitrr supports Python 3.12+ on Linux, macOS, and Windows. Run it natively or in Docker—whatever fits your stack.
214
-
215
- ### 🐍 Install with pip
216
- ```bash
217
- python -m venv .venv
218
- source .venv/bin/activate # Windows: .venv\Scripts\activate
219
- python -m pip install --upgrade pip
220
- python -m pip install qBitrr2
221
-
222
- # First run creates ~/config/config.toml
223
- qBitrr2
224
- ```
225
-
226
- **Update later:**
227
- ```bash
228
- python -m pip install --upgrade qBitrr2
229
- ```
230
-
231
- **Or enable auto-updates** in `config.toml`:
232
- ```toml
233
- [Settings]
234
- AutoUpdateEnabled = true
235
- AutoUpdateCron = "0 3 * * 0" # Weekly on Sunday at 3 AM
236
- ```
237
-
238
- > 📝 **Note:** Auto-updates check GitHub releases for new versions. Only published (non-draft) releases trigger updates. Binary installations receive update notifications but require manual download.
239
-
240
- ### 🐳 Run with Docker
241
- **Minimal setup:**
242
- ```bash
243
- docker run -d \
244
- --name qbitrr \
245
- --tty \
246
- -e TZ=Europe/London \
247
- -p 6969:6969 \
248
- -v /etc/localtime:/etc/localtime:ro \
249
- -v /path/to/appdata/qbitrr:/config \
250
- -v /path/to/completed/downloads:/completed_downloads:rw \
251
- --restart unless-stopped \
252
- feramance/qbitrr:latest
253
- ```
254
-
255
- The container automatically binds its WebUI to `0.0.0.0`; exposing `6969` makes the dashboard reachable at `http://<host>:6969/ui`.
256
-
257
- **Docker Compose example:**
258
- ```yaml
259
- services:
260
- qbitrr:
261
- image: feramance/qbitrr:latest
262
- container_name: qbitrr
263
- user: 1000:1000
264
- restart: unless-stopped
265
- tty: true
266
- environment:
267
- TZ: Europe/London
268
- ports:
269
- - "6969:6969"
270
- volumes:
271
- - /etc/localtime:/etc/localtime:ro
272
- - /path/to/appdata/qbitrr:/config
273
- - /path/to/completed/downloads:/completed_downloads:rw
274
- logging:
275
- driver: json-file
276
- options:
277
- max-size: 50m
278
- max-file: "3"
279
- depends_on:
280
- - qbittorrent
281
- - radarr
282
- - sonarr
283
- ```
284
-
285
- > ℹ️ On first boot the container writes `config.toml` under `/config`. Update the values to match your mounts and restart the container.
286
-
287
- ### ⚙️ Native Systemd Service
288
- For Linux users running qBitrr natively (non-Docker), you can set up automatic startup and restart management using systemd.
289
-
290
- **Quick setup:**
291
- ```bash
292
- # Install qBitrr
293
- pip install qBitrr2
294
-
295
- # Copy systemd service file
296
- sudo cp qbitrr.service /etc/systemd/system/qbitrr.service
297
-
298
- # Enable and start
299
- sudo systemctl enable qbitrr
300
- sudo systemctl start qbitrr
301
-
302
- # Check status
303
- sudo systemctl status qbitrr
304
- ```
305
-
306
- **Benefits:**
307
- - ✅ Auto-start on boot
308
- - ✅ Automatic restarts after crashes or updates
309
- - ✅ Integrated logging with `journalctl`
310
- - ✅ Resource limits and security hardening
311
- - ✅ Works seamlessly with qBitrr's auto-update feature
312
-
313
- **See the full guide:** [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md) for detailed setup instructions, troubleshooting, and security hardening options.
314
-
315
- ## 🛠️ Configuration
316
-
317
- ### 📂 Config Location
318
- - **Native install:** `~/config/config.toml`
319
- - **Docker:** `/config/config.toml`
320
- - **First run:** Auto-generates a template config file
321
- - **Manual generation:** `qbitrr --gen-config`
322
-
323
- ### 🔧 Essential Setup
324
- 1. **Configure qBittorrent connection** in `[qBit]` section:
325
- - Set `Host`, `Port`, `UserName`, `Password`
326
- - qBittorrent 5.x requires `Version5 = true` (4.6.7 is the latest validated 4.x build)
327
-
328
- 2. **Configure Arr instances** (Radarr/Sonarr/Lidarr):
329
- - Each instance needs: `URI`, `APIKey`, `Category`
330
- - **Naming format:** Instance names must follow pattern `(Radarr|Sonarr|Lidarr)-<name>` (e.g., `Radarr-Movies`, `Sonarr-TV4K`)
331
- - **Important:** Use matching categories in Arr's download client settings
332
- - **Tagging:** Ensure Arr instances tag their downloads so qBitrr can track them
333
-
334
- 3. **Set completed download folder:**
335
- ```toml
336
- [Settings]
337
- CompletedDownloadFolder = "/path/to/completed"
338
- ```
339
-
340
- 4. **Enable logging** for troubleshooting:
341
- ```toml
342
- [Settings]
343
- Logging = true
344
- ConsoleLevel = "INFO" # or DEBUG for verbose output
345
- ```
346
-
347
- ### 📖 Configuration Reference
348
- See [`config.example.toml`](config.example.toml) for comprehensive documentation of all settings, including:
349
- - Torrent health check thresholds
350
- - Search automation options
351
- - Seeding limits and tracker rules
352
- - Request system integration
353
- - WebUI settings
354
- - File filtering and exclusion rules
355
-
356
- ## 🎯 Feature Deep Dive
357
-
358
- ### 🚑 Torrent Health Monitoring
359
-
360
- qBitrr continuously monitors your torrents and takes intelligent action when problems arise.
361
-
362
- **Stalled Torrent Detection:**
363
- ```toml
364
- [Radarr-Movies.Torrent]
365
- StalledDelay = 15 # Minutes before considering a torrent stalled
366
- ReSearchStalled = true # Re-search before removing stalled torrents
367
- MaximumETA = 604800 # Max ETA in seconds (7 days)
368
- IgnoreTorrentsYoungerThan = 600 # Grace period for new torrents (10 min)
369
- ```
370
-
371
- **Automatic Blacklisting:**
372
- When torrents fail or stall beyond thresholds, qBitrr:
373
- 1. ✅ Marks the release as failed in the Arr instance
374
- 2. ✅ Blacklists the release to prevent re-download
375
- 3. ✅ Optionally triggers an automatic re-search
376
- 4. ✅ Removes the failed torrent from qBittorrent
377
-
378
- **Smart Completion Rules:**
379
- ```toml
380
- [Radarr-Movies.Torrent]
381
- MaximumDeletablePercentage = 0.99 # Don't delete torrents >99% complete
382
- DoNotRemoveSlow = true # Protect slow but active torrents
383
- ```
384
-
385
- **File Verification:**
386
- ```toml
387
- [Settings]
388
- FFprobeAutoUpdate = true # Auto-download FFprobe binary
389
- ```
390
- - Validates media files are playable before import
391
- - Detects corrupted or fake files
392
- - Prevents broken media from being imported into Arr
393
-
394
- **Error Code Handling:**
395
- ```toml
396
- [Radarr-Movies]
397
- ArrErrorCodesToBlocklist = [
398
- "Not an upgrade for existing movie file(s)",
399
- "Unable to determine if file is a sample"
400
- ]
401
- ```
402
- Automatically handle specific Arr error messages by removing failed files and triggering re-searches.
403
-
404
- ---
405
-
406
- ### 🔍 Automated Search & Requests
407
-
408
- **Missing Media Search:**
409
- ```toml
410
- [Radarr-Movies.EntrySearch]
411
- SearchMissing = true # Enable automated searching
412
- SearchLimit = 5 # Max concurrent searches
413
- SearchByYear = true # Order by release year
414
- SearchInReverse = false # Newest first (true = oldest first)
415
- SearchRequestsEvery = 300 # Delay between searches (seconds)
416
- SearchAgainOnSearchCompletion = true # Loop continuously
417
- ```
418
-
419
- **Quality Upgrade Search:**
420
- ```toml
421
- [Radarr-Movies.EntrySearch]
422
- DoUpgradeSearch = true # Search for better quality versions
423
- QualityUnmetSearch = true # Search for unmet quality profiles
424
- CustomFormatUnmetSearch = true # Search for better custom format scores
425
- ForceMinimumCustomFormat = true # Auto-remove torrents below CF threshold
426
- ```
427
-
428
- **Overseerr Integration:**
429
- ```toml
430
- [Radarr-Movies.EntrySearch.Overseerr]
431
- SearchOverseerrRequests = true
432
- OverseerrURI = "http://overseerr:5055"
433
- OverseerrAPIKey = "your-api-key"
434
- ApprovedOnly = true # Only process approved requests
435
- Is4K = false # Set true for 4K Arr instances
436
- ```
437
-
438
- **Ombi Integration:**
439
- ```toml
440
- [Radarr-Movies.EntrySearch.Ombi]
441
- SearchOmbiRequests = true
442
- OmbiURI = "http://ombi:3579"
443
- OmbiAPIKey = "your-api-key"
444
- ApprovedOnly = true
445
- ```
446
-
447
- **Smart Search Modes (Sonarr):**
448
- ```toml
449
- [Sonarr-TV.EntrySearch]
450
- SearchBySeries = "smart" # auto | true (series) | false (episode)
451
- # smart: Series search for full seasons, episode search for singles
452
- PrioritizeTodaysReleases = true # Search today's episodes first (RSS-like)
453
- AlsoSearchSpecials = false # Include season 00 episodes
454
- Unmonitored = false # Include unmonitored items
455
- ```
456
-
457
- **Temporary Quality Profiles:**
458
- ```toml
459
- [Radarr-Movies.EntrySearch]
460
- UseTempForMissing = true
461
- KeepTempProfile = false
462
-
463
- # New: Map each main profile to a temp profile
464
- QualityProfileMappings = { "Ultra-HD" = "Web-DL", "HD-1080p" = "HDTV-720p" }
465
-
466
- # Auto-reset options
467
- ForceResetTempProfiles = false # Reset all on startup
468
- TempProfileResetTimeoutMinutes = 0 # Auto-reset after timeout (0 = disabled)
469
- ProfileSwitchRetryAttempts = 3 # Retry failed profile switches
470
-
471
- # Searches missing items with temp profile, switches back after import
472
- ```
473
-
474
- **Configure via WebUI:**
475
- 1. Edit your Arr instance in the Config tab
476
- 2. Click "Test Connection" to load available quality profiles
477
- 3. Add profile mappings with the interactive UI (no JSON editing needed!)
478
- 4. Select main and temp profiles from dropdowns
479
- 5. Save and restart
480
-
481
- ---
482
-
483
- ### 📊 Quality Management
484
-
485
- **RSS Sync Automation:**
486
- ```toml
487
- [Radarr-Movies]
488
- RssSyncTimer = 5 # Minutes between RSS feed refreshes (0 = disabled)
489
- ```
490
- Keeps Arr instances checking indexers for new releases regularly.
491
-
492
- **Queue Refresh:**
493
- ```toml
494
- [Radarr-Movies]
495
- RefreshDownloadsTimer = 5 # Minutes between queue updates (0 = disabled)
496
- ```
497
- Ensures Arr instances stay in sync with qBittorrent's download state.
498
-
499
- **Import Mode:**
500
- ```toml
501
- [Radarr-Movies]
502
- importMode = "Auto" # Auto | Move | Copy
503
- ```
504
- - **Auto:** Let Arr decide based on its settings
505
- - **Move:** Move files from download folder to library
506
- - **Copy:** Copy files (preserves seeding torrents)
507
-
508
- **Custom Format Score Enforcement:**
509
- When `ForceMinimumCustomFormat = true`, qBitrr automatically removes torrents that don't meet the minimum custom format score defined in your Arr quality profile.
510
-
511
- ---
512
-
513
- ### 🌱 Seeding & Tracker Control
514
-
515
- **Global Seeding Limits:**
516
- ```toml
517
- [Radarr-Movies.Torrent.SeedingMode]
518
- DownloadRateLimitPerTorrent = -1 # -1 = unlimited, or KB/s
519
- UploadRateLimitPerTorrent = -1 # -1 = unlimited, or KB/s
520
- MaxUploadRatio = 2.0 # Stop seeding at 2.0 ratio
521
- MaxSeedingTime = 604800 # Stop after 7 days (seconds)
522
- RemoveTorrent = 3 # 1=ratio, 2=time, 3=either, 4=both, -1=never
523
- ```
524
-
525
- **Per-Tracker Settings:**
526
- ```toml
527
- [[Radarr-Movies.Torrent.Trackers]]
528
- Name = "MyTracker"
529
- Priority = 10 # Higher = processed first
530
- URI = "https://tracker.example/announce"
531
- MaximumETA = 18000 # Override global MaxETA for this tracker
532
- DownloadRateLimit = 5000 # KB/s limit for this tracker
533
- UploadRateLimit = 1000 # KB/s limit for this tracker
534
- MaxUploadRatio = 1.5 # Tracker-specific ratio limit
535
- MaxSeedingTime = 86400 # Tracker-specific time limit (1 day)
536
- AddTrackerIfMissing = true # Inject this tracker into matching torrents
537
- RemoveIfExists = false # Remove this tracker if found
538
- SuperSeedMode = true # Enable super seeding for this tracker
539
- AddTags = ["private", "MyTracker"] # Auto-tag matching torrents
540
- ```
541
-
542
- **Tracker Cleanup:**
543
- ```toml
544
- [Radarr-Movies.Torrent.SeedingMode]
545
- RemoveDeadTrackers = true
546
- RemoveTrackerWithMessage = [
547
- "skipping tracker announce (unreachable)",
548
- "No such host is known",
549
- "unsupported URL protocol"
550
- ]
551
- ```
552
-
553
- **File Filtering:**
554
- ```toml
555
- [Radarr-Movies.Torrent]
556
- CaseSensitiveMatches = false
557
- FolderExclusionRegex = ["\\bextras?\\b", "\\bsamples?\\b", "\\bfeaturettes?\\b"]
558
- FileNameExclusionRegex = ["\\bsample\\b", "\\btrailer\\b"]
559
- FileExtensionAllowlist = [".mp4", ".mkv", ".avi", ".sub", ".srt"]
560
- AutoDelete = false # Auto-delete non-playable files (.exe, .png, etc.)
561
- ```
562
-
563
- ---
564
-
565
- ### 💾 Disk Space Management
566
-
567
- **Free Space Monitoring:**
568
- ```toml
569
- [Settings]
570
- FreeSpace = "50G" # Pause when <50GB free (K/M/G/T units)
571
- FreeSpaceFolder = "/downloads" # Path to monitor
572
- AutoPauseResume = true # Required for FreeSpace to work
573
- ```
574
-
575
- **How it works:**
576
- 1. 📊 Continuously monitors specified folder
577
- 2. ⏸️ Pauses **all** torrents when space falls below threshold
578
- 3. ▶️ Auto-resumes when space is reclaimed
579
- 4. 🔔 Logs warnings when approaching limit
580
-
581
- **Disable monitoring:**
582
- ```toml
583
- [Settings]
584
- FreeSpace = "" # Empty string or 0 disables monitoring
585
- ```
586
-
587
- ---
588
-
589
- ### 🔄 Auto-Updates & Restarts
590
-
591
- qBitrr can automatically update itself by checking GitHub releases for new versions. The update behavior varies by installation type.
592
-
593
- #### 🔍 How Updates Work
594
-
595
- **Update Detection:**
596
- 1. 📡 Queries GitHub API for latest **published** (non-draft) release
597
- 2. 🔢 Compares release version with current version using semantic versioning
598
- 3. ⏩ Skips prereleases (beta, rc, alpha) by default
599
- 4. 📦 Only updates when a newer **stable** version is available
600
-
601
- **Installation Types:**
602
-
603
- | Type | Detection | Update Method | Version Control |
604
- |------|-----------|---------------|-----------------|
605
- | **Git** | `.git` directory exists | `git checkout <tag>` or `git pull` | Checks out specific release tag |
606
- | **PyPI** | Installed via pip | `pip install qBitrr2==<version>` | Installs exact version from PyPI |
607
- | **Binary** | PyInstaller executable | Notification only | Logs download URL for manual update |
608
-
609
- **Why different methods?**
610
- - **Git installations** can checkout specific tags for precise version control
611
- - **PyPI installations** can pin to exact versions for reliability
612
- - **Binary installations** cannot self-update (would require replacing running executable), so qBitrr logs the download URL and version info for manual update
613
-
614
- ---
615
-
616
- #### ⚙️ Configuration
617
-
618
- **Basic Setup:**
619
- ```toml
620
- [Settings]
621
- AutoUpdateEnabled = true
622
- AutoUpdateCron = "0 3 * * 0" # Cron expression (default: Sunday 3 AM)
623
- ```
624
-
625
- **Cron Expression Examples:**
626
- ```bash
627
- 0 3 * * 0 # Every Sunday at 3:00 AM
628
- 0 */6 * * * # Every 6 hours
629
- 0 0 * * * # Daily at midnight
630
- 0 2 * * 1-5 # Weekdays at 2:00 AM
631
- ```
632
-
633
- ---
634
-
635
- #### 📋 Update Process Flow
636
-
637
- **For Git & PyPI Installations:**
638
-
639
- 1. **Check Phase:**
640
- - Fetch latest release from GitHub API
641
- - Validate release is not draft or prerelease
642
- - Compare versions (semantic versioning)
643
- - Skip if already on latest version
644
-
645
- 2. **Download Phase:**
646
- - **Git:** `git fetch --tags && git checkout v<version>`
647
- - **PyPI:** `pip install --upgrade qBitrr2==<version>`
648
-
649
- 3. **Verification Phase:**
650
- - Reload version information
651
- - Verify installed version matches target
652
- - Log warning if mismatch
653
-
654
- 4. **Restart Phase:**
655
- - Gracefully shutdown (close DBs, flush logs)
656
- - Terminate child processes
657
- - Execute in-place restart via `os.execv()`
658
- - Maintain same PID (systemd-friendly)
659
-
660
- **For Binary Installations:**
661
-
662
- 1. **Check Phase:** Same as above
663
- 2. **Notification:** Logs message with download URL and instructions
664
- 3. **Manual Update:** User downloads new binary from GitHub releases
665
- 4. **No Auto-Restart:** User manually restarts after replacing binary
666
-
667
- Example binary update log:
668
- ```
669
- [INFO] Update available: v5.4.2 -> v5.4.3
670
- [INFO] Binary installation detected - manual update required
671
- [INFO] Download: https://github.com/Feramance/qBitrr/releases/latest
672
- [INFO] Instructions:
673
- 1. Download the binary for your platform
674
- 2. Extract the archive
675
- 3. Replace current executable with new binary
676
- 4. Restart qBitrr
677
- ```
678
-
679
- ---
680
-
681
- #### 🔧 Manual Updates
682
-
683
- **Via WebUI:**
684
- - Navigate to **Config tab**
685
- - Click **"Check for Updates"** to see available version
686
- - Click **"Update Now"** button
687
- - Confirm when prompted
688
- - Application restarts automatically (git/pip only)
689
-
690
- **Via Command Line:**
691
-
692
- ```bash
693
- # Git installation
694
- cd /path/to/qBitrr
695
- git fetch --tags
696
- git checkout v5.4.3 # or: git pull
697
- qbitrr # restart
698
-
699
- # PyPI installation
700
- pip install --upgrade qBitrr2
701
- # or: pip install qBitrr2==5.4.3 # specific version
702
- qbitrr # restart
703
-
704
- # Binary installation
705
- # Download from: https://github.com/Feramance/qBitrr/releases/latest
706
- # Extract and replace binary, then restart
707
-
708
- # Docker installation
709
- docker pull feramance/qbitrr:latest
710
- docker restart qbitrr
711
- # or: docker-compose pull && docker-compose up -d
712
- ```
713
-
714
- ---
715
-
716
- #### 🔐 Security & Reliability
717
-
718
- **GitHub API Dependency:**
719
- - Auto-update requires GitHub API access
720
- - Rate limit: 60 requests/hour (unauthenticated)
721
- - Cron schedule should account for rate limits
722
- - Failures are logged but don't crash the application
723
-
724
- **Version Verification:**
725
- - After update, qBitrr verifies installed version
726
- - Helps catch failed updates or PyPI lag issues
727
- - Logs warning if version mismatch detected
728
-
729
- **Draft & Prerelease Handling:**
730
- - Draft releases are **always skipped** (unpublished)
731
- - Prereleases (beta/rc/alpha) are skipped by default
732
- - Useful for testing but not recommended for production
733
-
734
- **Rollback:**
735
- - Git installations: `git checkout <previous-tag>`
736
- - PyPI installations: `pip install qBitrr2==<previous-version>`
737
- - Binary installations: Keep backup of previous binary
738
- - No automatic rollback (manual intervention required)
739
-
740
- ---
741
-
742
- #### 🚀 Restart Mechanism
743
-
744
- **How it Works:**
745
- ```python
746
- os.execv(sys.executable, [sys.executable] + sys.argv)
747
- ```
748
-
749
- **Benefits:**
750
- - ✅ **Same PID** – systemd doesn't detect a restart
751
- - ✅ **No supervisor** – doesn't require external process manager
752
- - ✅ **Clean state** – fresh Python interpreter, no memory leaks
753
- - ✅ **Fast** – near-instant restart (< 1 second)
754
-
755
- **Supported Environments:**
756
- - 🐳 **Docker** – container stays running, process restarts
757
- - ⚙️ **systemd** – service remains "active", no restart count increment
758
- - 💻 **Native** – works on Linux, macOS, Windows
759
- - 🪟 **Windows** – handles different executable extensions (.exe, .cmd)
760
-
761
- **Graceful Shutdown:**
762
- 1. Stop all Arr manager child processes
763
- 2. Close database connections
764
- 3. Flush log buffers to disk
765
- 4. Release file locks
766
- 5. Execute in-place restart
767
-
768
- ---
769
-
770
- #### 🛠️ Restart via API
771
-
772
- **Restart entire application:**
773
- ```bash
774
- curl -X POST http://localhost:6969/api/restart
775
-
776
- # With authentication
777
- curl -X POST http://localhost:6969/api/restart \
778
- -H "Authorization: Bearer your-token"
779
- ```
780
-
781
- **Restart specific Arr manager:**
782
- ```bash
783
- curl -X POST http://localhost:6969/api/arr/radarr-movies/restart
784
- ```
785
-
786
- ---
787
-
788
- #### ⚠️ Troubleshooting Updates
789
-
790
- **Update not triggering:**
791
- - ✅ Check `AutoUpdateEnabled = true` in config
792
- - ✅ Verify cron expression is valid (use [crontab.guru](https://crontab.guru))
793
- - ✅ Check `Main.log` for GitHub API errors
794
- - ✅ Ensure internet connectivity to api.github.com
795
- - ✅ Check if already on latest version
796
-
797
- **Version mismatch after update:**
798
- - ✅ Review logs for pip/git errors
799
- - ✅ Manually verify installation: `pip show qBitrr2` or `git describe`
800
- - ✅ Check if PyPI is behind GitHub releases (can take hours)
801
- - ✅ Try manual update to force correct version
802
-
803
- **Binary updates not working:**
804
- - ℹ️ **Expected behavior** – binaries cannot auto-update
805
- - ✅ Check logs for download URL
806
- - ✅ Download matching binary for your platform
807
- - ✅ Extract and replace current executable
808
- - ✅ Ensure new binary has execute permissions (Unix)
809
-
810
- **Restart fails:**
811
- - ✅ Check file permissions on qBitrr installation
812
- - ✅ Review systemd journal if using systemd
813
- - ✅ Verify no file locks preventing restart
814
- - ✅ Check disk space for logs and databases
815
- - ✅ Manual restart: Stop service, start again
816
-
817
- **For systemd users:** See [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md) for automatic restart configuration with `Restart=always`.
818
-
819
- ---
820
-
821
- curl -X POST http://localhost:6969/api/arr/radarr-movies/restart
822
- ```
823
-
824
- **For systemd users:** See [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md) for automatic restart configuration.
825
-
826
- ---
827
-
828
- ### 🔁 Process Auto-Restart & Crash Loop Protection
829
-
830
- Your Arr manager processes (Radarr/Sonarr/Lidarr) automatically restart if they crash, preventing downtime. Built-in protection stops restart loops if a process keeps failing.
831
-
832
- #### ⚙️ Configuration
833
-
834
- **Basic Setup:**
835
- ```toml
836
- [Settings]
837
- AutoRestartProcesses = true # Enable automatic restart
838
- MaxProcessRestarts = 5 # Stop trying after 5 crashes
839
- ProcessRestartWindow = 300 # Within 5 minutes
840
- ProcessRestartDelay = 5 # Wait 5 seconds before restarting
841
- ```
842
-
843
- **What this means:**
844
- - If a process crashes fewer than 5 times in 5 minutes, it auto-restarts
845
- - If it crashes 5+ times in 5 minutes, qBitrr stops trying and logs an error
846
- - After the 5-minute window passes, the counter resets and auto-restart resumes
847
-
848
- **Configure via WebUI:**
849
- 1. Navigate to **Config** tab
850
- 2. Find the **Process Management** section
851
- 3. Adjust restart behavior to your preference
852
- 4. Save and restart qBitrr
853
-
854
- #### 📊 Monitoring
855
-
856
- **Via WebUI:**
857
- - **Processes tab** shows all running managers with restart history
858
- - Manually restart individual processes if needed
859
-
860
- **Via Logs:**
861
- ```bash
862
- # See restart activity
863
- tail -f ~/logs/Main.log | grep restart # Native
864
- docker logs -f qbitrr | grep restart # Docker
865
- sudo journalctl -u qbitrr -f | grep restart # Systemd
866
- ```
867
-
868
- #### 🆕 First-Time Setup
869
-
870
- Existing configs automatically upgrade to version 3 on first startup. A timestamped backup is created before any changes. No manual action needed!
871
-
872
- ---
873
-
874
- ## 🖥️ Built-in Web UI
875
- The React + Vite dashboard provides complete visibility and control over your qBitrr instance.
876
-
877
- ### 🌐 Access & Authentication
878
- - **Default URL:** `http://<host>:6969/ui`
879
- - **Custom host/port:** Configure in `config.toml`:
880
- ```toml
881
- [WebUI]
882
- Host = "0.0.0.0" # Bind address (0.0.0.0 for all interfaces)
883
- Port = 6969 # Web server port
884
- ```
885
- - **Authentication:** Protect API endpoints with bearer token:
886
- ```toml
887
- [WebUI]
888
- Token = "your-secret-token"
889
- ```
890
- When set, all `/api/*` endpoints require `Authorization: Bearer <token>` header.
891
- The UI itself uses unauthenticated `/web/*` endpoints.
892
-
893
- ### 🗂️ Dashboard Tabs
894
-
895
- **📊 Processes Tab:**
896
- - View all running Arr manager processes
897
- - See current activity and search status
898
- - Monitor queue counts and metrics
899
- - Restart individual processes or all at once
900
-
901
- **📝 Logs Tab:**
902
- - Real-time log viewer with filtering
903
- - View `Main.log`, `WebUI.log`, and per-Arr logs
904
- - Search and navigate large log files
905
- - Download logs for troubleshooting
906
-
907
- **🎬 Radarr/Sonarr/Lidarr Tabs:**
908
- - Browse your media library with advanced filtering
909
- - Filter by year range, quality status, monitored state
910
- - See custom format scores and upgrade availability
911
- - Identify missing media and quality issues
912
- - View request status for Overseerr/Ombi items
913
-
914
- **⚙️ Config Tab:**
915
- - Edit configuration directly in the UI
916
- - Trigger manual updates
917
- - View version and changelog
918
- - Rebuild Arr metadata
919
- - Restart application
920
-
921
- ### 🎨 Customization
922
- ```toml
923
- [WebUI]
924
- Theme = "dark" # or "light"
925
- LiveArr = true # Enable live updates for Arr views
926
- GroupSonarr = true # Group episodes by series
927
- GroupLidarr = true # Group albums by artist
928
- ```
929
-
930
- ### 🧪 Development
931
- The WebUI source lives in `webui/`:
932
- ```bash
933
- cd webui
934
- npm ci # Install dependencies
935
- npm run dev # Dev server with HMR at localhost:5173
936
- npm run lint # ESLint check
937
- npm run build # Build for production
938
- ```
939
- Build outputs to `webui/dist/`, which gets bundled into `qBitrr/static/`.
940
-
941
- **API Documentation:** See [API_DOCUMENTATION.md](API_DOCUMENTATION.md) for complete API reference.
942
-
943
- ---
944
-
945
- ## 🔁 Day-to-day Operations
946
-
947
- ### 🔄 Restart & Rebuild
948
- - **Restart application:** WebUI → Config tab → "Restart All" button
949
- - **Restart individual Arr manager:** WebUI → Processes tab → Click restart icon
950
- - **Rebuild Arr metadata:** WebUI → Config tab → "Rebuild Arrs" button
951
- - **API endpoints:**
952
- ```bash
953
- POST /api/restart # Restart qBitrr
954
- POST /api/arr/<category>/restart # Restart specific manager
955
- POST /api/arr/rebuild # Rebuild all Arr caches
956
- ```
957
-
958
- ### 📋 Monitoring
959
- - **Logs location:** `~/logs/` (native) or `/config/logs` (Docker)
960
- - **Log files:**
961
- - `Main.log` – Main application logs
962
- - `WebUI.log` – Web interface logs
963
- - `<CategoryName>.log` – Per-Arr instance logs
964
- - **View in UI:** WebUI → Logs tab → Select log file
965
- - **View in terminal:**
966
- ```bash
967
- # Native
968
- tail -f ~/logs/Main.log
969
-
970
- # Docker
971
- docker logs -f qbitrr
972
- docker exec qbitrr tail -f /config/logs/Main.log
973
-
974
- # Systemd
975
- sudo journalctl -u qbitrr -f
976
- ```
977
-
978
- ### 🔍 Request Integration
979
- Once configured, qBitrr automatically:
980
- 1. 📥 Polls Overseerr/Ombi for new requests
981
- 2. 🔍 Searches requested items in Arr instances
982
- 3. ⭐ Prioritizes requests over general missing media searches
983
- 4. 📊 Identifies requests in WebUI Arr tabs with `isRequest` flag
984
-
985
- ### 🛠️ Special Categories
986
- qBitrr monitors special qBittorrent categories for manual intervention:
987
-
988
- **Failed Category:**
989
- ```toml
990
- [Settings]
991
- FailedCategory = "failed"
992
- ```
993
- Manually move torrents here to mark them as failed and trigger blacklisting + re-search.
994
-
995
- **Recheck Category:**
996
- ```toml
997
- [Settings]
998
- RecheckCategory = "recheck"
999
- ```
1000
- Manually move torrents here to trigger a proper recheck operation.
1001
-
1002
- ### 🏷️ Tagless Operation
1003
- ```toml
1004
- [Settings]
1005
- Tagless = true
1006
- ```
1007
- Disables qBitrr from tagging torrents in qBittorrent. Use this if you prefer to manage qBittorrent tags manually or avoid tag clutter.
1008
-
1009
- ---
1010
-
1011
- ## 🆘 Troubleshooting
1012
-
1013
- ### 🐛 Common Issues
1014
-
1015
- **Torrents not being processed:**
1016
- 1. ✅ Verify Arr instance is using the correct **category** in download client settings
1017
- 2. ✅ Ensure Arr instance **tags** match qBitrr's category configuration
1018
- 3. ✅ Check `IgnoreTorrentsYoungerThan` – new torrents have a grace period
1019
- 4. ✅ Enable debug logging: `ConsoleLevel = "DEBUG"`
1020
- 5. ✅ Check category-specific log file in `~/logs/` or `/config/logs/`
1021
-
1022
- **Imports not triggering:**
1023
- 1. ✅ Verify `CompletedDownloadFolder` path is correct and accessible
1024
- 2. ✅ Check file extensions against `FileExtensionAllowlist`
1025
- 3. ✅ Review `FolderExclusionRegex` and `FileNameExclusionRegex` for over-matching
1026
- 4. ✅ Enable FFprobe logging to see media validation results
1027
- 5. ✅ Check Arr instance has proper path mappings (especially in Docker)
1028
-
1029
- **Search not finding releases:**
1030
- 1. ✅ Verify `SearchMissing = true` in the EntrySearch section
1031
- 2. ✅ Check `SearchLimit` isn't too low for your queue
1032
- 3. ✅ Review `SearchByYear` and `SearchInReverse` settings
1033
- 4. ✅ Ensure Arr instance has indexers configured and working
1034
- 5. ✅ Check for rate limiting in Arr instance logs
1035
-
1036
- **High CPU/memory usage:**
1037
- 1. ✅ Reduce `SearchLimit` to lower concurrent searches
1038
- 2. ✅ Increase `LoopSleepTimer` to slow down processing
1039
- 3. ✅ Disable `DoUpgradeSearch` if not needed
1040
- 4. ✅ Set `LiveArr = false` in WebUI config to reduce refresh overhead
1041
-
1042
- **Docker path issues:**
1043
- 1. ✅ Ensure volume mounts match between qBittorrent, Arr, and qBitrr
1044
- 2. ✅ Use consistent paths across all containers
1045
- 3. ✅ Example: All containers should see `/downloads` as the same physical path
1046
-
1047
- **Updates failing:**
1048
- 1. ✅ Check internet connectivity
1049
- 2. ✅ Verify pip/Python installation is writable
1050
- 3. ✅ Review update logs in `Main.log` or `WebUI.log`
1051
- 4. ✅ Manual update: `pip install --upgrade qBitrr2` (native) or pull new Docker image
1052
-
1053
- ### 📊 Enable Debug Logging
1054
- ```toml
1055
- [Settings]
1056
- Logging = true
1057
- ConsoleLevel = "DEBUG" # TRACE for even more detail
1058
- ```
1059
- Logs output to:
1060
- - **Native:** `~/logs/`
1061
- - **Docker:** `/config/logs/`
1062
- - **Systemd:** `sudo journalctl -u qbitrr -n 100`
1063
-
1064
- ### 🐞 Reporting Issues
1065
- When reporting bugs:
1066
-
1067
- 1. **Enable file logging** and reproduce the issue
1068
- 2. **Collect information:**
1069
- - qBitrr version: `qBitrr2 --version` or Docker tag
1070
- - OS and deployment method (Docker/native/systemd)
1071
- - qBittorrent version and API version (4.x vs 5.x)
1072
- - Arr instance versions (Radarr/Sonarr/Lidarr)
1073
- - Request tool versions (Overseerr/Ombi) if applicable
1074
- 3. **Grab relevant log snippets** (scrub API keys and tokens!)
1075
- 4. **Open an issue** using the [bug report template](.github/ISSUE_TEMPLATE/bug_report.yml)
1076
- 5. **Include:**
1077
- - Clear reproduction steps
1078
- - Expected vs. actual behavior
1079
- - Relevant config sections (with secrets removed)
1080
- - Error messages and stack traces
1081
-
1082
- ### 💡 Feature Requests
1083
- Have an idea? Submit it via the [feature request template](.github/ISSUE_TEMPLATE/feature_request.yml)!
1084
-
1085
- ### 📚 Additional Resources
1086
- - **API Documentation:** [API_DOCUMENTATION.md](API_DOCUMENTATION.md)
1087
- - **Systemd Setup:** [SYSTEMD_SERVICE.md](SYSTEMD_SERVICE.md)
1088
- - **Example Config:** [config.example.toml](config.example.toml)
1089
- - **GitHub Issues:** [Search existing issues](https://github.com/Feramance/qBitrr/issues)
1090
-
1091
- ---
1092
-
1093
- ## 🤝 Contributing
1094
-
1095
- We welcome contributions from the community! Whether it's code, documentation, bug reports, or feature ideas, your help makes qBitrr better.
1096
-
1097
- ### 🔧 Development Setup
1098
-
1099
- **Python Backend:**
1100
- ```bash
1101
- # Clone the repo
1102
- git clone https://github.com/Feramance/qBitrr.git
1103
- cd qBitrr
1104
-
1105
- # Create virtual environment
1106
- make newenv
1107
- # or: python -m venv .venv && source .venv/bin/activate
1108
-
1109
- # Install dependencies
1110
- make syncenv
1111
- # or: pip install -e .[all]
1112
-
1113
- # Run linting and formatting
1114
- make reformat
1115
- # or: pre-commit run --all-files
1116
- ```
1117
-
1118
- **TypeScript/React WebUI:**
1119
- ```bash
1120
- cd webui
1121
- npm ci # Install exact versions from package-lock.json
1122
- npm run dev # Dev server at localhost:5173
1123
- npm run lint # ESLint check
1124
- npm run build # Build for production
1125
- ```
1126
-
1127
- ### 📝 Before Submitting a PR
1128
-
1129
- 1. ✅ Read the [pull request template](.github/pull_request_template.md)
1130
- 2. ✅ **Format code:**
1131
- - Python: `make reformat` or `pre-commit run --all-files`
1132
- - TypeScript: `npm run lint` in `webui/`
1133
- 3. ✅ **Test your changes:**
1134
- - Run against live qBittorrent + Arr instances
1135
- - Test in both Docker and native environments if possible
1136
- 4. ✅ **Update documentation:**
1137
- - Add/update relevant sections in README.md
1138
- - Update `config.example.toml` if adding config options
1139
- - Document API changes in `API_DOCUMENTATION.md`
1140
- 5. ✅ **Clean commit history:**
1141
- - Use descriptive commit messages
1142
- - Follow [conventional commits](https://www.conventionalcommits.org/) format
1143
- - Squash WIP commits before submitting
1144
-
1145
- ### 💡 Contribution Ideas
1146
-
1147
- - 🐛 **Bug fixes** – check [open issues](https://github.com/Feramance/qBitrr/issues)
1148
- - ✨ **Features** – see [feature requests](https://github.com/Feramance/qBitrr/labels/enhancement)
1149
- - 📚 **Documentation** – improve guides, add examples, fix typos
1150
- - 🌍 **Translations** – help internationalize the WebUI
1151
- - 🧪 **Testing** – add test coverage, validate edge cases
1152
-
1153
- **Unsure if an idea fits?** Open a [feature request](.github/ISSUE_TEMPLATE/feature_request.yml) first and let's discuss!
1154
-
1155
- ### 📜 Code Guidelines
1156
-
1157
- See [CONTRIBUTION.md](CONTRIBUTION.md) for comprehensive coding standards and architecture details.
1158
-
1159
- **Quick summary:**
1160
- - **Python:** Black formatting (99 chars), type hints required, PEP 8 naming
1161
- - **TypeScript:** ESLint strict mode, explicit types, functional components only
1162
- - **Commits:** LF line endings, no trailing whitespace, EOF newline required
1163
- - **Errors:** Inherit from `qBitManagerError`, provide actionable messages
1164
-
1165
- ---
1166
-
1167
- ## ❤️ Support
1168
-
1169
- ### 🌟 Show Your Support
1170
- - ⭐ **Star the repo** – helps others discover qBitrr
1171
- - 🐛 **Report bugs** – attach logs so we can fix issues faster
1172
- - 💬 **Share feedback** – tell us what works and what doesn't
1173
- - 🛠️ **Contribute** – code, docs, translations, or just good vibes
1174
-
1175
- ### 💰 Sponsor Development
1176
- If qBitrr saves you time and headaches, consider supporting its development:
1177
-
1178
- - 🎨 [Patreon](https://patreon.com/qBitrr) – monthly support
1179
- - 💸 [PayPal](https://www.paypal.me/feramance) – one-time donations
1180
-
1181
- Your support keeps qBitrr maintained, updated, and improving. Thank you! 🙏
1182
-
1183
- ---
1184
-
1185
- ## 📄 License
1186
-
1187
- qBitrr is released under the [MIT License](LICENSE).
1188
-
1189
- **TL;DR:** Use it, modify it, share it—commercially or personally. Just keep the copyright notice and don't blame us if things break. 😊
1190
-
1191
- ---
1192
-
1193
- ## 🔗 Quick Links
1194
-
1195
- - 📦 [PyPI Package](https://pypi.org/project/qBitrr2/)
1196
- - 🐳 [Docker Hub](https://hub.docker.com/r/feramance/qbitrr)
1197
- - 📚 [API Documentation](API_DOCUMENTATION.md)
1198
- - ⚙️ [Systemd Setup Guide](SYSTEMD_SERVICE.md)
1199
- - 📝 [Example Configuration](config.example.toml)
1200
- - 🐛 [Report a Bug](.github/ISSUE_TEMPLATE/bug_report.yml)
1201
- - ✨ [Request a Feature](.github/ISSUE_TEMPLATE/feature_request.yml)
1202
- - 💬 [Discussions](https://github.com/Feramance/qBitrr/discussions)
1203
-
1204
- ---
1205
-
1206
- <div align="center">
1207
-
1208
- **Made with ❤️ by the qBitrr community**
1209
-
1210
- </div>