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.1.0.tar.gz (168.3 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.1.0-py3-none-any.whl (52.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pyackett-0.1.0.tar.gz
Algorithm Hash digest
SHA256 80670a53e53ac18ef9cba28a1451bb146199b455a9ab5ae1a7da96ab47acd5bd
MD5 c07bedfc1604e9e2ec4dfb6180d89f2a
BLAKE2b-256 1abd9f9a34ce75748ff9cebe36f9f87169f59d7781794a0b49fe7c155a7e1a7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyackett-0.1.0.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.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for pyackett-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 951572670e9793f7389b7934e2f58fa37768d7f2ff2143defd6a677cc7c9b9ab
MD5 e0ff5a02477acbbaad07b0cdbe5d3691
BLAKE2b-256 fe044a64d68d3123daf586679c942908c04555f422be28b1552043631b3a9e97

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyackett-0.1.0-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