diff --git a/README.md b/README.md
index aad2468..a1523c4 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,7 @@ cleanuperr was created primarily to address malicious files, such as `*.lnk` or
> - Trigger a search for downloads removed from the *arrs.
> - Clean up downloads that have been seeding for a certain amount of time.
> - Notify on strike or download removal.
+> - Ignore certain torrent hashes, categories, tags or trackers from processing.
cleanuperr supports both qBittorrent's built-in exclusion features and its own blocklist-based system. Binaries for all platforms are provided, along with Docker images for easy deployment.
@@ -25,15 +26,21 @@ cleanuperr supports both qBittorrent's built-in exclusion features and its own b
> https://discord.gg/sWggpnmGNY
## Table of contents:
-- [Naming choice](README.md#naming-choice)
-- [Quick Start](README.md#quick-start)
-- [How it works](README.md#how-it-works)
-- [Setup](README.md#setup)
-- [Usage](README.md#usage)
- - [Docker Compose](README.md#docker-compose-yaml)
- - [Environment Variables](README.md#environment-variables)
- - [Binaries](README.md#binaries-if-youre-not-using-docker)
-- [Credits](README.md#credits)
+- [Naming choice](#naming-choice)
+- [Quick Start](#quick-start)
+- [How it works](#how-it-works)
+ - [Content blocker](#1-content-blocker-will)
+ - [Queue cleaner](#2-queue-cleaner-will)
+ - [Download cleaner](#3-download-cleaner-will)
+- [Setup](#setup-examples)
+- [Usage](#usage)
+ - [Docker](#docker)
+ - [Environment Variables](#environment-variables)
+ - [Docker Compose](#docker-compose-example)
+ - [Windows](#windows)
+ - [Linux](#linux)
+ - [MacOS](#macos)
+- [Credits](#credits)
## Naming choice
@@ -52,10 +59,10 @@ I've seen a few discussions on this type of naming and I've decided that I didn'
> Use the Unraid Community App.
>
> 3. **Manual Installation (if you're not using Docker)**
-> More details [here](#binaries-if-youre-not-using-docker).
+> Go to [Windows](#windows), [Linux](#linux) or [MacOS](#macos).
> [!TIP]
-> Refer to the [Environment variables](#Environment-variables) section for detailed configuration instructions and the [Setup](#Setup) section for an in-depth explanation of the cleanup process.
+> Refer to the [Environment variables](#environment-variables) section for detailed configuration instructions and the [Setup examples](#setup-examples) section for an in-depth explanation of the cleanup process.
> [!IMPORTANT]
@@ -69,7 +76,7 @@ I've seen a few discussions on this type of naming and I've decided that I didn'
# How it works
-1. **Content blocker** will:
+#### 1. **Content blocker** will:
- Run every 5 minutes (or configured cron).
- Process all items in the *arr queue.
- Find the corresponding item from the download client for each queue item.
@@ -80,7 +87,7 @@ I've seen a few discussions on this type of naming and I've decided that I didn'
- It will be removed from the *arr's queue and blocked.
- It will be deleted from the download client.
- A new search will be triggered for the *arr item.
-2. **Queue cleaner** will:
+#### 2. **Queue cleaner** will:
- Run every 5 minutes (or configured cron, or right after `content blocker`).
- Process all items in the *arr queue.
- Check each queue item if it is **stalled (download speed is 0)**, **stuck in metadata downloading** or **failed to be imported**.
@@ -93,11 +100,11 @@ I've seen a few discussions on this type of naming and I've decided that I didn'
- It will be removed from the *arr's queue and blocked.
- It will be deleted from the download client.
- A new search will be triggered for the *arr item.
-3. **Download cleaner** will:
+#### 3. **Download cleaner** will:
- Run every hour (or configured cron).
- Automatically clean up downloads that have been seeding for a certain amount of time.
-# Setup
+# Setup examples
## Using qBittorrent's built-in feature (works only with qBittorrent)
@@ -129,7 +136,26 @@ I've seen a few discussions on this type of naming and I've decided that I didn'
## Usage
-### Docker compose yaml
+###
Docker
+
+
+### **Environment variables**
+
+**Jump to:**
+- [General settings](variables.md#general-settings)
+- [Queue Cleaner settings](variables.md#queue-cleaner-settings)
+- [Content Blocker settings](variables.md#content-blocker-settings)
+- [Download Cleaner settings](variables.md#download-cleaner-settings)
+- [Download Client settings](variables.md#download-client-settings)
+- [Arr settings](variables.md#arr-settings)
+- [Notification settings](variables.md#notification-settings)
+- [Advanced settings](variables.md#advanced-settings)
+
+### Docker compose example
+
+> [!NOTE]
+>
+> This example contains all settings and should be modified to fit your needs.
```
version: "3.3"
@@ -232,28 +258,48 @@ services:
- NOTIFIARR__CHANNEL_ID=discord_channel_id
```
-## Environment variables
+###
Windows
-Jump to:
-- [General settings](variables.md#general-settings)
-- [Queue Cleaner settings](variables.md#queue-cleaner-settings)
-- [Content Blocker settings](variables.md#content-blocker-settings)
-- [Download Cleaner settings](variables.md#download-cleaner-settings)
-- [Download Client settings](variables.md#download-client-settings)
-- [Arr settings](variables.md#arr-settings)
-- [Notification settings](variables.md#notification-settings)
-- [Advanced settings](variables.md#advanced-settings)
-
-### Binaries (if you're not using Docker)
-
-1. Download the binaries from [releases](https://github.com/flmorg/cleanuperr/releases).
-2. Extract them from the zip file.
-3. Edit **appsettings.json**. The paths from this json file correspond with the docker env vars, as described [above](#environment-variables).
+1. Download the zip file from [releases](https://github.com/flmorg/cleanuperr/releases).
+2. Extract the zip file into `C:\example\directory`.
+3. Edit **appsettings.json**. The paths from this json file correspond with the docker env vars, as described [here](#environment-variables).
+4. Execute `cleanuperr.exe`.
> [!TIP]
> ### Run as a Windows Service
> Check out this stackoverflow answer on how to do it: https://stackoverflow.com/a/15719678
+###
Linux
+
+1. Download the zip file from [releases](https://github.com/flmorg/cleanuperr/releases).
+2. Extract the zip file into `/example/directory`.
+3. Edit **appsettings.json**. The paths from this json file correspond with the docker env vars, as described [here](#environment-variables).
+4. Open a terminal and execute these commands:
+ ```
+ cd /example/directory
+ chmod +x cleanuperr
+ ./cleanuperr
+ ```
+
+###
MacOS
+
+1. Download the zip file from [releases](https://github.com/flmorg/cleanuperr/releases).
+2. Extract the zip file into `/example/directory`.
+3. Edit **appsettings.json**. The paths from this json file correspond with the docker env vars, as described [here](#environment-variables).
+4. Open a terminal and execute these commands:
+ ```
+ cd /example/directory
+ chmod +x cleanuperr
+ ./cleanuperr
+ ```
+
+> [!IMPORTANT]
+> Some people have experienced problems when trying to execute cleanuperr on MacOS because the system actively blocked the file for not being signed.
+> As per [this](), you may need to also execute this command:
+> ```
+> codesign --sign - --force --preserve-metadata=entitlements,requirements,flags,runtime /example/directory/cleanuperr
+> ```
+
# Credits
Special thanks for inspiration go to:
- [ThijmenGThN/swaparr](https://github.com/ThijmenGThN/swaparr)
@@ -265,4 +311,3 @@ Special thanks for inspiration go to:
If I made your life just a tiny bit easier, consider buying me a coffee!
-
diff --git a/variables.md b/variables.md
index 905aee1..e539035 100644
--- a/variables.md
+++ b/variables.md
@@ -1,52 +1,52 @@
## Table of contents
-- [General settings](variables.md#general-settings)
-- [Queue Cleaner settings](variables.md#queue-cleaner-settings)
-- [Content Blocker settings](variables.md#content-blocker-settings)
-- [Download Cleaner settings](variables.md#download-cleaner-settings)
-- [Download Client settings](variables.md#download-client-settings)
-- [Arr settings](variables.md#arr-settings)
-- [Notification settings](variables.md#notification-settings)
-- [Advanced settings](variables.md#advanced-settings)
+- [General settings](#general-settings)
+- [Queue Cleaner settings](#queue-cleaner-settings)
+- [Content Blocker settings](#content-blocker-settings)
+- [Download Cleaner settings](#download-cleaner-settings)
+- [Download Client settings](#download-client-settings)
+- [Arr settings](#arr-settings)
+- [Notification settings](#notification-settings)
+- [Advanced settings](#advanced-settings)
#
### General settings
-**`TZ`**
+#### **`TZ`**
- The time zone to use.
- Type: String.
- Possible values: Any valid timezone.
- Default: `UTC`.
- Required: No.
-**`DRY_RUN`**
+#### **`DRY_RUN`**
- When enabled, simulates irreversible operations (like deletions and notifications) without making actual changes.
- Type: Boolean.
- Possible values: `true`, `false`.
- Default: `false`.
- Required: No.
-**`LOGGING__LOGLEVEL`**
+#### **`LOGGING__LOGLEVEL`**
- Controls the detail level of application logs.
- Type: String.
- Possible values: `Verbose`, `Debug`, `Information`, `Warning`, `Error`, `Fatal`.
- Default: `Information`.
- Required: No.
-**`LOGGING__FILE__ENABLED`**
+#### **`LOGGING__FILE__ENABLED`**
- Enables logging to a file.
- Type: Boolean.
- Possible values: `true`, `false`.
- Default: `false`.
- Required: No.
-**`LOGGING__FILE__PATH`**
+#### **`LOGGING__FILE__PATH`**
- Directory where log files will be saved.
- Type: String.
- Default: Empty.
- Required: No.
-**`LOGGING__ENHANCED`**
+#### **`LOGGING__ENHANCED`**
- Provides more detailed descriptions in logs whenever possible.
- Type: Boolean.
- Possible values: `true`, `false`.
@@ -58,7 +58,7 @@
### Queue Cleaner settings
-**`TRIGGERS__QUEUECLEANER`**
+#### **`TRIGGERS__QUEUECLEANER`**
- Cron schedule for the queue cleaner job.
- Type: String - [Quartz cron format](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html).
- Default: `0 0/5 * * * ?` (every 5 minutes).
@@ -66,9 +66,9 @@
> [!NOTE]
> - Maximum interval is 6 hours.
-> - Ignored if `QUEUECLEANER__RUNSEQUENTIALLY=true` and `CONTENTBLOCKER__ENABLED=true`.
+> - Is ignored if `QUEUECLEANER__RUNSEQUENTIALLY=true` and `CONTENTBLOCKER__ENABLED=true`.
-**`QUEUECLEANER__ENABLED`**
+#### **`QUEUECLEANER__ENABLED`**
- Enables or disables the queue cleaning functionality.
- When enabled, processes all items in the *arr queue.
- Type: Boolean
@@ -76,7 +76,7 @@
- Default: `true`
- Required: No.
-**`QUEUECLEANER__IGNORED_DOWNLOADS_PATH`**
+#### **`QUEUECLEANER__IGNORED_DOWNLOADS_PATH`**
- Local path to the file containing ignored downloads.
- If the contents of the file are changed, they will be reloaded on the next job run.
- Accepted values:
@@ -101,7 +101,7 @@
>[!IMPORTANT]
> Some people have experienced problems using Docker where the mounted file would not update inside the container if it was modified on the host. This is a Docker configuration problem and can not be solved by cleanuperr.
-**`QUEUECLEANER__RUNSEQUENTIALLY`**
+#### **`QUEUECLEANER__RUNSEQUENTIALLY`**
- Controls whether queue cleaner runs after content blocker instead of in parallel.
- When `true`, streamlines the cleaning process by running immediately after content blocker.
- Type: Boolean
@@ -109,23 +109,24 @@
- Default: `true`
- Required: No.
-**`QUEUECLEANER__IMPORT_FAILED_MAX_STRIKES`**
+#### **`QUEUECLEANER__IMPORT_FAILED_MAX_STRIKES`**
- Number of strikes before removing a failed import.
- Set to `0` to never remove failed imports.
-- A strike is given when an item is stalled, stuck in metadata downloading, or failed to be imported.
+- A strike is given when an item fails to be imported.
- Type: Integer
-- Possible values: `0` or a number greater than `2`.
- Default: `0`
- Required: No.
+> [!NOTE]
+> If not set to `0`, the minimum value is `3`.
-**`QUEUECLEANER__IMPORT_FAILED_IGNORE_PRIVATE`**
+#### **`QUEUECLEANER__IMPORT_FAILED_IGNORE_PRIVATE`**
- Controls whether to ignore failed imports from private trackers.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`QUEUECLEANER__IMPORT_FAILED_DELETE_PRIVATE`**
+#### **`QUEUECLEANER__IMPORT_FAILED_DELETE_PRIVATE`**
- Controls whether to delete failed imports from private trackers from the download client.
- Has no effect if `QUEUECLEANER__IMPORT_FAILED_IGNORE_PRIVATE` is `true`.
- Type: Boolean
@@ -136,42 +137,43 @@
> [!WARNING]
> Setting `QUEUECLEANER__IMPORT_FAILED_DELETE_PRIVATE=true` means you don't care about seeding, ratio, H&R and potentially losing your tracker account.
-**`QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS`**
+#### **`QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS`**
- Patterns to look for in failed import messages that should be ignored.
- Multiple patterns can be specified using incrementing numbers starting from 0.
- Type: String array
- Default: Empty.
- Required: No.
- Example:
-```yaml
-QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__0: "title mismatch"
-QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
-```
+ ```yaml
+ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__0: "title mismatch"
+ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
+ ```
-**`QUEUECLEANER__STALLED_MAX_STRIKES`**
+#### **`QUEUECLEANER__STALLED_MAX_STRIKES`**
- Number of strikes before removing a stalled download.
- Set to `0` to never remove stalled downloads.
-- A strike is given when download speed is 0.
+- A strike is given when an item is stalled (not downloading) or stuck while downloading metadata.
- Type: Integer
-- Possible values: `0` or a number greater than `2`.
- Default: `0`
- Required: No.
+> [!NOTE]
+> If not set to `0`, the minimum value is `3`.
-**`QUEUECLEANER__STALLED_RESET_STRIKES_ON_PROGRESS`**
+#### **`QUEUECLEANER__STALLED_RESET_STRIKES_ON_PROGRESS`**
- Controls whether to remove strikes if any download progress was made since last checked.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`QUEUECLEANER__STALLED_IGNORE_PRIVATE`**
+#### **`QUEUECLEANER__STALLED_IGNORE_PRIVATE`**
- Controls whether to ignore stalled downloads from private trackers.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`QUEUECLEANER__STALLED_DELETE_PRIVATE`**
+#### **`QUEUECLEANER__STALLED_DELETE_PRIVATE`**
- Controls whether to delete stalled private downloads from the download client.
- Has no effect if `QUEUECLEANER__STALLED_IGNORE_PRIVATE` is `true`.
- Type: Boolean
@@ -186,7 +188,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
### Content Blocker settings
-**`TRIGGERS__CONTENTBLOCKER`**
+#### **`TRIGGERS__CONTENTBLOCKER`**
- Cron schedule for the content blocker job.
- Type: String - [Quartz cron format](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html).
- Default: `0 0/5 * * * ?` (every 5 minutes).
@@ -195,7 +197,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> [!NOTE]
> - Maximum interval is 6 hours.
-**`CONTENTBLOCKER__ENABLED`**
+#### **`CONTENTBLOCKER__ENABLED`**
- Enables or disables the content blocker functionality.
- When enabled, processes all items in the *arr queue and marks unwanted files.
- Type: Boolean
@@ -203,7 +205,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
- Default: `false`
- Required: No.
-**`CONTENTBLOCKER__IGNORED_DOWNLOADS_PATH`**
+#### **`CONTENTBLOCKER__IGNORED_DOWNLOADS_PATH`**
- Local path to the file containing ignored downloads.
- If the contents of the file are changed, they will be reloaded on the next job run.
- Accepted values:
@@ -228,14 +230,14 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
>[!IMPORTANT]
> Some people have experienced problems using Docker where the mounted file would not update inside the container if it was modified on the host. This is a Docker configuration problem and can not be solved by cleanuperr.
-**`CONTENTBLOCKER__IGNORE_PRIVATE`**
+#### **`CONTENTBLOCKER__IGNORE_PRIVATE`**
- Controls whether to ignore downloads from private trackers.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`CONTENTBLOCKER__DELETE_PRIVATE`**
+#### **`CONTENTBLOCKER__DELETE_PRIVATE`**
- Controls whether to delete private downloads that have all files blocked from the download client.
- Has no effect if `CONTENTBLOCKER__IGNORE_PRIVATE` is `true`.
- Type: Boolean
@@ -250,7 +252,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
### Download Cleaner settings
-**`TRIGGERS__DOWNLOADCLEANER`**
+#### **`TRIGGERS__DOWNLOADCLEANER`**
- Cron schedule for the download cleaner job.
- Type: String - [Quartz cron format](https://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html).
- Default: `0 0 * * * ?` (every hour).
@@ -259,7 +261,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> [!NOTE]
> - Maximum interval is 6 hours.
-**`DOWNLOADCLEANER__ENABLED`**
+#### **`DOWNLOADCLEANER__ENABLED`**
- Enables or disables the download cleaner functionality.
- When enabled, automatically cleans up downloads that have been seeding for a certain amount of time.
- Type: Boolean.
@@ -267,7 +269,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
- Default: `false`
- Required: No.
-**`DOWNLOADCLEANER__IGNORED_DOWNLOADS_PATH`**
+#### **`DOWNLOADCLEANER__IGNORED_DOWNLOADS_PATH`**
- Local path to the file containing ignored downloads.
- If the contents of the file are changed, they will be reloaded on the next job run.
- Accepted values:
@@ -292,7 +294,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
>[!IMPORTANT]
> Some people have experienced problems using Docker where the mounted file would not update inside the container if it was modified on the host. This is a Docker configuration problem and can not be solved by cleanuperr.
-**`DOWNLOADCLEANER__DELETE_PRIVATE`**
+#### **`DOWNLOADCLEANER__DELETE_PRIVATE`**
- Controls whether to delete private downloads.
- Type: Boolean.
- Possible values: `true`, `false`
@@ -302,7 +304,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> [!WARNING]
> Setting `DOWNLOADCLEANER__DELETE_PRIVATE=true` means you don't care about seeding, ratio, H&R and potentially losing your tracker account.
-**`DOWNLOADCLEANER__CATEGORIES__0__NAME`**
+#### **`DOWNLOADCLEANER__CATEGORIES__0__NAME`**
- Name of the category to clean.
- Type: String.
- Default: Empty.
@@ -310,18 +312,21 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> [!NOTE]
> The category name must match the category that was set in the *arr.
+>
> For qBittorrent, the category name is the name of the download category.
+>
> For Deluge, the category name is the name of the label.
+>
> For Transmission, the category name is the last directory from the save location.
-**`DOWNLOADCLEANER__CATEGORIES__0__MAX_RATIO`**
+#### **`DOWNLOADCLEANER__CATEGORIES__0__MAX_RATIO`**
- Maximum ratio to reach before removing a download.
- Type: Decimal.
- Possible values: `-1` or greater (`-1` means no limit or disabled).
- Default: `-1`
- Required: No.
-**`DOWNLOADCLEANER__CATEGORIES__0__MIN_SEED_TIME`**
+#### **`DOWNLOADCLEANER__CATEGORIES__0__MIN_SEED_TIME`**
- Minimum number of hours to seed before removing a download, if the ratio has been met.
- Used with `MAX_RATIO` to ensure a minimum seed time.
- Type: Decimal.
@@ -329,7 +334,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
- Default: `0`
- Required: No.
-**`DOWNLOADCLEANER__CATEGORIES__0__MAX_SEED_TIME`**
+#### **`DOWNLOADCLEANER__CATEGORIES__0__MAX_SEED_TIME`**
- Maximum number of hours to seed before removing a download.
- Type: Decimal.
- Possible values: `-1` or greater (`-1` means no limit or disabled).
@@ -352,7 +357,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
### Download Client settings
-**`DOWNLOAD_CLIENT`**
+#### **`DOWNLOAD_CLIENT`**
- Specifies which download client is used by *arrs.
- Type: String.
- Possible values: `none`, `qbittorrent`, `deluge`, `transmission`.
@@ -362,49 +367,49 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> [!NOTE]
> Only one download client can be enabled at a time. If you have more than one download client, you should deploy multiple instances of cleanuperr.
-**`QBITTORRENT__URL`**
+#### **`QBITTORRENT__URL`**
- URL of the qBittorrent instance.
- Type: String.
- Default: `http://localhost:8080`.
- Required: No.
-**`QBITTORRENT__USERNAME`**
+#### **`QBITTORRENT__USERNAME`**
- Username for qBittorrent authentication.
- Type: String.
- Default: Empty.
- Required: No.
-**`QBITTORRENT__PASSWORD`**
+#### **`QBITTORRENT__PASSWORD`**
- Password for qBittorrent authentication.
- Type: String.
- Default: Empty.
- Required: No.
-**`DELUGE__URL`**
+#### **`DELUGE__URL`**
- URL of the Deluge instance.
- Type: String.
- Default: `http://localhost:8112`.
- Required: No.
-**`DELUGE__PASSWORD`**
+#### **`DELUGE__PASSWORD`**
- Password for Deluge authentication.
- Type: String.
- Default: Empty.
- Required: No.
-**`TRANSMISSION__URL`**
+#### **`TRANSMISSION__URL`**
- URL of the Transmission instance.
- Type: String.
- Default: `http://localhost:9091`.
- Required: No.
-**`TRANSMISSION__USERNAME`**
+#### **`TRANSMISSION__USERNAME`**
- Username for Transmission authentication.
- Type: String.
- Default: Empty.
- Required: No.
-**`TRANSMISSION__PASSWORD`**
+#### **`TRANSMISSION__PASSWORD`**
- Password for Transmission authentication.
- Type: String.
- Default: Empty.
@@ -414,112 +419,6 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
### Arr settings
-**`SONARR__ENABLED`**
-- Enables or disables Sonarr cleanup.
-- Type: Boolean
-- Possible values: `true`, `false`
-- Default: `false`
-- Required: No.
-
-**`SONARR__BLOCK__TYPE`**
-- Determines how file blocking works for Sonarr.
-- Type: String
-- Possible values: `blacklist`, `whitelist`
-- Default: `blacklist`
-- Required: No.
-
-**`SONARR__BLOCK__PATH`**
-- Path to the blocklist file (local file or URL).
-- Must be JSON compatible.
-- Type: String
-- Default: Empty.
-- Required: No.
-
-**`SONARR__SEARCHTYPE`**
-- Determines what to search for after removing a queue item.
-- Type: String
-- Possible values: `Episode`, `Season`, `Series`
-- Default: `Episode`
-- Required: No.
-
-**`SONARR__INSTANCES__0__URL`**
-- URL of the Sonarr instance.
-- Type: String
-- Default: `http://localhost:8989`
-- Required: No.
-
-**`SONARR__INSTANCES__0__APIKEY`**
-- API key for the Sonarr instance.
-- Type: String
-- Default: Empty.
-- Required: No.
-
-**`RADARR__ENABLED`**
-- Enables or disables Radarr cleanup.
-- Type: Boolean
-- Possible values: `true`, `false`
-- Default: `false`
-- Required: No.
-
-**`RADARR__BLOCK__TYPE`**
-- Determines how file blocking works for Radarr.
-- Type: String
-- Possible values: `blacklist`, `whitelist`
-- Default: `blacklist`
-- Required: No.
-
-**`RADARR__BLOCK__PATH`**
-- Path to the blocklist file (local file or URL).
-- Must be JSON compatible.
-- Type: String
-- Default: Empty.
-- Required: No.
-
-**`RADARR__INSTANCES__0__URL`**
-- URL of the Radarr instance.
-- Type: String
-- Default: `http://localhost:7878`
-- Required: No.
-
-**`RADARR__INSTANCES__0__APIKEY`**
-- API key for the Radarr instance.
-- Type: String
-- Default: Empty.
-- Required: No.
-
-**`LIDARR__ENABLED`**
-- Enables or disables Lidarr cleanup.
-- Type: Boolean
-- Possible values: `true`, `false`
-- Default: `false`
-- Required: No.
-
-**`LIDARR__BLOCK__TYPE`**
-- Determines how file blocking works for Lidarr.
-- Type: String
-- Possible values: `blacklist`, `whitelist`
-- Default: `blacklist`
-- Required: No.
-
-**`LIDARR__BLOCK__PATH`**
-- Path to the blocklist file (local file or URL).
-- Must be JSON compatible.
-- Type: String
-- Default: Empty.
-- Required: No.
-
-**`LIDARR__INSTANCES__0__URL`**
-- URL of the Lidarr instance.
-- Type: String
-- Default: `http://localhost:8686`
-- Required: No.
-
-**`LIDARR__INSTANCES__0__APIKEY`**
-- API key for the Lidarr instance.
-- Type: String
-- Default: Empty.
-- Required: No.
-
> [!NOTE]
> Multiple instances can be specified for each *arr using this format, where `` starts from 0:
> ```yaml
@@ -527,8 +426,29 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> __INSTANCES____APIKEY
> ```
+#### **`SONARR__ENABLED`**
+- Enables or disables Sonarr cleanup.
+- Type: Boolean
+- Possible values: `true`, `false`
+- Default: `false`
+- Required: No.
+
+#### **`SONARR__BLOCK__TYPE`**
+- Determines how file blocking works for Sonarr.
+- Type: String
+- Possible values: `blacklist`, `whitelist`
+- Default: `blacklist`
+- Required: No.
+
+#### **`SONARR__BLOCK__PATH`**
+- Path to the blocklist file (local file or URL).
+- Must be JSON compatible.
+- Type: String
+- Default: Empty.
+- Required: No.
+
> [!NOTE]
-> The blocklists (blacklist/whitelist) support the following patterns:
+> The blocklists support the following patterns:
> ```
> *example // file name ends with "example"
> example* // file name starts with "example"
@@ -538,47 +458,155 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
> ```
> [!NOTE]
-> [This blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist) and [this whitelist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/whitelist) can be used for Sonarr and Radarr, but they are not suitable for other *arrs.
+> [This blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist), [this permissive blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist_permissive) and [this whitelist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/whitelist) can be used for Sonarr and Radarr.
+
+#### **`SONARR__SEARCHTYPE`**
+- Determines what to search for after removing a queue item.
+- Type: String
+- Possible values: `Episode`, `Season`, `Series`
+- Default: `Episode`
+- Required: No.
+
+#### **`SONARR__INSTANCES__0__URL`**
+- URL of the Sonarr instance.
+- Type: String
+- Default: `http://localhost:8989`
+- Required: No.
+
+#### **`SONARR__INSTANCES__0__APIKEY`**
+- API key for the Sonarr instance.
+- Type: String
+- Default: Empty.
+- Required: No.
+
+#### **`RADARR__ENABLED`**
+- Enables or disables Radarr cleanup.
+- Type: Boolean
+- Possible values: `true`, `false`
+- Default: `false`
+- Required: No.
+
+#### **`RADARR__BLOCK__TYPE`**
+- Determines how file blocking works for Radarr.
+- Type: String
+- Possible values: `blacklist`, `whitelist`
+- Default: `blacklist`
+- Required: No.
+
+#### **`RADARR__BLOCK__PATH`**
+- Path to the blocklist file (local file or URL).
+- Must be JSON compatible.
+- Type: String
+- Default: Empty.
+- Required: No.
+
+> [!NOTE]
+> The blocklists support the following patterns:
+> ```
+> *example // file name ends with "example"
+> example* // file name starts with "example"
+> *example* // file name has "example" in the name
+> example // file name is exactly the word "example"
+> regex: // regex that needs to be marked at the start of the line with "regex:"
+> ```
+
+> [!NOTE]
+> [This blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist), [this permissive blacklist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/blacklist_permissive) and [this whitelist](https://raw.githubusercontent.com/flmorg/cleanuperr/refs/heads/main/whitelist) can be used for Sonarr and Radarr.
+
+#### **`RADARR__INSTANCES__0__URL`**
+- URL of the Radarr instance.
+- Type: String
+- Default: `http://localhost:7878`
+- Required: No.
+
+#### **`RADARR__INSTANCES__0__APIKEY`**
+- API key for the Radarr instance.
+- Type: String
+- Default: Empty.
+- Required: No.
+
+#### **`LIDARR__ENABLED`**
+- Enables or disables Lidarr cleanup.
+- Type: Boolean
+- Possible values: `true`, `false`
+- Default: `false`
+- Required: No.
+
+#### **`LIDARR__BLOCK__TYPE`**
+- Determines how file blocking works for Lidarr.
+- Type: String
+- Possible values: `blacklist`, `whitelist`
+- Default: `blacklist`
+- Required: No.
+
+#### **`LIDARR__BLOCK__PATH`**
+- Path to the blocklist file (local file or URL).
+- Must be JSON compatible.
+- Type: String
+- Default: Empty.
+- Required: No.
+
+> [!NOTE]
+> The blocklists support the following patterns:
+> ```
+> *example // file name ends with "example"
+> example* // file name starts with "example"
+> *example* // file name has "example" in the name
+> example // file name is exactly the word "example"
+> regex: // regex that needs to be marked at the start of the line with "regex:"
+> ```
+
+#### **`LIDARR__INSTANCES__0__URL`**
+- URL of the Lidarr instance.
+- Type: String
+- Default: `http://localhost:8686`
+- Required: No.
+
+#### **`LIDARR__INSTANCES__0__APIKEY`**
+- API key for the Lidarr instance.
+- Type: String
+- Default: Empty.
+- Required: No.
#
### Notification settings
-**`NOTIFIARR__API_KEY`**
+#### **`NOTIFIARR__API_KEY`**
- Notifiarr API key for sending notifications.
- Requires Notifiarr's [`Passthrough`](https://notifiarr.wiki/en/Website/Integrations/Passthrough) integration to work.
- Type: String
- Default: Empty.
- Required: No.
-**`NOTIFIARR__CHANNEL_ID`**
+#### **`NOTIFIARR__CHANNEL_ID`**
- Discord channel ID where notifications will be sent.
- Type: String
- Default: Empty.
- Required: No.
-**`NOTIFIARR__ON_IMPORT_FAILED_STRIKE`**
+#### **`NOTIFIARR__ON_IMPORT_FAILED_STRIKE`**
- Controls whether to notify when an item receives a failed import strike.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`NOTIFIARR__ON_STALLED_STRIKE`**
+#### **`NOTIFIARR__ON_STALLED_STRIKE`**
- Controls whether to notify when an item receives a stalled download strike.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`NOTIFIARR__ON_QUEUE_ITEM_DELETED`**
+#### **`NOTIFIARR__ON_QUEUE_ITEM_DELETED`**
- Controls whether to notify when a queue item is deleted.
- Type: Boolean
- Possible values: `true`, `false`
- Default: `false`
- Required: No.
-**`NOTIFIARR__ON_DOWNLOAD_CLEANED`**
+#### **`NOTIFIARR__ON_DOWNLOAD_CLEANED`**
- Controls whether to notify when a download is cleaned.
- Type: Boolean
- Possible values: `true`, `false`
@@ -589,7 +617,7 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
### Advanced settings
-**`HTTP_MAX_RETRIES`**
+#### **`HTTP_MAX_RETRIES`**
- The number of times to retry a failed HTTP call.
- Applies to calls to *arrs, download clients, and other services.
- Type: Integer
@@ -597,10 +625,10 @@ QUEUECLEANER__IMPORT_FAILED_IGNORE_PATTERNS__1: "manual import required"
- Default: `0`
- Required: No.
-**`HTTP_TIMEOUT`**
+#### **`HTTP_TIMEOUT`**
- The number of seconds to wait before failing an HTTP call.
- Applies to calls to *arrs, download clients, and other services.
- Type: Integer
-- Possible values: Greater than `0`
+- Possible values: Greater than `0`.
- Default: `100`
- Required: No.
\ No newline at end of file