RapidVideoMaker
إنشاء حساب

API RapidVideoMaker

تتيح REST API معالجة ملفات الفيديو من أي عميل HTTP — سكريبتات Python، سير عمل n8n، أدوات الطرف الثالث. خمسة أوضاع متاحة: دمج الفيديوهات (عدة MP4/MOV)، تحرير الصوت (MP4/MOV + MP3)، إنشاء فيديو (JPG/PNG + MP3)، تراكب الفيديو (2 MP4/MOV صورة داخل صورة). المعالجة غير متزامنة: أرسل الملفات ثم استعلم عن النتيجة.

احصل على رمز API مجاناً
أنشئ حساباً للحصول على رمز API — 20 طلباً يومياً قابلة للاستخدام من الواجهة أو API.
إنشاء حساب مجاني لديك حساب؟ تسجيل الدخول

سير العمل الكامل

كل تكامل يتبع نفس التسلسل المكون من 4 خطوات:

1
إنشاء مهمة — POST /api/v1/render.php
أرسل ملفاتك بصيغة multipart/form-data مع رمز Bearer. صورة JPG/PNG + ملف MP3 + mode=image_to_video → إنشاء فيديو. ملف MP4/MOV + ملف MP3 → تحرير صوتي. عدة ملفات MP4/MOV → دمج. يعيد الخادم job_id فريداً. أو صورة + options.text + options.voice: يُولَّد الصوت من النص، بدون MP3.
2
انتظار المهمة — GET /api/v1/jobs.php?job_id=…
استعلم عن هذه النقطة بانتظام (كل 5-10 ثوانٍ). تمر المهمة بـ queued → processing → ready (أو error).
3
الحصول على رابط التنزيل
عندما تصبح الحالة ready، يحتوي الرد على حقل download_url جاهز للاستخدام.
4
تنزيل الملف — GET /api/download.php?job_id=…
قم بتنزيل ملف MP4/MOV النهائي. الملف متاح لمدة ساعتين بعد اكتمال المهمة، ثم يُحذف تلقائياً.

المصادقة

يجب أن يتضمن كل طلب رمز API الخاص بك. يُقبل نوعان من الصيغ:

# المصادقة — يجب أن يتضمن كل طلب رمز API الخاص بك. يُقبل نوعان من الصيغ: Authorization: Bearer rvm_your_token_here # Alternative X-API-Key: rvm_your_token_here

رمزك متاح في منطقة الأعضاء — رمز واحد لكل حساب، يُنشأ تلقائياً عند التسجيل.

الحصة

لكل حساب عضو 20 طلباً يومياً مشتركة بين واجهة الويب وAPI. المهام الفاشلة لا تستهلك الحصة. يُعاد ضبط العداد عند منتصف الليل UTC.

تتضمن ردود POST حقلَي quota_used وquota_remaining. عند تجاوز الحد، يرد الخادم بـ 429.

الواجهة + API = عداد واحد. مقطع فيديو أُنشئ من الواجهة وطلب API يستهلكان كل منهما نقطة واحدة من الحصة اليومية ذاتها.

قائمة الانتظار

تُعالج مهمة واحدة في كل مرة. إذا أُرسلت عدة مهام في آنٍ واحد، تُضاف إلى قائمة انتظار وتُعالج بالترتيب. أثناء الانتظار، يتضمن رد الحالة:

يُطبَّق حد المعدل: تقبل نقطة /api/v1/jobs.php حداً أقصى 12 طلباً في الدقيقة لكل رمز. التوصية: 10 ثوانٍ بين كل طلب.

الانتقالات المتاحة

مرر transition_type=none (الافتراضي) للدمج المباشر، أو أحد الأنواع التالية للتلاشي بين المقاطع:

none fade fadeblack dissolve wipeleft wiperight slideleft slideright zoomin circleclose

المدة (transition_duration) بين 0.2 و2.0 ثانية.

نقاط النهاية

POST /api/v1/render.php ينشئ مهمة معالجة فيديو

خمسة أوضاع، يمكن الوصول إليها عبر حقل mode (احذف mode مع عدة MP4 لاكتشاف fusion تلقائياً):

الاستخدامنمط APIالملفات المطلوبةالوصف
دمج مقاطع الفيديو fusion 2-20 ملف MP4/MOV تُجمَّع المقاطع من البداية إلى النهاية بالترتيب المقدم. انتقالات اختيارية بين المقاطع.
تحرير الصوت add_audio أو mix_audio ملف MP4/MOV + ملف MP3 يستبدل أو يُثري المسار الصوتي للفيديو. لا يُعاد ترميز مسار الفيديو أبداً.

add_audio — يُحذف الصوت الأصلي ويُستبدل كلياً بملف MP3.
mix_audio — يُحتفظ بالصوت الأصلي ويُضاف MP3 فوقه.
إنشاء فيديو image_to_video صورة JPG/PNG + ملف MP3 — أو صورة JPG/PNG + نص (options.text + options.voice): يُولَّد الصوت يُنشئ فيديو من صورة ثابتة وملف MP3 الخاص بك — أو من نص بسيط (options.text) يُولَّد صوته (options.voice). النص المركّب (ثابت أو كلمة بكلمة أو كاريوكي) والتلاشي والدقة وfps قابلة للضبط عبر الحقل options.
تراكب الفيديو overlay_video 2 MP4/MOV يضع فيديو ثانياً فوق الفيديو الرئيسي. الموضع والحجم والشفافية والصوت قابلة للضبط عبر حقل options.
إضافة نص add_text ملف MP4/MOV واحد يضيف نصًا فوق فيديو موجود (تبقى الدقة ومعدل الإطارات والصوت). نفس إعدادات النص في image_to_video، بالإضافة إلى لحظة ظهور النص. الحقل options.text مطلوب.
نص إلى MP3 text_to_mp3 (نص فقط) يحوّل النص إلى كلام ويُعيد ملف MP3. لا حاجة لرفع ملفات — أرسل mode=text_to_mp3 وtext وlang كحقول نموذج. يدعم جميع لغات الموقع العشرين.
تحقق صارم: كل نمط يتطلب عدداً وأنواعاً محددة من الملفات. add_audio وmix_audio يقبلان ملف MP4/MOV واحد + ملف MP3 واحد فقط. image_to_video يقبل صورة JPG/PNG واحدة + ملف MP3 واحد فقط. استثناء: مع options.text + options.voice، يقبل image_to_video صورة واحدة فقط — يُولَّد الصوت من النص (بدون MP3).
قاعدة المدة: في أنماط الصوت وimage_to_video، مدة النتيجة مقفلة على مدة MP3. مع options.voice، تكون مدة image_to_video هي مدة الصوت المُولَّد من النص (+0.6 ث).

المعاملات المشتركة (multipart/form-data)

الحقلالنوعمطلوبالوصف
videos[]File[]نعمالملفات المراد معالجتها. حسب النمط: 2-20 ملف MP4/MOV، أو ملف MP4/MOV + ملف MP3، أو صورة (JPG/PNG) + ملف MP3. الحد الأقصى 500 ميجابايت لكل ملف.
modestring*image_to_video | add_audio | mix_audio | overlay_video | text_to_mp3. مطلوب لهذه الأنماط غير الخاصة بالدمج. حذف mode مع ملفات MP4/MOV فقط يؤدي دائمًا إلى fusion (دمج بنسخ التدفق) — أبدًا overlay_video، حتى مع وجود ملفي MP4/MOV بالضبط. لتحرير الصوت: add_audio يحذف الأصلي، mix_audio يبقيه ويدمج فوقه. إذا تم توفير حقل mode، يجب أن تتطابق الملفات المرفوعة تمامًا — وإلا يُرفض الطلب. يُقبل add_text أيضًا: وهو الوضع الوحيد الذي يستقبل ملف MP4/MOV واحدًا، ويتطلب options.text.
orderJSONنمط fusion فقط — مصفوفة JSON من الفهارس التي تحدد ترتيب المقاطع.
transition_typestringنمط fusion فقط. الافتراضي: none.
transition_durationfloatنمط fusion فقط. المدة 0.2-2.0 ثانية. الافتراضي: 0.5.
optionsJSONكائن JSON لمعاملات العرض الخاصة بـ image_to_video, add_text, mix_audio وoverlay_video (انظر الجداول أدناه).
timingsFile / stringimage_to_video / add_text: ملف توقيتات الكاريوكي (SRT أو LRC، حتى 200 كيلوبايت) — حقل ملف أو نص عادي. يؤخذ النص المعروض من الملف؛ يفرض text_mode=karaoke؛ غير متوافق مع voice.
callback_urlstringرابط عام (http/https) يُستدعى عند اكتمال المهمة. يتضمن الرد webhook_secret.

معاملات options — نمط image_to_video

جميعها اختيارية. القيم غير المحددة → تُطبَّق الافتراضيات من طرف العامل.

المفتاحالنوعالافتراضيالوصف
textstring""النص المعروض كتراكب. فارغ = بلا نص. حد أقصى 500 حرف.
fontstring"default"خط النص، حسب المعرّف. القيم المقبولة: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = الخط القياسي (يدعم الإيموجي)؛ amiri = خط النسخ، مثالي للنص العربي. أي قيمة أخرى تُرجع الخطأ invalid_option. لا تظهر الإيموجي إلا مع default.
font_sizeint60حجم الخط بالبكسل. النطاق: 10-300.
text_colorstring"white"لون النص (مثلاً: white، yellow، #ffffff).
text_positionstring"center"موضع النص: center، top، bottom.
boxbooltrueخلفية شبه شفافة خلف النص.
box_colorstring"black@0.4"اللون + الشفافية بصيغة FFmpeg: color@opacity.
fade_durationfloat0.5مدة التلاشي الداخل/الخارج بالثوانٍ (0-2). 0 = بلا تأثير.
widthint1080عرض الفيديو بالبكسل (64-3840، يُجبر على عدد زوجي).
heightint1920ارتفاع الفيديو بالبكسل (64-3840، يُجبر على عدد زوجي).
fpsint24معدل الإطارات (1-60).
image_fitstring"contain"contain: أظهر الصورة أو الفيديو بالكامل واملأ المساحات الفارغة بالخلفية المختارة. solid (افتراضي) أو blur. يتطلب التمويه image_fit=contain. يبقى النص واضحًا. cover: يتم تكبير الصورة لملء الإطار، مع تقليم الأطراف.
bg_colorstring"black"background_mode=solid: لون الخلفية إذا لم تملأ الصورة الدقة المستهدفة.
background_modestring"solid"solid (افتراضي) أو blur. يتطلب التمويه image_fit=contain. يبقى النص واضحًا.
blur_strengthnumber20رقم من 1 إلى 50؛ الافتراضي 20. شدة التمويه الغاوسي للخلفية فقط.
enable_image_motionboolfalseتفعيل حركة الصورة. إذا كانت false، تبقى الصورة ثابتة.
image_motion_effectstring"ken_burns"تأثير الحركة. القيم المقبولة: zoom_in، zoom_out، pan_left_to_right، ken_burns، إلخ.
motion_intensityfloat1.0شدة حركة الصورة (0.25-2.0). تضاعف سعة التكبير وسرعة الانتقال.
text_effectstring"none"تأثير حركة النص. القيم المقبولة: none، fade_in، slide_up، bounce.
text_effect_intensityfloat1.0شدة حركة النص (0.25-2.0). تُتجاهل إذا كان text_effect هو none.
text_border_widthint0سمك الحدود السوداء حول الأحرف بالبكسل (0 = معطل).
text_border_colorstring"black"لون إطار الحروف (نفس صيغة text_color، الافتراضي "black"). يُستخدم إذا كان text_border_width > 0.
text_modestring"static"وضع ظهور النص. static (افتراضي): النص كاملاً مرئي من الإطار الأول. word_by_word: تظهر الكلمات واحدة تلو الأخرى بالسرعة المحددة في word_reveal_speed. لا يجمع مع text_effect: عند text_mode=word_by_word يُتجاهل text_effect. "karaoke": يتلوّن النص مع إيقاع الصوت، صفحةً بعد صفحة (حتى 1000 حرف). متزامن كلمةً بكلمة مع voice، وإلا يُوزَّع على الصوت حسب طول الكلمات.
word_reveal_speedfloat1.5سرعة الكشف بالكلمات في الثانية (0.3–5.0، الافتراضي 1.5). تُستخدم فقط مع text_mode=word_by_word. القيمة الموصى بها للمزامنة مع OpenAI TTS: 2.0.
word_animstring"none"حركة ظهور كل كلمة. none (افتراضي): ظهور فوري. fade: تظهر كل كلمة جديدة بتلاشٍ خلال 0.2 ثانية مع انتقال تدريجي. يُستخدم فقط مع text_mode=word_by_word.
karaoke_stylestring"fill"نمط الكاريوكي: fill (تأخذ الكلمات المنطوقة لون التمييز)، sweep (تمتلئ كل كلمة تدريجيًا؛ كلمات كاملة في الكتابات من اليمين إلى اليسار) أو highlight (تُلوَّن الكلمة الحالية فقط).
highlight_colorstring"#FFD200"لون الكلمات المنطوقة / الكلمة الحالية في وضع الكاريوكي (نفس صيغة text_color).
karaoke_linesint2عدد الأسطر المعروضة في كل صفحة في وضع الكاريوكي (1–4).
voicestring""معرّف الصوت (نفس قائمة text_to_mp3، مثل ar-SA-ZariyahNeural): يُولَّد الصوت من text في المهمة نفسها. عندها لا يحتاج image_to_video إلا إلى الصورة (يُرفَض إرسال ملف MP3 إضافي). في وضع الكاريوكي تتزامن كل كلمة مع الصوت.
voice_rateint0سرعة الصوت المُولَّد بالنسبة المئوية (من −50 إلى +50).

كاريوكي بتوقيتاتك الخاصة (SRT / LRC)

أرسل ملف SRT أو LRC في الحقل timings: يظهر كل سطر في وقته ويشكّل صفحة من الكاريوكي (حتى 500 سطر و5000 حرف). SRT: يختفي السطر عند وقت نهايته. LRC: يبقى السطر حتى التالي (السطر الفارغ يوقفه)؛ يُدعَم [offset:] وتوقيت الكلمات في LRC المُحسَّن <mm:ss.xx>، وإلا يُوزَّع كل سطر على مدته. في add_text تكون الأوقات نسبةً إلى بداية الفيديو، مُزاحةً بمقدار text_start.

# lyrics.srt 1 00:00:01,000 --> 00:00:03,500 First line of the song 2 00:00:04,000 --> 00:00:07,200 Second line, on its own page # lyrics.lrc — enhanced LRC: optional per-word times <mm:ss.xx> [00:01.00]<00:01.00>First <00:01.60>line <00:02.10>here [00:04.00]Second line [00:07.50]

معاملات options — وضع overlay_video

جميعها اختيارية. ترتيب الرفع مهم: الملف الأول هو الفيديو الرئيسي (الخلفية)، الملف الثاني هو التراكب (المقدمة). استخدم chroma_key لإزالة الخلفية الخضراء من التراكب.

المفتاحالنوعالافتراضيالوصف
positionstring"bottom-right"الركن الذي يوضع فيه التراكب: top-left، top-right، bottom-left، bottom-right، أو center.
scalefloat0.30حجم التراكب كنسبة من عرض الفيديو الرئيسي. 0.25 = 25% من العرض. النطاق: 0.05–1.0.
opacityfloat1.0شفافية التراكب. 1.0 = معتم تماماً، 0.0 = غير مرئي.
marginint10المسافة بالبكسل بين التراكب وحافة الإطار. يُتجاهل عند position=center. النطاق: 0–200.
audiostring"main"المسار الصوتي المراد الاحتفاظ به. main: صوت الفيديو الرئيسي فقط. overlay: صوت التراكب فقط. mix: مزج المسارين.
chroma_keyboolfalseاضبط على true لإزالة الخلفية الخضراء (#00FF00) من التراكب — مفيد لكاميرا الويب أو الرسوم المصورة على شاشة خضراء.
chroma_similarityfloat0.20تسامح الكروما كي. منخفض = مطابقة صارمة. مرتفع = إزالة أوسع. موصى به: 0.10–0.20 للأخضر الرقمي، 0.25–0.45 للشاشة الفعلية. النطاق: 0.01–0.60.

معاملات options — وضع add_text

النص مطلوب. يُحتفظ افتراضيًا بتنسيق الفيديو ومعدل الإطارات والصوت. يفعّل output_format تغيير الإطار مع image_fit وbg_color وbackground_mode. تبقى width وheight وfps وخيارات حركة الصورة مهملة. المدة القصوى: 15 دقيقة.

{"text":"Hello","output_format":"portrait","image_fit":"contain","background_mode":"blur","blur_strength":20}
المفتاحالنوعالافتراضيالوصف
textstringنعمالنص المراد إضافته. مطلوب، من 1 إلى 200 حرف.
text_startfloat0الثانية التي يظهر فيها النص (≥ 0). يجب أن تسبق نهاية الفيديو.
text_durationfloat0المدة التي يبقى فيها النص ظاهرًا بالثواني (0.1–3600). 0 = حتى نهاية الفيديو.
fontstring"default"خط النص، حسب المعرّف. القيم المقبولة: default, dejavu-sans-bold, dejavu-serif, liberation-serif, dejavu-mono, amiri, noto-sans-sc (简体中文), noto-sans-tc (繁體中文), noto-sans-jp (日本語), noto-sans-kr (한국어), noto-sans-hebrew (עברית), noto-sans-thai (ไทย). default = الخط القياسي (يدعم الإيموجي)؛ amiri = خط النسخ، مثالي للنص العربي. أي قيمة أخرى تُرجع الخطأ invalid_option. لا تظهر الإيموجي إلا مع default.
font_sizeint60حجم الخط، محدد لفيديو ضلعه الأقصر 1080 بكسل ويُضبط تلقائيًا حسب الدقة الفعلية — القيمة نفسها تبدو متطابقة في 720p و4K. النطاق: 10–300.
fade_durationfloat0.5مدة التلاشي الداخل/الخارج لـالنص (وليس الفيديو) بالثواني. النطاق: 0–2.
text_color, box, box_color, text_position, text_border_width, text_border_color, text_effect, text_effect_intensity, text_mode, word_reveal_speed, word_anim, karaoke_style, highlight_color, karaoke_lines, voice, voice_rate——مطابقة لـ image_to_video (انظر الجدول أعلاه).
original_volumefloat0.3مع voice: مستوى الصوت الأصلي للفيديو تحت الصوت المُولَّد (0–2، الافتراضي 0.3؛ 0 = استبدال). يبدأ الصوت عند text_start؛ ويبقى النص ظاهرًا حتى نهايته، وإذا تجاوز نهاية الفيديو تُثبَّت آخر صورة.
background_modestring"solid"solid (افتراضي) أو blur. يتطلب التمويه image_fit=contain. يبقى النص واضحًا.
blur_strengthnumber20رقم من 1 إلى 50؛ الافتراضي 20. شدة التمويه الغاوسي للخلفية فقط.
output_formatstring"original"لـ add_text فقط: original (افتراضي)، portrait (1080×1920)، square (1080×1080)، landscape (1920×1080). يتطلب التمويه تنسيقًا غير original.
image_fitstring"contain"contain: أظهر الصورة أو الفيديو بالكامل واملأ المساحات الفارغة بالخلفية المختارة. solid (افتراضي) أو blur. يتطلب التمويه image_fit=contain. يبقى النص واضحًا. cover: يتم تكبير الصورة لملء الإطار، مع تقليم الأطراف.
bg_colorstring"black"background_mode=solid: لون الخلفية إذا لم تملأ الصورة الدقة المستهدفة.

معاملات options — تحرير الصوت (mix_audio)

متاح فقط مع mode=mix_audio. يُتجاهل لـ add_audio.

المفتاحالنوعالافتراضيالوصف
mp3_volumefloat1.0مستوى صوت MP3 المُضاف (0.0 = صامت، 1.0 = الصوت الأصلي، 2.0 = ضعفان).

وضع text_to_mp3 — معاملات مباشرة (بدون JSON الخاص بـ options)

على عكس الأوضاع الأخرى، تُرسل هذه الحقول مباشرة كحقول نموذج وليس داخل كائن JSON الخاص بـ options. الحقل text فقط مطلوب.

المفتاحالنوعالافتراضيالوصف
textstring—النص المراد تحويله إلى كلام. مطلوب. 5000 حرف كحد أقصى.
langstring"en"رمز اللغة المستخدم لاختيار الصوت الافتراضي عند حذف voice أو عدم صلاحيته. إحدى لغات الموقع العشرين (انظر الجدول أدناه). يعود إلى en إذا كان غير معروف.
voicestringتلقائيمعرّف صوت edge-tts (انظر الجدول أدناه). إذا حُذف أو لم يكن معرّفًا صالحًا، يُستخدم أول صوت للغة lang تلقائيًا.
slowboolfalseاضبط القيمة على true (أو 1) لإبطاء الكلام بنسبة 25%. أي قيمة أخرى تُعامل كـ false.
لا حاجة لرفع ملفات: على عكس الأوضاع الأخرى، لا يحتاج text_to_mp3 إلى videos[]. أرسل mode=text_to_mp3 مع text / lang / voice / slow كحقول نموذج عادية.

الأصوات المتاحة (edge-tts، Microsoft Neural)، مجمّعة حسب رمز اللغة:

اللغةالأصوات المتاحة
en en-US-AvaNeural, en-US-AndrewNeural, en-GB-LibbyNeural, en-AU-NatashaNeural, en-AU-WilliamMultilingualNeural
fr fr-FR-DeniseNeural, fr-FR-HenriNeural, fr-FR-EloiseNeural, fr-CA-SylvieNeural, fr-CA-ThierryNeural
es es-ES-ElviraNeural, es-ES-AlvaroNeural, es-MX-DaliaNeural, es-AR-ElenaNeural, es-AR-TomasNeural
ar ar-SA-ZariyahNeural, ar-SA-HamedNeural, ar-EG-SalmaNeural, ar-MA-MounaNeural, ar-MA-JamalNeural
pt pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-PT-RaquelNeural
de de-DE-KatjaNeural, de-DE-ConradNeural, de-DE-AmalaNeural, de-AT-IngridNeural, de-AT-JonasNeural
it it-IT-ElsaNeural, it-IT-DiegoNeural, it-IT-IsabellaNeural
nl nl-NL-ColetteNeural, nl-NL-MaartenNeural, nl-BE-DenaNeural, nl-BE-ArnaudNeural
ru ru-RU-SvetlanaNeural, ru-RU-DmitryNeural
tr tr-TR-EmelNeural, tr-TR-AhmetNeural
hi hi-IN-SwaraNeural, hi-IN-MadhurNeural
bn bn-IN-TanishaaNeural, bn-IN-BashkarNeural, bn-BD-NabanitaNeural, bn-BD-PradeepNeural
ur ur-PK-UzmaNeural, ur-PK-AsadNeural, ur-IN-GulNeural, ur-IN-SalmanNeural
id id-ID-GadisNeural, id-ID-ArdiNeural
ja ja-JP-NanamiNeural, ja-JP-KeitaNeural
ko ko-KR-SunHiNeural, ko-KR-InJoonNeural
zh-CN zh-CN-XiaoxiaoNeural, zh-CN-YunxiNeural, zh-CN-XiaoyiNeural
zh-TW zh-TW-HsiaoChenNeural, zh-TW-YunJheNeural
vi vi-VN-HoaiMyNeural, vi-VN-NamMinhNeural
pl pl-PL-ZofiaNeural, pl-PL-MarekNeural

رد ناجح (HTTP 200)

{ "success": true, "job_id": "a3f1c8d2e5b09471...", "mode": "fusion", // "fusion" | "add_audio" | "mix_audio" | "image_to_video" | "overlay_video" | "add_text" | "text_to_mp3" "file_count": 2, "transition": null, "quota_used": 1, "quota_remaining": 9, "status_url": "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..." }
بالنسبة لـ text_to_mp3، لا يحتوي الرد على file_count أو transition (لم يُرفع أي ملف) — وبقية الحقول مطابقة: job_id، quota_used، quota_remaining، status_url، webhook_secret.

مثال curl — نمط image_to_video

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_color":"white","text_position":"bottom","box":true,"box_color":"black@0.4","fade_duration":0.5,"width":1080,"height":1920,"image_fit":"contain","bg_color":"black","enable_image_motion":true,"image_motion_effect":"ken_burns","motion_intensity":1.0,"text_effect":"slide_up","text_effect_intensity":1.0}' # image_fit : "contain" | "cover" # background_mode : "solid" | "blur" (blur requires contain) # blur_strength : 1–50, default 20 # bg_color : ignored if image_fit="cover" # enable_image_motion : true = animation on, false (default) = static image # image_motion_effect : zoom_in | zoom_out | pan_left_to_right | pan_right_to_left | pan_top_to_bottom | pan_bottom_to_top | zoom_pan_soft | ken_burns # motion_intensity : 0.25–2.0 — photo animation amplitude (default 1.0) # text_effect : none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) # text_effect_intensity : 0.25–2.0 — text animation intensity (default 1.0) # text_border_width : 0–10 px — outline around characters (0 = disabled) # text_border_color : outline color, default "black" (e.g. "#FF3366", "white@0.8") # text_mode : "static" (default) | "word_by_word" — reveal words one by one # word_reveal_speed : 0.3–5.0 w/s — speed for word_by_word mode (default 1.5, ~2.0 for OpenAI TTS) # word_anim : "none" (default) | "fade" — fade-in crossfade on each word (word_by_word only)

نص كاريوكي مع صوت مُولَّد (image_to_video بدون MP3)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" \ -F "mode=image_to_video" \ -F 'options={"text":"Every word lights up as the voice reads it.","voice":"en-US-AvaNeural","text_mode":"karaoke","karaoke_style":"sweep","highlight_color":"#FFD200","karaoke_lines":2,"text_position":"bottom","font_size":72}' # no MP3: the voice is generated from "text" and gives the timing of every word # text_mode="karaoke" : text up to 1000 characters, shown page by page (karaoke_lines: 1–4) # karaoke_style : "fill" (default) | "sweep" | "highlight" # voice_rate : -50…+50 (%), default 0 # with your own MP3 (no "voice"): karaoke timing is spread over the audio by word length # add_text: same options + "original_volume" (0–2, default 0.3) = original sound under the voice

كاريوكي بملف SRT (image_to_video + ملف MP3 الخاص بك)

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@cover.jpg" \ -F "videos[]=@song.mp3" \ -F "timings=@lyrics.srt" \ -F "mode=image_to_video" \ -F 'options={"karaoke_style":"sweep","karaoke_lines":2,"text_position":"bottom","font_size":72}' # timings : SRT or LRC file (200 KB max), or its content as a plain text field: -F "timings=<lyrics.lrc" # the displayed text comes from the file ("text" is ignored), text_mode is forced to "karaoke" # not compatible with "voice" (the timings follow your own audio) # add_text: times are relative to the video start, shifted by "text_start"

مثال curl — تحرير الصوت

# Replace audio (deletes original) curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=add_audio" # Keep original audio + overlay MP3 curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "videos[]=@my_music.mp3" \ -F "mode=mix_audio" \ -F 'options={"mp3_volume":0.7}' # mp3_volume : 0.0 (muted) → 1.0 (original volume, default) → 2.0 (amplified)

مثال curl — وضع overlay_video

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@overlay_video.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-right","scale":0.25,"opacity":1.0,"margin":20,"audio":"main"}' # Green screen overlay curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@main_video.mp4" \ -F "videos[]=@webcam_greenscreen.mp4" \ -F "mode=overlay_video" \ -F 'options={"position":"bottom-left","scale":0.35,"chroma_key":true,"chroma_similarity":0.15,"audio":"mix"}' # position : top-left | top-right | bottom-left | bottom-right | center (default: bottom-right) # scale : 0.05–1.0 — overlay width as fraction of main video (default 0.30) # opacity : 0.0–1.0 — overlay transparency (default 1.0) # margin : 0–200 px — gap from frame edge, ignored if center (default 10) # audio : main | overlay | mix — audio to keep (default: main) # chroma_key : true | false — remove green (#00FF00) background from overlay (default false) # chroma_similarity : 0.01–0.60 — green screen tolerance (default 0.20)

مثال curl — وضع add_text

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@my_video.mp4" \ -F "mode=add_text" \ -F 'options={"text":"Hello world","text_position":"bottom","font_size":72,"text_color":"#ffd700","text_start":2,"text_duration":5,"text_effect":"slide_up"}' # text : required, 1–200 characters # text_start : second at which the text appears (default 0) # text_duration : seconds the text stays visible, 0 = until the end (default 0) # the video keeps its resolution, frame rate and audio track

مثال curl — دمج مقاطع الفيديو

curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" \ -F "videos[]=@clip2.mp4" \ -F "transition_type=fade" \ -F "transition_duration=0.5"

مثال curl — وضع text_to_mp3

# No file upload — text + lang + voice as plain form fields curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Welcome to Rapid Video Maker." \ -F "lang=en" \ -F "voice=en-US-AvaNeural" \ -F "slow=false" # voice omitted or invalid -> falls back to the first voice of "lang" curl -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "mode=text_to_mp3" \ -F "text=Bienvenue sur Rapid Video Maker." \ -F "lang=fr"
GET /api/v1/jobs.php?job_id=<hex32> حالة المهمة

تتضمن الحالة المرحلة الفعلية والوقت المنقضي. التقديرات تقريبية؛ انتهاء مهلة العميل لا يعني فشل المهمة. استأنف متابعة المعرّف نفسه. تنتهي صلاحية الملفات بعد ساعتين من الاكتمال.

الحالات الممكنة

الحالةالمعنىحقول إضافية
queued في قائمة الانتظار، لم تُعالج بعد queue_position, queue_total, eta_minutes
processing FFmpeg قيد المعالجة processing_stage, processing_elapsed_seconds, stage_elapsed_seconds, last_activity_at, processed_media_seconds, eta_overrun
ready مكتملة — الملف متاح download_url, media_available, created_at, expires_at
error فشلت المعالجة error (message), quota_refund_status: pending | confirmed | not_required
cancelled ملغى quota_refund_status: pending | confirmed | not_required

الردود حسب الحالة

{ "job_id": "a3f1c8...", "status": "queued", "queue_position": 2, "queue_total": 3, "eta_minutes": 7 }
{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00" }

مثال curl

curl -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=a3f1c8..."
GET /api/v1/jobs.php يعرض كل المهام التي أُنشئت بهذا الرمز (مقسّمة إلى صفحات، مرتّبة من الأحدث)

المعاملات المشتركة (multipart/form-data)

المعاملالنوعالافتراضيالوصف
pageinteger1رقم الصفحة (يبدأ من 1)
limitinteger20عدد النتائج في الصفحة (50 كحد أقصى، الافتراضي 20)

الردود حسب الحالة

{ "success": true, "jobs": [ { "job_id": "a3f1c8...", "status": "ready", "mode": "fusion", "created_at": "2026-06-02T10:00:00+00:00", "expires_at": "2026-06-02T12:00:00+00:00", "download_url": "https://..." }, ... ], "total": 12, "page": 1, "limit": 20 }
GET /api/download.php?job_id=<hex32> تنزيل الملف النهائي

يبث الملف النهائي. Content-Type هو video/mp4 لأوضاع الفيديو، أو audio/mpeg لـ text_to_mp3. لا يتطلب رمزاً. متاح فقط عندما تكون الحالة ready.

يُحتفظ بالملف لمدة ساعتين بعد اكتمال المهمة، ثم يُحذف. نزّله فور أن تصبح الحالة ready.

معاملات اختيارية

المعاملالوصف
filenameالاسم المقترح للملف المُنزَّل (مثلاً: my-video.mp4)
previewاضبط على 1 للتشغيل المضمّن (يحذف Content-Disposition: attachment) بدلاً من بدء التنزيل — يُستخدم للمعاينة داخل المتصفح.

مثال curl

curl -o "output.mp4" \ "https://rapidvideomaker.com/api/download.php?job_id=a3f1c8...&filename=output.mp4"

الـ Webhooks

الـ Webhooks بديل للاستطلاع المتكرر: بدلاً من التحقق من الحالة كل X ثوانٍ، تقدم رابطاً ويستدعيك الخادم تلقائياً عند اكتمال المهمة.

كيف يعمل

  1. مرر callback_url في POST إلى /api/v1/render.php
  2. يتضمن الرد webhook_secret — احتفظ به للتحقق من التوقيعات
  3. عندما تصل المهمة إلى ready أو error، يرسل الخادم JSON POST موقعاً إلى رابطك
  4. تحقق من التوقيع بـ HMAC-SHA256(webhook_secret, raw_body)
القيود: يجب أن يكون callback_url رابطاً عاماً قابلاً للوصول (http أو https). تُحجب عناوين IP الخاصة وعناوين الاسترجاع والمحجوزة من طرف الخادم. المهلة: 10 ثوانٍ.

الحمولة المُستلَمة

{ "job_id": "a3f1c8...", "status": "ready", "download_url": "https://rapidvideomaker.com /api/download.php?job_id=a3f1c8...", "timestamp": "2026-04-04T12:00:00+00:00" }
{ "job_id": "a3f1c8...", "status": "error", "error": "FFmpeg xfade failed:...", "timestamp": "2026-04-04T12:00:00+00:00" }

الترويسات التي يرسلها الخادم

الترويسةالقيمة
Content-Typeapplication/json
X-RVM-Signaturesha256=<hmac_hex> — توقيع HMAC-SHA256 للجسم الخام
X-RVM-Job-Idjob_id المعني

التحقق من التوقيع

# Python import hmac, hashlib def verify_webhook(secret: str, body: bytes, signature_header: str) -> bool: expected = "sha256=" + hmac.new( secret.encode(), body, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature_header) # Flask/FastAPI endpoint: sig = request.headers.get("X-RVM-Signature", "") if not verify_webhook(WEBHOOK_SECRET, request.data, sig): return "Invalid signature", 403 data = request.get_json()

أكواد الأخطاء

HTTPكود JSONالسبب
401unauthorizedالرمز مفقود أو غير صالح أو مُلغى
400missing_filesلم تُستلَم أي ملفات
400too_few_filesأُرسل أقل من ملفين
400too_many_filesأُرسل أكثر من 20 ملفاً
400invalid_mimeملف غير مدعوم — يُقبل MP4 وMP3 وJPG/PNG فقط
400wrong_file_countعدد الملفات لا يطابق النمط المختار
400wrong_file_typesأنواع الملفات لا تطابق النمط المختار
400invalid_file_combinationمجموعة الملفات بدون نمط محدد لا تطابق أي نمط مدعوم
400invalid_optionsحقل options ليس JSON صحيحاً
400invalid_optionقيمة في options غير صالحة
400file_too_largeملف يتجاوز 500 ميجابايت
400text_requiredالحقل options.text غير موجود أو فارغ (وضع add_text)
400video_too_longالفيديو أطول من 15 دقيقة (وضع add_text)
400text_start_out_of_rangetext_start يتجاوز نهاية الفيديو
400invalid_voiceمعرّف voice غير معروف.
400invalid_timingsملف توقيتات غير قابل للقراءة (صيغة غير معروفة، لا سطر موقَّت، نهاية قبل البداية، طويل جدًا…).
400invalid_orderمصفوفة order ليست تبديلاً صحيحاً
400invalid_job_idصيغة job_id غير صحيحة (يجب أن تكون 32 حرفاً سداسياً)
404job_not_foundالمهمة غير موجودة — job_id مجهول أو لم يُنشأ قط
410job_expiredانتهت صلاحية المهمة — وُجدت لكن نافذة الاسترداد لـ 2 ساعة انقضت
429quota_exceededبلغ حد 20 مهمة ناجحة يومياً
429rate_limitedتجاوز 12 طلباً/دقيقة على /api/v1/jobs.php
500server_errorخطأ داخلي في الخادم

أمثلة التكامل

أمثلة لكل نمط — ثبِّت requests بـ pip install requests.

الإعداد المشترك

import requests, time, sys, json API_BASE = "https://rapidvideomaker.com" API_TOKEN = "rvm_your_token_here" HEADERS = {"Authorization": f"Bearer {API_TOKEN}"}

نمط image_to_video — صورة + صوت → فيديو

with open("scene.jpg", "rb") as fi, open("narration.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("scene.jpg", fi, "image/jpeg")), ("videos[]", ("narration.mp3", fa, "audio/mpeg")), ], data={ "mode": "image_to_video", "options": json.dumps({ "text": "Chapter 1", "font_size": 72, "text_color": "white", "text_position": "bottom", "box": True, "box_color": "black@0.4", "fade_duration": 0.5, "width": 1080, "height": 1920, "image_fit": "contain", # "contain" | "cover" "background_mode": "solid", # or "blur" with contain "blur_strength": 20, "bg_color": "black", # ignored if image_fit="cover" "enable_image_motion": True, "image_motion_effect": "ken_burns", "motion_intensity": 1.0, # 0.25–2.0 — photo animation amplitude "text_effect": "slide_up", # none | fade_in | slide_up | slide_down | slide_left | bounce (ignored if text_mode=word_by_word) "text_effect_intensity": 1.0, # 0.25–2.0 — text animation intensity # word-by-word reveal (mutually exclusive with text_effect): # "text_mode": "word_by_word", "word_reveal_speed": 2.0, "word_anim": "fade" }), }, )

تحرير الصوت

# Replace audio (deletes original) — mode=add_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "add_audio"}, ) # Keep original audio + overlay MP3 — mode=mix_audio with open("video.mp4", "rb") as fv, open("music.mp3", "rb") as fa: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("video.mp4", fv, "video/mp4")), ("videos[]", ("music.mp3", fa, "audio/mpeg")), ], data={"mode": "mix_audio", "options": json.dumps({"mp3_volume": 0.7})}, # mp3_volume : 0.0 = muted, 1.0 = original volume (default), 2.0 = amplified )

وضع overlay_video — صورة داخل صورة

with open("main.mp4", "rb") as fm, open("overlay.mp4", "rb") as fo: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("main.mp4", fm, "video/mp4")), ("videos[]", ("overlay.mp4", fo, "video/mp4")), ], data={ "mode": "overlay_video", "options": json.dumps({ "position": "bottom-right", # top-left | top-right | bottom-left | bottom-right | center "scale": 0.25, # 0.05–1.0 — overlay width fraction "opacity": 1.0, # 0.0–1.0 — transparency "margin": 20, # 0–200 px — gap from frame edge "audio": "main", # main | overlay | mix # green screen: "chroma_key": True, "chroma_similarity": 0.15 }), }, )

وضع add_text — نص على فيديو

with open("video.mp4", "rb") as fv: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[("videos[]", ("video.mp4", fv, "video/mp4"))], data={ "mode": "add_text", "options": json.dumps({ "text": "Hello world", # required "text_position": "bottom", # center | top | bottom "font": "amiri", # font id (see the table above) "font_size": 72, "text_start": 2, # appears at 2 s "text_duration": 5, # stays 5 s (0 = until the end) }), }, )

دمج مقاطع الفيديو

with open("clip1.mp4", "rb") as f1, open("clip2.mp4", "rb") as f2: resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, files=[ ("videos[]", ("clip1.mp4", f1, "video/mp4")), ("videos[]", ("clip2.mp4", f2, "video/mp4")), ], data={"transition_type": "fade", "transition_duration": "0.5"}, )

وضع text_to_mp3 — تحويل النص إلى كلام

# No files — text + lang (+ optional voice / slow) as form fields resp = requests.post( f"{API_BASE}/api/v1/render.php", headers=HEADERS, data={ "mode": "text_to_mp3", "text": "Welcome to Rapid Video Maker.", "lang": "en", # one of the 20 site language codes "voice": "en-US-AvaNeural", # optional — falls back to the first voice of "lang" "slow": "false", # "true" = -25% speech rate }, )

الاستعلام + التنزيل (مشترك لجميع الأنماط)

resp.raise_for_status() job_id = resp.json()["job_id"] print(f"Job created: {job_id}") for _ in range(120): # timeout 10 min (120 × 5s) r = requests.get( f"{API_BASE}/api/v1/jobs.php", headers=HEADERS, params={"job_id": job_id}, ) data = r.json() status = data["status"] if status == "queued": pos = data.get("queue_position", "?") eta = data.get("eta_minutes", "?") print(f"Queued — position {pos}, ETA ~{eta} min") elif status == "processing": print("Processing…") elif status == "ready": download_url = data["download_url"] break elif status == "error": sys.exit(f"Error: {data.get('error')}") time.sleep(5) else: sys.exit("Timeout: job not completed after 10 min") r = requests.get(download_url, stream=True) with open("output.mp4", "wb") as f: for chunk in r.iter_content(65536): f.write(chunk) print("Downloaded: output.mp4")

نهجان في n8n: الاستعلام (حلقة الحالة) أو Webhook (الخادم يستدعي n8n). يُوصى بالـ Webhook.

النهج أ — Webhook (موصى به)

3 عقد فقط، بلا حلقات.

العقدة 1 — مشغِّل Webhook
أضف عقدة Webhook كمدخل لسير العمل (الأسلوب POST).

العقدة 2 — إنشاء المهمة (طلب HTTP)

الأسلوبPOST
الرابطhttps://rapidvideomaker.com/api/v1/render.php
المصادقةHeader Auth — Authorization: Bearer rvm_…
نوع محتوى الجسمForm-Data Multipart
Body paramsحقل ثنائي videos[] لكل مقطع + حقل نصي callback_url

احتفظ بـ webhook_secret من الرد في متغير سير العمل للتحقق من التوقيعات.

العقدة 3 — معالجة النتيجة (في سير العمل المُشغَّل بالـ Webhook)
عندما يستلم n8n POST الخادم، تكون $json.status إما ready أو error.

للتحقق من التوقيع: قارن {{ $headers['x-rvm-signature'] }} مع HMAC-SHA256 من webhook_secret الخاص بك.

النهج ب — الاستعلام (بدون Webhook)

5 عقد، حلقة حالة كل 10 ثوانٍ.

العقدة 1 — إنشاء المهمة — نفس الإعداد بدون callback_url.

العقدة 2 — انتظار — 10 ثوانٍ.

العقدة 3 — استعلام الحالة (طلب HTTP GET)

الرابطhttps://rapidvideomaker.com/api/v1/jobs.php
معاملات الاستعلامjob_id = {{ $('العقدة 1').item.json.job_id }}
المصادقةمصادقة الترويسة — نفس الرمز

العقدة 4 — If: {{ $json.status }} === 'ready' → صحيح: العقدة 5 / خطأ: العودة للعقدة 2.

أضف عداد تكرار في عقدة Set للخروج من الحلقة بعد 60 محاولة.

العقدة 5 — تنزيل: طلب HTTP GET على {{ $json.download_url }}.

الخطوة 1 — إنشاء المهمة (اختر نمطاً)

# fusion JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@clip1.mp4" -F "videos[]=@clip2.mp4") # add_audio (replace audio) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=add_audio") # mix_audio (overlay music at 70% volume) JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@video.mp4" -F "videos[]=@music.mp3" \ -F "mode=mix_audio" -F 'options={"mp3_volume":0.7}') # image_to_video JOB=$(curl -s -X POST https://rapidvideomaker.com/api/v1/render.php \ -H "Authorization: Bearer rvm_your_token" \ -F "videos[]=@scene.jpg" -F "videos[]=@narration.mp3" \ -F "mode=image_to_video" \ -F 'options={"text":"Chapter 1","font_size":72,"text_position":"bottom","fade_duration":0.5,"width":1080,"height":1920}') JOB_ID=$(echo $JOB | grep -o '"job_id":"[^"]*"' | cut -d'"' -f4) echo "Job ID: $JOB_ID"

الخطوة 2 — الاستعلام

while true; do STATUS=$(curl -s \ -H "Authorization: Bearer rvm_your_token" \ "https://rapidvideomaker.com/api/v1/jobs.php?job_id=$JOB_ID") STATE=$(echo $STATUS | grep -o '"status":"[^"]*"' | cut -d'"' -f4) echo "Status: $STATE" [ "$STATE" = "ready" ] && break [ "$STATE" = "error" ] && { echo "Error"; exit 1; } sleep 10 done

الخطوة 3 — التنزيل

DOWNLOAD_URL=$(echo $STATUS | grep -o '"download_url":"[^"]*"' | cut -d'"' -f4) curl -o output.mp4 "$DOWNLOAD_URL"

أفضل الممارسات

تُحتفظ بملفات النتائج ساعتين بعد اكتمال المهمة، ثم تُحذف تلقائياً.