الوضع في قائمة الانتظار

نظرة عامة

تتيح حزمة تطوير البرامج (SDK) الخاصة بـ WebRecipients إمكانية إضافة المحتوى إلى قائمة الانتظار مع قائمة الانتظار الافتراضية التي توفرها تستخدم حزمة SDK QueueData أو QueueManager أو استخدام قائمة انتظار مخصّصة جارٍ التنفيذ cast.framework.QueueBase واستخدام QueueManager للحصول على التحديثات.

تسمح واجهة برمجة التطبيقات Pendinging API بدمج التطبيقات بشكل أفضل مع Cast من خلال توفير الميزات التالية:

  • دعم تطبيق قائمة انتظار السحابة الإلكترونية لكل من Google وشركائك بشكل خارجي يمكن تحميل قائمة المحتوى التالي المخزنة والمُنشأة مباشرةً إلى أجهزة البث.
  • الآليات التي تسمح بتقسيم العناصر في قائمة الانتظار إلى صفحات بدلاً من التحميل كل شيء في وقت واحد.
  • إتاحة استخدام رسائل جديدة مثل الانتقال إلى العنصر التالي أو العنصر السابق وجلب نافذة من العناصر، فضلاً عن الحصول على معلومات الوسائط المتعلقة مجموعة من عناصر قائمة الانتظار.
  • تشير رسالة الأشكال البيانية QueueManager إدارة عملية إدراج العناصر في قائمة المحتوى التالي وإزالتها وتعديلها

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

توفِّر حزمة تطوير البرامج (SDK) استلام الويب دعمًا محدودًا لقائمة الانتظار في النموذج لقائمة انتظار افتراضية.

لاستخدام قائمة الانتظار الافتراضية، قدم queueData في LoadRequestData من عمليات التحميل من جهة المُرسِل، أو أرسِل طلب تحميل على الجهاز استخدام PlayerManager#load راجِع أيضًا تحميل الوسائط.

ومن جهة المستلِم، يمكن تعديل قائمة المحتوى التالي باستخدام QueueManager بمجرد تحميل الوسائط الأولية.

قائمة انتظار مخصّصة

إذا كانت قائمة الانتظار الافتراضية لا توفر وظيفة الانتظار في قائمة الانتظار المطلوبة لتطبيقك، تتوفر إمكانية إنشاء قائمة انتظار مخصصة، مما يتيح المزيد والإمكانات والمرونة.

يمكن لمطوّري التطبيقات إنشاء قائمة انتظار جانبية لـ "مستقبل الويب" من خلال تنفيذ cast.framework.QueueBase

فيما يلي مثال أساسي لقائمة انتظار بسيطة حيث initialize تم إلغاء المكالمة، ثم يتم عرض قائمة بعناصر قائمة الانتظار مع أوصاف قائمة الانتظار. إلى جهاز البث.

راجِع أيضًا تحميل الوسائط.

// Creates a simple queue with a combination of contents.
const DemoQueue = class extends cast.framework.QueueBase {
 constructor() {
   super();

   /**
    * List of media urls.
    * @private @const {!Array<string>}
    */
   this.myMediaUrls_ = [...];
 }
 /**
  * Provide a list of items.
  * @param {!cast.framework.messages.LoadRequestData} loadRequestData
  * @return {!cast.framework.messages.QueueData}
  */
 initialize(loadRequestData) {
   const items = [];
   for (const mediaUrl of this.myMediaUrls_) {
     const item = new cast.framework.messages.QueueItem();
     item.media = new cast.framework.messages.MediaInformation();
     item.media.contentId = mediaUrl;
     items.push(item);
   }
   let queueData = loadRequestData.queueData;
   // Create a new queue with media from the load request if one doesn't exist.
   if (!queueData) {
     queueData = new cast.framework.messages.QueueData();
     queueData.name = 'Your Queue Name';
     queueData.description = 'Your Queue Description';
     queueData.items = items;
     // Start with the first item in the playlist.
     queueData.startIndex = 0;
     // Start from 10 seconds into the first item.
     queueData.currentTime = 10;
   }
   return queueData;
 }
};

في هذا المثال، تمثل قائمة العناصر في initialize مكالمة واردة في عنوان URL الخاص بمقدّم الخدمة QueueBase الدالة الإنشائية. ومع ذلك، بالنسبة إلى تنفيذ قائمة انتظار السحابة الإلكترونية، فإن واجهة الويب المخصصة يمكن لمنطق المُستلِم جلب العناصر خارجيًا ثم إرجاعها كجزء من اتصال الإعداد.

لتوضيح استخدام أكثر شمولاً لواجهة برمجة التطبيقات في قائمة الانتظار، إليكم عرضًا توضيحيًا قائمة انتظار تنفذ معظم صف واحد (QueueBase).

const DemoQueue = class extends cast.framework.QueueBase {
 constructor() {
   /** @private {} */
   super();
   YourServer.onSomeEvent = this.updateEntireQueue_;
 }

 /**
  * Initializes the queue.
  * @param {!cast.framework.messages.LoadRequestData} loadRequestData
  * @return {!cast.framework.messages.QueueData}
  */
 initialize(loadRequestData) {
   let queueData = loadRequestData.queueData;
   // Create a new queue with media from the load request if one doesn't exist.
   if (!queueData) {
     queueData = new cast.framework.messages.QueueData();
     queueData.name = 'Your Queue Name';
     queueData.description = 'Your Queue Description';
     // Put the first set of items into the queue
     const items = this.nextItems();
     queueData.items = items;
     // Start with the first item in the playlist.
     queueData.startIndex = 0;
     // Start from 10 seconds into the first item.
     queueData.currentTime = 10;
   }
   return queueData;
 }

 /**
  * Picks a set of items from remote server after the reference item id and
  * return as the next items to be inserted into the queue. When
  * referenceItemId is omitted, items are simply appended to the end of the
  * queue.
  * @param {number} referenceItemId
  * @return {!Array<cast.framework.QueueItem>}
  */
 nextItems(referenceItemId) {
   // Assume your media has a itemId and the media url
   return this.constructQueueList_(YourServer.getNextMedias(referenceItemId));
 }

 /**
  * Picks a set of items from remote server before the reference item id and
  * return as the items to be inserted into the queue. When
  * referenceItemId is omitted, items are simply appended to beginning of the
  * queue.
  * @param {number} referenceItemId
  * @return {!Array<cast.framework.QueueItem>}
  */
 prevItems(referenceItemId) {
   return this.constructQueueList_(YourServer.getPrevMedias(referenceItemId));
 }

 /**
  * Constructs a list of QueueItems based on the media information containing
  * the item id and the media url.
  * @param {number} referenceItemId
  * @return {!Array<cast.framework.QueueItem>}
  */
 constructQueueList_(medias) {
   const items = [];
   for (media of medias) {
     const item = new cast.framework.messages.QueueItem(media.itemId);
     item.media = new cast.framework.messages.MediaInformation();
     item.media.contentId = media.url;
     items.push(item);
   }
   return items;
 }

 /**
  * Logs the currently playing item.
  * @param {number} itemId The unique id for the item.
  * @export
  */
 onCurrentItemIdChanged(itemId) {
   console.log('We are now playing video ' + itemId);
   YourServer.trackUsage(itemId);
 }
};

في المثال أعلاه، YourServer هو خادم قائمة انتظار السحابة الإلكترونية وله منطق حول كيفية استرجاع عناصر وسائط معيّنة

لاستخدام QueueBase - تضعها في قائمة الانتظار، واحدة من شأنها تعيين خيار قائمة الانتظار في CastReceiverContext:

const context = cast.framework.CastReceiverContext.getInstance();
context.start({queue: new DemoQueue()});

إدارة قائمة انتظار

تشير رسالة الأشكال البيانية QueueManager المطوّرين في تطوير حلول قوائم الانتظار من خلال توفير للوصول إلى القائمة المخزنة حاليًا بعناصر قائمة الانتظار بالإضافة إلى العنصر قيد التشغيل الحالي. كما أنها توفر عمليات مثل الإدراج والإزالة وتحديث العناصر المدرَجة في قائمة الانتظار. يوضح المقتطف التالي كيفية الوصول إلى مثال على QueueManager:

const context = cast.framework.CastReceiverContext.getInstance();
const queueManager = context.getPlayerManager().getQueueManager();

الإدارة التلقائية لقائمة الانتظار

بمجرد تحميل قائمة الانتظار الأولية، QueueManager يمكن استخدامها لتنفيذ إجراءات مثل استرداد العنصر الحالي واسترداد جميع العناصر في قائمة الانتظار، وتحديث العناصر في قائمة الانتظار باستخدام insertItems, removeItems, أو updateItems.

إدارة قوائم الانتظار المخصّصة

فيما يلي مثال على تنفيذ قائمة انتظار مخصصة يستخدم الإدراج إزالة المحتوى استنادًا إلى حدث معيّن. يوضح المثال أيضًا استخدام updateItems حيث يمكن للمطورين تعديل عناصر قائمة الانتظار في قائمة الانتظار الحالية، مثل إزالة الفواصل الإعلانية.

const DemoQueue = class extends cast.framework.QueueBase {
  constructor() {
    super();

    /** @private @const {!cast.framework.QueueManager} */
    this.queueManager_ = context.getPlayerManager().getQueueManager();
  }

  /**
   * Provide a list of items.
   * @param {!cast.framework.messages.LoadRequestData} loadRequestData
   * @return {!cast.framework.messages.QueueData}
   */
  initialize(loadRequestData) {
    // Your normal initialization; see examples above.
    return queueData;
  }

  /** Inserts items to the queue. */
  onSomeEventTriggeringInsertionToQueue() {
    const twoMoreUrls = ['http://url1', 'http://url2'];
    const items = [];
    for (const mediaUrl of twoMoreUrls) {
      const item = new cast.framework.QueueItem();
      item.media = new cast.framework.messages.MediaInformation();
      item.media.contentId = mediaUrl;
      items.push(item);
    }
    // Insert two more items after the current playing item.
    const allItems = this.queueManager_.getItems();
    const currentItemIndex = this.queueManager_.getCurrentItemIndex();
    const nextItemIndex = currentItemIndex + 1;
    let insertBefore = undefined;
    if (currentItemIndex >= 0 &&
        currentItemIndex < allItems.length - 1) {
      insertBefore = allItems[nextItemIndex].itemId;
    }
    this.queueManager_.insertItems(items, insertBefore);
  }

  /** Removes a particular item from the queue. */
  onSomeEventTriggeringRemovalFromQueue() {
    this.queueManager_.removeItems([2]);
  }

  /** Removes all the ads from all the items across the entire queue. */
  onUserBoughtAdFreeVersion() {
    const items = this.queueManager_.getItems();
    this.queueManager_.updateItems(items.map(item => {
      item.media.breaks = undefined;
      return item;
    }));
  }
};

الرسائل الواردة والصادرة

لتوفير دعم كامل لجلب قائمة الانتظار من جهة المُستلِم كمصدر للحقيقة، تقديم ومعالجة رسائل CAF الإضافية التالية حزمة تطوير البرامج (SDK) للمستلِم:

رسالة واردة المعلّمات رسالة ردّ صادرة إرجاع
التالي ليست هناك مَعلمة مطلوبة. MEDIA_STATUS سيبدأ المتلقي (يجلبه من خلال nextItems() إذا لزم الأمر) ويبدأ اللعب العنصر التالي.
السابق ليست هناك مَعلمة مطلوبة. MEDIA_STATUS سيجري مستلم الويب (يجلب من خلال prevItems() إذا لزم الأمر) ويبدأ تشغيل العنصر السابق.
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE A cast.framework.messages.playlistChange. وكمثال، بالنسبة إلى حالة الإدراج، سيحتوي حقل السلع في ملف JSON على قائمة بالسلع الجديدة التي تم جلبها.
GET_ITEMS_INFO GetItemsInfoRequestData التي تحتوي على itemIds: مصفوفة<number> ITEMS_INFO cast.framework.messages.ItemsInfo مع معلومات عنصر قائمة الانتظار.
GET_QUEUE_IDS ليست هناك مَعلمة مطلوبة. QUEUE_IDS cast.framework.messages.QueueIds.

بالنسبة إلى NEXT/PREVIOUS، إذا كان تمثيل قائمة الانتظار الحالي على مستقبل الويب على المزيد من العناصر، QueueBase.nextItems() أو QueueBase.prevItems() يتم استدعاء تلقائيًا لاستلام المزيد من العناصر.

بالنسبة إلى FETCH_ITEM، لا يمكن للدالة المتجاوبة fetchItems في تنفيذ QueueBase، يتم استدعاء قوائم الانتظار في السحابة الإلكترونية، والتي تسترد البيانات ذات الصلة التي سيتم إرجاعها إلى جهاز استقبال الويب لتخزينها.

كلما تم استرجاع المزيد من العناصر، يتم تشغيل نوع رسالة جديد "QUEUE_CHANGE". وإرساله مرة أخرى إلى المرسل. اطلع على الأنواع المختلفة من التغييرات في قائمة الانتظار.

معلومات تسجيل الدخول إلى GET_ITEMS_INFO QueueBase عدم تنفيذ الإجراء ويعرض جهاز استقبال الويب معلومات الوسائط المعروفة بالفعل لقائمة المعرّفات.

ترتيب قائمة المحتوى التالي عشوائيًا

لتعيين العناصر في قائمة الانتظار ليتم ترتيبها عشوائيًا، قم بتعيين shuffle علم QueueData على true عند تحميل العناصر في قائمة الانتظار.

إذا كنت تستخدم عملية تنفيذ QueueBase، استخدام الـ shuffle لإرجاع قائمة عناصر عشوائية.

لترتيب قائمة انتظار حالية عشوائيًا، استخدم shuffle عَلم QUEUE_UPDATE MessageType, بدلاً من الأمر QUEUE_SHUFFLE. عرض QueueUpdateRequestData لمزيد من المعلومات.

وضع التكرار

لتعيين العناصر في قائمة الانتظار بحيث يتم تكرارها، عيِّن repeatMode خاصية QueueData إلى المستوى المطلوب RepeatMode عند تحميل العناصر إلى قائمة الانتظار

لتغيير RepeatMode لقائمة حالية، يمكنك استخدام repeatMode خاصية QueueUpdateRequestData, الذي يستخدم QUEUE_UPDATE MessageType