Download README.md from Reooiq/Hode: direct link, hf CLI and curl.
- Browser
- Download file 4.96 kB
-
https://huggingface.co/spaces/Reooiq/Hode/resolve/main/README.md
- Command line
-
hf download hf://spaces/Reooiq/Hode/README.md
-
curl -L -o README.md https://huggingface.co/spaces/Reooiq/Hode/resolve/main/README.md
title: '97'
sdk: docker
emoji: 🐨
colorFrom: pink
colorTo: gray
إصلاحات مطلوبة — ملخص B / C / D
B — عاصفة start_sender() ورمز 187
المشكلة: tick() / drive_event() كانت تستدعي start_sender() بلا شرط في أول الدورة، فتدفع ffmpeg إلى rtmps://a.rtmps.youtube.com:443/live2 قبل أن يكون liveBroadcast مربوطًا وبحالة ready/testing/live → 7 إخفاقات 187 خلال 5 دقائق، بداية متأخرة 5:22 و ~116 ثانية ضائعة.
الحل في youtube_manager.py:
start_sender()الآن تحرس نفسها:if not ev.get('bound') or not ev.get('broadcast_id'): return if ev.get('youtube_status') in ('complete','revoked','created'): returndrive_event()لم يعد يستدعيها فورًا بعدensure_broadcast(). بدلًا من ذلك:- بعد
ensure_broadcast()نحدثevونَمسح الملاحظة العالقة ثم نسقط إلى بوابة مشروطة - نقرأ
lifeCycleStatusالحقيقي منliveBroadcasts(مع احترام كوتا 45 ث) - نسمح بالإرسال فقط إذا كانت
life in ('ready','testing','live')، وإلا نُوقف المرسل ونكتبانتظار جاهزية الاستقبال life == 'live'→ نشغّل المرسل ثمstream_health،ready/testing + streamStatus==active→ نطلبtransitionإلىlive
- بعد
النتيجة: لا دفع قبل وجود الـ ingest، لا عاصفة 187، ولا تأخير 5 دقائق.
C — youtube_api.py بلا إعادة محاولة + الملاحظة لا تُمسح
المشكلة 1: _request() كانت تفعل urlopen(timeout=25) مرة واحدة. أي فشل TLS عابر → SSLError / URLError → تُرمى كـ خطأ داخلي ... (SSLError) وتكتبها _event_error() في note ولا شيء يمسحها → بقيت 40 دقيقة رغم أن البث سليم.
الحل في youtube_api.py:
- إضافة
import ssl - حلقة إعادة محاولة 3 مرات مع backoff أسي (1ث، 2ث، 4ث):
HTTP 429/500/502/503/504→ إعادة محاولة مع1.2*(attempt+1)ثURLError, TimeoutError, OSError, ValueError, ssl.SSLError, SSLEOFError ...→ إعادة محاولة، ثمAPIError(None,'networkOrInvalidResponse')فقط بعد نفاد المحاولات
- هذا يحول الفشل اللحظي لـ TLS من رسالة "حماية الأحداث" إلى نجاح صامت بعد ثانية.
المشكلة 2: _event_error() تكتب note ولا مسح عند التعافي.
الحل في youtube_manager.py:
- دالة جديدة
_clear_stale_error_note(key)تمسحnoteإذا احتوتحماية الأحداثأوخطأ داخليأوnetworkOrInvalidResponse - تُستدعى في
drive_event()في 4 نقاط تعافي:- بداية الدورة بعد تأكد
obs status == live - بعد
ensure_stream()ناجح - بعد
ensure_broadcast()ناجح - بعد كل
remote('liveBroadcasts')ناجح (التحقق الفعلي من الشبكة)
- بداية الدورة بعد تأكد
فإذا تعافت الشبكة، تختفي الملاحظة فورًا بدل 40 دقيقة.
D — Dockerfile.txt في المستودع
المشكلة: رفعت Dockerfile باسم Dockerfile.txt (sha 89e0bc09 = نسختي السابقة) فتجاهله Docker وبنى من القديم بدون:
YOUTUBE_FORMAT_GUARD=off
YOUTUBE_FIFO_TIMESHIFT=10
YOUTUBE_HEALTH_INTERVAL=180
فبقي timeshift=10 يعمل فقط من القيمة الافتراضية في relay.py (ts = int(os.getenv('YOUTUBE_FIFO_TIMESHIFT','10'))) ولم تكن واضحة في الـ image.
الحل:
- الملف المرفق
Dockerfileهو النسخة الصحيحة (محتوىDockerfile.txtالسابق) — يحتوي كل متغيرات YouTube ingestion + التعليقات الكاملة. - احذف
Dockerfile.txtمن المستودع (أو على الأقل لا ترفعه):git rm Dockerfile.txt git add Dockerfile youtube_api.py youtube_manager.py git commit -m "fix: gate start_sender (187 storm), retry youtube_api TLS, clear stale note, fix Dockerfile name" git push - بعدها
docker buildسيقرأDockerfileالصحيح مباشرة، والقيم ستكون صريحة في الـ image وليس فقط default الكود.
الملفات المرفقة
youtube_api.py— مع retryyoutube_manager.py— مع guard + مسح الملاحظةDockerfile— النسخة الصحيحة (احذف Dockerfile.txt)
كل الإصلاحات في الكود فقط كما طلبت، بلا تغيير سلوك الحالات السليمة، وباحترام كوتا YouTube (poll كل 45ث، health كل 180ث).