概览
Web Receiver SDK 支持使用
默认队列,由
SDK 使用
QueueData
和
QueueManager
或使用自定义队列
正在实现
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
,相应的函数
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
。