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.5.0.tar.gz (114.0 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.5.0-py3-none-any.whl (45.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for conductarr-2.5.0.tar.gz
Algorithm Hash digest
SHA256 2347b1deca956713c6b07f45cf5393808088fb5c1899becdccea5245bf35138f
MD5 7066c62e72f95be336b4009b371c2bd4
BLAKE2b-256 533d88d6bafcb0e28c5b8c1d9a98def4e377e0fe0039636b7bab06831121da9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for conductarr-2.5.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.5.0-py3-none-any.whl.

File metadata

  • Download URL: conductarr-2.5.0-py3-none-any.whl
  • Upload date:
  • Size: 45.5 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.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3a7d30b4c923c9ad9ace4a3407957590d4cfb9e952df20788287bd776203536c
MD5 dd86a58d68efd93587b8d621123d12b9
BLAKE2b-256 44264f0d93d2e2389c6e395bbdfc1513cb72722ff085fadde556cfbeb2855782

See more details on using hashes here.

Provenance

The following attestation bundles were made for conductarr-2.5.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