Periodically searches for missing items in Sonarr and/or Radarr, replicating the behaviour of clicking the magnifying glass in the Wanted > Missing list.
What does it actually do?
- Fetches all missing episodes from Sonarr and/or movies from Radarr
- Optionally filters older items for less frequent searching
- Trigger a Sonarr EpisodeSearch/Radarr MoviesSearch command for the first 10 (
SEARCH_LIMIT) eligible episodes - Repeat every 5 (
SEARCH_INTERVAL_MINUTES) minutes
If both Sonarr and Radarr are configured, they are interleaved to avoid simultaneous runs, e.g.: with SEARCH_INTERVAL_MINUTES=10, Sonarr runs at :00, :10, :20, … and Radarr runs at :05, :15, :25, …
It does not:
- Perform SeasonSearch, so it will not pick up season packs (it's on the to-do list)
Trigger Radarr searches (yet? PRs welcome)- Support multiple Sonarr instances. You can deploy multiple instances of this, though (~26MB memory usage) and super simple configuration.
Huntarr died, and I didn't want to use a possibly unsupported fork (elfhosted/newtarr) from before the BS, and I had problems with egg82/fetcharr not actually triggering a download of missing episodes (also it was using ~750MB of memory which seemed excessive). It is probably a much more fleshed-out project than this, so I would still recommend checking it out.
Deploy via Docker, here's an example compose.yaml:
services:
magnifyarr:
image: ghcr.io/bzly/magnifyarr:latest
restart: unless-stopped
environment:
SONARR_API_KEY: "your_api_key_here" # Sonarr -> Settings -> General
# SONARR_URL: "http://sonarr:8989" # default
RADARR_API_KEY: "your_other_key"
# RADARR_URL: "http://radarr:7878
SLOW_AFTER_DAYS: 7 # optional, but recommended to avoid rate limiting| Variable | Conditionally Required | Default | Description |
|---|---|---|---|
SONARR_API_KEY |
☑️ | — | Sonarr API key. Either this or RADARR_API_KEY must be defined. |
SONARR_URL |
http://sonarr:8989 |
Sonarr instance URL | |
RADARR_API_KEY |
☑️ | — | Radarr API key. Either this or SONARR_API_KEY must be defined. |
RADARR_URL |
http://radarr:7878 |
Radarr instance URL | |
SEARCH_LIMIT |
10 |
Number of episodes to search per run | |
SEARCH_INTERVAL_MINUTES |
5 |
How frequently to run (minutes) | |
SLOW_AFTER_DAYS |
— | Age threshold (days) to enter slow tier | |
SLOW_INTERVAL_DAYS |
1 |
Search interval (days) in slow tier | |
SLOWEST_AFTER_DAYS |
— | Age threshold (days) to enter slowest tier | |
SLOWEST_INTERVAL_DAYS |
7 |
Search interval (days) in slowest tier | |
LOG_LEVEL |
INFO |
Logging verbosity. DEBUG will log per-episode tier eligibility decisions each run. |
By default every missing episode is searched every run. This can get quite heavy on API calls for indexers with moderately strict rate limits. Older content is less likely to suddenly appear on your indexer, so we can optionally enable a backoff where we search for old episodes less frequently.
Setting SLOW_AFTER_DAYS and/or SLOWEST_AFTER_DAYS enables 'tier filtering': episodes are assigned a tier by comparing this value to their age (Sonarr's airDateUtc). They are then searched for if their lastSearchTime is longer ago than the relevant one of SLOW_INTERVAL_DAYS/SLOWEST_INTERVAL_DAYS.
Episodes with no prior search are always eligible regardless of age.
Example for a large collection:
SLOW_AFTER_DAYS: "7" # older than 7 days: search daily (default `SLOW_INTERVAL_DAYS`)
SLOWEST_AFTER_DAYS: "30" # older than 30 days:
SLOWEST_INTERVAL_DAYS: "30" # search ~monthly