تنسيق فصول الصوت لتطبيقات البودكاست
ثلاثة فصول تبدأ عند 0 و120 و1800 ثانية تصبح ملفًا واحدًا تقرؤه تطبيقات البودكاست لعرض فهرس والتنقل داخل الحلقة. يجب أن تتقدم الأوقات دائمًا، وإلا فلن يُصدَّر شيء. مجاني في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
تعمل هذه الأداة داخل متصفحك — مجانًا، ولا تُرسل بياناتك إلى أي خادم
يعرف المنتجون بالفعل عناوين الأقسام ولحظة بدء كل قسم؛ ما يحتاجونه هو تصدير صحيح مقروء للتطبيق بحقول startTime بصيغة camelCase، ورسوم وروابط اختيارية، وضمان ألا تتراجع الطوابع الزمنية أبدًا.
ما الذي يقدمه ملف الفصول للمستمع
لا تقرأ تطبيقات البودكاست التي تدعم الفصول هذه الفصول من الملف الصوتي نفسه، بل تجلب ملفًا صغيرًا منفصلًا مرتبطًا بالحلقة في خلاصتك، وتستخدمه لعرض فهرس والانتقال إلى كل قسم وتبديل الصورة أثناء التشغيل. يحتاج كل فصل إلى وقت بدء بالثواني من أول التسجيل، ويُنصح بشدة بعنوان كي يرى المستمع أسماء واضحة. ويمكنك أيضًا إضافة صورة ورابط لأي فصل، وتعليم فصل بأنه صامت فلا يظهر في القائمة، وتحديد وقت نهاية إن أردت. ولأن التطبيقات تجلب الملف عند التشغيل، يمكنك تصحيح عنوان أو إضافة صورة بعد النشر دون إعادة ترميز الحلقة.
كيف تجهّز الفصول وتتجنب الأخطاء
اكتب الأقسام بالترتيب، لكل منها عنوانه والثانية التي يبدأ عندها، مثل مقدمة عند 0 والموضوع الرئيسي عند 120 والخاتمة عند 1800. تحوّلها الأداة إلى الشكل القياسي وتعيد النص جاهزًا لاستضافته على عنوان ويب ثابت. أكثر الأخطاء شيوعًا وقت بدء يتكرر أو يعود إلى الوراء. لا تعيد الأداة ترتيب الفصول نيابة عنك، لأن إعادة الترتيب الصامتة قد تخفي خطأ وتضع الصورة الخطأ على المقطع الخطأ، بل تتوقف وتذكر الصف الخارج عن الترتيب.
شكل ملف الفصول للبودكاست
يشير فضاء أسماء Podcasting 2.0 كل حلقة إلى ملف فصول خارجي بنوع MIME هو application/json+chapters. يحتاج كل فصل على الأقل إلى startTime كعدد عشري بالثواني من بداية الصوت؛ ويُنصح بشدة بـ title حتى يرى المستمعون فهرسًا مقروءًا. تشمل حقول الفصل الاختيارية img لرسم القسم، وurl لصفحة أو ملاحظات الحلقة، وtoc مضبوطًا على false لعلامات صامتة للبيانات الوصفية فقط، وendTime عند الرغبة في نهاية صريحة.
يُتحقَّق من ترتيب الفصول ولا يُخمَّن: لا تعيد القدرة ترتيب أوقات غير مرتبة بصمت، لأن إعادة ترتيب صامتة قد تخفي أخطاء الإنتاج وتضع الرسم الخاطئ على المقطع الخاطئ. بدلًا من ذلك تفرض أوقات بدء متزايدة بصرامة وتفشل بوضوح عندما يكون صف لاحق مساويًا أو أسبق من السابق. تجلب التطبيقات الملف عند التشغيل، فيمكن تصحيح العناوين أو إضافة صور بعد النشر دون إعادة ترميز الحلقة.
أين يبرر مُصدِّر فصول حتمي تكلفته
الشبكات والمستضيفون الذين يولّدون خلاصات لبرامج كثيرة يريدون دالة خالصة تحوّل قوائم الفصول التحريرية إلى البايتات نفسها في كل مرة لاختبارات الانحدار وإضافات CMS متعددة المستأجرين. أدوات النسخ أو اقتراح الفصول التي تخرج أزواج عنوان وثوانٍ يمكنها توجيه نتيجتها هنا للحصول على الصيغة المواجهة للتطبيق دون تضمين معرفة Podcasting 2.0 في كل عميل. فشل التحقق لا يستهلك الرصيد.
اقرنوا هذا المُصدِّر بمنتجات منفصلة لتوليد فصول عبر ASR عندما تحتاجون اختراع طوابع من الصوت؛ واستخدموا هذا المسار عندما تعرفون العلامات مسبقًا وتحتاجون فقط تصديرًا متوافقًا مع المعيار.
الأسئلة الشائعة
ماذا يحدث إذا لم تكن أوقات البدء متزايدة بصرامة؟
تُرفض الأوقات المتساوية أو المتناقصة حتى لا تستلم تطبيقات البودكاست علامات غير مرتبة.
هل يمكن تضمين صور وروابط لكل فصل؟
نعم. سلاسل img وurl الاختيارية في كل فصل تصبح حقلي img وurl في Podcasting 2.0. تُحذف السلاسل الفارغة من التصدير.
كيف أضيف الفصول إلى خلاصة البودكاست؟
استضف الملف الذي تعيده الأداة على عنوان ويب ثابت، ثم اربطه بالحلقة في خلاصتك بوصفه ملف الفصول. وتجلبه التطبيقات المتوافقة عند تشغيل الحلقة.
هل يمكنني تغيير عنوان فصل بعد نشر الحلقة؟
نعم. تجلب التطبيقات ملف الفصول عند التشغيل، لذا يمكنك تصحيح العناوين أو إضافة الصور لاحقًا واستضافة الملف الجديد على العنوان نفسه دون إعادة ترميز الصوت.
هل يمكن أن يبقى فصل خارج الفهرس؟
نعم. علّمه بأنه صامت فيعمل علامةً تحتفظ بها التطبيقات دون أن تعرضها للمستمع. وتظهر الفصول كلها في القائمة افتراضيًا، فغيّر فقط ما تريد إخفاءه.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/audio/audio-chapter-export-format \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"chapters":[{"title":"Intro","start_time":0},{"title":"Main topic","start_time":120,"img":"https://example.com/art/main.jpg","url":"https://example.com/notes/main"},{"title":"Outro","start_time":1800}]}'const res = await fetch("https://api.kit.forhosting.com/audio/audio-chapter-export-format", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"chapters": [
{
"title": "Intro",
"start_time": 0
},
{
"title": "Main topic",
"start_time": 120,
"img": "https://example.com/art/main.jpg",
"url": "https://example.com/notes/main"
},
{
"title": "Outro",
"start_time": 1800
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/audio/audio-chapter-export-format",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"chapters": [
{
"title": "Intro",
"start_time": 0
},
{
"title": "Main topic",
"start_time": 120,
"img": "https://example.com/art/main.jpg",
"url": "https://example.com/notes/main"
},
{
"title": "Outro",
"start_time": 1800
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/audio/audio-chapter-export-format", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"chapters":[{"title":"Intro","start_time":0},{"title":"Main topic","start_time":120,"img":"https://example.com/art/main.jpg","url":"https://example.com/notes/main"},{"title":"Outro","start_time":1800}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"chapters":[{"title":"Intro","start_time":0},{"title":"Main topic","start_time":120,"img":"https://example.com/art/main.jpg","url":"https://example.com/notes/main"},{"title":"Outro","start_time":1800}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/audio/audio-chapter-export-format", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"chapters": [
{
"title": "Intro",
"start_time": 0
},
{
"title": "Main topic",
"start_time": 120,
"img": "https://example.com/art/main.jpg",
"url": "https://example.com/notes/main"
},
{
"title": "Outro",
"start_time": 1800
}
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "audio.audio_chapter_export_format",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_mb | 200 |
max_minutes | 180 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
تتوقع تطبيقات البودكاست التي تدعم فصول Podcasting 2.0 ملف JSON صغيرًا مرتبطًا بعنصر RSS للحلقة، لا وسوم فصول مضمّنة في ملف MP3. تستقبل هذه القدرة صفوف الفصول المرتبة—العنوان مع وقت البدء بالثواني، مع صورة وURL اختياريين لكل فصل—وتُصدر كائن chapters القياسي المُصدَّر برقم إصدار مع سلسلة json_text منسّقة يمكنكم استضافتها والإشارة إليها بوسم podcast:chapters. إذا لم تكن أوقات البدء متزايدة بصرامة تفشل المهمة بـ invalid_input حتى لا تصل علامات خاطئة إلى الخلاصة. المنطق الخالص نفسه يشغّل أداة المتصفح المجانية ومسار API المدفوع، فلا يختلف نظام إدارة المحتوى أو المهمة الدفعية أو التصدير لمرة واحدة في التنسيق.
شكل JSON لفصول Podcasting 2.0
ذلك الملف كائن JSON مفتاحاه الإلزاميان version (عادة 1.2.0) وchapters، وهو مصفوفة علامات مرتبة تصاعديًا حسب startTime. تساعد حقول اختيارية على مستوى الملف مثل author وtitle وpodcastName وdescription مشغّلات الويب والأرشيف دون تغيير كيفية قفز التطبيقات في الصوت. يحوّل هذا المُصدِّر إدخالك الصفّي—start_time وtitle لكل فصل مع img وurl اختياريين—إلى ذلك الشكل بـ camelCase حتى لا تعدّل الأقواس يدويًا أو تنسى سلسلة الإصدار. استضيفوا json_text الناتج على عنوان HTTPS مستقر، ثم أضيفوا podcast:chapters مع type application/json+chapters في العنصر.
عقد الإدخال وشكل الاستجابة وقواعد التحقق
تُحذف مفاتيح الإخراج الاختيارية بالكامل بدل تعيينها إلى null. أرسلوا بجسم JSON عبر POST مصفوفة chapters إلزامية من كائن واحد على الأقل. يجب أن يتضمن كل كائن title كنص غير فارغ وstart_time كعدد منتهٍ غير سالب بالثواني (تُقبل أسماء بديلة مثل startTime في كل صف). الحقول الاختيارية لكل فصل هي img وurl كنصوص غير فارغة، وtoc كقيمة منطقية (false لفصل صامت؛ true هو الافتراضي ويُحذف من التصدير)، وend_time كعدد غير سالب لا يقل عن بداية ذلك الفصل. تُنسخ النصوص الاختيارية على مستوى الملف—version (افتراضي 1.2.0) وepisode_title وauthor وpodcast_name وdescription—إلى كائن chapters عند وجودها. عند النجاح يعيد الجسم version وchapter_count وchapters كمصفوفة Podcasting 2.0 بمفاتيح startTime وjson_text كالملف المنسّق الجاهز للرفع وmime_type بقيمة application/json+chapters وأي بيانات وصفية للحلقة تحت author وtitle وpodcast_name وdescription. أخطاء التحقق ترمي invalid_input ولا تُفوتر: chapters مفقود، title فارغ، أوقات سالبة أو غير منتهية، نهاية قبل البداية، أكثر من خمسمائة صف، أو أوقات بدء غير متزايدة بصرامة. مثال: ثلاثة صفوف عند صفر ومائة وعشرين وألف وثمانمائة ثانية مع صورة ورابط في الفصل الأوسط تنتج مصفوفة chapters من ثلاث مدخلات وسلسلة json_text تطابق أمثلة Podcasting 2.0 العامة في البنية. استخدموا أداة المتصفح للصق لمرة واحدة، أو استدعوا API من مسار النشر حتى يُفحص كل تصدير حلقة آليًا قبل أن يصبح وسم RSS حيًّا.
أين يبرر مُصدِّر فصول حتمي تكلفته
المنتجون المستقلون الذين ينهون حلقة في DAW يملكون طوابع زمنية في جدول أو ملاحظات العرض؛ يحتاجون ملف JSON صحيحًا دون تعلّم فضاء الأسماء بالتجربة والخطأ في كل تطبيق. لأن التنفيذ pure parse من المستوى A، كل استدعاء ناجح يكلف السعر الأساسي المنشور $0.002 بلا رموز نموذج وبلا شبكة صادرة. اجعلوا عناوين الفصول قصيرة بما يكفي لواجهات الفهرس على الجوال، وفضّلوا عناوين HTTPS مطلقة لـ img وurl، وأعيدوا تشغيل المنسّق بعد كل تعديل ليبقى الترتيب المتزايد بصرامة مفروضًا. مسار المتصفح المجاني وAPI يشتركان في وحدة واحدة، فيتّسق الفحص التعليمي والعاملون الطرقيون وخطافات النشر الإنتاجية على الأمثلة الذهبية نفسها.
حالات التكامل
فصول جاهزة للنشر من جدول ملاحظات العرض
الصقوا صفوف العنوان ووقت البدء من مخطط الحلقة، وأضيفوا روابط رسم اختيارية، وحمّلوا json_text لـ Podcasting 2.0 لاستضافته بجانب ملف MP3.
فحوصات في مسار CMS والاستضافة
استدعوا API من مهمة النشر للتحقق من أن قائمة فصول كل حلقة ذات أوقات متزايدة بصرامة قبل كتابة وسم RSS podcast:chapters.
جسر من العلامات البسيطة إلى JSON التطبيق
حوّلوا مخرجات العنوان زائد الثواني من المحررات أو أدوات النسخ إلى فصول startTime بـ camelCase دون تحرير أقواس JSON يدويًا.
أسئلة تقنية
ما الصيغة التي ينتجها تصدير فصول الصوت؟
فصول JSON لـ Podcasting 2.0: سلسلة version (افتراضي 1.2.0)، ومصفوفة chapters مع startTime وtitle (مع img وurl وtoc وendTime اختيارية)، وملف json_text منسّق بنوع MIME application/json+chapters.
كيف أرفق الملف بخلاصة RSS؟
استضيفوا json_text على عنوان HTTPS عام، ثم أضيفوا <podcast:chapters url="…" type="application/json+chapters" /> على عنصر الحلقة. تجلب التطبيقات الملف عند التشغيل.
كم تكلفة تنسيق فصول الصوت؟
أداة المتصفح مجانية. طلبات API تستخدم رصيد KIT المدفوع مسبقًا بسعر $0.002 لكل استدعاء ناجح؛ الإدخال غير الصالح لا يُفوتر.