m3u مقابل m3u8: امتداد الملف لا يخبرك بالصيغة
واحد من الملفات الثلاثة التي نحتفظ بها لعمل المحلِّل اسمه .m3u8 ويحمل 1,895 صف قناة. وآخر اسمه .m3u، وفي 303 من صفوفه الـ308 ينتهي مسار عنوان URL بـ .m3u8.
file named entries URL paths ending .m3u8 lines beginning #EXT-X-
playlist_01 .m3u 308 303 0
playlist_02 .m3u8 1,895 1,621 0
iptv-org-index-sample .m3u 6 6 0
ثلاثة ملفات نحتفظ بها لعمل المحلِّل: قائمتا تشغيل حقيقيتان وتجهيزة اختبار من ستة مُدخَلات. عيّنة منتقاة، لا سحب عشوائي من البرّية. أبقِ ذلك في ذهنك وأنت تقرأ كل رقم أدناه. الملف المسمّى .m3u8 قائمة قنوات من 1,895 صفًا، كل منها اسم وعنوان URL، ولا وسم HLS في أي موضع منه. والملف المسمّى .m3u قائمة قنوات أيضًا، وفي 303 من صفوفه الـ308 ينتهي مسار عنوان URL بـ .m3u8. رتّب الاثنين بامتداديهما وستضعهما بالمقلوب. ورتّبهما بامتدادات العناوين الداخلية وستسمّي الملفَين معًا HLS، 98.4 بالمئة من أحدهما و85.5 بالمئة من الآخر، وهذا خطأ مرتَين.
الامتداد اصطلاح تسمية. يسافر مع الملف، واختاره من كتبه أو من قدّمه، ولا شيء يفرضه. والمحلِّل الذي يثق به سيخطئ على المدخلات الحقيقية. وهذا الخطأ صامت.
يقبل RFC 8216 الامتدادَين للملف نفسه
الوثيقة التي تعرّف HLS صريحة في هذا. تقول عكس الشائع. وهي Informational لا Standards Track، ومراجعة من شأنها أن تُبطلها، draft-pantos-hls-rfc8216bis، تجلس في طابور RFC Editor وتعيد تسمية Master Playlist إلى Multivariant Playlist. والقاعدة أدناه تنجو من تلك التسمية الجديدة. القسم 4:
يجب (MUST) أن يكون كل ملف قائمة تشغيل قابلًا للتعريف إما بمكوّن المسار في عنوان URI الخاص به أو بـ HTTP Content-Type. في الحالة الأولى، يجب أن ينتهي المسار إما بـ
.m3u8أو بـ.m3u. وفي الثانية، يجب أن يكون HTTP Content-Type إماapplication/vnd.apple.mpegurlأوaudio/mpegurl. وينبغي (SHOULD) للعملاء أن يرفضوا تحليل قوائم التشغيل غير المعرَّفة على هذا النحو.
اقرأ النصفَين. قائمة تشغيل HLS المطابقة يجوز أن تُقدَّم على مسار ينتهي بـ .m3u، وهي إحدى التهجئتَين اللتين تسمّيهما الوثيقة. والتعريف خيار بين أمرَين: قائمة التشغيل المعرَّفة بـ Content-Type الخاص بها قد استوفت الشرط بأي مسار كان، بما في ذلك انعدام الامتداد. فالمواصفة التي يستشهد بها الناس لقول «.m3u8 تعني HLS» تسمح بـ .m3u لـ HLS وتسمح بمسار لا يقول شيئًا.
ولا يحظى نصف الشائع المتعلق بالترميز بحال أفضل. فالـ 8 في .m3u8 تُشرح على نطاق واسع بأنها UTF-8، والقسم 4.1 يشترط فعلًا UTF-8، لكل قائمة تشغيل، بأي من الامتدادَين: «يجب أن تكون ملفات قوائم التشغيل مرمَّزة بـ UTF-8. ويجب ألّا تحتوي أي علامة ترتيب بايتات (BOM)؛ وينبغي للعملاء أن يفشلوا في تحليل قوائم التشغيل التي تحتوي BOM أو التي لا تُحلَّل بوصفها UTF-8.» فالشرط يتعلّق بقائمة التشغيل، لا بتهجئة اسمها. وملفاتنا الثلاثة كلها تُفكّ بترميز UTF-8 بصفر محارف استبدال، ولا يحمل أيٌّ منها BOM، والملف المسمّى .m3u فيه محارف غير ASCII في 24 من أسماء العرض، فالامتدادات لا تخبرك بشيء هنا أيضًا.
أما ما تستخدمه المواصفة فعلًا لتصنيف قائمة التشغيل فهو محتواها. القسم 4.1: «قائمة التشغيل هي Media Playlist إذا كانت كل أسطر URI فيها تعرّف مقاطع وسائط. وقائمة التشغيل هي Master Playlist إذا كانت كل أسطر URI فيها تعرّف قوائم تشغيل وسائط.» فالنوع خاصية لِما تشير إليه أسطر URI. واسم الملف ليس في تلك الجملة.
الملفان يحملان امتداديهما بالمقلوب
ما من سطر واحد في أي من الملفات الثلاثة يبدأ بـ #EXT-X-. ولا سطر واحد، عبر 2,209 مُدخَلات، ولم أتوقّع ذلك من ملف اسمه .m3u8. يرث RFC 8216 وسمَين اثنين بالضبط من صيغة M3U الأقدم، #EXTM3U و#EXTINF، وكل وسم يعرّفه عدا هذَين يحمل البادئة EXT-X-، فالغياب أقرب ما تصل إليه مجموعة عيّنات من البرهان: هذه قوائم قنوات مبنية على الوسمَين الموروثَين مع طبقة توجيهات خاصة بها.
لواحق عناوين URL داخل الملف الأكبر هي حيث تتهاوى حكاية الامتداد. من صفوفه الـ1,895، يشير 1,621 إلى مسار ينتهي بـ .m3u8. والباقي متفرّق: 133 صفًا لا يحمل مسارها أي امتداد على الإطلاق، و15 ينتهي آخر مقطع في مسارها بنقطتَين رأسيتَين ورقم منفذ يخطئ Path.GetExtension فيحسبه امتدادًا، ثم 75 تنتهي بـ .php، و17 بـ .mpd، و14 بـ .htm، و7 بـ .ts، و6 بـ .m3u، و3 بـ .2ts، وصف واحد لكل من .smil و.dash و.mp4 و.wmv. سبعة عشر صفًا تنتهي بـ .mpd وواحد بـ .dash، وكلاهما يسمّي بيانات MPEG-DASH، وهي XML وليست M3U البتة. وستة تشير إلى ملف M3U آخر. ومئتان وأربعون تحمل لاحقة لا تسمّي أي صيغة وسائط.
عبر الملفات الثلاثة كلها، ينتهي 1,930 من 2,209 مسار عنوان URL بـ .m3u8 و7 بـ .ts، وهذا يُقرأ ظاهريًا على أنه 87.4 بالمئة HLS و0.3 بالمئة MPEG-TS. ولا شيء في الملفات يدعم ذلك، لأن أيًّا منها لم يُجلَب. أما ما يتبيّن أن النقل عليه فهو موضوع منفصل.
شكل آخر من الملف نفسه، لأنه سيهمّ لاحقًا. سطر #EXTM3U فيه طوله 6,294 بايتًا، وكل تلك البايتات عدا سبعة سمة x-tvg-url تحمل 101 عنوان دليل برامج مفصولة بفواصل. يعطي RFC 8216 صيغة الوسم على أنها السلسلة المجردة #EXTM3U، ويمنع المسافات البيضاء «إلا في العناصر التي تُحدَّد فيها صراحةً»، ويقول إن قائمة التشغيل التي تخالف قواعده غير صالحة وعلى العملاء أن يفشلوا (MUST) في تحليلها. فالسطر الأول من ذلك الملف خارج المواصفة على نحو قابل للكشف، وبطريقة لا تنتجها أي قائمة تشغيل HLS. تلك إشارة، ونحن لا نستخدمها.
أطعِم بيان HLS لمحلِّل قوائم قنوات وستحصل على ثلاثة إخفاقات مختلفة
هذه قائمة تشغيل وسائط مباشرة، بُنيت لهذه المقالة بمضيف مثال محجوز واختُصرت إلى ثلاثة مقاطع:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:26401
#EXTINF:10.000,
https://example.com/seg26401.ts
#EXTINF:10.000,
https://example.com/seg26402.ts
#EXTINF:10.000,
https://example.com/seg26403.ts
مرّرتها عبر المحلِّل المشحون بدل تتبّعها يدويًا. ثلاث قنوات، صفر تشخيصات.
السطر 1 يُتخطّى، لأن المحلِّل لا يبحث إلا عن #EXTINF: ويعبر كل سطر # آخر بوصفه توجيهًا غير معروف. والأسطر 2 و3 و4 تسلك الطريق نفسه: #EXT-X-VERSION و#EXT-X-TARGETDURATION و#EXT-X-MEDIA-SEQUENCE كلها مجرد علامات # بالنسبة إلينا. وكل سطر #EXTINF:10.000, يُحلَّل بسلاسة، إذ يأخذ ماسح المدة 10، وتقع .000 المتبقية بلا ضرر في منطقة السمات، والعنوان بعد الفاصلة فارغ. والعنوان الفارغ يصير السلسلة الحرفية Unnamed channel. وكل سطر يليه عنوان HTTPS مطلق، فيُقبَل، وتُصدَر قناة.
ثلاث قنوات اسمها Unnamed channel، كل منها تشير إلى جزء واحد مدته عشر ثوانٍ من بث واحد. لا خطأ، ولا تحذير، ولا عدّاد. والاستيراد يبلّغ عن النجاح.
غيّر شيئًا واحدًا فيتغيّر الشكل كليًّا. يسمح HLS بأن يكون عنوان URI للمقطع نسبيًا إلى بيانه (القسم 4.1) ويسمح لخادم مباشر بإسقاط المقاطع من المقدمة مع تقدّم البث (القسم 6.2.2)، وكثير من الخوادم تفعل الأمرَين، فتصير الأسطر seg26401.ts حيث كان عنوان URL كاملًا. تلك تفشل في اختبار عنوان URI المطلق، ويعطي الملف نفسه صفر قنوات وثلاثة تشخيصات نصّها Skipped non-absolute http(s) URL. وقائمة رئيسية بعناوين URI مطلقة لنسخ العرض تفشل بطريقة ثالثة: لا أسطر #EXTINF فيها على الإطلاق، بل #EXT-X-STREAM-INF فقط قبل كل عنوان نسخة عرض، فيصل كل عنوان بلا ترويسة معلّقة وينتج URL without preceding EXTINF (skipped).
ثلاثة مدخلات هي كلها الشيء نفسه، وثلاث نتائج لا صلة بينها، ولا واحدة منها تقول «هذا بيان HLS». وأسوأ الثلاثة هو الذي ينجح. فالمستخدم الذي استورد قائمة وسائط بعناوين URI مطلقة للمقاطع يحصل على مصدر يبدو مأهولًا، ولا يظهر الإخفاق إلا حين يحاول تشغيل صف.
أول سطر #EXT-X- يخبرك بما هو الملف
كل من تلك الملفات يعلن عن نفسه في أسطره الأربعة الأولى. والاختبار زهيد، وليس هو الامتداد، ولا شيء في عميلنا ولا في خدماتنا يجريه: اقرأ رأس الجسم وابحث عن سطر محارفه السبعة الأولى #EXT-X-. أي إصابة تعني HLS عمليًا، لأن كل وسم تعرّفه المواصفة عدا الوسمَين اللذَين ورثتهما يحمل تلك البادئة. وإصابتان تحسمان النوع:
#EXT-X-TARGETDURATIONتعني قائمة وسائط، أي قائمة مقاطع. والقسم 4.3.3.1 يجعلها مطلوبة (REQUIRED) فيها، فغيابها له وزنه أيضًا.#EXT-X-STREAM-INFتعني قائمة رئيسية، أي قائمة نسخ عرض.
المواصفة لا تحجز أي بادئة ولا تحتفظ بأي سجل للوسوم، فهذا اصطلاح قوي لا ضمان: قد تحمل قائمة قنوات سطر #EXT-X- شاردًا فيسيء الإجراء الذي أوصي به قراءتها. ولا واحدة من قوائمنا تفعل.
مع انعدام #EXT-X- في أي موضع، ثلاثة أشكال مؤكِّدة تدعم قائمة القنوات. مدة قدرها -1، وهي التي تحملها مُدخَلاتنا الـ2,209 كلها، تقع خارج قواعد RFC 8216 النحوية، لأن لا شكل decimal-integer ولا شكل decimal-floating-point يقبل إشارة ناقص. وسمات على سطر #EXTM3U، كما في الترويسة ذات الـ6,294 بايتًا أعلاه. وسمات tvg- بين المدة والفاصلة، وهو اصطلاح لا مواصفة وراءه.
كلا الوسمَين يجلس اصطلاحًا قرب أعلى الملف الذي ينتمي إليه. ويفرض RFC 8216 موضعًا لـ #EXTM3U وحده، فالقراءة المحدودة إجراء تقريبي.
Content-Type رأي ثالث ولم نطلبه قط
يقدّم RFC 8216 الـ Content-Type بديلًا عن المسار، وهذا يبدو النصف الموثوق حتى تلاحظ ما يسمح به الخيار بين الأمرَين: الخادم الذي عرّف قائمة تشغيله بالمسار يجوز له بعد ذلك أن يرسل أي ترويسة يشاء.
كتبنا حاجزًا لذلك. يرفض عائلات MIME الخاطئة بجلاء قبل قراءة أي جسم: HTML وJSON والصور والفيديو والخطوط وmultipart وWebAssembly. والأنواع غير المعروفة والعامة تمرّ إلى فحص الجسم، وtext/plain هو المثال المسمّى. ثم يقتطع استثناءَين من رفضه الشامل لـ audio/*: audio/x-mpegurl، بحجة معلنة هي أن شبكات توصيل المحتوى والاستضافة الساكنة تقدّم قوائم التشغيل عادةً بهذا النوع، وaudio/mpegurl، أحد النوعَين اللذَين تسمّيهما المواصفة والذي كانت القاعدة الشاملة سترفضه لولا ذلك. والحاجز مختبَر بوحدات اختبار وليس له مستدعي إنتاجي. كان له واحد حتى حذف تغيير الفهرس الرقيق جالب الخادم الذي كان يستخدمه.
أما ما يعمل فعلًا فهو فحص للجسم، ويعمل على جهازك. يتخطّى علامة ترتيب بايتات UTF-8 اختيارية وأي مسافات بيضاء بادئة، ثم يقبل الملف إذا كانت البايتات السبعة التالية #EXTM3U أو #EXTINF. ونُفِّذ على الحاجز المشحون، فقبل قائمة HLS رئيسية، وقائمة وسائط HLS، وقائمة قنوات بلا سطر ترويسة، وملفًا مسبوقًا بـ BOM. ورفض صفحة خطأ HTML وجسم خطأ JSON، وهي فئة المدخلات التي كُتب حاجز Content-Type من أجلها. ورفض كذلك ملفًا سطره الأول تعليق # عادي، وكان RFC 8216 سيرفض ذلك أيضًا لأنه يشترط #EXTM3U أولًا، فنحطّ في المكان الصحيح بالمصادفة.
أي نسخة تعمل أمر مهم، وكنت أضعها في المكان الخطأ حتى مشيت على مخطط الاستدعاءات. تحمل خدمة الفهرس توأمًا بطبقة ثنائية فوقه، ترفض البايتات الصفرية وستة تتابعات سحرية تغطي PDF وملفات Windows التنفيذية وثنائيات ELF وثلاثة أشكال من ZIP. تلك الطبقة تقول ما إذا كان الملف ثنائيًا متنكّرًا، لا ما إذا كان HLS أبدًا. ولا شيء في الإنتاج يصل إليها: المستدعي الوحيد لفحص المحتوى في التوأم الخادمي اختبار تكامل. أما الفحص الذي يعمل على رفع حقيقي فهو فحص العميل، عند CloudSyncUploadService.cs:28، ستة أسطر قبل تشفير النص الصريح، فالبايتات التي كان بوسع الخادم فحصها تصير نصًّا مشفَّرًا قبل أن تغادر جهازك.
يقرأ ذلك الفحص 8,192 بايتًا على الأكثر، وهو حدّ اختير لتقييد فحص أمني من دون أي تفكير في تصنيف صيغة. بالكاد يكفي. في الملف ذي الـ308 صفوف يبلغ السطر الأول 7 بايتات وتتسع النافذة لـ29 سطر #EXTINF كاملًا، 28 منها مع عنوان URL الخاص بها. وفي الملف ذي الـ1,895 صفًا يأكل السطر الأول وحده 6,294 من الـ8,192، فيترك 1,898 بايتًا تحمل 9 أسطر #EXTINF كاملة، 8 منها مع عنوان URL الخاص بها. والقائمة الرئيسية تتسع كاملة، وقائمة الوسائط تضع #EXT-X-TARGETDURATION في أسطرها الافتتاحية، فالنافذة تعمل بفضل موضع وسوم HLS. وثمانية كيلوبايتات ليست جزءًا مبدئيًّا من ملف يُقرأ.
سلوك BOM هو الجزء الذي أعاود النظر إليه. يقول RFC 8216 إنه ينبغي للعملاء أن يفشلوا في تحليل قائمة تشغيل تحتوي علامة ترتيب البايتات، وأول ما يفعله فحصنا أن يتخطّى واحدة ويتابع. Notepad وOut-File في PowerShell يكتبان BOM، ورفض تلك الملفات كان سيكلّف المستخدم استيرادًا يعمل إرضاءً لقاعدة لا عاقبة عملية لها عندنا، فنحن ننحرف عن علم. ويبقى ذلك انحرافًا، وعلى القارئ الذي يبني على المواصفة ألّا ينسخه منّا.
سجّل قائمة تشغيل بعنوان URL بدل رفعها فلا جسم يُفحَص، لأن ذلك التسجيل يخزّن عنوانًا بوصفه بيانات وصفية للحساب ولا يجلب شيئًا. وما يبقى هو الامتداد، وفحصنا يعمل بالمقلوب: لا ينطلق إلا حين يكون للمسار امتداد أصلًا، فعنوان URL ينتهي بـ .txt يُرفَض وعنوان URL ينتهي بـ /playlist يُقبَل من دون فحص. القاعدة تفحص العناوين التي أخبرتك بشيء وتمرّر الصامتة. صائد أخطاء إملائية زهيد، وفحص صيغة عديم الفائدة.
الامتداد في عنوان URL للبث طلب، لا وصف
كل ما سبق عن ملف قائمة التشغيل. والمشكلة نفسها تتكرر مستوى واحدًا أدنى، في العناوين الموجودة داخله، حيث يسهل إثباتها لأننا نحن من يكتبها.
تبني برمجيات البوابات من عائلة Xtream Codes عنوان URL للبث المباشر على الشكل {portal}/live/{user}/{pass}/{streamId}.{ext}، والامتداد هو العميل يسأل الخادم أي حاوية يرسل. والقناة نفسها هي 1234.ts أو 1234.m3u8 بحسب ما تكتب. وتأخذ نقطة نهاية تصدير قوائم التشغيل فيها الاختيار نفسه معاملَ استعلام، والمفردتان لا تتطابقان: المسار يتهجّاه .m3u8، بينما يعطي توثيق المجتمع لتلك الواجهة قيم الاستعلام على أنها ts وhls وrtmp، والافتراضي ts. وتعليقنا التوثيقي نحن في XtreamM3uPlusExportUri.cs:5 يكتب output=ts|m3u8، وهي قيمة لا يذكرها ذلك التوثيق، فنحن نشحن الالتباس في ملف مصدر. ولا شيء في القناة يتغيّر، والامتداد ليس أبدًا سوى طلب.
يحتوي مستودعنا بانِيَين لذلك العنوان وهما يختلفان. الذي يعمل على الجهاز يثبّت .ts صراحةً. والآخر يلحق .m3u8 وليس له مستدعي خارج اختباره الخاص. وفي الوقت نفسه يحمل كل مصدر Xtream إعدادًا محفوظًا لهذا بالضبط، يظهر على المصادر غير المجمَّعة بوصفه عنصر تحكم ثنائيًّا يحمل التسمية «تنسيق البث»، بالخيارَين «MPEG-TS» و«HLS (m3u8)»، والتلميح «الحاوية المطلوبة من بوابة Xtream». ابحث في عميل سطح المكتب عن ذلك الحقل فتجد عقد الواجهة البرمجية وصف نموذج العرض ومربع حوار الإعدادات، ولا شيء غيرها. بانِي العناوين لا يقرأه. ومسار التشغيل لا يقرأه.
فيستطيع المستخدم أن يفتح إعدادات المصدر، ويبدّل إلى HLS، ويحفظ، ويعيد فتح مربع الحوار فيرى HLS محدَّدًا، ويستمرّ الجهاز في طلب .ts لكل قناة. القيمة تذهب وتعود ولا تغيّر شيئًا. وما فاجأنا أن هذه لنا، مشحونة، ولم يلاحظها أحد: بُني عنصر التحكم إلى جانب الحقل المحفوظ ولم يُوصَل البانِي به قط، فالإعداد يبلّغ عن حالة ليست له، وهذا أسوأ من عدم تقديمه أصلًا. ظهر الأمر وأنا أجمع الشواهد لهذه الصفحة، لا من بلاغ دعم، وهذا يخبرك كم هو مرئي من الخارج.
والمصنِّفان اللذان نشغّلهما فعلًا على تلك العناوين يختلفان أيضًا، على نحو أصغر. يقرر مراقب التشغيل hls أو ts باختبار ما إذا كان عنوان URI كاملًا يحتوي السلسلة الجزئية .m3u8، فالرمز داخل سلسلة استعلام يُحتسب. ويبلّغ مربع حوار معلومات البث عن الحاوية بتحويل امتداد مسار عنوان URL إلى أحرف كبيرة، فنقطة نهاية get.php ستعرض PHP، وصف .mpd يعرض MPD، والصفوف الـ15 التي ينتهي مسارها بمجموعة بث متعدد ومنفذ تعرض شيئًا على شكل 1:1234. شغّل الاثنين على الملف ذي الـ1,895 صفًا فيختلفان في 6 صفوف، كل منها يحمل .m3u8 داخل استعلام لا في نهاية مسار. ستة صفوف ليست أزمة، وحكم مراقب التشغيل قياس عن بُعد لا تقرأه أي عتبة، فلا شيء يتصرّف بناءً عليه. ومع ذلك فهما دالّتان في تطبيق واحد تجيبان عن السؤال نفسه بجوابَين مختلفَين، ولا واحدة منهما تسأل مفكّك التعدد، وهو المكوّن الوحيد الذي يعرف.
الحدّ أننا نحتفظ بثلاثة ملفات منتقاة. بايتات قائمة التشغيل تُقرأ على جهازك، مقابل العنوان الذي توجّهه إليه، ونحن ننتقي عناوين أدلة البرامج ولا ننتقي بيانات الدليل أبدًا. فأستطيع أن أخبرك كيف تبدو هذه المُدخَلات الـ2,209 وما يفعله محلِّلنا ببيان. ولا أستطيع أن أخبرك كم مرة يعيد عنوان URL بـ .m3u8 في البرّية قائمة قنوات، لأن قياس ذلك يعني جلب أجسام قوائم التشغيل من عناوين أعطانا إياها المستخدمون.
لترى ما يحمله ملف فعلًا، يحلّله تطبيقا Windows وXbox محليًّا ويعرضان ما خرج منه؛ وحساب مجاني يكفي لتجربته على مصدر لديك بالفعل.
ولمن يكتب المحلِّل بدل ذلك، القاعدة أضيق من «افحص الجسم». قرّر ما هو الملف من أول وسم لا يمكن أن ينتمي إلا إلى صيغة واحدة، واجعل ذلك القرار ينتج رسالة. الامتداد وContent-Type تلميحان لا يكلّف فحصهما شيئًا ولا يثبتان شيئًا حين يتفقان. ومحلِّلنا ينتج تشخيصَين يسمّيان المشكلة الخطأ واستيرادًا واحدًا ينجح وهو خاطئ كليًّا، والثالث هو الذي يكلّفك خيط دعم.
ما قياس هذه المادة34 ادعاءات، كل منها مزود بالأدلة التي تقف خلفه
| المطالبة | الأدلة | عد |
|---|---|---|
| يعرّف RFC 8216 قائمة التشغيل بالمسار أو بـ Content-Type، ويجوز أن ينتهي المسار بـ .m3u8 أو بـ .m3u، وعلى العملاء رفض قائمة تشغيل لا يعرّفها أيٌّ منهما.RFC 8216 section 4, verbatim: Each Playlist file MUST be identifiable either by the path component of its URI or by HTTP Content-Type. In the first case, the path MUST end with either .m3u8 or .m3u. In the second, the HTTP Content-Type MUST be "application/vnd.apple.mpegurl" or "audio/mpegurl". Clients SHOULD refuse to parse Playlists that are not so identified. | المواصفات | لا ينطبق |
| RFC 8216 وثيقة Informational لا Standards Track، ومراجعة من شأنها أن تُبطله وتعيد تسمية Master Playlist إلى Multivariant Playlist موجودة في طابور RFC Editor. وقاعدة التعريف المقتبسة هنا لم تتغيّر فيها.RFC 8216 Status of This Memo, verbatim: This document is not an Internet Standards Track specification; it is published for informational purposes. Revision: draft-pantos-hls-rfc8216bis-22 (1 May 2026), datatracker state Sent to the RFC Editor, marked obsoletes 8216 (if approved), titled HTTP Live Streaming 2nd Edition, which introduces the Multivariant Playlist in place of the Master Playlist. | المواصفات | لا ينطبق |
| يشترط RFC 8216 ترميز UTF-8 لكل قائمة تشغيل أيًّا كان امتدادها، ويطلب من العملاء الفشل عند وجود علامة ترتيب البايتات.RFC 8216 section 4.1, verbatim: Playlist files MUST be encoded in UTF-8 [RFC3629]. They MUST NOT contain any Byte Order Mark (BOM); clients SHOULD fail to parse Playlists that contain a BOM or do not parse as UTF-8. | المواصفات | لا ينطبق |
| يعرّف RFC 8216 نوع قائمة التشغيل بما تشير إليه أسطر URI فيها، لا بامتدادها.RFC 8216 section 4.1, verbatim: A Playlist is a Media Playlist if all URI lines in the Playlist identify Media Segments. A Playlist is a Master Playlist if all URI lines in the Playlist identify Media Playlists. | المواصفات | لا ينطبق |
| يرث RFC 8216 وسمَين اثنين بالضبط من صيغة M3U الأقدم، EXTM3U وEXTINF. وكل وسم آخر يعرّفه يحمل البادئة EXT-X-، وهذا ما يجعل سطر #EXT-X- إشارة HLS صالحة للاستخدام. ولا ينص RFC على أي حجز للبادئة ولا يعرّف أي سجل للوسوم.RFC 8216 section 4, verbatim: The format of the Playlist files is derived from the M3U [M3U] playlist file format and inherits two tags from that earlier file format: EXTM3U (Section 4.3.1.1) and EXTINF (Section 4.3.2.1). Section 4.1 says only: Tags begin with #EXT. They are case sensitive. Section 9 registers one media type and reserves no tag prefix. | المواصفات | لا ينطبق |
| EXT-X-TARGETDURATION مطلوب في Media Playlist، وهذا ما يجعل غيابه إشارة صالحة للاستخدام.RFC 8216 section 4.3.3.1, verbatim: The EXT-X-TARGETDURATION tag is REQUIRED. | المواصفات | لا ينطبق |
| يجب أن يكون EXTM3U أول سطر في كل قائمة تشغيل، وصيغته المحددة هي السلسلة المجردة #EXTM3U، والمسافات البيضاء ممنوعة إلا حيث يحددها وسم صراحةً. وقائمة التشغيل التي تخالف تلك القواعد غير صالحة وعلى العملاء أن يفشلوا في تحليلها.RFC 8216 section 4.3.1.1, verbatim: It MUST be the first line of every Media Playlist and every Master Playlist. Its format is: #EXTM3U. Section 4.1, verbatim: Whitespace MUST NOT be present, except for elements in which it is explicitly specified. Section 4, verbatim: Playlists that violate these rules are invalid; clients MUST fail to parse them. | المواصفات | لا ينطبق |
| مدة #EXTINF قيمة من نوع decimal-integer أو decimal-floating-point، ولا يقبل أيٌّ من الإنتاجَين إشارة ناقص، ولذلك فإن #EXTINF:-1 خارج قواعد RFC 8216 النحوية.RFC 8216 section 4.3.2.1 (Its format is: #EXTINF:<duration>,[<title>]) with section 4.2, where decimal-integer is characters from [0..9] and decimal-floating-point is characters from [0..9] and '.' expressing a non-negative number; only signed-decimal-floating-point admits '-'. | المواصفات | لا ينطبق |
| يسمح RFC 8216 بعنوان URI نسبي للمقطع ويسمح لخادم مباشر بإزالة المقاطع من قائمة التشغيل مع تقدّم البث. وكلاهما إذن لا ممارسة مطلوبة، ومثال RFC نفسه للبث المباشر يستخدم عناوين URI مطلقة للمقاطع.RFC 8216 section 4.1, verbatim: A URI in a Playlist, whether it is a URI line or part of a tag, MAY be relative. Section 6.2.2, verbatim: The server MAY limit the availability of Media Segments by removing Media Segments from the Playlist file (Section 6.2.1). If Media Segments are to be removed, the Playlist file MUST contain an EXT-X-MEDIA-SEQUENCE tag. Section 8.2, Live Media Playlist Using HTTPS, lists absolute https segment URIs. | المواصفات | لا ينطبق |
| توثّق نقطة نهاية تصدير قوائم التشغيل في Xtream Codes القيم output=ts وoutput=hls وoutput=rtmp، والافتراضي ts. وليست m3u8 من قيم الاستعلام الموثّقة، وإن كانت .m3u8 هي تهجئة امتداد المسار للاختيار نفسه.Community reference documentation for the Xtream Codes API (zaclimon/xipl wiki, Xtream-Codes-API), verbatim on the output parameter: ts, hls and rtmp are available. By default it will be ts which represents the MPEG-TS container. | المواصفات | لا ينطبق |
| تعليقنا التوثيقي نحن لمحلِّل عنوان URL الخاص بتصدير Xtream يوثّق الاستعلام على أنه [&output=ts|m3u8]، وهي قيمة لا يذكرها توثيق المجتمع. | n = 1 | 23/08/2026 |
| مجموعة العيّنات ثلاثة ملفات منتقاة، تضم 2,209 مُدخَلات من نوع EXTINF+URL، وليس فيها جميعًا سطر واحد يبدأ بـ #EXT-X-. | n = 2209 | 23/08/2026 |
| الملف المسمّى .m3u يحمل 308 صفوف قنوات منها 303 (98.4 بالمئة) ينتهي مسار عنوان URL فيها بـ .m3u8. والملف المسمّى .m3u8 يحمل 1,895 صف قناة، وهو نفسه قائمة قنوات، و1,621 من صفوفه (85.5 بالمئة) ينتهي مسار عنوان URL فيها أيضًا بـ .m3u8. فالتصنيف بامتداد عنوان URL الداخلي يصنّف الملفَين معًا HLS. | n = 2203 | 23/08/2026 |
| في الملف ذي الـ1,895 صفًا ينتهي مسار عنوان URL بـ .m3u8 في 1,621 صفًا ولا يحمل أي امتداد على الإطلاق في 133؛ و15 صفًا تنتهي بنقطتَين رأسيتَين ورقم منفذ يخطئ Path.GetExtension فيحسبه امتدادًا؛ و75 تنتهي بـ .php، و17 بـ .mpd، و14 بـ .htm، و7 بـ .ts، و6 بـ .m3u، و3 بـ .2ts، وصف واحد لكل من .smil و.dash و.mp4 و.wmv. | n = 1895 | 23/08/2026 |
| 240 من الصفوف الـ1,895 تحمل لاحقة عنوان URL لا تسمّي أي صيغة وسائط: 133 بلا امتداد، و15 بنقطتَين رأسيتَين ومنفذ، و75 بـ .php، و14 بـ .htm، و3 بـ .2ts. | n = 1895 | 23/08/2026 |
| الملفات الثلاثة كلها تُفكّ بترميز UTF-8 بصفر محارف استبدال ولا يحمل أيٌّ منها علامة ترتيب البايتات. والملف المسمّى .m3u فيه محارف غير ASCII في 24 من أسماء العرض، والملف المسمّى .m3u8 في 736 من أسماء العرض واسم مجموعة واحد. | n = 2209 | 23/08/2026 |
| عبر المُدخَلات الـ2,209 كلها، ينتهي 1,930 مسار عنوان URL بـ .m3u8 (87.4 بالمئة) و7 بـ .ts (0.3 بالمئة). و368 مُدخَلًا تحمل سلسلة استعلام. | n = 2209 | 23/08/2026 |
| كل أسطر #EXTINF البالغة 2,209 في مجموعة العيّنات تحمل مدة قدرها -1. | n = 2209 | 23/08/2026 |
| يقرأ فحص المقدمة 8,192 بايتًا على الأكثر. في الملف ذي الـ1,895 صفًا يبلغ السطر الأول وحده 6,294 بايتًا، فيترك 1,898 بايتًا من النافذة، تظهر فيها 9 أسطر #EXTINF كاملة، 8 منها مع عنوان URL الخاص بها. وفي الملف ذي الـ308 صفوف يبلغ السطر الأول 7 بايتات وتتسع النافذة نفسها لـ29 سطر #EXTINF كاملًا، 28 منها مع عنوان URL الخاص بها. | n = 2 | 23/08/2026 |
| سطر #EXTM3U في الملف ذي الـ1,895 صفًا يبلغ 6,294 بايتًا ويحمل سمة x-tvg-url تضم 101 عنوان دليل مفصولة بفواصل على امتداد 6,274 محرفًا. والسطر ASCII خالص، فالبايتات والمحارف متطابقة. | n = 1 | 23/08/2026 |
| يتخطّى فحص المقدمة علامة ترتيب بايتات UTF-8 اختيارية والمسافات البيضاء البادئة، ثم يقبل الملف إذا كانت البايتات السبعة التالية #EXTM3U أو #EXTINF. نُفِّذ فعلًا: يقبل قائمة HLS رئيسية، وقائمة وسائط HLS، وقائمة قنوات بلا ترويسة، وملفًا مسبوقًا بعلامة ترتيب البايتات، ويرفض صفحة HTML، وجسم JSON، وملفًا سطره الأول تعليق # عادي. | n = 11 | 23/08/2026 |
| المستدعي الإنتاجي الوحيد لأي حاجز قوائم تشغيل على مستوى البايتات موجود على الجهاز، ويعمل قبل تشفير النص الصريح للرفع. أما الفحص التوأم للمحتوى في خدمة الفهرس فلا مستدعي إنتاجي له. | n = 1 | 23/08/2026 |
| نُفِّذ على المحلِّل المشحون: قائمة وسائط HLS بعناوين URI مطلقة للمقاطع تعطي قناة واحدة لكل مقطع باسم Unnamed channel بصفر تشخيصات؛ والقائمة نفسها بعناوين URI نسبية للمقاطع تعطي صفر قنوات وتشخيصًا واحدًا لكل مقطع؛ وقائمة HLS رئيسية بعناوين URI مطلقة لنسخ العرض تعطي صفر قنوات وتشخيص URL without preceding EXTINF واحدًا لكل نسخة عرض. | n = 3 | 23/08/2026 |
| العنوان الفارغ بعد الفاصلة يصير السلسلة الحرفية Unnamed channel، ولهذا تُستورَد قائمة وسائط HLS بوصفها قائمة صفوف متطابقة الأسماء لا بوصفها لا شيء. | n = 1 | 23/08/2026 |
| لا شيء في العميل ولا في الخدمات يبحث عن وسم #EXT-X-. والبحث بـ grep عن EXT-X في clients/windows/src وsrc لا يعيد أي نتيجة خارج تجهيزات الاختبار المكتوبة لهذه المقالة. | n = 1 | 23/08/2026 |
| يوجد حاجز Content-Type لجلب قوائم التشغيل، وهو مختبَر بوحدات اختبار، وليس له اليوم أي مستدعي إنتاجي. كان له واحد حتى حذف تغيير الفهرس الرقيق جالب الخادم الذي كان يستخدمه. | n = 1 | 23/08/2026 |
| رفض الحاجز الشامل لـ audio/* يستثني كلًّا من audio/x-mpegurl وaudio/mpegurl. والثاني منهما هو أحد نوعَي Content-Type اللذَين يسمّيهما RFC 8216، فمن دون الاستثناء كان الحاجز سيرفض نوع المواصفة نفسه. | n = 1 | 23/08/2026 |
| يرفض حاجز الرفع في الفهرس أي بايت صفري في أي موضع من نافذة الفحص، وستة تتابعات بايتات سحرية بادئة (PDF وMZ وELF وثلاثة أشكال من ZIP) وافتتاحيتَي HTML، ثم يطبّق فحص المقدمة نفسه. ولا شيء في الإنتاج يستدعيه. | n = 8 | 23/08/2026 |
| تسجيل عنوان URL لقائمة تشغيل يطبّق قائمة السماح .m3u / .m3u8 فقط عندما يكون لمسار العنوان امتداد أصلًا، فالمسار بلا امتداد يُسجَّل من دون فحص، والمسار المنتهي بـ .txt يُرفَض. | n = 1 | 23/08/2026 |
| يوجد في المستودع بانِيان لعناوين URL للبث المباشر في Xtream للبث نفسه. الذي يشغّله الجهاز يلحق .ts؛ والآخر يلحق .m3u8 وليس له مستدعي خارج اختباره الخاص. | n = 2 | 23/08/2026 |
| عنصر التحكم «تنسيق البث» لكل مصدر، بالخيارَين MPEG-TS وHLS (m3u8) والتلميح «الحاوية المطلوبة من بوابة Xtream»، يُعرَض على مصادر Xtream غير المجمَّعة فقط، ويذهب إلى الخادم ويعود، ولا يقرأه أبدًا بانِي عناوين URL ولا مسار التشغيل في رأس سطح المكتب. | n = 1 | 23/08/2026 |
| يصنّف مراقب التشغيل المصدر باختبار ما إذا كان عنوان URI كاملًا يحتوي .m3u8؛ ويبلّغ مربع حوار معلومات البث عن الحاوية بتحويل امتداد مسار عنوان URL إلى أحرف كبيرة. وعلى الملف ذي الـ1,895 صفًا يختلفان في 6 صفوف، كلها تحمل .m3u8 داخل سلسلة استعلام فقط. | n = 1895 | 23/08/2026 |
| لأن صف الحاوية هو امتداد مسار عنوان URL بأحرف كبيرة، فإن 75 صفًا في الملف الأكبر ستعرض حاوية PHP، و17 MPD، و14 HTM، و3 2TS، و133 لا شيء على الإطلاق، و15 سلسلة على شكل 1:1234 هي ذيل عنوان بث متعدد ومنفذه. | n = 1895 | 23/08/2026 |
| تصنيف ts أو hls لا يصل إلى أي عتبة أو مهلة أو تفريع في مراقب التشغيل. يُحمَل لأغراض القياس عن بُعد ولعتبات لكل نوع لم يكتبها أحد. | n = 1 | 23/08/2026 |