Anleitung
1. Erste Schritte
AniRena ist ein Torrent-Index mit Fokus auf Anime, Manga, Audio und verwandte Medien. Sie können Torrents ohne Konto durchsuchen und herunterladen. Ein Konto ist erforderlich, um Torrents hochzuladen, in Gruppen zu posten oder die API zu nutzen.
Die Navigationsleiste oben bietet Zugriff auf die Hauptbereiche der Website:
- Startseite — die Torrent-Auflistung und Suchseite.
- Hochladen — neuen Torrent einreichen (Login erforderlich).
- Anleitung — diese Seite.
- Statistiken — websiteweite Statistiken (Torrents, Peers, Uploads über Zeit).
- Gruppen — Verzeichnis der Release-Gruppen.
- RSS — RSS-Feed der neuesten Uploads, nach Kategorie filterbar.
Ihr Kontomenü (rechts oben wenn eingeloggt) öffnet ein Profilpanel, wo Sie Einstellungen anpassen, Sicherheitsoptionen verwalten und auf Ihren API-Schlüssel zugreifen können.
2. Browsen & Suchen
Die Startseite listet alle Torrents nach Upload-Datum auf. Verwenden Sie die Suchleiste oben, um Ergebnisse zu filtern.
Einfache Suche
Geben Sie Wörter in die Suchleiste ein und drücken Sie Enter (oder klicken Sie auf das Suchsymbol). Ergebnisse werden nach Relevanz sortiert, wenn eine Suchanfrage aktiv ist.
Suchoperatoren
Die folgenden Operatoren können mit einer regulären Suchanfrage kombiniert werden:
| Operator | Beispiel | Effekt |
|---|---|---|
user:"name" | user:"SubsPlease" | Nur Torrents dieses Uploaders anzeigen. |
Das Klicken auf einen Uploader-Namen in der Torrent-Liste führt automatisch eine Benutzersuche durch.
Kategorien & Unterkategorien
Verwenden Sie den Kategorie-Selektor (das Raster-Symbol neben der Suchleiste), um Ergebnisse auf eine Kategorie zu beschränken. Verfügbare Kategorien:
- Anime
- Manga/Manhwa/Comic
- Audio
- Literatur
- Live-Action
- Bilder
- Software
- Hentai
- Sonstige
Jede Kategorie hat Unterkategorien (z. B. Anime zu RAW, Sub/Audio, Musikvideo), die im Kategorie-Modal auswählbar sind.
Sortieren & Filtern
Die Spaltenüberschriften in der Torrent-Liste sind klickbar, um nach dieser Spalte zu sortieren (aufsteigend oder absteigend). Verfügbare Sortierspalten: Datum, Name, Größe, abgeschlossene Downloads. Hinweis: Seeder und Leecher sind Echtzeitwerte aus Redis und können nicht zum Sortieren verwendet werden.
Sprachfilter
Verwenden Sie den Sprach-Selektor (Flaggensymbol), um nur Torrents mit einer bestimmten Sprache anzuzeigen.
RSS-Feed
Der RSS-Feed unter /rss liefert die neuesten Uploads. Fügen Sie ?category=anime (oder einen anderen Kategorie-Slug) hinzu, um den Feed zu filtern. Die meisten Torrent-Clients unterstützen RSS-Auto-Download direkt von dieser URL.
3. Torrents herunterladen
Klicken Sie auf einen Torrent-Namen, um das Detailpanel zu öffnen. Von dort aus können Sie:
- .torrent herunterladen — speichert die .torrent-Datei direkt. Die direkte URL ist
/torrents/{id}.torrent - Magnet-Link — öffnet direkt in Ihrem Torrent-Client über das Magnet-URI-Protokoll. Die URL ist
/torrents/{id}/magnet
Das Detailpanel zeigt auch die Torrent-Beschreibung, Dateiliste, Tracker-Liste sowie Seeder/Leecher-Zahlen.
Legacy-Download-Links
Alte AniRena-Download-Links werden weiterhin unterstützt und leiten automatisch zur richtigen .torrent-Datei über die Legacy-ID weiter: /dl/{old_id}
Empfohlene BitTorrent-Clients
Jeder moderne BitTorrent-Client funktioniert. Die folgenden Clients werden empfohlen und unterstützen BitTorrent v2 / Hybrid-Torrents vollständig:
4. Konto erstellen
Registrierung
Klicken Sie in der Navigationsleiste auf Registrieren. Wählen Sie einen Benutzernamen, geben Sie eine E-Mail-Adresse an und setzen Sie ein Passwort (Mindestlänge erzwungen). Sie müssen die Website-Nutzungsbedingungen lesen und akzeptieren.
E-Mail-Aktivierung
Nach der Registrierung wird eine Bestätigungs-E-Mail an Ihre Adresse gesendet. Klicken Sie auf den Link in der E-Mail, um Ihr Konto zu aktivieren. Wenn Sie sie nicht erhalten haben, nutzen Sie den Link „Ihr Konto aktivieren" auf der Login-Seite.
Passwort-Wiederherstellung
Wenn Sie Ihr Passwort vergessen haben, klicken Sie auf Passwort vergessen auf der Anmeldeseite und geben Sie Ihre E-Mail-Adresse ein. Ein Wiederherstellungslink wird Ihnen zugesandt. Der Link ist einmalig verwendbar und läuft nach kurzer Zeit ab.
5. Torrents hochladen
Navigieren Sie zu Hochladen in der Navigationsleiste. Sie müssen mit einem aktiven, nicht gesperrten Konto angemeldet sein. Die Upload-Seite hat zwei Tabs:
Upload-Tab — bestehende .torrent-Datei einreichen
Ziehen Sie eine .torrent-Datei per Drag-and-Drop oder wählen Sie sie aus. Füllen Sie nach dem Laden die Felder aus:
| Feld | Erforderlich | Beschreibung |
|---|---|---|
| Torrent-Datei | Ja | Die hochzuladende .torrent-Datei. |
| Name | Nein | Torrent-Anzeigenamen überschreiben. Wenn leer gelassen, wird der in der Torrent-Datei eingebettete Name verwendet. |
| Kategorie | Ja | Die Inhaltskategorie (Anime, Manga, Audio usw.). |
| Unterkategorie | Nein | Ein spezifischerer Typ innerhalb der Kategorie (z. B. RAW, Sub/Audio). |
| Sprachen | Nein | Einen oder mehrere Sprach-Tags, die die Inhaltssprache beschreiben. |
| Gruppe | Nein | Diesen Release mit einer Gruppe verknüpfen, der Sie angehören. |
| Beschreibung | Nein | Markdown-formatierte Beschreibung auf der Torrent-Detailseite (max. 65535 Zeichen). |
| Privat | Nein | Setzt das Privat-Flag im Torrent und deaktiviert DHT/PEX. Nützlich für Tracker-only-Torrents. |
| Announce-URL | Nein | Primäre Tracker-Announce-URL überschreiben oder hinzufügen. |
| Weitere Tracker | Nein | Wird aus der Torrent-Datei gelesen. Kann beim Hochladen nicht geändert werden — verwende den Tab „Erstellen", um die Tracker-Liste anzupassen. |
| Kommentar | Nein | Das in der Datei eingebettete Torrent-Kommentarfeld überschreiben. |
Dein Torrent muss mindestens eine AniRena-Tracker-URL in seiner Announce-Liste enthalten (in beliebigem Tier). Die Seite prüft dies beim Hochladen und lehnt Torrents ab, die keinen AniRena-Tracker enthalten. Wenn du den Torrent ohne den AniRena-Tracker erstellt hast, lade ihn hoch und lade ihn dann erneut von der Seite herunter — die heruntergeladene Datei enthält automatisch die richtigen Tracker.
Erstellen-Tab — neuen Torrent erstellen
Der Erstellen-Tab ermöglicht es Ihnen, eine neue .torrent-Datei von Grund auf zu erstellen, indem Sie Dateipfade, Tracker-URLs und andere Torrent-Parameter direkt im Browser angeben.
Moderation
Uploads werden automatisch gegen eine Liste gesperrter Inhaltsmuster (Namen, Dateinamen, Beschreibungen) geprüft. Torrents, die einem gesperrten Muster entsprechen, werden abgelehnt. Doppelte Torrents (gleicher Info-Hash) werden ebenfalls abgelehnt.
6. Ihr Konto
Klicken Sie auf Ihren Benutzernamen oben rechts, um das Profilpanel zu öffnen. Es ist in einklappbare Abschnitte unterteilt:
Einstellungen
Ändern Sie das UI-Design, die Schriftgröße, das Farbschema, die Oberflächensprache und torrent-bezogene Anzeigeeinstellungen. Änderungen werden automatisch gespeichert.
Passwort
Geben Sie Ihr aktuelles Passwort und das neue Passwort zweimal ein. Ein Verifizierungscode wird an Ihre registrierte E-Mail-Adresse gesendet und muss zur Bestätigung eingegeben werden.
Zwei-Faktor-Authentifizierung (2FA)
Aktivieren Sie TOTP-basierte Zwei-Faktor-Authentifizierung mit einer beliebigen Authenticator-App. Beim Aktivieren von 2FA:
- Scannen Sie den QR-Code (oder geben Sie das Geheimnis manuell ein) in Ihrer Authenticator-App.
- Geben Sie den 6-stelligen Code in Ihrer App ein, um die Einrichtung zu bestätigen.
- Speichern Sie die angezeigten Wiederherstellungscodes — diese sind Einmalcodes, um den Zugang wiederherzustellen.
Um 2FA zu deaktivieren, geben Sie Ihren aktuellen TOTP-Code ein und bestätigen.
Aktive Sitzungen
Zeigen Sie alle aktiven Login-Sitzungen an, einschließlich Browser, OS, IP-Adresse und zuletzt gesehen. Klicken Sie auf Widerrufen bei jeder unbekannten Sitzung.
API-Schlüssel
Generieren Sie einen persönlichen API-Schlüssel zum programmatischen Hochladen von Torrents über die AniRena-API. Klicken Sie auf Schlüssel generieren — der vollständige Schlüssel wird einmalig angezeigt.
Konto löschen
Das Anfordern der Kontolöschung startet eine 30-tägige Schonfrist. Ihr Konto wird sofort deaktiviert und nach 30 Tagen dauerhaft gelöscht. Sie können die Löschung jederzeit innerhalb dieses Zeitraums abbrechen.
7. AniRena API
AniRena bietet eine JSON-API, mit der Sie Torrents programmatisch über einen persönlichen API-Schlüssel hochladen können. Die API wendet dieselben Regeln wie die Weboberfläche an.
Authentifizierung
Die API verwendet einen zweistufigen Authentifizierungsablauf. Tausche zunächst deinen dauerhaften API-Schlüssel gegen ein kurzlebiges Bearer-Token, und übergib dieses Token dann im Authorization-Header jeder API-Anfrage.
Dein API-Schlüssel ist unter Dein Konto > API-Schlüssel verfügbar. Halte ihn geheim — jeder mit dem Schlüssel kann Bearer-Tokens erhalten und in deinem Namen hochladen. Bei Kompromittierung widerrufe ihn sofort und generiere einen neuen.
Schritt 1 — Bearer-Token holen
/api/v1/auth/tokenSende eine POST-Anfrage an den Token-Endpunkt mit deinem API-Schlüssel im Authorization-Header. Ein Request-Body ist nicht erforderlich.
Authorization: ApiKey <your-api-key>
Token-Antwort
{
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600
}Token-Lebensdauer
Bearer-Tokens bleiben bis zu 3600 Sekunden nach Ausstellung gültig und können bei jedem Aufruf wiederverwendet werden, bis sie ablaufen. Wenn ein Token abläuft, erstelle einen neuen über POST /api/v1/auth/token. Jede Antwort enthält weiterhin den aktuellen Token im X-New-Token-Header zur Abwärtskompatibilität.
X-New-Token: <next-bearer-token>
Anmeldung in einer Anfrage (mit 2FA)
/api/v1/auth/loginAuthentifizieren Sie sich mit Benutzername oder E-Mail und Passwort in einer einzigen Anfrage und erhalten Sie direkt ein Bearer-Token. Wenn für Ihr Konto 2FA aktiviert ist, geben Sie Ihren aktuellen Authenticator-Code in totp_code an (oder einen Wiederherstellungscode in recovery_code). Setzen Sie optional new_api_key auf true, um in derselben Antwort zusätzlich einen brandneuen permanenten API-Schlüssel zu erzeugen.
Anfrage-Body
{
"login": "username or email",
"password": "your-password",
"totp_code": "123456", // erforderlich, wenn 2FA aktiviert ist (6 Ziffern)
"recovery_code": "", // Alternative zu totp_code
"new_api_key": false // auf true setzen, um auch einen neuen API-Schlüssel zu erzeugen
}Token-Antwort
{
"ok": true,
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600,
"api_key": "<new-api-key>" // nur vorhanden, wenn new_api_key true war
}Das Bearer-Token funktioniert genau wie eines von /api/v1/auth/token. Das Feld api_key wird nur zurückgegeben, wenn new_api_key true ist — speichern Sie es sofort, da es nur einmal angezeigt wird und jeden vorherigen Schlüssel ersetzt.
Beispiel — anmelden und (optional) einen neuen API-Schlüssel erhalten
# pip install requests import requests BASE_URL = "https://www.anirena.com" # One request: authenticate (with 2FA if enabled) and get a bearer token. # Set new_api_key=True to also receive a brand-new permanent API key. resp = requests.post( f"{BASE_URL}/api/v1/auth/login", json={ "login": "your-username", # username or email "password": "your-password", "totp_code": "123456", # omit if 2FA is not enabled "new_api_key": True, # optional }, ) resp.raise_for_status() data = resp.json() token = data["token"] # use as: Authorization: Bearer <token> if "api_key" in data: print("New API key — store it now:", data["api_key"])
// Built-in fetch — requires Node.js 18+ const BASE_URL = "https://www.anirena.com"; // One request: authenticate (with 2FA if enabled) and get a bearer token. // Set new_api_key:true to also receive a brand-new permanent API key. const resp = await fetch(`${BASE_URL}/api/v1/auth/login`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ login: "your-username", // username or email password: "your-password", totp_code: "123456", // omit if 2FA is not enabled new_api_key: true, // optional }), }); const data = await resp.json(); const token = data.token; // use as: Authorization: Bearer <token> if (data.api_key) console.log("New API key — store it now:", data.api_key);
// Requires: curl extension (enabled by default in PHP 8+) <?php define("BASE_URL", "https://www.anirena.com"); // One request: authenticate (with 2FA if enabled) and get a bearer token. // Set new_api_key => true to also receive a brand-new permanent API key. $ch = curl_init(BASE_URL . "/api/v1/auth/login"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode([ "login" => "your-username", // username or email "password" => "your-password", "totp_code" => "123456", // omit if 2FA is not enabled "new_api_key" => true, // optional ]), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); $token = $data["token"]; // use as: Authorization: Bearer <token> if (isset($data["api_key"])) echo "New API key — store it now: " . $data["api_key"];
// Cargo.toml: // serde_json = "1" // reqwest = { version = "0.12", features = ["blocking", "json"] } const BASE_URL: &str = "https://www.anirena.com"; fn main() { let client = reqwest::blocking::Client::new(); // One request: authenticate (with 2FA if enabled) and get a bearer token. // Set new_api_key:true to also receive a brand-new permanent API key. let data: serde_json::Value = client .post(format!("{BASE_URL}/api/v1/auth/login")) .json(&serde_json::json!({ "login": "your-username", // username or email "password": "your-password", "totp_code": "123456", // omit if 2FA is not enabled "new_api_key": true, // optional })) .send().unwrap() .json().unwrap(); let token = data["token"].as_str().unwrap(); // Authorization: Bearer <token> if let Some(key) = data["api_key"].as_str() { println!("New API key — store it now: {key}"); } }
Schritt 2 — Torrent hochladen
/api/v1/torrentsSende eine einfache JSON-POST-Anfrage mit dem Bearer-Token im Authorization-Header.
Anfrage-Body
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
torrent | string | Ja | Base64-kodierter Inhalt der .torrent-Datei. |
category | string | Ja | Kategorie-Slug: anime, manga, audio, literature, live, pictures, software, hentai, other. |
name | string | Nein | Torrent-Anzeigenamen überschreiben. |
sub_category | string | Nein | Unterkategorie-Slug (z. B. raw, sub-audio). Muss zur gewählten Kategorie gehören. |
languages | string[] | Nein | Array von BCP-47-Sprachcodes (z. B. en, ja). |
group_id | string | Nein | UUID einer Gruppe, der Sie angehören, um diesen Release zuzuordnen. |
description | string | Nein | Markdown-formatierte Release-Beschreibung (max. 65535 Zeichen). |
comment | string | Nein | Das eingebettete Torrent-Kommentarfeld überschreiben. |
is_private | boolean | Nein | Auf true setzen, um das Privat-Flag im Torrent zu aktivieren. |
comments_enabled | boolean | Nein | Kommentare für diesen Torrent zulassen. Standard ist true (aktiviert). |
anime_id | string | Nein | UUID eines Anime-Eintrags, der mit diesem Torrent verknüpft werden soll. Die UUID erhalten Sie über GET /api/v1/anime/search. Gibt 400 zurück, wenn die UUID keinem bekannten Eintrag entspricht. |
announce | string | Nein | Primäre Announce-URL überschreiben oder hinzufügen. |
trackers | string | Nein | Zeilengetrennte Liste zusätzlicher Tracker-URLs. Eine Leerzeile erstellt eine neue Tracker-Ebene. |
test | boolean | Nein | Auf true setzen, um einen Probelauf durchzuführen: Die Anfrage wird vollständig validiert, aber der Torrent wird nicht gespeichert. Damit können Sie Ihre Daten vor der eigentlichen Einreichung überprüfen. |
Probelauf-Erfolgsantwort — 200 OK
{
"ok": true,
"test": true,
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Verfügbare Sprachcodes
abaaafaksqamarar-001anhyasavaeayazbmbaeubebnbhbibsbrbgmyyuecachcenyzhzh-HKzh-Hanszh-SGzh-TWcucvkwcocrhrcsdadvnlnl-BEdzenen-USeoeteefofjfilfifrfr-CAffgllgkadede-ATelgnguhthahehzhihohuisioigidiaieiuikgaitjajvklknkrkskkkmkirwrnkvkgkokjkukylolalvlilnltlulbmkmgmsmlmtgvmimrmhmnnanvngnendsenonbnnocorojomospipsfaplptpt-BRpaqurormrusmsgsascgdsrsr-Latnsniisdsiskslsonrsteses-419es-MXsuswsssvtltytgtatttethbotitotstntrtktwukuruguzvevivowacyfywoxhyiyozazuBeispielanfrage
# pip install requests import base64, pathlib, requests API_KEY = "YOUR_API_KEY" BASE_URL = "https://www.anirena.com" # Step 1: exchange API key for a short-lived bearer token auth = requests.post( f"{BASE_URL}/api/v1/auth/token", headers={"Authorization": f"ApiKey {API_KEY}"}, ) auth.raise_for_status() token = auth.json()["token"] # Step 2: upload — plain JSON with the bearer token torrent_b64 = base64.b64encode(pathlib.Path("file.torrent").read_bytes()).decode() resp = requests.post( f"{BASE_URL}/api/v1/torrents", json={ "torrent": torrent_b64, "category": "anime", "sub_category": "raw", "languages": ["ja"], "description": "# My Release\n\nRelease notes here.", "is_private": False, }, headers={"Authorization": f"Bearer {token}"}, ) resp.raise_for_status() data = resp.json() token = resp.headers.get("X-New-Token", token) # save for next request print(data["id"], data["name"]) # torrent UUID and title
// Built-in modules only — requires Node.js 18+ (for global fetch) const fs = require("fs"); const API_KEY = "YOUR_API_KEY"; const BASE_URL = "https://www.anirena.com"; // Step 1: exchange API key for a short-lived bearer token let authResp = await fetch(`${BASE_URL}/api/v1/auth/token`, { method: "POST", headers: { Authorization: `ApiKey ${API_KEY}` }, }); let { token } = await authResp.json(); // Step 2: upload — plain JSON with the bearer token const torrentB64 = fs.readFileSync("file.torrent").toString("base64"); const resp = await fetch(`${BASE_URL}/api/v1/torrents`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` }, body: JSON.stringify({ torrent: torrentB64, category: "anime", sub_category: "raw", languages: ["ja"], description: "# My Release\n\nRelease notes here.", is_private: false, }), }); const data = await resp.json(); token = resp.headers.get("x-new-token") ?? token; // save for next request console.log(data.id, data.name); // torrent UUID and title
// Requires: curl extension (enabled by default in PHP 8+) <?php define("API_KEY", "YOUR_API_KEY"); define("BASE_URL", "https://www.anirena.com"); // Step 1: exchange API key for a short-lived bearer token $ch = curl_init(BASE_URL . "/api/v1/auth/token"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: ApiKey " . API_KEY], ]); $token = json_decode(curl_exec($ch), true)["token"]; curl_close($ch); // Step 2: upload — plain JSON with the bearer token $torrentB64 = base64_encode(file_get_contents("file.torrent")); $respHeaders = []; $ch = curl_init(BASE_URL . "/api/v1/torrents"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode([ "torrent" => $torrentB64, "category" => "anime", "sub_category" => "raw", "languages" => ["ja"], "description" => "# My Release\n\nRelease notes here.", "is_private" => false, ]), CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADERFUNCTION => function($ch, $h) use (&$respHeaders) { $respHeaders[] = $h; return strlen($h); }, CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "Authorization: Bearer " . $token, ], ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); foreach ($respHeaders as $h) { // save new token for next request if (stripos($h, "X-New-Token:") === 0) $token = trim(substr($h, strlen("X-New-Token:"))); } echo $data["id"] . " " . $data["name"]; // torrent UUID and title
// Cargo.toml: // base64 = "0.22" // serde_json = "1" // reqwest = { version = "0.12", features = ["blocking", "json"] } use base64::{engine::general_purpose::STANDARD as B64, Engine}; const API_KEY: &str = "YOUR_API_KEY"; const BASE_URL: &str = "https://www.anirena.com"; fn main() { let client = reqwest::blocking::Client::new(); // Step 1: exchange API key for a short-lived bearer token let auth: serde_json::Value = client .post(format!("{BASE_URL}/api/v1/auth/token")) .header("Authorization", format!("ApiKey {API_KEY}")) .send().unwrap().json().unwrap(); let mut token = auth["token"].as_str().unwrap().to_string(); // Step 2: upload — plain JSON with the bearer token let torrent_b64 = B64.encode(std::fs::read("file.torrent").unwrap()); let resp = client .post(format!("{BASE_URL}/api/v1/torrents")) .header("Authorization", format!("Bearer {token}")) .json(&serde_json::json!({ "torrent": torrent_b64, "category": "anime", "sub_category": "raw", "languages": ["ja"], "description": "# My Release\n\nRelease notes here.", "is_private": false })) .send().unwrap(); if let Some(t) = resp.headers().get("x-new-token") { token = t.to_str().unwrap().to_string(); // save for next request } let data: serde_json::Value = resp.json().unwrap(); println!("{} {}", data["id"], data["name"]); // torrent UUID and title }
Erfolgsantwort — 200 OK
{
"ok": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Fehlerantworten
| HTTP-Status | Bedeutung |
|---|---|
400 | Ungültiger Anfrage-Body oder fehlendes Pflichtfeld. |
401 | Fehlender, abgelaufener oder bereits rotierter Bearer-Token. Authentifiziere dich erneut über POST /api/v1/auth/token. |
403 | Konto gesperrt, deaktiviert oder IP blockiert. |
409 | Doppelter Torrent — gleicher Info-Hash existiert bereits. |
422 | Torrent-Datei konnte nicht geparst werden oder hat die Validierung nicht bestanden. |
429 | Rate-Limit überschritten. Nach dem Reset des Fensters erneut versuchen. |
503 | Website befindet sich im Wartungs- oder Nur-Lesen-Modus. |
Rate-Limiting
API-Uploads unterliegen einem konfigurierbaren Rate-Limit getrennt von der Weboberfläche. Bei Überschreitung gibt die API 429 Too Many Requests zurück. Das Limit gilt pro API-Schlüssel.
Torrent-Dateien mit torrent-builder erstellen
torrent-builder ist ein Open-Source-CLI-Tool, das auf libtorrent-rasterbar aufbaut und es ermöglicht, BitTorrent v1, v2 und hybrid .torrent-Dateien über die Kommandozeile zu erstellen. Es ergänzt die AniRena-Upload-API perfekt — Datei lokal erstellen und dann direkt per POST an den Tracker senden. cantalupo555/torrent-builder.
Aus dem Quellcode bauen
Erfordert CMake >= 3.28.3 und libtorrent-rasterbar >= 2.0.11. Repository klonen und mit CMake bauen:
# Install system dependencies sudo apt-get install build-essential cmake libtorrent-rasterbar-dev # Clone & build git clone https://github.com/cantalupo555/torrent-builder.git cd torrent-builder mkdir build && cd build cmake .. && cmake --build .
# Install dependencies via Homebrew brew install cmake libtorrent-rasterbar # Clone & build git clone https://github.com/cantalupo555/torrent-builder.git cd torrent-builder mkdir build && cd build cmake .. && cmake --build .
Wichtige Flags
| Feld | Beschreibung |
|---|---|
--path | Pfad zur Datei oder zum Verzeichnis, das verpackt werden soll (erforderlich). |
--output | Ausgabe-.torrent-Dateiname (erforderlich). |
--version | BitTorrent-Format — 1 = v1, 2 = v2, 3 = hybrid (Standard: 3). |
--tracker | Eine Tracker-Announce-URL hinzufügen. Flag wiederholen, um mehrere Tracker hinzuzufügen. |
--comment | Einen Metadaten-Kommentarstring in den Torrent einbetten. |
--private | Das Privat-Flag setzen, um die Verteilung auf die aufgeführten Tracker zu beschränken. |
--piece-size | Stückgröße in KB (16-32768). Nicht setzen für automatische Auswahl. |
-i | Schrittweisen interaktiven Konfigurationsmodus starten. |
End-to-End-Workflow: Erstellen -> Hochladen
Die folgenden Beispiele erstellen einen hybrid-Torrent mit torrent-builder, authentifizieren sich dann bei der AniRena API und laden das Ergebnis in einem einzigen Skript hoch.
# pip install requests import base64, subprocess, requests API_KEY = "YOUR_API_KEY" BASE_URL = "https://www.anirena.com" # Step 1: build the torrent with torrent-builder # --version 1=v1 2=v2 3=hybrid (default) subprocess.run([ "./torrent-builder/build/torrent_builder", "--path", "/data/my_release", "--output", "my_release.torrent", "--version", "3", # hybrid "--tracker", "udp://open.tracker.gg:6969/announce", "--comment", "My Release", "--creator", "--creation-date", ], check=True) # Step 2: authenticate token = requests.post( f"{BASE_URL}/api/v1/auth/token", headers={"Authorization": f"ApiKey {API_KEY}"}, ).json()["token"] # Step 3: upload torrent_b64 = base64.b64encode(open("my_release.torrent", "rb").read()).decode() resp = requests.post( f"{BASE_URL}/api/v1/torrents", json={ "torrent": torrent_b64, "category": "anime", "sub_category": "raw", "languages": ["ja"], "comments_enabled": True, }, headers={"Authorization": f"Bearer {token}"}, ) resp.raise_for_status() data = resp.json() print(data["id"], data["name"])
// Built-in modules — Node.js 18+ const fs = require("fs"); const { execFileSync } = require("child_process"); const API_KEY = "YOUR_API_KEY"; const BASE_URL = "https://www.anirena.com"; // Step 1: build the torrent (--version 1=v1, 2=v2, 3=hybrid) execFileSync("./torrent-builder/build/torrent_builder", [ "--path", "/data/my_release", "--output", "my_release.torrent", "--version", "3", "--tracker", "udp://open.tracker.gg:6969/announce", "--comment", "My Release", "--creator", "--creation-date", ]); // Step 2: authenticate let { token } = await (await fetch(`${BASE_URL}/api/v1/auth/token`, { method: "POST", headers: { Authorization: `ApiKey ${API_KEY}` }, })).json(); // Step 3: upload const torrentB64 = fs.readFileSync("my_release.torrent").toString("base64"); const resp = await fetch(`${BASE_URL}/api/v1/torrents`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` }, body: JSON.stringify({ torrent: torrentB64, category: "anime", sub_category: "raw", languages: ["ja"], comments_enabled: true, }), }); const data = await resp.json(); console.log(data.id, data.name);
// PHP 8+ with curl and proc_open <?php define("API_KEY", "YOUR_API_KEY"); define("BASE_URL", "https://www.anirena.com"); // Step 1: build the torrent (version: 1=v1, 2=v2, 3=hybrid) exec(implode(" ", array_map("escapeshellarg", [ "./torrent-builder/build/torrent_builder", "--path", "/data/my_release", "--output", "my_release.torrent", "--version", "3", "--tracker", "udp://open.tracker.gg:6969/announce", "--comment", "My Release", "--creator", "--creation-date", ]))); // Step 2: authenticate $ch = curl_init(BASE_URL . "/api/v1/auth/token"); curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: ApiKey " . API_KEY]]); $token = json_decode(curl_exec($ch), true)["token"]; curl_close($ch); // Step 3: upload $torrentB64 = base64_encode(file_get_contents("my_release.torrent")); $respHeaders = []; $ch = curl_init(BASE_URL . "/api/v1/torrents"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode([ "torrent" => $torrentB64, "category" => "anime", "sub_category" => "raw", "languages" => ["ja"], "comments_enabled" => true, ]), CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADERFUNCTION => function($ch, $h) use (&$respHeaders) { $respHeaders[] = $h; return strlen($h); }, CURLOPT_HTTPHEADER => ["Content-Type: application/json", "Authorization: Bearer " . $token], ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); echo $data["id"] . " " . $data["name"];
// Cargo.toml: // base64 = "0.22" // serde_json = "1" // reqwest = { version = "0.12", features = ["blocking", "json"] } use base64::{engine::general_purpose::STANDARD as B64, Engine}; use std::process::Command; const API_KEY: &str = "YOUR_API_KEY"; const BASE_URL: &str = "https://www.anirena.com"; fn main() { // Step 1: build the torrent (--version 1=v1, 2=v2, 3=hybrid) Command::new("./torrent-builder/build/torrent_builder") .args([ "--path", "/data/my_release", "--output", "my_release.torrent", "--version", "3", "--tracker", "udp://open.tracker.gg:6969/announce", "--comment", "My Release", "--creator", "--creation-date", ]) .status().expect("torrent_builder failed"); let client = reqwest::blocking::Client::new(); // Step 2: authenticate let auth: serde_json::Value = client .post(format!("{BASE_URL}/api/v1/auth/token")) .header("Authorization", format!("ApiKey {API_KEY}")) .send().unwrap().json().unwrap(); let token = auth["token"].as_str().unwrap().to_string(); // Step 3: upload let torrent_b64 = B64.encode(std::fs::read("my_release.torrent").unwrap()); let resp: serde_json::Value = client .post(format!("{BASE_URL}/api/v1/torrents")) .header("Authorization", format!("Bearer {token}")) .json(&serde_json::json!({ "torrent": torrent_b64, "category": "anime", "sub_category": "raw", "languages": ["ja"], "comments_enabled": true, })) .send().unwrap().json().unwrap(); println!("{} {}", resp["id"], resp["name"]); }
Torrent-Metadaten durchsuchen
/api/v1/torrents/searchSende eine einfache JSON-POST-Anfrage, um Torrent-Einträge mit denselben Such- und Filteroptionen wie auf der Website abzurufen. Die .torrent-Datei selbst wird nicht zurückgegeben — verwende dafür die normale Download-Route.
# pip install requests (token already obtained — see upload example) resp = requests.post( f"{BASE_URL}/api/v1/torrents/search", json={"q": "Sword Art Online", "category": "anime", "per_page": 25}, headers={"Authorization": f"Bearer {token}"}, ) resp.raise_for_status() data = resp.json() token = resp.headers.get("X-New-Token", token) # save for next request for t in data["torrents"]: print(t["title"], "-", t["magnet"])
// token already obtained — see upload example const resp = await fetch(`${BASE_URL}/api/v1/torrents/search`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` }, body: JSON.stringify({ q: "Sword Art Online", category: "anime", per_page: 25 }), }); const data = await resp.json(); token = resp.headers.get("x-new-token") ?? token; // save for next request data.torrents.forEach(t => console.log(t.title, "-", t.magnet));
// token already obtained — see upload example $respHeaders = []; $ch = curl_init(BASE_URL . "/api/v1/torrents/search"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode([ "q" => "Sword Art Online", "category" => "anime", "per_page" => 25 ]), CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADERFUNCTION => function($ch, $h) use (&$respHeaders) { $respHeaders[] = $h; return strlen($h); }, CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "Authorization: Bearer " . $token, ], ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); foreach ($respHeaders as $h) { // save new token for next request if (stripos($h, "X-New-Token:") === 0) $token = trim(substr($h, strlen("X-New-Token:"))); } foreach ($data["torrents"] as $t) { echo $t["title"] . " - " . $t["magnet"] . "\n"; }
// client and token already obtained — see upload example let resp = client .post(format!("{BASE_URL}/api/v1/torrents/search")) .header("Authorization", format!("Bearer {token}")) .json(&serde_json::json!({"q": "Sword Art Online", "category": "anime", "per_page": 25})) .send().unwrap(); if let Some(t) = resp.headers().get("x-new-token") { token = t.to_str().unwrap().to_string(); // save for next request } let data: serde_json::Value = resp.json().unwrap(); for t in data["torrents"].as_array().unwrap() { println!("{} - {}", t["title"], t["magnet"]); }
Suchparameter
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
q | string | Nein | Freitextsuche. Unterstützt group:slug, group:"Name", user:name-Präfixe. |
category | string | Nein | Kategorie-Slug (z. B. „anime"). |
sub_category | string | Nein | Unterkategorie-Slug (z. B. „raw"). |
languages | string[] | Nein | Array von BCP-47-Sprachcodes (z. B. en, ja). |
sort | string | Nein | Sortierfeld: date (Standard), size, seeders, leechers, completed, title. |
order | string | Nein | Sortierrichtung: desc (Standard) oder asc. |
page | integer | Nein | Seitennummer, beginnend bei 1 (Standard 1). |
per_page | integer | Nein | Ergebnisse pro Seite, 1–250 (Standard 50). |
hide_adult | boolean | Nein | Erwachsenenkategorie-Torrents ausschließen. Standard ist true für reguläre Benutzer. |
show_dead | boolean | Nein | Wenn false (Standard), werden Torrents, die älter als die Dead-Torrent-Gnadenfrist sind und keine aktiven Seeder haben, ausgeschlossen. Auf true setzen, um sie einzuschließen. |
Antwort
{
"total": 1234,
"page": 1,
"per_page": 50,
"total_pages": 25,
"from": 1,
"to": 50,
"torrents": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "My Release Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null,
"size_fmt": "1.4 GB",
"completed": 42,
"seeders": 10,
"leechers": 3,
"languages": ["ja", "en"],
"comment_count": 7,
"created_at": "2024-01-15 12:34",
"cat_slug": "anime",
"sub_slug": "raw",
"group_name": null,
"uploader": "username",
"magnet": "magnet:?xt=urn:btih:..."
}
]
}comment_count — Anzahl der nicht gelöschten Kommentare zu diesem Torrent.
Such-Rate-Limiting
Suchanfragen unterliegen einem separaten konfigurierbaren Rate-Limit (Standard 60 Anfragen pro 60 Sekunden pro API-Schlüssel). Überschreitung gibt 429 Too Many Requests zurück. Staff-Konten sind ausgenommen.
Torrent-Details abrufen
/api/v1/torrent/{id}Ruft die vollständigen Metadaten eines einzelnen Torrents ab — einschließlich Feldern, die der Such-Endpunkt auslässt, wie die Markdown-Beschreibung, den eingebetteten .torrent-Kommentar, die Dateiliste mit Dateigrößen und das vollständige Tracker-Tier-Layout. Live-Seeder- und Leecher-Zählungen werden aus dem Tracker gelesen, sofern verfügbar.
Antwort
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "My Release Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null,
"size_fmt": "1.4 GB",
"completed": 42,
"seeders": 10,
"leechers": 3,
"ext_seeders": 128,
"ext_leechers": 14,
"created_at": "2024-01-15 12:34",
"torrent_created": "2024-01-15 12:30",
"created_by_client": "mktorrent 1.1",
"cat_name": "Anime",
"cat_slug": "anime",
"sub_name": "Raw",
"sub_slug": "raw",
"group_name": null,
"group_slug": null,
"uploader": "username",
"uploader_id": "...",
"description": "# My Release\n\nRelease notes here.",
"comment": "",
"is_private": false,
"magnet": "magnet:?xt=urn:btih:...",
"languages": [
{ "code": "ja", "name": "Japanese", "country_code": "jp" }
],
"tracker_tiers": [
{ "tier": 0, "urls": ["udp://tracker.example.org:6969/announce"] }
],
"files": [
{ "path": "My Release/episode-01.mkv", "size": 1503238553 }
],
"comments_enabled": true,
"comments_locked": false,
"comment_count": 7
}seeders, leechers — Live-Werte aus dem hauseigenen Tracker; beide melden 0, wenn der Tracker-Speicher keinen Eintrag für diesen Info-Hash hat oder nicht erreichbar ist.
ext_seeders, ext_leechers — Höchste Seeder- und Leecher-Anzahl, die von einem einzelnen externen Tracker für diesen Torrent gescrapt wurde. Tracker, die denselben Schwarm verfolgen, überlappen sich, daher wird das Maximum statt der Summe verwendet; beide melden 0, wenn kein Tracker Scrape-Daten für diesen Info-Hash hat.
Fehlerantworten
| HTTP-Status | Bedeutung |
|---|---|
400 | Die Torrent-ID muss entweder ein 36-Zeichen-UUID mit Bindestrichen oder eine 32-Zeichen-reine-Hex-Zeichenkette sein. |
401 | Fehlender, abgelaufener oder bereits rotierter Bearer-Token. Authentifiziere dich erneut über POST /api/v1/auth/token. |
404 | Torrent nicht gefunden. |
429 | Rate-Limit überschritten. Nach dem Reset des Fensters erneut versuchen. |
503 | Website befindet sich im Wartungs- oder Nur-Lesen-Modus. |
Torrent-Kommentare abrufen
/api/v1/torrents/{id}/commentsSeitenweise Kommentare für einen Torrent abrufen. Die Anzahl der Kommentare pro Seite wird durch die COMMENT_PER_PAGE-Einstellung in der .env-Datei des Servers gesteuert (Standard 20). Nur Torrents mit aktivierten Kommentaren liefern Ergebnisse — alle anderen geben 403 zurück.
Abfrageparameter
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
page | integer | Nein | Seitennummer, beginnend bei 1 (Standard 1). |
# pip install requests (token already obtained — see upload example) TORRENT_ID = "550e8400-e29b-41d4-a716-446655440000" resp = requests.get( f"{BASE_URL}/api/v1/torrents/{TORRENT_ID}/comments", params={"page": 1}, headers={"Authorization": f"Bearer {token}"}, ) resp.raise_for_status() data = resp.json() token = resp.headers.get("X-New-Token", token) # save for next request for c in data["comments"]: print(c["username"], "-", c["body"])
// token already obtained — see upload example const TORRENT_ID = "550e8400-e29b-41d4-a716-446655440000"; const resp = await fetch(`${BASE_URL}/api/v1/torrents/${TORRENT_ID}/comments?page=1`, { headers: { Authorization: `Bearer ${token}` }, }); const data = await resp.json(); token = resp.headers.get("x-new-token") ?? token; // save for next request data.comments.forEach(c => console.log(c.username, "-", c.body));
// token already obtained — see upload example $torrentId = "550e8400-e29b-41d4-a716-446655440000"; $respHeaders = []; $ch = curl_init(BASE_URL . "/api/v1/torrents/{$torrentId}/comments?page=1"); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HEADERFUNCTION => function($ch, $h) use (&$respHeaders) { $respHeaders[] = $h; return strlen($h); }, CURLOPT_HTTPHEADER => ["Authorization: Bearer " . $token], ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); foreach ($respHeaders as $h) { // save new token for next request if (stripos($h, "X-New-Token:") === 0) $token = trim(substr($h, strlen("X-New-Token:"))); } foreach ($data["comments"] as $c) { echo $c["username"] . " - " . $c["body"] . "\n"; }
// client and token already obtained — see upload example let torrent_id = "550e8400-e29b-41d4-a716-446655440000"; let resp = client .get(format!("{BASE_URL}/api/v1/torrents/{torrent_id}/comments?page=1")) .header("Authorization", format!("Bearer {token}")) .send().unwrap(); if let Some(t) = resp.headers().get("x-new-token") { token = t.to_str().unwrap().to_string(); // save for next request } let data: serde_json::Value = resp.json().unwrap(); for c in data["comments"].as_array().unwrap() { println!("{} - {}", c["username"], c["body"]); }
Antwort
{
"torrent_id": "550e8400-e29b-41d4-a716-446655440000",
"page": 1,
"per_page": 20,
"total": 45,
"total_pages": 3,
"comments": [
{
"id": "...",
"user_id": "...",
"username": "uploader",
"role": "user",
"author_banned": false,
"body": "Great release!",
"created_at": "2024-01-15 12:34:00",
"edited_at": null,
"edited_by_username": null,
"deleted_at": null
}
]
}Das body-Feld ist ein leerer String, wenn der Kommentar-Autor gesperrt ist oder der Kommentar gelöscht wurde. Das author_banned-Flag gibt an, welcher Fall zutrifft.
Fehlerantworten
| HTTP-Status | Bedeutung |
|---|---|
401 | Fehlender, abgelaufener oder bereits rotierter Bearer-Token. Authentifiziere dich erneut über POST /api/v1/auth/token. |
403 | Kommentare sind für diesen Torrent deaktiviert. |
404 | Torrent nicht gefunden. |
503 | Website befindet sich im Wartungs- oder Nur-Lesen-Modus. |
Anime-Einträge suchen
/api/v1/anime/search?q=<query>Suchen Sie Anime-Einträge nach Titel, um deren UUID zu erhalten. Die UUID kann als anime_id im Upload-Body übergeben werden, um einen Torrent beim Hochladen mit einem Anime-Eintrag zu verknüpfen, oder nach dem Upload mit PUT /api/torrents/{id}/anime verwendet werden. Keine Authentifizierung erforderlich. Unterliegt demselben Ratenlimit wie die Torrent-Suche (Standard 60 Anfragen pro 60 Sekunden pro IP).
# pip install requests (no authentication required)
resp = requests.get(
f"{BASE_URL}/api/v1/anime/search",
params={"q": "Sword Art Online", "page": 1, "per_page": 10},
)
resp.raise_for_status()
for item in resp.json()["results"]:
print(item["id"], "-", item["title"])// No authentication required
const resp = await fetch(
`${BASE_URL}/api/v1/anime/search?q=${encodeURIComponent("Sword Art Online")}&page=1&per_page=10`
);
const data = await resp.json();
data.results.forEach(item => console.log(item.id, "-", item.title));// No authentication required
$ch = curl_init(BASE_URL . "/api/v1/anime/search?" . http_build_query([
"q" => "Sword Art Online", "page" => 1, "per_page" => 10,
]));
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($data["results"] as $item) {
echo $item["id"] . " - " . $item["title"] . "\n";
}// No authentication required
let data: serde_json::Value = reqwest::blocking::get(
format!("{BASE_URL}/api/v1/anime/search?q=Sword+Art+Online&page=1&per_page=10")
).unwrap().json().unwrap();
for item in data["results"].as_array().unwrap() {
println!("{} - {}", item["id"], item["title"]);
}Abfrageparameter
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
q | string | Ja | Titelsuche (erforderlich). Wird gegen Titel und Synonyme geprüft. |
page | integer | Nein | Seitennummer, beginnend bei 1 (Standard 1). |
per_page | integer | Nein | Ergebnisse pro Seite, 1–50 (Standard 10). |
Antwort
{
"total": 42,
"page": 1,
"per_page": 10,
"total_pages": 5,
"results": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Sword Art Online",
"anime_type": "TV",
"episodes": 25,
"status": "FINISHED",
"season": "FALL",
"season_year": 2012,
"picture": "https://cdn.myanimelist.net/images/anime/...",
"thumbnail": "https://cdn.myanimelist.net/images/anime/...",
"duration_secs": 1440
}
]
}Gruppen auflisten und abrufen
/api/v1/groupsGibt eine paginierte Liste öffentlicher Gruppen zurück (aktiviert und nicht gesperrt). Erfordert Bearer-Token-Authentifizierung.
/api/v1/groups/{id_or_slug}Gibt eine einzelne öffentliche Gruppe anhand der numerischen ID oder des Slugs zurück. Gibt 404 zurück, wenn die Gruppe deaktiviert oder gesperrt ist.
Abfrageparameter (nur Liste)
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
q | string | Nein | Nach Gruppenname filtern (optional, Teilstring-Übereinstimmung). |
page | integer | Nein | Seitenzahl (Standard 1). |
per_page | integer | Nein | Ergebnisse pro Seite, 1–100 (Standard 20). |
sort | string | Nein | Sortierspalte: name | slug | members | torrents | created (Standard name). |
order | string | Nein | Sortierrichtung: asc oder desc (Standard asc). |
Antwort (Liste)
{
"total": 12,
"page": 1,
"per_page": 20,
"total_pages": 1,
"groups": [
{
"id": 1,
"name": "SubsPlease",
"slug": "subsplease",
"subdomain_slug": "subsplease",
"description": "Weekly simulcast batches.",
"owner": "admin",
"member_count": 42,
"torrent_count": 1337,
"created_at": "2024-01-15 12:34"
}
]
}Antwort (einzeln)
{
"id": 1,
"name": "SubsPlease",
"slug": "subsplease",
"subdomain_slug": "subsplease",
"description": "Weekly simulcast batches.",
"owner": "admin",
"member_count": 42,
"torrent_count": 1337,
"created_at": "2024-01-15 12:34"
}Fehlerantworten
| HTTP-Status | Bedeutung |
|---|---|
401 | Fehlender, abgelaufener oder bereits rotierter Bearer-Token. Authentifiziere dich erneut über POST /api/v1/auth/token. |
404 | Gruppe nicht gefunden oder nicht öffentlich zugänglich. |
429 | Rate-Limit überschritten. Nach dem Reset des Fensters erneut versuchen. |
503 | Website befindet sich im Wartungs- oder Nur-Lesen-Modus. |
8. Spenden
Wenn Sie AniRena unterstützen und bei den Kosten für unsere Server und Dienste helfen möchten, können Sie gerne eine Spende an eine der folgenden Kryptowährungs-Wallets senden:
bc1qy2h3ddq6ak5damvnf4r5vu3ydehhxrcq8gllwn0xCbaFe03832F95F86AF2536d52710e78C63b62Cd33ucetj2XDGHQg9PVRPMxerNi7c6kX7GJkjQNg9yjwGegLbpt61yX3RjGtB1Ef8vgVz6Hr6baQsTjVkJede Spende, groß oder klein, wird sehr geschätzt und fließt direkt in den Betrieb von AniRena. Vielen Dank für Ihre Unterstützung!
9. Software
AniRena Player ist eine kostenlose Desktop-App, mit der du Videos direkt aus den auf dieser Seite indizierten Torrents streamen kannst — ohne auf das vollständige Herunterladen warten zu müssen. Füge einfach einen Magnet-Link ein oder öffne eine .torrent-Datei, und die Wiedergabe beginnt, sobald genügend Daten verfügbar sind.
Beide Builds sind vollständig eigenständig — alle Abhängigkeiten sind in der ausführbaren Datei enthalten. Kein Installer, keine Laufzeitumgebung — einfach herunterladen und ausführen.
Installer (.exe). Aktualisiert sich in der App selbst.
Disk-Image (.dmg) für Macs mit Apple Silicon (M1 und neuer). Aktualisiert sich in der App selbst.
Disk-Image (.dmg) für Macs mit Intel. Aktualisiert sich in der App selbst.
Portable Einzeldatei, keine Installation nötig. Das einzige Linux-Format mit In-App-Auto-Update.
Installation: sudo apt install ./<file>.deb — Updates über apt oder einen frischen Download, nicht in der App.
Installation: sudo dnf install ./<file>.rpm — Updates über dnf oder einen frischen Download, nicht in der App.
Sideload auf 64-Bit ARM-Android-Geräte (die meisten modernen Smartphones / Tablets). Update durch das Herunterladen einer neuen APK.
Ältere Versionen
Sideload auf 32-Bit ARM-Android-Geräte (ältere Smartphones / Tablets). Update durch das Herunterladen einer neuen APK.