رسانه و آرشیو

GXStream

جی‌ایکس‌استریم

آرشیو و پخش انیمه، کاملاً روی زیرساخت خودت

یک خط تولید کامل برای آرشیو انیمه: دانلود از تلگرام، نام‌گذاری خودکار، آپلود به گوگل درایو و یک پورتال وب برای تماشا. همه‌چیز روی سرورهای خودت اجرا می‌شود و هیچ سرویس واسطه‌ای در کار نیست.

وضعیت
پایدار
پلتفرم
لینوکس (سرور)
فناوری
Python 3
وضعیت آرشیو
در حال اجرا روی سه سرور
FIG. 01 جریان واقعی کار
  1. 01 کانال منبع پیام‌های حاوی لینک دانلود
  2. 02 صف اولویت‌دار ترتیب بر اساس محبوبیت
  3. 03 دانلود موازی روی سه سرور، هر کدام یک برش
  4. 04 نام‌گذاری خودکار از یک تابع واحد
  5. 05 آپلود به فضای ابری چند حساب، با سقف روزانه
  6. 06 پایگاه‌داده و پورتال همگام‌سازی دوطرفه
01

چرا ساخته شده

مشکلی که حل می‌کند

پیدا کردن، دانلود و مرتب نگه‌داشتن یک آرشیو بزرگ انیمه به‌صورت دستی غیرممکن می‌شود. فایل‌ها نام‌های نامرتب دارند، فصل‌ها با هم قاطی می‌شوند و معلوم نیست کدام قسمت از کدام فصل است.

برای چه کسی

کسی که یک کتابخانهٔ بزرگ انیمه دارد و می‌خواهد روی فضای ابری خودش، با نام‌گذاری تمیز و قابل جست‌وجو نگه‌داری شود.

02

قابلیت‌ها

6 قابلیت، هر کدام با توضیح کوتاه و مشخص.

  1. 01

    آرشیو خودکار و نیمه‌موازی

    کار روی سه سرور تقسیم شده است. هر سرور یک برش جداگانه از صف را برمی‌دارد، پس هیچ قسمتی دو بار دانلود نمی‌شود.

  2. 02

    صف اولویت‌دار بر اساس محبوبیت

    ترتیب صف از ترکیب امتیاز و محبوبیت AniList ساخته می‌شود، بنابراین کارهای محبوب‌تر زودتر آرشیو می‌شوند.

  3. 03

    نام‌گذاری قطعی فایل

    نام هر فایل فقط از یک تابع واحد ساخته می‌شود، پس نام‌ها روی درایو و در پایگاه‌داده هرگز از هم جدا نمی‌افتند.

  4. 04

    همگام‌سازی دوطرفهٔ پایگاه‌داده

    پایگاه‌دادهٔ SQLite بین سرورها همگام می‌شود تا فهرست پورتال همیشه با آرشیو واقعی بخواند.

  5. 05

    سقف مصرف روزانه

    هر سرور سهمیهٔ روزانهٔ خودش را می‌داند و بعد از رسیدن به سقف، کار جدید را تا روز بعد متوقف می‌کند.

  6. 06

    پورتال وب با فیلتر دسته‌بندی

    پورتال کارت‌ها را از همان پایگاه‌داده می‌سازد و بین انیمه، فیلم درسی، جزوه و پوشه‌های فرعی تفکیک می‌کند.

03

چطور کار می‌کند

رابط این ابزار قابل تصویربرداری نیست، پس به‌جای تصویر ساختگی، جریان واقعی کارش بر اساس مستندات خود پروژه رسم شده است.

نمودار جریان کار — بر اساس مستندات خود پروژه، نه تصویر ماکت
  1. کانال منبع پیام‌های حاوی لینک دانلود
  2. صف اولویت‌دار ترتیب بر اساس محبوبیت
  3. دانلود موازی روی سه سرور، هر کدام یک برش
  4. نام‌گذاری خودکار از یک تابع واحد
  5. آپلود به فضای ابری چند حساب، با سقف روزانه
  6. پایگاه‌داده و پورتال همگام‌سازی دوطرفه
04

راه‌اندازی

دستورها همان‌هایی هستند که در خود پروژه اجرا می‌شوند. هر بلوک یک دکمهٔ کپی دارد.

پیش‌نیازها

  • لینوکس با Python 3 و venv
  • rclone با ریموت‌های گوگل درایو تنظیم‌شده
  • حساب تلگرام (api_id و api_hash) برای دانلود
  • فضای دیسک برای پایگاه‌دادهٔ SQLite و کش موقت

پیش‌نیاز این روش: Python 3.10 یا بالاتر · rclone نصب و احراز هویت‌شده

  1. پروژه را در سرور قرار بده

    bash
    cd /home/ubuntu/TelegramStreamer
  2. محیط مجازی بساز و وابستگی‌ها را نصب کن

    وابستگی‌ها در requirements.txt فهرست شده‌اند: hydrogram، aiohttp، cryptg، pycryptodome و imageio-ffmpeg.

    bash
    python3 -m venv venv
    ./venv/bin/pip install -r requirements.txt
  3. فایل config.json را بساز

    مقادیر واقعی را از حساب تلگرام خودت بگذار. این مقادیر هرگز نباید در مخزن عمومی قرار بگیرند.

    json
    {
      "api_id": <YOUR_API_ID>,
      "api_hash": "<YOUR_API_HASH>",
      "bot_token": "<YOUR_BOT_TOKEN>",
      "allowed_users": [<YOUR_TELEGRAM_USER_ID>],
      "port": 8080,
      "bind_address": "0.0.0.0"
    }

    مقادیر داخل <> را با اطلاعات خودت جایگزین کن. این فایل را در گیت نگه ندار.

  4. ریموت‌های گوگل درایو را تنظیم کن

    آرشیو روی چند ریموت جدا پخش می‌شود و یک ریموت اتحاد روی همهٔ آن‌ها ساخته می‌شود.

    bash
    rclone config
    # برای هر حساب یک ریموت بساز، مثلاً gdrive1 .. gdrive4
    rclone lsd gdrive_vault:
  5. سرویس را نصب و اجرا کن

    سرویس systemd با متغیرهای محیطی، سهمیه و نقش هر سرور را تعیین می‌کند.

    bash
    sudo tee /etc/systemd/system/gxstream-archiver.service >/dev/null <<'UNIT'
    [Unit]
    Description=GXStream Vault Archiver
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=simple
    User=ubuntu
    WorkingDirectory=/home/ubuntu/TelegramStreamer
    Environment=MAX_ACTIVE_ACCOUNTS=2
    Environment=GX_SHARD_INDEX=0
    Environment=GX_SHARD_TOTAL=3
    Environment=GX_DAILY_GB=60
    Environment=GX_QUALITY=1080
    ExecStart=/home/ubuntu/TelegramStreamer/venv/bin/python3 \
      /home/ubuntu/TelegramStreamer/animworld_multi_worker_archiver.py
    Restart=always
    RestartSec=30
    
    [Install]
    WantedBy=multi-user.target
    UNIT
    
    sudo systemctl daemon-reload
    sudo systemctl enable --now gxstream-archiver

نشانهٔ موفقیت: با journalctl -u gxstream-archiver -f باید خط‌های پیشرفت آرشیو را ببینی.

05

در عمل

پیشرفت آرشیو را ببین

bash
journalctl -u gxstream-archiver -n 50 --no-pager

حجم آرشیو روی درایو را چک کن

bash
rclone size gdrive_vault:

سهمیهٔ مصرف امروز

هر سرور مصرف روزانهٔ خودش را در یک فایل JSON نگه می‌دارد و همان را مبنای توقف کار می‌گذارد.

bash
cat /home/ubuntu/TelegramStreamer/daily_transfer.json
06

محدودیت‌ها و عیب‌یابی

این بخش عمداً صریح است؛ محدودیت‌ها پنهان نشده‌اند.

  • آرشیو به یک منبع تلگرامی خاص وابسته است؛ اگر آن کانال محتوا را حذف کند، آن عنوان از دست می‌رود.
  • سهمیهٔ پهنای‌باند سرورها سقف واقعی سرعت است، نه قدرت پردازش.
  • داده‌های نام فارسی از یک مرجع بیرونی می‌آید و آن مرجع برای بخشی از فهرستش نام فارسی ندارد؛ در آن موارد نام خالی می‌ماند.
  • تأییدنشده: آمار دقیق حجم و تعداد فایل هر روز تغییر می‌کند، پس در این صفحه عدد ثابتی به‌عنوان آمار منتشر نشده است.

مشکل‌های واقعی و راه‌حلشان

آرشیو کار نمی‌کند ولی خطایی هم در لاگ نیست

علت همگام‌سازی پایگاه‌داده بین سرورها بی‌صدا شکست می‌خورد، چون سرویس با کاربر اشتباهی اجرا شده است.

راه‌حل سرویس را با همان کاربری اجرا کن که کلید SSH و known_hosts دارد؛ اجرای آن با sudo باعث خطای تأیید میزبان می‌شود.

پورتال تغییرات را نشان نمی‌دهد

علت پاسخ فهرست پورتال برای مدتی کش می‌شود.

راه‌حل سرویس پورتال را ری‌استارت کن و تا ساخته‌شدن کش سرد صبر کن.

مصرف از سقف روزانه رد شده

علت سقف بر اساس شناسهٔ یکتای فایل شمرده می‌شود، نه تعداد سطرها؛ اگر شمارش اشتباه شود سقف بی‌اثر می‌شود.

راه‌حل شمارش را روی شناسهٔ یکتا نگه دار و سطرهای بدون شناسه را نادیده بگیر.

07

ارتباط با ابزارهای دیگر

فقط ارتباط‌هایی که در خود پروژه‌ها قابل اثبات‌اند.

منابع این اطلاعات

  • README و اسناد پروژه در TelegramStreamer
  • فایل requirements.txt و config.json
  • unit سرویس systemd روی سرور
  • گزارش‌های وضعیت آرشیو

این پروژه مخزن عمومی ندارد، پس هیچ لینک مخزن یا دانلودی برای آن ساخته نشده است.