Οδηγός
1. Ξεκινώντας
Το AniRena είναι ένας δείκτης torrent εστιασμένος σε anime, manga, ήχο και σχετικά μέσα. Μπορείτε να περιηγηθείτε και να κατεβάσετε torrents χωρίς λογαριασμό. Ο λογαριασμός απαιτείται για μεταφόρτωση torrents, δημοσίευση σε ομάδες ή χρήση API.
Η γραμμή πλοήγησης στην κορυφή παρέχει πρόσβαση στις κύριες περιοχές του ιστότοπου:
- Αρχική — η σελίδα καταλόγου και αναζήτησης torrent.
- Μεταφόρτωση — υποβολή νέου torrent (απαιτεί σύνδεση).
- Οδηγός — αυτή η σελίδα.
- Στατιστικά — στατιστικά σε επίπεδο ιστότοπου.
- Ομάδες — κατάλογος ομάδων κυκλοφορίας.
- RSS — ροή RSS πρόσφατων μεταφορτώσεων.
Το μενού λογαριασμού σας (επάνω δεξιά γωνία όταν είστε συνδεδεμένοι) ανοίγει έναν πίνακα προφίλ.
2. Περιήγηση & Αναζήτηση
Η αρχική σελίδα εμφανίζει όλα τα torrents ταξινομημένα κατά ημερομηνία μεταφόρτωσης. Χρησιμοποιήστε τη γραμμή αναζήτησης στην κορυφή για φιλτράρισμα αποτελεσμάτων.
Βασική αναζήτηση
Πληκτρολογήστε οποιεσδήποτε λέξεις στη γραμμή αναζήτησης και πατήστε Enter.
Τελεστές αναζήτησης
Οι παρακάτω τελεστές μπορούν να συνδυαστούν με ένα κανονικό ερώτημα:
| Τελεστής | Παράδειγμα | Αποτέλεσμα |
|---|---|---|
user:"name" | user:"SubsPlease" | Εμφάνιση μόνο torrents που μεταφορτώθηκαν από αυτόν τον χρήστη. |
Κάνοντας κλικ σε όνομα μεταφορτωτή στη λίστα torrent εκτελείται αυτόματα αναζήτηση χρήστη.
Κατηγορίες & υποκατηγορίες
Χρησιμοποιήστε τον επιλογέα κατηγορίας για περιορισμό αποτελεσμάτων σε μία κατηγορία.
- Anime
- Manga/Manhwa/Comic
- Ήχος
- Λογοτεχνία
- Live Action
- Εικόνες
- Λογισμικό
- Hentai
- Άλλο
Κάθε κατηγορία έχει υποκατηγορίες.
Ταξινόμηση & φίλτρα
Τα κεφαλίδια στηλών στη λίστα torrent είναι κλικ για ταξινόμηση. Σημείωση: οι seeders και leechers είναι ζωντανές τιμές από το Redis και δεν μπορούν να χρησιμοποιηθούν για ταξινόμηση.
Φίλτρο γλώσσας
Χρησιμοποιήστε τον επιλογέα γλώσσας για εμφάνιση μόνο torrents με συγκεκριμένη γλώσσα.
Ροή RSS
Η ροή RSS στο /rss παρέχει τις πιο πρόσφατες μεταφορτώσεις.
3. Λήψη Torrents
Κάντε κλικ σε οποιοδήποτε όνομα torrent για να ανοίξετε τον πίνακα λεπτομερειών. Από εκεί μπορείτε:
- Λήψη .torrent — αποθηκεύει το αρχείο .torrent απευθείας. Η άμεση URL είναι
/torrents/{id}.torrent - Σύνδεσμος μαγνήτη — ανοίγει απευθείας στον client torrent σας μέσω του πρωτοκόλλου magnet URI. Η URL είναι
/torrents/{id}/magnet
Ο πίνακας λεπτομερειών εμφανίζει επίσης την περιγραφή, τη λίστα αρχείων, τη λίστα trackers και τις μετρήσεις seeders/leechers.
Παλαιοί σύνδεσμοι λήψης
Οι παλαιοί σύνδεσμοι λήψης AniRena υποστηρίζονται ακόμη και ανακατευθύνουν αυτόματα. /dl/{old_id}
Προτεινόμενοι πελάτες BitTorrent
Οποιοσδήποτε σύγχρονος πελάτης BitTorrent λειτουργεί. Οι παρακάτω πελάτες συνιστώνται και υποστηρίζουν πλήρως BitTorrent v2 / υβριδικά torrents:
4. Δημιουργία λογαριασμού
Εγγραφή
Κάντε κλικ στο Εγγραφή στη γραμμή πλοήγησης. Επιλέξτε όνομα χρήστη, δώστε email και ορίστε κωδικό.
Ενεργοποίηση email
Μετά την εγγραφή, αποστέλλεται email επαλήθευσης. Κάντε κλικ στον σύνδεσμο για ενεργοποίηση λογαριασμού.
Ανάκτηση κωδικού
Αν ξεχάσετε τον κωδικό, κάντε κλικ στο Ξεχάσατε τον κωδικό στη σελίδα σύνδεσης.
5. Μεταφόρτωση Torrents
Μεταβείτε στο Μεταφόρτωση στη γραμμή πλοήγησης. Πρέπει να είστε συνδεδεμένοι με ενεργό λογαριασμό.
Καρτέλα μεταφόρτωσης — υποβολή υπάρχοντος αρχείου .torrent
Σύρετε και αποθέστε ή επιλέξτε αρχείο .torrent.
| Πεδίο | Απαιτείται | Περιγραφή |
|---|---|---|
| Αρχείο torrent | Ναι | Το αρχείο .torrent για μεταφόρτωση. |
| Όνομα | Όχι | Παράκαμψη του εμφανιζόμενου ονόματος torrent. |
| Κατηγορία | Ναι | Η κατηγορία περιεχομένου (Anime, Manga, Ήχος κ.λπ.). |
| Υποκατηγορία | Όχι | Πιο συγκεκριμένος τύπος εντός κατηγορίας. |
| Γλώσσες | Όχι | Μία ή περισσότερες ετικέτες γλώσσας. |
| Ομάδα | Όχι | Συσχετισμός αυτής της κυκλοφορίας με ομάδα της οποίας είστε μέλος. |
| Περιγραφή | Όχι | Περιγραφή μορφής Markdown (έως 65535 χαρακτήρες). |
| Ιδιωτικό | Όχι | Ορίζει τη σημαία ιδιωτικού, απενεργοποιώντας DHT/PEX. |
| URL ανακοίνωσης | Όχι | Παράκαμψη ή προσθήκη κύριας URL ανακοίνωσης tracker. |
| Επιπλέον trackers | Όχι | Διαβάζεται από το αρχείο torrent. Δεν μπορεί να τροποποιηθεί κατά τη μεταφόρτωση — χρησιμοποιήστε την καρτέλα Δημιουργία αν θέλετε να προσαρμόσετε τη λίστα trackers. |
| Σχόλιο | Όχι | Παράκαμψη του πεδίου σχολίου που είναι ενσωματωμένο στο αρχείο. |
Το torrent σας πρέπει να περιλαμβάνει τουλάχιστον μία URL tracker του AniRena στη λίστα announce (σε οποιοδήποτε tier). Ο ιστότοπος το ελέγχει κατά τη μεταφόρτωση και θα απορρίψει torrents που δεν περιλαμβάνουν tracker AniRena. Αν δημιουργήσατε το torrent χωρίς να προσθέσετε πρώτα το tracker AniRena, ανεβάστε το και μετά κατεβάστε το ξανά από τον ιστότοπο — το αρχείο που θα κατεβάσετε θα έχει αυτόματα τα σωστά trackers.
Καρτέλα δημιουργίας — δημιουργία νέου torrent
Η καρτέλα Δημιουργία σάς επιτρέπει να δημιουργήσετε νέο .torrent από το μηδέν.
Συντονισμός
Οι μεταφορτώσεις ελέγχονται αυτόματα έναντι λίστας απαγορευμένων μοτίβων. Τα διπλότυπα torrents απορρίπτονται επίσης.
6. Ο λογαριασμός σας
Κάντε κλικ στο όνομα χρήστη σας στην επάνω δεξιά γωνία για να ανοίξετε τον πίνακα προφίλ.
Ρυθμίσεις
Αλλάξτε το θέμα UI, το μέγεθος γραμματοσειράς, τη χρωματική παλέτα, τη γλώσσα διεπαφής.
Κωδικός
Εισάγετε τον τρέχοντα κωδικό και τον νέο κωδικό δύο φορές.
Επαλήθευση δύο παραγόντων (2FA)
Ενεργοποιήστε επαλήθευση δύο παραγόντων βάσει TOTP χρησιμοποιώντας οποιαδήποτε εφαρμογή επαλήθευσης.
- Σαρώστε τον κωδικό QR (ή εισάγετε το μυστικό χειροκίνητα) στην εφαρμογή επαλήθευσης.
- Εισάγετε τον 6ψήφιο κωδικό που εμφανίζεται στην εφαρμογή για επιβεβαίωση ρύθμισης.
- Αποθηκεύστε τους κωδικούς ανάκτησης — αυτοί είναι κωδικοί μίας χρήσης.
Για να απενεργοποιήσετε το 2FA, εισάγετε τον τρέχοντα κωδικό TOTP και επιβεβαιώστε.
Ενεργές συνεδρίες
Δείτε όλες τις ενεργές συνεδρίες σύνδεσης, συμπεριλαμβανομένων περιηγητή, λειτουργικού συστήματος, διεύθυνσης IP.
Κλειδί API
Δημιουργήστε προσωπικό κλειδί API για μεταφόρτωση torrents μέσω προγράμματος.
Διαγραφή λογαριασμού
Η αίτηση διαγραφής λογαριασμού ξεκινά περίοδο χάριτος 30 ημερών.
7. AniRena API
Το AniRena παρέχει JSON API που σάς επιτρέπει να μεταφορτώνετε torrents μέσω προγράμματος χρησιμοποιώντας προσωπικό κλειδί API.
Πιστοποίηση
Το API χρησιμοποιεί ροή ελέγχου ταυτότητας δύο βημάτων. Πρώτα ανταλλάξτε το μόνιμο κλειδί API σας με ένα βραχύβιο bearer token, και στη συνέχεια περάστε αυτό το token στην κεφαλίδα Authorization κάθε αίτησης API.
Το κλειδί API σας είναι διαθέσιμο στο Ο λογαριασμός σας > Κλειδί API. Κρατήστε το μυστικό — όποιος το έχει μπορεί να αποκτήσει bearer tokens και να ανεβάζει εκ μέρους σας. Εάν παραβιαστεί, ανακαλέστε το αμέσως και δημιουργήστε νέο.
Βήμα 1 — Λάβετε bearer token
/api/v1/auth/tokenΣτείλτε ένα αίτημα POST στο endpoint token με το κλειδί API σας στην κεφαλίδα Authorization. Δεν απαιτείται σώμα αίτησης.
Authorization: ApiKey <your-api-key>
Απόκριση token
{
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600
}Διάρκεια ζωής διακριτικού
Τα διακριτικά Bearer παραμένουν έγκυρα έως και 3600 δευτερόλεπτα από την έκδοσή τους και μπορούν να επαναχρησιμοποιηθούν για κάθε κλήση μέχρι να λήξουν. Όταν λήξει ένα διακριτικό, δημιουργήστε ένα νέο μέσω POST /api/v1/auth/token. Κάθε απόκριση εξακολουθεί να επιστρέφει το τρέχον διακριτικό στην κεφαλίδα X-New-Token για συμβατότητα με προηγούμενες εκδόσεις.
X-New-Token: <next-bearer-token>
Σύνδεση με ένα αίτημα (με 2FA)
/api/v1/auth/loginΠιστοποιηθείτε με το όνομα χρήστη ή το email και τον κωδικό σας σε ένα αίτημα και λάβετε απευθείας ένα bearer token. Αν ο λογαριασμός σας έχει ενεργό 2FA, συμπεριλάβετε τον τρέχοντα κωδικό του authenticator στο totp_code (ή έναν κωδικό ανάκτησης στο recovery_code). Προαιρετικά ορίστε το new_api_key σε true για να δημιουργηθεί επίσης ένα ολοκαίνουργιο μόνιμο κλειδί API στην ίδια απάντηση.
Σώμα αιτήματος
{
"login": "username or email",
"password": "your-password",
"totp_code": "123456", // απαιτείται αν είναι ενεργό το 2FA (6 ψηφία)
"recovery_code": "", // εναλλακτική του totp_code
"new_api_key": false // ορίστε true για δημιουργία νέου κλειδιού API
}Απόκριση token
{
"ok": true,
"token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 3600,
"api_key": "<new-api-key>" // υπάρχει μόνο όταν το new_api_key ήταν true
}Το bearer token λειτουργεί ακριβώς όπως αυτό από το /api/v1/auth/token. Το πεδίο api_key επιστρέφεται μόνο όταν το new_api_key είναι true — αποθηκεύστε το αμέσως, καθώς εμφανίζεται μόνο μία φορά και αντικαθιστά κάθε προηγούμενο κλειδί.
Παράδειγμα — σύνδεση και (προαιρετικά) λήψη νέου κλειδιού API
# 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}"); } }
Βήμα 2 — Ανεβάστε torrent
/api/v1/torrentsΣτείλτε ένα απλό JSON POST αίτημα με το bearer token στην κεφαλίδα Authorization.
Σώμα αιτήματος
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
torrent | string | Ναι | Κωδικοποιημένα περιεχόμενα αρχείου .torrent σε Base64. |
category | string | Ναι | slug κατηγορίας: anime, manga, audio, literature, live, pictures, software, hentai, other. |
name | string | Όχι | Παράκαμψη εμφανιζόμενου ονόματος torrent. |
sub_category | string | Όχι | slug υποκατηγορίας (π.χ. raw, sub-audio). |
languages | string[] | Όχι | Πίνακας κωδικών γλώσσας BCP 47 (π.χ. en, ja). |
group_id | string | Όχι | UUID ομάδας της οποίας είστε μέλος. |
description | string | Όχι | Περιγραφή μορφής Markdown (έως 65535 χαρακτήρες). |
comment | string | Όχι | Παράκαμψη ενσωματωμένου πεδίου σχολίου torrent. |
is_private | boolean | Όχι | Ορίστε σε true για ενεργοποίηση σημαίας ιδιωτικού. |
comments_enabled | boolean | Όχι | Να επιτρέπονται σχόλια σε αυτό το torrent. Προεπιλογή true (ενεργοποιημένο). |
anime_id | string | Όχι | UUID μιας καταχώρισης anime για σύνδεση με αυτό το torrent. Αποκτήστε το UUID μέσω GET /api/v1/anime/search. Επιστρέφει 400 αν το UUID δεν αντιστοιχεί σε καμία γνωστή καταχώριση. |
announce | string | Όχι | Παράκαμψη ή προσθήκη κύριας URL ανακοίνωσης. |
trackers | string | Όχι | Λίστα URL trackers χωρισμένη με νέες γραμμές. |
test | boolean | Όχι | Ορίστε σε true για δοκιμαστική εκτέλεση: το αίτημα επικυρώνεται πλήρως αλλά το torrent δεν αποθηκεύεται. Χρησιμοποιήστε το για να επαληθεύσετε ότι το payload σας είναι σωστό πριν την πραγματική υποβολή. |
Απόκριση επιτυχίας δοκιμαστικής εκτέλεσης — 200 OK
{
"ok": true,
"test": true,
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Διαθέσιμοι κωδικοί γλώσσας
abaaafaksqamarar-001anhyasavaeayazbmbaeubebnbhbibsbrbgmyyuecachcenyzhzh-HKzh-Hanszh-SGzh-TWcucvkwcocrhrcsdadvnlnl-BEdzenen-USeoeteefofjfilfifrfr-CAffgllgkadede-ATelgnguhthahehzhihohuisioigidiaieiuikgaitjajvklknkrkskkkmkirwrnkvkgkokjkukylolalvlilnltlulbmkmgmsmlmtgvmimrmhmnnanvngnendsenonbnnocorojomospipsfaplptpt-BRpaqurormrusmsgsascgdsrsr-Latnsniisdsiskslsonrsteses-419es-MXsuswsssvtltytgtatttethbotitotstntrtktwukuruguzvevivowacyfywoxhyiyozazuΠαράδειγμα αιτήματος
# 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 }
Επιτυχής απόκριση — 200 OK
{
"ok": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "My Torrent Title",
"info_hash_v1": "aabbccddeeff...",
"info_hash_v2": null
}Αποκρίσεις σφαλμάτων
| Κατάσταση HTTP | Σημασία |
|---|---|
400 | Μη έγκυρο σώμα αιτήματος ή λείπει απαιτούμενο πεδίο. |
401 | Λείπει, έχει λήξει ή έχει ήδη εναλλαγεί το bearer token. Επαναπιστοποιήστε μέσω POST /api/v1/auth/token. |
403 | Λογαριασμός αποκλεισμένος, ανενεργός ή IP αποκλεισμένο. |
409 | Διπλότυπο torrent — το ίδιο info hash υπάρχει ήδη. |
422 | Αποτυχία ανάλυσης αρχείου torrent ή αποτυχία επικύρωσης. |
429 | Υπέρβαση ορίου. Δοκιμάστε ξανά μετά την επαναφορά του παραθύρου. |
503 | Ο ιστότοπος βρίσκεται σε λειτουργία συντήρησης ή μόνο ανάγνωσης. |
Περιορισμός ρυθμού
Οι μεταφορτώσεις API υπόκεινται σε ρυθμιζόμενο περιορισμό ρυθμού.
Δημιουργία αρχείων torrent με το torrent-builder
Το torrent-builder είναι ένα εργαλείο CLI ανοιχτού κώδικα, βασισμένο στο libtorrent-rasterbar, που σας επιτρέπει να δημιουργείτε αρχεία .torrent BitTorrent v1, v2 και hybrid από τη γραμμή εντολών. Συνδυάζεται άριστα με το AniRena upload API — δημιουργήστε το αρχείο τοπικά και στείλτε το μέσω POST απευθείας στον tracker. cantalupo555/torrent-builder.
Μεταγλώττιση από πηγαίο κώδικα
Απαιτεί CMake >= 3.28.3 και libtorrent-rasterbar >= 2.0.11. Κλωνοποιήστε το αποθετήριο και μεταγλωττίστε με 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 .
Βασικές σημαίες
| Πεδίο | Περιγραφή |
|---|---|
--path | Διαδρομή προς το αρχείο ή κατάλογο για συσκευασία (υποχρεωτικό). |
--output | Όνομα αρχείου εξόδου .torrent (υποχρεωτικό). |
--version | Μορφή BitTorrent — 1 = v1, 2 = v2, 3 = hybrid (προεπιλογή: 3). |
--tracker | Προσθήκη URL ανακοίνωσης tracker. Επαναλάβετε τη σημαία για προσθήκη πολλαπλών trackers. |
--comment | Ενσωμάτωση συμβολοσειράς σχολίου μεταδεδομένων στο torrent. |
--private | Ορισμός της σημαίας ιδιωτικού για περιορισμό της διανομής μόνο στους αναφερόμενους trackers. |
--piece-size | Μέγεθος τμήματος σε KB (16-32768). Αφήστε χωρίς ορισμό για αυτόματη επιλογή. |
-i | Εκκίνηση βήμα προς βήμα διαδραστικής λειτουργίας διαμόρφωσης. |
Ολοκληρωμένη ροή εργασίας: κατασκευή -> μεταφόρτωση
Τα παρακάτω παραδείγματα δημιουργούν ένα hybrid torrent με το torrent-builder, στη συνέχεια πιστοποιούνται με το AniRena API και ανεβάζουν το αποτέλεσμα σε ένα μόνο σενάριο.
# 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
/api/v1/torrents/searchΣτείλτε ένα απλό JSON POST αίτημα για ανάκτηση καταχωρίσεων torrent με τις ίδιες επιλογές αναζήτησης και φιλτραρίσματος που είναι διαθέσιμες στον ιστότοπο. Το ίδιο το αρχείο .torrent δεν επιστρέφεται — χρησιμοποιήστε τη συνήθη διαδρομή λήψης γι' αυτό.
# 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"]); }
Παράμετροι αναζήτησης
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
q | string | Όχι | Αναζήτηση ελεύθερου κειμένου. Υποστηρίζει προθέματα group:slug, group:"Name", user:name. |
category | string | Όχι | slug κατηγορίας (π.χ. "anime"). |
sub_category | string | Όχι | slug υποκατηγορίας (π.χ. "raw"). |
languages | string[] | Όχι | Πίνακας κωδικών γλώσσας BCP 47 (π.χ. en, ja). |
sort | string | Όχι | Πεδίο ταξινόμησης: date (προεπιλογή), size, seeders, leechers, completed, title. |
order | string | Όχι | Κατεύθυνση ταξινόμησης: desc (προεπιλογή) ή asc. |
page | integer | Όχι | Αριθμός σελίδας, ξεκινώντας από 1. |
per_page | integer | Όχι | Αποτελέσματα ανά σελίδα, 1–250. |
hide_adult | boolean | Όχι | Εξαίρεση torrents κατηγορίας ενηλίκων. |
show_dead | boolean | Όχι | Όταν είναι false (προεπιλογή), τα torrents παλαιότερα από την περίοδο χάριτος για τα νεκρά torrents και χωρίς ενεργούς seeders εξαιρούνται. Ορίστε σε true για να συμπεριληφθούν. |
Απόκριση
{
"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 — Αριθμός μη διαγραμμένων σχολίων σε αυτό το torrent.
Περιορισμός ρυθμού αναζήτησης
Τα αιτήματα αναζήτησης υπόκεινται σε ξεχωριστό ρυθμιζόμενο περιορισμό ρυθμού (προεπιλογή 60 αιτήματα ανά 60 δευτερόλεπτα ανά κλειδί API).
Λήψη λεπτομερειών torrent
/api/v1/torrent/{id}Ανάκτηση όλων των μεταδεδομένων για ένα μεμονωμένο torrent — συμπεριλαμβανομένων πεδίων που το endpoint αναζήτησης παραλείπει, όπως η περιγραφή σε Markdown, το ενσωματωμένο σχόλιο .torrent, η λίστα αρχείων με μέγεθος ανά αρχείο και η πλήρης διάταξη επιπέδων trackers. Όταν είναι διαθέσιμα, διαβάζονται οι ζωντανές μετρήσεις seeders και leechers από τον tracker.
Απόκριση
{
"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 — Ζωντανές μετρήσεις από τον εσωτερικό tracker· και τα δύο αναφέρουν 0 όταν ο χώρος του tracker δεν έχει καταχώρηση για αυτό το info hash ή δεν είναι προσβάσιμος.
ext_seeders, ext_leechers — Ο μέγιστος αριθμός seeders και leechers που αναφέρεται από οποιονδήποτε μεμονωμένο εξωτερικό tracker που έχει scraped για αυτό το torrent. Οι trackers που παρακολουθούν το ίδιο swarm επικαλύπτονται, οπότε χρησιμοποιείται το μέγιστο αντί του αθροίσματος· και τα δύο αναφέρουν 0 όταν κανένας tracker δεν έχει δεδομένα scrape για αυτό το info hash.
Αποκρίσεις σφαλμάτων
| Κατάσταση HTTP | Σημασία |
|---|---|
400 | Το αναγνωριστικό torrent πρέπει να είναι UUID 36 χαρακτήρων με παύλες ή απλή δεκαεξαδική συμβολοσειρά 32 χαρακτήρων. |
401 | Λείπει, έχει λήξει ή έχει ήδη εναλλαγεί το bearer token. Επαναπιστοποιήστε μέσω POST /api/v1/auth/token. |
404 | Το torrent δεν βρέθηκε. |
429 | Υπέρβαση ορίου. Δοκιμάστε ξανά μετά την επαναφορά του παραθύρου. |
503 | Ο ιστότοπος βρίσκεται σε λειτουργία συντήρησης ή μόνο ανάγνωσης. |
Ανάκτηση σχολίων torrent
/api/v1/torrents/{id}/commentsΑνάκτηση σελιδοποιημένων σχολίων για ένα torrent. Ο αριθμός σχολίων ανά σελίδα ελέγχεται από τη ρύθμιση COMMENT_PER_PAGE στο αρχείο .env του διακομιστή (προεπιλογή 20). Μόνο τα torrents με ενεργοποιημένα σχόλια θα επιστρέψουν αποτελέσματα — όλα τα άλλα επιστρέφουν 403.
Παράμετροι ερωτήματος
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
page | integer | Όχι | Αριθμός σελίδας, ξεκινώντας από 1 (προεπιλογή 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"]); }
Απόκριση
{
"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
}
]
}Το πεδίο body είναι κενή συμβολοσειρά όταν ο συγγραφέας του σχολίου έχει αποκλειστεί ή το σχόλιο έχει διαγραφεί. Η σημαία author_banned υποδεικνύει ποια περίπτωση ισχύει.
Αποκρίσεις σφαλμάτων
| Κατάσταση HTTP | Σημασία |
|---|---|
401 | Λείπει, έχει λήξει ή έχει ήδη εναλλαγεί το bearer token. Επαναπιστοποιήστε μέσω POST /api/v1/auth/token. |
403 | Τα σχόλια είναι απενεργοποιημένα για αυτό το torrent. |
404 | Το torrent δεν βρέθηκε. |
503 | Ο ιστότοπος βρίσκεται σε λειτουργία συντήρησης ή μόνο ανάγνωσης. |
Αναζήτηση καταχωρήσεων anime
/api/v1/anime/search?q=<query>Αναζητήστε καταχωρίσεις anime ανά τίτλο για να αποκτήσετε το UUID τους. Το UUID μπορεί να περαστεί ως anime_id στο σώμα μεταφόρτωσης για να συνδέσετε ένα torrent με μια καταχώριση anime κατά τη μεταφόρτωση, ή να χρησιμοποιηθεί με PUT /api/torrents/{id}/anime μετά τη μεταφόρτωση. Δεν απαιτείται έλεγχος ταυτότητας. Υπόκειται στο ίδιο όριο ρυθμού με την αναζήτηση torrent (προεπιλογή 60 αιτήματα ανά 60 δευτερόλεπτα ανά 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"]);
}Παράμετροι ερωτήματος
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
q | string | Ναι | Συμβολοσειρά αναζήτησης τίτλου (απαιτείται). Αντιστοιχίζεται με τίτλο και συνώνυμα. |
page | integer | Όχι | Αριθμός σελίδας, ξεκινώντας από 1. |
per_page | integer | Όχι | Αποτελέσματα ανά σελίδα, 1–50. |
Απόκριση
{
"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
}
]
}Λίστα και ανάκτηση ομάδων
/api/v1/groupsΕπιστρέφει μια σελιδοποιημένη λίστα δημόσιων ομάδων (ενεργοποιημένων και μη κλειδωμένων). Απαιτείται αυθεντικοποίηση Bearer token.
/api/v1/groups/{id_or_slug}Επιστρέφει μια μεμονωμένη δημόσια ομάδα με βάση αριθμητικό ID ή slug. Επιστρέφει 404 εάν η ομάδα είναι απενεργοποιημένη ή κλειδωμένη.
Παράμετροι ερωτήματος (μόνο λίστα)
| Πεδίο | Τύπος | Απαιτείται | Περιγραφή |
|---|---|---|---|
q | string | Όχι | Φιλτράρισμα κατά όνομα ομάδας (προαιρετικό, μερική αντιστοίχιση). |
page | integer | Όχι | Αριθμός σελίδας (προεπιλογή 1). |
per_page | integer | Όχι | Αποτελέσματα ανά σελίδα, 1–100 (προεπιλογή 20). |
sort | string | Όχι | Στήλη ταξινόμησης: name | slug | members | torrents | created (προεπιλογή name). |
order | string | Όχι | Κατεύθυνση ταξινόμησης: asc ή desc (προεπιλογή asc). |
Απόκριση (λίστα)
{
"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"
}
]
}Απόκριση (μεμονωμένη)
{
"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"
}Αποκρίσεις σφαλμάτων
| Κατάσταση HTTP | Σημασία |
|---|---|
401 | Λείπει, έχει λήξει ή έχει ήδη εναλλαγεί το bearer token. Επαναπιστοποιήστε μέσω POST /api/v1/auth/token. |
404 | Η ομάδα δεν βρέθηκε ή δεν είναι δημοσίως προσβάσιμη. |
429 | Υπέρβαση ορίου. Δοκιμάστε ξανά μετά την επαναφορά του παραθύρου. |
503 | Ο ιστότοπος βρίσκεται σε λειτουργία συντήρησης ή μόνο ανάγνωσης. |
8. Δωρεές
Αν θέλετε να υποστηρίξετε το AniRena και να βοηθήσετε στην κάλυψη του κόστους φιλοξενίας των διακομιστών και των υπηρεσιών μας, μπορείτε να στείλετε μια δωρεά σε ένα από τα παρακάτω πορτοφόλια κρυπτονομισμάτων:
bc1qy2h3ddq6ak5damvnf4r5vu3ydehhxrcq8gllwn0xCbaFe03832F95F86AF2536d52710e78C63b62Cd33ucetj2XDGHQg9PVRPMxerNi7c6kX7GJkjQNg9yjwGegLbpt61yX3RjGtB1Ef8vgVz6Hr6baQsTjVkΚάθε δωρεά, μεγάλη ή μικρή, εκτιμάται ιδιαίτερα και πηγαίνει απευθείας για να κρατήσουμε το AniRena σε λειτουργία. Ευχαριστούμε για την υποστήριξή σας!
9. Λογισμικό
Το AniRena Player είναι μια δωρεάν εφαρμογή υπολογιστή που σας επιτρέπει να μεταδίδετε βίντεο απευθείας από τα torrents που είναι ευρετηριασμένα σε αυτόν τον ιστότοπο — χωρίς να χρειάζεται να περιμένετε να ολοκληρωθεί ολόκληρη η λήψη. Απλώς επικολλήστε έναν σύνδεσμο magnet ή ανοίξτε ένα αρχείο .torrent και η αναπαραγωγή ξεκινά μόλις είναι διαθέσιμα αρκετά δεδομένα.
Και οι δύο εκδόσεις είναι πλήρως αυτόνομες — όλες οι εξαρτήσεις είναι ενσωματωμένες στο εκτελέσιμο. Δεν απαιτείται εγκαταστάτης ή χρόνος εκτέλεσης — απλά κατεβάστε και τρέξτε.
Πρόγραμμα εγκατάστασης (.exe). Ενημερώνεται μέσα στην εφαρμογή.
Εικόνα δίσκου (.dmg) για Mac με Apple Silicon (M1 και νεότερα). Ενημερώνεται μέσα στην εφαρμογή.
Εικόνα δίσκου (.dmg) για Mac με Intel. Ενημερώνεται μέσα στην εφαρμογή.
Φορητό μεμονωμένο αρχείο, δεν απαιτείται εγκατάσταση. Η μόνη μορφή Linux με αυτόματη ενημέρωση εντός της εφαρμογής.
Εγκατάσταση: sudo apt install ./<file>.deb — ενημερώνεται μέσω apt ή με νέα λήψη, όχι εντός της εφαρμογής.
Εγκατάσταση: sudo dnf install ./<file>.rpm — ενημερώνεται μέσω dnf ή με νέα λήψη, όχι εντός της εφαρμογής.
Εγκαταστήστε χειροκίνητα σε συσκευές Android 64-bit ARM (τα περισσότερα σύγχρονα κινητά / tablet). Ενημερώνεται με λήψη νέου APK.
Παλαιότερες εκδόσεις
Εγκαταστήστε χειροκίνητα σε συσκευές Android 32-bit ARM (παλαιότερα κινητά / tablet). Ενημερώνεται με λήψη νέου APK.