Implementa un risolutore di contenuti personalizzato

È possibile implementare i propri risolutori di contenuti in base ai risolutori predefiniti.

Quando TVSDK rileva una nuova opportunità, esegue un’iterazione attraverso i risolutori di contenuti registrati alla ricerca di una che sia in grado di risolvere tale opportunità. Il primo che restituisce true viene selezionato per risolvere l'opportunità. Se nessun risolutore di contenuti è in grado di farlo, questa opportunità viene ignorata. Poiché il processo di risoluzione del contenuto è in genere asincrono, il risolutore del contenuto è responsabile della notifica al completamento del processo.

  1. Crea un'istanza AdvertisingFactory personalizzata e sovrascrivi createContentResolver.

    Ad esempio:

    new AdvertisingFactory() {
        ...
        @Override
        public ContentResolver createContentResolver(MediaPlayerItem item) {
            Metadata metadata = _mediaPlayer.getCurrentItem().getResource().getMetadata();
            if (metadata != null) {
                if (metadata.containsKey(DefaultMetadataKeys.AUDITUDE_METADATA_KEY.getValue())) {
                    return new AuditudeResolver(getActivity().getApplicationContext());
                } else if (metadata.containsKey(DefaultMetadataKeys.JSON_METADATA_KEY.getValue())) {
                    return new MetadataResolver();
                } else if (metadata.containsKey(DefaultMetadataKeys.TIME_RANGES_METADATA_KEY.getValue())) {
                    return new CustomAdMarkersContentResolver();
                } else if (metadata.containsKey(CustomAdResolver.CUSTOM_METADATA_KEY)) {
                    return new CustomAdResolver();
                }
            }
            return null;
        }
        ...
    }
    
  2. Registra la Ad Client Factory in MediaPlayer.

    Ad esempio:

    // register the custom advertising factory with media player
    advertisingFactory = createCustomAdvertisingFactory();
    mediaPlayer.registerAdClientFactory(advertisingFactory);
    
  3. Passa un oggetto AdvertisingMetadata a TVSDK come segue:

    1. Creare un oggetto AdvertisingMetadata e un oggetto MetadataNode.
    2. Salvare l’oggetto AdvertisingMetadata su MetadataNode.
    MetadataNode result = new MetadataNode();
    result.setNode(DefaultMetadataKeys.ADVERTISING_METADATA.getValue(),
                   advertisingMetadata);
    
  4. Crea una classe ad resolver personalizzata che estende la classe ContentResolver .

    1. Nel risolutore di annunci personalizzato, sovrascrivi questa funzione protetta:

      void doResolveAds(Metadata metadata,
                        PlacementOpportunity placementOpportunity)
      

      I metadati contengono il AdvertisingMetada. Utilizzalo per la seguente generazione vettoriale TimelineOperation.

    2. Per ogni opportunità di posizionamento, crea un Vector<TimelineOperation>.

      Il vettore può essere vuoto, ma non nullo.

      Questo esempio TimelineOperation fornisce una struttura per AdBreakPlacement:

      AdBreakPlacement(AdBreak.createAdBreak(
                                ads,       // Vector<Ad>
                                time,      // Ad Break start time. Note: local time on the timeline
                                duration,  // Ad Break duration
                                tag()      // An arbitrary string value that can be attached to
                                           // the AdBreak object.
                               ), placementInformation  // Retrieved from PlacementOpportunity
      )
      
    3. Una volta risolti gli annunci, chiama una delle seguenti funzioni:

      • Se la risoluzione dell'annuncio ha esito positivo: notifyResolveComplete(Vector<TimelineOperation> proposals)
      • Se la risoluzione dell'annuncio non riesce: notifyResolveError(Error error)

      Ad esempio, se non riesce:

      Metadata metadata = new MetadataNode();
      metadata.setValue("NATIVE_ERROR_CODE", exception.getCause().toString());
      error.setMetadata(metadata);
      

Questo ad resolver personalizzato di esempio effettua una richiesta HTTP al server di annunci e riceve una risposta JSON.

public class CustomAdResolver extends ContentResolver {
    ...
    @Override
    protected void doResolveAds(Metadata metadata, PlacementOpportunity placementOpportunity) {
        ...
        if (resolveSuccess == true) {
            notifyResolveComplete(Vector<TimelineOperation> proposals);
        }
        else {
            notifyResolveError(Error error);
        }
    }
    ...
}

Esempio di risposta JSON ad server per un flusso live:

{
    "response": {
        "breaks": [ {
            "start": 0,
            "ads": [ {
                "id": 1001,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/geico/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset1",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            }
        ] },
        {
            "start": -1,
            "ads": [ {
                "id": 1003,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/priceline/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset3",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        } ]
    }
}

Esempio di risposta JSON ad server per VOD:

{
    "response": {
        "breaks": [ {
            "start": 0,
            "ads": [ {
                "id": 1001,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/geico/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset1",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            },
            {
                "id": 1002,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/crescent/playlist.m3u8",
                    "duration": 15000,
                    "id": "asset2",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        },
        {
            "start": 50000,
            "ads": [ {
                "id": 1003,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/priceline/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset3",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        },
        {
            "start": 100000000,
            "ads": [ {
                "id": 1004,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/camry/playlist.m3u8",
                    "duration": 15000,
                    "id": "asset4",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        } ]
    }
}

In questa pagina