1. البدء

AniRena هو فهرس تورنت يركّز على الأنمي والمانغا والصوتيات والوسائط ذات الصلة. يمكنك تصفح التورنتات وتنزيلها بدون حساب. يلزم وجود حساب لرفع التورنتات أو النشر في المجموعات أو استخدام واجهة برمجة التطبيقات.

شريط التنقل في الأعلى يوفر الوصول إلى المناطق الرئيسية للموقع:

  • الرئيسية — صفحة قائمة التورنتات والبحث.
  • رفع — إرسال تورنت جديد (يتطلب تسجيل الدخول).
  • دليل — هذه الصفحة.
  • إحصائيات — إحصائيات الموقع الكاملة (التورنتات والمستخدمون وعمليات الرفع عبر الزمن).
  • مجموعات — دليل مجموعات الإصدار.
  • RSS — خلاصة RSS لأحدث عمليات الرفع، قابلة للتصفية حسب الفئة.

قائمة حسابك (الزاوية العلوية اليمنى عند تسجيل الدخول) تفتح لوحة الملف الشخصي حيث يمكنك ضبط الإعدادات وإدارة خيارات الأمان والوصول إلى مفتاح API.

2. التصفح والبحث

تعرض الصفحة الرئيسية جميع التورنتات مرتبةً حسب تاريخ الرفع. استخدم شريط البحث في الأعلى لتصفية النتائج.

البحث الأساسي

اكتب أي كلمات في شريط البحث واضغط Enter (أو انقر على أيقونة البحث). يتم ترتيب النتائج حسب الصلة عند تفعيل استعلام.

عوامل البحث

يمكن دمج العوامل التالية مع استعلام منتظم:

العاملمثالالتأثير
user:"name"user:"SubsPlease"عرض التورنتات المرفوعة بواسطة ذلك المستخدم فقط.

النقر على اسم الرافع في قائمة التورنتات يشغّل تلقائياً بحث المستخدم.

الفئات والفئات الفرعية

استخدم محدد الفئة (أيقونة الشبكة بجانب شريط البحث) لتقييد النتائج بفئة واحدة. الفئات المتاحة هي:

  • أنمي
  • مانغا/مانهوا/كوميك
  • صوتيات
  • أدب
  • عروض حية
  • صور
  • برامج
  • هنتاي
  • أخرى

كل فئة لها فئات فرعية (مثل الأنمي إلى RAW وSub/Audio وفيديو موسيقي) قابلة للاختيار داخل مربع حوار الفئة.

الترتيب والفلاتر

رؤوس أعمدة قائمة التورنتات قابلة للنقر للترتيب حسب تلك العمود (تصاعدي أو تنازلي). أعمدة الترتيب المتاحة: التاريخ والاسم والحجم وعمليات التنزيل المكتملة. ملاحظة: المبذرون والمنزلون قيم حية من Redis ولا يمكن استخدامها للترتيب.

فلتر اللغة

استخدم محدد اللغة (أيقونة العلم) لعرض التورنتات المُعلَّمة بلغة محددة فقط.

خلاصة RSS

توفر خلاصة RSS على /rss أحدث عمليات الرفع. أضف ?category=anime (أو أي slug فئة آخر) لتصفية الخلاصة. معظم برامج تورنت تدعم التنزيل التلقائي عبر RSS مباشرةً من هذا العنوان URL.

3. تنزيل التورنتات

انقر على أي اسم تورنت لفتح لوحة التفاصيل. من هناك يمكنك:

  • تنزيل .torrent — يحفظ ملف .torrent مباشرةً. عنوان URL المباشر هو /torrents/{id}.torrent
  • الرابط المغناطيسي — يفتح مباشرةً في برنامج التورنت الخاص بك عبر بروتوكول URI المغناطيسي. العنوان هو /torrents/{id}/magnet

تعرض لوحة التفاصيل أيضاً وصف التورنت وقائمة الملفات وقائمة المتتبعات وعدد المبذرين والمنزلين.

روابط التنزيل القديمة

روابط تنزيل AniRena القديمة لا تزال مدعومة وتعيد التوجيه تلقائياً إلى ملف .torrent الصحيح باستخدام المعرّف القديم: /dl/{old_id}

عملاء BitTorrent الموصى بهم

أي عميل BitTorrent حديث يعمل. العملاء أدناه موصى بهم ويدعمون بالكامل BitTorrent v2 / التورنتات الهجينة:

qBittorrent في صفحة التنزيل، انقر على خيارات تنزيل إضافية واختر الإصدار المسمى lt20 (libtorrent 2.0). المثبت الافتراضي يستخدم libtorrent 1.2 الذي لا يدعم تورنتات v2 النقية.v2 مدعوم
PicoTorrent عميل Windows خفيف الوزن مع دعم أصلي لـ BitTorrent v2 من البداية.v2 مدعوم
BiglyBT عميل متعدد المنصات غني بالميزات مبني على Azureus/Vuze مع دعم كامل لـ v2.v2 مدعوم

4. إنشاء حساب

التسجيل

انقر على إنشاء حساب في شريط التنقل. اختر اسم مستخدم وأدخل عنوان بريد إلكتروني وعيّن كلمة مرور (الحد الأدنى للطول مُطبَّق). يجب قراءة شروط الموقع والموافقة عليها قبل إنشاء حسابك.

تفعيل البريد الإلكتروني

بعد التسجيل، يُرسَل بريد إلكتروني للتحقق إلى عنوانك. انقر على الرابط في البريد الإلكتروني لتفعيل حسابك. إذا لم تستلمه، استخدم رابط تفعيل حسابك في صفحة تسجيل الدخول لطلب رمز جديد.

استعادة كلمة المرور

إذا نسيت كلمة مرورك، انقر على نسيت كلمة المرور في صفحة تسجيل الدخول وأدخل عنوان بريدك الإلكتروني. سيُرسَل إليك رابط للاسترداد. الرابط للاستخدام مرة واحدة وينتهي بعد وقت قصير.

5. رفع التورنتات

انتقل إلى رفع في شريط التنقل. يجب أن تكون مسجلاً دخولك بحساب نشط غير محظور. صفحة الرفع تحتوي على تبويبين:

تبويب الرفع — إرسال ملف .torrent موجود

اسحب وأفلت أو اختر ملف .torrent. بعد التحميل، أكمل الحقول:

الحقلمطلوبالوصف
ملف التورنتنعمملف .torrent للرفع.
الاسملاتجاوز اسم عرض التورنت. إذا تُرك فارغاً، يُستخدم الاسم المدمج في ملف التورنت.
الفئةنعمفئة المحتوى (أنمي، مانغا، صوتيات، إلخ).
الفئة الفرعيةلانوع أكثر تحديداً داخل الفئة (مثل RAW، Sub/Audio).
اللغاتلاعلامة لغة واحدة أو أكثر تصف لغة المحتوى.
المجموعةلاربط هذا الإصدار بمجموعة أنت عضو فيها.
الوصفلاوصف بتنسيق Markdown يظهر في صفحة تفاصيل التورنت (الحد الأقصى 65535 حرفاً).
خاصلاتعيين علامة الخصوصية في التورنت، مع تعطيل DHT/PEX. مفيد للتورنتات الخاصة بالمتتبع فقط.
عنوان URL للإعلانلاتجاوز أو إضافة عنوان URL للإعلان الرئيسي للمتتبع.
متتبعات إضافيةلايُقرأ من ملف التورنت. لا يمكن تعديله أثناء الرفع — استخدم تبويب الإنشاء إذا كنت تريد تخصيص قائمة المتتبعات.
التعليقلاتجاوز حقل التعليق المدمج في التورنت.
متطلب متتبعات AniRena

يجب أن يتضمن التورنت الخاص بك على الأقل رابط متتبع AniRena واحد في قائمة الإعلان (أي طبقة). يتحقق الموقع من ذلك عند الرفع وسيرفض التورنتات التي لا تتضمن متتبع AniRena. إذا أنشأت التورنت دون إضافة متتبع AniRena أولاً، قم برفعه ثم أعد تنزيله من الموقع — سيحتوي الملف المُنزَّل على المتتبعات الصحيحة مُضافةً تلقائياً.

تبويب الإنشاء — بناء تورنت جديد

يتيح لك تبويب الإنشاء توليد .torrent جديد من الصفر بتحديد مسارات الملفات وعناوين URL للمتتبع وإعدادات التورنت الأخرى مباشرةً في المتصفح. يُرسَل التورنت الناتج مع نفس حقول البيانات الوصفية أعلاه.

الإشراف

تُفحص عمليات الرفع تلقائياً مقابل قائمة من أنماط المحتوى المحظورة (الأسماء وأسماء الملفات والأوصاف). ستُرفض التورنتات التي تطابق نمطاً محظوراً. تُرفض أيضاً التورنتات المكررة (نفس info hash).

6. حسابك

انقر على اسم مستخدمك في الزاوية العلوية اليمنى لفتح لوحة الملف الشخصي. وهي منظمة في أقسام قابلة للطي:

الإعدادات

غيّر سمة واجهة المستخدم وحجم الخط ونظام الألوان ولغة الواجهة وتفضيلات العرض المتعلقة بالتورنت. تُحفظ التغييرات تلقائياً.

كلمة المرور

أدخل كلمة مرورك الحالية وكلمة المرور الجديدة مرتين. يُرسَل رمز التحقق إلى عنوان بريدك الإلكتروني المسجّل ويجب إدخاله لتأكيد التغيير. إذا كانت المصادقة الثنائية مفعّلة، يُطلب أيضاً رمز TOTP.

المصادقة الثنائية (2FA)

فعّل المصادقة الثنائية المستندة إلى TOTP باستخدام أي تطبيق مصادقة (مثل Google Authenticator وAegis وBitwarden). عند تفعيل 2FA:

  1. امسح رمز QR (أو أدخل السر يدوياً) في تطبيق المصادقة.
  2. أدخل الرمز المكون من 6 أرقام المعروض في تطبيقك لتأكيد الإعداد.
  3. احفظ رموز الاستعادة المعروضة — هذه رموز للاستخدام مرة واحدة لاستعادة الوصول إذا فقدت جهازك.

لتعطيل 2FA، أدخل رمز TOTP الحالي وأكّد.

الجلسات النشطة

اعرض جميع جلسات تسجيل الدخول النشطة حالياً بما فيها المتصفح ونظام التشغيل وعنوان IP ووقت آخر نشاط. انقر على إلغاء في أي جلسة لا تتعرف عليها. يمكنك أيضاً إلغاء جميع الجلسات دفعة واحدة لتسجيل الخروج من كل الأجهزة.

مفتاح API

أنشئ مفتاح API شخصياً يُستخدم لرفع التورنتات برمجياً عبر واجهة برمجة تطبيقات AniRena. انقر على توليد مفتاح لإنشاء مفتاح — يُعرض المفتاح الكامل مرة واحدة فور الإنشاء. احفظه بأمان؛ لن يُعرض بالكامل مرة أخرى. استخدم إلغاء لإبطال المفتاح نهائياً.

حذف الحساب

طلب حذف الحساب يبدأ فترة سماح مدتها 30 يوماً. يتم تعطيل حسابك فوراً وحذفه نهائياً بعد 30 يوماً. يمكنك إلغاء الحذف في أي وقت خلال تلك الفترة بتسجيل الدخول والنقر على إلغاء الحذف.

7. واجهة برمجة تطبيقات AniRena

يوفر AniRena واجهة برمجة تطبيقات JSON تتيح لك رفع التورنتات برمجياً باستخدام مفتاح API شخصي. تطبّق واجهة برمجة التطبيقات نفس القواعد كواجهة الويب: فحوصات الحظر وحدود المعدل وقيود وضع الموقع تسري. كل عملية رفع عبر API تُسجَّل في سجل التدقيق.

المصادقة

تستخدم واجهة برمجة التطبيقات نظام مصادقة من خطوتين. أولاً، استبدل مفتاح API الدائم بـ رمز حامل (Bearer Token) قصير الأجل، ثم مرر هذا الرمز في رأس Authorization لكل طلب API.

مفتاح API الخاص بك متاح من خلال حسابك > مفتاح API. احتفظ به سراً — أي شخص يمتلكه يمكنه الحصول على رموز حامل والرفع باسمك. إذا تعرّض للاختراق، ألغِه فوراً وأنشئ مفتاحاً جديداً.

الخطوة 1 — احصل على رمز حامل
POST/api/v1/auth/token

أرسل طلب POST إلى نقطة نهاية الرمز مع مفتاح API في رأس Authorization. لا يُطلب جسم طلب.

Authorization: ApiKey <your-api-key>
استجابة الرمز
{
  "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>
تسجيل دخول بطلب واحد (مع المصادقة الثنائية)
POST/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 جديد
}
استجابة الرمز
{
  "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"])

الخطوة 2 — رفع تورنت

POST/api/v1/torrents

أرسل طلب POST بتنسيق JSON عادي مع رمز الحامل في رأس Authorization.

جسم الطلب
الحقلالنوعمطلوبالوصف
torrentstringنعممحتويات ملف .torrent مشفّرة بـ Base64.
categorystringنعمSlug الفئة: anime أو manga أو audio أو literature أو live أو pictures أو software أو hentai أو other.
namestringلاتجاوز اسم عرض التورنت.
sub_categorystringلاSlug الفئة الفرعية (مثل raw أو sub-audio). يجب أن تنتمي إلى الفئة المختارة.
languagesstring[]لامصفوفة من رموز اللغة BCP 47 (مثل en أو ja).
group_idstringلاUUID لمجموعة أنت عضو فيها لربط هذا الإصدار بها.
descriptionstringلاوصف إصدار بتنسيق Markdown (الحد الأقصى 65535 حرفاً).
commentstringلاتجاوز حقل التعليق المدمج في التورنت.
is_privatebooleanلاتعيين true لتفعيل علامة الخصوصية في التورنت.
comments_enabledbooleanلاالسماح بالتعليقات على هذا التورنت. الافتراضي true (مفعّل).
anime_idstringلاUUID لإدخال أنمي لربطه بهذا التورنت. احصل على UUID عبر GET /api/v1/anime/search. يُرجع 400 إذا لم يتطابق UUID مع أي إدخال معروف.
announcestringلاتجاوز أو إضافة عنوان URL للإعلان الرئيسي.
trackersstringلاقائمة عناوين URL إضافية للمتتبع مفصولة بسطر جديد. سطر فارغ بين العناوين ينشئ مستوى متتبع جديداً.
testbooleanلااضبط على true لإجراء اختبار جاف: يتم التحقق من الطلب بالكامل لكن لا يتم حفظ التورنت. استخدم هذا للتحقق من صحة البيانات قبل الإرسال الفعلي.
وضع الاختبار الجاف أضف "test": true إلى أي طلب رفع للتحقق مما إذا كان سينجح دون إضافة التورنت فعلياً. تُطبَّق جميع قواعد التحقق — المصادقة، البحث عن الفئة، اكتشاف التكرار، الأنماط المحظورة، متطلبات المتتبع — لذا يعكس الرد بالضبط ما ستُرجعه عملية الإرسال الحقيقية. يتم تدوير الرمز المميز عند النجاح.
استجابة نجاح الاختبار الجاف — 200 OK
{
  "ok":           true,
  "test":         true,
  "name":         "My Torrent Title",
  "info_hash_v1": "aabbccddeeff...",
  "info_hash_v2": null
}
رموز اللغات المتاحة
ababAbkhazian
aaaaAfar
afafAfrikaans
akakAkan
sqsqAlbanian
amamAmharic
ararArabic
ar-001ar-001Arabic (Modern Standard)
ananAragonese
hyhyArmenian
asasAssamese
avavAvaric
aeaeAvestan
ayayAymara
azazAzerbaijani
bmbmBambara
babaBashkir
eueuBasque
bebeBelarusian
bnbnBengali
bhbhBihari
bibiBislama
bsbsBosnian
brbrBreton
bgbgBulgarian
mymyBurmese
yueyueCantonese
cacaCatalan
chchChamorro
ceceChechen
nynyChichewa
zhzhChinese
zh-HKzh-HKChinese (Hong Kong)
zh-Hanszh-HansChinese (Simplified)
zh-SGzh-SGChinese (Singapore)
zh-TWzh-TWChinese Traditional
cucuChurch Slavic
cvcvChuvash
kwkwCornish
cocoCorsican
crcrCree
hrhrCroatian
cscsCzech
dadaDanish
dvdvDivehi
nlnlDutch
nl-BEnl-BEDutch (Belgian)
dzdzDzongkha
enenEnglish
en-USen-USEnglish (US)
eoeoEsperanto
etetEstonian
eeeeEwe
fofoFaroese
fjfjFijian
filfilFilipino
fifiFinnish
frfrFrench
fr-CAfr-CAFrench (Canadian)
ffffFula
glglGalician
lglgGanda
kakaGeorgian
dedeGerman
de-ATde-ATGerman (Austrian)
elelGreek
gngnGuarani
guguGujarati
hthtHaitian Creole
hahaHausa
heheHebrew
hzhzHerero
hihiHindi
hohoHiri Motu
huhuHungarian
isisIcelandic
ioioIdo
igigIgbo
ididIndonesian
iaiaInterlingua
ieieInterlingue
iuiuInuktitut
ikikInupiaq
gagaIrish
ititItalian
jajaJapanese
jvjvJavanese
klklKalaallisut
knknKannada
krkrKanuri
ksksKashmiri
kkkkKazakh
kmkmKhmer
kikiKikuyu
rwrwKinyarwanda
rnrnKirundi
kvkvKomi
kgkgKongo
kokoKorean
kjkjKuanyama
kukuKurdish
kykyKyrgyz
loloLao
lalaLatin
lvlvLatvian
liliLimburgish
lnlnLingala
ltltLithuanian
luluLuba-Katanga
lblbLuxembourgish
mkmkMacedonian
mgmgMalagasy
msmsMalay
mlmlMalayalam
mtmtMaltese
gvgvManx
mimiMaori
mrmrMarathi
mhmhMarshallese
mnmnMongolian
nanaNauru
nvnvNavajo
ngngNdonga
neneNepali
ndndNorth Ndebele
seseNorthern Sami
nonoNorwegian
nbnbNorwegian Bokmål
nnnnNorwegian Nynorsk
ococOccitan
ororOdia
ojojOjibwe
omomOromo
ososOssetic
pipiPali
pspsPashto
fafaPersian
plplPolish
ptptPortuguese
pt-BRpt-BRPortuguese (Brazil)
papaPunjabi
ququQuechua
roroRomanian
rmrmRomansh
ruruRussian
smsmSamoan
sgsgSango
sasaSanskrit
scscSardinian
gdgdScottish Gaelic
srsrSerbian
sr-Latnsr-LatnSerbian (Latin)
snsnShona
iiiiSichuan Yi
sdsdSindhi
sisiSinhala
skskSlovak
slslSlovenian
sosoSomali
nrnrSouth Ndebele
ststSouthern Sotho
esesSpanish
es-419es-419Spanish (Latin America)
es-MXes-MXSpanish (Mexico)
susuSundanese
swswSwahili
ssssSwati
svsvSwedish
tltlTagalog
tytyTahitian
tgtgTajik
tataTamil
ttttTatar
teteTelugu
ththThai
boboTibetan
titiTigrinya
totoTongan
tstsTsonga
tntnTswana
trtrTurkish
tktkTurkmen
twtwTwi
ukukUkrainian
ururUrdu
ugugUyghur
uzuzUzbek
veveVenda
viviVietnamese
vovoVolapük
wawaWalloon
cycyWelsh
fyfyWestern Frisian
wowoWolof
xhxhXhosa
yiyiYiddish
yoyoYoruba
zazaZhuang
zuzuZulu
مثال على الطلب
# 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
استجابة النجاح — 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رمز الحامل مفقود أو منتهي الصلاحية أو تم تدويره بالفعل. أعد المصادقة عبر POST /api/v1/auth/token.
403الحساب محظور أو معطّل أو IP محظور.
409تورنت مكرر — نفس info hash موجود بالفعل.
422لا يمكن تحليل ملف التورنت أو فشل التحقق (نمط محظور أو بنية غير صالحة).
429تجاوزت حد المعدل. أعد المحاولة بعد انتهاء الفترة الزمنية.
503الموقع في وضع الصيانة أو القراءة فقط.

حد المعدل

عمليات رفع API تخضع لحد معدل قابل للتكوين منفصل عن واجهة الويب. يُحدَّد الحد والفترة بواسطة مدير الموقع. عند تجاوز حد المعدل، تُعيد API رمز 429 Too Many Requests. الحد مطبّق لكل مفتاح API.

احتفظ بمفتاح 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 .
الأعلام الرئيسية
الحقلالوصف
--pathالمسار إلى الملف أو المجلد لتحزيمه (مطلوب).
--outputاسم ملف .torrent الناتج (مطلوب).
--versionصيغة BitTorrent — 1 = v1، 2 = v2، 3 = hybrid (الافتراضي: 3).
--trackerإضافة عنوان URL لإعلان المتتبع. كرر العلم لإضافة متتبعات متعددة.
--commentتضمين سلسلة تعليق بيانات وصفية في التورنت.
--privateتعيين علم الخصوصية لتقييد التوزيع على المتتبعات المدرجة فقط.
--piece-sizeحجم القطعة بالكيلوبايت (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"])

البحث في بيانات التورنت الوصفية

POST/api/v1/torrents/search

أرسل طلب POST بتنسيق JSON عادي لاسترداد قوائم التورنت مع نفس خيارات البحث والتصفية المتاحة على الموقع. ملف .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"])
معاملات البحث
الحقلالنوعمطلوبالوصف
qstringلابحث نصي حر. يدعم بادئات group:slug وgroup:"الاسم" وuser:الاسم.
categorystringلاSlug الفئة (مثل "anime").
sub_categorystringلاSlug الفئة الفرعية (مثل "raw").
languagesstring[]لامصفوفة من رموز اللغة BCP 47 (مثل en أو ja).
sortstringلاحقل الترتيب: date (الافتراضي) أو size أو seeders أو leechers أو completed أو title.
orderstringلااتجاه الترتيب: desc (الافتراضي) أو asc.
pageintegerلارقم الصفحة، يبدأ من 1 (الافتراضي 1).
per_pageintegerلاالنتائج لكل صفحة، 1–250 (الافتراضي 50).
hide_adultbooleanلااستبعاد تورنتات فئة البالغين. الافتراضي true للمستخدمين العاديين.
show_deadbooleanلاعند تعيينها على 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. حسابات الفريق معفاة.

الحصول على تفاصيل التورنت

GET/api/v1/torrent/{id}

استرجع البيانات الوصفية الكاملة لتورنت واحد — بما في ذلك الحقول التي يحذفها نقطة بحث التورنت مثل وصف Markdown، وتعليق ملف .torrent المضمن، وقائمة الملفات مع حجم كل ملف، والتخطيط الكامل لطبقات المتعقب. يتم قراءة أعداد البذور والآخذين الحية من المتعقب عند توفرها.

الاستجابة
{
  "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 عندما لا يحتوي مخزن المتعقب على إدخال لهذا التجزئة المعلوماتية أو يتعذر الوصول إليه.

ext_seeders, ext_leechers — أعلى عدد للبذور والآخذين الذي أبلغ عنه أي متعقب خارجي تم استطلاعه لهذا التورنت. تتداخل المتعقبات التي تتعقب نفس السرب، لذا يُستخدم الحد الأقصى بدلاً من المجموع؛ يُبلغ كلاهما عن 0 عندما لا يحتوي أي متعقب على بيانات استطلاع لهذا التجزئة المعلوماتية.

استجابات الخطأ
حالة HTTPالمعنى
400يجب أن يكون معرف التورنت إما UUID مكون من 36 حرفًا مع شرطات أو سلسلة سداسية عشرية مكونة من 32 حرفًا.
401رمز الحامل مفقود أو منتهي الصلاحية أو تم تدويره بالفعل. أعد المصادقة عبر POST /api/v1/auth/token.
404التورنت غير موجود.
429تجاوزت حد المعدل. أعد المحاولة بعد انتهاء الفترة الزمنية.
503الموقع في وضع الصيانة أو القراءة فقط.

جلب تعليقات التورنت

GET/api/v1/torrents/{id}/comments

استرجاع التعليقات بشكل مُرقَّم لتورنت معين. يتحكم إعداد COMMENT_PER_PAGE في ملف .env الخاص بالخادم في عدد التعليقات لكل صفحة (الافتراضي 20). فقط التورنتات التي تم تفعيل التعليقات عليها تُعيد نتائج — جميع الأخرى تُعيد 403.

معاملات الاستعلام
الحقلالنوعمطلوبالوصف
pageintegerلارقم الصفحة، يبدأ من 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"])
الاستجابة
{
  "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رمز الحامل مفقود أو منتهي الصلاحية أو تم تدويره بالفعل. أعد المصادقة عبر POST /api/v1/auth/token.
403التعليقات معطّلة لهذا التورنت.
404التورنت غير موجود.
503الموقع في وضع الصيانة أو القراءة فقط.

البحث عن إدخالات الأنمي

GET/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"])
معلمات الاستعلام
الحقلالنوعمطلوبالوصف
qstringنعمسلسلة البحث عن العنوان (مطلوبة). تتطابق مع العنوان والمرادفات.
pageintegerلارقم الصفحة، يبدأ من 1 (الافتراضي 1).
per_pageintegerلاالنتائج لكل صفحة، 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
    }
  ]
}

عرض المجموعات واسترجاعها

GET/api/v1/groups

يُرجع قائمة مُقسَّمة من المجموعات العامة (المُفعَّلة وغير المقفلة). يتطلب مصادقة Bearer token.

GET/api/v1/groups/{id_or_slug}

يُرجع مجموعة عامة واحدة حسب المعرف الرقمي أو slug. يُرجع 404 إذا كانت المجموعة معطلة أو مقفلة.

معاملات الاستعلام (القائمة فقط)
الحقلالنوعمطلوبالوصف
qstringلاتصفية حسب اسم المجموعة (اختياري، مطابقة جزئية).
pageintegerلارقم الصفحة (الافتراضي 1).
per_pageintegerلاالنتائج لكل صفحة، 1–100 (الافتراضي 20).
sortstringلاعمود الترتيب: name | slug | members | torrents | created (الافتراضي name).
orderstringلااتجاه الترتيب: 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رمز الحامل مفقود أو منتهي الصلاحية أو تم تدويره بالفعل. أعد المصادقة عبر POST /api/v1/auth/token.
404المجموعة غير موجودة أو غير متاحة للعموم.
429تجاوزت حد المعدل. أعد المحاولة بعد انتهاء الفترة الزمنية.
503الموقع في وضع الصيانة أو القراءة فقط.

8. تبرعات

إذا كنت ترغب في دعم AniRena والمساعدة في تغطية تكاليف استضافة خوادمنا وخدماتنا، يسعدنا استقبال تبرعك على أحد المحافظ الرقمية التالية:

Bitcoinbc1qy2h3ddq6ak5damvnf4r5vu3ydehhxrcq8gllwn
Ethereum0xCbaFe03832F95F86AF2536d52710e78C63b62Cd3
Solana3ucetj2XDGHQg9PVRPMxerNi7c6kX7GJkjQNg9yjwGeg
LitecoinLbpt61yX3RjGtB1Ef8vgVz6Hr6baQsTjVk

أي تبرع، كبيراً كان أم صغيراً، موضع تقدير كبير ويذهب مباشرة نحو استمرار AniRena. شكراً لدعمك!

9. البرامج

‏AniRena Player تطبيق سطح مكتب مجاني يتيح لك بث الفيديو مباشرة من التورنتات المفهرسة على هذا الموقع — دون الحاجة إلى انتظار اكتمال التنزيل. ما عليك سوى لصق رابط مغناطيسي أو فتح ملف ‎.torrent‎، ويبدأ التشغيل بمجرد توفر بيانات كافية.

كلا الإصدارين مستقلان تمامًا — جميع التبعيات مضمنة داخل الملف التنفيذي. لا حاجة إلى مثبت أو بيئة تشغيل، فقط نزّل وشغّل.

ويندوز تحديث تلقائي
  • v0.3.2 latest AniRena-Player_0.3.2_x64-setup.exe · 43.4 MB (33 تنزيلات)
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1_x64-setup.exe · 43.9 MB (64 تنزيلات)
  • v0.3.0 AniRena-Player_0.3.0_x64-setup.exe · 43.7 MB (8 تنزيلات)
  • v0.2.9 AniRena-Player_0.2.9_x64-setup.exe · 43.5 MB (6 تنزيلات)
  • v0.2.8 AniRena-Player_0.2.8_x64-setup.exe · 43.5 MB (17 تنزيلات)
  • v0.2.7 AniRena-Player_0.2.7_x64-setup.exe · 43.5 MB (19 تنزيلات)
  • v0.2.6 AniRena-Player_0.2.6_x64-setup.exe · 43.4 MB (3 تنزيلات)
  • v0.2.5 AniRena-Player_0.2.5_x64-setup.exe · 43.4 MB (8 تنزيلات)

مثبت (.exe). يقوم بتحديث نفسه داخل التطبيق.

macOS · Apple Silicon تحديث تلقائي
  • v0.3.2 latest AniRena-Player_0.3.2_aarch64.dmg · 45.7 MB (2 تنزيلات)

صورة قرص (.dmg) لأجهزة Mac بمعالج Apple Silicon (M1 وأحدث). يقوم بتحديث نفسه داخل التطبيق.

macOS · Intel تحديث تلقائي

صورة قرص (.dmg) لأجهزة Mac بمعالج Intel. يقوم بتحديث نفسه داخل التطبيق.

لينكس · AppImage تحديث تلقائي
  • v0.3.2 latest AniRena-Player_0.3.2_amd64.AppImage · 95.1 MB (8 تنزيلات)
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1_amd64.AppImage · 138.1 MB (19 تنزيلات)
  • v0.3.0 AniRena-Player_0.3.0_amd64.AppImage · 138.0 MB (4 تنزيلات)
  • v0.2.9 AniRena-Player_0.2.9_amd64.AppImage · 137.7 MB (35 تنزيلات)
  • v0.2.8 AniRena-Player_0.2.8_amd64.AppImage · 137.6 MB (23 تنزيلات)
  • v0.2.7 AniRena-Player_0.2.7_amd64.AppImage · 137.6 MB (20 تنزيلات)
  • v0.2.5 AniRena-Player_0.2.5_amd64.AppImage · 137.6 MB (18 تنزيلات)

ملف واحد محمول، لا حاجة للتثبيت. التنسيق الوحيد على لينكس مع التحديث التلقائي داخل التطبيق.

Debian / Ubuntu
  • v0.3.2 latest AniRena-Player_0.3.2_amd64.deb · 14.2 MB (2 تنزيلات)
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1_amd64.deb · 62.5 MB (4 تنزيلات)
  • v0.3.0 AniRena-Player_0.3.0_amd64.deb · 62.4 MB (3 تنزيلات)
  • v0.2.9 AniRena-Player_0.2.9_amd64.deb · 62.1 MB (4 تنزيلات)
  • v0.2.8 AniRena-Player_0.2.8_amd64.deb · 62.0 MB (26 تنزيلات)
  • v0.2.7 AniRena-Player_0.2.7_amd64.deb · 62.0 MB (12 تنزيلات)
  • v0.2.5 AniRena-Player_0.2.5_amd64.deb · 62.0 MB (11 تنزيلات)

التثبيت: sudo apt install ./<file>.deb — يتم التحديث عبر apt أو بتنزيل جديد، ليس داخل التطبيق.

Fedora / RHEL
  • v0.3.2 latest AniRena-Player_0.3.2-1_x86_64.rpm · 14.2 MB (1 تنزيلات)
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1-1_x86_64.rpm · 62.5 MB (3 تنزيلات)
  • v0.3.0 AniRena-Player_0.3.0-1_x86_64.rpm · 62.4 MB (2 تنزيلات)
  • v0.2.9 AniRena-Player_0.2.9-1_x86_64.rpm · 62.1 MB (23 تنزيلات)
  • v0.2.8 AniRena-Player_0.2.8-1_x86_64.rpm · 62.0 MB (5 تنزيلات)
  • v0.2.7 AniRena-Player_0.2.7-1_x86_64.rpm · 62.0 MB (8 تنزيلات)
  • v0.2.5 AniRena-Player_0.2.5-1_x86_64.rpm · 62.0 MB (7 تنزيلات)

التثبيت: sudo dnf install ./<file>.rpm — يتم التحديث عبر dnf أو بتنزيل جديد، ليس داخل التطبيق.

أندرويد · arm64
  • v0.3.2 latest AniRena-Player_0.3.2_arm64.apk · 110.3 MB (71 تنزيلات)
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1_arm64.apk · 110.3 MB (62 تنزيلات)
  • v0.3.0 AniRena-Player_0.3.0_arm64.apk · 110.1 MB (8 تنزيلات)
  • v0.2.9 AniRena-Player_0.2.9_arm64.apk · 109.1 MB (12 تنزيلات)
  • v0.2.8 AniRena-Player_0.2.8_arm64.apk · 109.1 MB (22 تنزيلات)
  • v0.2.7 AniRena-Player_0.2.7_arm64.apk · 109.0 MB (17 تنزيلات)

ثبّت يدويًا على أجهزة أندرويد ARM 64 بت (معظم الهواتف / الأجهزة اللوحية الحديثة). يتم التحديث بتنزيل APK جديد.

أندرويد · arm7
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1_arm7.apk · 97.8 MB (15 تنزيلات)

ثبّت يدويًا على أجهزة أندرويد ARM 32 بت (الهواتف / الأجهزة اللوحية الأقدم). يتم التحديث بتنزيل APK جديد.

أندرويد · x86_64
  • v0.3.2 latest AniRena-Player_0.3.2_x86_64.apk · 114.3 MB (7 تنزيلات)
إصدارات أقدم
  • v0.3.1 AniRena-Player_0.3.1_x86_64.apk · 114.3 MB (12 تنزيلات)
  • v0.3.0 AniRena-Player_0.3.0_x86_64.apk · 114.1 MB (4 تنزيلات)
  • v0.2.9 AniRena-Player_0.2.9_x86_64.apk · 113.1 MB (4 تنزيلات)
  • v0.2.8 AniRena-Player_0.2.8_x86_64.apk · 113.0 MB (9 تنزيلات)
  • v0.2.7 AniRena-Player_0.2.7_x86_64.apk · 113.0 MB (11 تنزيلات)

ثبّت يدويًا على أجهزة أندرويد x86 64 بت أو المحاكيات. يتم التحديث بتنزيل APK جديد.