tvg-chno: أرقام القنوات في قوائم تشغيل IPTV، وما يفعله كل مشغّل بها
لا يعرّف أي معيار هذه السمة. قائمة تشغيل واحدة مقاسة تحمل 1,355 منها على 263 قيمة متمايزة، ولا اثنان من التطبيقات التي تقرأها يتفقان.
tvg-chno="1" 107 entries
tvg-chno="2" 92
tvg-chno="3" 80
tvg-chno="4" 72
tvg-chno="5" 68
tvg-chno="#" 4
tvg-chno="22.1" 1
ذاك رأس مدرّج أرقام القنوات في قائمة تشغيل حقيقية واحدة، مع قيمتين من أغرب قيمها مثبّتتين تحته. يحوي الملف 1,895 مُدخَلًا. 1,355 منها تحمل السمة، وتلك الأرقام الـ 1,355 تغطي 263 قيمة متمايزة، بمتوسط 5.15 مُدخَلات لكل قيمة. والرقم الأكثر شعبية في الملف تدّعيه 107 قنوات لا صلة بينها.
لا يعرّف أي معيار معنى أي من ذلك. لا توجد مواصفة لـ tvg-chno، ولا سجل، ولا مالك. التنفيذ المرجعي يوثّقها في سطر واحد من ملف README، والتطبيقات التي تقرأها تختلف في الإملاء والنوع والارتداد وفي ما إذا كانت تعرض القيمة أصلًا.
من أين جاءت السمة، بقدر ما يستطيع أحد إثباته
RFC 8216 مساهمة إعلامية لا وثيقة على مسار المعايير. يعرّف EXTM3U في القسم 4.3.1.1، وEXTINF في القسم 4.3.2.1، وعائلة #EXT-X-، ولا تظهر السلسلة tvg فيه في أي موضع. وقواعد قائمة السمات فيه مفصولة بفواصل وبشكل اسم ثابت، وهو ما لا يتبعه اصطلاح tvg- المفصول بمسافات، والقسم نفسه يأمر العملاء بتجاهل الأسماء التي لا يعرفونها. تلك التعليمة هي ما يسمح للاصطلاح بالعيش جنب الـ RFC: كل ما يلي اتفاق خاص بين برنامج واحد وقوائم التشغيل التي صادف أن عُرضت عليه.
أقدم ظهور لـ tvg-chno أستطيع الإشارة إليه هو طلب السحب #92 على إضافة IPTV Simple لـ Kodi، المفتوح في 2016-11-24 والمدمج في 2016-12-17. لا أستطيع إثبات أنه الأول، بل فقط أن لا شيء أقدم منه علني. يضيف ثابت علامة واحدًا، والدافع الذي ذكره مؤلفه كان مزامنة أرقام القنوات مع خادم خلفي. والدليل السلبي حوله أقوى من الإيداع نفسه: مسألة على المتعقّب ذاته من 2015-07-20 تقول بوضوح إن صيغة M3U لا وسم فيها لرقم القناة وتقترح حشر الرقم في اسم القناة بدل ذلك. وجد مؤلف #92 تلك المسألة بعد خمس دقائق من فتح طلب السحب، وأغلقها المشرف لاحقًا على أنها حُلّت برقعته. فحتى منتصف 2015 لم يكن مجتمع الإضافة نفسه يعرف أي سمة من هذا القبيل.
بادئة tvg- أقدم من الرقم بنحو أربع سنوات. فـ tvg-name وtvg-logo وgroup-title تقع في إيداع المشروع الأولي للإضافة بتاريخ 2013-01-17، وtvg-id تحطّ في اليوم نفسه، وtvg-shift بعد ذلك بأربعة أيام. أما ما تختصره tvg ففولكلور: الجميع يقرأها «دليل التلفزيون»، والسمات الشقيقة التي تحمل عنوان الدليل تدعم تلك القراءة، لكن لا مصدر من الطرف الأول يذكر التوسعة، والروايات التي تُرجع مجموعة السمات إلى منظومة مشغّلات Windows أقدم روايات من الدرجة الثانية. والسلبي أثبت. فـ XMLTV هي ما تشير إليه هذه السمات، لا ما جاءت منه.
يمتد التبنّي بعد Kodi إلى Tvheadend الذي يُصدِرها في مارس 2018، وEmby الذي يوثّقها خلال 2018، وJellyfin في فبراير 2019. وأشد تفصيلة مزعجة في الحصيلة أن رسالة إيداع Tvheadend تقول إنها تضيف سمة tvg-chnum بينما الشيفرة التي تحطّ بها تكتب tvg-chno=، وفي طريق العودة تقرأ tvh-chnum أولًا ثم ترتد إلى tvg-chno. خمسة إملاءات على الأقل تحمل رقم قناة في الملفات الحقيقية: tvg-chno وchannel-number وch-number وtvh-chnum وchannel-id التي يعاملها بعض القارئين رقمًا.
1,176 من الأرقام الـ 1,355 مشتركة مع صف آخر
قسنا ثلاث قوائم تشغيل عيّنة نحتفظ بها محليًا، 2,209 مُدخَلات في المجموع. اثنتان من الثلاث لا ترقّمان شيئًا البتة: صفر من مُدخَلاتها الـ 314 يحمل السمة. وكل ما هنا هو الملف الثالث.
القيم غير متوازنة. 179 من القيم المتمايزة الـ 263 تُستخدم مرة واحدة بالضبط، فمعظم الكتلة تجلس في رأس قصير: 107 مُدخَلات على الرقم 1، ثم 92 و80 و72 و68. ويمتد المدى من 1 إلى 4,999، فسقف المحلِّل البالغ 99,999 لم يعمل قط. 1,176 من الصفوف الـ 1,355، أي 86.8 بالمئة، تشترك في رقمها مع صف آخر على الأقل، ومفتاح فريد يُفرَض على الملف كان سيسقط 1,092 منها. وباحتساب القيم التي يقبلها محلِّلنا وحدها، يصير رقم الاشتراك 1,172 من 1,299، أي 90.2 بالمئة.
لماذا لا شيء في أحد هذه الملفات مفتاح مستقر، مسألة محسومة في مقالة M3U الموسّع، ولن أعيد المجادلة فيها هنا. وما لا تفعله تلك المقالة هو قتل الإصلاح البديهي: إذا تكررت الأرقام عبر ملف، فاحصرها في المجموعة التي تجلس فيها وتحصل كل مجموعة على تسلسل نظيف.
لا ينجح ذلك.
33 من المجموعات الـ 85 التي تحمل أي رقم أصلًا تحتوي رقمًا مكررًا واحدًا على الأقل داخل المجموعة. و69 من تلك الـ 85 تحتوي قناة برقم 1. ومجموعة واحدة تضم 7 مُدخَلات كلها برقم 1، وداخل أكبر مجموعة في الملف، 79 مُدخَلًا مرقّمًا تغطي 74 رقمًا متمايزًا. التجميع يقلّص عدد التصادمات من دون أن يزيلها، وإصلاح ينجح مع ثلثي مجموعاتك يفشل بصمت مع الثلث الآخر.
معدل الغياب مهم بقدر التكرار. 596 من المُدخَلات الـ 1,895، أي 31.5 بالمئة، تنتهي بلا رقم صالح للاستخدام: 540 لم تحمل السمة قط، و56 حملت شيئًا يرفضه المحلِّل. وبالمقارنة مع سمة المعرّف، 398 صفًا لا تحمل رقمًا ولا معرّفًا، وهي الفئة التي لا يستطيع شيء في الملف مخاطبتها. وصف الدليل الذي لا شيء يرتبط به يظهر على شكل جدول خاطئ في بعض القنوات وصحيح في أخرى، لا على شكل شكوى من الترقيم.
كل عدد عشري في الملف أرجنتيني
25 مُدخَلًا تستخدم ترقيم major.minor، على 24 قيمة متمايزة تمتد من 22.1 إلى 36.2، و32.1 وحدها تتكرر. كل واحد من الـ 25 يحمل البلد AR، ومعرّفًا ينتهي بـ .ar، والمجموعة Argentina، التي تضم 26 مُدخَلًا وترقّم الـ 26 كلها. الأرجنتين تبث بنظام ISDB-Tb. ويستخدم ATSC وISDB-Tb كلاهما شكل major.minor، والشكل هو كل ما يشتركان فيه هنا. وتعليق المصدر عندنا يسمّي هذه القيم على طريقة ATSC، وهو صحيح في الشكل وخاطئ في الأصل.
تلك الصفوف الـ 25 هي سبب كون الرقم قيمة فاصلة عائمة لا عددًا صحيحًا. كان النوع زهيد الكلفة. أما الترحيل فلا. لا يمكن تعبئة العمود بأثر رجعي، لأن الرقم يعيش في حمولة المصدر ونحن لا نحتفظ بقائمة التشغيل الخام. كانت كل تثبيتة قائمة ستحمل قيمة فارغة على كل صف، وقائمة مرتّبة بذلك الرقم كانت ستضع مكتبة كاملة في الذيل غير المرقّم. يحذف الترحيل بصمة اللقطة وعلامة التجسيد، مُجبرًا المزامنة التالية على إعادة بناء الكتالوج. ودفعت كل تثبيتة قائمة ثمن إعادة تجسيد كاملة لعرض شارة.
ست وخمسون قيمة ليست أرقامًا أصلًا
56 من القيم الـ 1,355، على 53 إملاءً متمايزًا، مرفوضة رفضًا تامًا. وتقع في أربعة أشكال:
#مجردة على 4 مُدخَلات، عنصر نائب لم يملأه المُصدِر قط.- 49 رمز نظام بث: سلسلة من
D011إلىD081، وعائلة منBS101إلىBS4K101، وسلسلة طويلة منCS055إلىCS363، وJCOM307وحيدة. هذا مخطط ترقيم وطني حقيقي، والسمة لا متسع فيها له. CH 106وCH 108، الرقم نفسه مع بادئة ومسافة.- قيمة واحدة هي اسم منصة مكتوب باليابانية وفي آخره
527.
الرفض يكلّف الصف رقمه ولا يكلّفه الصف نفسه، فالـ 56 كلها تحتفظ بمكانها وتُرتَّب في الذيل غير المرقّم.
عدة حالات رفض قواعد بلا شاهد: الإشارة البادئة تضع +5 و-5 خارج الأنماط المقبولة، والصفر مرفوض لأن الرقم الغائب ليس القناة صفر. ولا يرد أي من الشكلين مرة واحدة في 1,355 قيمة. أما الأصفار البادئة فهي الحالة المتساهلة: 007 تُحلَّل إلى 7.
ذلك التقسيم يحتاج إلى تحفظ واحد، لأن سكربت القياس يحاكي محلِّلنا في Python، وfloat() أكثر تساهلًا من مجموعة الأنماط التي نمررها. فحصت مجموعة العيّنات بحثًا عن كل شكل يختلف فيه الاثنان، زائد أو ناقص بادئة، والأسس، والشرطات السفلية، وحشو المسافات، والأصفار البادئة، فوجدت صفرًا من كل منها. فتقسيم 1,299 مقابل 56 هو تقسيم المحلِّل الذي نشحنه.
لا اثنان من هؤلاء القارئين يتفقان
لا شيء أدناه يأتي من مواصفة، لأنه لا مواصفة. كل خانة مقروءة من مصدر ذلك المشروع أو من توثيقه.
| المستهلك | يقرأها | يقبل أيضًا | العشري | صفان ورقم واحد | السمة غائبة |
|---|---|---|---|---|---|
| Kodi IPTV Simple | نعم، منذ 2016-12 | ch-number، والقيم غير المقتبسة، وأي إملاء ببادئة، لأن المطابقة بحث عن سلسلة فرعية | يُقسَم عند النقطة إلى رقم رئيسي ورقم قناة فرعية | لا اكتشاف؛ كلاهما ينجو، والنواة ترتّب بالرقم وتفصل التعادل بالاسم | العدّاد الجاري يواصل من القناة السابقة زائد واحد |
| Jellyfin | نعم، منذ 2019-02 | tvg-id رقمية؛ وchannel-id رقمية، لكن فقط حين تكون tvg-id حاضرة وغير رقمية؛ ورقم بادئ في الاسم؛ واسم الملف في العنوان | تُحلَّل على أنها double، مع الاحتفاظ بالسلسلة الأصلية | لا شيء في المحلِّل | يمرّ عبر السلسلة؛ و-1 و0 مرفوضتان على أنهما غير صالحتين |
| Emby | نعم، خلال 2018 | لا شيء موثّق | غير موثّق | غير موثّق | موثّق على أنه اكتشاف تلقائي من الوسوم المتاحة |
| xTeVe | لا، تُخزَّن وتُتجاهَل | لا شيء؛ الترقيم داخلي | من واجهته فقط | لا يمكن أن يحدث؛ المخصِّص يأخذ أول رقم حر | كما لو كانت حاضرة: أول رقم حر عند بداية قابلة للضبط أو فوقها، 1000 افتراضيًا |
| Threadfin | نعم | tvg-chno فقط | تُخزَّن سلسلة، وتُحلَّل float للترتيب | تُنسَخ حرفيًا، فتبقى التصادمات | أول رقم حر من رقم بداية المجموعة |
| Channels DVR | channel-number، بحسب توثيقه | channel-id، الذي يجعله توثيقه الحقل المطلوب | غير موثّق | تُدمَج عبر المصادر، والقناة ذات الأولوية تفوز | غير موثّق |
| Plex | لا استيعاب لـ M3U البتة | لا ينطبق | ما يرسله الوكيل أمامه | ما يرسله الوكيل | الأرقام تأتي من تشكيلة موالف |
| VLC | لا | يقرأ tvg-logo وtvg-name وtvg-language وtvg-id وgroup-title ويسقط الباقي | لا ينطبق | لا ينطبق | لا مفهوم لرقم القناة، فقط موضع قائمة التشغيل |
قارئ Kodi هو الأكثر تساهلًا في المجموعة والأكثر إثارةً للدهشة في أثره. فكل مُدخَل يُبذَر من عدّاد جارٍ يُعاد ضبطه إلى أي رقم تدّعيه قناة، لذا فإن tvg-chno="500" واحدة عند ثلثَي الملف تعيد ترقيم كل قناة غير مرقّمة بعدها ابتداءً من 501. سمة واحدة على صف واحد تحرّك مئات غيرها. وبعد كل ذلك التحليل، إعداد نواة Kodi لاستخدام أرقام قنوات الخادم الخلفي معطّل افتراضيًا: مجموعة كل القنوات تعيد ترقيم نفسها من 1 إلى n، والمجموعات الأخرى ترث ذلك، ورقم قائمة التشغيل يبقى على القناة من دون أن يُعرَض.
قارئ Jellyfin هو الأشد صرامة: تعبيره النمطي يشترط قيمة بين علامتَي اقتباس مزدوجتين، فـ tvg-chno=101 بلا اقتباس غير مرئية له بينما يقرأها Kodi بسعادة، وقارئنا نحن عليه القيد ذاته. وسلسلة ارتداده تنتهي عند اسم الملف في عنوان البث، النقطة التي يكفّ فيها رقم القناة عن كونه بيانات ويبدأ في كونه تخمينًا عن مسار.
xTeVe هو الرفض المثير للاهتمام. يحلّل السمة إلى بيانات وصفية عامة ولا يستخدمها أبدًا، مخصِّصًا أرقامه هو من أول خانة حرة عند 1000 أو فوقها، وطلبُ احترام tvg-chno أُغلق على أنه غير مخطط له. ذاك التصميم الوحيد هنا الذي لا يمكن فيه لصفين يدّعيان رقمًا واحدًا أن يتصادما، لأن رأي قائمة التشغيل لا يُستشار أصلًا، والثمن أن مصدرًا مرقّمًا بعناية يصل معادَ الترقيم. أما Threadfin، فرعه، فسار في الاتجاه الآخر وينسخ القيمة حرفيًا، فتمرّ التصادمات سالمة؛ وإزالةُ التكرار فيه تجزّئ العنوان وtvg-id ومعرّف المصدر، ولا تجزّئ الرقم أبدًا.
Plex هو الصف الشاذ، لأنه لا يملك استيعابًا لـ M3U من الطرف الأول ولا شيء بداخله يحلّل السمة؛ وصفحة الموالفات المدعومة مجتمعيًا لديه تطلب جهاز Windows BDA أو Linux DVB. والطريق المعتاد من قائمة تشغيل هو وكيل على طريقة HDHomeRun، حيث يصل الرقم على شكل GuideNumber في lineup.json، وأي رقم يكون ذلك يعتمد على الوكيل: xTeVe يستبدل به رقمه، وThreadfin يمرّر السلسلة كما هي.
ستة صفوف تنتج أربعة أرقام صالحة للاستخدام
هذا مقطع مبني ليصيب كل مسار في آن واحد. كل مضيف فيه نطاق مثال محجوز وكل اسم مختلَق.
#EXTINF:-1 tvg-id="one.example" tvg-chno="1",Example One
https://example.com/live/one.m3u8
#EXTINF:-1 tvg-id="two.example" tvg-chno="1",Example Two
https://example.com/live/two.m3u8
#EXTINF:-1 tvg-chno=101,Example Three
https://example.com/live/three.m3u8
#EXTINF:-1 tvg-chno="22.1",Example Four
https://example.com/live/four.m3u8
#EXTINF:-1 tvg-chno="BS4K101",Example Five
https://example.com/live/five.m3u8
#EXTINF:-1 tvg-chno="007",Example Six
https://example.com/live/six.m3u8
الصفان One وTwo كلاهما يدّعي الرقم 1، وهذه الحالة العادية في هذا الملف لا حالته الطرفية. مقارِننا يحتفظ بكليهما، مرتّبَين بمقارنة ترتيب طبيعي لاسميهما ثم مقارنة ترتيبية لمعرّفَيهما، فالزوج حتمي. وKodi يحتفظ بكليهما أيضًا. أما xTeVe فكان سيمنحهما 1000 و1001 ولا يقرأ السمة أبدًا.
Three غير مقتبس، فيقرأ Kodi 101 بينما لا نقرأ نحن شيئًا البتة، كما لن يقرأ Jellyfin أيضًا: يحطّ الصف في الذيل غير المرقّم عندنا وعلى القناة 101 عند Kodi.
Four هو حالة القناة الفرعية. نحتفظ نحن بـ 22.1 عددًا عشريًا، ويقسمها Kodi إلى رئيسي 22 وقناة فرعية 1، ويحلّل Jellyfin قيمة double ويحتفظ بالسلسلة الأصلية للعرض، وأي مستهلك بعمود عدد صحيح يعرض 22.
Five يرفضه محلِّل الأرقام عندنا ويحتفظ بصفه، فينضم إلى Three في الذيل. وKodi يخرج أسوأ منا: قارئه يسلّم القيمة إلى atoi، التي تعيد 0 لسلسلة لا تتقدمها أرقامها، ولا شيء يحرس المُعيِّن، فيصير الصف القناة 0 ويُعاد ضبط العدّاد الجاري إلى 0 معه. وتصير القناة غير المرقّمة التالية 1. قيمة مهملة هناك تُحدث ضررًا أكبر من قيمة غائبة.
Six هو حالة الصفر البادئ: 007 تُطبَّع إلى 7 عندنا، ويحلّل Jellyfin الـ 7 نفسها مع الاستمرار في عرض 007.
مرتّبةً برقم المصدر، تقرأ قائمتنا Example One، ثم Example Two، ثم Example Six عند 7، ثم Example Four عند 22.1، ثم Example Five وExample Three بترتيب الاسم، لأن الرقم الغائب يُرتَّب بعد كل رقم حاضر لا على أنه صفر.
يُحلّ التصادم بطرق مختلفة بحسب ما يفعله المشاهد. واستلزم منا ذلك ثلاث آليات لا واحدة. للترتيب، يُستوعَب التصادم بفاصل التعادل بالاسم. لإدخال لوحة الأرقام، كتابة 1 تمشي بين التطابقات: يُجمَع كل صف يحمل ذلك الرقم وتدور الضغطات المتكررة بينها، مع الالتفاف عند النهاية، لأن تثبيت الأولى من 107 إلى الأبد كان سيجعل الـ 106 الأخرى بعيدة المنال. للتجميع، حيث تساهم عدة مصادر في قناة منطقية واحدة، يفوز رقم العضو المُسمّي، وإن لم يكن له رقم فأول عضو بترتيب الأولوية يملك رقمًا. وأولئك الأعضاء أنفسهم هم الطابور الذي يتحوّل إليه بث متعطل، وله مقالته الخاصة.
مسار لوحة الأرقام فيه فجوة لا تعجبني. فهو يجمع مفاتيح الأرقام فقط، بنافذة 1.2 ثانية بينها وإعادة ضبط بعد خمسة أرقام، ويحلّل بلا أي أنماط أرقام مفعّلة، فلا سبيل إلى كتابة 22.1. القناة الفرعية يمكن الوصول إليها بالبحث، حيث يمرّ الاستعلام بالمحلِّل الذي يقبل النقطة العشرية، ولا يمكن الوصول إليها من جهاز التحكم عن بعد. والسبب الصادق لعدم إصلاح ذلك أن 25 صفًا في مجموعة عيّناتنا تحتاج إليه.
الرقم الذي تعيّنه ليس الرقم الذي أرسله الملف
رقم المصدر لا يُعاد كتابته أبدًا. إيماءة إعادة الترتيب تكتب مفتاحًا كسريًا منفصلًا، ويعيش الاثنان جنبًا إلى جنب.
الآلية اختارها قيد لا علاقة له بالترتيب. سقف دفعة المزامنة عندنا 500 تغيير، وسجل واحد مرفوض يُفشِل الدفعة كلها آخذًا معه كل تغيير لا صلة له مسافرًا معه، فلم تكن إعادة ترقيم مجموعة عند كل إسقاط خيارًا قابلًا للحياة أبدًا. بدل ذلك يحصل كل قناة على مفتاح ضمني من موضعها في الترتيب الاحتياطي، والقناة الموضوعة تستخدم مفتاحها المتزامن، والإسقاط بين صفين يأخذ نقطة المنتصف، وهو ما يكتب صفًا واحدًا بالضبط. المفاتيح الضمنية متباعدة بواحد، فكل إسقاط في الفجوة نفسها ينصّفها: أمام فجوة دنيا قدرها 1e-9 يحطّ الإسقاط الثلاثون المتتالي في خانة واحدة، ويعيد الحادي والثلاثون توازن المجموعة إلى مفاتيح متساوية التباعد. تلك إعادة التوازن هي المسار الوحيد هنا الذي يكتب آلاف الصفوف، وتُسجَّل بحجمها بدل أن تعمل بصمت. ثلاثة تعليقات في مصدرنا نحن تقول خمسين. أخطأنا في هذا بالحدس، وكرّرته المسودة الأولى من هذه المقالة، ولم يصر الرقم ثلاثين إلا حين أجرى أحدهم الحساب.
تعرض الشارة موضع الصف لا ذاك المفتاح، لأن المفاتيح الضمنية تتحرك كلما أضاف المصدر قنوات أو أزالها، والرقم الذي يتحرك من تلقاء نفسه بعد مزامنة أسوأ من لا رقم. وعاشت نسخة أقدم من هذا الترتيب في نموذج العرض، حيث كان الترتيب المحفوظ يُطبَّق على مجموعات فئات المصدر ولا يُطبَّق بصمت على كل القنوات أو المفضلة أو المجموعات المخصصة.
يحلّل تطبيقا Windows وXbox كل هذا على جهازك، من قائمة التشغيل التي توجّههما إليها، ويمكنك إنشاء حساب مجاني لتجربة أي منهما. لا شيء عن أرقام قنواتك يصل إلينا، لأن الملف لا يُرفَع أبدًا والتحليل يحدث محليًا.
إن كنت تُصدِر قوائم تشغيل، فاكتب tvg-chno على كل صف وأبقِها فريدة داخل الملف، لأن المستهلكين الذين يحترمونها لا يشتركون في قاعدة لما يُفعَل حين لا تفعل، وأحدهم سيعيد ترقيم كل ما يلي أول قناة مرقّمة لديك. وإن كنت تقرأ قوائم تشغيل، فعُدّ القيم المتمايزة قبل أن تبني أي شيء على السمة. في مجموعة عيّناتنا ذلك العدد هو الفرق بين 1,355 رقمًا و263.
ما قياس هذه المادة46 ادعاءات، كل منها مزود بالأدلة التي تقف خلفه
| المطالبة | الأدلة | عد |
|---|---|---|
| RFC 8216 مساهمة مستقلة إعلامية. يعرّف EXTM3U في القسم 4.3.1.1، وEXTINF في القسم 4.3.2.1، وعائلة وسوم EXT-X-، ولا يعرّف أي سمة tvg- ولا أي سمة لرقم القناة؛ والسلسلة tvg لا تظهر فيه. وقواعد قائمة السمات في قسمه 4.2 مفصولة بفواصل وبشكل AttributeName ثابت، وهو ما لا يتبعه اصطلاح tvg- المفصول بمسافات. ويشترط القسم 4.2 أيضًا أن يتجاهل العملاء الوسوم غير المعروفة وأسماء AttributeName غير المعروفة، وهذا هو سبب بقاء الاصطلاح جنبه.RFC 8216, Informational, sections 4.2, 4.3.1.1 and 4.3.2.1. Full text re-read 2026-08-23; no occurrence of the string tvg. | المواصفات | لا ينطبق |
| أقدم ظهور علني يمكن التحقق منه لـ tvg-chno هو طلب السحب PR #92 على عميل PVR IPTV Simple لـ Kodi، المفتوح في 2016-11-24 والمدمج في 2016-12-17، الإيداع 28e607bb7d192c54759bae8e2bb1a5d51297e002 بواسطة sangwoo shin، برسالة add channel number tag، وهو يدخل ثابت العلامة tvg-chno= في محمّل قوائم التشغيل.https://github.com/kodi-pvr/pvr.iptvsimple/pull/92 and commit 28e607bb7d192c54759bae8e2bb1a5d51297e002. Constant re-verified 2026-08-23 against branch Piers: TVG_INFO_CHNO_MARKER = tvg-chno= and CHANNEL_NUMBER_MARKER = ch-number= in src/iptvsimple/PlaylistLoader.h. | المواصفات | لا ينطبق |
| في يوليو 2015 ذكر متعقّب المسائل للإضافة نفسها أن صيغة M3U لا وسم فيها لرقم القناة واقترح ترميزه في اسم القناة بدل ذلك. ولم يستشهد مؤلف PR #92 بتلك المسألة دافعًا له: فنص طلب السحب يذكر المزامنة مع الخادم الخلفي سببًا، وأشار إلى المسألة بعد خمس دقائق من فتح طلب السحب. وأغلق المشرف المسألة على أنها حُلّت بـ #92 في 2016-12-17.https://github.com/kodi-pvr/pvr.iptvsimple/issues/31, opened 2015-07-20, closed 2016-12-17 as fixed by #92. PR #92 body by excorp, 2016-11-24T04:19Z: Added channel number tag to m3u file. It is useful for syncing channel number with backend in kodi. His follow-up comment: I found something similar in issue #31. | المواصفات | لا ينطبق |
| tvg-name وtvg-logo وgroup-title حاضرة في إيداع المشروع الأولي للإضافة، 095e2fd بتاريخ 2013-01-17 بواسطة Anton Fedchin. وtvg-id تحطّ في اليوم نفسه في 46c58ef، وtvg-shift في 2013-01-21 في 68a61c4. ويوثّق ويكي ذلك المشروع ست سمات، tvg-id وtvg-name وtvg-logo وtvg-shift وgroup-name وradio، من دون ذكر أصلها.afedchin/xbmc-addon-iptvsimple, commit 095e2fd (2013-01-17) at src/iptvsimple/PVRDemoData.cpp:31-33, commit 46c58ef (2013-01-17) at src/iptvsimple/PVRIptvData.cpp:35, commit 68a61c4 (2013-01-21), and https://github.com/afedchin/xbmc-addon-iptvsimple/wiki/IPTV-Simple-Home | المواصفات | لا ينطبق |
| لا مصدر من الطرف الأول يذكر ما تختصره tvg. دليل التلفزيون هو القراءة الشائعة، والسمتان الشقيقتان x-tvg-url وurl-tvg تحملان عنوان XMLTV، وهذا يدعمها، لكن التوسعة غير مستندة إلى مصدر.Absence of any expansion in the add-on wiki, the add-on README and the original repository | المواصفات | لا ينطبق |
| يكتب Tvheadend السمة tvg-chno= في مخرجات M3U الخاصة به، ويُصدِرها بشكل major.minor عبر channel_get_number_as_str، وهو ما يجعله مُصدِرًا من الطرف الأول لأرقام قنوات عشرية. والإيداع الذي أضافها، 35c83be2 بتاريخ 2018-03-20 بواسطة Jaroslav Kysela، رسالته تقول add tvg-chnum attribute بينما الرمز المُصدَر هو tvg-chno.tvheadend commit 35c83be2fc8cdded (2018-03-20), message: m3u playlist: add tvg-chnum attribute with the channel number, fixes #5011. The emitter sits at src/webui/webui.c:601 on master today, which is not the line number in that commit. | المواصفات | لا ينطبق |
| قارئ الشبكة التلقائية لـ IPTV في Tvheadend نفسه يأخذ tvh-chnum أولًا ويرتد إلى tvg-chno، فالمشروع يقرأ إملاءً لا يكتبه.tvheadend/tvheadend, src/input/mpegts/iptv/iptv_auto.c:106-107 | المواصفات | لا ينطبق |
| خمسة إملاءات على الأقل تحمل رقم قناة في الواقع: tvg-chno وchannel-number وch-number وtvh-chnum وchannel-id رقمية.tvg-chno and ch-number at kodi-pvr/pvr.iptvsimple src/iptvsimple/PlaylistLoader.h:33-34; channel-number in the Channels DVR custom-channels documentation and in TVIP set-top firmware 4.1.12+ at https://wiki.tvip.tv/en/m3u, whose example is unquoted (channel-number=10); tvh-chnum at tvheadend/tvheadend src/input/mpegts/iptv/iptv_auto.c:106-107; numeric channel-id at jellyfin/jellyfin src/Jellyfin.LiveTv/TunerHosts/M3uParser.cs:191-195 | المواصفات | لا ينطبق |
| عبر ثلاث قوائم تشغيل عيّنة محفوظة محليًا، تحمل 2,209 مُدخَلات، ملف واحد فقط يرقّم أي شيء: 1,355 من مُدخَلاته الـ 1,895 تحمل tvg-chno، أي 71.5 بالمئة. والملفان الآخران يحملان السمة على صفر من مُدخَلاتهما الـ 314. | n = 2209 | 23/08/2026 |
| القيم الـ 1,355 تغطي 263 رقمًا متمايزًا، بمتوسط 5.15 مُدخَلات لكل قيمة. 179 قيمة تُستخدم مرة واحدة بالضبط. والخمسة الأولى هي 1 على 107 مُدخَلات، و2 على 92، و3 على 80، و4 على 72، و5 على 68. والمدى الرقمي من 1 إلى 4,999. | n = 1355 | 23/08/2026 |
| 1,176 من المُدخَلات الـ 1,355 تشترك في رقمها مع صف آخر على الأقل، أي 86.8 بالمئة، ومفتاح فريد كان سيسقط 1,092 منها. وباحتساب القيم التي يقبلها المحلِّل وحدها، 1,172 من 1,299 تشترك في رقمها، أي 90.2 بالمئة. | n = 1355 | 23/08/2026 |
| 33 من المجموعات الـ 85 التي تحمل أي رقم تحتوي رقمًا مكررًا واحدًا على الأقل داخل المجموعة، و69 من 85 تحتوي قناة برقم 1، ومجموعة واحدة تضم 7 مُدخَلات كلها برقم 1. وداخل أكبر مجموعة، 79 مُدخَلًا مرقّمًا تغطي 74 رقمًا متمايزًا. | n = 1895 | 23/08/2026 |
| 596 من المُدخَلات الـ 1,895 تنتهي بلا رقم صالح للاستخدام، أي 31.5 بالمئة: 540 لم تحمل السمة قط، و56 حملت قيمة يرفضها المحلِّل. | n = 1895 | 23/08/2026 |
| في الملف نفسه 1,250 مُدخَلًا تحمل tvg-chno وtvg-id معًا، و105 تحمل رقمًا بلا معرّف، و142 معرّفًا بلا رقم، و398 لا تحمل أيًّا منهما. | n = 1895 | 23/08/2026 |
| 25 مُدخَلًا على 24 قيمة متمايزة تستخدم ترقيم القنوات الفرعية major.minor، ممتدة من 22.1 إلى 36.2، و32.1 هو العدد العشري الوحيد الذي يتكرر، على 2 مُدخَلَين. وكل واحد من الـ 25 يحمل tvg-country=AR، وtvg-id تنتهي بـ .ar، وgroup-title بقيمة Argentina. وتلك المجموعة تضم 26 مُدخَلًا في المجموع وترقّم الـ 26 كلها. الأرجنتين تبث بنظام ISDB-Tb لا ATSC؛ والنظامان يشتركان في شكل major.minor لا في الجغرافيا. | n = 1895 | 23/08/2026 |
| الرقم من النوع double ومخزّن في عمود SQLite من نوع REAL، وكلا الموضعين يذكر ترقيم القنوات الفرعية سببًا. | n = 1 | 23/08/2026 |
| لا يمكن تعبئة العمود في مكانه بأثر رجعي، لأن الرقم يعيش في حمولة المصدر وقائمة التشغيل الخام لا يُحتفَظ بها، لذا يحذف الترحيل بصمة اللقطة وعلامة التجسيد لإجبار المزامنة التالية على إعادة بناء الكتالوج بدل الاختصار. | n = 1 | 23/08/2026 |
| يقبل المحلِّل النقطة العشرية والمسافات البادئة واللاحقة والثقافة الثابتة فقط. أما الإشارة البادئة والأس وفاصل الآلاف والفاصلة العشرية فخارج مجموعة الأنماط. وتُرفض القيم غير المنتهية وغير الموجبة وما فوق 99,999. وتُقبل الأصفار البادئة وتُطبَّع القيمة، فتصير 007 هي 7. والرفض لا يعيد شيئًا ويكلّف الصف رقمه، لا الصف نفسه أبدًا. | n = 1 | 23/08/2026 |
| 22.1 تُحلَّل و22,1 لا تُحلَّل، بما في ذلك تحت ثقافة فرنسية، والشارة تنسّق 5 لا 5.0. | n = 2 | 23/08/2026 |
| 56 قيمة على 53 إملاءً متمايزًا مرفوضة: 4 هي # حرفيًا، و49 رموز أنظمة بث في عائلات BS وCS وD وJCOM مثل D011 وBS4K101 وCS363 وJCOM307، و2 تقرأ CH 106 وCH 108، و1 اسم منصة باليابانية ينتهي بـ 527. | n = 1355 | 23/08/2026 |
| يحاكي سكربت القياس المحلِّل بدالة Python float()، وهي أكثر تساهلًا من مجموعة أنماط C#. وفُحصت مجموعة العيّنات بحثًا عن كل شكل يختلف فيه الاثنان، زائد أو ناقص بادئة، وترميز الأس، والشرطات السفلية، وحشو المسافات، والأصفار البادئة، بصفر حدوث لكل منها، لذا فإن تقسيم 1,299 مقبولة مقابل 56 مرفوضة هو تقسيم المحلِّل المشحون. | n = 1355 | 23/08/2026 |
| لا وجود لأي فهرس، فريد أو غيره، على عمود رقم القناة، وثلاثة ملفات مصدر منفصلة تذكر في مكانها أن لا شيء يجوز له أن يتخذ القيمة مفتاحًا. | n = 3 | 23/08/2026 |
| محلِّل واحد يخدم صيغتَي النقل كلتيهما، سمة M3U وحقل num في بروتوكول البوابة، وحقل البوابة يُقرأ عبر محوّل مرن لأن اللوحات تُصدِره سلسلة أو رقمًا بالتبادل. | n = 2 | 23/08/2026 |
| الترتيب برقم المصدر يضع الصفوف غير المرقّمة بعد المرقّمة بدل معاملة الغائب على أنه صفر، والأرقام المتساوية تسقط إلى مقارنة أسماء بالترتيب الطبيعي ثم إلى مقارنة معرّفات ترتيبية. | n = 1 | 23/08/2026 |
| تعرض الشارة رقم المصدر فقط ما دامت القائمة مرتّبة بذلك الرقم، وإلا فموضع الصف ابتداءً من 1؛ والصف غير المرقّم يرتد كذلك إلى الموضع، لأن شارة فارغة في عمود مرقّم تُقرأ صفًا معطوبًا. | n = 1 | 23/08/2026 |
| إدخال لوحة الأرقام يجمع كل صف يطابق الرقم المكتوب ويمشي بينها عند الضغطات المتكررة، ملتفًا عند النهاية، بدل تثبيت أول تطابق. | n = 1 | 23/08/2026 |
| مخزن الأرقام المتعددة يجمع مفاتيح الأرقام فقط ويحلّل بلا أي أنماط أرقام مفعّلة، فلا يمكن الوصول إلى رقم قناة فرعية من لوحة الأرقام؛ والقيمة نفسها المكتوبة في البحث تطابق، لأن البحث يمرّر الاستعلام عبر محلِّل الأرقام الذي يقبل النقطة العشرية. | n = 1 | 23/08/2026 |
| حين تساهم عدة مصادر في قناة منطقية واحدة، يفوز رقم العضو المُسمّي، وإن لم يكن له رقم فاز أول عضو في الدلو يعلن رقمًا؛ وترتيب الدلو هو ترتيب الأولوية أصلًا. | n = 1 | 23/08/2026 |
| الترتيب الذي يعيّنه المستخدم مفتاح كسري منفصل، لا إعادة كتابة لرقم المصدر أبدًا. الإسقاط يكتب صف مزامنة واحدًا بالضبط لأن سقف دفعة المزامنة 500 تغيير وسجل واحد مرفوض يُفشِل الدفعة كلها. والمفاتيح الضمنية متباعدة بواحد وكل إسقاط في الفجوة نفسها ينصّفها، فمع فجوة دنيا قدرها 1e-9 يحطّ الإسقاط الثلاثون المتتالي في خانة واحدة ويعيد الحادي والثلاثون التوازن؛ وإعادة التوازن هي المسار الوحيد الذي يكتب أكثر من صف واحد. | n = 1 | 23/08/2026 |
| قبل سحب الترتيب إلى دالة نقية واحدة، كان الترتيب المتزامن يُطبَّق على مجموعات فئات المصدر ولا يُطبَّق بصمت على كل القنوات أو المفضلة أو المجموعات المخصصة. | n = 1 | 23/08/2026 |
| قارئ العلامات في Kodi يبحث عن العلامة في أي موضع من السطر ويقبل قيمة مقتبسة أو مفصولة بمسافة، فـ tvg-chno=101 غير المقتبسة تُقرأ، وإملاء ببادئة مثل x-tvg-chno= يطابق أيضًا. وتُقسَم القيمة عند النقطة إلى رقم رئيسي ورقم قناة فرعية.kodi-pvr/pvr.iptvsimple branch Piers, head 78a023cb31, src/iptvsimple/PlaylistLoader.cpp:336, :375-390 and ReadMarkerValue at :622-664 | المواصفات | لا ينطبق |
| يبذر Kodi كل مُدخَل جديد من عدّاد جارٍ يبدأ عند إعداد Start channel number، ويعيد ضبط العدّاد إلى أي رقم تدّعيه قناة، ويزيده بعد كل إضافة، فقناة مرقّمة واحدة تعيد ترقيم كل قناة لاحقة غير مرقّمة من تلك النقطة.kodi-pvr/pvr.iptvsimple, src/iptvsimple/PlaylistLoader.cpp:174 and src/iptvsimple/Channels.cpp:37, :100, :121 | المواصفات | لا ينطبق |
| يحوّل Kodi قيمة العلامة بـ atoi، التي تعيد 0 لسلسلة لا تتقدمها أرقامها، مثل BS4K101. ولا شيء يحرس المُعيِّن، فيُمنح الصف رقم القناة 0 ويُعاد ضبط العدّاد الجاري إلى 0، وهو ما يعيد ترقيم القناة غير المرقّمة التالية إلى 1. القيمة المهملة هناك أشد تدميرًا من الغائبة.kodi-pvr/pvr.iptvsimple, std::atoi at src/iptvsimple/PlaylistLoader.cpp:388, unguarded SetChannelNumber(int) at src/iptvsimple/Channel.h:64, counter assignment at src/iptvsimple/Channels.cpp:100 and increment at :121 | المواصفات | لا ينطبق |
| إعداد pvrmanager.usebackendchannelnumbers في نواة Kodi افتراضيه false. ومع تعطيل أرقام الخادم الخلفي، تعيد مجموعة كل القنوات ترقيم أعضائها 1..n وترث المجموعات الأخرى ذلك الترقيم، لأن مسار 1..n لا يعمل إلا لمالك القنوات أو حين يُضبط startgroupchannelnumbersfromone، وذلك الإعداد افتراضيه false أيضًا. ويُحتفَظ برقم قناة العميل على العضو ولا يُعرَض ببساطة.xbmc/xbmc at 3f152e7c12, system/settings/settings.xml:1832 for usebackendchannelnumbers with <default>false</default> and :1841 for startgroupchannelnumbersfromone with <default>false</default>; xbmc/pvr/channels/PVRChannelGroup.cpp:915-919 for the 1..n condition and :927 for SetClientChannelNumber | المواصفات | لا ينطبق |
| تشحن الإضافة إعدادًا يتجاهل tvg-chno كليًا ويرقّم القنوات بترتيبها في الملف فقط.kodi-pvr/pvr.iptvsimple README: Only number by channel order in M3U, which ignores any tvg-chno tags | المواصفات | لا ينطبق |
| يوثّق التنفيذ المرجعي السمة في سطر واحد من ملف README الخاص به، فالسمة غير موثّقة في أي معيار لا غير موثّقة على الإطلاق.kodi-pvr/pvr.iptvsimple README line 515: tvg-chno: The number to be used for this channel. | المواصفات | لا ينطبق |
| التعبير النمطي للسمات في Jellyfin يشترط قيمة غير فارغة بين علامتَي اقتباس مزدوجتين، فالرقم غير المقتبس غير مرئي له. ويرتد رقم القناة عنده عبر tvg-chno، ثم tvg-id رقمية، ثم، فقط حين تكون tvg-id حاضرة وغير رقمية، channel-id رقمية، ثم رقم بادئ في اسم العرض، وأخيرًا اسم الملف في العنوان. و-1 و0 مرفوضان على أنهما غير صالحَين.jellyfin/jellyfin, src/Jellyfin.LiveTv/TunerHosts/M3uParser.cs:36 for the GeneratedRegex, :170-255 for GetChannelNumber with the channel-id branch nested as an else-if inside the tvg-id branch at :185-195, :267-277 for IsValidChannelNumber with -1 and 0 rejected at :270-271. Re-verified against master 2026-08-23. | المواصفات | لا ينطبق |
| حصل Jellyfin على دعم tvg-chno في PR #863، المُنشأ في 2019-02-10 والمدمج في 2019-02-14.https://github.com/jellyfin/jellyfin/pull/863 | المواصفات | لا ينطبق |
| يوثّق Emby السمة tvg-chno على أنها رقم القناة ويذكر أن القيم المفقودة تُكتشف تلقائيًا من أي وسوم متاحة. وما وراء ذلك من سلوك غير موثّق والمحلِّل المشحون مغلق المصدر. وتاريخ الدعم هو 2018؛ والمصدر الوحيد الذي وُجد له هو نص طلب السحب في Jellyfin، الذي يقول إن Emby أعلن ذلك في يوليو 2018.EmbySupport/Emby.Docs/M3U-Tuners.md:41, last updated 2026-07-18, published at https://emby.media/support/articles/M3U-Tuners.html; date attribution from the body of https://github.com/jellyfin/jellyfin/pull/863 | المواصفات | لا ينطبق |
| لقطة مصدر Emby العلنية مجمّدة عند 3.5.3 بتاريخ 2018-09-20 ومحلِّل M3U فيها لا يحتوي tvg-chno البتة. وذلك الملف هو السلف المباشر لمحلِّل Jellyfin، وهذا سبب حمل كليهما ارتدادَي بادئة الاسم واسم ملف العنوان ذاتهما.MediaBrowser/Emby at 1d7c2ab4bf, Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs:159-252, last touched 2017-08-20 | المواصفات | لا ينطبق |
| يخزّن xTeVe كل سمة في قائمة التشغيل بيانات وصفية عامة ولا حقل لرقم القناة في البنية التي يحلّل صف قائمة التشغيل إليها. ويخصّص أرقامه هو، آخذًا أول رقم حر عند قناة أولى قابلة للضبط أو فوقها، افتراضيها 1000 في الشيفرة لا في التوثيق، فلا يمكن لصفين يدّعيان رقمًا واحدًا أن يتصادما بحكم البناء. وأُغلق طلب ميزة لاحترام tvg-chno على أنه غير مخطط له.xteve-project/xTeVe at 0e999b85b9, src/internal/m3u-parser/xteve_m3uParser.go:54-80 for the generic attribute map with no chno handling, src/struct-system.go:202-216 for M3UChannelStructXEPG, src/system.go:129 for defaults[mapping.first.channel] = 1000, src/xepg.go:332-348 for the first-free scan; issue #269 closed as not planned | المواصفات | لا ينطبق |
| Threadfin، وهو فرع من xTeVe، يقرأ tvg-chno فعلًا، ويخزّنها سلسلة، ويحلّلها float للترتيب ولمقارنات إزالة التكرار، وينسخ القيمة حرفيًا إلى معرّف القناة الذي يعرضه، فتبقى التصادمات. وإزالة التكرار هي md5 على العنوان زائد tvg-id زائد معرّف مصدر M3U، مع الارتداد إلى العنوان زائد معرّف المصدر حين تكون tvg-id فارغة؛ وتمريرة ثانية تفصل التعادل بالرقم المحلَّل الأدنى. وإزالة التكرار بالاسم موجودة لكنها معطّلة في المصدر.Threadfin/Threadfin, branch main, head 6b9c0ccf16 dated 2025-09-29. String storage at src/struct-system.go:194 and :232; verbatim copy into xChannelID at src/xepg.go:643-647; float parse for sort at src/m3u.go:287-288; float parse for the dedupe tie-break at src/xepg.go:1923-1927; hash input at src/xepg.go:476-484, :508-516 and :1835-1843; disabled name-based removal at src/xepg.go:1853 | المواصفات | لا ينطبق |
| لا يملك Plex Live TV استيعابًا لـ M3U من الطرف الأول، فلا شيء داخل Plex يحلّل tvg-chno أبدًا. وتوثيق الموالفات المدعومة مجتمعيًا لديه يطلب جهاز Windows BDA أو Linux DVB API، ويسمّي TVHProxy بين الطرق التي يستخدمها الناس. والطريق المعتاد من قائمة تشغيل هو وكيل على طريقة HDHomeRun، حيث يصل الرقم على شكل GuideNumber في lineup.json، وأي رقم يكون ذلك يعتمد على الوكيل: xTeVe يستبدل به رقمًا من عنده، وThreadfin يمرّر سلسلة tvg-chno كما هي.Plex Live TV and Community Supported Tuners documentation, which describes Windows BDA and Linux DVB API devices and names TVHProxy; the HDHomeRun lineup.json GuideNumber field; Threadfin/Threadfin src/xepg.go:643-647 into src/hdhr.go:160, which sets stream.GuideNumber from the value taken from tvg-chno | المواصفات | لا ينطبق |
| يوثّق Channels DVR السمة channel-number لمصادر القنوات المخصصة، إلى جانب channel-id مطلوبة وtvg-logo وtvg-name وامتداداته الخاصة tvc-. ولا يذكر توثيقه tvg-chno. ويذكر أن الرقم الذي يتصادم مع تشكيلة مصدر آخر يُدمَج وتُستخدم القناة ذات الأولوية.Channels DVR documentation for custom channel sources, verbatim: Be sure not to use a channel number that exists in another source's lineup. Channels will merge them together and use the prioritized channel. | المواصفات | لا ينطبق |
| يقرأ محلِّل M3U في VLC السمات tvg-logo وtvg-name وtvg-language وtvg-id وgroup-title، ويسقط بصمت مفاتيح tvg- غير المعروفة بما فيها chno. ولا مفهوم لرقم القناة في VLC البتة، فقط موضع قائمة التشغيل.VideoLAN vlc, modules/demux/playlist/m3u.c, tvg attribute handling added 2020-03-11 | المواصفات | لا ينطبق |
| المقطع المبني يدويًا في هذه المقالة يعطي ستة صفوف، أربعة منها تحمل رقمًا صالحًا للاستخدام تحت محلِّلنا، وترتيبًا مرقّمًا 1 و1 و7 و22.1 يليه الصفان غير المرقّمين بترتيب الاسم. | n = 6 | 23/08/2026 |