Mengantre

Ringkasan

Web Receiver SDK mendukung antrean dengan antrean default yang disediakan oleh SDK menggunakan QueueData dan QueueManager atau menggunakan antrean kustom dengan menerapkan cast.framework.QueueBase dan menggunakan QueueManager untuk mendapatkan info terbaru.

Queueing API memungkinkan aplikasi berintegrasi lebih baik dengan Cast dengan menyediakan fitur berikut:

  • Dukungan implementasi antrean cloud Google dan partner secara eksternal antrean yang disimpan dan dibuat dapat langsung dimuat ke perangkat Cast.
  • Mekanisme yang memungkinkan penomoran halaman item dalam antrean, bukan memuat semuanya sekaligus.
  • Dukungan untuk pesan baru seperti membuka item berikutnya, item sebelumnya, mengambil jendela item, serta mendapatkan informasi media yang terkait dengan satu set item antrean.
  • Tujuan QueueManager untuk mengelola penyisipan, penghapusan, dan pembaruan item antrean.

Antrean default

Web Receiver SDK menyediakan dukungan antrean terbatas yang siap pakai dalam bentuk dari antrean default.

Untuk menggunakan antrean default, berikan queueData di LoadRequestData pemuatan sisi pengirim atau mengirim permintaan pemuatan lokal menggunakan PlayerManager#load. Lihat juga Memuat media.

Pada sisi penerima, antrean dapat dimodifikasi menggunakan QueueManager setelah media awal dimuat.

Antrean khusus

Jika antrean default tidak menyediakan fungsi pengantrean yang diperlukan untuk aplikasi Anda, kemampuan untuk membuat antrean khusus tersedia, memungkinkan lebih banyak kemampuan dan fleksibilitas.

Developer aplikasi dapat membuat antrean sisi Penerima Web dengan menerapkan cast.framework.QueueBase

Berikut adalah contoh dasar dari antrean sederhana di mana initialize panggilan diganti, kemudian daftar item antrean beserta deskripsi antrean yang disediakan ke perangkat Cast.

Lihat juga Memuat media.

// 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;
 }
};

Dalam contoh ini, daftar item dalam initialize disediakan dalam QueueBase panggilan konstruktor. Namun, untuk implementasi antrean cloud, Logika penerima dapat mengambil item secara eksternal lalu mengembalikannya sebagai bagian dari panggilan inisialisasi.

Untuk menunjukkan penggunaan API antrean yang lebih komprehensif, berikut adalah Demo antrean yang mengimplementasikan sebagian besar Class 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);
 }
};

Pada contoh di atas, YourServer adalah server antrean cloud Anda dan memiliki logika cara mengambil item media tertentu.

Untuk menggunakan QueueBase pengantrean yang diimplementasikan, kita akan mengatur opsi antrean di CastReceiverContext:

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

Mengelola antrean

Tujuan QueueManager memberi developer fleksibilitas dalam mengembangkan solusi antrean mereka dengan menyediakan untuk mengakses daftar item antrean yang saat ini disimpan serta item yang sedang diputar. Layanan ini juga menyediakan operasi seperti penyisipan, penghapusan, dan pembaruan item dalam antrean. Cuplikan berikut ini menunjukkan cara mengakses contoh dari QueueManager:

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

Pengelolaan antrean default

Setelah antrean awal dimuat, QueueManager dapat digunakan untuk melakukan tindakan seperti mengambil item saat ini, mengambil semua item dalam antrean, dan memperbarui item dalam antrean menggunakan insertItems, removeItems, dan updateItems.

Pengelolaan antrean kustom

Berikut adalah contoh implementasi antrean khusus yang menggunakan penyisipan dan metode penghapusan berdasarkan peristiwa tertentu. Contoh tersebut juga menunjukkan penggunaan updateItems tempat developer dapat memodifikasi item antrean dalam antrean yang ada, seperti menghapus jeda iklan.

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;
    }));
  }
};

Pesan masuk dan keluar

Untuk mendukung sepenuhnya pengambilan antrean sisi penerima sebagai sumber kebenaran, metode pesan antrean tambahan berikut diperkenalkan dan ditangani oleh CAF SDK Penerima:

Pesan Masuk Parameter Pesan Respons Keluar Kembali
BERIKUTNYA Tidak ada parameter yang diperlukan. MEDIA_STATUS Penerima akan (mengambil item melalui nextItems() jika perlu) dan mulai memutar item berikutnya.
SEBELUMNYA Tidak ada parameter yang diperlukan. MEDIA_STATUS Penerima Web akan (mengambil melalui prevItems() jika diperlukan) dan memulai memutar item sebelumnya.
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE Cast.framework.messages.QueueChange. Sebagai contoh, untuk {i>insert case<i}, isian item di JSON akan berisi daftar item baru yang diambil.
GET_ITEMS_INFO GetItemsInfoRequestData yang berisi itemIds: Array<number> ITEMS_INFO cast.framework.messages.ItemsInfo dengan informasi item antrean.
GET_QUEUE_IDS Tidak ada parameter yang diperlukan. QUEUE_IDS cast.framework.messages.QueueIds.

Untuk NEXT/PREVIOUS, jika representasi antrean yang ada di Penerima Web tidak memiliki item lagi, QueueBase.nextItems() atau QueueBase.prevItems() akan dipanggil secara otomatis untuk menerima lebih banyak item.

Untuk FETCH_ITEM, fungsi yang sesuai fetchItems dalam implementasi QueueBase dipanggil untuk antrean cloud, yang mengambil data yang relevan untuk dikembalikan ke {i> Web Receiver <i}untuk disimpan.

Setiap kali lebih banyak item yang diambil, jenis pesan baru QUEUE_CHANGE akan dipicu dan dikirim kembali ke pengirim. Lihat berbagai jenis perubahan antrean.

Untuk GET_ITEMS_INFO, QueueBase implementasi tidak dipicu dan Penerima Web menampilkan informasi media yang sudah diketahui oleh daftar ID.

Mengacak antrean

Untuk mengatur agar item dalam antrean diacak, setel shuffle bendera QueueData ke true saat memuat item Anda ke dalam antrean.

Jika Anda menggunakan implementasi QueueBase, gunakan tindakan shuffle untuk mengembalikan daftar item yang diacak.

Untuk mengacak antrean yang ada, gunakan shuffle tanda QUEUE_UPDATE MessageType, bukan perintah QUEUE_SHUFFLE. Lihat QueueUpdateRequestData untuk mengetahui informasi selengkapnya.

Mode pengulangan

Untuk menyetel agar item dalam antrean Anda diulang, setel atribut repeatMode properti QueueData ke jaringan yang diinginkan RepeatMode saat memuat item Anda ke antrean.

Untuk mengubah RepeatMode antrean yang ada, gunakan repeatMode properti dari QueueUpdateRequestData, yang menggunakan QUEUE_UPDATE MessageType.