Skip to main content

Python clean room implementation of a Torznab-compatible indexer proxy

Project description

Pyackett

A Python clean room implementation of a Torznab-compatible indexer proxy. Works as a standalone server (Sonarr/Radarr compatible) and as an importable Python library.

Loads Jackett's 550+ YAML indexer definitions directly. Includes browser-grade TLS fingerprinting and automatic Cloudflare Turnstile bypass.

Install

pip install pyackett

# With Cloudflare challenge support (adds Camoufox browser):
pip install pyackett[cloudflare]

Quick Start

As a server

# Download definitions from Jackett GitHub and start the server
pyackett --from-github jackett --port 9117

# With a SOCKS5 proxy
pyackett --from-github jackett --proxy socks5://user:pass@host:1080

# With local definitions
pyackett -d /path/to/definitions

Then point Sonarr/Radarr at http://localhost:9117/api/v2.0/indexers/{id}/results/torznab/ with the API key shown in the web UI.

As a Python library

import asyncio
from pyackett import Pyackett

async def main():
    pk = Pyackett(proxy="socks5://user:pass@host:1080")
    pk.load_definitions_from_github(source="jackett")

    await pk.configure_indexer("1337x", {})
    await pk.configure_indexer("therarbg", {})

    results = await pk.search("breaking bad", categories=[5000])
    for r in results:
        print(f"{r.title} | S:{r.seeders} | {r.size}")

    await pk.close()

asyncio.run(main())
# Synchronous wrapper for simple scripts
pk = Pyackett()
pk.load_definitions_from_github()
pk.configure_indexer("therarbg", {})
results = pk.search_sync("ubuntu")

Features

Torznab API

  • Full Torznab XML API compatible with Sonarr, Radarr, Prowlarr, qBittorrent
  • TorrentPotato JSON support
  • Capabilities endpoint per indexer
  • Multi-indexer search (/indexers/all/results/torznab/)

Cardigann YAML Engine

  • Loads all 550+ Jackett YAML indexer definitions
  • Go-style template engine ({{ if }}, {{ range }}, {{ eq }}, etc.)
  • CSS selector extraction (BeautifulSoup) and JSONPath
  • 25+ filter functions (replace, dateparse, fuzzytime, regexp, etc.)
  • 6 login methods (form, cookie, header/API key, GET, POST, captcha)

HTTP Client

  • curl_cffi with Chrome/Firefox TLS fingerprint impersonation
  • Built-in SOCKS5/SOCKS4/HTTP proxy support
  • Request delay per indexer definition
  • Automatic Cloudflare detection and bypass

Cloudflare Bypass (optional)

  • Automatic detection of Cloudflare 403/503 challenges
  • Camoufox (anti-detect Firefox) solves Turnstile challenges headlessly
  • Local HTTP CONNECT proxy bridges SOCKS5 auth for browsers
  • Firefox TLS fingerprint matching for cf_clearance cookie reuse
  • Cookies cached per domain for the session
  • Graceful fallback when Camoufox not installed (logs warning, skips CF sites)

Web UI

  • Bootstrap 5 dashboard at http://localhost:9117/
  • Browse and filter all 550+ available indexers
  • Dynamic configuration forms generated from YAML settings
  • Manual search with results table
  • Per-indexer Torznab URL copy, edit, test, delete

CLI Options

pyackett [OPTIONS]

  --host HOST               Bind address (default: 0.0.0.0)
  -p, --port PORT           Port (default: 9117)
  --config-dir DIR          Config/cache directory
  -d, --definitions-dir DIR Local YAML definitions directory
  --from-github {jackett,prowlarr}
                            Download definitions from GitHub
  --branch BRANCH           GitHub branch (default: master)
  --update-definitions      Force re-download definitions
  --proxy URL               Proxy (socks5://host:port, http://host:port)
  --api-key KEY             API key (auto-generated if not set)
  --log-level {DEBUG,INFO,WARNING,ERROR}

Architecture

pyackett/
  core/
    models.py          - ReleaseInfo, TorznabQuery, IndexerDefinition
    manager.py         - IndexerManager (load, configure, concurrent search)
    http.py            - curl_cffi client + Camoufox CF solver
    cache.py           - TTL result cache
    categories.py      - Torznab category mappings
    definitions_fetcher.py - GitHub tarball downloader
  engine/
    cardigann.py       - YAML definition interpreter
    template.py        - Go-style template engine
    filters.py         - 25+ data transformation filters
    selectors.py       - CSS + JSONPath extraction
  api/
    torznab.py         - Torznab XML generation + query parsing
  server/
    app.py             - FastAPI server + web UI
  pyackett.py          - Public library API
  cli.py               - CLI entry point

Development

git clone <repo>
cd pyackett
uv sync
uv run pytest tests/ -v

License

MIT

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

pyackett-0.3.1.tar.gz (176.9 kB view details)

Uploaded Source

Built Distribution

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

pyackett-0.3.1-py3-none-any.whl (55.2 kB view details)

Uploaded Python 3

File details

Details for the file pyackett-0.3.1.tar.gz.

File metadata

  • Download URL: pyackett-0.3.1.tar.gz
  • Upload date:
  • Size: 176.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyackett-0.3.1.tar.gz
Algorithm Hash digest
SHA256 ecfa936243139e0d9e92fdd892461e01b35b0d868d7a2311e8c987a123d4b075
MD5 fd519c7cdc1740af03a93564058c42d7
BLAKE2b-256 72d9e22d37266a1161616bca33d52c04d2f80e6580bd23b2ee112971564187e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyackett-0.3.1.tar.gz:

Publisher: publish.yml on dmarkey/pyackett

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

File details

Details for the file pyackett-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: pyackett-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 55.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pyackett-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 222c3d299cbb8166220aeca2b965dbfe3ffffb8f025a8ecaaa70bb378e9f6a6b
MD5 e4b66c294f376147891940baf5200278
BLAKE2b-256 3c44de62e74b93ae4e8b085fbfe8c6b443754f62fff3497b1b116b53c91b6289

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyackett-0.3.1-py3-none-any.whl:

Publisher: publish.yml on dmarkey/pyackett

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