Implementare un sistema di risoluzione dei contenuti personalizzato

Ultimo aggiornamento: 2023-09-21

Puoi implementare dei resolver di contenuto personalizzati in base ai resolver predefiniti.

Quando TVSDK rileva una nuova opportunità, scorre attraverso i risolutori di contenuti registrati alla ricerca di una che sia in grado di risolverla. Il primo che restituisce true viene selezionato per la risoluzione dell'opportunità. Se non è possibile utilizzare alcun risolutore contenuti, tale opportunità viene ignorata. Poiché il processo di risoluzione dei contenuti è in genere asincrono, il resolver dei contenuti è responsabile della notifica al termine del processo.

  1. Creare un AdvertisingFactory istanza e sostituzione 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 factory dell’ad client su MediaPlayer.

    Ad esempio:

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

    1. Creare un AdvertisingMetadata oggetto e MetadataNode oggetto.
    2. Salva il AdvertisingMetadata oggetto a MetadataNode.
    MetadataNode result = new MetadataNode();
    result.setNode(DefaultMetadataKeys.ADVERTISING_METADATA.getValue(),
                   advertisingMetadata);
    
  4. Creare una classe ad resolver personalizzata che estenda ContentResolver classe.

    1. Nel resolver dell’annuncio personalizzato, sovrascrivi questa funzione protetta:

      void doResolveAds(Metadata metadata,
                        PlacementOpportunity placementOpportunity)
      

      I metadati contengono AdvertisingMetada. Utilizzala per i seguenti elementi TimelineOperation generazione vettoriale.

    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. Dopo la risoluzione degli 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