API RapidVideoMaker
تتيح REST API معالجة ملفات الفيديو من أي عميل HTTP — سكريبتات Python، سير عمل n8n، أدوات الطرف الثالث. خمسة أوضاع متاحة: دمج الفيديوهات (عدة MP4)، تحرير الصوت (MP4 + MP3)، إنشاء فيديو (JPG/PNG + MP3)، تراكب الفيديو (2 MP4 صورة داخل صورة). المعالجة غير متزامنة: أرسل الملفات ثم استعلم عن النتيجة.
سير العمل الكامل
كل تكامل يتبع نفس التسلسل المكون من 4 خطوات:
POST /api/v1/render.phpmultipart/form-data مع رمز Bearer. صورة JPG/PNG + ملف MP3 + mode=image_to_video → إنشاء فيديو. ملف MP4 + ملف MP3 → تحرير صوتي. عدة ملفات MP4 → دمج. يعيد الخادم job_id فريداً.GET /api/v1/jobs.php?job_id=…queued → processing → ready (أو error).ready، يحتوي الرد على حقل download_url جاهز للاستخدام.GET /api/download.php?job_id=…المصادقة
يجب أن يتضمن كل طلب رمز API الخاص بك. يُقبل نوعان من الصيغ:
رمزك متاح في منطقة الأعضاء — رمز واحد لكل حساب، يُنشأ تلقائياً عند التسجيل.
الحصة
لكل حساب عضو 20 طلباً يومياً مشتركة بين واجهة الويب وAPI. المهام الفاشلة لا تستهلك الحصة. يُعاد ضبط العداد عند منتصف الليل UTC.
تتضمن ردود POST حقلَي quota_used وquota_remaining. عند تجاوز الحد، يرد الخادم بـ 429.
قائمة الانتظار
تُعالج مهمة واحدة في كل مرة. إذا أُرسلت عدة مهام في آنٍ واحد، تُضاف إلى قائمة انتظار وتُعالج بالترتيب. أثناء الانتظار، يتضمن رد الحالة:
queue_position— موقع المهمة في قائمة الانتظار (1 = التالية للمعالجة)queue_total— إجمالي المهام المنتظرةeta_minutes— الوقت التقديري قبل بدء المعالجة
/api/v1/jobs.php حداً أقصى 12 طلباً في الدقيقة لكل رمز. التوصية: 10 ثوانٍ بين كل طلب. الانتقالات المتاحة
مرر transition_type=none (الافتراضي) للدمج المباشر، أو أحد الأنواع التالية للتلاشي بين المقاطع:
المدة (transition_duration) بين 0.2 و2.0 ثانية.
نقاط النهاية
خمسة أوضاع، يمكن الوصول إليها عبر حقل mode (احذف mode مع عدة MP4 لاكتشاف fusion تلقائياً):
| الاستخدام | نمط API | الملفات المطلوبة | الوصف |
|---|---|---|---|
| دمج مقاطع الفيديو | fusion |
2-20 ملف MP4 | تُجمَّع المقاطع من البداية إلى النهاية بالترتيب المقدم. انتقالات اختيارية بين المقاطع. |
| تحرير الصوت | add_audio أو mix_audio |
ملف MP4 + ملف MP3 | يستبدل أو يُثري المسار الصوتي للفيديو. لا يُعاد ترميز مسار الفيديو أبداً.add_audio — يُحذف الصوت الأصلي ويُستبدل كلياً بملف MP3.mix_audio — يُحتفظ بالصوت الأصلي ويُضاف MP3 فوقه. |
| إنشاء فيديو | image_to_video |
صورة JPG/PNG + ملف MP3 | ينشئ فيديو من صورة ثابتة وملف صوتي. يمكن تكوين تراكب النص والتلاشي والدقة وfps عبر حقل options. |
| تراكب الفيديو | overlay_video |
2 MP4 | يضع فيديو ثانياً فوق الفيديو الرئيسي. الموضع والحجم والشفافية والصوت قابلة للضبط عبر حقل options. |
| نص إلى MP3 | text_to_mp3 |
(نص فقط) | يحوّل النص إلى كلام ويُعيد ملف MP3. لا حاجة لرفع ملفات — أرسل mode=text_to_mp3 وtext وlang كحقول نموذج. يدعم جميع لغات الموقع العشرين. |
add_audio وmix_audio يقبلان ملف MP4 واحد + ملف MP3 واحد فقط. image_to_video يقبل صورة JPG/PNG واحدة + ملف MP3 واحد فقط.المعاملات المشتركة (multipart/form-data)
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| videos[] | File[] | نعم | الملفات المراد معالجتها. حسب النمط: 2-20 ملف MP4، أو ملف MP4 + ملف MP3، أو صورة (JPG/PNG) + ملف MP3. الحد الأقصى 500 ميجابايت لكل ملف. |
| mode | string | * | image_to_video | add_audio | mix_audio. مطلوب لهذه الأنماط الثلاثة. يُتجاهل فقط إذا كانت جميع الملفات MP4 (fusion). |
| order | JSON | نمط fusion فقط — مصفوفة JSON من الفهارس التي تحدد ترتيب المقاطع. | |
| transition_type | string | نمط fusion فقط. الافتراضي: none. | |
| transition_duration | float | نمط fusion فقط. المدة 0.2-2.0 ثانية. الافتراضي: 0.5. | |
| options | JSON | نمط image_to_video فقط — كائن JSON لمعاملات التصيير. | |
| callback_url | string | رابط عام (http/https) يُستدعى عند اكتمال المهمة. يتضمن الرد webhook_secret. |
معاملات options — نمط image_to_video
جميعها اختيارية. القيم غير المحددة → تُطبَّق الافتراضيات من طرف العامل.
| المفتاح | النوع | الافتراضي | الوصف |
|---|---|---|---|
| text | string | "" | النص المعروض كتراكب. فارغ = بلا نص. حد أقصى 500 حرف. |
| font_size | int | 60 | حجم الخط بالبكسل. النطاق: 10-300. |
| text_color | string | "white" | لون النص (مثلاً: white، yellow، #ffffff). |
| text_position | string | "center" | موضع النص: center، top، bottom. |
| box | bool | true | خلفية شبه شفافة خلف النص. |
| box_color | string | "black@0.4" | اللون + الشفافية بصيغة FFmpeg: color@opacity. |
| fade_duration | float | 0.5 | مدة التلاشي الداخل/الخارج بالثوانٍ (0-2). 0 = بلا تأثير. |
| width | int | 1080 | عرض الفيديو بالبكسل (64-3840، يُجبر على عدد زوجي). |
| height | int | 1920 | ارتفاع الفيديو بالبكسل (64-3840، يُجبر على عدد زوجي). |
| fps | int | 24 | معدل الإطارات (1-60). |
| image_fit | string | "contain" | نمط التأطير: contain = الصورة الكاملة مرئية؛ cover = تكبير لملء الإطار كاملاً. |
| bg_color | string | "black" | لون الخلفية إذا لم تملأ الصورة الدقة المستهدفة. |
| enable_image_motion | bool | false | تفعيل حركة الصورة. إذا كانت false، تبقى الصورة ثابتة. |
| image_motion_effect | string | "ken_burns" | تأثير الحركة. القيم المقبولة: zoom_in، zoom_out، pan_left_to_right، ken_burns، إلخ. |
| motion_intensity | float | 1.0 | شدة حركة الصورة (0.25-2.0). تضاعف سعة التكبير وسرعة الانتقال. |
| text_effect | string | "none" | تأثير حركة النص. القيم المقبولة: none، fade_in، slide_up، bounce. |
| text_effect_intensity | float | 1.0 | شدة حركة النص (0.25-2.0). تُتجاهل إذا كان text_effect هو none. |
| text_border_width | int | 0 | سمك الحدود السوداء حول الأحرف بالبكسل (0 = معطل). |
| text_mode | string | "static" | وضع ظهور النص. static (افتراضي): النص كاملاً مرئي من الإطار الأول. word_by_word: تظهر الكلمات واحدة تلو الأخرى بالسرعة المحددة في word_reveal_speed. لا يجمع مع text_effect: عند text_mode=word_by_word يُتجاهل text_effect. |
| word_reveal_speed | float | 1.5 | سرعة الكشف بالكلمات في الثانية (0.3–5.0، الافتراضي 1.5). تُستخدم فقط مع text_mode=word_by_word. القيمة الموصى بها للمزامنة مع OpenAI TTS: 2.0. |
| word_anim | string | "none" | حركة ظهور كل كلمة. none (افتراضي): ظهور فوري. fade: تظهر كل كلمة جديدة بتلاشٍ خلال 0.2 ثانية مع انتقال تدريجي. يُستخدم فقط مع text_mode=word_by_word. |
معاملات options — وضع overlay_video
جميعها اختيارية. ترتيب الرفع مهم: الملف الأول هو الفيديو الرئيسي (الخلفية)، الملف الثاني هو التراكب (المقدمة). استخدم chroma_key لإزالة الخلفية الخضراء من التراكب.
| المفتاح | النوع | الافتراضي | الوصف |
|---|---|---|---|
| position | string | "bottom-right" | الركن الذي يوضع فيه التراكب: top-left، top-right، bottom-left، bottom-right، أو center. |
| scale | float | 0.30 | حجم التراكب كنسبة من عرض الفيديو الرئيسي. 0.25 = 25% من العرض. النطاق: 0.05–1.0. |
| opacity | float | 1.0 | شفافية التراكب. 1.0 = معتم تماماً، 0.0 = غير مرئي. |
| margin | int | 10 | المسافة بالبكسل بين التراكب وحافة الإطار. يُتجاهل عند position=center. النطاق: 0–200. |
| audio | string | "main" | المسار الصوتي المراد الاحتفاظ به. main: صوت الفيديو الرئيسي فقط. overlay: صوت التراكب فقط. mix: مزج المسارين. |
| chroma_key | bool | false | اضبط على true لإزالة الخلفية الخضراء (#00FF00) من التراكب — مفيد لكاميرا الويب أو الرسوم المصورة على شاشة خضراء. |
| chroma_similarity | float | 0.20 | تسامح الكروما كي. منخفض = مطابقة صارمة. مرتفع = إزالة أوسع. موصى به: 0.10–0.20 للأخضر الرقمي، 0.25–0.45 للشاشة الفعلية. النطاق: 0.01–0.60. |
معاملات options — تحرير الصوت (mix_audio)
متاح فقط مع mode=mix_audio. يُتجاهل لـ add_audio.
| المفتاح | النوع | الافتراضي | الوصف |
|---|---|---|---|
| mp3_volume | float | 1.0 | مستوى صوت MP3 المُضاف (0.0 = صامت، 1.0 = الصوت الأصلي، 2.0 = ضعفان). |
رد ناجح (HTTP 200)
مثال curl — نمط image_to_video
مثال curl — تحرير الصوت
مثال curl — وضع overlay_video
مثال curl — دمج مقاطع الفيديو
الحالات الممكنة
| الحالة | المعنى | حقول إضافية |
|---|---|---|
| queued | في قائمة الانتظار، لم تُعالج بعد | queue_position, queue_total, eta_minutes |
| processing | FFmpeg قيد المعالجة | — |
| ready | مكتملة — الملف متاح | download_url, created_at, expires_at |
| error | فشلت المعالجة | error (message) |
الردود حسب الحالة
مثال curl
المعاملات المشتركة (multipart/form-data)
| apidocs_th_param | النوع | الافتراضي | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
الردود حسب الحالة
ينشر job منتهياً (status=ready) على حساب أو أكثر من الحسابات الاجتماعية. يجب أن ينتمي الـ token إلى حساب عضو (وليس token المشرف).
account_id لكل حساب هناك.المعاملات المشتركة (multipart/form-data)
| apidocs_th_param | النوع | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | معرّف الـ job (hex 32 حرفاً) للفيديو المنتهي |
publications | array | apidocs_required | مصفوفة كائنات النشر (بحد أقصى 10) |
كائن النشر
| apidocs_th_param | النوع | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | معرّف الحساب الاجتماعي المرتبط — يظهر في صفحة النشر بمنطقة الأعضاء |
title | string | — | عنوان الفيديو (بحد أقصى 512 حرفاً) |
description | string | — | وصف الفيديو (بحد أقصى 5 000 حرف) |
tags | string | — | وسوم مفصولة بفواصل (بحد أقصى 1 024 حرفاً) |
visibility | string | — | public | private | unlisted — الافتراضي: public |
tiktok_mode | string | — | draft | direct — TikTok فقط — الافتراضي: direct |
tiktok_privacy | string | الوضع المباشر | TikTok فقط — مطلوب في الوضع المباشر |
allow_comment | boolean | — | TikTok فقط — السماح بالتعليقات |
allow_duet | boolean | — | TikTok فقط — السماح بالثنائيات |
allow_stitch | boolean | — | TikTok فقط — السماح بالدمج |
your_brand | boolean | — | TikTok فقط — الإفصاح عن المحتوى الترويجي العضوي ("علامتك التجارية"). |
branded_content | boolean | — | TikTok فقط — الإفصاح عن المحتوى التجاري |
tiktok_cover_ms | integer | — | TikTok فقط — الطابع الزمني للإطار الغلاف بالمللي ثانية (0–60 000، الافتراضي 1 000) |
الردود حسب الحالة
رموز الخطأ لكل نشر
| apidocs_th_code | المعنى |
|---|---|
job_not_ready | الـ job لم ينتهِ بعد |
mode_not_supported | لا يمكن نشر jobs الـ text_to_mp3 |
account_not_found | الحساب غير موجود أو غير متصل |
tiktok_privacy_required | مستوى الخصوصية مطلوب في الوضع المباشر |
publication_failed | أعاد المزوّد خطأً أثناء الرفع |
مثال cURL
يعيد ملف MP4 النهائي كتدفق (Content-Type: video/mp4). لا يتطلب رمزاً. متاح فقط عندما تكون الحالة ready.
يُحتفظ بالملف لمدة ساعتين بعد اكتمال المهمة، ثم يُحذف. نزّله فور أن تصبح الحالة ready.
معامل اختياري
| المعامل | الوصف |
|---|---|
| filename | الاسم المقترح للملف المُنزَّل (مثلاً: my-video.mp4) |
مثال curl
الـ Webhooks
الـ Webhooks بديل للاستطلاع المتكرر: بدلاً من التحقق من الحالة كل X ثوانٍ، تقدم رابطاً ويستدعيك الخادم تلقائياً عند اكتمال المهمة.
كيف يعمل
- مرر
callback_urlفي POST إلى/api/v1/render.php - يتضمن الرد
webhook_secret— احتفظ به للتحقق من التوقيعات - عندما تصل المهمة إلى
readyأوerror، يرسل الخادم JSONPOSTموقعاً إلى رابطك - تحقق من التوقيع بـ
HMAC-SHA256(webhook_secret, raw_body)
callback_url رابطاً عاماً قابلاً للوصول (http أو https). تُحجب عناوين IP الخاصة وعناوين الاسترجاع والمحجوزة من طرف الخادم. المهلة: 10 ثوانٍ. الحمولة المُستلَمة
الترويسات التي يرسلها الخادم
| الترويسة | القيمة |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — توقيع HMAC-SHA256 للجسم الخام |
| X-RVM-Job-Id | job_id المعني |
التحقق من التوقيع
أكواد الأخطاء
| HTTP | كود JSON | السبب |
|---|---|---|
| 401 | unauthorized | الرمز مفقود أو غير صالح أو مُلغى |
| 400 | missing_files | لم تُستلَم أي ملفات |
| 400 | too_few_files | أُرسل أقل من ملفين |
| 400 | too_many_files | أُرسل أكثر من 20 ملفاً |
| 400 | invalid_mime | ملف غير مدعوم — يُقبل MP4 وMP3 وJPG/PNG فقط |
| 400 | wrong_file_count | عدد الملفات لا يطابق النمط المختار |
| 400 | wrong_file_types | أنواع الملفات لا تطابق النمط المختار |
| 400 | invalid_file_combination | مجموعة الملفات بدون نمط محدد لا تطابق أي نمط مدعوم |
| 400 | invalid_options | حقل options ليس JSON صحيحاً |
| 400 | invalid_option | قيمة في options غير صالحة |
| 400 | file_too_large | ملف يتجاوز 500 ميجابايت |
| 400 | invalid_order | مصفوفة order ليست تبديلاً صحيحاً |
| 400 | invalid_job_id | صيغة job_id غير صحيحة (يجب أن تكون 32 حرفاً سداسياً) |
| 404 | job_not_found | المهمة غير موجودة — job_id مجهول أو لم يُنشأ قط |
| 410 | job_expired | انتهت صلاحية المهمة — وُجدت لكن نافذة الاسترداد لـ 2 ساعة انقضت |
| 429 | quota_exceeded | بلغ حد 20 مهمة ناجحة يومياً |
| 429 | rate_limited | تجاوز 12 طلباً/دقيقة على /api/v1/jobs.php |
| 500 | server_error | خطأ داخلي في الخادم |
أمثلة التكامل
أمثلة لكل نمط — ثبِّت requests بـ pip install requests.
الإعداد المشترك
نمط image_to_video — صورة + صوت → فيديو
تحرير الصوت
وضع overlay_video — صورة داخل صورة
دمج مقاطع الفيديو
الاستعلام + التنزيل (مشترك لجميع الأنماط)
نهجان في 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.
العقدة 5 — تنزيل: طلب HTTP GET على {{ $json.download_url }}.
الخطوة 1 — إنشاء المهمة (اختر نمطاً)
الخطوة 2 — الاستعلام
الخطوة 3 — التنزيل
أفضل الممارسات
- تكرار الاستعلام: نقطة
/api/v1/jobs.phpمحدودة بـ 12 طلباً/دقيقة لكل رمز. انتظر 5 ثوانٍ على الأقل بين كل طلب. - المهلة: نفِّذ مهلة من طرف العميل (مثلاً 10 دقائق).
- التنزيل السريع: نزِّل الملف فور أن تصبح الحالة
ready. يُحذف بعد ساعتين من اكتمال المهمة. - إدارة الحصة: تحقق من
quota_remainingفي رد POST. - أخطاء الشبكة: عند خطأ في الشبكة أثناء الاستعلام، انتظر وأعد المحاولة.