Automatically resolves 'Manual Import required' queue items in Radarr and Sonarr — because clicking Import on obvious single-file matches shouldn't be your job.
This project was vibe-coded — built collaboratively with AI assistance. Because even the code that automates your lazy clicks was written lazily. 😄
You've seen this in Radarr or Sonarr:
"Found matching movie via grab history, but release was matched to movie by ID. Manual Import required."
The file is right there. The match is obvious. But the UI forces you to click Import manually for every single one. justimport clicks it for you.
- Polls the Radarr/Sonarr queue on a configurable interval (default 60 s)
- Finds queue items whose status messages contain "manual import required" or "matched to movie by id"
- For each stuck item, fetches the available files via
GET /api/v3/manualimport?downloadId=X - Filters out sample files (any file whose path contains "sample", case-insensitive)
- Skips the item if 0 or 2+ files remain after filtering
- Skips the item if the single remaining file has any rejections
- Skips the item if the file is not matched to a movie or series
- Otherwise, auto-imports the file via
POST /api/v3/manualimportwithimportApproved: true
Default mode is DRY RUN — no changes are made until you set DRY_RUN=false.
- DRY_RUN defaults to
true— you must explicitly opt in to real imports. - Only acts on single-file matches — packs with multiple files are always skipped.
- Rejection-aware — files flagged by Radarr/Sonarr are never force-imported.
- Log deduplication — each queue item is logged exactly once per run, preventing log spam.
All configuration is via environment variables. No config files.
| Variable | Default | Description |
|---|---|---|
RADARR_URL |
(unset) | Base URL of your Radarr instance, e.g. http://radarr:7878 |
RADARR_API_KEY |
(unset) | Radarr API key |
SONARR_URL |
(unset) | Base URL of your Sonarr instance, e.g. http://sonarr:8989 |
SONARR_API_KEY |
(unset) | Sonarr API key |
POLL_INTERVAL |
60s |
How often to check queues (Go duration: 30s, 1m, 5m, …) |
DRY_RUN |
true |
Set to false to enable real imports |
Note: You do not need both Radarr and Sonarr. Configure only the services you use — at least one of
RADARR_URLorSONARR_URLmust be set.
services:
justimport:
image: ghcr.io/erkexzcx/justimport:latest
container_name: justimport
restart: unless-stopped
environment:
# Configure Radarr, Sonarr, or both — at least one is required.
- RADARR_URL=http://radarr:7878
- RADARR_API_KEY=your-radarr-api-key
# - SONARR_URL=http://sonarr:8989 # uncomment if you use Sonarr
# - SONARR_API_KEY=your-sonarr-api-key # uncomment if you use Sonarr
- POLL_INTERVAL=60s
- DRY_RUN=true # change to false when readyDry run (default):
2026-03-08 12:00:00 INF Starting justimport v1.0.0 (vibe-coded with ❤️)
2026-03-08 12:00:00 INF Mode: DRY RUN (set DRY_RUN=false to enable imports)
2026-03-08 12:00:00 INF Poll interval: 60s
2026-03-08 12:00:00 INF Radarr: http://radarr:7878 ✓ (connected, Radarr v5.3.0)
2026-03-08 12:00:00 INF Sonarr: http://sonarr:8989 ✓ (connected, Sonarr v4.0.0)
2026-03-08 12:00:01 WRN [radarr] "Some.Movie.Pack.2024" → SKIPPED: 4 files found after filtering (expected exactly 1)
2026-03-08 12:00:01 WRN [radarr] "Another.Movie.2024" → SKIPPED: 0 files found after filtering
2026-03-08 12:00:01 INF [radarr] "Galactic.Sunrise.2025.1080p.BluRay.x264" → WOULD IMPORT (1 file, matched to "Galactic Sunrise")
Live mode (DRY_RUN=false):
2026-03-08 12:00:01 INF [radarr] "Galactic.Sunrise.2025.1080p.BluRay.x264" → IMPORTED (1 file, matched to "Galactic Sunrise")
0 comments
log in to comment.