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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyackett-0.2.1.tar.gz.
File metadata
- Download URL: pyackett-0.2.1.tar.gz
- Upload date:
- Size: 169.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0511706af774384d47188b074032fa7bdfbee1fbdb874d1aaffd3d206fc0bf9b
|
|
| MD5 |
83ec210ebbe8cdbef54f88e7810c9195
|
|
| BLAKE2b-256 |
b4a1dac1f7ba9bd2244a0f53c5cb61090e13bb29a3de12cef630d27d0fb20b0c
|
Provenance
The following attestation bundles were made for pyackett-0.2.1.tar.gz:
Publisher:
publish.yml on dmarkey/pyackett
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyackett-0.2.1.tar.gz -
Subject digest:
0511706af774384d47188b074032fa7bdfbee1fbdb874d1aaffd3d206fc0bf9b - Sigstore transparency entry: 1188910059
- Sigstore integration time:
-
Permalink:
dmarkey/pyackett@1ef8449e3423defa87e17a2d70c173e24e68fc41 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dmarkey
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1ef8449e3423defa87e17a2d70c173e24e68fc41 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyackett-0.2.1-py3-none-any.whl.
File metadata
- Download URL: pyackett-0.2.1-py3-none-any.whl
- Upload date:
- Size: 53.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52f6267cce26691a14b21460c8605723c5b9e195323ce8cb668625c7624aaa78
|
|
| MD5 |
f657f7e666eb1e2c9801f99f3c366d34
|
|
| BLAKE2b-256 |
e15a45fd38a85d59c2ac07f41bf6c6f7a8ddb06f30a54ee257f03e915a83b86b
|
Provenance
The following attestation bundles were made for pyackett-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on dmarkey/pyackett
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyackett-0.2.1-py3-none-any.whl -
Subject digest:
52f6267cce26691a14b21460c8605723c5b9e195323ce8cb668625c7624aaa78 - Sigstore transparency entry: 1188910067
- Sigstore integration time:
-
Permalink:
dmarkey/pyackett@1ef8449e3423defa87e17a2d70c173e24e68fc41 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/dmarkey
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1ef8449e3423defa87e17a2d70c173e24e68fc41 -
Trigger Event:
release
-
Statement type: