Panduan
1. Bermula
AniRena ialah indeks torrent yang memfokuskan pada anime, manga, audio dan media berkaitan. Anda boleh melayari dan memuat turun torrent tanpa akaun. Akaun diperlukan untuk memuat naik torrent, menyiarkan ke kumpulan atau menggunakan API.
Bar navigasi di bahagian atas menyediakan akses ke kawasan utama laman web:
- Laman Utama — halaman penyenaraian dan carian torrent.
- Muat Naik — hantar torrent baharu (memerlukan log masuk).
- Panduan — halaman ini.
- Statistik — statistik seluruh laman web (torrent, rakan sebaya, muat naik dari masa ke masa).
- Kumpulan — direktori kumpulan keluaran.
- RSS — suapan RSS muat naik terkini, boleh ditapis mengikut kategori.
Menu akaun anda (sudut kanan atas apabila log masuk) membuka panel profil di mana anda boleh melaraskan tetapan, mengurus pilihan keselamatan dan mengakses kunci API anda.
2. Melayari & Mencari
Halaman utama menyenaraikan semua torrent mengikut tarikh muat naik. Gunakan bar carian di bahagian atas untuk menapis keputusan.
Carian asas
Taip sebarang perkataan ke dalam bar carian dan tekan Enter (atau klik ikon carian). Keputusan disusun mengikut kesesuaian apabila pertanyaan aktif.
Operator carian
Operator berikut boleh digabungkan dengan pertanyaan biasa:
| Pengendali | Contoh | Kesan |
|---|---|---|
user:"name" | user:"SubsPlease" | Tunjukkan hanya torrent yang dimuat naik oleh pengguna tersebut. |
Mengklik nama pemuat naik dalam senarai torrent secara automatik menjalankan carian pengguna untuk anda.
Kategori & sub-kategori
Gunakan pemilih kategori (ikon grid di sebelah bar carian) untuk mengehadkan keputusan kepada satu kategori. Kategori yang tersedia ialah:
- Anime
- Manga/Manhwa/Komik
- Audio
- Sastera
- Aksi Langsung
- Gambar
- Perisian
- Hentai
- Lain-lain
Setiap kategori mempunyai sub-kategori (cth. Anime ke RAW, Sub/Audio, Video Muzik) yang boleh dipilih dalam modal kategori.
Penyusunan & penapis
Pengepala lajur dalam senarai torrent boleh diklik untuk menyusun mengikut lajur tersebut (menaik atau menurun). Lajur susun yang tersedia: tarikh, nama, saiz, muat turun selesai. Nota: seeder dan leecher ialah nilai masa nyata daripada Redis dan tidak boleh digunakan untuk menyusun.
Penapis bahasa
Gunakan pemilih bahasa (ikon bendera) untuk menunjukkan hanya torrent yang ditag dengan bahasa tertentu.
Suapan RSS
Suapan RSS di /rss menyediakan muat naik terkini. Tambah ?category=anime (atau slug kategori lain) untuk menapis suapan. Kebanyakan klien torrent menyokong muat turun automatik RSS terus dari URL ini.
3. Memuat Turun Torrent
Klik mana-mana nama torrent untuk membuka panel butirannya. Dari sana anda boleh:
- Muat Turun .torrent — menyimpan fail .torrent secara langsung. URL terus ialah
/torrents/{id}.torrent - Pautan magnet — membuka terus dalam klien torrent anda melalui protokol URI magnet. URL ialah
/torrents/{id}/magnet
Panel butiran juga menunjukkan penerangan torrent, senarai fail, senarai tracker dan kiraan seeder/leecher.
Pautan muat turun lama
Pautan muat turun AniRena lama masih disokong dan mengalihkan secara automatik ke fail .torrent yang betul menggunakan ID warisan: /dl/{old_id}
Klien BitTorrent yang disyorkan
Mana-mana klien BitTorrent moden berfungsi. Klien di bawah disyorkan dan menyokong sepenuhnya BitTorrent v2 / torrent hibrid:
4. Mencipta Akaun
Pendaftaran
Klik Daftar dalam bar navigasi. Pilih nama pengguna, berikan alamat e-mel dan tetapkan kata laluan (panjang minimum dikuatkuasakan). Anda mesti membaca dan menerima terma laman web sebelum akaun anda dicipta.
Pengaktifan e-mel
Selepas mendaftar, e-mel pengesahan dihantar ke alamat anda. Klik pautan dalam e-mel untuk mengaktifkan akaun anda. Jika anda tidak menerimanya, gunakan pautan Aktifkan akaun anda di halaman log masuk untuk meminta kod baharu.
Pemulihan kata laluan
Jika anda terlupa kata laluan, klik Lupa kata laluan di halaman log masuk dan masukkan alamat e-mel anda. Pautan pemulihan akan dihantar kepada anda. Pautan ini untuk sekali guna dan tamat tempoh selepas masa yang singkat.
5. Memuat Naik Torrent
Navigasi ke Muat Naik dalam bar navigasi. Anda mesti log masuk dengan akaun aktif yang tidak diharamkan. Halaman muat naik mempunyai dua tab:
Tab Muat Naik — hantar fail .torrent sedia ada
Seret-dan-lepas atau pilih fail .torrent. Setelah dimuatkan, isi medan:
| Medan | Diperlukan | Penerangan |
|---|---|---|
| Fail torrent | Ya | Fail .torrent untuk dimuat naik. |
| Nama | Tidak | Gantikan nama paparan torrent. Jika dibiarkan kosong, nama yang tertanam dalam fail torrent digunakan. |
| Kategori | Ya | Kategori kandungan (Anime, Manga, Audio, dsb.). |
| Sub-kategori | Tidak | Jenis yang lebih spesifik dalam kategori (cth. RAW, Sub/Audio). |
| Bahasa | Tidak | Satu atau lebih tag bahasa yang menggambarkan bahasa kandungan. |
| Kumpulan | Tidak | Kaitkan keluaran ini dengan kumpulan yang anda ahlinya. |
| Penerangan | Tidak | Penerangan berformat Markdown yang ditunjukkan di halaman butiran torrent (maks 65535 aksara). |
| Peribadi | Tidak | Menetapkan bendera peribadi dalam torrent, melumpuhkan DHT/PEX. Berguna untuk torrent tracker sahaja. |
| URL Announce | Tidak | Gantikan atau tambah URL announce tracker utama. |
| Tracker tambahan | Tidak | Dibaca dari fail torrent. Tidak boleh diubah semasa muat naik — gunakan tab Buat jika anda ingin menyesuaikan senarai tracker. |
| Komen | Tidak | Gantikan medan komen torrent yang tertanam dalam fail. |
Torrent anda mesti menyertakan sekurang-kurangnya satu URL tracker AniRena dalam senarai announce (mana-mana tier). Laman web menyemak ini semasa muat naik dan akan menolak torrent yang tidak menyertakan tracker AniRena. Jika anda mencipta torrent tanpa menambah tracker AniRena terlebih dahulu, muat naik dan muat turun semula dari laman web — fail yang dimuat turun akan mempunyai tracker yang betul secara automatik.
Tab Cipta — bina torrent baharu
Tab Cipta membolehkan anda menjana .torrent baharu dari awal dengan menentukan laluan fail, URL tracker dan parameter torrent lain terus dalam pelayar. Torrent yang dihasilkan dihantar dengan medan metadata yang sama seperti di atas.
Moderasi
Muat naik disemak secara automatik terhadap senarai corak kandungan yang diharamkan (nama, nama fail, penerangan). Torrent yang sepadan dengan corak yang diharamkan akan ditolak. Torrent pendua (info hash yang sama) juga ditolak.
6. Akaun Anda
Klik nama pengguna anda di sudut kanan atas untuk membuka panel profil. Ia dianjurkan dalam bahagian yang boleh diruntuhkan:
Tetapan
Tukar tema UI, saiz fon, skema warna, bahasa antara muka dan keutamaan paparan berkaitan torrent. Perubahan disimpan secara automatik.
Kata Laluan
Masukkan kata laluan semasa anda dan kata laluan baharu dua kali. Kod pengesahan dihantar ke alamat e-mel berdaftar anda dan mesti dimasukkan untuk mengesahkan perubahan. Jika pengesahan dua faktor diaktifkan, kod TOTP anda juga diperlukan.
Pengesahan Dua Faktor (2FA)
Aktifkan pengesahan dua faktor berasaskan TOTP menggunakan mana-mana aplikasi pengesah (cth. Google Authenticator, Aegis, Bitwarden). Apabila mengaktifkan 2FA:
- Imbas kod QR (atau masukkan rahsia secara manual) dalam aplikasi pengesah anda.
- Masukkan kod 6 digit yang ditunjukkan dalam aplikasi anda untuk mengesahkan persediaan.
- Simpan kod pemulihan yang ditunjukkan — ini adalah kod sekali guna untuk mendapatkan semula akses jika anda kehilangan peranti anda.
Untuk melumpuhkan 2FA, masukkan kod TOTP semasa anda dan sahkan.
Sesi Aktif
Lihat semua sesi log masuk yang aktif pada masa ini termasuk pelayar, OS, alamat IP dan masa terakhir dilihat. Klik Batalkan pada mana-mana sesi yang tidak anda kenali. Anda juga boleh membatalkan semua sesi sekaligus untuk log keluar setiap peranti.
Kunci API
Jana kunci API peribadi yang digunakan untuk memuat naik torrent secara program melalui API AniRena. Klik Jana Kunci untuk mencipta satu — kunci penuh ditunjukkan sekali segera selepas penjanaan. Simpan dengan selamat; ia tidak akan ditunjukkan sepenuhnya lagi. Gunakan Batalkan untuk membatalkan kunci secara kekal.
Padam Akaun
Meminta pemadaman akaun memulakan tempoh penangguhan 30 hari. Akaun anda dilumpuhkan dengan serta-merta dan dipadam secara kekal selepas 30 hari. Anda boleh membatalkan pemadaman pada bila-bila masa dalam tempoh tersebut dengan log masuk dan mengklik Batal pemadaman.
7. API AniRena
AniRena menyediakan API JSON yang membolehkan anda memuat naik torrent secara program menggunakan kunci API peribadi. API menerapkan peraturan yang sama seperti antara muka web: semakan larangan, had kadar dan sekatan mod laman web semuanya terpakai. Setiap muat naik API direkodkan dalam log audit.
Pengesahan
API menggunakan aliran pengesahan dua langkah. Pertama, tukar kunci API kekal anda dengan token pembawa jangka pendek, kemudian hantar token itu dalam pengepala Authorization setiap permintaan API.
Kunci API anda tersedia di Akaun Anda > Kunci API. Rahsiakan — sesiapa yang mempunyai kunci boleh mendapatkan token pembawa dan memuat naik bagi pihak anda. Jika terjejas, batalkan segera dan buat yang baharu.
Langkah 1 — Dapatkan token pembawa
/api/v1/auth/tokenHantar permintaan POST ke endpoint token dengan kunci API anda dalam pengepala Authorization. Tiada badan permintaan diperlukan.
Authorization: ApiKey <your-api-key>
Respons token
{
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600
}Tempoh hayat token
Token Bearer kekal sah sehingga 3600 saat dari masa ia dikeluarkan dan boleh digunakan semula untuk setiap panggilan sehingga tamat tempoh. Apabila token tamat tempoh, hasilkan yang baru melalui POST /api/v1/auth/token. Setiap respons masih mengembalikan token semasa dalam pengepala X-New-Token untuk keserasian ke belakang.
X-New-Token: <next-bearer-token>
Log masuk satu permintaan (dengan 2FA)
/api/v1/auth/loginSahkan dengan nama pengguna atau e-mel dan kata laluan anda dalam satu permintaan dan terima token bearer secara terus. Jika akaun anda mengaktifkan 2FA, sertakan kod pengesah semasa anda dalam totp_code (atau kod pemulihan dalam recovery_code). Secara pilihan, tetapkan new_api_key kepada true untuk turut menjana kunci API kekal yang baharu dalam respons yang sama.
Badan permintaan
{
"login": "username or email",
"password": "your-password",
"totp_code": "123456", // diperlukan jika 2FA diaktifkan (6 digit)
"recovery_code": "", // alternatif kepada totp_code
"new_api_key": false // tetapkan true untuk turut menjana kunci API baharu
}Respons token
{
"ok": true,
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600,
"api_key": "<new-api-key>" // hadir hanya apabila new_api_key ialah true
}Token bearer berfungsi sama seperti yang diperoleh daripada /api/v1/auth/token. Medan api_key hanya dikembalikan apabila new_api_key ialah true — simpan ia dengan segera kerana ia dipaparkan sekali sahaja dan menggantikan sebarang kunci terdahulu.
Contoh — log masuk dan (pilihan) dapatkan kunci API baharu
# 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}"); } }
Langkah 2 — Muat naik torrent
/api/v1/torrentsHantar permintaan POST JSON biasa dengan token pembawa dalam pengepala Authorization.
Badan permintaan
| Medan | Jenis | Diperlukan | Penerangan |
|---|---|---|---|
torrent | string | Ya | Kandungan fail .torrent dikodkan Base64. |
category | string | Ya | Slug kategori: anime, manga, audio, literature, live, pictures, software, hentai, other. |
name | string | Tidak | Gantikan nama paparan torrent. |
sub_category | string | Tidak | Slug sub-kategori (cth. raw, sub-audio). Mesti tergolong dalam kategori yang dipilih. |
languages | string[] | Tidak | Tatasusunan kod bahasa BCP 47 (cth. en, ja). |
group_id | string | Tidak | UUID kumpulan yang anda ahlinya untuk mengaitkan keluaran ini. |
description | string | Tidak | Penerangan keluaran berformat Markdown (maks 65535 aksara). |
comment | string | Tidak | Gantikan medan komen tertanam torrent. |
is_private | boolean | Tidak | Tetapkan kepada true untuk mengaktifkan bendera peribadi dalam torrent. |
comments_enabled | boolean | Tidak | Benarkan ulasan pada torrent ini. Lalai kepada true (diaktifkan). |
anime_id | string | Tidak | UUID entri anime untuk dikaitkan dengan torrent ini. Dapatkan UUID melalui GET /api/v1/anime/search. Mengembalikan 400 jika UUID tidak sepadan dengan mana-mana entri yang diketahui. |
announce | string | Tidak | Gantikan atau tambah URL announce utama. |
trackers | string | Tidak | Senarai URL tracker tambahan yang dipisahkan baris baharu. Baris kosong antara URL mencipta peringkat tracker baharu. |
test | boolean | Tidak | Tetapkan kepada true untuk menjalankan ujian kering: permintaan disahkan sepenuhnya tetapi torrent tidak disimpan. Gunakan ini untuk mengesahkan muatan anda betul sebelum penyerahan sebenar. |
Respons kejayaan ujian kering — 200 OK
{
"ok": true,
"test": true,
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Kod bahasa yang tersedia
abaaafaksqamarar-001anhyasavaeayazbmbaeubebnbhbibsbrbgmyyuecachcenyzhzh-HKzh-Hanszh-SGzh-TWcucvkwcocrhrcsdadvnlnl-BEdzenen-USeoeteefofjfilfifrfr-CAffgllgkadede-ATelgnguhthahehzhihohuisioigidiaieiuikgaitjajvklknkrkskkkmkirwrnkvkgkokjkukylolalvlilnltlulbmkmgmsmlmtgvmimrmhmnnanvngnendsenonbnnocorojomospipsfaplptpt-BRpaqurormrusmsgsascgdsrsr-Latnsniisdsiskslsonrsteses-419es-MXsuswsssvtltytgtatttethbotitotstntrtktwukuruguzvevivowacyfywoxhyiyozazuContoh permintaan
# 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 }
Respons kejayaan — 200 OK
{
"ok": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Respons ralat
| Status HTTP | Maksud |
|---|---|
400 | Badan permintaan tidak sah atau medan diperlukan tiada. |
401 | Token pembawa hilang, tamat tempoh, atau sudah dipusing. Sahkan semula melalui POST /api/v1/auth/token. |
403 | Akaun diharamkan, dilumpuhkan, atau IP disekat. |
409 | Torrent pendua — info hash yang sama sudah wujud. |
422 | Fail torrent tidak dapat dihurai atau gagal pengesahan (corak diharamkan, struktur tidak sah). |
429 | Had kadar melebihi. Cuba semula selepas tetingkap ditetapkan semula. |
503 | Laman web dalam mod penyelenggaraan atau baca sahaja. |
Had kadar
Muat naik API tertakluk kepada had kadar yang boleh dikonfigurasi berasingan daripada antara muka web. Had dan tetingkap ditetapkan oleh pentadbir laman web. Apabila had kadar melebihi, API mengembalikan 429 Too Many Requests. Had adalah setiap kunci API.
Menjana fail torrent dengan torrent-builder
torrent-builder ialah alat CLI sumber terbuka yang dibina di atas libtorrent-rasterbar yang membolehkan anda membuat fail .torrent BitTorrent v1, v2, dan hybrid dari baris perintah. Ia sesuai dengan AniRena upload API — jana fail secara tempatan, kemudian POST terus ke tracker. cantalupo555/torrent-builder.
Membina daripada kod sumber
Memerlukan CMake >= 3.28.3 dan libtorrent-rasterbar >= 2.0.11. Klon repositori dan bina dengan 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 .
Bendera utama
| Medan | Penerangan |
|---|---|
--path | Laluan ke fail atau direktori untuk dipaketkan (diperlukan). |
--output | Nama fail .torrent output (diperlukan). |
--version | Format BitTorrent — 1 = v1, 2 = v2, 3 = hybrid (lalai: 3). |
--tracker | Tambah URL announce tracker. Ulangi bendera untuk menambah pelbagai tracker. |
--comment | Benamkan rentetan komen metadata ke dalam torrent. |
--private | Tetapkan bendera peribadi untuk menyekat pengedaran kepada tracker yang disenaraikan sahaja. |
--piece-size | Saiz kepingan dalam KB (16-32768). Biarkan tidak ditetapkan untuk pemilihan automatik. |
-i | Lancarkan mod konfigurasi interaktif langkah demi langkah. |
Aliran kerja lengkap: bina -> muat naik
Contoh di bawah membina torrent hybrid dengan torrent-builder, kemudian mengesahkan dengan AniRena API dan memuat naik hasilnya dalam satu skrip.
# 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"]); }
Mencari metadata torrent
/api/v1/torrents/searchHantar permintaan POST JSON biasa untuk mendapatkan senarai torrent dengan pilihan carian dan penapis yang sama seperti di laman web. Fail .torrent itu sendiri tidak dikembalikan — gunakan laluan muat turun biasa untuk itu.
# 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"]); }
Parameter carian
| Medan | Jenis | Diperlukan | Penerangan |
|---|---|---|---|
q | string | Tidak | Carian teks bebas. Menyokong awalan group:slug, group:"Nama", user:nama. |
category | string | Tidak | Slug kategori (cth. "anime"). |
sub_category | string | Tidak | Slug sub-kategori (cth. "raw"). |
languages | string[] | Tidak | Tatasusunan kod bahasa BCP 47 (cth. en, ja). |
sort | string | Tidak | Medan susun: date (lalai), size, seeders, leechers, completed, title. |
order | string | Tidak | Arah susun: desc (lalai) atau asc. |
page | integer | Tidak | Nombor halaman, bermula dari 1 (lalai 1). |
per_page | integer | Tidak | Keputusan setiap halaman, 1–250 (lalai 50). |
hide_adult | boolean | Tidak | Kecualikan torrent kategori dewasa. Lalai true untuk pengguna biasa. |
show_dead | boolean | Tidak | Apabila false (lalai), torrent yang lebih lama daripada tempoh grace torrent mati dan tiada seeder aktif dikecualikan. Tetapkan kepada true untuk memasukkannya. |
Respons
{
"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 — Bilangan komen yang tidak dipadam pada torrent ini.
Had kadar carian
Permintaan carian tertakluk kepada had kadar yang boleh dikonfigurasi berasingan (lalai 60 permintaan per 60 saat per kunci API). Melebihi had mengembalikan 429 Too Many Requests. Akaun kakitangan dikecualikan.
Dapatkan butiran torrent
/api/v1/torrent/{id}Mendapatkan metadata lengkap untuk satu torrent — termasuk medan yang tidak dipulangkan oleh endpoint carian seperti penerangan Markdown, komen .torrent yang disertakan, senarai fail dengan saiz setiap fail, dan susun atur lengkap tier tracker. Kiraan langsung seeder dan leecher dibaca daripada tracker apabila tersedia.
Respons
{
"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 — Kiraan langsung dari tracker dalaman; kedua-duanya melaporkan 0 apabila stor tracker tidak mempunyai entri untuk info hash ini atau tidak boleh dicapai.
ext_seeders, ext_leechers — Bilangan tertinggi seeder dan leecher yang dilaporkan oleh mana-mana tracker luaran tunggal yang di-scrape untuk torrent ini. Tracker yang menjejaki swarm yang sama bertindih, jadi maksimum digunakan dan bukannya jumlah; kedua-duanya melaporkan 0 apabila tiada tracker mempunyai data scrape untuk info hash ini.
Respons ralat
| Status HTTP | Maksud |
|---|---|
400 | Id torrent mestilah UUID 36 aksara dengan sengkang atau rentetan heksadesimal mentah 32 aksara. |
401 | Token pembawa hilang, tamat tempoh, atau sudah dipusing. Sahkan semula melalui POST /api/v1/auth/token. |
404 | Torrent tidak ditemui. |
429 | Had kadar melebihi. Cuba semula selepas tetingkap ditetapkan semula. |
503 | Laman web dalam mod penyelenggaraan atau baca sahaja. |
Mendapatkan komen torrent
/api/v1/torrents/{id}/commentsMendapatkan komen halaman demi halaman untuk torrent. Bilangan komen setiap halaman dikawal oleh tetapan COMMENT_PER_PAGE dalam fail .env pelayan (lalai 20). Hanya torrent dengan komen yang diaktifkan akan mengembalikan hasil — semua yang lain mengembalikan 403.
Parameter pertanyaan
| Medan | Jenis | Diperlukan | Penerangan |
|---|---|---|---|
page | integer | Tidak | Nombor halaman, bermula dari 1 (lalai 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"]); }
Respons
{
"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
}
]
}Medan body adalah rentetan kosong apabila pengarang komen diharamkan atau komen telah dipadam. Bendera author_banned menunjukkan kes yang mana terpakai.
Respons ralat
| Status HTTP | Maksud |
|---|---|
401 | Token pembawa hilang, tamat tempoh, atau sudah dipusing. Sahkan semula melalui POST /api/v1/auth/token. |
403 | Komen dilumpuhkan untuk torrent ini. |
404 | Torrent tidak dijumpai. |
503 | Laman web dalam mod penyelenggaraan atau baca sahaja. |
Mencari entri anime
/api/v1/anime/search?q=<query>Cari entri anime mengikut tajuk untuk mendapatkan UUID mereka. UUID boleh dihantar sebagai anime_id dalam badan muat naik untuk mengaitkan torrent dengan entri anime pada masa muat naik, atau digunakan dengan PUT /api/torrents/{id}/anime selepas muat naik. Tiada pengesahan diperlukan. Tertakluk kepada had kadar yang sama seperti carian torrent (lalai 60 permintaan per 60 saat per 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"]);
}Parameter pertanyaan
| Medan | Jenis | Diperlukan | Penerangan |
|---|---|---|---|
q | string | Ya | Rentetan carian tajuk (diperlukan). Dipadankan dengan tajuk dan sinonim. |
page | integer | Tidak | Nombor halaman, bermula dari 1 (lalai 1). |
per_page | integer | Tidak | Keputusan setiap halaman, 1–50 (lalai 10). |
Respons
{
"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
}
]
}Senarai dan dapatkan kumpulan
/api/v1/groupsMengembalikan senarai halaman kumpulan awam (diaktifkan dan tidak dikunci). Memerlukan pengesahan token Bearer.
/api/v1/groups/{id_or_slug}Mengembalikan satu kumpulan awam mengikut ID angka atau slug. Mengembalikan 404 jika kumpulan dilumpuhkan atau dikunci.
Parameter pertanyaan (senarai sahaja)
| Medan | Jenis | Diperlukan | Penerangan |
|---|---|---|---|
q | string | Tidak | Tapis mengikut nama kumpulan (pilihan, padanan subrentetan). |
page | integer | Tidak | Nombor halaman (lalai 1). |
per_page | integer | Tidak | Keputusan setiap halaman, 1–100 (lalai 20). |
sort | string | Tidak | Lajur pengisihan: name | slug | members | torrents | created (lalai name). |
order | string | Tidak | Arah pengisihan: asc atau desc (lalai asc). |
Tindak balas (senarai)
{
"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"
}
]
}Tindak balas (tunggal)
{
"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"
}Respons ralat
| Status HTTP | Maksud |
|---|---|
401 | Token pembawa hilang, tamat tempoh, atau sudah dipusing. Sahkan semula melalui POST /api/v1/auth/token. |
404 | Kumpulan tidak dijumpai atau tidak boleh diakses secara awam. |
429 | Had kadar melebihi. Cuba semula selepas tetingkap ditetapkan semula. |
503 | Laman web dalam mod penyelenggaraan atau baca sahaja. |
8. Derma
Jika anda ingin menyokong AniRena dan membantu menanggung kos pengehosan pelayan dan perkhidmatan kami, anda dialu-alukan untuk menghantar sumbangan ke salah satu dompet mata wang kripto berikut:
bc1qy2h3ddq6ak5damvnf4r5vu3ydehhxrcq8gllwn0xCbaFe03832F95F86AF2536d52710e78C63b62Cd33ucetj2XDGHQg9PVRPMxerNi7c6kX7GJkjQNg9yjwGegLbpt61yX3RjGtB1Ef8vgVz6Hr6baQsTjVkSebarang sumbangan, besar atau kecil, amat dihargai dan terus digunakan untuk mengekalkan AniRena. Terima kasih atas sokongan anda!
9. Perisian
AniRena Player ialah aplikasi desktop percuma yang membolehkan anda menstrim video terus daripada torrent yang diindeks di laman ini — tanpa perlu menunggu muat turun penuh selesai. Hanya tampal pautan magnet atau buka fail .torrent, dan main balik akan bermula sebaik sahaja data yang mencukupi tersedia.
Kedua-dua binaan adalah bebas sepenuhnya — semua kebergantungan disertakan di dalam fail boleh laksana. Tiada pemasang, tiada masa jalan yang perlu disediakan — muat turun dan jalankan sahaja.
Pemasang (.exe). Mengemas kini sendiri dalam aplikasi.
Imej cakera (.dmg) untuk Mac Apple Silicon (M1 dan lebih baharu). Mengemas kini sendiri dalam aplikasi.
Imej cakera (.dmg) untuk Mac Intel. Mengemas kini sendiri dalam aplikasi.
Fail tunggal mudah alih, tidak perlu pemasangan. Satu-satunya format Linux dengan kemas kini automatik dalam aplikasi.
Pemasangan: sudo apt install ./<file>.deb — dikemas kini melalui apt atau muat turun baharu, bukan dalam aplikasi.
Pemasangan: sudo dnf install ./<file>.rpm — dikemas kini melalui dnf atau muat turun baharu, bukan dalam aplikasi.
Sideload pada peranti Android ARM 64-bit (kebanyakan telefon / tablet moden). Kemas kini dengan memuat turun APK baharu.
Versi lama
Sideload pada peranti Android ARM 32-bit (telefon / tablet lama). Dikemas kini dengan memuat turun APK baharu.