ArrStalledHandler is a Python script to manage stalled downloads in Radarr and Sonarr.
50K+
ArrStalledHandler is a Python-based script designed to handle stalled downloads in Radarr, Sonarr, Lidarr and Readarr by taking actions such as removing, blocklisting, or blocklisting and re-searching for the affected items. It supports configuration through a .env file, logging for visibility, and is deployable via Docker for ease of use.
This repository is licensed under the GNU General Public License v3.0 (GPLv3).
Created by Tommy Vange Rød. You can see the full list of credits here.
This project is available on GitHub, Docker Hub and the Unraid Community App store.
The script is fully configurable using environment variables specified in a .env file. Below is a description of each configuration option:
.env Variables| Variable | Description | Default Value |
|---|---|---|
RADARR_URL | The base URL for Radarr's API. Example: http://localhost:7878,http://otherhost:7878. | None (required) |
RADARR_API_KEY | The API key for Radarr (found in Radarr settings). | None (required) |
SONARR_URL | The base URL for Sonarr's API. Example: http://localhost:8989,http://otherhost:8989. | None (required) |
SONARR_API_KEY | The API key for Sonarr (found in Sonarr settings). | None (required) |
LIDARR_URL | The base URL for Lidarr's API. Example: http://localhost:8686,http://otherhost:8686. | None (required) |
LIDARR_API_KEY | The API key for Lidarr (found in Radarr settings). | None (required) |
READARR_URL | The base URL for Readarr's API. Example: http://localhost:8787,http://otherhost:8787. | None (required) |
READARR_API_KEY | The API key for Readarr (found in Sonarr settings). | None (required) |
STALLED_TIMEOUT | Time (in seconds) a download must remain stalled before actions are taken. | 3600 (1 hour) |
STALLED_ACTION | Action to perform on stalled downloads: REMOVE, BLOCKLIST, or BLOCKLIST_AND_SEARCH. | BLOCKLIST_AND_SEARCH |
VERBOSE | Enable verbose logging for debugging (true or false). | false |
RUN_INTERVAL | Time (in seconds) between script executions when running in Docker. | 300 (5 minutes) |
COUNT_DOWNLOADING_METADATA_AS_STALLED | Weather the script should count downloads with the status of "Downloading Metadata" as stalled. | false |
To disable Radarr or Sonarr; leave the URL empty in the environment. If the service does not have a URL, then it is skipped. Multple services are allowed by using comma seperated values.
Initialization:
stalled_downloads.db) to track stalled downloads.Detect Stalled Downloads:
"The download is stalled with no connections"."qBittorrent is downloading metadata" as stalled.Timeout Check:
STALLED_TIMEOUT.Perform Configured Action:
STALLED_ACTION setting:
Logging:
Repeat:
RUN_INTERVAL duration and repeats the process.
Now the container should automatically start up and start handling your stalled downloads.
Docker compose
More info at Docker Docs.
services:
arr-stalled-handler:
image: tommythebeast/arrstalledhandler:latest
container_name: ArrStalledHandler
restart: unless-stopped
environment:
RADARR_URL: "http://localhost:7878,http://otherhost:7878"
RADARR_API_KEY: "your_radarr_api_key,your_2nd_radarr_api_key"
SONARR_URL: "http://localhost:8989,http://otherhost:8989"
SONARR_API_KEY: "your_sonarr_api_key,your_2nd_sonarr_api_key"
LIDARR_URL: "http://localhost:8686,http://otherhost:8686"
LIDARR_API_KEY: "your_lidarr_api_key,your_2nd_lidarr_api_key"
READARR_URL: "http://localhost:8787,http://otherhost:8787"
READARR_API_KEY: "your_readarr_api_key,our_2nd_readarr_api_key"
STALLED_TIMEOUT: "3600"
STALLED_ACTION: "BLOCKLIST_AND_SEARCH"
VERBOSE: "false"
RUN_INTERVAL: "300"
COUNT_DOWNLOADING_METADATA_AS_STALLED: "false"
Docker CLI
More info at Docker Docs.
Multi-line:
docker run -d \
--name=ArrStalledHandler \
-e RADARR_URL=http://localhost:7878,http://otherhost:7878 \
-e RADARR_API_KEY=your_radarr_api_key,your_2nd_radarr_api_key \
-e SONARR_URL=http://localhost:8989,http://otherhost:8989 \
-e SONARR_API_KEY=your_sonarr_api_key,your_2nd_sonarr_api_key \
-e LIDARR_URL=http://localhost:8686,http://otherhost:8686 \
-e LIDARR_API_KEY=your_lidarr_api_key,your_2nd_lidarr_api_key \
-e READARR_URL=http://localhost:8787,http://otherhost:8787 \
-e READARR_API_KEY=your_readarr_api_key,our_2nd_readarr_api_key \
-e STALLED_TIMEOUT=3600 \
-e STALLED_ACTION=BLOCKLIST_AND_SEARCH \
-e VERBOSE=false \
-e RUN_INTERVAL=300 \
-e COUNT_DOWNLOADING_METADATA_AS_STALLED=false \
--restart unless-stopped \
tommythebeast/arrstalledhandler:latest
One line:
docker run -d --name=ArrStalledHandler -e RADARR_URL=http://localhost:7878,http://otherhost:7878 -e RADARR_API_KEY=your_radarr_api_key,your_2nd_radarr_api_key -e SONARR_URL=http://localhost:8989,http://otherhost:8989 -e SONARR_API_KEY=your_sonarr_api_key,your_2nd_sonarr_api_key -e LIDARR_URL=http://localhost:8686,http://otherhost:8686 -e LIDARR_API_KEY=your_lidarr_api_key,your_2nd_lidarr_api_key -e READARR_URL=http://localhost:8787,http://otherhost:8787 -e READARR_API_KEY=your_readarr_api_key,our_2nd_readarr_api_key -e STALLED_TIMEOUT=3600 -e STALLED_ACTION=BLOCKLIST_AND_SEARCH -e VERBOSE=false -e RUN_INTERVAL=300 -e COUNT_DOWNLOADING_METADATA_AS_STALLED=false --restart unless-stopped tommythebeast/arrstalledhandler:latest
Clone the Repository:
git clone https://github.com/your-username/ArrStalledHandler.git
cd ArrStalledHandler
Configure Environment:
Create a .env file and populate it with the required variables:
RADARR_URL=http://localhost:7878,http://otherhost:7878
RADARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
SONARR_URL=http://localhost:8989,http://otherhost:8989
SONARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
LIDARR_URL=http://localhost:8686,http://otherhost:8686
LIDARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
READARR_URL=http://localhost:8787,http://otherhost:8787
READARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
STALLED_TIMEOUT=3600
STALLED_ACTION=BLOCKLIST_AND_SEARCH
VERBOSE=false
RUN_INTERVAL=300
COUNT_DOWNLOADING_METADATA_AS_STALLED=false
Build the Docker Image:
docker-compose build .
Run the Docker Container:
docker-compose up -d
Requires Python 3.13
Clone the Repository:
git clone https://github.com/your-username/ArrStalledHandler.git
cd ArrStalledHandler
Install Dependencies:
pip install -r requirements.txt
Configure Environment:
Create a .env file and populate it with the required variables:
RADARR_URL=http://localhost:7878,http://otherhost:7878
RADARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
SONARR_URL=http://localhost:8989,http://otherhost:8989
SONARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
LIDARR_URL=http://localhost:8686,http://otherhost:8686
LIDARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
READARR_URL=http://localhost:8787,http://otherhost:8787
READARR_API_KEY=aaaabbbbcccc111122223333,xxxxyyyyzzzz777788889999
STALLED_TIMEOUT=3600
STALLED_ACTION=BLOCKLIST_AND_SEARCH
VERBOSE=false
RUN_INTERVAL=300
COUNT_DOWNLOADING_METADATA_AS_STALLED=false
Run the Script:
python main.py
VERBOSE environment variable.VERBOSE is set to true, debug-level logs are enabled.Example log output:
INFO: Checking stalled downloads in Radarr...
INFO: Handling Download ID 1462067687 in Radarr (elapsed time: 400 seconds).
INFO: Triggering search for Movie ID 770 in Radarr using Command API...
INFO: Script execution completed. Sleeping for 300 seconds...
STALLED_TIMEOUT is too high.You can find more of my work on my GitHub profile or connect with me on LinkedIn.
Huge thanks to everyone who dedicates their valuable time to improving, perfecting, and supporting this project!
The GNU General Public License v3.0 (GPLv3) is a free, copyleft license for software and other creative works. It ensures your freedom to share, modify, and distribute all versions of a program, keeping it free software for everyone.
Full license can be read here or at gnu.org.
Freedom to Share and Change:
Responsibilities:
No Warranty:
Marking Modifications:
Content type
Image
Digest
sha256:dac7879f6…
Size
48.6 MB
Last updated
over 1 year ago
docker pull tommythebeast/arrstalledhandler