Enfileiramento

Visão geral

O SDK do receptor da Web suporta o enfileiramento com os fila padrão fornecida pelo SDK usando QueueData e QueueManager ou usar uma fila personalizada ao implementar cast.framework.QueueBase e usar QueueManager para atualizações.

A API Queueing permite que os aplicativos se integrem melhor ao Cast ao oferecer os seguintes recursos:

  • O suporte à implementação de filas na nuvem do Google e de parceiros para que as filas armazenadas e criadas podem ser carregadas diretamente nos dispositivos de transmissão.
  • Mecanismos que permitem a paginação de itens na fila em vez de carregar tudo de uma só vez.
  • Suporte para novas mensagens, como ir para o próximo item, o item anterior, buscar uma janela de itens, além de obter informações de mídia relacionadas a um conjunto de itens de fila.
  • A QueueManager para gerenciar a inserção, a remoção e a atualização dos itens da fila.

Fila padrão

O SDK do receptor da Web fornece suporte de fila limitado pronto para uso no formato de uma fila padrão.

Para usar a fila padrão, forneça o queueData no LoadRequestData dos carregamentos do lado do remetente ou envie uma solicitação de carga local usando PlayerManager#load Consulte também Como carregar mídia.

No lado do receptor, a fila pode ser modificada usando o método QueueManager depois que a mídia inicial for carregada.

Fila personalizada

Se a fila padrão não oferecer a funcionalidade de enfileiramento necessária para seu aplicativo, a capacidade de criar uma fila personalizada está disponível, permitindo mais capacidades e flexibilidade.

Os desenvolvedores de aplicativos podem criar uma fila no lado do receptor da Web implementando cast.framework.QueueBase

Este é um exemplo básico de uma fila simples em que o initialize chamada for substituída e, em seguida, uma lista de itens de fila juntamente com as descrições da fila são fornecidos ao dispositivo de transmissão.

Consulte também Como carregar mídia.

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

Neste exemplo, a lista de itens na initialize é fornecida no campo QueueBase chamada de construtor. No entanto, para uma implementação de fila na nuvem, a interface Web A lógica do receptor pode buscar os itens externamente e retorná-los como parte a chamada de inicialização.

Para demonstrar um uso mais abrangente da API de enfileiramento, aqui está uma demonstração que implementa a maioria dos classe 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);
 }
};

No exemplo acima, YourServer é o servidor de fila na nuvem e tem lógica sobre como buscar determinados itens de mídia.

Para usar QueueBase implementar as filas, seria possível definir a opção de fila no CastReceiverContext:

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

Como gerenciar uma fila

A QueueManager oferece aos desenvolvedores flexibilidade para desenvolver suas soluções de filas, métodos para acessar a lista atualmente armazenada de itens de fila, bem como os o item sendo reproduzido. Ela também oferece operações como inserção, remoção e atualização dos itens na fila. O snippet a seguir mostra como acessar uma instância de QueueManager:

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

Gerenciamento de filas padrão

Depois que a fila inicial é carregada, QueueManager podem ser usadas para realizar ações como a recuperação do item atual, todos os itens na fila e atualizar os itens na fila usando insertItems, removeItems, e updateItems

Gerenciamento de filas personalizadas

Aqui está um exemplo de implementação de fila personalizada que usa os operadores de inserção e métodos de remoção com base em algum evento. O exemplo também demonstra o uso de updateItems em que os desenvolvedores podem modificar os itens da fila existente, como e a remoção dos intervalos de anúncio.

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

Mensagens recebidas e enviadas

Para oferecer suporte total à busca pela fila do lado do destinatário como fonte da verdade, o as seguintes mensagens de enfileiramento são introduzidas e processadas pelo CAF SDK do receptor:

Mensagem recebida Parâmetros Mensagem de resposta enviada Enter
PRÓXIMA Nenhum parâmetro é necessário. MEDIA_STATUS O receptor vai (buscar por nextItems(), se necessário) e começar a reproduzir para o próximo item.
ANTERIOR Nenhum parâmetro é necessário. MEDIA_STATUS O receptor da Web (buscará por meio de prevItems(), se necessário) e iniciará reproduzindo o item anterior.
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE Uma cast.framework.messages.QueueChange. Por exemplo, para um caso de inserção, o campo de itens no JSON conterá a lista de novos itens buscados.
GET_ITEMS_INFO GetItemsInfoRequestData que contém itemIds: Matriz<number> ITEMS_INFO cast.framework.messages.ItemsInfo com informações do item da fila.
GET_QUEUE_IDS Nenhum parâmetro é necessário. QUEUE_IDS cast.framework.messages.QueueIds.

Para NEXT/PREVIOUS, se a representação da fila existente no receptor da Web não tiver mais itens, o QueueBase.nextItems() ou QueueBase.prevItems() é invocado para receber mais itens.

Para FETCH_ITEM, a função correspondente fetchItems na implementação de QueueBase é chamado para filas do Cloud, que recuperam os dados relevantes a serem retornados ao receptor da Web para armazenamento.

Sempre que mais itens são buscados, um novo tipo de mensagem QUEUE_CHANGE é acionado. e devolvidos ao remetente. Veja os vários tipos de mudanças na fila.

Para o GET_ITEMS_INFO, QueueBase implementação não é acionada e o receptor da Web retorna informações de mídia já conhecidas na lista de IDs.

Ordem aleatória de uma fila

Para definir a ordem aleatória dos itens na fila, defina o shuffle bandeira de QueueData como true ao carregar seus itens na fila.

Se você estiver usando uma implementação do QueueBase, use as shuffle para retornar uma lista embaralhada de itens.

Para embaralhar uma fila existente, use o método shuffle bandeira do QUEUE_UPDATE MessageType, em vez do comando QUEUE_SHUFFLE. Consulte QueueUpdateRequestData se quiser mais informações.

Modo de repetição

Para definir os itens da fila a serem repetidos, defina o repeatMode propriedade de QueueData ao valor desejado RepeatMode ao carregar seus itens na fila.

Para alterar o RepeatMode de uma fila existente, use o repeatMode do elemento QueueUpdateRequestData, que usa o QUEUE_UPDATE MessageType.