Coda

Panoramica

L'SDK Web receiver supporta l'accodamento con coda predefinita fornita dalla SDK che utilizza QueueData: e QueueManager o utilizzando una coda personalizzata implementazione cast.framework.QueueBase e l'utilizzo QueueManager per aggiornamenti.

L'API Queueing consente una migliore integrazione delle applicazioni con Cast fornendo le seguenti funzionalità:

  • Supporto dell'implementazione di code nella cloud di Google e dei partner in modo così esterno possono essere caricate direttamente nei dispositivi di trasmissione.
  • Meccanismi che consentono l'impaginazione degli elementi in coda anziché il caricamento tutto in una volta sola.
  • Supporto per nuovi messaggi, ad esempio passaggio all'elemento successivo, precedente recuperare una finestra di elementi, oltre a recuperare le informazioni un insieme di elementi in coda.
  • La QueueManager per gestire l'inserimento, la rimozione e l'aggiornamento degli elementi della coda.

Coda predefinita

L'SDK WebRicevir fornisce un supporto per le code limitato fin dal primo utilizzo nel modulo di una coda predefinita.

Per utilizzare la coda predefinita, specifica queueData in LoadRequestData dei caricamenti lato mittente o invia una richiesta di caricamento locale utilizzando PlayerManager#load. Vedi anche Caricamento di contenuti multimediali.

Sul lato ricevitore, la coda può essere modificata utilizzando QueueManager una volta caricati i contenuti multimediali iniziali.

Coda personalizzata

Se la coda predefinita non offre la funzionalità di coda richiesta per nell'app, è disponibile la possibilità di creare una coda personalizzata, capacità e flessibilità.

Gli sviluppatori di applicazioni possono creare una coda laterale del ricevitore web implementando cast.framework.QueueBase

Ecco un esempio base di una coda semplice in cui initialize la chiamata viene ignorata e viene visualizzato un elenco di elementi della coda insieme alle descrizioni sono forniti al dispositivo di trasmissione.

Vedi anche Caricamento di contenuti multimediali.

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

In questo esempio, l'elenco di elementi nella initialize viene fornita nel prompt dei comandi QueueBase alla chiamata del costruttore. Tuttavia, per un'implementazione di code nella cloud, La logica del destinatario può recuperare gli elementi esternamente e quindi restituirli come parte di la chiamata di inizializzazione.

Per dimostrare un uso più completo dell'API Queueing, ecco una demo che implementa la maggior parte delle 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);
 }
};

Nell'esempio precedente, YourServer è il tuo server di coda cloud e ha una logica su come recuperare determinati elementi multimediali.

Per utilizzare QueueBase -implementato l'accodamento, verrebbe impostato l'opzione della coda nella CastReceiverContext:

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

Gestione di una coda

La QueueManager offre agli sviluppatori flessibilità nello sviluppo delle soluzioni di accodamento, per accedere all'elenco di elementi di coda attualmente memorizzato, nonché elemento attualmente in riproduzione. Fornisce inoltre operazioni quali inserimento, rimozione e l'aggiornamento degli elementi in coda. Il seguente snippet mostra come accedere a di Compute Engine, QueueManager:

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

Gestione predefinita delle code

Una volta caricata la coda iniziale, QueueManager può essere utilizzata per eseguire azioni quali recuperare l'elemento corrente, tutti gli elementi in coda e aggiornando gli elementi in coda utilizzando insertItems, removeItems, e updateItems.

Gestione personalizzata delle code

Di seguito è riportato un esempio di implementazione di una coda personalizzata che utilizza le chiavi di inserimento e metodi di rimozione basati su qualche evento. L'esempio mostra anche un utilizzo updateItems in cui gli sviluppatori possono modificare gli elementi della coda esistente, come rimuovendo le interruzioni pubblicitarie.

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

Messaggi in arrivo e in uscita

Per supportare completamente il recupero della coda lato ricevitore come fonte attendibile, seguenti ulteriori messaggi in coda vengono introdotti e gestiti dal CAF SDK ricevitore:

Messaggio in arrivo Parametri Messaggio di risposta in uscita Ritorno
AVANTI Nessun parametro necessario. MEDIA_STATUS Il ricevitore (recupererà tramite nextItems(), se necessario) e inizierà a giocare all'elemento successivo.
PRECEDENTE Nessun parametro necessario. MEDIA_STATUS Il ricevitore web (recupererà tramite prevItems() se necessario) e inizierà riproducendo l'elemento precedente.
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE Un'operazione cast.framework.messages.QueueChange. Ad esempio, per un inserto, il campo items nel file JSON conterrà l'elenco dei nuovi elementi recuperati.
GET_ITEMS_INFO GetItemsInfoRequestData contenenti itemIds: Array<numero> ITEMS_INFO cast.framework.messages.ItemsInfo con informazioni sugli elementi della coda.
GET_QUEUE_IDS Nessun parametro necessario. QUEUE_IDS cast.framework.messages.QueueIds.

Per NEXT/PREVIOUS, se la rappresentazione della coda esistente sul ricevitore web non contiene altri elementi, QueueBase.nextItems(): o QueueBase.prevItems() viene richiamato automaticamente per ricevere più elementi.

Per FETCH_ITEM, la funzione corrispondente fetchItems nell'implementazione QueueBase viene richiesto per le code cloud, che recupera i dati pertinenti da restituire al ricevitore web per l'archiviazione.

Ogni volta che vengono recuperati più elementi, viene attivato un nuovo tipo di messaggio QUEUE_CHANGE e reinviate al mittente. Scopri i vari tipi di modifiche alla coda.

Per GET_ITEMS_INFO, di QueueBase non viene attivata e il ricevitore web restituisce le informazioni multimediali già noti nell'elenco di ID.

Riproduzione casuale di una coda

Per impostare la riproduzione casuale degli elementi della coda, imposta la shuffle flag di QueueData a true quando carichi i tuoi elementi in coda.

Se utilizzi un'implementazione QueueBase, usa il shuffle per restituire un elenco casuale di elementi.

Per riprodurre in ordine casuale una coda esistente, utilizza il shuffle flag di QUEUE_UPDATE MessageType, anziché con il comando QUEUE_SHUFFLE. Consulta QueueUpdateRequestData per ulteriori informazioni.

Modalità di ripetizione

Per impostare la ripetizione degli elementi in coda, imposta il campo repeatMode proprietà di QueueData al RepeatMode quando carichi i tuoi elementi in coda.

Per modificare RepeatMode di una coda esistente, utilizza il repeatMode proprietà del QueueUpdateRequestData, che utilizza QUEUE_UPDATE MessageType