Przewodnik po integracji pakietu Engage SDK z telewizorami

Funkcja Kontynuuj oglądanie korzysta z klastra kontynuacji, aby wyświetlać niedokończone filmy i kolejne odcinki z tego samego sezonu serialu z różnych aplikacji w jednej grupie interfejsu. Możesz wyróżnić ich podmioty w tym klastrze kontynuacji. Z tego przewodnika dowiesz się, jak zwiększyć zaangażowanie użytkowników dzięki funkcji „Oglądaj dalej” za pomocą pakietu Engage SDK.

Przygotowanie

Zanim zaczniesz, wykonaj te czynności:

  1. zaktualizować docelowy interfejs API do wersji 19 lub nowszej.

  2. Dodaj bibliotekę com.google.android.engage do aplikacji:

    Do integracji możesz użyć oddzielnych pakietów SDK: jednego do aplikacji mobilnych i jednego do aplikacji na telewizory.

    Telefon

    
      dependencies {
        implementation 'com.google.android.engage:engage-core:1.5.5
      }
    

    TV

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. W pliku AndroidManifest.xml ustaw środowisko usługi Engage na produkcyjne.

    Telefon

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    

    TV

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    
  4. Dodaj uprawnienia dla WRITE_EPG_DATA w przypadku pliku APK na telewizor

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. Weryfikuj publikowanie wiarygodnych treści za pomocą usługi działającej w tle, takiej jak androidx.work, do planowania.

  6. Aby zapewnić płynne oglądanie, publikuj dane dotyczące kontynuowania oglądania, gdy wystąpią te zdarzenia:

    1. Pierwsze logowanie: gdy użytkownik loguje się po raz pierwszy, opublikuj dane, aby jego historia oglądania była od razu dostępna.
    2. Tworzenie lub przełączanie profili (aplikacje z wieloma profilami): jeśli aplikacja obsługuje wiele profili, publikuj dane, gdy użytkownik tworzy lub przełącza profile.
    3. Przerwanie odtwarzania filmu: aby ułatwić użytkownikom powrót do miejsca, w którym skończyli oglądać film, publikuj dane, gdy wstrzymują lub zatrzymują film albo gdy zamykają aplikację podczas odtwarzania.
    4. Aktualizacje sekcji „Oglądaj dalej” (jeśli jest obsługiwana): gdy użytkownik usunie element z sekcji „Oglądaj dalej”, odzwierciedlaj tę zmianę, publikując zaktualizowane dane.
    5. Ukończenie filmu:
      1. W przypadku filmów usuń obejrzany film z sekcji Oglądaj dalej. Jeśli film jest częścią serii, dodaj kolejny film, aby utrzymać zaangażowanie użytkownika.
      2. W przypadku odcinków usuń ukończony odcinek i dodaj kolejny odcinek z serii, jeśli jest dostępny, aby zachęcić do dalszego oglądania.

Integracja

AccountProfile

Aby umożliwić spersonalizowane „kontynuowanie oglądania” w Google TV, podaj informacje o koncie i profilu. Użyj AccountProfile, aby podać:

  1. Identyfikator konta: unikalny identyfikator, który reprezentuje konto użytkownika w Twojej aplikacji. Może to być rzeczywisty identyfikator konta lub odpowiednio zamaskowana wersja.

  2. Identyfikator profilu (opcjonalnie): jeśli Twoja aplikacja obsługuje wiele profili w ramach jednego konta, podaj unikalny identyfikator konkretnego profilu użytkownika (ponownie, prawdziwy lub zaciemniony).

// If your app only supports account
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .build()

// If your app supports both account and profile
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .setProfileId("your_users_profile_id")
    .build()

Tworzenie encji

Pakiet SDK ma zdefiniowane różne obiekty reprezentujące każdy typ produktu. Klaster Continuation obsługuje te jednostki:

  1. MovieEntity
  2. TvEpisodeEntity
  3. LiveStreamingVideoEntity
  4. VideoClipEntity

Określ identyfikatory URI i obrazy plakatu dla tych elementów na poszczególnych platformach.

Utwórz też identyfikatory URI odtwarzania dla każdej platformy, np. Android TV, Android lub iOS, jeśli jeszcze tego nie zrobiono. Gdy użytkownik kontynuuje oglądanie na każdej platformie, aplikacja używa docelowego identyfikatora URI odtwarzania, aby odtworzyć treści wideo.

// Required. Set this when you want continue watching entities to show up on
// Google TV
val playbackUriTv = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_TV)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_tv"))
    .build()

// Required. Set this when you want continue watching entities to show up on
// Google TV Android app, Entertainment Space, Playstore Widget
val playbackUriAndroid = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_MOBILE)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_android"))
    .build()

// Optional. Set this when you want continue watching entities to show up on
// Google TV iOS app
val playbackUriIos = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_IOS)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_ios"))
    .build()

val platformSpecificPlaybackUris =
    Arrays.asList(playbackUriTv, playbackUriAndroid, playbackUriIos)

Obrazy plakatu wymagają identyfikatora URI i wymiarów w pikselach (wysokości i szerokości). Kieruj reklamy na różne urządzenia, przesyłając wiele obrazów plakatu, ale upewnij się, że wszystkie obrazy mają współczynnik proporcji 16:9 i minimalną wysokość 200 pikseli, aby zapewnić prawidłowe wyświetlanie elementu „Oglądaj dalej”, zwłaszcza w Entertainment Space Google. Obrazy o wysokości mniejszej niż 200 pikseli mogą się nie wyświetlać.

val images = Arrays.asList(
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
        .setImageHeightInPixel(300)
        .setImageWidthInPixel(169)
        .build(),
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image2.png"))
        .setImageHeightInPixel(640)
        .setImageWidthInPixel(360)
        .build()
    // Consider adding other images for different form factors
)
MovieEntity

Ten przykład pokazuje, jak utworzyć MovieEntity ze wszystkimi wymaganymi polami:

val movieEntity = MovieEntity.Builder()
   .setWatchNextType(WatchNextType.TYPE_CONTINUE)
   .setName("Movie name")
   .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
   .addPosterImages(images)
   // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
   .setLastEngagementTimeMillis(1701388800000)
   // Suppose the duration is 2 hours, it is 72000000 in milliseconds
   .setDurationMills(72000000)
   // Suppose last playback offset is 1 hour, 36000000 in milliseconds
   .setLastPlayBackPositionTimeMillis(36000000)
   .build()

Podanie szczegółów, takich jak gatunki i oceny treści, umożliwia Google TV prezentowanie Twoich treści w bardziej dynamiczny sposób i łączenie ich z odpowiednimi widzami.

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val movieEntity = MovieEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .build()

Jednostki pozostają automatycznie dostępne przez 60 dni, chyba że określisz krótszy czas wygaśnięcia. Niestandardowy okres ważności należy ustawić tylko wtedy, gdy chcesz, aby element został usunięty przed upływem domyślnego okresu.

// Set the expiration time to be now plus 30 days in milliseconds
val expirationTime = DisplayTimeWindow.Builder()
    .setEndTimestampMillis(now().toMillis()+2592000000).build()
val movieEntity = MovieEntity.Builder()
    ...
    .addAvailabilityTimeWindow(expirationTime)
    .build()
TvEpisodeEntity

Ten przykład pokazuje, jak utworzyć element TvEpisodeEntity ze wszystkimi wymaganymi polami:

val tvEpisodeEntity = TvEpisodeEntity.Builder()
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Episode name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) // 2 hours in milliseconds
    // 45 minutes and 15 seconds in milliseconds is 2715000
    .setLastPlayBackPositionTimeMillis(2715000)
    .setEpisodeNumber("2")
    .setSeasonNumber("1")
    .setShowTitle("Title of the show")
    .build()

Ciąg numeru odcinka (np. "2") i ciąg numeru sezonu (np. "1") zostaną rozwinięte do odpowiedniej formy przed wyświetleniem na karcie „Kontynuuj oglądanie”. Pamiętaj, że powinny to być ciągi znaków numerycznych. Nie wpisuj „e2”, „episode 2”, „s1” ani „season 1”.

Jeśli dany serial telewizyjny ma tylko 1 sezon, ustaw numer sezonu na 1.

Aby zwiększyć szanse na to, że widzowie znajdą Twoje treści w Google TV, rozważ podanie dodatkowych danych, takich jak gatunki, oceny treści i okresy dostępności, ponieważ te szczegóły mogą ulepszyć wyświetlanie i opcje filtrowania.

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val tvEpisodeEntity = TvEpisodeEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .setSeasonTitle("Season Title")
    .setShowTitle("Show Title")
    .build()
VideoClipEntity

Oto przykład tworzenia VideoClipEntity ze wszystkimi wymaganymi polami.

VideoClipEntity – klip wygenerowany przez użytkownika, np. film w YouTube.

val videoClipEntity = VideoClipEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Video clip name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(600000) //10 minutes in milliseconds
    .setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
    .addContentRating(contentRating)
    .build()

Możesz opcjonalnie ustawić twórcę, obraz twórcy, czas utworzenia w milisekundach lub okno czasowe dostępności .

LiveStreamingVideoEntity

Oto przykład tworzenia LiveStreamingVideoEntity ze wszystkimi wymaganymi polami.

val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Live streaming name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) //2 hours in milliseconds
    .setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
    .addContentRating(contentRating)
    .build()

Opcjonalnie możesz ustawić czas rozpoczęcia, nadawcę, ikonę nadawcy lub przedział czasu dostępności dla elementu transmisji na żywo.

Szczegółowe informacje o atrybutach i wymaganiach znajdziesz w dokumentacji interfejsu API.

Podaj dane klastra kontynuacji

AppEngagePublishClient odpowiada za publikowanie klastra kontynuacji. Do publikowania obiektu publishContinuationCluster() używasz metody publishContinuationCluster().ContinuationCluster

Najpierw użyj funkcji isServiceAvailable(), aby sprawdzić, czy usługa jest dostępna do integracji.

client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .addEntity(movieEntity1)
                .addEntity(movieEntity2)
                .addEntity(tvEpisodeEntity1)
                .addEntity(tvEpisodeEntity2)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

Gdy usługa otrzyma żądanie, w ramach jednej transakcji zostaną wykonane te działania:

  • Istniejące dane ContinuationCluster od partnera dewelopera zostaną usunięte.
  • Dane z żądania są analizowane i zapisywane w zaktualizowanym ContinuationCluster.

W przypadku błędu całe żądanie jest odrzucane, a dotychczasowy stan jest zachowywany.

Interfejsy API publikowania to interfejsy API typu upsert, które zastępują istniejące treści. Jeśli chcesz zaktualizować konkretny element w obiekcie ContinuationCluster, musisz ponownie opublikować wszystkie elementy.

Dane ContinuationCluster powinny być podawane tylko w przypadku kont osób dorosłych. Publikuj tylko wtedy, gdy profil konta należy do osoby dorosłej.

Synchronizacja na różnych urządzeniach

Flaga SyncAcrossDevices określa, czy dane ContinuationCluster użytkownika mają być synchronizowane na różnych urządzeniach, takich jak telewizor, telefon, tablet itp. Synchronizacja między urządzeniami jest domyślnie wyłączona.

Wartości:

  • true: dane ContinuationCluster są udostępniane na wszystkich urządzeniach użytkownika, aby zapewnić płynne oglądanie. Zdecydowanie zalecamy tę opcję, aby zapewnić jak najlepsze wrażenia na różnych urządzeniach.
  • false: Dane ContinuationCluster są ograniczone do bieżącego urządzenia.

Aplikacja multimedialna musi zawierać wyraźne ustawienie umożliwiające włączanie i wyłączanie synchronizacji na różnych urządzeniach. Wyjaśnij użytkownikowi korzyści i zapisz jego preferencje, aby zastosować je w funkcji publishContinuationCluster.

// Example to allow cross device syncing.
client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

Aby w pełni wykorzystać funkcję na różnych urządzeniach, sprawdź, czy aplikacja uzyskuje zgodę użytkownika, i włącz SyncAcrossDevices, aby true. Dzięki temu treści mogą być płynnie synchronizowane na różnych urządzeniach, co zwiększa wygodę użytkowników i ich zaangażowanie. Na przykład partner, który wdrożył tę funkcję, odnotował wzrost liczby kliknięć „Oglądaj dalej” o 40% dzięki temu, że jego treści były wyświetlane na wielu urządzeniach.

Usuwanie danych dotyczących reklam wideo Discovery

Aby ręcznie usunąć dane użytkownika z serwera Google TV przed upływem standardowego 60-dniowego okresu przechowywania, użyj metody client.deleteClusters(). Po otrzymaniu prośby usługa usunie wszystkie dotychczasowe dane dotyczące odkrywania filmów z profilu konta lub z całego konta.

Wyliczenie DeleteReason określa przyczynę usunięcia danych. Poniższy kod usuwa dane „Oglądaj dalej” po wylogowaniu.


// If the user logs out from your media app, you must make the following call
// to remove continue watching data from the current google TV device,
// otherwise, the continue watching data will persist on the current
// google TV device until 60 days later.
client.deleteClusters(
    DeleteClustersRequest.Builder()
        .setAccountProfile(AccountProfile())
        .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
        .setSyncAcrossDevices(true)
        .build()
)

Testowanie

Użyj aplikacji weryfikacyjnej, aby sprawdzić, czy integracja pakietu Engage SDK działa prawidłowo. Ta aplikacja na Androida udostępnia narzędzia, które pomagają sprawdzać dane i potwierdzać, że intencje transmisji są prawidłowo obsługiwane.

Po wywołaniu interfejsu API publikowania sprawdź, czy dane są prawidłowo publikowane, korzystając z aplikacji weryfikacyjnej. Klaster kontynuacji powinien być wyświetlany jako osobny wiersz w interfejsie aplikacji.

  • Ustaw Engage Service Flag tylko w przypadku wersji nieprodukcyjnych w pliku manifestu Androida aplikacji.
  • Zainstaluj i otwórz aplikację Engage Verify.
  • Jeśli isServiceAvailable ma wartość false, kliknij przycisk „Przełącz”, aby włączyć.
  • Wpisz nazwę pakietu aplikacji, aby automatycznie wyświetlać opublikowane dane po rozpoczęciu publikowania.
  • Przetestuj te działania w aplikacji:
    • Zaloguj się.
    • Przełącz się między profilami(jeśli to możliwe).
    • Rozpocznij, a następnie wstrzymaj odtwarzanie filmu lub wróć na stronę główną.
    • Zamknij aplikację podczas odtwarzania filmu.
    • Usuń element z wiersza „Oglądaj dalej” (jeśli jest obsługiwany).
  • Po każdej czynności sprawdź, czy aplikacja wywołała interfejs APIpublishContinuationClusters i czy dane są prawidłowo wyświetlane w aplikacji weryfikacyjnej.
  • Aplikacja weryfikacyjna wyświetli zielony znacznik „Wszystko w porządku” w przypadku prawidłowo zaimplementowanych podmiotów.

    Zrzut ekranu aplikacji weryfikacyjnej
    Rysunek 1. Weryfikacja aplikacji zakończona sukcesem
  • Aplikacja do weryfikacji oznaczy wszystkie problematyczne elementy.

    Zrzut ekranu z błędem aplikacji do weryfikacji
    Rysunek 2. Błąd aplikacji weryfikacyjnej
  • Aby rozwiązać problemy z elementami, użyj pilota do telewizora, aby wybrać i kliknąć element w aplikacji weryfikacyjnej. Konkretne problemy zostaną wyświetlone i wyróżnione na czerwono (patrz przykład poniżej).

    Szczegóły błędu aplikacji do weryfikacji
    Rysunek 3. Szczegóły błędu aplikacji do weryfikacji

API REST

Pakiet Engage SDK udostępnia interfejs REST API, który zapewnia spójne działanie funkcji „Oglądaj dalej” na platformach innych niż Android, takich jak iOS czy Roku TV. Interfejs API umożliwia deweloperom aktualizowanie stanu „Oglądaj dalej” w przypadku użytkowników, którzy wyrazili zgodę na tę funkcję, na platformach innych niż Android.

Wymagania wstępne

  • Najpierw musisz zakończyć integrację opartą na pakiecie SDK Engage na urządzeniu. Ten ważny krok tworzy niezbędne powiązanie między identyfikatorem użytkownika Google a AccountProfile aplikacji.
  • Dostęp do interfejsu API i uwierzytelnianie: aby wyświetlić i włączyć interfejs API w projekcie Google Cloud, musisz przejść proces dodawania do listy dozwolonych. Wszystkie żądania interfejsu API wymagają uwierzytelnienia.

Uzyskiwanie dostępu

Aby uzyskać dostęp do interfejsu API w konsoli Google Cloud i móc go włączyć, musisz zarejestrować swoje konto.

  1. Identyfikator klienta Google Workspace powinien być dostępny. Jeśli nie jest dostępny, może być konieczne skonfigurowanie Google Workspace oraz kont Google, których chcesz używać do wywoływania interfejsu API.
  2. Skonfiguruj konto w Google Cloud Console, używając adresu e-mail powiązanego z Google Workspace.
  3. Tworzenie nowego projektu
  4. Utwórz konto usługi do uwierzytelniania interfejsu API. Po utworzeniu konta usługi będziesz mieć 2 elementy:
    • Identyfikator konta usługi.
    • Plik JSON z kluczem konta usługi. Zabezpiecz ten plik, ponieważ będzie on później potrzebny do uwierzytelniania klienta w interfejsie API.
  5. Workspace i powiązane z nim konta Google mogą teraz korzystać z interfejsów API REST. Gdy zmiana zostanie wprowadzona, otrzymasz powiadomienie o tym, czy interfejs API jest gotowy do wywoływania przez Twoje konta usługi.
  6. Aby przygotować się do wykonania wywołania delegowanego interfejsu API, wykonaj te czynności.

Opublikuj klaster kontynuacji

Aby opublikować dane dotyczące reklam wideo Discovery, wyślij żądanie POST do interfejsu APIpublishContinuationCluster, używając tej składni:

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/publishContinuationCluster

Gdzie:

  • package_name: nazwa pakietu dostawcy multimediów.
  • accountId: unikalny identyfikator konta użytkownika w Twoim systemie. Musi on odpowiadać accountId używanemu w ścieżce na urządzeniu.
  • profileId: unikalny identyfikator profilu użytkownika na koncie w Twoim systemie. Musi odpowiadać identyfikatorowi profileId używanemu w ścieżce na urządzeniu.

Adres URL konta bez profilu to:

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/publishContinuationCluster

Ładunek żądania jest przedstawiony w polu entities. entities reprezentuje listę elementów treści, które mogą być MovieEntity lub TVEpisodeEntity. To pole jest wymagane.

Treść żądania

Pole

Typ

Wymagany

Opis

encje,

Lista obiektów MediaEntity

Tak

Lista elementów treści (maksymalnie 5). Zachowywanych jest tylko 5 najważniejszych elementów, a pozostałe są usuwane. Pusta lista oznacza, że użytkownik obejrzał już wszystkie elementy.

Pole entities zawiera poszczególne wartości movieEntitytvEpisodeEntity.

Pole

Typ

Wymagany

Opis

movieEntity

MovieEntity

Tak

Obiekt reprezentujący film w obiekcie ContinuationCluster.

tvEpisodeEntity

TvEpisodeEntity

Tak

Obiekt reprezentujący odcinek serialu w ramach ContinuationCluster.

Każdy obiekt w tablicy entities musi być jednym z dostępnych typów MediaEntity, czyli MovieEntityTvEpisodeEntity, a także zawierać pola wspólne i specyficzne dla danego typu.

Poniższy fragment kodu przedstawia ładunek treści żądania dla interfejsu API publishContinuationCluster.

{
  "entities": [
    {
      "movieEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "Movie1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/movie1_img1.png",
          "http://www.example.com/movie1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 5400000,
        "last_play_back_position_time_millis": 3241111
      }
    },
    {
      "tvEpisodeEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "TV SERIES EPISODE 1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/episode1_img1.png",
          "http://www.example.com/episode1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 1800000,
        "last_play_back_position_time_millis": 2141231,
        "episode_display_number": "1",
        "season_number": "1",
        "show_title": "title"
      }
    }
  ]
}

Usuwanie danych dotyczących odkrywania filmów

Użyj clearClustersinterfejsu API, aby usunąć dane dotyczące odkrywania filmów.

Użyj adresu URL POST, aby usunąć podmioty z danych o odkrywaniu filmów. Aby usunąć dane klastra kontynuacji, wyślij żądanie POST do interfejsu APIclearClusters, używając tej składni:

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/clearClusters

Gdzie:

  • package_name: nazwa pakietu dostawcy multimediów.
  • accountId: unikalny identyfikator konta użytkownika w Twoim systemie. Musi on odpowiadać accountId używanemu w ścieżce na urządzeniu.
  • profileId: unikalny identyfikator profilu użytkownika na koncie w Twoim systemie. Musi odpowiadać identyfikatorowi profileId używanemu w ścieżce na urządzeniu.

Ładunek interfejsu clearClusters API zawiera tylko jedno pole reason, które zawiera DeleteReason określający przyczynę usunięcia danych.

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

Testowanie

Po przesłaniu danych użyj testowego konta użytkownika, aby sprawdzić, czy oczekiwane treści pojawiają się w wierszu „Oglądaj dalej” na docelowych platformach Google, takich jak Google TV oraz aplikacje mobilne Google TV na Androida i iOS.

Podczas testowania uwzględnij rozsądne opóźnienie propagacji wynoszące kilka minut i przestrzegaj wymagań dotyczących oglądania, takich jak obejrzenie części filmu lub odcinka. Szczegółowe informacje znajdziesz w wytycznych dotyczących funkcji „Obejrzyj następny” dla programistów aplikacji.