Skip to main content

🎼 Priority-based download queue orchestrator for Radarr, Sonarr & SABnzbd — automatically manages and reorders your download queue across multiple priority tiers.

Project description

Conductarr

PyPI - Version GitHub License GitHub Sponsors

Code Quality Publish Coverage Bugs Vulnerabilities Code Smells Technical Debt

🎼 Priority-based download queue orchestrator for Radarr, Sonarr & SABnzbd — automatically manages and reorders your download queue across multiple priority tiers.


What it does

Conductarr sits between your *arr apps and SABnzbd and enforces a strict priority order on the download queue:

  • Virtual queues — you define named tiers (e.g. user requests, upgrade queue, kometa) each with a priority number and tag-based matchers. Every SABnzbd job is assigned to the highest-matching tier.
  • Automatic reordering — each poll cycle the SABnzbd queue is reordered so that higher-priority tiers always run first. Only one job downloads at a time; everything else is paused.
  • Upgrade scanning — queues marked upgrade: enabled: true automatically search Radarr/Sonarr for candidates that don't yet satisfy your accept_conditions (e.g. missing a custom format or below a score threshold), grab a release, and track it through to completion. A rate-limited cursor ensures candidates are visited round-robin without hammering the APIs.
  • Duplicate prevention — before grabbing a release Conductarr checks both the live SABnzbd queue and the database, so the same movie or episode is never downloaded twice concurrently.

Quick start (Docker Compose)

services:
  conductarr:
    image: ghcr.io/eulemitkeule/conductarr:latest
    container_name: conductarr
    restart: unless-stopped
    environment:
      PUID: 1000
      PGID: 1000
      UMASK: "022"
      TZ: UTC
      LOG_LEVEL: info
    volumes:
      - /path/to/conductarr/config:/config
    command: conductarr watch

Place a conductarr.yml inside the mounted config directory. A minimal example:

conductarr:
  poll_interval: 15.0

sabnzbd:
  url: http://sabnzbd:8080
  api_key: YOUR_KEY

radarr:
  url: http://radarr:7878
  api_key: YOUR_KEY

sonarr:
  url: http://sonarr:8989
  api_key: YOUR_KEY

queues:
  - name: user_requests
    priority: 100
    matchers:
      - type: tags
        tags: ["request"]

  - name: german_upgrade
    priority: 50
    matchers:
      - type: tags
        tags: ["upgrade-de"]
    upgrade:
      enabled: true
      sources: [radarr, sonarr]
      max_active: 2
      search_interval: 30.0
      accept_conditions:
        - type: custom_format
          name: German DL

  - name: other
    priority: 1
    fallback: true

Tag your Radarr/Sonarr items with the matching tags and Conductarr will automatically place them in the right tier.


Poll loop internals

Every poll_interval seconds the orchestrator runs a single cycle:

  1. Read SABnzbd queue — fetch current slots (silently; no log noise when nothing changes).
  2. Resolve identities — map each nzo_id to a virtual queue using an in-memory cache. On a cache miss, Radarr and Sonarr queues are fetched once for the whole cycle, not once per item.
  3. Handle completions — jobs that disappeared from SABnzbd are marked complete in the database.
  4. Reorder & enforce — slots are sorted by virtual-queue priority and switch() is called only when the order is actually wrong. The top slot is resumed; all other pausable slots are paused.
  5. Fill upgrade slots — for each upgrade-enabled queue that has capacity, the next unprocessed candidate is fetched from the database, checked against live Radarr/Sonarr data, and if still eligible a release is grabbed and added to SABnzbd.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

conductarr-2.2.0.tar.gz (106.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

conductarr-2.2.0-py3-none-any.whl (42.7 kB view details)

Uploaded Python 3

File details

Details for the file conductarr-2.2.0.tar.gz.

File metadata

  • Download URL: conductarr-2.2.0.tar.gz
  • Upload date:
  • Size: 106.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for conductarr-2.2.0.tar.gz
Algorithm Hash digest
SHA256 da4cd73a618874c17d5e9fc58f2d4491f9c07dc0f1ec2cac0c81955cd008ac3e
MD5 f4cf5f246c4680b5360c347c53a877fa
BLAKE2b-256 28506561798cf090a206ea74735a9300f31f7ebbb5a5ecdcbc857b22ee0ccd5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for conductarr-2.2.0.tar.gz:

Publisher: publish.yml on EuleMitKeule/conductarr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file conductarr-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: conductarr-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 42.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for conductarr-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c48ec549a35daf23fc0f0c81e7473a87c5f8f44ddc84e1ca0c552f36f21bfeb2
MD5 81d3b2a2b7f76f5c1ae2538fbc980ea5
BLAKE2b-256 1249532d892a75965f369de60477f55589c8bd1d40d5cdb7a99b2449a7711efc

See more details on using hashes here.

Provenance

The following attestation bundles were made for conductarr-2.2.0-py3-none-any.whl:

Publisher: publish.yml on EuleMitKeule/conductarr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page