فيديوهاتيالتوثيق

المشغّل

حزمة ‎@videohati/player‎ الرسمية — مشغّل الويب المستقلّ عن أُطر العمل. ضمّنه بوسم سكربت أو ثبّته من npm، ثم تحكّم فيه بواجهة أوامر صغيرة.

يعرض @videohati/player فيديو فيديوهاتي المحميّ في أي صفحة ويب. لا تبعية له على إطار عمل، وواجهته عربية أولًا من اليمين إلى اليسار، وتدفّق تشغيله مربوط بجلسة مع نبضة قلب وعلامة مائية على الفيديو. وهو رادع لا نظام حماية رقمية (DRM). الإصدار ‏1.0.0.

يحتاج كل تضمين إلى sessionToken من POST /v1/playback/sessions في الخادم — أنشئه بـ @videohati/node أو videohati/laravel. ويجب ألّا يصل مفتاح API إلى المتصفح أبدًا.

التضمين بوسم سكربت

أضف سكربت المشغّل وعنصر div يحمل الفيديو والمشروع ورمز الجلسة. يُركَّب المشغّل تلقائيًا على كل عنصر [data-videohati-video-id]، ويُفكّك نفسه عند إخفاء الصفحة.

<script src="https://cdn.videohati.com/player.js" async></script>
<div
  data-videohati-video-id="01JZ9WV3N8GQ5T2M7K4C6XBARH"
  data-videohati-project-id="01JZ9WV3N8GQ5T2M7K4C6XBARF"
  data-videohati-session-token="<sessionToken>"
  data-videohati-autoplay="muted"
  data-videohati-width="640"
  data-videohati-height="360"
  data-videohati-lang="ar"
  data-videohati-viewer-text="أحمد ك."
></div>

من دون رمز جلسة يرفض المشغّل التركيب ويعرض "Missing session token".

السمةماذا تضبط
data-videohati-video-idالفيديو المراد تشغيله (مطلوب).
data-videohati-project-idالمشروع المالك للفيديو (مطلوب).
data-videohati-session-tokenرمز الجلسة المُنشأ في الخادم (مطلوب).
data-videohati-autoplay"muted" يشغّل تلقائيًا مكتومًا؛ "true" يحاول بلا كتم؛ الافتراضي معطّل.
data-videohati-widthالعرض بالبكسل.
data-videohati-heightالارتفاع بالبكسل.
data-videohati-lang"ar" (الافتراضي) أو "en".
data-videohati-viewer-textالنص المرسوم في العلامة المائية.
data-videohati-api-originتجاوز أصل واجهة API (بيئة التجهيز، تجاوزات محلية).

npm

ثبّت الحزمة وأنشئ مشغّلًا بنفسك حين تحتاج الكائن — مثلًا لاستدعاء play() أو الاشتراك في الأحداث.

npm install @videohati/player
import { Videohati } from "@videohati/player";

const player = Videohati.create({
  target: document.querySelector("#player")!,
  videoId: "01JZ9WV3N8GQ5T2M7K4C6XBARH",
  projectId: "01JZ9WV3N8GQ5T2M7K4C6XBARF",
  sessionToken,
  lang: "en",
});

player.on("state", (state) => console.log(state));
player.play();

تُعيد Videohati.create(options) كائن Player.

الخيارالنوعماذا يفعل
targetHTMLElement | string (مطلوب)العنصر أو المُحدِّد الذي يُعرَض فيه المشغّل.
videoIdstring (مطلوب)الفيديو المراد تشغيله.
projectIdstring (مطلوب)المشروع المالك للفيديو.
sessionTokenstring (مطلوب)رمز الجلسة المُنشأ في الخادم.
autoplayboolean | "muted""muted" يشغّل تلقائيًا مكتومًا؛ true يحاول بلا كتم؛ الافتراضي false.
widthnumberالعرض بالبكسل.
heightnumberالارتفاع بالبكسل.
lang"ar" | "en"لغة الواجهة. الافتراضي العربية.
viewerTextstringنص العلامة المائية؛ يعود إلى نص المشاهد في الجلسة.
apiOriginstringتجاوز أصل واجهة API.

واجهة المشغّل

يكشف الكائن واجهة أوامر صغيرة.

الدالةماذا تفعل
play()تبدأ التشغيل.
pause()توقف التشغيل مؤقتًا.
seek(seconds)تقفز إلى وقت، محدودًا بطول الفيديو.
setQuality(name)تختار جودة بالاسم (مثل "720p") أو "auto".
setLanguage(lang)تبدّل لغة الواجهة أثناء التشغيل ("ar" / "en").
getState()تُعيد الحالة الراهنة.
on(event, listener)تشترك في حدث.
off(event, listener)تزيل مستمعًا.
destroy()تفكّك المشغّل وتُنهي الجلسة.

استدعِ destroy() عند إزالة المشغّل من الصفحة — فهي تُنهي الجلسة وتوقف نبضة القلب. ويقوم التضمين بوسم السكربت بهذا نيابةً عنك عند إخفاء الصفحة.

الحالات

تُعيد getState() والحدث state إحدى القيم:

idle · loading · playing · paused · ended · stopped · error.

وstopped حالة نهائية يدخلها المشغّل عند إبطال الجلسة أو العبث بالعلامة المائية.

الأحداث

اشترك بـ player.on(name, listener).

الحدثالحمولةيُطلَق عند
stateالحالة الجديدةتغيّر حالة التشغيل.
error{ code, message }فشل التشغيل أو انتهاء الجلسة.
timeupdate{ currentTime, duration }حركة مؤشّر التشغيل.
qualitychange{ quality }تغيّر الجودة النشطة.
watermarkTamperedالعبث بالعلامة المائية على الفيديو.
captureBlockedحجب محاولة التقاط داخل الصفحة.

يُطلَق الأخيران عند العبث بالعلامة المائية على الفيديو أو حجب محاولة التقاط — ويمكنك تسجيلهما.

اللغة والاتجاه

نصّ الواجهة عربيّ افتراضيًا. مرّر lang: "en" (أو data-videohati-lang="en") للإنجليزية. الشيء الوحيد الذي تغيّره اللغة هو النصوص: أمّا هيكل المشغّل نفسه فمن اليسار إلى اليمين دائمًا، كأيّ مشغّل شائع، فيُرتَّب تخطيطه بصورة صحيحة داخل صفحة من اليمين إلى اليسار.

وإن لم يمرّر التضمين lang، يتبع المشغّل إعداد لغة واجهة المشغّل الخاص بالمشروع (لوحة التحكم ← المشروع ← المشغّل)، بما في ذلك خيار «حسب لغة متصفح المشاهد».

تخصيص المشغّل

يتبع كلُّ تضمين ضمن المشروع إعداداتِ المشغّل الخاصة بالمشروع — دون تغيير كود التضمين. افتح لوحة التحكم ← المشروع ← المشغّل لضبط:

  • لغة الواجهة والخط — العربية أو الإنجليزية أو لغة متصفح المشاهد؛ وخط من مجموعة مستضافة ذاتيًا (يُحمَّل من شبكة Videohati وليس من أي طرف ثالث).
  • اللون الأساسي — شريط التقدم وزر التشغيل الكبير وتحديدات القوائم.
  • الأزرار — إظهار أو إخفاء كل زر (تشغيل/إيقاف، ‏±10 ثوانٍ، شريط التقدم، الوقت، الصوت، الجودة، الإعدادات، ملء الشاشة). خيارا «صورة داخل صورة» وAirPlay متاحان كتفعيل اختياري ويبقيان مطفأين افتراضيًا: التشغيل المنبثق والبث إلى الشاشات يتجاوزان العلامة المائية وحمايات الالتقاط.
  • سرعات التشغيل — عناصر قائمة السرعة بالضبط (من 0.1× إلى 16×، حتى 12 خيارًا، و1.00× مضمّنة دائمًا).
  • خريطة المشاهدة الحرارية — منحنى كثافة مشاهدة عام فوق شريط التقدم، يظهر بعد 30 جلسة مشاهدة على الأقل للفيديو.
  • استئناف موضع المشاهدة (مفعّل افتراضيًا)، والأزرار المدمجة، وCSS مخصّص محصور في ‎.vh-player.

تسري الإعدادات على جلسات التشغيل المنشأة بعد الحفظ؛ والتضمين الذي يمرّر lang صراحةً يحتفظ به.

سياسة أمان المحتوى

اسمح بأصلَي المشغّل. يغطّي connect-src حركة واجهة API والتشغيل؛ ويغطّي ‏media-src blob: الوسائط المتدفّقة؛ ولا يلزم script-src إلّا للتضمين بوسم السكربت.

connect-src https://api.videohati.com https://cdn.videohati.com;
media-src blob:;
script-src https://cdn.videohati.com;