CAF Receiver: Error handling

1.4k views Asked by At

We've created a custom CAF receiver with generic error listener based on cast.framework.events.EventType.ERROR event:

playerManager.addEventListener(cast.framework.events.EventType.ERROR, event => { 
if (playerManager.getPlayerState() != "IDLE") {
  let errorCode = (event.detailedErrorCode != undefined ?event.detailedErrorCode : null);
  let errorMessage = null;
  if ((event.error != undefined) && (event.error.reason != null)) errorMessage = event.error.reason;

  playerManager.setIdleReason(cast.framework.messages.IdleReason.ERROR);
  customErrorCodeClass.display(errorCode, errorMessage);
});

This handler works properly, but sometimes the player rise a "404 fragment error" for a single fragment, causing video stopping. We aren't able to know if that error is related for that particular fragment or there will be other 404 fragments, so we can't exclude that errors from error handler.

Does someone knows a better way to work around this issue?

1

There are 1 answers

0
Shaimaa Hamdan AbdelSalam On

Add following logs so you would know what happens with the fragments

 playerManager.addEventListener(cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
        log('[mediacast:events:PLAYER_LOAD_COMPLETE');
        console.log(playerManager.getStats());
        console.log(playerManager.getMediaInformation());
    });

    playerManager.addEventListener(cast.framework.events.EventType.BITRATE_CHANGED, (event) => {
        log('[mediacast:events:BITRATE_CHANGED - ' + event.totalBitrate);
        stats.bitrate = event.totalBitrate;
        console.log(playerManager.getStats());
    });

    playerManager.addEventListener(cast.framework.events.EventType.PLAYING, (event) => {
        log('[mediacast:events:PLAYING - ', JSON.stringify(event));
    });

    playerManager.addEventListener(cast.framework.events.EventType.PAUSE, (event) => {
        log('[mediacast:events:PAUSE - ', JSON.stringify(event));
    });

    playerManager.addEventListener(cast.framework.events.EventType.SEEKING, (event) => {
        log('[mediacast:events:SEEKING - ', JSON.stringify(event));
    });

    playerManager.addEventListener(cast.framework.events.EventType.BUFFERING, (event) => {
        log('[mediacast:events:BUFFERING - ', JSON.stringify(event));
    });

    playerManager.addEventListener(cast.framework.events.EventType.TIME_UPDATE, (event) => {
        // log('[mediacast:events:TIME_UPDATE - ', JSON.stringify(event));
        stats.currentMediaTime = event.currentMediaTime;
    });

    playerManager.addEventListener(cast.framework.events.EventType.MEDIA_STATUS, (event) => {
        log('[mediacast:events:MEDIA_STATUS - ', JSON.stringify(event));
        stats.state = event.mediaStatus.playerState;
    });

and don't forget to set debug as logger level

cast.framework.CastReceiverContext.getInstance().setLoggerLevel(cast.framework.LoggerLevel.DEBUG);