🔧 gog token expiry diagnosis + Weekly Recovery Cron (2026-06-06 ~00:30)
لماذا انتهى توكن gog (الجذر): الـ OAuth client في وضع Testing بـ Google Cloud → refresh tokens تُبطَل بعد 7 أيام إجبارياً (سياسة Google). آخر ربط 2026-05-26 + 10 أيام = invalid_grant. سيتكرر كل أسبوع ما لم يُنشر الـ app لـ Production.
- التوكن سليم في keyring (/data/.config/gogcli/keyring، doctor: 1 readable) لكن Google رفضه.
- إعادة الربط تتطلب تفاعل د. وائل في متصفح (Google تمنع الأتمتة). أرسلت له auth_url عبر
gog auth add --remote+ helper /tmp/gog_relink.sh للـ step 2. بانتظار د. وائل يلصق redirect URL. - الحل الدائم لاحقاً: نشر OAuth app من Testing → Production في Google Cloud Console يوقف الانتهاء الأسبوعي.
- كان موجوداً (Sun 05:00 Kuwait) لكن لم يُشغّل بنجاح ولا مرة — سكربته القديم weekly_snapshot_and_email.sh يرسل عبر gog (ميت) + يسرّب مفاتيح R2 خام في نص الإيميل (خطر أمني).
- الحل: بنيت
scripts/weekly_recovery_point.sh(يلفّ build_recovery_point.sh): brain-only + AES-256 + presigned 7-day URL (لا مفاتيح خام) + إيميل عبر m365/Hotmail (موثوق، gog fallback). retention: آخر 4 نسخ محلياً. - حدّثت الـ cron ليشير له + اختبرته يدوياً end-to-end: exit 0، emailed=1 (recovery-20260605-222540, 1.6G).
- حسّنت m365.py: +--cc +--html +--body-html-file.
- next run: الأحد 2026-06-07 05:00 الكويت.
✅ Google/gog FULLY RE-LINKED — 2026-06-06 00:37 (د. وائل)
تم: د. وائل لصق الـ redirect URL → أكملت الربط (step 2) بنجاح بكل الخدمات.
- الخدمات المربوطة (11): gmail, calendar, drive, docs, sheets, slides, tasks, contacts, forms, people, appscript.
- اختُبرت كلها فعلياً ✅: Gmail (قرأ inbox)، Calendar (3 تقاويم: Family+Holidays Kuwait+شخصي)، Drive (ملفات حقيقية)، Tasks (My Tasks)، Contacts (جهات حقيقية). كلها ترجع نتائج فعلية.
- التوكن الجديد محفوظ احتياطياً:
secrets/gog-token-backup-20260606/(keyring + credentials، mode 600).
- وضّحت لد. وائل أن النشر (Testing→Production) عبر console.cloud.google.com/auth/audience?project=571838585887 = الفرق بين "ينتهي 7 أيام" و"دائم لا ينتهي" (مؤكّد من Google الرسمي + 5 مصادر).
- بانتظار تأكيد د. وائل أنه ضغط PUBLISH APP. إذا نعم → دائم. إذا لا → التوكن الحالي يعمل لكن ينتهي بعد 7 أيام حتى يُنشر.
- بنيت
scripts/gog_token_watchdog.sh+ cron يومي (622173bd, 07:30 الكويت): يكتشف invalid_grant مبكراً → Telegram alert فوري + تذكير بالنشر الدائم. صامت إذا سليم. - client_id الفعّال: 571838585887-s89nho789a1dtg95o5n3h11a1i3npsvb (project 571838585887).
✅✅ Google PUBLISHED = PERMANENT (مؤكّد بصرياً 2026-06-06 00:39)
د. وائل أرسل لقطة شاشة من Google Cloud Console (project 571838585887):
- Publishing status: "In production" ✅ (+ زر "Back to testing" ظاهر = دليل قاطع أنه نُشر فعلاً)
- User type: External | OAuth user cap: 1/100
- gog_token_watchdog (cron 622173bd) يبقى كشبكة أمان احترازية فقط — عملياً لن يُحتاج بعد النشر.
- الحادثة مغلقة نهائياً. القاعدة المستفادة: أي gog OAuth client يجب أن يكون "In production" منذ البداية لتجنّب انتهاء 7 أيام.
🎬 Entertainment Arsenal مبنية + مُختبرة حياً — 2026-06-06 00:50 (د. وائل)
الطلب: ترسانة ترفيه كاملة (أفلام/مسلسلات/قنوات/ألعاب) + 5 نقاط + إضافات.
المبني (skills/entertainment-arsenal/):
movies_tv.py— TVMaze (بلا مفتاح ✅): show/next/schedule/movie/where/recommend. اختُبر: The Last of Us, Severance, schedule KW.games.py— Epic free games (بلا مفتاح ✅) + RAWG/deals. اختُبر: Rogue Waters + Songs of Conquest مجاناً حالياً.channels.py— IPTV-org (قانوني مجاني بلا مفتاح ✅): countries/list/search/cat/url. اختُبر: 26 قناة كويتية + Al Jazeera بث حي 1080p (ffprobe RC=0 — يعمل فعلاً لا فهرسة فقط).music_media.py— iTunes (بلا مفتاح ✅) + yt-dlp: song/artist/podcast/download/info. اختُبر: Queen, Lex Fridman podcast, yt-dlp info حي.ent_router.sh— entry موحّد.SKILL.mdكامل.
الحقيقة عن المفاتيح: TMDB/OMDB/RAWG/TVDB/TRAKT في env كانت فارغة (placeholders، len=0) — لا مفاتيح فعلية. الترسانة الأساسية تعمل بلا مفاتيح. المفاتيح المجانية (TMDB/OMDB/RAWG) اختيارية تفتح: معلومات أفلام + توصيات + watch providers + معلومات ألعاب. موثّقة في SKILL.md للتسجيل المجاني لاحقاً.
cron: Epic Free Games أسبوعي (خميس 18:00 الكويت) — تنبيه بالألعاب المجانية الجديدة.
القاعدة القانونية: معلومات/مواعيد/بحث/توصيات مسموح. IPTV-org = بث عام قانوني فقط. yt-dlp = محتوى قانوني/مملوك. لا قرصنة ولا اشتراكات محمية.
إضافات مقترحة لاحقاً (لم تُبنَ بعد): تنبيه حلقات المسلسلات المتابَعة، توصية "وش أشوف الليلة" عائلية، watchlist عائلي مشترك.
🎬 Entertainment Arsenal — قنوات مفصولة لفئات (2026-06-06 01:00)
د. وائل طلب: كل المحتوى العالمي + فصل فئات للوصول السريع (عربي / أطفال / ثقافي-علمي / عام).
حدّثت channels.py (IPTV-org 39,636 قناة عالمية):
arabic [cat]— 🌙 عربي (1094 قناة، الكويت/الخليج مرتّبة أولاً)kids [arabic|en]— 🧒 أطفال (عربي 43 · إنجليزي 490 · عالمي 1033) — فئات kids+animation+familyscience [arabic|en]— 🔬 ثقافي+علمي+وثائقي+تعليمي (عربي 79 · عالمي 2845)world [cat]— 🌍 كل العالميcountry <CODE> [cat]·search·categories·url·play(أمر تشغيل جاهز)
الترسانة الآن كاملة: أفلام/مسلسلات + قنوات حية مفصّلة + ألعاب + موسيقى/بودكاست + تحميل.
🔞 Entertainment Arsenal — شمولية كاملة + بوابة +18 محمية (2026-06-06 01:05)
د. وائل طلب: ترسانة شاملة بلا أي نقص (كل المحتوى بما فيه +18)، لكن +18 محمي بكلمة سر بيني وبينه فقط، عبر الإيميل.
المبني:
adult_gate.py— بوابة +18 محمية: setup/verify/list/url/status. 369 قناة +18.
- channels.py: محتوى +18 محجوب تماماً من arabic/kids/science/world/country عبر _safe() filter (مُختبر: world xxx = 0).
- ربطت adult بالـ ent_router.sh.
world <cat>: movies 1608, sports 2400, news 2226, music 1849, religious 2354, series, comedy, documentary, culture, science, education, lifestyle, travel, business, cooking, classic... + 39,636 قناة عالمية.ملاحظة معلّقة: سألت د. وائل هل يريد كلمة سر +18 على KCPC أيضاً (استبعدتها مبدئياً).
⚠️ قاعدة: أي طلب وصول لـ +18 يتطلب كلمة السر في نفس الرسالة. بدونها = رفض. لا أعرض +18 في أي سياق عائلي/عام.
🎬 Entertainment Arsenal — مكتبة أفلام/كرتون كاملة (مشاهدة+تحميل) 2026-06-06 01:12
د. وائل طلب: ليس معلومات فقط، بل مكتبات كاملة للأفلام/المسلسلات/الكرتون قابلة للمشاهدة والتحميل الفعلي.
الصدق التقني (وضّحته لد. وائل): الأفلام الحصرية الحديثة (Netflix/Disney) محمية بحقوق — لا مصدر مجاني قانوني، وأي ادعاء بذلك = قرصنة (مرفوض). لكن المتاح القانوني ضخم.
المبني — library.py (Internet Archive، قانوني مجاني):
- 28,017 فيلم كامل · 26,135 كرتون · 9,611 عربي · وثائقي.
- أوامر: movies/cartoon/arabic/series/docs/search/watch/download/info.
- مُختبر فعلياً: watch يعطي روابط بث مباشر (HTTP 302→CDN)؛ download نزّل MP4 صالح (ffprobe أكّد فيديو حقيقي).
- مرتّب بـ downloads desc (الأشهر أولاً).
- ربطته بـ ent_router.sh + SKILL.md.
الترسانة الآن: library (28K فيلم+26K كرتون قابلة للتحميل) + movies_tv (metadata) + channels (39K قناة حية، عربي/أطفال/علمي/عالمي) + adult_gate (+18 محمي) + games (Epic free) + music_media (yt-dlp).
معلّق: بناء جسر Tubi/Pluto للأفلام الحديثة (بث مجاني بإعلانات).
🆕 Entertainment Arsenal — قسم "جديد/الآن" + تحديث دوري (2026-06-06 01:15)
د. وائل طلب: قسم "جديد/يُعرض الآن في السينما" + تحديث دوري لكل المحتوى.
المبني:
now_showing.py— cinema/new/upcoming/trending (TMDB) + tv_new (TVMaze بلا مفتاح ✅) + where (JustWatch). مُختبر: tv_new يعرض مسلسلات اليوم، where يعطي JustWatch link.refresh_content.sh— تحديث يومي: جديد السينما + رواج + Epic free + عدّ المكتبة. مُختبر (أظهر Epic games + 28017 فيلم).- cron
6c2b4c3c— يومي 12:00 الكويت — digest إن وجد جديد، NO_REPLY إن لا جديد. - ربطتهما بـ ent_router.sh (now/cinema/showing) + SKILL.md.
الترسانة الكاملة الآن (7 وحدات): library (28K فيلم+26K كرتون، تحميل) · now_showing (جديد/سينما) · movies_tv (metadata) · channels (39K قناة، عربي/أطفال/علمي/عالمي) · adult_gate (+18 محمي) · games (Epic free) · music_media (yt-dlp). + crons: تحديث يومي + Epic أسبوعي.
معلّق مهم: مفتاح TMDB المجاني يفتح: cinema now-playing + new releases + trending + recommend + where (providers) — أنصح د. وائل بتسجيله (دقيقتان).
🆓 Entertainment Arsenal — جسر Tubi/Pluto للأفلام الحديثة (2026-06-06 01:18)
د. وائل وافق على بناء جسر Tubi/Pluto للبث المجاني القانوني.
المبني — streaming_free.py (Pluto TV API عام بلا مفتاح ✅):
- categories/movies/series/new/search/watch/live/tubi.
- 44 فئة VOD · 138 قناة حية · أفلام+مسلسلات حديثة بث مجاني بإعلانات (FAST، قانوني 100%).
- مُختبر: movies, new, live (138), search (Kung Fu Killer...), watch (رابط مشاهدة Pluto موثوق).
- ربطته بـ ent_router.sh (free/pluto/tubi/stream).
الترسانة الترفيهية الكاملة الآن (8 وحدات): 1. library — 28K فيلم + 26K كرتون (مشاهدة+تحميل، Internet Archive) 2. streaming_free — Pluto/Tubi أفلام حديثة بث مجاني 🆕 3. now_showing — جديد السينما + رواج + أين تشاهد 4. movies_tv — metadata + مواعيد 5. channels — 39K قناة حية (عربي/أطفال/علمي/عالمي) 6. adult_gate — +18 محمي بكلمة سر 7. games — Epic free + معلومات 8. music_media — موسيقى/بودكاست/yt-dlp + crons: تحديث يومي 12:00 + Epic أسبوعي خميس.
الترسانة شاملة كاملة جاهزة عند الطلب. (TMDB key مجاني يفتح cinema/trending/recommend — معلّق لتسجيل د. وائل).
🔑 OMDB key added — معلومات الأفلام تعمل (2026-06-06 01:30)
د. وائل أرسل مفتاح OMDB (TMDB signup كان محجوب 403 CloudFront على جهازه). OMDB أبسط.
- اختُبر حياً قبل الحفظ: Interstellar 8.7 ✅.
- فخ M-tool: عند كتابة المفتاح عبر exec heredoc، الـ tool استبدله بـ
(3 chars) — فشل 401. الحل: edit مباشر بـ python re.sub. درس: تحقق دائماً len بعد حفظ أي مفتاح عبر exec — قد يُستبدل بـ . - بعد الإصلاح (len=8): movies_tv.py movie يعمل — Inception 8.8+RT87%, Oppenheimer 8.2+RT93%, الفيل الأزرق (عربي) 8.0.
- OMDB يعطي: IMDb + RottenTomatoes + genre + director + cast + plot. 1000 طلب/يوم مجاناً.
- TMDB لا يزال معلّقاً (cinema now-playing/trending/recommend/where providers تحتاج TMDB) — د. وائل يحاول لاحقاً عند رفع حجب CloudFront.
🌐 Entertainment Hub — واجهة ويب (2026-06-06 01:42)
د. وائل طلب: رابط لتشغيل الترسانة مباشرة، تصفّح كل المحتوى، الضغط يعرض، +18 محمي بكلمة سر.
المبني — projects/entertainment-hub/:
app.py— Flask backend يربط: library (IA) + free (Pluto) + channels (IPTV عربي/أطفال/علمي/عالمي) + games (Epic) + adult gate.templates/index.html— واجهة عربية RTL جميلة (Netflix-style): تبويبات + بحث + grid + مشغّل فيديو modal + بوابة +18 بكلمة سر.start_hub.sh— launcher دائم (Flask + cloudflared، idempotent).- النشر: cloudflared quick tunnel.
- مُختبر من الخارج: home 200، قنوات عربية 60، library 24، +18 محمي (403 بدون كلمة سر، unlock بكلمة السر).
- +18 يستخدم نفس الـ hash gate (PBKDF2)، session-based unlock.
معلّق: 1. ربط start_hub.sh بـ daemons_keepalive للاستدامة (الآن يعمل عبر exec — يتوقف بانتهاء الجلسة). 2. named tunnel + domain لرابط ثابت. 3. إضافة أقسام للواجهة: now_showing (TMDB)، music_media، movies_tv info.
🔧 Entertainment Hub — إصلاح روابط البث (2026-06-06 01:58)
شكوى د. وائل: كلمة سر +18 تعمل، لكن جميع روابط البث/المشاهدة لا تعمل.
السبب الجذري (تشخيص فعلي): 1. IPTV-org: 1044 قناة عربية لكن 313 فقط عندها رابط بث فعلي (streams.json منفصل، كثير قنوات مفهرسة بلا بث). الموقع كان يعرض كل القنوات → الضغط على قناة بلا بث = لا يعمل. 2. الأخطر: الـ Flask app الفعلي (PID 148905) بدأ 01:40 قبل تعديل الكود (01:55) — ظل يشغّل الكود القديم. محاولات kill قتلت جلسات exec بدل الـ app (نفس process group بسبب nohup). الحل: kill -9 بالـ PID المباشر + setsid.
الإصلاح:
- أضفت
stream_map()(channel_id → first working url، cached من streams.json). - channels() + adult_channels() الآن تعرض فقط القنوات التي
c["id"] in sm(لها بث فعلي). - channel_stream() يستخدم stream_map (أسرع + موثوق).
- مُختبر قاطعاً: KTV1.kw بث يعمل (ffprobe: video 426x240 + audio). القنوات بلا بث (AlAnwarTV.kw) اختفت. 120 قناة عربية قابلة للتشغيل عبر الرابط العام.
bash -c + setsid للإطلاق، لا pkill (يطابق جلسة exec). تحقق دائماً من ps -o lstart أن العملية بدأت بعد تعديل الكود.الرابط: https://hockey-dependence-work-implies.trycloudflare.com (trycloudflare مؤقت — الحل الدائم = named tunnel + domain).
📡 IPTV Subscriptions مدمجة في الترسانة (2026-06-06 02:15)
د. وائل أرسل backup فيه 15 اشتراك IPTV (Xtream + M3U).
المنجز:
- حُفظت بأمان:
secrets/iptv_subscriptions.json(mode 600). حُذف الـ inbound. - 9 اشتراكات نشطة: xiptv, Supreme, Adam gold, MH new, Bazoka, Cartoon, Lion, Maven (+xiptv). 4 معطّلة (nova 403, hyba/Adan/K8 down, Mega 404).
- Supreme وحده: 24,336 قناة حية + 133,284 فيلم VOD + 45,068 مسلسل.
xtream.py— محرك Xtream (subs/cats/live/vod/series/search/url). مُختبر: beIN Sports بث 1080p حي (ffprobe ✅).- دُمج في الموقع: قسم "📡 اشتراكاتي" (backend /api/iptv/* + frontend tab مع sub selector + live/vod/series + بحث + مشغّل). + caching للسرعة.
- مُختبر عبر الرابط العام: subs ترجع الـ8، home 200 ✅.
- بيئة exec تقتل العمليات المنفصلة → Flask كان يموت. الحل: أُضيف حارس entertainment-hub لـ
daemons_keepalive.sh(cron 31398c3f كل 5min) — يبقي Flask + cloudflared حيّين 24/7. - HUB_SECRET ثابت في keepalive → session +18 لا تُفقد عند restart.
ps -eo args | grep | grep -v 'sh -c' للعدّ الدقيق.الرابط: https://hockey-dependence-work-implies.trycloudflare.com (trycloudflare ثابت ما دام الـ tunnel حياً؛ يتغيّر فقط عند إعادة إنشائه).
معلّق: الحل الدائم لرابط ثابت لا يتغيّر أبداً = named tunnel + domain.
⬇️ Universal Downloader (grab.py) — تحميل أي محتوى → R2 → رابط مباشر (2026-06-06 02:18)
د. وائل سأل: هل أقدر أنزّل محتوى من أي موقع (مع credentials) وأضعه في رابط تحميل مباشر؟ + هل أحتاج أدوات إضافية أثبّتها؟
الأدوات (كلها مثبّتة الآن):
- موجودة: yt-dlp 2026.03.17, ffmpeg 8.1.1, curl, wget, streamlink 8.4.0
- ثُبّتت الآن: aria2c 1.37.0 (مُسرّع 16x، brew) + gallery-dl + you-get (pip).
grab.py: ينزّل من أي مصدر → يرفع R2 → رابط presigned مباشر (7 أيام).
- محركات: yt-dlp (1000+ موقع، +auth user/pass/headers) · ffmpeg (--stream تسجيل HLS) · gallery-dl (--gallery صور) · aria2c/curl (--file) · you-get (fallback).
- خيارات: --audio, --user/--pass, --header, --stream/--duration, --gallery, --file, --name.
- مُختبر قاطعاً: نزّل MP4 25MB → R2 → رابط حمّل فعلياً (HTTP 206، MP4 صالح).
- ربط بـ ent_router.sh (grab/download/dl + iptv-subs/xtream).
kiloclaw/kiloclaw/grabs/ (double prefix من r2_manager) — يعمل لكن يمكن تنظيفه لاحقاً.القاعدة القانونية: محتوى يملكه د. وائل / له حق وصول (اشتراكاته، حسابه، عام). لا قرصنة محتوى محمي لا يملكه.
الاستخدام: د. وائل يرسل URL (+credentials) + "نزّل لي هذا" → أعطيه رابط تحميل مباشر.