排队

概览

Web Receiver SDK 支持使用 默认队列,由 SDK 使用 QueueDataQueueManager 或使用自定义队列 正在实现 cast.framework.QueueBase 并使用 QueueManager。 获取更新。

Queueing API 通过提供 以下功能:

  • 支持 Google 及合作伙伴的云队列实现,以便外部 存储和创建的队列可以直接加载到 Cast 设备。
  • 允许对队列中的项进行分页而不是加载的机制 同时处理所有内容
  • 支持新消息,例如转到下一项、上一项、 提取一个子窗口,以及获取与 一组队列项。
  • 通过 QueueManager 管理队列项目的插入、移除和更新。

默认队列

Web Receiver SDK 通过以下形式提供开箱即用的有限队列支持: 默认队列的

要使用默认队列,请提供 queueData 或发送本地加载请求,LoadRequestData 使用 PlayerManager#load。 另请参阅加载媒体

在接收方端,可使用 QueueManager 在初始媒体加载完毕后显示

自定义队列

如果默认队列不提供 则可以创建自定义队列,从而实现 功能和灵活性

应用程序开发者可以创建网络接收器端队列,方法是实现 cast.framework.QueueBase

下面是一个简单队列的基本示例,其中 initialize 调用会被替换,然后系统会列出队列项目和队列说明 提供给 Cast 设备。

另请参阅加载媒体

// 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 调用在提供商的 QueueBase 构造函数调用。但是,对于云队列实现,自定义 Web 应用 接收器逻辑可以从外部提取这些项,然后将其作为 初始化调用。

为了演示如何更全面地使用队列 API,以下提供了一个演示 用于实现大部分 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:

收到消息 参数 传出响应消息 Return 键
继续 无需任何参数。 MEDIA_STATUS 接收器将(如果需要,通过 nextItems() 提取)并开始播放 下一项内容。
上一页 无需任何参数。 MEDIA_STATUS Web 接收器将(如有必要,通过 prevItems() 抓取)并启动 播放上一项内容。
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE cast.framework.messages.QueueChange。例如,对于一个 insert case, JSON 中的 items 字段将包含提取的新商品的列表。
GET_ITEMS_INFO 包含 itemIds 的 GetItemsInfoRequestData: 数组<数字> ITEMS_INFO 包含队列项信息的 cast.framework.messages.ItemsInfo。
GET_QUEUE_IDS 无需任何参数。 QUEUE_IDS cast.framework.messages.QueueIds.

对于 NEXT/PREVIOUS(如果 Web 接收器上的现有队列表示法) 没有更多项目, QueueBase.nextItems()QueueBase.prevItems() 以接收更多项。

对于 FETCH_ITEM,相应的函数 fetchItemsQueueBase 实现是为云队列调用的,它会检索 要返回给网络接收器存储的相关数据。

每当提取更多项时,就会触发新的消息类型 QUEUE_CHANGE 并将其发回给发件人。请参阅 队列更改

对于GET_ITEMS_INFOQueueBase 实现未触发,且网络接收器会返回媒体信息 所有已知对象。

随机播放队列

要将队列中的项设置为随机播放,请将 shuffle 国旗 QueueData true

如果您使用的是 QueueBase,请使用 该 shuffle 方法返回打乱的项列表。

要重排现有队列,请使用 shuffle QUEUE_UPDATE国旗 MessageType, 而不是 QUEUE_SHUFFLE 命令。如需了解详情,请参阅 QueueUpdateRequestData

重复模式

要将队列中的项设置为重复项,请将 repeatMode 属性 QueueData 更改为所需的 RepeatMode

如需更改现有队列的 RepeatMode,请使用 repeatMode 属性 QueueUpdateRequestData, 它使用QUEUE_UPDATE MessageType