{"id":49039362,"url":"https://github.com/kroeberd/alldebrid-client","last_synced_at":"2026-05-18T20:01:24.739Z","repository":{"id":352206926,"uuid":"1214275266","full_name":"kroeberd/alldebrid-client","owner":"kroeberd","description":"Self-hosted torrent automation via AllDebrid — Web UI, aria2, Discord, PostgreSQL, FlexGet integration","archived":false,"fork":false,"pushed_at":"2026-05-11T08:13:54.000Z","size":1540,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-11T10:19:36.935Z","etag":null,"topics":["alldebrid","alldebrid-api","alldebrid-wrapper","aria2","discord","downloader","flexget","jackett","management","postgresql","radarr","sonarr","sqlite","torrent","webhook"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kroeberd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"kroeberd","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"kroeberd","thanks_dev":null,"custom":null}},"created_at":"2026-04-18T10:54:57.000Z","updated_at":"2026-05-11T08:13:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kroeberd/alldebrid-client","commit_stats":null,"previous_names":["kroeberd/alldebrid-client"],"tags_count":131,"template":false,"template_full_name":null,"purl":"pkg:github/kroeberd/alldebrid-client","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kroeberd%2Falldebrid-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kroeberd%2Falldebrid-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kroeberd%2Falldebrid-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kroeberd%2Falldebrid-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kroeberd","download_url":"https://codeload.github.com/kroeberd/alldebrid-client/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kroeberd%2Falldebrid-client/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33021784,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alldebrid","alldebrid-api","alldebrid-wrapper","aria2","discord","downloader","flexget","jackett","management","postgresql","radarr","sonarr","sqlite","torrent","webhook"],"created_at":"2026-04-19T14:09:34.799Z","updated_at":"2026-05-14T11:04:07.370Z","avatar_url":"https://github.com/kroeberd.png","language":"Python","funding_links":["https://github.com/sponsors/kroeberd","https://buymeacoffee.com/kroeberd"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/logo.svg\" width=\"96\" alt=\"AllDebrid-Client Logo\"/\u003e\n  \u003ch1\u003eAllDebrid-Client\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eSelf-hosted torrent automation via AllDebrid\u003c/strong\u003e\u003cbr/\u003eWeb UI · built-in or external aria2 · Jackett search · Discord notifications · PostgreSQL · FlexGet · Sonarr/Radarr\u003c/p\u003e\n\n  [![Website](https://img.shields.io/badge/ad-client.mediastarr.de-ff6b2b?logo=googlechrome\u0026logoColor=white)](https://ad-client.mediastarr.de/)\n  [![Release](https://img.shields.io/github/v/release/kroeberd/alldebrid-client?style=flat-square\u0026color=f97316)](https://github.com/kroeberd/alldebrid-client/releases)\n  [![Docker Pulls](https://img.shields.io/docker/pulls/kroeberd/alldebrid-client?style=flat-square\u0026color=3b82f6)](https://hub.docker.com/r/kroeberd/alldebrid-client)\n  [![Discord](https://img.shields.io/badge/Discord-Join-5865f2?logo=discord\u0026logoColor=white)](https://discord.gg/8Vb9cj4ksv)\n  [![License](https://img.shields.io/github/license/kroeberd/alldebrid-client?style=flat-square)](LICENSE)\n  [![Tests](https://img.shields.io/badge/tests-188%20passing-22c55e?style=flat-square)](https://github.com/kroeberd/alldebrid-client/actions/workflows/tests.yml)\n  [![CI](https://img.shields.io/github/actions/workflow/status/kroeberd/alldebrid-client/tests.yml?style=flat-square\u0026label=CI)](https://github.com/kroeberd/alldebrid-client/actions/workflows/tests.yml)\n  [![Release Build](https://github.com/kroeberd/alldebrid-client/actions/workflows/release.yml/badge.svg)](https://github.com/kroeberd/alldebrid-client/actions/workflows/release.yml)\n  [![Docker Build](https://github.com/kroeberd/alldebrid-client/actions/workflows/Docker_Build.yml/badge.svg)](https://github.com/kroeberd/alldebrid-client/actions/workflows/Docker_Build.yml)\n\u003c/div\u003e\n\n---\n\n## What it does\n\nAllDebrid-Client automates the full torrent lifecycle via your AllDebrid account:\n\n1. **Add** magnet links or `.torrent` files via the web UI, Jackett search, watch folder, Sonarr/Radarr, or REST API\n2. **Upload** to AllDebrid and poll until the torrent is ready\n3. **Unlock** download links in parallel and submit them to aria2\n4. **Monitor** aria2 until all files complete, then mark done and remove from AllDebrid\n5. **Notify** via Discord with rich embeds for every event\n\n---\n\n## Screenshots\n\n| Dashboard | Torrents | Settings |\n|-----------|----------|----------|\n| [![Dashboard](docs/screenshots/dashboard.svg)](docs/screenshots/dashboard.svg) | [![Torrents](docs/screenshots/torrents.svg)](docs/screenshots/torrents.svg) | [![Settings](docs/screenshots/settings.svg)](docs/screenshots/settings.svg) |\n\n---\n\n## Features\n\n| Category | Details |\n|----------|---------|\n| **Input sources** | Web UI paste, Jackett search (multi-indexer), watch folder (`.torrent`/`.magnet`), Sonarr/Radarr, REST API |\n| **Download client** | **Built-in aria2** (default, zero setup) or external aria2 instance |\n| **Live speed badge** | Header shows active / max downloads, live speed, and speed limit (built-in mode only) |\n| **Auto-extraction** | Automatically extract `.zip`, `.rar`, `.7z`, `.tar.*` and more after download; configurable concurrency, archive deletion, and Discord notifications |\n| **Jackett search** | Multi-indexer selection with chip UI, category filters, direct Add from results |\n| **Torrent list** | Pagination (15 / 25 / 50 / 100 per page), status filter, full-text search, bulk actions |\n| **Downloads view** | Live aria2 queue with 1-second auto-refresh, per-file progress bars, Pause/Resume/Remove |\n| **Discord webhooks** | Rich embeds for: Torrent Added, Download Complete, Error, Partial, FlexGet events, Stats reports |\n| **FlexGet v3** | Schedule and trigger tasks from the UI; per-event Discord notifications |\n| **Sonarr / Radarr** | Acts as a download client; triggers import on completion |\n| **File filters** | Block by extension, keyword, or minimum size before any download starts |\n| **Database** | SQLite (zero-config default) or external PostgreSQL |\n| **Statistics** | Period selector (1h / 24h / 7d / 30d / 1y / all), rolling snapshots, Discord summary reports |\n| **Help sidebar** | Built-in docs: Quick Start, How It Works, aria2, RAM \u0026 Memory, Integrations, Settings Reference, Troubleshooting |\n| **Backups** | Scheduled SQLite backups with configurable retention |\n\n---\n\n## Quick Start\n\n### Docker Compose (recommended)\n\n```bash\ngit clone https://github.com/kroeberd/alldebrid-client.git\ncd alldebrid-client\ndocker compose up -d\n```\n\nOpen **http://localhost:8080** → Settings → enter your AllDebrid API key.\n\n### Docker run\n\n```bash\ndocker run -d \\\n  --name alldebrid-client \\\n  --restart unless-stopped \\\n  -p 8080:8080 \\\n  -e PUID=99 \\\n  -e PGID=100 \\\n  -e TZ=Europe/Berlin \\\n  -v /path/to/config:/app/config \\\n  -v /path/to/downloads:/download \\\n  kroeberd/alldebrid-client:latest\n```\n\n\u003e **File permissions:** set `PUID`/`PGID` to the UID/GID of the user that runs your other media containers (Sonarr, Radarr, Plex, etc.). Downloaded files will be owned by that user so they can be moved and imported without permission errors. Run `id` on the host to find the right values.\n\n### Unraid\n\nInstall **AllDebrid-Client** from the Community Apps store. All paths are pre-filled.\n\n---\n\n## Configuration\n\nAll settings are in the **Settings** page of the web UI. The most important ones to set after first start:\n\n| Setting | Where | Notes |\n|---------|-------|-------|\n| `PUID` / `PGID` env vars | `docker-compose.yml` | UID/GID for downloaded files — must match the user running Sonarr/Radarr/Plex. Run `id` on the host to find yours. |\n| AllDebrid API key | Settings → ⚡ General | Required |\n| Download folder | Settings → ⚡ General | Must be writable by the container |\n| aria2 mode | Settings → ⬇️ Download | Built-in (default) or External |\n| aria2 RPC URL | Settings → ⬇️ Download | Only for External mode: e.g. `http://localhost:6800/jsonrpc` |\n| Discord webhook | Settings → 🔔 Notifications | Optional |\n| Sonarr / Radarr | Settings → 🔌 Services | URL + API key |\n| File filters | Settings → 🛠️ Advanced | Block extensions, keywords, min size |\n\nEverything else has sensible defaults and can be tuned later.\n\n### Built-in aria2 (default)\n\nBuilt-in aria2 is enabled by default — no extra setup required. The container manages an embedded aria2 process automatically. The Downloads view shows the live queue with speed controls, and the header displays the current download speed in real time.\n\n### External aria2\n\nIf you already run aria2 separately, switch to External in Settings → ⬇️ Download and enter the RPC URL. The Downloads view works identically.\n\n---\n\n## Jackett Search\n\n1. Install and run [Jackett](https://github.com/Jackett/Jackett)\n2. In AllDebrid-Client **Settings → 🔌 Services → Jackett**: enter the URL and API key, enable Jackett, Save\n3. The **Search** sidebar entry appears — search by title, filter by category\n4. Select one or multiple indexers using the chip picker (tap-friendly on mobile)\n5. Click **Add** next to any result to queue it immediately\n\n---\n\n## Auto-Extraction\n\nWhen **Enable Auto-Extraction** is turned on (Settings → ⬇️ Download → 📦 Auto-Extraction),\narchives are automatically extracted after every successful download.\n\n### Supported formats\n\n| Format | Extension(s) | Engine |\n|--------|-------------|--------|\n| ZIP | `.zip` | Python `zipfile` (built-in) |\n| TAR (all compressions) | `.tar`, `.tar.gz`, `.tgz`, `.tar.bz2`, `.tar.xz`, `.tar.zst` | Python `tarfile` (built-in) |\n| Gzip single-file | `.gz` | Python `gzip` (built-in) |\n| Bzip2 single-file | `.bz2` | Python `bz2` (built-in) |\n| XZ / LZMA single-file | `.xz` | Python `lzma` (built-in) |\n| 7-Zip | `.7z` | `7z` binary (`p7zip-full`) |\n| RAR / RAR5 | `.rar`, `.r00`, multi-part | `7z` (primary) + `unrar-free` (fallback) |\n\n`p7zip-full` and `unrar-free` are included in the Docker image — no extra setup needed. `7z` handles both RAR3 and RAR5; `unrar-free` covers RAR3 as a fallback.\n\n### Behaviour\n\n1. After a torrent completes, the download folder is scanned for archives.\n2. Each archive is extracted **into its own parent folder** (= the torrent folder).\n3. Multi-part RAR sets: only the first part (`*.part1.rar` / `*.r00`) is processed; subsequent parts are read automatically.\n4. If **Delete Archive After Extraction** is enabled (default), the source archive is removed on success.\n5. Failures do **not** delete the archive and are logged to the Event Log.\n\n### Settings\n\n| Setting | Default | Description |\n|---------|---------|-------------|\n| Enable Auto-Extraction | Off | Master switch |\n| Delete Archive After Extraction | On | Remove archive on success |\n| Max Concurrent Extractions | 2 | Parallel extraction limit |\n| Discord Notification on Extraction | On | Send embed on completion/failure |\n\n## Discord Webhooks\n\nSet `discord_webhook_url` in Settings → 🔔 Notifications. Optionally set a separate URL for \"torrent added\" events (`discord_webhook_added`) and for Jackett additions (`jackett_webhook_url`).\n\n**Events:**\n\n| Event | Trigger |\n|-------|---------|\n| 📥 Torrent Added | Magnet/torrent accepted by AllDebrid |\n| ✅ Download Complete | All files downloaded successfully |\n| ❌ Download Error | One or more files failed |\n| ⚠️ Partial | Some files filtered/blocked, rest downloaded |\n| 🌿 FlexGet | Run started / task result / run finished / unreachable / recovered |\n| 📊 Stats Report | Periodic summary webhook |\n\n---\n\n## Sonarr / Radarr\n\nIn Sonarr/Radarr: **Settings → Download Clients → Add → Torrent Blackhole**\n\n- Watch folder: the same path mapped to the container's watch folder\n- Completed download folder: the same path mapped to the download folder\n\nOr add AllDebrid-Client as a custom script client pointing to the REST API.\n\n---\n\n## FlexGet\n\n```bash\nflexget web gentoken   # generate API token\n```\n\nEnter the token in **Settings → 🔌 Services → FlexGet**. Tasks are executed via `POST /api/tasks/execute/`.\n\n---\n\n## REST API\n\n| Method | Path | Description |\n|--------|------|-------------|\n| `GET` | `/api/stats` | Queue health, counters, averages |\n| `GET` | `/api/stats/comprehensive?hours=N` | Comprehensive statistics |\n| `GET` | `/api/stats/report?hours=N` | Formatted report payload |\n| `POST` | `/api/stats/report/send?hours=N` | Send the current report to the reporting webhook |\n| `GET` | `/api/stats/export?hours=N` | JSON export |\n| `POST` | `/api/stats/snapshot` | Create a statistics snapshot |\n| `GET` | `/api/torrents` | All torrent records |\n| `POST` | `/api/torrents/add-magnet` | Add magnet link |\n| `DELETE` | `/api/torrents/{id}` | Delete torrent |\n| `POST` | `/api/torrents/{id}/retry` | Retry torrent |\n| `GET` | `/api/events` | Event log |\n| `POST` | `/api/jackett/search` | Search Jackett |\n| `POST` | `/api/jackett/add` | Add a Jackett result |\n| `GET` | `/api/jackett/indexers` | List configured Jackett indexers |\n| `GET` | `/api/aria2/downloads` | Live aria2 queue |\n| `POST` | `/api/aria2/downloads/{gid}/{action}` | Pause / resume / remove a job |\n| `GET` | `/api/aria2/global-options` | Current aria2 speed limits and options |\n| `POST` | `/api/aria2/global-options` | Set speed limit at runtime |\n| `GET` | `/api/aria2/runtime` | Built-in aria2 runtime status and diagnostics |\n| `POST` | `/api/aria2/runtime/start` | Start the built-in aria2 daemon |\n| `POST` | `/api/aria2/runtime/stop` | Stop the built-in aria2 daemon |\n| `POST` | `/api/aria2/runtime/restart` | Restart the built-in aria2 daemon |\n| `POST` | `/api/aria2/runtime/apply` | Apply aria2 tuning and cleanup settings |\n| `POST` | `/api/admin/full-sync` | Full AllDebrid reconciliation |\n| `POST` | `/api/admin/deep-sync` | aria2 filesystem reconciliation |\n| `POST` | `/api/admin/migrate` | SQLite ↔ PostgreSQL migration |\n| `POST` | `/api/admin/database/backup` | Create a database backup |\n| `GET` | `/api/admin/database/backups` | List database backups |\n| `POST` | `/api/admin/database/wipe` | Wipe the database (guarded) |\n| `POST` | `/api/flexget/run` | Execute FlexGet tasks |\n| `GET` | `/api/flexget/tasks` | List FlexGet tasks |\n| `GET` | `/api/flexget/history` | FlexGet run history |\n| `GET` | `/api/integrations/fenrus/status` | Lightweight dashboard status for Fenrus |\n\n---\n\n## Development\n\n```bash\n# Backend (Python 3.12+)\ncd backend\npip install -r requirements.txt\nuvicorn main:app --reload --port 8080\n\n# Tests\npython -m pytest tests -v\n```\n\n### Project structure\n\n```\nbackend/\n  api/routes.py          # FastAPI endpoints\n  core/config.py         # Settings model (Pydantic)\n  core/scheduler.py      # Poll loops (AllDebrid, aria2, FlexGet, Stats)\n  db/database.py         # SQLite/PostgreSQL abstraction (_DbConnection)\n  db/migration.py        # Bidirectional migration\n  services/\n    alldebrid.py         # AllDebrid API client\n    aria2.py             # aria2 JSON-RPC client (serialised, rate-limited)\n    flexget.py           # FlexGet v3 REST client\n    jackett.py           # Jackett search proxy\n    manager_v2.py        # Core orchestration (TorrentManager)\n    notifications.py     # Discord webhook service\n    stats.py             # Statistics and reporting module\n    backup.py            # Automatic backups\n    integrations.py      # Sonarr/Radarr integration\n  tests/\n    test_manager_v2.py   # Torrent lifecycle / aria2 / reconciliation\n    test_jackett.py      # Jackett integration\n    test_webhook_settings_integration.py  # Settings and route regressions\nfrontend/\n  static/index.html      # Single-file web UI (vanilla JS)\ndocs/\n  logo.svg               # App logo\n  logo.png               # PNG logo (for Unraid Community Apps)\n  postgresql.md          # PostgreSQL setup guide\n  migration.md           # Migration guide\n  discord-webhooks.md    # Discord configuration\n  screenshots/           # UI screenshots\n```\n\n---\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for full release history.\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n# Windows EXE Build\n\nSee [docs/windows-exe-build.md](docs/windows-exe-build.md) for full documentation on building and running the Windows EXE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkroeberd%2Falldebrid-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkroeberd%2Falldebrid-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkroeberd%2Falldebrid-client/lists"}