qBitrr2 5.1.1__tar.gz → 5.3.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.
Files changed (32) hide show
  1. {qbitrr2-5.1.1/qBitrr2.egg-info → qbitrr2-5.3.0}/PKG-INFO +8 -6
  2. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/README.md +7 -5
  3. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/config.example.toml +196 -12
  4. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/pyproject.toml +1 -1
  5. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/arss.py +958 -169
  6. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/bundled_data.py +2 -2
  7. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/config.py +5 -1
  8. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/gen_config.py +252 -32
  9. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/logger.py +82 -17
  10. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/main.py +35 -3
  11. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/tables.py +44 -0
  12. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/utils.py +29 -0
  13. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/versioning.py +33 -0
  14. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/webui.py +750 -74
  15. {qbitrr2-5.1.1 → qbitrr2-5.3.0/qBitrr2.egg-info}/PKG-INFO +8 -6
  16. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/setup.cfg +1 -1
  17. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/LICENSE +0 -0
  18. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/MANIFEST.in +0 -0
  19. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/__init__.py +0 -0
  20. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/auto_update.py +0 -0
  21. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/db_lock.py +0 -0
  22. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/env_config.py +0 -0
  23. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/errors.py +0 -0
  24. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/ffprobe.py +0 -0
  25. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/home_path.py +0 -0
  26. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr/search_activity_store.py +0 -0
  27. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr2.egg-info/SOURCES.txt +0 -0
  28. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr2.egg-info/dependency_links.txt +0 -0
  29. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr2.egg-info/entry_points.txt +0 -0
  30. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr2.egg-info/requires.txt +0 -0
  31. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/qBitrr2.egg-info/top_level.txt +0 -0
  32. {qbitrr2-5.1.1 → qbitrr2-5.3.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qBitrr2
3
- Version: 5.1.1
3
+ Version: 5.3.0
4
4
  Summary: "A simple Python script to talk to qBittorrent and Arr's"
5
5
  Home-page: https://github.com/Feramance/qBitrr
6
6
  Author: Feramance
@@ -80,7 +80,7 @@ Dynamic: license-file
80
80
  [![pre-commit.ci](https://results.pre-commit.ci/badge/github/Feramance/qBitrr/master.svg)](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
81
81
  [![License: MIT](https://img.shields.io/pypi/l/qbitrr)](LICENSE)
82
82
 
83
- > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
83
+ > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, Lidarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
84
84
 
85
85
  ## 📚 What's Inside
86
86
  - [Overview](#-overview)
@@ -98,7 +98,7 @@ Dynamic: license-file
98
98
  - [License](#-license)
99
99
 
100
100
  ## 🧠 Overview
101
- qBitrr is the glue that keeps the *Arr ecosystem tidy. It watches qBittorrent for stalled jobs, kicks Radarr/Sonarr when something finishes, prunes your completed folder, and even offers a slick React dashboard so you can see what's running at a glance.
101
+ qBitrr is the glue that keeps the *Arr ecosystem tidy. It watches qBittorrent for stalled jobs, kicks Radarr/Sonarr/Lidarr when something finishes, prunes your completed folder, and even offers a slick React dashboard so you can see what's running at a glance.
102
102
 
103
103
  ## ✨ Highlights
104
104
  - 🚑 **Health checks** – spot stalled or broken torrents, blacklist them on the relevant Arr, and optionally trigger a re-search.
@@ -137,13 +137,14 @@ Minimal setup:
137
137
  ```bash
138
138
  docker run -d \
139
139
  --name qbitrr \
140
+ --tty \
140
141
  -e TZ=Europe/London \
141
142
  -p 6969:6969 \
142
143
  -v /etc/localtime:/etc/localtime:ro \
143
144
  -v /path/to/appdata/qbitrr:/config \
144
145
  -v /path/to/completed/downloads:/completed_downloads:rw \
145
146
  --restart unless-stopped \
146
- feramance/qbitrr:latest
147
+ feramance/qbitrr:latest
147
148
  ```
148
149
 
149
150
  The container automatically binds its WebUI to `0.0.0.0`; exposing `6969` makes the dashboard reachable at `http://<host>:6969/ui`.
@@ -155,6 +156,7 @@ services:
155
156
  image: feramance/qbitrr:latest
156
157
  user: 1000:1000
157
158
  restart: unless-stopped
159
+ tty: true
158
160
  environment:
159
161
  TZ: Europe/London
160
162
  ports:
@@ -178,7 +180,7 @@ services:
178
180
 
179
181
  ## 🛠️ Configuration
180
182
  - Default config path: `~/config/config.toml` (native) or `/config/config.toml` (Docker).
181
- - Tag new downloads in Radarr/Sonarr so qBitrr can map them correctly.
183
+ - Tag new downloads in Radarr/Sonarr/Lidarr so qBitrr can map them correctly.
182
184
  - qBittorrent 5.x works via a config flag (will become default later). The latest validated build is **4.6.7**.
183
185
  - Turn on logging (`Settings.Logging = true`) when you need support—logs land in `~/logs/` or `/config/logs`.
184
186
 
@@ -188,7 +190,7 @@ See `config.example.toml` for every knob and dial.
188
190
  The React + Vite dashboard listens on `http://<host>:6969/ui` by default.
189
191
 
190
192
  - 🔐 **Authentication** – set `Settings.WebUIToken` to protect `/api/*`. The UI itself uses the `/web/*` helpers.
191
- - 🗂️ **Tabs** – Processes, Logs, Radarr, Sonarr, and Config—all live data, all actionable.
193
+ - 🗂️ **Tabs** – Processes, Logs, Radarr, Sonarr, Lidarr, and Config—all live data, all actionable.
192
194
  - 🧪 **Developing the UI** – the source lives in `webui/`. Run `npm ci && npm run dev` to hack locally, and `npm run build` (or `make syncenv`) before committing so the bundled assets stay current.
193
195
 
194
196
  ## 🔁 Day-to-day Ops
@@ -8,7 +8,7 @@
8
8
  [![pre-commit.ci](https://results.pre-commit.ci/badge/github/Feramance/qBitrr/master.svg)](https://results.pre-commit.ci/latest/github/Feramance/qBitrr/master)
9
9
  [![License: MIT](https://img.shields.io/pypi/l/qbitrr)](LICENSE)
10
10
 
11
- > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
11
+ > 🧩 qBitrr keeps qBittorrent, Radarr, Sonarr, Lidarr, and your request tools chatting happily so downloads finish, import, and clean up without babysitting.
12
12
 
13
13
  ## 📚 What's Inside
14
14
  - [Overview](#-overview)
@@ -26,7 +26,7 @@
26
26
  - [License](#-license)
27
27
 
28
28
  ## 🧠 Overview
29
- qBitrr is the glue that keeps the *Arr ecosystem tidy. It watches qBittorrent for stalled jobs, kicks Radarr/Sonarr when something finishes, prunes your completed folder, and even offers a slick React dashboard so you can see what's running at a glance.
29
+ qBitrr is the glue that keeps the *Arr ecosystem tidy. It watches qBittorrent for stalled jobs, kicks Radarr/Sonarr/Lidarr when something finishes, prunes your completed folder, and even offers a slick React dashboard so you can see what's running at a glance.
30
30
 
31
31
  ## ✨ Highlights
32
32
  - 🚑 **Health checks** – spot stalled or broken torrents, blacklist them on the relevant Arr, and optionally trigger a re-search.
@@ -65,13 +65,14 @@ Minimal setup:
65
65
  ```bash
66
66
  docker run -d \
67
67
  --name qbitrr \
68
+ --tty \
68
69
  -e TZ=Europe/London \
69
70
  -p 6969:6969 \
70
71
  -v /etc/localtime:/etc/localtime:ro \
71
72
  -v /path/to/appdata/qbitrr:/config \
72
73
  -v /path/to/completed/downloads:/completed_downloads:rw \
73
74
  --restart unless-stopped \
74
- feramance/qbitrr:latest
75
+ feramance/qbitrr:latest
75
76
  ```
76
77
 
77
78
  The container automatically binds its WebUI to `0.0.0.0`; exposing `6969` makes the dashboard reachable at `http://<host>:6969/ui`.
@@ -83,6 +84,7 @@ services:
83
84
  image: feramance/qbitrr:latest
84
85
  user: 1000:1000
85
86
  restart: unless-stopped
87
+ tty: true
86
88
  environment:
87
89
  TZ: Europe/London
88
90
  ports:
@@ -106,7 +108,7 @@ services:
106
108
 
107
109
  ## 🛠️ Configuration
108
110
  - Default config path: `~/config/config.toml` (native) or `/config/config.toml` (Docker).
109
- - Tag new downloads in Radarr/Sonarr so qBitrr can map them correctly.
111
+ - Tag new downloads in Radarr/Sonarr/Lidarr so qBitrr can map them correctly.
110
112
  - qBittorrent 5.x works via a config flag (will become default later). The latest validated build is **4.6.7**.
111
113
  - Turn on logging (`Settings.Logging = true`) when you need support—logs land in `~/logs/` or `/config/logs`.
112
114
 
@@ -116,7 +118,7 @@ See `config.example.toml` for every knob and dial.
116
118
  The React + Vite dashboard listens on `http://<host>:6969/ui` by default.
117
119
 
118
120
  - 🔐 **Authentication** – set `Settings.WebUIToken` to protect `/api/*`. The UI itself uses the `/web/*` helpers.
119
- - 🗂️ **Tabs** – Processes, Logs, Radarr, Sonarr, and Config—all live data, all actionable.
121
+ - 🗂️ **Tabs** – Processes, Logs, Radarr, Sonarr, Lidarr, and Config—all live data, all actionable.
120
122
  - 🧪 **Developing the UI** – the source lives in `webui/`. Run `npm ci && npm run dev` to hack locally, and `npm run build` (or `make syncenv`) before committing so the bundled assets stay current.
121
123
 
122
124
  ## 🔁 Day-to-day Ops
@@ -59,15 +59,31 @@ AutoUpdateEnabled = false
59
59
  # Cron expression describing when to check for updates (default weekly at 03:00 on Sunday)
60
60
  AutoUpdateCron = "0 3 * * 0"
61
61
 
62
- # WebUI listen port and host
63
- # Default listen host `0.0.0.0` binds on all interfaces
64
- WebUIHost = "0.0.0.0"
65
- WebUIPort = 6969
66
62
 
67
- # Optional bearer token to secure the WebUI/API.
68
- # Set a non-empty value to require Authorization: Bearer <token>
69
- # Leave empty to disable authentication (not recommended on public networks)
70
- WebUIToken = ""
63
+
64
+
65
+ [WebUI]
66
+ # WebUI listen host (default 0.0.0.0)
67
+ Host = "0.0.0.0"
68
+
69
+ # WebUI listen port (default 6969)
70
+ Port = 6969
71
+
72
+ # Optional bearer token to secure WebUI/API.
73
+ # Set a non-empty value to require Authorization: Bearer <token>.
74
+ Token = ""
75
+
76
+ # Enable live updates for Arr views
77
+ LiveArr = true
78
+
79
+ # Group Sonarr episodes by series in views
80
+ GroupSonarr = true
81
+
82
+ # Group Lidarr albums by artist in views
83
+ GroupLidarr = true
84
+
85
+ # WebUI theme (light or dark)
86
+ Theme = "dark"
71
87
 
72
88
 
73
89
  [qBit]
@@ -172,8 +188,10 @@ MainQualityProfile = []
172
188
  # Temp quality profile (To pair quality profiles, ensure they are in the same order as in the main profiles)
173
189
  TempQualityProfile = []
174
190
 
175
- # Search by series instead of by episode (This is true if QualityUnmetSearch, CustomFormatUnmetSearch, or DoUpgradeSearch are enabled)
176
- SearchBySeries = true
191
+ # Search mode: true (always series search), false (always episode search), or 'smart' (automatic)
192
+ # Smart mode: uses series search for entire seasons/series, episode search for single episodes
193
+ # (Series search ignores QualityUnmetSearch and CustomFormatUnmetSearch settings)
194
+ SearchBySeries = "smart"
177
195
 
178
196
  # Prioritize Today's releases (Similar effect as RSS Sync, where it searches today's release episodes first, only works on Sonarr).
179
197
  PrioritizeTodaysReleases = true
@@ -381,8 +399,10 @@ MainQualityProfile = []
381
399
  # Temp quality profile (To pair quality profiles, ensure they are in the same order as in the main profiles)
382
400
  TempQualityProfile = []
383
401
 
384
- # Search by series instead of by episode (This is true if QualityUnmetSearch, CustomFormatUnmetSearch, or DoUpgradeSearch are enabled)
385
- SearchBySeries = true
402
+ # Search mode: true (always series search), false (always episode search), or 'smart' (automatic)
403
+ # Smart mode: uses series search for entire seasons/series, episode search for single episodes
404
+ # (Series search ignores QualityUnmetSearch and CustomFormatUnmetSearch settings)
405
+ SearchBySeries = "smart"
386
406
 
387
407
  # Prioritize Today's releases (Similar effect as RSS Sync, where it searches today's release episodes first, only works on Sonarr).
388
408
  PrioritizeTodaysReleases = true
@@ -936,3 +956,167 @@ AddTrackerIfMissing = false
936
956
  RemoveIfExists = false
937
957
  SuperSeedMode = false
938
958
  AddTags = ["4K"]
959
+
960
+
961
+ [Lidarr-Music]
962
+ # Toggle whether to manage the Servarr instance torrents.
963
+ Managed = true
964
+
965
+ # The URL used to access Servarr interface eg. http://ip:port (if you use a domain enter the domain without a port)
966
+ URI = "CHANGE_ME"
967
+
968
+ # The Servarr API Key, Can be found it Settings > General > Security
969
+ APIKey = "CHANGE_ME"
970
+
971
+ # Category applied by Servarr to torrents in qBitTorrent, can be found in Settings > Download Clients > qBit > Category
972
+ Category = "lidarr-music"
973
+
974
+ # Toggle whether to send a query to Servarr to search any failed torrents
975
+ ReSearch = true
976
+
977
+ # The Servarr's Import Mode(one of Move, Copy or Auto)
978
+ importMode = "Auto"
979
+
980
+ # Timer to call RSSSync (In minutes) - Set to 0 to disable (Values below 5 can cause errors for maximum retires)
981
+ RssSyncTimer = 5
982
+
983
+ # Timer to call RefreshDownloads to update the queue. (In minutes) - Set to 0 to disable (Values below 5 can cause errors for maximum retires)
984
+ RefreshDownloadsTimer = 5
985
+
986
+ # Error messages shown my the Arr instance which should be considered failures.
987
+ # This entry should be a list, leave it empty if you want to disable this error handling.
988
+ # If enabled qBitrr will remove the failed files and tell the Arr instance the download failed
989
+ ArrErrorCodesToBlocklist = ["Not an upgrade for existing album file(s)", "Not a preferred word upgrade for existing album file(s)", "Unable to determine if file is a sample"]
990
+
991
+
992
+ [Lidarr-Music.EntrySearch]
993
+ # All these settings depends on SearchMissing being True
994
+
995
+ # Should search for Missing files?
996
+ SearchMissing = true
997
+
998
+ # Should search for unmonitored albums?
999
+ Unmonitored = false
1000
+
1001
+ # Lidarr has a default of 3 simultaneous tasks, which can be increased up to 10 tasks
1002
+ # If you set the environment variable of "THREAD_LIMIT" to a number between and including 2-10
1003
+ # Lidarr devs have stated that this is an unsupported feature so you will not get any support for doing so from them.
1004
+ SearchLimit = 5
1005
+
1006
+ # Reverse search order (Start searching oldest to newest)
1007
+ SearchInReverse = false
1008
+
1009
+ # Delay between request searches in seconds
1010
+ SearchRequestsEvery = 300
1011
+
1012
+ # Search albums which already have a file in hopes of finding a better quality version.
1013
+ DoUpgradeSearch = false
1014
+
1015
+ # Do a quality unmet search for existing entries.
1016
+ QualityUnmetSearch = false
1017
+
1018
+ # Do a minimum custom format score unmet search for existing entries.
1019
+ CustomFormatUnmetSearch = false
1020
+
1021
+ # Automatically remove torrents that do not mee the minimum custom format score.
1022
+ ForceMinimumCustomFormat = false
1023
+
1024
+ # Once you have search all files on your specified year range restart the loop and search again.
1025
+ SearchAgainOnSearchCompletion = true
1026
+
1027
+ # Use Temp profile for missing
1028
+ UseTempForMissing = false
1029
+
1030
+ # Don't change back to main profile
1031
+ KeepTempProfile = false
1032
+
1033
+ # Main quality profile (To pair quality profiles, ensure they are in the same order as in the temp profiles)
1034
+ MainQualityProfile = []
1035
+
1036
+ # Temp quality profile (To pair quality profiles, ensure they are in the same order as in the main profiles)
1037
+ TempQualityProfile = []
1038
+
1039
+
1040
+ [Lidarr-Music.Torrent]
1041
+ # Set it to regex matches to respect/ignore case.
1042
+ CaseSensitiveMatches = false
1043
+
1044
+ # These regex values will match any folder where the full name matches the specified values here, comma separated strings.
1045
+ # These regex need to be escaped, that's why you see so many backslashes.
1046
+ FolderExclusionRegex = ["\\bextras?\\b", "\\bfeaturettes?\\b", "\\bsamples?\\b", "\\bscreens?\\b"]
1047
+
1048
+ # These regex values will match any folder where the full name matches the specified values here, comma separated strings.
1049
+ # These regex need to be escaped, that's why you see so many backslashes.
1050
+ FileNameExclusionRegex = ["\\bsample\\b", "brarbg.com\\b", "\\btrailer\\b", "comandotorrents.com"]
1051
+
1052
+ # Only files with these extensions will be allowed to be downloaded, comma separated strings or regex, leave it empty to allow all extensions
1053
+ FileExtensionAllowlist = [".mp3", ".flac", ".m4a", ".aac", ".ogg", ".opus", ".wav", ".ape", ".wma", ".!qB", ".parts", ".log", ".cue"]
1054
+
1055
+ # Auto delete files that can't be playable (i.e .exe, .png)
1056
+ AutoDelete = false
1057
+
1058
+ # Ignore Torrents which are younger than this value (in seconds: 600 = 10 Minutes)
1059
+ IgnoreTorrentsYoungerThan = 600
1060
+
1061
+ # Maximum allowed remaining ETA for torrent completion (in seconds: 3600 = 1 Hour)
1062
+ # Note that if you set the MaximumETA on a tracker basis that value is favoured over this value
1063
+ MaximumETA = 604800
1064
+
1065
+ # Do not delete torrents with higher completion percentage than this setting (0.5 = 50%, 1.0 = 100%)
1066
+ MaximumDeletablePercentage = 0.99
1067
+
1068
+ # Ignore slow torrents.
1069
+ DoNotRemoveSlow = true
1070
+
1071
+ # Maximum allowed time for allowed stalled torrents in minutes (-1 = Disabled, 0 = Infinite)
1072
+ StalledDelay = 15
1073
+
1074
+ # Re-search stalled torrents when StalledDelay is enabled and you want to re-search before removing the stalled torrent, or only after the torrent is removed.
1075
+ ReSearchStalled = false
1076
+
1077
+
1078
+ [Lidarr-Music.Torrent.SeedingMode]
1079
+ # Set the maximum allowed download rate for torrents
1080
+ # Set this value to -1 to disabled it
1081
+ # Note that if you set the DownloadRateLimit on a tracker basis that value is favoured over this value
1082
+ DownloadRateLimitPerTorrent = -1
1083
+
1084
+ # Set the maximum allowed upload rate for torrents
1085
+ # Set this value to -1 to disabled it
1086
+ # Note that if you set the UploadRateLimit on a tracker basis that value is favoured over this value
1087
+ UploadRateLimitPerTorrent = -1
1088
+
1089
+ # Set the maximum allowed upload ratio for torrents
1090
+ # Set this value to -1 to disabled it
1091
+ # Note that if you set the MaxUploadRatio on a tracker basis that value is favoured over this value
1092
+ MaxUploadRatio = -1
1093
+
1094
+ # Set the maximum seeding time in seconds for torrents
1095
+ # Set this value to -1 to disabled it
1096
+ # Note that if you set the MaxSeedingTime on a tracker basis that value is favoured over this value
1097
+ MaxSeedingTime = -1
1098
+
1099
+ # Remove torrent condition (-1=Do not remove, 1=Remove on MaxUploadRatio, 2=Remove on MaxSeedingTime, 3=Remove on MaxUploadRatio or MaxSeedingTime, 4=Remove on MaxUploadRatio and MaxSeedingTime)
1100
+ RemoveTorrent = -1
1101
+
1102
+ # Enable if you want to remove dead trackers
1103
+ RemoveDeadTrackers = false
1104
+
1105
+ # If "RemoveDeadTrackers" is set to true then remove trackers with the following messages
1106
+ RemoveTrackerWithMessage = ["skipping tracker announce (unreachable)", "No such host is known", "unsupported URL protocol", "info hash is not authorized with this tracker"]
1107
+
1108
+ # You can have multiple trackers set here or none just add more subsections.
1109
+
1110
+ [[Lidarr-Music.Torrent.Trackers]]
1111
+ Name = "RED"
1112
+ Priority = 10
1113
+ URI = "https://flacsfor.me/announce"
1114
+ MaximumETA = 18000
1115
+ DownloadRateLimit = -1
1116
+ UploadRateLimit = -1
1117
+ MaxUploadRatio = -1
1118
+ MaxSeedingTime = -1
1119
+ AddTrackerIfMissing = false
1120
+ RemoveIfExists = false
1121
+ SuperSeedMode = false
1122
+ AddTags = ["qBitrr-music"]
@@ -28,7 +28,7 @@ target-version = ['py312']
28
28
 
29
29
  [tool.poetry]
30
30
  name = "pypi-public"
31
- version = "5.1.1"
31
+ version = "5.3.0"
32
32
  description = "A simple script to monitor qBit and communicate with Radarr and Sonarr"
33
33
  authors = ["Drapersniper", "Feramance"]
34
34
  readme = "README.md"