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.0.0.tar.gz (102.3 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.0.0-py3-none-any.whl (40.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for conductarr-2.0.0.tar.gz
Algorithm Hash digest
SHA256 656dec7c4a2c7582c0e7e839dff4aa0fec3d7ff945b65051d2453f2e169f5756
MD5 a64fabcb265e2cc48042dcc1e5de1b5a
BLAKE2b-256 8dae736423bfa32b6c2243f835e30f52567475f5f3f46136cb02e00cafc22c95

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: conductarr-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 40.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.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 02c89a349aa2aa41b43815f9166853e97b12a8949997d8770ae427c6524577df
MD5 c3719ec386a7378af6d473e0ce1bdf87
BLAKE2b-256 4a1d53890178cdc8e00018ed8525487e57d43b025bf79606ee7cf4f6e2db8a70

See more details on using hashes here.

Provenance

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