Mise en file d'attente

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