Agregar a una cola

Descripción general

El SDK de receptor web admite colas con el cola predeterminada que proporciona el SDK que usa QueueData y QueueManager o usar una cola personalizada implementando cast.framework.QueueBase y usar QueueManager para ver las actualizaciones.

La API de Queueing permite que las aplicaciones se integren mejor con Cast proporcionando las siguientes funciones:

  • Asistencia para la implementación de colas de la nube de Google y del socio de manera externa de la fila almacenada y creada se podrán cargar directamente en los dispositivos de transmisión.
  • Mecanismos que permiten paginar los elementos en la cola en lugar de cargarlos todo al mismo tiempo.
  • Compatibilidad con mensajes nuevos, como ir al elemento siguiente, al elemento anterior recuperar una ventana de elementos y obtener información de los medios de comunicación un conjunto de elementos de la fila.
  • El QueueManager para administrar la inserción, la eliminación y la actualización de elementos de la cola.

Cola predeterminada

El SDK del receptor web proporciona compatibilidad limitada con las colas lista para usar en el formulario. de una cola predeterminada.

Para usar la cola predeterminada, proporciona la queueData en los LoadRequestData de tus cargas de envío o envía una solicitud de carga local mediante PlayerManager#load También consulta Cómo cargar contenido multimedia.

Del lado del receptor, la cola se puede modificar QueueManager una vez que se hayan cargado los medios iniciales.

Fila personalizada

Si la cola predeterminada no proporciona la funcionalidad de cola necesaria para tu app, estará disponible la capacidad de crear una fila personalizada, lo que permite capacidades y flexibilidad.

Los desarrolladores de aplicaciones pueden crear una cola lateral de receptor web implementando cast.framework.QueueBase

Este es un ejemplo básico de una cola simple en la que initialize se anula la llamada y, luego, se muestra una lista de elementos de la cola junto con sus descripciones al dispositivo de transmisión.

También consulta Cómo cargar contenido multimedia.

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

En este ejemplo, la lista de elementos del initialize se proporciona en la configuración del proveedor QueueBase llamada de constructor. Sin embargo, para una implementación de cola en la nube, la Web La lógica del receptor puede recuperar los elementos externamente y luego mostrarlos como parte de la llamada de inicialización.

Para demostrar un uso más integral de la API de colas, esta es una demostración que implementa la mayoría de los 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);
 }
};

En el ejemplo anterior, YourServer es tu servidor de colas de la nube y tiene lógica sobre cómo recuperar determinados elementos multimedia.

Para usar QueueBase de cola implementada, se configuraba la opción de cola en la CastReceiverContext:

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

Administra una cola

El QueueManager ofrece a los desarrolladores flexibilidad para desarrollar sus soluciones de filas, ya que les proporciona para acceder a la lista almacenada actualmente de elementos en cola, así como a el elemento que se está reproduciendo. También proporciona operaciones como inserción, eliminación, y la actualización de los elementos en cola. En el siguiente fragmento, se muestra cómo acceder a un instancia de QueueManager:

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

Administración predeterminada de colas

Una vez cargada la cola inicial, QueueManager se puede usar para realizar acciones como recuperar el elemento actual, recuperar todos los elementos en la cola y los actualizamos con insertItems, removeItems, y updateItems.

Administración de colas personalizada

Este es un ejemplo de una implementación de cola personalizada que usa las funciones de inserción y métodos de eliminación basados en algún evento. El ejemplo también demuestra un uso de updateItems en la que los desarrolladores pueden modificar los elementos de la cola existente, como quitar pausas publicitarias.

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

Mensajes entrantes y salientes

Para admitir completamente la recuperación de la cola del receptor como fuente de información, el CAF introduce y controla los siguientes mensajes adicionales en cola SDK del receptor:

Mensaje entrante Parámetros Mensaje de respuesta saliente Volver
SIGUIENTE No se necesita ningún parámetro. MEDIA_STATUS El receptor (si es necesario, recuperará el archivo a través de nextItems()) y comenzará a jugar. el siguiente elemento.
ANTERIOR No se necesita ningún parámetro. MEDIA_STATUS El receptor web lo recuperará (a través de prevItems() si es necesario) e iniciará reproduciendo el elemento anterior.
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE Un cast.framework.messages.QueueChange. Por ejemplo, para un caso de inserción, El campo “items” del JSON contendrá la lista de los artículos nuevos recuperados.
GET_ITEMS_INFO GetItemsInfoRequestData que contiene itemIds: Arreglo<número> ITEMS_INFO cast.framework.messages.ItemsInfo con información del elemento de la cola
GET_QUEUE_IDS No se necesita ningún parámetro. QUEUE_IDS cast.framework.messages.QueueIds.

Para NEXT/PREVIOUS, si la representación de cola existente en el receptor web no tiene más elementos, QueueBase.nextItems() o QueueBase.prevItems() se invoca automáticamente para recibir más elementos.

Para FETCH_ITEM, la función correspondiente fetchItems en la implementación de QueueBase se llama para las colas en la nube, que recupera los datos relevantes que se devolverá al receptor web para su almacenamiento.

Cada vez que se recuperan más elementos, se activa un nuevo tipo de mensaje QUEUE_CHANGE. y se envían de vuelta al remitente. Conoce los diversos tipos de cambios en la cola.

Para GET_ITEMS_INFO, De QueueBase la implementación no se activa y el receptor web devuelve información de medios conocidos en la lista de IDs.

Reproduciendo aleatoriamente una cola

Para que los elementos de la cola se mezclen, configura la shuffle bandera de QueueData a true cuando cargues elementos en la cola.

Si usas una implementación de QueueBase, usar el shuffle para mostrar una lista aleatoria de elementos.

Para redistribuir una cola existente, usa shuffle bandera de QUEUE_UPDATE MessageType, en lugar de usar el comando QUEUE_SHUFFLE. Consulta QueueUpdateRequestData para obtener más información.

Modo Repetir

Para establecer que los elementos de la cola se repitan, establece repeatMode propiedad de QueueData al nivel deseado RepeatMode cuando cargues elementos en la cola.

Para cambiar el RepeatMode de una cola existente, usa el repeatMode propiedad del QueueUpdateRequestData, que utiliza la columna QUEUE_UPDATE MessageType.