المشكلة التي تحلها
مكتبات الفيديو الكبيرة غير قابلة للبحث فعليًا. يقلّب المعجبون ساعات من التسجيلات بحثًا عن لحظة يتذكرونها بشكل غامض، ويعيد طلاب الدورات مشاهدة دروس كاملة للعثور على شرح واحد، وتفقد الشركات معرفة مؤسسية مدفونة في المحاضرات المسجلة. فهرسة النصوص مع الطوابع الزمنية تحوّل كل مكتبة إلى شيء يمكنك البحث فيه كأنه مستند، مع نتائج تنقلك مباشرة إلى اللحظة الصحيحة.
ما يجب تضمينه في نسختك الأولى
- بحث بالعبارات والكلمات المفتاحية في كل فيديوهات القناة أو قائمة التشغيل
- نتائج تعرض الجملة المطابقة مع رابط إلى الطابع الزمني بالضبط
- بحث دلالي بحيث يجد سؤال «كيف أسعّر منتجي» أيضًا عبارة «تحديد أسعارك»
- تصفية حسب التاريخ والفيديو والمتحدث
- فهرسة تلقائية للفيديوهات الجديدة
كيف تبنيها خطوة بخطوة
- 01
اجمع قائمة الفيديوهات
استدعِ /channels/resolve أو /playlists/resolve باسم القناة أو رابط قائمة التشغيل للحصول على معرّف كل فيديو وعنوانه.
- 02
اجلب النصوص بالجملة
أرسل المعرّفات إلى /batch مع تفعيل format.timestamp وformat.paragraphs. تعمل الدفعات الكبيرة بشكل غير متزامن، لذا استعلم دوريًا من /batch/{batch_id} أو استخدم Webhook.
- 03
فهرس المقاطع
خزّن كل فقرة مع معرّف الفيديو ووقت البداية. يكفي بحث النص الكامل في Postgres للبحث بالكلمات المفتاحية؛ وأضف التضمينات (embeddings) في pgvector أو قاعدة بيانات متجهات للبحث حسب المعنى.
- 04
ابنِ واجهة البحث
أعد أفضل النتائج المطابقة مع النص المحيط بها ورابط بالصيغة youtube.com/watch?v=ID&t=SECONDS ليصل المستخدم إلى اللحظة بالضبط.
- 05
حافظ على التحديث
شغّل مهمة مجدولة تعيد تحليل القناة، وتجد معرّفات الفيديوهات الجديدة، وتفرّغ نصوصها هي فقط.
كود جاهز للبدء
تعتمد هذه الفكرة على نمط «الوصفة 3: حمّل قائمة تشغيل كاملة في قاعدة معرفة». استبدل القنوات والتعليمات (prompts) ووسيلة التخزين بما يناسبك.
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DBلماذا تستحق البناء
بِعه لمالك المكتبة لا للمشاهد: شبكات البودكاست ومنصات الدورات والشركات التي تملك أرشيفات فيديو داخلية ستدفع رسومًا شهرية مقابل بحث يحافظ على تفاعل جمهورها. ولمجتمعات المعجبين، ينجح أيضًا بحث عام مجاني مع فئة مدفوعة للتنبيهات أو الوصول عبر API.
أخطاء يجب تجنبها
- فهرسة النص كاملًا كمستند واحد: تصبح نتائج البحث عديمة الفائدة دون طوابع زمنية على مستوى الفقرة.
- إعادة تفريغ القناة بأكملها عند كل تحديث بدلًا من تتبّع معرّفات الفيديوهات التي عالجتها بالفعل.
- الاعتماد فقط على المطابقة الحرفية للكلمات المفتاحية: اللغة المنطوقة غير منتظمة، لذا أضف البحث الدلالي مبكرًا.
أسئلة حول هذه الفكرة
هل أحتاج إلى قاعدة بيانات متجهات للبحث في نصوص YouTube؟
لا. يتعامل بحث النص الكامل في Postgres جيدًا مع البحث بالكلمات المفتاحية لمعظم المكتبات. أضف التضمينات عندما تريد نتائج تطابق المعنى لا الكلمات الحرفية.
كيف أربط نتيجة البحث باللحظة الدقيقة في الفيديو؟
يتضمن كل مقطع من النص وقت بداية بالثواني. أضف &t= متبوعًا بهذا الرقم إلى رابط YouTube.
هل يمكنني فهرسة فيديوهات بلا ترجمة مصاحبة؟
نعم. فعّل allow_asr مع رابط Webhook، وسيفرّغ API الصوت بتقنية التعرف على الكلام بالذكاء الاصطناعي عند غياب الترجمة المصاحبة.