Présentation
Le SDK Web Receiver prend en charge la mise en file d'attente avec le
file d'attente par défaut fournie par la
SDK utilisant
QueueData
et
QueueManager
ou utiliser une file d'attente personnalisée
implémentation
cast.framework.QueueBase
.
et en utilisant
QueueManager
.
pour obtenir des mises à jour.
L'API Queueing permet aux applications de mieux s'intégrer à Cast en fournissant les fonctionnalités suivantes:
- Assistance pour l'implémentation de la file d'attente cloud de Google et de ses partenaires, de sorte qu'en externe stockée et créée peut être directement chargée sur les appareils Cast.
- Mécanismes permettant la pagination des éléments de la file d'attente au lieu de leur chargement tout en même temps.
- Prise en charge de nouveaux messages, comme passer à l'élément suivant, précédent, pour récupérer une fenêtre d'éléments et obtenir des informations multimédias un ensemble d'éléments de file d'attente.
- La
QueueManager
pour gérer l'insertion, la suppression et la mise à jour des éléments de file d'attente.
File d'attente par défaut
Le SDK Web Receiver fournit une prise en charge limitée des files d'attente prêtes à l'emploi dans le formulaire d'une file d'attente par défaut.
Pour utiliser la file d'attente par défaut, indiquez le
queueData
dans le LoadRequestData
de vos chargements côté expéditeur ou envoyez une requête de chargement local
avec
PlayerManager#load
Consultez également la section Charger des contenus multimédias.
Du côté du récepteur, la file d'attente peut être modifiée à l'aide de la méthode
QueueManager
une fois que le support
initial a été chargé.
File d'attente personnalisée
Si la file d'attente par défaut ne fournit pas la fonctionnalité de mise en file d'attente requise pour pour votre application, vous pouvez créer une file d'attente personnalisée des fonctionnalités et de la flexibilité.
Les développeurs d'applications peuvent créer une file d'attente côté récepteur Web en implémentant
cast.framework.QueueBase
Voici un exemple basique de file d'attente simple dans laquelle
initialize
est ignoré, puis une liste d'éléments de file d'attente accompagnés de leur description
sont fournies à l'appareil Cast.
Consultez également la section Charger des contenus multimédias.
// 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;
}
};
Dans cet exemple, la liste des éléments
initialize
est fourni dans le
QueueBase
au constructeur. Toutefois, dans le cas d'une mise en œuvre de file d'attente dans le cloud,
La logique du récepteur peut récupérer les articles en externe, puis les renvoyer dans le cadre
l'appel d'initialisation.
Pour illustrer une utilisation plus complète de l'API de mise en file d'attente, voici une démonstration
qui implémente la plupart des
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);
}
};
Dans l'exemple ci-dessus, YourServer
est votre serveur de file d'attente cloud et possède une logique
sur la récupération de certains éléments multimédias.
Pour utiliser QueueBase
-implémenté la mise en file d'attente, il faut définir l'option de file d'attente dans le
CastReceiverContext
:
const context = cast.framework.CastReceiverContext.getInstance();
context.start({queue: new DemoQueue()});
Gérer une file d'attente
La
QueueManager
offre aux développeurs la flexibilité de développer leurs solutions de mise en file d'attente en leur fournissant
pour accéder à la liste des éléments de file d'attente actuellement stockés, ainsi qu'à la
l'élément en cours de lecture. Il fournit également des opérations telles que l'insertion, la suppression,
et la mise à jour des éléments en file d'attente. L'extrait de code suivant montre comment accéder à un
instance de
QueueManager
:
const context = cast.framework.CastReceiverContext.getInstance();
const queueManager = context.getPlayerManager().getQueueManager();
Gestion des files d'attente par défaut
Une fois la file d'attente initiale chargée,
QueueManager
peut servir à effectuer des actions, par exemple récupérer l'élément actuel,
tous les éléments de la file d'attente et mettre à jour les éléments de la file d'attente en utilisant
insertItems
,
removeItems
,
et
updateItems
.
Gestion personnalisée des files d'attente
Voici un exemple d'implémentation de file d'attente personnalisée qui utilise les fonctions
en fonction de certains événements. Cet exemple illustre également l'utilisation
updateItems
où les développeurs peuvent modifier les éléments de la file d'attente existante, tels que
en supprimant les coupures publicitaires.
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;
}));
}
};
Messages entrants et sortants
Pour prendre en charge la récupération de file d'attente côté récepteur comme source de référence, d'autres messages de mise en file d'attente suivants sont introduits et gérés par le CAF SDK récepteur:
Message entrant | Paramètres | Message de réponse sortant | Retour |
SUIVANT | Aucun paramètre requis. | MEDIA_STATUS | Le récepteur effectue la récupération (via nextItems() si nécessaire) et lance la lecture. l'élément suivant. |
PRÉCÉDENT | Aucun paramètre requis. | MEDIA_STATUS | Le récepteur Web effectue la récupération (à travers prevItems(), si nécessaire) et lance l'élément précédent. |
FETCH_ITEMS | FetchItemsRequestData | QUEUE_CHANGE | Une instance cast.framework.messages.QueueChange. Par exemple, pour un cas à insérer, le champ "items" du JSON contient la liste des nouveaux articles récupérés. |
GET_ITEMS_INFO | GetItemsInfoRequestData contenant itemIds: Tableau<nombre> | ITEMS_INFO | cast.framework.messages.ItemsInfo avec des informations sur les éléments de file d'attente. |
GET_QUEUE_IDS | Aucun paramètre requis. | QUEUE_IDS | cast.framework.messages.QueueIds. |
Pour NEXT
/PREVIOUS
, si la représentation de la file d'attente existante sur le récepteur Web
n'a pas plus d'articles, le
QueueBase.nextItems()
ou
QueueBase.prevItems()
est appelé automatiquement pour recevoir plus d'éléments.
Pour FETCH_ITEM
, la fonction correspondante
fetchItems
dans l'implémentation de QueueBase
est appelée pour les files d'attente cloud, qui récupèrent
les données pertinentes à renvoyer au récepteur
Web pour être stocké.
Dès que d'autres éléments sont récupérés, un nouveau type de message QUEUE_CHANGE
est déclenché
et renvoyé à l'expéditeur. Découvrez les différents types
les modifications des files d'attente.
Pour GET_ITEMS_INFO
,
QueueBase
n'est pas déclenchée et que Web Receiver renvoie les informations sur le contenu multimédia
déjà connues dans la liste des ID.
Lire une file d'attente en mode aléatoire
Pour que les éléments de votre file d'attente soient brassés, définissez la
shuffle
drapeau de
QueueData
à true
lors du chargement de vos éléments dans la file d'attente.
Si vous utilisez une implémentation
QueueBase
, utilisez
la
shuffle
pour renvoyer une liste d'éléments aléatoire.
Pour lire en mode aléatoire une file d'attente existante, utilisez la méthode
shuffle
indicateur du QUEUE_UPDATE
MessageType
,
au lieu de la commande QUEUE_SHUFFLE
. Pour en savoir plus, consultez QueueUpdateRequestData
.
Mode de répétition
Pour que les éléments de votre file d'attente soient répétés, définissez le paramètre
repeatMode
de
QueueData
à la valeur souhaitée
RepeatMode
lors du chargement de vos éléments dans la file d'attente.
Pour modifier le paramètre RepeatMode
d'une file d'attente existante, utilisez la méthode
repeatMode
de la classe
QueueUpdateRequestData
,
qui utilise le QUEUE_UPDATE
MessageType