Průvodce
1. Začínáme
AniRena je torrentový indexer zaměřený na anime, mangu, audio a podobná média. Torrenty můžete procházet a stahovat bez účtu. Účet je nutný pro nahrávání torrentů, přispívání do skupin nebo používání API.
Navigační panel v horní části poskytuje přístup k hlavním oblastem webu:
- Domů — stránka s výpisem a hledáním torrentů.
- Nahrát — odeslat nový torrent (vyžaduje přihlášení).
- Průvodce — tato stránka.
- Statistiky — statistiky celého webu (torrenty, peery, nahrání v průběhu času).
- Skupiny — adresář skupin vydání.
- RSS — RSS kanál posledních nahrání, filtrovatelný podle kategorie.
Nabídka vašeho účtu (pravý horní roh po přihlášení) otevírá panel profilu, kde můžete upravit nastavení, spravovat možnosti zabezpečení a přistupovat ke svému API klíči.
2. Procházení a hledání
Domovská stránka zobrazuje všechny torrenty seřazené podle data nahrání. Použijte vyhledávací panel v horní části pro filtrování výsledků.
Základní hledání
Napište libovolná slova do vyhledávacího panelu a stiskněte Enter (nebo klikněte na ikonu hledání). Výsledky jsou řazeny podle relevance při aktivním dotazu.
Operátory hledání
Následující operátory lze kombinovat s běžným dotazem:
| Operátor | Příklad | Efekt |
|---|---|---|
user:"name" | user:"SubsPlease" | Zobrazit pouze torrenty nahrané tímto uživatelem. |
Kliknutí na jméno nahrávajícího v seznamu torrentů automaticky spustí hledání uživatele.
Kategorie a podkategorie
Použijte volič kategorií (ikona mřížky vedle vyhledávacího panelu) pro omezení výsledků na jednu kategorii. Dostupné kategorie jsou:
- Anime
- Manga/Manhwa/Komiks
- Audio
- Literatura
- Živý přenos
- Obrázky
- Software
- Hentai
- Ostatní
Každá kategorie má podkategorie (např. Anime na RAW, Sub/Audio, Hudební video) volitelné uvnitř modálního okna kategorie.
Řazení a filtry
'Záhlaví sloupců v seznamu torrentů jsou klikatelná pro řazení podle daného sloupce (vzestupně nebo sestupně). Dostupné sloupce pro řazení: datum, název, velikost, dokončená stahování. Poznámka: seederé a leecheři jsou živé hodnoty z Redis a nelze je použít k řazení.'
Filtr jazyka
Použijte volič jazyka (ikona vlajky) pro zobrazení pouze torrentů označených konkrétním jazykem.
RSS kanál
RSS kanál na /rss poskytuje nejnovější nahrání. Přidejte ?category=anime (nebo jiný slug kategorie) pro filtrování kanálu. Většina torrent klientů podporuje automatické stahování přes RSS přímo z této URL.
3. Stahování torrentů
Klikněte na libovolný název torrentu pro otevření panelu podrobností. Odtud můžete:
- Stáhnout .torrent — uloží soubor .torrent přímo. Přímá URL je
/torrents/{id}.torrent - Magnetický odkaz — otevře se přímo ve vašem torrent klientovi přes protokol magnet URI. URL je
/torrents/{id}/magnet
Panel podrobností také zobrazuje popis torrentu, seznam souborů, seznam trackerů a počty seederů/leecherů.
Starší stahování odkazů
Starší stahování odkazů AniRena jsou stále podporovány a automaticky přesměrovávají na správný soubor .torrent pomocí starého ID: /dl/{old_id}
Doporučení klienti BitTorrent
Funguje jakýkoli moderní klient BitTorrent. Níže uvedení klienti jsou doporučeni a plně podporují BitTorrent v2 / hybridní torrenty:
4. Vytvoření účtu
Registrace
Klikněte na Registrovat se v navigačním panelu. Zvolte přezdívku, zadejte e-mailovou adresu a nastavte heslo (vynucena minimální délka). Před vytvořením účtu musíte přečíst a přijmout podmínky webu.
Aktivace e-mailem
Po registraci bude na vaši adresu odeslán ověřovací e-mail. Klikněte na odkaz v e-mailu pro aktivaci účtu. Pokud jste ho neobdrželi, použijte odkaz Aktivovat váš účet na přihlašovací stránce pro vyžádání nového kódu.
Obnova hesla
Pokud zapomenete heslo, klikněte na Zapomněli jste heslo na přihlašovací stránce a zadejte svou e-mailovou adresu. Bude vám zaslán obnovovací odkaz. Odkaz je jednorázový a po krátké době vyprší.
5. Nahrání torrentů
Přejděte na Nahrát v navigačním panelu. Musíte být přihlášeni s aktivním, nezakázaným účtem. Stránka nahrávání má dvě záložky:
Záložka Nahrát — odeslat stávající soubor .torrent
Přetáhněte nebo vyberte soubor .torrent. Po načtení vyplňte pole:
| Pole | Povinné | Popis |
|---|---|---|
| Soubor torrentu | Ano | Soubor .torrent k nahrání. |
| Název | Ne | Přepsat název zobrazení torrentu. Pokud je ponecháno prázdné, použije se název vložený do souboru torrentu. |
| Kategorie | Ano | Kategorie obsahu (Anime, Manga, Audio atd.). |
| Podkategorie | Ne | Konkétní typ v rámci kategorie (např. RAW, Sub/Audio). |
| Jazyky | Ne | Jeden nebo více jazykových tagů popisujících jazyk obsahu. |
| Skupina | Ne | Přidružit toto vydání ke skupině, jejíž jste členem. |
| Popis | Ne | Popis ve formátu Markdown zobrazený na stránce podrobností torrentu (max. 65535 znaků). |
| Soukromý | Ne | Nastaví soukromý štítek v torrentu, zakáže DHT/PEX. Užitečné pro torrenty pouze s trackerem. |
| URL pro announce | Ne | Přepsat nebo přidat primární URL announce trackeru. |
| Extra trackery | Ne | Načteno ze souboru torrentu. Nelze upravit při nahrávání — pokud chcete přizpůsobit seznam trackerů, použijte záložku Vytvořit. |
| Komentář | Ne | Přepsat pole komentáře torrentu vložené do souboru. |
Váš torrent musí obsahovat alespoň jednu URL trackeru AniRena v seznamu announce (v jakémkoliv tieru). Stránka to kontroluje při nahrávání a odmítne torrenty, které tracker AniRena neobsahují. Pokud jste torrent vytvořili bez přidání trackeru AniRena, nahrajte ho a poté si ho znovu stáhněte ze stránky — stažený soubor bude mít správné trackery přidány automaticky.
Záložka Vytvořit — sestavit nový torrent
Záložka Vytvořit vám umožňuje generovat nový .torrent od nuly zadáním cest k souborům, URL trackerů a dalších parametrů torrentu přímo v prohlížeči. Výsledný torrent je odeslán se stejnými poli metadat jako výše.
Moderování
Nahrávané torrenty jsou automaticky kontrolovány oproti seznamu zakázaných vzorů obsahu (názvy, názvy souborů, popisy). Torrenty odpovídající zakázanému vzoru budou odmítnuty. Duplicitní torrenty (stejné kontrolní součty) jsou také odmítnuty.
6. Váš účet
Klikněte na svoji přezdívku v pravém horním rohu pro otevření panelu profilu. Je organizováno do sbalitelných sekcí:
Nastavení
Změňte téma UI, velikost písma, barevné schéma, jazyk rozhraní a předvolby zobrazení související s torrenty. Změny jsou ukládány automaticky.
Heslo
Zadejte aktuální heslo a nové heslo dvakrát. Ověřovací kód je odeslán na vaši registrovanou e-mailovou adresu a musí být zadán pro potvrzení změny. Pokud je povoleno dvoufázové ověření, je vyžadován také váš TOTP kód.
Dvoufázové ověření (2FA)
Povolte dvoufázové ověření založené na TOTP pomocí libovolné ověřovací aplikace (např. Google Authenticator, Aegis, Bitwarden). Při povolování 2FA:
- Naskenujte QR kód (nebo zadejte tajný klíč ručně) ve své ověřovací aplikaci.
- Zadejte 6místný kód zobrazený ve vaší aplikaci pro potvrzení nastavení.
- Uložte zobrazené obnovovací kódy — jedná se o jednorázové kódy pro obnovení přístupu, pokud ztratíte zařízení.
Pro zakázání 2FA zadejte aktuální TOTP kód a potvrďte.
Aktivní relace
Zobrazit všechny aktuálně aktivní přihlašovací relace včetně prohlížeče, OS, IP adresy a času posledního přístupu. Klikněte na Odvolat u jakékoli relace, kterou nepoznáváte. Můžete také odvolat všechny relace najednou a odhlásit se ze všech zařízení.
API klíč
Vygenerujte osobní API klíč používaný k programatickému nahrávání torrentů přes AniRena API. Klikněte na Vygenerovat klíč pro vytvoření — celý klíč je zobrazen jednou okamžitě po vygenerování. Uložte ho bezpečně; nebude zobrazen celý znovu. Použijte Odvolat pro trvalé zneplatnění klíče.
Smazat účet
Požadavek na smazání účtu zahájí 30denní lhůtu. Váš účet je okamžitě zakázán a trvale smazán po 30 dnech. Smazání můžete kdykoli v tomto okně zrušit přihlášením a kliknutím na Zrušit smazání.
7. AniRena API
'AniRena poskytuje JSON API, které vám umožňuje nahrávat torrenty programaticky pomocí osobního API klíče. API uplatňuje stejná pravidla jako webové rozhraní: kontroly blokování, limity rychlosti a omezení režimu webu se všechna uplatňují. Každé nahrávání přes API je zaznamenáno v audit logu.'
Ověření
API používá dvoukrokový autentizační tok. Nejprve vyměňte svůj trvalý API klíč za krátkodobý bearer token, poté tento token předejte v hlavičce Authorization každého API požadavku.
Váš API klíč je dostupný v části Váš účet > API klíč. Uchovejte ho v tajnosti — kdokoli ho má, může získat bearer tokeny a nahrávat ve vašem jménu. Pokud dojde ke kompromitaci, okamžitě ho zrušte a vygenerujte nový.
Krok 1 — Získejte bearer token
/api/v1/auth/tokenOdešlete POST požadavek na endpoint tokenu s vaším API klíčem v hlavičce Authorization. Tělo požadavku není potřeba.
Authorization: ApiKey <your-api-key>
Odpověď tokenu
{
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600
}Životnost tokenu
Bearer tokeny zůstávají platné až 3600 sekund od vydání a lze je opakovaně používat pro každé volání, dokud nevyprší. Když token vyprší, vytvořte nový přes POST /api/v1/auth/token. Každá odpověď i nadále vrací aktuální token v hlavičce X-New-Token kvůli zpětné kompatibilitě.
X-New-Token: <next-bearer-token>
Přihlášení jedním požadavkem (s 2FA)
/api/v1/auth/loginOvěřte se uživatelským jménem nebo e-mailem a heslem v jediném požadavku a získejte bearer token přímo. Pokud má váš účet zapnuté 2FA, vložte aktuální kód z autentizátoru do totp_code (nebo záložní kód do recovery_code). Volitelně nastavte new_api_key na true, aby se ve stejné odpovědi vytvořil zcela nový trvalý API klíč.
Tělo požadavku
{
"login": "username or email",
"password": "your-password",
"totp_code": "123456", // vyžadováno, pokud je 2FA zapnuté (6 číslic)
"recovery_code": "", // alternativa k totp_code
"new_api_key": false // nastavte na true pro vytvoření nového API klíče
}Odpověď tokenu
{
"ok": true,
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600,
"api_key": "<new-api-key>" // přítomno pouze když bylo new_api_key true
}Bearer token funguje úplně stejně jako token z /api/v1/auth/token. Pole api_key se vrací jen tehdy, když je new_api_key true — uložte jej ihned, zobrazí se pouze jednou a nahradí jakýkoli předchozí klíč.
Příklad — přihlášení a (volitelně) získání nového API klíče
# 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}"); } }
Krok 2 — Nahrajte torrent
/api/v1/torrentsOdešlete prostý JSON POST požadavek s bearer tokenem v hlavičce Authorization.
Tělo požadavku
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
torrent | string | Ano | Obsah souboru .torrent zakódovaný v Base64. |
category | string | Ano | Slug kategorie: anime, manga, audio, literatura, live, pictures, software, hentai, other. |
name | string | Ne | Přepsat název zobrazení torrentu. |
sub_category | string | Ne | Slug podkategorie (např. raw, sub-audio). Musí patřit do zvolené kategorie. |
languages | string[] | Ne | Pole kódů jazyků BCP 47 (např. en, ja). |
group_id | string | Ne | UUID skupiny, jejíž jste členem, pro přidružení tohoto vydání. |
description | string | Ne | Popis vydání ve formátu Markdown (max. 65535 znaků). |
comment | string | Ne | Přepsat vložené pole komentáře torrentu. |
is_private | boolean | Ne | Nastavte na true pro povolení soukromého štítku v torrentu. |
comments_enabled | boolean | Ne | Povolit komentáře k tomuto torrentu. Výchozí hodnota je true (povoleno). |
anime_id | string | Ne | UUID záznamu anime pro propojení s tímto torrentem. UUID získáte přes GET /api/v1/anime/search. Vrátí 400, pokud UUID neodpovídá žádnému známému záznamu. |
announce | string | Ne | Přepsat nebo přidat primární URL announce. |
trackers | string | Ne | Seznam dalších URL trackerů oddělených novými řádky. Prázdný řádek mezi URL vytvoří novou vrstvu trackeru. |
test | boolean | Ne | Nastavte na true pro suché spuštění: požadavek je plně ověřen, ale torrent není uložen. Použijte to pro ověření správnosti vašich dat před skutečným odesláním. |
Odpověď na úspěšné suché spuštění — 200 OK
{
"ok": true,
"test": true,
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Dostupné kódy jazyků
abaaafaksqamarar-001anhyasavaeayazbmbaeubebnbhbibsbrbgmyyuecachcenyzhzh-HKzh-Hanszh-SGzh-TWcucvkwcocrhrcsdadvnlnl-BEdzenen-USeoeteefofjfilfifrfr-CAffgllgkadede-ATelgnguhthahehzhihohuisioigidiaieiuikgaitjajvklknkrkskkkmkirwrnkvkgkokjkukylolalvlilnltlulbmkmgmsmlmtgvmimrmhmnnanvngnendsenonbnnocorojomospipsfaplptpt-BRpaqurormrusmsgsascgdsrsr-Latnsniisdsiskslsonrsteses-419es-MXsuswsssvtltytgtatttethbotitotstntrtktwukuruguzvevivowacyfywoxhyiyozazuPříklad požadavku
# 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 }
Úspěšná odpověď — 200 OK
{
"ok": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Chybové odpovědi
| HTTP stav | Význam |
|---|---|
400 | Neplatné tělo požadavku nebo chybějící povinné pole. |
401 | Chybějící, expirovaný nebo již rotovaný bearer token. Znovu se ověřte přes POST /api/v1/auth/token. |
403 | Účet zakázán, zakázáno nebo IP blokováno. |
409 | Duplicitní torrent — stejný kontrolní součet již existuje. |
422 | Soubor torrentu nelze parsovat nebo selhal při ověřování (zakázaný vzor, neplatná struktura). |
429 | Překročen limit rychlosti. Zkuste znovu po resetování okna. |
503 | Web je v režimu údržby nebo pouze pro čtení. |
Omezení rychlosti
Nahrávání přes API podléhají konfigurovatelným limitům rychlosti odděleným od webového rozhraní. Limit a okno nastavuje správce webu. Při překročení limitu rychlosti API vrátí 429 Too Many Requests. Limit je na API klíč.
Generování torrent souborů pomocí torrent-builder
torrent-builder je open-source CLI nástroj postavený na libtorrent-rasterbar, který umožňuje vytvářet soubory .torrent ve formátech BitTorrent v1, v2 a hybrid z příkazové řádky. Dokonale se hodí k AniRena upload API — vygenerujte soubor lokálně a pak ho POST přímo na tracker. cantalupo555/torrent-builder.
Sestavení ze zdrojového kódu
Vyžaduje CMake >= 3.28.3 a libtorrent-rasterbar >= 2.0.11. Naklonujte repozitář a sestavte pomocí CMake:
# 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 .
Klíčové přepínače
| Pole | Popis |
|---|---|
--path | Cesta k souboru nebo adresáři k zabalení (povinné). |
--output | Název výstupního souboru .torrent (povinné). |
--version | Formát BitTorrent — 1 = v1, 2 = v2, 3 = hybrid (výchozí: 3). |
--tracker | Přidat URL pro announce trackeru. Přepínač opakujte pro přidání více trackerů. |
--comment | Vložit řetězec komentáře metadat do torrentu. |
--private | Nastavit příznak soukromého pro omezení distribuce pouze na uvedené trackery. |
--piece-size | Velikost části v KB (16-32768). Ponechte nenastavené pro automatický výběr. |
-i | Spustit krokový interaktivní konfigurační režim. |
Kompletní pracovní postup: sestavení -> nahrání
Níže uvedené příklady sestaví hybrid torrent pomocí torrent-builder, poté se ověří v AniRena API a nahrají výsledek v jediném skriptu.
# 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"]); }
Hledání metadat torrentů
/api/v1/torrents/searchOdešlete prostý JSON POST požadavek pro načtení torrent listingů se stejnými možnostmi vyhledávání a filtrování dostupnými na webu. Samotný soubor .torrent není vrácen — pro stažení použijte běžnou download cestu.
# 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"]); }
Parametry vyhledávání
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
q | string | Ne | Hledání volného textu. Podporuje prefixy group:slug, group:"Název", user:jméno. |
category | string | Ne | Slug kategorie (např. "anime"). |
sub_category | string | Ne | Slug podkategorie (např. "raw"). |
languages | string[] | Ne | Pole kódů jazyků BCP 47 (např. en, ja). |
sort | string | Ne | Pole řazení: date (výchozí), size, seeders, leechers, completed, title. |
order | string | Ne | Směr řazení: desc (výchozí) nebo asc. |
page | integer | Ne | Číslo stránky, začínající od 1 (výchozí 1). |
per_page | integer | Ne | Výsledků na stránku, 1–250 (výchozí 50). |
hide_adult | boolean | Ne | Vyloučit torrenty kategorie pro dospělé. Výchozí hodnota true pro běžné uživatele. |
show_dead | boolean | Ne | Pokud je false (výchozí), torrenty starší než lhůta pro mrtvé torrenty bez aktivních seedů jsou vyloučeny. Nastavte na true pro jejich zahrnutí. |
Odpověď
{
"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 — Počet nesmazaných komentářů k tomuto torrentu.
Omezení rychlosti hledání
Požadavky na hledání podléhají oddělené konfigurovatelné limitaci rychlosti (výchozí 60 požadavků za 60 sekund na API klíč). Překročení limitu vrátí 429 Too Many Requests. Účty personálu jsou osvobozeny.
Získat podrobnosti torrentu
/api/v1/torrent/{id}Načte úplná metadata jednoho torrentu — včetně polí, která endpoint vyhledávání vynechává, jako je popis v Markdownu, vložený komentář souboru .torrent, seznam souborů s velikostí každého souboru a kompletní rozvržení trackerů. Pokud jsou dostupné, čtou se živé počty seedů a leecherů z trackeru.
Odpověď
{
"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 — Živé počty z vlastního trackeru; oba hlásí 0, pokud úložiště trackeru nemá záznam pro tento info hash nebo není dostupné.
ext_seeders, ext_leechers — Nejvyšší počet seedů a leecherů hlášený jakýmkoli jednotlivým externím trackerem nascrapovaným pro tento torrent. Trackery sledující stejný swarm se překrývají, takže se používá maximum místo součtu; oba hlásí 0, když žádný tracker nemá data scrape pro tento info hash.
Chybové odpovědi
| HTTP stav | Význam |
|---|---|
400 | ID torrentu musí být buď 36znakové UUID s pomlčkami, nebo 32znakový čistý hexadecimální řetězec. |
401 | Chybějící, expirovaný nebo již rotovaný bearer token. Znovu se ověřte přes POST /api/v1/auth/token. |
404 | Torrent nenalezen. |
429 | Překročen limit rychlosti. Zkuste znovu po resetování okna. |
503 | Web je v režimu údržby nebo pouze pro čtení. |
Načítání komentářů k torrentu
/api/v1/torrents/{id}/commentsNačíst stránkované komentáře k torrentu. Počet komentářů na stránku je řízen nastavením COMMENT_PER_PAGE v souboru .env serveru (výchozí 20). Výsledky vrátí pouze torrenty s povolenými komentáři — všechny ostatní vrátí 403.
Parametry dotazu
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
page | integer | Ne | Číslo stránky, začínající od 1 (výchozí 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"]); }
Odpověď
{
"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
}
]
}Pole body je prázdný řetězec, pokud je autor komentáře zabanován nebo byl komentář smazán. Příznak author_banned určuje, který případ platí.
Chybové odpovědi
| HTTP stav | Význam |
|---|---|
401 | Chybějící, expirovaný nebo již rotovaný bearer token. Znovu se ověřte přes POST /api/v1/auth/token. |
403 | Komentáře jsou pro tento torrent zakázány. |
404 | Torrent nebyl nalezen. |
503 | Web je v režimu údržby nebo pouze pro čtení. |
Vyhledávání anime záznamů
/api/v1/anime/search?q=<query>Vyhledejte záznamy anime podle názvu a získejte jejich UUID. UUID lze předat jako anime_id v těle nahrávání pro propojení torrentu se záznamem anime při nahrávání, nebo použít s PUT /api/torrents/{id}/anime po nahrání. Není vyžadováno ověření. Podléhá stejnému limitu rychlosti jako vyhledávání torrentů (výchozí 60 požadavků za 60 sekund na 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"]);
}Parametry dotazu
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
q | string | Ano | Řetězec pro vyhledávání názvu (povinné). Porovnáváno s názvem a synonymy. |
page | integer | Ne | Číslo stránky, začínající od 1 (výchozí 1). |
per_page | integer | Ne | Výsledků na stránku, 1–50 (výchozí 10). |
Odpověď
{
"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
}
]
}Seznam a načtení skupin
/api/v1/groupsVrací stránkovaný seznam veřejných skupin (aktivovaných a nezamčených). Vyžaduje ověření Bearer tokenem.
/api/v1/groups/{id_or_slug}Vrací jednu veřejnou skupinu podle číselného ID nebo slugu. Vrací 404, pokud je skupina deaktivována nebo zamčena.
Parametry dotazu (pouze seznam)
| Pole | Typ | Povinné | Popis |
|---|---|---|---|
q | string | Ne | Filtrovat podle názvu skupiny (volitelné, shoda podřetězce). |
page | integer | Ne | Číslo stránky (výchozí 1). |
per_page | integer | Ne | Výsledků na stránku, 1–100 (výchozí 20). |
sort | string | Ne | Sloupec řazení: name | slug | members | torrents | created (výchozí name). |
order | string | Ne | Směr řazení: asc nebo desc (výchozí asc). |
Odpověď (seznam)
{
"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"
}
]
}Odpověď (jednoduchá)
{
"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"
}Chybové odpovědi
| HTTP stav | Význam |
|---|---|
401 | Chybějící, expirovaný nebo již rotovaný bearer token. Znovu se ověřte přes POST /api/v1/auth/token. |
404 | Skupina nebyla nalezena nebo není veřejně přístupná. |
429 | Překročen limit rychlosti. Zkuste znovu po resetování okna. |
503 | Web je v režimu údržby nebo pouze pro čtení. |
8. Dary
Pokud chcete podpořit AniRena a pomoci pokrýt náklady na provoz našich serverů a služeb, uvítáme váš příspěvek na jednu z následujících kryptoměnových peněženek:
bc1qy2h3ddq6ak5damvnf4r5vu3ydehhxrcq8gllwn0xCbaFe03832F95F86AF2536d52710e78C63b62Cd33ucetj2XDGHQg9PVRPMxerNi7c6kX7GJkjQNg9yjwGegLbpt61yX3RjGtB1Ef8vgVz6Hr6baQsTjVkJakýchkoliv příspěvků, velkých i malých, si velmi vážíme a míří přímo na provoz AniReny. Děkujeme za Vaši podporu!
9. Software
AniRena Player je bezplatná desktopová aplikace, která vám umožňuje streamovat video přímo z torrentů indexovaných na tomto webu — bez nutnosti čekat na dokončení stahování. Stačí vložit magnet odkaz nebo otevřít soubor .torrent a přehrávání začne, jakmile bude k dispozici dostatek dat.
Obě verze jsou plně samostatné — všechny závislosti jsou zabaleny uvnitř spustitelného souboru. Žádný instalátor, žádné runtime prostředí, stačí stáhnout a spustit.
Instalátor (.exe). Aktualizuje se sám v aplikaci.
Obraz disku (.dmg) pro Macy s Apple Silicon (M1 a novější). Aktualizuje se sám v aplikaci.
Obraz disku (.dmg) pro Macy s Intel. Aktualizuje se sám v aplikaci.
Přenositelný jediný soubor, není potřeba instalace. Jediný formát na Linuxu s automatickou aktualizací v aplikaci.
Instalace: sudo apt install ./<file>.deb — aktualizace přes apt nebo nové stažení, ne v aplikaci.
Instalace: sudo dnf install ./<file>.rpm — aktualizace přes dnf nebo nové stažení, ne v aplikaci.
Sideload na 64bitová zařízení Android ARM (většina moderních telefonů / tabletů). Aktualizace stažením nového APK.
Starší verze
Nainstalujte ručně na 32bitová zařízení Android ARM (starší telefony / tablety). Aktualizace stažením nového APK.