Sıra

Genel bakış

Web Alıcısı SDK'sı, QueueData ve QueueManager özelliklerini kullanarak SDK tarafından sağlanan varsayılan sırada veya güncellemeler için cast.framework.QueueBase uygulayıp QueueManager kullanarak özel sıra kullanarak sıraya almayı destekler.

Queueing API, uygulamaların aşağıdaki özellikleri sağlayarak Cast'le daha iyi entegre olmasına olanak tanır:

  • Harici olarak depolanan ve oluşturulan sıranın Yayın cihazlarına doğrudan yüklenebilmesi için Google'ın ve iş ortağının bulut sırası uygulaması desteği.
  • Her şeyi tek seferde yüklemek yerine sırada öğelerin ayrılmasına olanak tanıyan mekanizmalar.
  • Sonraki öğeye gitme, önceki öğeye gitme, öğe penceresi getirme ve bir sıra öğe öğesiyle ilgili medya bilgileri alma gibi yeni mesajlaşma için destek.
  • Sıraya ekleme, kaldırma ve sıra öğelerini güncelleme işlemlerini yönetmek için QueueManager.

Varsayılan sıra

Web Alıcısı SDK'sı, varsayılan bir sıra şeklinde verilen sıradan sınırlı destek sunar.

Varsayılan sırayı kullanmak için gönderen tarafındaki yüklemelerinizin LoadRequestData tanesinde queueData değerini sağlayın veya PlayerManager#load özelliğini kullanarak yerel bir yükleme isteği gönderin. Medya yükleme başlıklı makaleyi de inceleyin.

Alıcı tarafında, ilk medya yüklendikten sonra sıra QueueManager kullanılarak değiştirilebilir.

Özel sıra

Varsayılan sıra, uygulamanız için gereken sıra oluşturma işlevini sağlamıyorsa daha fazla özellik ve esneklik sağlayan özel bir sıra oluşturabilirsiniz.

Uygulama geliştiriciler, cast.framework.QueueBase yöntemini uygulayarak Web Alıcısı taraf sırası oluşturabilir.

initialize çağrısının geçersiz kılındığı ve ardından sıra sıra açıklamaların yanı sıra Yayın cihazına yayın sırası listesi sağlanan basit bir sıra örneğini burada bulabilirsiniz.

Medya yükleme başlıklı makaleyi de inceleyin.

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

Bu örnekte, initialize çağrısındaki öğelerin listesi sağlayıcının QueueBase oluşturucu çağrısında sağlanmaktadır. Bununla birlikte, bir bulut sırası uygulaması için özel Web Alıcısı mantığı, öğeleri harici olarak getirebilir ve ardından ilk kullanıma hazırlama çağrısı kapsamında döndürebilir.

Sıraya API'nin daha kapsamlı bir kullanımını göstermek için QueueBase sınıfının büyük bir kısmını uygulayan bir Demo sırası derledik.

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

Yukarıdaki örnekte YourServer, bulut sırası sunucunuzdur ve belirli medya öğelerinin nasıl getirileceğiyle ilgili bir mantık barındırır.

QueueBase özelliğini uygulamak için CastReceiverContext'te sıraya ekleme seçeneğini belirleyin:

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

Sıra yönetme

QueueManager, sıraya alınmış olan öğelerin listesine ve o anda oynayan öğeye erişme yöntemleri sağlayarak geliştiricilere sıra sıralarını geliştirme esnekliği sunar. Sıraya alınan öğeleri ekleme, kaldırma ve güncelleme gibi işlemler de sağlar. Aşağıdaki snippet'te QueueManager örneğine nasıl erişileceği gösterilmektedir:

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

Varsayılan sıra yönetimi

İlk sıra yüklendiğinde, mevcut öğeyi alma, sıradaki tüm öğeleri alma ve sıradaki öğeleri insertItems, removeItems ve updateItems kullanarak güncelleme gibi işlemler için QueueManager kullanılabilir.

Özel sıra yönetimi

Bir etkinliğe dayalı ekleme ve kaldırma yöntemlerini kullanan bir özel sıra uygulaması örneğini burada bulabilirsiniz. Örnekte, geliştiricilerin mevcut sıradaki sıra öğelerini (ör. reklam aralarını kaldırma) değiştirebildikleri updateItems kullanımı da gösterilmektedir.

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

Gelen ve giden iletiler

Bilgi kaynağı olarak alıcı tarafı sıra getirmenin tam olarak desteklenmesi için aşağıdaki ek sıra iletileri, CAF Alıcı SDK'sı tarafından kullanıma sunulur ve işlenir:

Gelen Mesaj Parametreler Giden Yanıt Mesajı İade
İLERİ Herhangi bir parametre gerekmez. MEDYA_DURUMU Alıcı (gerekirse sonrakiItems() öğesini getirir) ve sonraki öğeyi oynatmaya başlar.
ÖNCEKİ Herhangi bir parametre gerekmez. MEDYA_DURUMU Web Alıcısı (gerekirse prevItems() işlevi üzerinden getirilir) ve önceki öğeyi oynatmaya başlar.
FETCH_ITEMS FetchItemsRequestVerileri QUEUE_CHANGE cast.framework.messages.QueueChange. Örneğin, ekleme durumu için JSON'daki items alanı, getirilen yeni öğelerin listesini içerir.
GET_ITEMS_INFO itemIds içeren GetItemsInfoRequestData: Dizi<number> ITEMS_INFO Sıra öğe bilgilerine sahip cast.framework.messages.ItemsInfo
GET_QUEUE_IDS Herhangi bir parametre gerekmez. QUEUE_IDS cast.framework.messages.QueueIds.

NEXT/PREVIOUS için, Web Alıcısındaki mevcut sıra göstergesinde daha fazla öğe yoksa daha fazla öğe almak için QueueBase.nextItems() veya QueueBase.prevItems() otomatik olarak çağrılır.

FETCH_ITEM için QueueBase uygulamasındaki ilgili fetchItems işlevi, depolanmak üzere Web Alıcısına döndürülecek alakalı verileri alan bulut sıraları için çağrılır.

Daha fazla öğe getirildiğinde yeni bir mesaj türü (QUEUE_CHANGE) tetiklenir ve gönderene geri gönderilir. Çeşitli sıra değişikliği türlerine bakın.

GET_ITEMS_INFO için QueueBase'nin uygulanması tetiklenmez ve Web Alıcısı, kimlikler listesiyle bilinen medya bilgilerini döndürür.

Sıra karıştırma

Sıranızdaki öğeleri karıştırılacak şekilde ayarlamak için öğelerinizi sıraya yüklerken QueueData shuffle işaretini true olarak ayarlayın.

QueueBase yöntemini kullanıyorsanız öğelerin karıştırılmış listesini geri döndürmek için shuffle yöntemini kullanın.

Mevcut bir sırayı karıştırmak için QUEUE_SHUFFLE komutu yerine QUEUE_UPDATE MessageType shuffle işaretini kullanın. Daha fazla bilgi için QueueUpdateRequestData konusuna bakın.

Tekrar modu

Sıranızdaki öğeleri tekrarlanacak şekilde ayarlamak için öğelerinizi sıraya koyarken QueueData özelliğinin repeatMode özelliğini istediğiniz RepeatMode değerine ayarlayın.

Mevcut bir sıranın RepeatMode değerini değiştirmek için QUEUE_UPDATE MessageType özelliğini kullanan QueueUpdateRequestData repeatMode özelliğini kullanın.