מדריך
1. תחילת העבודה
AniRena הוא אינדקס טורנטים המתמקד באנימה, מנגה, שמע ומדיה קשורה. ניתן לדפדף ולהוריד טורנטים ללא חשבון. נדרש חשבון להעלאת טורנטים, פרסום בקבוצות או שימוש ב-API.
סרגל הניווט בחלק העליון מספק גישה לאזורים הראשיים של האתר:
- דף הבית — דף הרשימה והחיפוש של טורנטים.
- העלאה — שלח טורנט חדש (נדרשת כניסה).
- מדריך — דף זה.
- סטטיסטיקות — סטטיסטיקות כלל-אתר (טורנטים, peers, העלאות לאורך זמן).
- קבוצות — ספריית קבוצות שחרור.
- RSS — עדכון RSS של העלאות אחרונות, ניתן לסינון לפי קטגוריה.
תפריט החשבון שלך (פינה ימנית עליונה בעת כניסה) פותח לוח פרופיל בו ניתן לשנות הגדרות, לנהל אפשרויות אבטחה ולגשת למפתח ה-API שלך.
2. גלישה וחיפוש
הדף הראשי מפרט את כל הטורנטים לפי תאריך העלאה. השתמש בסרגל החיפוש בחלק העליון לסינון תוצאות.
חיפוש בסיסי
הקלד מילים כלשהן בסרגל החיפוש ולחץ Enter (או לחץ על סמל החיפוש). התוצאות מדורגות לפי רלוונטיות כאשר שאילתה פעילה.
אופרטורי חיפוש
ניתן לשלב את האופרטורים הבאים עם שאילתה רגילה:
| אופרטור | דוגמה | אפקט |
|---|---|---|
user:"name" | user:"SubsPlease" | הצג רק טורנטים שהועלו על ידי אותו משתמש. |
לחיצה על שם מעלה ברשימת הטורנטים מריצה אוטומטית חיפוש משתמש עבורך.
קטגוריות ותת-קטגוריות
השתמש בבורר הקטגוריות (סמל הרשת ליד סרגל החיפוש) להגבלת תוצאות לקטגוריה אחת. הקטגוריות הזמינות הן:
- אנימה
- מנגה/מאנהווה/קומיקס
- שמע
- ספרות
- לייב אקשן
- תמונות
- תוכנה
- הנטאי
- אחר
לכל קטגוריה יש תת-קטגוריות (לדוגמה אנימה ל-RAW, Sub/Audio, קליפ מוזיקלי) ניתנות לבחירה בתוך מודל הקטגוריה.
מיון וסינון
כותרות העמודות ברשימת הטורנטים ניתנות ללחיצה למיון לפי אותה עמודה (עולה או יורד). עמודות מיון זמינות: תאריך, שם, גודל, הורדות שהושלמו. שימו לב: ה-seeders וה-leechers הם ערכים חיים המגיעים מ-Redis ולא ניתן להשתמש בהם למיון.
פילטר שפה
השתמש בבורר השפות (סמל דגל) להצגת רק טורנטים שתויגו בשפה ספציפית.
עדכון RSS
עדכון ה-RSS ב-/rss מספק את ההעלאות האחרונות. הוסף ?category=anime (או כל slug קטגוריה אחר) לסינון העדכון. רוב לקוחות הטורנט תומכים בהורדה אוטומטית דרך RSS ישירות מ-URL זה.
3. הורדת טורנטים
לחץ על כל שם טורנט לפתיחת לוח הפרטים שלו. משם ניתן:
- הורד .torrent — שומר את קובץ ה-.torrent ישירות. כתובת ה-URL הישירה היא
/torrents/{id}.torrent - קישור מגנטי — נפתח ישירות בלקוח הטורנט שלך דרך פרוטוקול URI מגנטי. ה-URL הוא
/torrents/{id}/magnet
לוח הפרטים גם מציג את תיאור הטורנט, רשימת קבצים, רשימת trackers וספירות seeders/leechers.
קישורי הורדה ישנים
קישורי ההורדה הישנים של AniRena עדיין נתמכים ומפנים אוטומטית לקובץ ה-.torrent הנכון באמצעות המזהה הישן: /dl/{old_id}
לקוחות BitTorrent מומלצים
כל לקוח BitTorrent מודרני עובד. הלקוחות להלן מומלצים ותומכים באופן מלא ב-BitTorrent v2 / torrent היברידיים:
4. יצירת חשבון
הרשמה
לחץ על הרשמה בסרגל הניווט. בחר שם משתמש, ספק כתובת אימייל והגדר סיסמה (אורך מינימלי נאכף). עליך לקרוא ולקבל את תנאי האתר לפני יצירת החשבון שלך.
אימות אימייל
לאחר ההרשמה, נשלח אימייל אימות לכתובתך. לחץ על הקישור באימייל כדי להפעיל את חשבונך. אם לא קיבלת, השתמש בקישור הפעל את חשבונך בדף הכניסה לבקשת קוד חדש.
שחזור סיסמה
אם שכחת את הסיסמה, לחץ על שכחת סיסמה בדף הכניסה והזן את כתובת האימייל שלך. קישור שחזור יישלח אליך. הקישור הוא לשימוש חד-פעמי ופג תוקף לאחר זמן קצר.
5. העלאת טורנטים
נווט אל העלאה בסרגל הניווט. עליך להיות מחובר עם חשבון פעיל ולא חסום. לדף ההעלאה יש שתי לשוניות:
לשונית העלאה — שלח קובץ .torrent קיים
גרור-ושחרר או בחר קובץ .torrent. לאחר טעינה, מלא את השדות:
| שדה | חובה | תיאור |
|---|---|---|
| קובץ טורנט | כן | קובץ ה-.torrent להעלאה. |
| שם | לא | עקוף את שם התצוגה של הטורנט. אם נשאר ריק, נעשה שימוש בשם המוטמע בקובץ הטורנט. |
| קטגוריה | כן | קטגוריית התוכן (אנימה, מנגה, שמע, וכו'). |
| תת-קטגוריה | לא | סוג ספציפי יותר בתוך הקטגוריה (לדוגמה RAW, Sub/Audio). |
| שפות | לא | תג שפה אחד או יותר המתאר את שפת התוכן. |
| קבוצה | לא | שייך שחרור זה לקבוצה שאתה חבר בה. |
| תיאור | לא | תיאור מעוצב ב-Markdown המוצג בדף פרטי הטורנט (מקסימום 65535 תווים). |
| פרטי | לא | מגדיר את דגל הפרטי בטורנט, מבטל DHT/PEX. שימושי לטורנטים של tracker בלבד. |
| כתובת URL של Announce | לא | עקוף או הוסף את ה-announce URL הראשי של ה-tracker. |
| Trackers נוספים | לא | נקרא מקובץ הטורנט. לא ניתן לשינוי בעת ההעלאה — השתמש בכרטיסיית יצירה אם ברצונך להתאים אישית את רשימת ה-Trackers. |
| הערה | לא | עקוף את שדה ההערה של הטורנט המוטמע בקובץ. |
הטורנט שלך חייב לכלול לפחות כתובת URL אחת של Tracker של AniRena ברשימת ה-Announce שלו (בכל tier). האתר בודק זאת בעת ההעלאה ויסרב לטורנטים שאינם כוללים Tracker של AniRena. אם יצרת את הטורנט מבלי להוסיף תחילה את ה-Tracker של AniRena, העלה אותו ואז הורד אותו מחדש מהאתר — הקובץ שיורד יכלול אוטומטית את ה-Trackers הנכונים.
לשונית יצירה — בנה טורנט חדש
לשונית היצירה מאפשרת לך ליצור .torrent חדש מאפס על ידי ציון נתיבי קבצים, כתובות URL של tracker ופרמטרי טורנט אחרים ישירות בדפדפן. הטורנט המתקבל נשלח עם אותם שדות מטא-נתונים כמו לעיל.
מודרציה
ההעלאות נבדקות אוטומטית מול רשימת תבניות תוכן חסומות (שמות, שמות קבצים, תיאורים). טורנטים שתואמים תבנית חסומה יידחו. טורנטים כפולים (אותו info hash) גם נדחים.
6. החשבון שלך
לחץ על שם המשתמש שלך בפינה הימנית העליונה לפתיחת לוח הפרופיל. הוא מאורגן בחלקים שניתן לכווץ:
הגדרות
שנה את ערכת הנושא של ה-UI, גודל הגופן, ערכת הצבעים, שפת הממשק והעדפות התצוגה הקשורות לטורנטים. השינויים נשמרים אוטומטית.
סיסמה
הזן את הסיסמה הנוכחית שלך ואת הסיסמה החדשה פעמיים. קוד אימות נשלח לכתובת האימייל הרשומה שלך ויש להזינו לאישור השינוי. אם אימות דו-שלבי מופעל, גם קוד ה-TOTP שלך נדרש.
אימות דו-שלבי (2FA)
הפעל אימות דו-שלבי מבוסס TOTP באמצעות כל אפליקציית מאמת (לדוגמה Google Authenticator, Aegis, Bitwarden). בעת הפעלת 2FA:
- סרוק את קוד ה-QR (או הזן את הסוד ידנית) באפליקציית המאמת שלך.
- הזן את הקוד בן 6 הספרות המוצג באפליקציה שלך לאישור ההגדרה.
- שמור את קודי השחזור המוצגים — אלו הם קודים חד-פעמיים לשחזור הגישה אם תאבד את המכשיר שלך.
כדי להשבית 2FA, הזן את קוד ה-TOTP הנוכחי שלך ואשר.
סשנים פעילים
הצג את כל סשני הכניסה הפעילים כרגע כולל דפדפן, מערכת הפעלה, כתובת IP ושעת הפעילות האחרונה. לחץ על בטל בכל סשן שאינך מכיר. ניתן גם לבטל את כל הסשנים בבת אחת לניתוק מכל המכשירים.
מפתח API
צור מפתח API אישי המשמש להעלאת טורנטים בצורה תכנותית דרך API של AniRena. לחץ על צור מפתח ליצירת אחד — המפתח המלא מוצג פעם אחת מיד לאחר היצירה. אחסן אותו בבטחה; הוא לא יוצג שוב במלואו. השתמש ב'בטל' לביטול המפתח לצמיתות.
מחק חשבון
בקשת מחיקת חשבון מתחילה תקופת חסד של 30 יום. חשבונך מושבת מיד ונמחק לצמיתות לאחר 30 יום. ניתן לבטל את המחיקה בכל עת בתוך חלון זה על ידי כניסה ולחיצה על בטל מחיקה.
7. API של AniRena
AniRena מספק API JSON המאפשר העלאת טורנטים בצורה תכנותית באמצעות מפתח API אישי. ה-API מחיל את אותן כללים כמו ממשק האינטרנט: בדיקות חסימה, מגבלות קצב והגבלות מצב אתר חלים. כל העלאת API מתועדת ביומן הביקורת.
אימות
ה-API משתמש בתהליך אימות דו-שלבי. תחילה החלף את מפתח ה-API הקבוע שלך ב-Bearer Token קצר מועד, ולאחר מכן העבר את ה-Token הזה בכותרת Authorization של כל בקשת API.
מפתח ה-API שלך זמין תחת החשבון שלך > מפתח API. שמור עליו בסוד — כל מי שיש לו את המפתח יכול לקבל Bearer Tokens ולהעלות בשמך. אם נפרץ, בטל אותו מיד וצור חדש.
שלב 1 — קבל Bearer Token
/api/v1/auth/tokenשלח בקשת POST לנקודת הקצה של ה-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>
התחברות בבקשה אחת (עם אימות דו-שלבי)
/api/v1/auth/loginהתחברו עם שם המשתמש או האימייל והסיסמה בבקשה אחת וקבלו אסימון Bearer ישירות. אם באשבון שלכם מופעל אימות דו-שלבי, כללו את קוד המאמת הנוכחי ב-totp_code (או קוד שחזור ב-recovery_code). באופן אופציונלי הגדירו את new_api_key ל-true כדי ליצור גם מפתח API קבוע חדש לחלוטין באותה תגובה.
גוף הבקשה
{
"login": "username or email",
"password": "your-password",
"totp_code": "123456", // נדרש אם אימות דו-שלבי מופעל (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 פועל בדיוק כמו אסימון שהתקבל מ-/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שלח בקשת POST JSON פשוטה עם Bearer Token בכותרת Authorization.
גוף הבקשה
| שדה | סוג | חובה | תיאור |
|---|---|---|---|
torrent | string | כן | תוכן קובץ ה-.torrent מקודד ב-Base64. |
category | string | כן | Slug קטגוריה: anime, manga, audio, literature, live, pictures, software, hentai, other. |
name | string | לא | עקוף את שם התצוגה של הטורנט. |
sub_category | string | לא | Slug תת-קטגוריה (לדוגמה raw, sub-audio). חייב להשתייך לקטגוריה שנבחרה. |
languages | string[] | לא | מערך של קודי שפה BCP 47 (לדוגמה en, ja). |
group_id | string | לא | UUID של קבוצה שאתה חבר בה לשיוך שחרור זה אליה. |
description | string | לא | תיאור שחרור מעוצב ב-Markdown (מקסימום 65535 תווים). |
comment | string | לא | עקוף את שדה ההערה המוטמע של הטורנט. |
is_private | boolean | לא | הגדר ל-true כדי להפעיל את דגל הפרטי בטורנט. |
comments_enabled | boolean | לא | אפשר תגובות לטורנט זה. ברירת המחדל היא true (מופעל). |
anime_id | string | לא | UUID של רשומת אנימה לקישור לטורנט זה. קבל את ה-UUID דרך GET /api/v1/anime/search. מחזיר 400 אם ה-UUID אינו תואם לאף רשומה מוכרת. |
announce | string | לא | עקוף או הוסף את ה-announce URL הראשי. |
trackers | string | לא | רשימת כתובות URL של tracker נוספות מופרדות בשורה חדשה. שורה ריקה בין URLs יוצרת שכבת tracker חדשה. |
test | boolean | לא | הגדר ל-true לביצוע ריצת בדיקה: הבקשה מאומתת במלואה אך הטורנט אינו נשמר. השתמש בזה לאימות שהנתונים שלך נכונים לפני השליחה האמיתית. |
תגובת הצלחה לריצת בדיקה — 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 | טורנט כפול — אותו info hash כבר קיים. |
422 | קובץ הטורנט לא ניתן לניתוח או נכשל באימות (תבנית חסומה, מבנה לא תקין). |
429 | מגבלת קצב חרגה. נסה שוב לאחר איפוס החלון. |
503 | האתר במצב תחזוקה או קריאה בלבד. |
מגבלת קצב
העלאות API כפופות למגבלת קצב ניתנת להגדרה נפרדת מממשק האינטרנט. המגבלה והחלון מוגדרים על ידי מנהל האתר. כאשר מגבלת הקצב חרגה, ה-API מחזיר 429 Too Many Requests. המגבלה היא לפי מפתח API.
יצירת קבצי טורנט עם torrent-builder
torrent-builder הוא כלי CLI בקוד פתוח הבנוי על libtorrent-rasterbar המאפשר ליצור קבצי .torrent של BitTorrent v1, v2 ו-hybrid משורת הפקודה. הוא משתלב בצורה מושלמת עם AniRena upload API — צור את הקובץ מקומית ואז POST ישירות לטראקר. 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 הכרזה של טראקר. חזור על הדגל להוספת מספר טראקרים. |
--comment | הטמע מחרוזת הערת מטא-נתונים בטורנט. |
--private | הגדר את דגל הפרטיות להגבלת ההפצה לטראקרים המפורטים בלבד. |
--piece-size | גודל חלק ב-KB (16-32768). השאר ללא הגדרה לבחירה אוטומטית. |
-i | הפעל מצב תצורה אינטראקטיבי שלב אחר שלב. |
זרימת עבודה מקצה לקצה: בנייה -> העלאה
הדוגמאות שלהלן בונות טורנט hybrid עם 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"]); }
חיפוש מטא-נתוני טורנט
/api/v1/torrents/searchשלח בקשת POST JSON פשוטה לאחזור רשימות 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:"שם", user:שם. |
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 (ברירת מחדל 1). |
per_page | integer | לא | תוצאות לעמוד, 1–250 (ברירת מחדל 50). |
hide_adult | boolean | לא | הסתר טורנטים מקטגוריית מבוגרים. ברירת המחדל היא true למשתמשים רגילים. |
show_dead | boolean | לא | כאשר false (ברירת מחדל), טורנטים ישנים יותר מתקופת החסד של טורנטים מתים שאין להם זורעים פעילים אינם נכללים. הגדר ל-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 — מספר התגובות שלא נמחקו בטורנט זה.
מגבלת קצב חיפוש
בקשות חיפוש כפופות למגבלת קצב ניתנת להגדרה נפרדת (ברירת מחדל 60 בקשות לכל 60 שניות לפי מפתח API). חריגה מהמגבלה מחזירה 429 Too Many Requests. חשבונות צוות פטורים.
קבל פרטי טורנט
/api/v1/torrent/{id}שליפת המטא-נתונים המלאים של טורנט יחיד — כולל שדות שנקודת קצה של החיפוש משמיטה כגון תיאור Markdown, הערת .torrent מוטמעת, רשימת קבצים עם גודל לכל קובץ ומבנה מלא של שכבות הטראקרים. ספירות חיות של seeders ו-leechers נקראות מהטראקר כאשר הן זמינות.
תגובה
{
"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 — ספירות חיות מהטראקר הפנימי; שניהם מדווחים על 0 כאשר במאגר הטראקר אין רשומה ל-info hash זה או שהוא לא נגיש.
ext_seeders, ext_leechers — מספר הזורעים והיונקים הגבוה ביותר שמדווח על ידי כל טראקר חיצוני בודד שנסרק עבור טורנט זה. טראקרים העוקבים אחר אותו נחיל חופפים, ולכן משתמשים במקסימום במקום בסכום; שניהם מדווחים על 0 כאשר אין לאף טראקר נתוני סריקה עבור info hash זה.
תגובות שגיאה
| סטטוס HTTP | משמעות |
|---|---|
400 | מזהה הטורנט חייב להיות UUID של 36 תווים עם מקפים או מחרוזת הקסדצימלית נטו של 32 תווים. |
401 | Bearer Token חסר, פג תוקף או כבר סובב. אמת מחדש דרך POST /api/v1/auth/token. |
404 | הטורנט לא נמצא. |
429 | מגבלת קצב חרגה. נסה שוב לאחר איפוס החלון. |
503 | האתר במצב תחזוקה או קריאה בלבד. |
אחזור תגובות טורנט
/api/v1/torrents/{id}/commentsאחזר תגובות מוחלקות לטורנט. מספר התגובות לעמוד נשלט על ידי הגדרת COMMENT_PER_PAGE בקובץ ה-.env של השרת (ברירת מחדל 20). רק טורנטים עם תגובות מופעלות יחזירו תוצאות — כל השאר מחזירים 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 | תגובות מושבתות לטורנט זה. |
404 | הטורנט לא נמצא. |
503 | האתר במצב תחזוקה או קריאה בלבד. |
חיפוש ערכי אנימה
/api/v1/anime/search?q=<query>חפש רשומות אנימה לפי כותרת כדי לקבל את ה-UUID שלהן. ניתן להעביר את ה-UUID כ-anime_id בגוף ההעלאה כדי לקשר טורנט לרשומת אנימה בזמן ההעלאה, או להשתמש בו עם PUT /api/torrents/{id}/anime לאחר ההעלאה. לא נדרשת אימות. כפוף לאותה הגבלת קצב כמו חיפוש טורנט (ברירת מחדל 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 (ברירת מחדל 1). |
per_page | integer | לא | תוצאות לעמוד, 1–50 (ברירת מחדל 10). |
תגובה
{
"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}מחזיר קבוצה ציבורית בודדת לפי מזהה מספרי או 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 היא אפליקציית שולחן עבודה חינמית שמאפשרת לך להזרים וידאו ישירות מטורנטים המאונדקסים באתר זה — מבלי להמתין לסיום ההורדה המלאה. פשוט הדבק קישור מגנט או פתח קובץ .torrent, וההשמעה מתחילה ברגע שיש מספיק נתונים זמינים.
שני הבילדים עצמאיים לחלוטין — כל התלויות ארוזות בתוך קובץ ההפעלה. ללא מתקין, ללא סביבת ריצה — פשוט הורד והרץ.
מתקין (.exe). מתעדכן בעצמו בתוך האפליקציה.
קובץ דיסק (.dmg) למחשבי Mac עם Apple Silicon (M1 ואילך). מתעדכן בעצמו בתוך האפליקציה.
קובץ דיסק (.dmg) למחשבי Mac עם Intel. מתעדכן בעצמו בתוך האפליקציה.
קובץ יחיד נייד, ללא צורך בהתקנה. הפורמט היחיד ב-Linux עם עדכון אוטומטי בתוך האפליקציה.
התקנה: sudo apt install ./<file>.deb — מעדכן דרך apt או הורדה חדשה, לא בתוך האפליקציה.
התקנה: sudo dnf install ./<file>.rpm — מעדכן דרך dnf או הורדה חדשה, לא בתוך האפליקציה.
התקנה ידנית במכשירי Android ARM 64-ביט (רוב הטלפונים / הטאבלטים המודרניים). מתעדכן על ידי הורדת APK חדש.
גרסאות ישנות
התקן ידנית במכשירי Android מסוג ARM 32 סיביות (טלפונים / טאבלטים ישנים יותר). מתעדכן על ידי הורדת APK חדש.