TV용 Engage SDK 통합 가이드

이어서 시청하기는 연속 클러스터를 활용하여 여러 앱의 완료되지 않은 동영상과 동일한 TV 시즌에서 시청할 다음 에피소드를 하나의 UI 그룹으로 표시합니다. 이 연속 클러스터에서 해당 항목을 추천할 수 있습니다. 이 가이드를 따라 Engage SDK를 사용하여 이어서 시청하기 환경을 통해 사용자 참여도를 높이는 방법을 알아보세요.

사전 작업

시작하기 전에 다음 단계를 완료하세요.

  1. API 19 이상을 타겟팅하도록 업데이트합니다.

  2. 다음과 같이 com.google.android.engage 라이브러리를 앱에 추가합니다.

    통합에 사용할 SDK는 모바일 앱용과 TV 앱용으로 구분됩니다.

    모바일

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

    TV

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. AndroidManifest.xml 파일에서 Engage 서비스 환경을 프로덕션으로 설정합니다.

    모바일

    
    <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. TV APK에 WRITE_EPG_DATA 권한을 추가합니다.

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. androidx.work와 같은 백그라운드 서비스를 사용하여 안정적인 콘텐츠 게시를 확인합니다.

  6. 원활한 시청 환경을 제공하려면 다음 이벤트가 발생할 때 이어서 시청하기 데이터를 게시하세요.

    1. 첫 로그인: 사용자가 처음 로그인할 때 시청 기록을 즉시 사용할 수 있도록 데이터를 게시합니다.
    2. 프로필 생성 또는 전환(다중 프로필 앱): 앱이 여러 프로필을 지원하는 경우 사용자가 프로필을 만들거나 전환할 때 데이터를 게시합니다.
    3. 동영상 재생 중단: 사용자가 중단한 지점부터 다시 시작할 수 있도록 사용자가 동영상을 일시중지하거나 중지할 때 또는 재생 중에 앱이 종료될 때 데이터를 게시합니다.
    4. 이어서 시청하기 트레이 업데이트(지원되는 경우): 사용자가 이어서 시청하기 트레이에서 항목을 삭제하면 업데이트된 데이터를 게시하여 변경사항을 반영합니다.
    5. 동영상 완료:
      1. 영화의 경우 시청이 완료된 영화를 '이어서 시청하기' 트레이에서 삭제합니다. 영화가 시리즈에 속하는 경우 사용자의 참여를 유도하기 위해 다음 영화를 추가합니다.
      2. 에피소드의 경우 시청이 완료된 에피소드를 삭제하고 시리즈의 다음 에피소드를 추가하여 지속적인 시청을 유도합니다(사용 가능한 경우).

샘플 코드

샘플 앱은 개발자가 동영상 디스커버리 API와 통합하여 맞춤설정된 사용자 데이터를 Google에 전송하는 방법을 보여줍니다. 샘플 앱은 모바일 앱과 TV 앱 모두에서 가져올 수 있는 공통 모듈을 빌드하는 방법, 게시 및 삭제 API를 호출하는 시점, 작업자를 사용하여 게시 및 삭제 API를 호출하는 방법도 보여줍니다.

통합

AccountProfile

Google TV에서 맞춤 '이어서 시청하기' 환경을 허용하려면 계정 및 프로필 정보를 제공하세요. AccountProfile을 사용하여 다음을 제공합니다.

  1. 계정 ID: 애플리케이션 내에서 사용자 계정을 나타내는 고유 식별자입니다. 실제 계정 ID 또는 적절하게 난독화된 버전일 수 있습니다.

  2. 프로필 ID(선택사항): 애플리케이션이 단일 계정 내에서 여러 프로필을 지원하는 경우 특정 사용자 프로필의 고유 식별자(실제 또는 난독화)를 제공합니다.

// 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()

항목 만들기

SDK는 각 항목 유형을 나타내는 여러 항목을 정의했습니다. 연속 클러스터는 다음 항목을 지원합니다.

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

이러한 항목의 플랫폼별 URI와 포스터 이미지를 지정합니다.

아직 만들지 않은 경우 Android TV, Android, iOS와 같은 각 플랫폼의 재생 URI도 만듭니다. 따라서 사용자가 각 플랫폼에서 계속 시청하면 앱은 타겟팅된 재생 URI를 사용하여 동영상 콘텐츠를 재생합니다.

// 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)

포스터 이미지에는 URI와 픽셀 크기(높이 및 너비)가 필요합니다. 여러 포스터 이미지를 제공하여 다양한 폼 팩터를 타겟팅하되, 특히 Google의 엔터테인먼트 스페이스 내에서 '이어서 시청하기' 항목이 올바르게 표시되도록 모든 이미지가 16:9 가로세로 비율과 최소 높이 200픽셀을 유지하는지 확인하세요. 높이가 200픽셀 미만인 이미지는 표시되지 않을 수 있습니다.

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

이 예에서는 모든 필수 필드를 사용하여 MovieEntity를 만드는 방법을 보여줍니다.

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()

장르 및 콘텐츠 등급과 같은 세부정보를 제공하면 Google TV에서 콘텐츠를 더욱 동적으로 표시하고 적합한 시청자에게 연결할 수 있습니다.

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()

만료 시간을 더 짧게 지정하지 않는 한 항목은 자동으로 60일 동안 사용할 수 있습니다. 이 기본 기간 전에 항목을 삭제해야 하는 경우에만 맞춤 만료를 설정하세요.

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

이 예에서는 필수 필드가 모두 포함된 TvEpisodeEntity를 만드는 방법을 보여줍니다.

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()

에피소드 번호 문자열(예: "2")과 시즌 번호 문자열(예: "1")은 이어서 시청하기 카드에 표시되기 전에 해당하는 형식으로 확장됩니다. 숫자만 포함해야 합니다. 'e2' 또는 'episode 2', 's1' 또는 'season 1'을 입력하지 마세요.

특정 TV 프로그램에 시즌이 하나만 있는 경우 시즌 번호를 1로 설정합니다.

시청자가 Google TV에서 내 콘텐츠를 찾을 가능성을 극대화하려면 장르, 콘텐츠 등급, 사용 가능 시간대와 같은 추가 데이터를 제공하는 것이 좋습니다. 이러한 세부정보는 표시 및 필터링 옵션을 개선할 수 있기 때문입니다.

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

다음은 모든 필수 필드를 사용하여 VideoClipEntity를 만드는 예입니다.

VideoClipEntity는 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()

선택적으로 생성자, 생성자 이미지, 생성 시간(밀리초) 또는 사용 가능 시간 창을 설정할 수 있습니다 .

LiveStreamingVideoEntity

다음은 필수 필드가 모두 포함된 LiveStreamingVideoEntity를 만드는 예입니다.

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()

원하는 경우 라이브 스트리밍 항목의 시작 시간, 브로드캐스터, 브로드캐스터 아이콘 또는 사용 가능 시간대를 설정할 수 있습니다.

속성 및 요구사항에 관한 자세한 내용은 API 참조를 확인하세요.

연속 클러스터 데이터 제공

AppEngagePublishClient는 연속 클러스터 게시를 담당합니다. publishContinuationCluster() 메서드를 사용하여 ContinuationCluster 객체를 게시합니다.

먼저 isServiceAvailable()을 사용하여 서비스를 통합에 사용할 수 있는지 확인해야 합니다.

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

서비스가 요청을 수신하면 다음 작업이 한 트랜잭션 내에서 발생합니다.

  • 개발자 파트너의 기존 ContinuationCluster 데이터가 삭제됩니다.
  • 요청 데이터가 파싱되어 업데이트된 ContinuationCluster에 저장됩니다.

오류가 발생하면 전체 요청이 거부되고 기존 상태가 유지됩니다.

게시 API는 upsert API입니다. 기존 콘텐츠를 대체합니다. ContinuationCluster에서 특정 항목을 업데이트해야 하는 경우 모든 항목을 다시 게시해야 합니다.

ContinuationCluster 데이터는 성인 계정에만 제공해야 합니다. AccountProfile이 성인에 속하는 경우에만 게시합니다.

교차 기기 동기화

SyncAcrossDevices 플래그는 사용자의 ContinuationCluster 데이터가 TV, 휴대전화, 태블릿 등의 기기 간에 동기화되는지 여부를 제어합니다. 교차 기기 동기화는 기본적으로 사용 중지되어 있습니다.

값:

  • true: 원활한 시청 환경을 위해 ContinuationCluster 데이터가 모든 사용자의 기기에서 공유됩니다. 최적의 교차 기기 환경을 위해 이 옵션을 적극 권장합니다.
  • false: ContinuationCluster 데이터는 현재 기기로 제한됩니다.

미디어 애플리케이션은 교차 기기 동기화를 사용 설정/중지하는 명확한 설정을 제공해야 합니다. 사용자에게 이점을 설명하고 사용자의 환경설정을 한 번 저장한 후 publishContinuationCluster에 적절히 적용합니다.

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

교차 기기 기능을 최대한 활용하려면 앱이 사용자 동의를 얻고 SyncAcrossDevicestrue로 사용 설정해야 합니다. 이를 통해 콘텐츠가 기기 간에 원활하게 동기화되어 사용자 환경이 개선되고 참여도가 높아집니다. 예를 들어 이 기능을 구현한 파트너는 콘텐츠가 여러 기기에 표시되어 '이어서 시청하기' 클릭수가 40% 증가했습니다.

동영상 디스커버리 데이터 삭제

표준 60일 보관 기간 전에 Google TV 서버에서 사용자의 데이터를 수동으로 삭제하려면 client.deleteClusters() 메서드를 사용하세요. 요청을 수신하면 서비스는 계정 프로필 또는 전체 계정의 기존 동영상 디스커버리 데이터를 모두 삭제합니다.

DeleteReason enum은 데이터 삭제 이유를 정의합니다. 다음 코드는 로그아웃할 때 이어서 시청하기 데이터를 삭제합니다.


// 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()
)

테스트

인증 앱을 사용하여 Engage SDK 통합이 올바르게 작동하는지 확인합니다. 인증 앱은 데이터를 확인하고 브로드캐스트 인텐트가 제대로 처리되는지 확인하는 데 도움이 되는 도구를 제공합니다.

게시 API를 호출한 후 인증 앱을 확인하여 데이터가 올바르게 게시되었는지 확인합니다. 연속 클러스터는 앱 인터페이스 내에 별도의 행으로 표시되어야 합니다.

  • 앱의 Android 매니페스트 파일에서 비프로덕션 빌드에만 서비스 참여 플래그를 설정합니다.
  • Engage Verify 앱 설치 및 열기
  • isServiceAvailablefalse이면 '전환' 버튼을 클릭하여 사용 설정합니다.
  • 게시를 시작하면 게시된 데이터를 자동으로 볼 수 있도록 앱의 패키지 이름을 입력합니다.
  • 앱에서 다음 작업을 테스트합니다.
    • 로그인합니다.
    • 프로필 간에 전환합니다(해당하는 경우).
    • 동영상을 시작한 다음 일시중지하거나 홈페이지로 돌아갑니다.
    • 동영상 재생 중에 앱을 닫습니다.
    • '이어서 시청하기' 행에서 항목을 삭제합니다(지원되는 경우).
  • 각 작업 후 앱이 publishContinuationClusters API를 호출하고 데이터가 인증 앱에 올바르게 표시되는지 확인합니다.
  • 인증 앱에는 올바르게 구현된 항목에 대해 녹색 'All Good' 체크가 표시됩니다.

    인증 앱 성공 스크린샷
    그림 1. 인증 앱 성공
  • 인증 앱은 문제가 있는 항목을 표시합니다.

    인증 앱 오류 스크린샷
    그림 2. 인증 앱 오류
  • 오류가 있는 항목을 해결하려면 TV 리모컨을 사용하여 인증 앱에서 항목을 선택하고 클릭합니다. 특정 문제가 표시되고 검토를 위해 빨간색으로 강조 표시됩니다(아래 예 참고).

    인증 앱 오류 세부정보
    그림 3. 인증 앱 오류 세부정보

REST API

Engage SDK는 iOS, Roku TV와 같은 Android가 아닌 플랫폼에서 일관된 이어서 시청하기 환경을 제공하는 REST API를 제공합니다. 이 API를 사용하면 개발자가 Android 이외의 플랫폼에서 선택한 사용자의 '이어서 시청하기' 상태를 업데이트할 수 있습니다.

기본 요건

  • 먼저 온디바이스 Engage SDK 기반 통합을 완료해야 합니다. 이 중요한 단계를 통해 Google의 사용자 ID와 앱의 AccountProfile 간에 필요한 연결이 설정됩니다.
  • API 액세스 및 인증: Google Cloud 프로젝트에서 API를 보고 사용 설정하려면 허용 목록 프로세스를 거쳐야 합니다. 모든 API 요청에는 인증이 필요합니다.

액세스 권한 얻기

Google Cloud 콘솔에서 API를 보고 사용 설정하려면 계정이 등록되어 있어야 합니다.

  1. Google Workspace 고객 ID를 사용할 수 있어야 합니다. 사용할 수 없는 경우 Google Workspace와 API를 호출하는 데 사용할 Google 계정을 설정해야 할 수 있습니다.
  2. Google Workspace와 연결된 이메일을 사용하여 Google Cloud 콘솔로 계정을 설정합니다.
  3. 새 프로젝트 생성
  4. API 인증을 위한 서비스 계정을 만듭니다. 서비스 계정을 만들면 다음 두 항목이 표시됩니다.
    • 서비스 계정 ID
    • 서비스 계정 키가 포함된 JSON 파일. 이 파일을 안전하게 보관하세요. 나중에 클라이언트를 API에 인증하는 데 필요합니다.
  5. 이제 Workspace 및 연결된 Google 계정에서 REST API를 사용할 수 있습니다. 변경사항이 전파되면 서비스 계정에서 API를 호출할 준비가 되었는지 알림이 전송됩니다.
  6. 위임된 API 호출을 준비하려면 다음 단계를 따르세요.

연속 클러스터 게시

동영상 디스커버리 데이터를 게시하려면 다음 구문을 사용하여 publishContinuationCluster API에 POST 요청을 실행합니다.

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

각각의 의미는 다음과 같습니다.

  • package_name: 미디어 제공업체 패키지 이름
  • accountId: 시스템에 있는 사용자 계정의 고유 ID입니다. 온디바이스 경로에 사용된 accountId와 일치해야 합니다.
  • profileId: 시스템에 있는 계정의 사용자 프로필에 대한 고유 ID입니다. 온디바이스 경로에 사용된 profileId와 일치해야 합니다.

프로필이 없는 계정의 URL은 다음과 같습니다.

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

요청 페이로드는 entities 필드에 표시됩니다. entitiesMovieEntity 또는 TVEpisodeEntity일 수 있는 콘텐츠 항목 목록을 나타냅니다. 필수 필드입니다.

요청 본문

필드

유형

필수 항목

설명

entities

MediaEntity 객체 목록

콘텐츠 항목 목록(최대 5개). 상위 5개만 유지되고 나머지는 삭제됩니다. 사용자가 모든 항목을 시청했음을 나타내기 위해 빈 목록이 허용됩니다.

entities 필드에는 개별 movieEntitytvEpisodeEntity가 포함됩니다.

필드

유형

필수 항목

설명

movieEntity

MovieEntity

ContinuationCluster 내의 영화를 나타내는 객체입니다.

tvEpisodeEntity

TvEpisodeEntity

ContinuationCluster 내의 TV 에피소드를 나타내는 객체입니다.

entities 배열의 각 객체는 공통 필드 및 유형별 필드와 함께 사용 가능한 MediaEntity 유형(MovieEntityTvEpisodeEntity) 중 하나여야 합니다.

다음 코드 스니펫은 publishContinuationCluster API의 요청 본문 페이로드를 보여줍니다.

{
  "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"
      }
    }
  ]
}

동영상 디스커버리 데이터 삭제

clearClusters API를 사용하여 동영상 디스커버리 데이터를 삭제합니다.

POST URL을 사용하여 동영상 디스커버리 데이터에서 항목을 삭제합니다. 연속 클러스터 데이터를 삭제하려면 다음 구문을 사용하여 clearClusters API에 POST 요청을 실행합니다.

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

각각의 의미는 다음과 같습니다.

  • package_name: 미디어 제공업체 패키지 이름입니다.
  • accountId: 시스템에 있는 사용자 계정의 고유 ID입니다. 온디바이스 경로에 사용된 accountId와 일치해야 합니다.
  • profileId: 시스템에 있는 계정의 사용자 프로필에 대한 고유 ID입니다. 온디바이스 경로에 사용된 profileId와 일치해야 합니다.

clearClusters API의 페이로드에는 데이터 삭제 이유를 지정하는 DeleteReason가 포함된 reason 필드 하나만 포함됩니다.

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

테스트

데이터를 성공적으로 게시한 후 사용자 테스트 계정을 사용하여 Google TV, Android 및 iOS Google TV 모바일 앱과 같은 타겟 Google 표시 경로의 '이어서 시청하기' 행에 예상 콘텐츠가 표시되는지 확인합니다.

테스트에서는 몇 분 정도의 적절한 전파 지연을 허용하고, 영화의 일부를 시청하거나 에피소드를 완료하는 등 시청 요구사항을 준수하세요. 자세한 내용은 앱 개발자를 위한 다음 볼만한 동영상 가이드라인을 참고하세요.

다운로드

다운로드하기 전에 다음 이용약관에 동의해야 합니다.

이용약관

Android 소프트웨어 개발 키트 라이선스 계약

1. 소개

1.1 라이선스 계약의 약관에 따라 귀하에게 Android 소프트웨어 개발 키트(라이선스 계약에서는 'SDK'라고 하며 특히 Android 시스템 파일, API 패키지, Google API 부가기능을 포함함)에 대한 라이선스를 부여합니다. 본 라이선스 계약은 귀하의 SDK 사용과 관련하여 귀하와 Google 간에 법적 구속력이 있는 계약을 체결합니다. 1.2 'Android'는 Android 오픈소스 프로젝트(https://source.android.com/에서 확인할 수 있으며 수시로 업데이트됨)에 따라 사용할 수 있도록 만들어진 기기에 대한 Android 소프트웨어 스택을 의미합니다. 1.3 '호환 구현'은 (i) Android 호환성 웹사이트(https://source.android.com/compatibility)에서 확인할 수 있고 수시로 업데이트되는 Android 호환성 정의 문서를 준수하며 (ii) Android 호환성 테스트 모음(CTS)을 성공적으로 통과한 Android 기기를 의미합니다. 1.4 'Google'은 미국 델라웨어주 법률에 의해 조직되었고 미국 법률에 따라 운영되며 1600 Amphitheatre Parkway, Mountain View, CA 94043에 주 사업장을 둔 Google LLC를 의미합니다.

2. 본 라이선스 계약 동의

2.1 SDK를 사용하려면 먼저 라이선스 계약에 동의해야 합니다. 라이선스 계약에 동의하지 않으면 SDK를 사용할 수 없습니다. 2.2 수락을 클릭하거나 SDK를 사용하면 라이선스 계약 약관에 동의하게 됩니다. 2.3 미국 또는 기타 현재 거주 중이거나 SDK를 사용하는 국가를 포함한 국가의 법률에 의거하여 SDK를 받는 것이 금지된 경우에는 SDK를 사용할 수 없으며 본 라이선스 계약을 수락할 수 없습니다. 2.4 귀하의 고용주 또는 기타 법인을 대신하여 본 라이선스 계약을 체결하는 데 동의하는 것은 해당 고용주나 법인을 본 라이선스 계약에 구속하기 위한 충분한 법적 권한이 귀하에게 있음을 진술하고 보증하는 것입니다. 요구되는 법적 권한이 없는 경우 고용주 또는 기타 법인을 대신하여 라이선스 계약에 동의하거나 SDK를 사용할 수 없습니다.

3. Google의 SDK 라이선스

3.1 Google은 라이선스 계약의 약관에 따라 Android 호환 구현을 위한 애플리케이션을 개발하는 목적으로만 SDK를 사용할 수 있도록 귀하에게 제한적이고, 전 세계적으로 사용 가능하고, 로열티가 없고, 양도 불가능하고, 비독점적이며 재판매 불가능한 라이선스를 부여합니다. 3.2 Android 비호환 구현을 포함하여 다른 플랫폼의 애플리케이션을 개발하거나 다른 SDK를 개발하는 데 이 SDK를 사용할 수 없습니다. 물론 이 SDK를 해당 목적에 사용하지 않는다면 Android 비호환 구현을 포함하여 다른 플랫폼의 애플리케이션을 자유롭게 개발할 수 있습니다. 3.3 귀하는 Google 또는 제3자가 SDK에 대한 모든 지적 재산권을 포함하여 SDK에 대한 모든 법적 권리, 명의 및 이권을 보유하고 있다는 점에 동의합니다. '지적 재산권'은 특허법, 저작권법, 영업비밀보호법, 상표법 및 기타 모든 독점적 권한에 따른 모든 권리를 의미합니다. Google은 귀하에게 명시적으로 부여하지 않은 모든 권한을 보유합니다. 3.4 귀하는 라이선스 계약에 명시적으로 허용되지 않은 용도로 SDK를 사용할 수 없습니다. 관련 제3자 라이선스에서 요구되는 경우를 제외하고 귀하는 SDK나 SDK의 어떤 부분도 복사(백업 목적 제외), 수정, 조정, 재배포, 디컴파일, 리버스 엔지니어링, 해체할 수 없으며, SDK의 2차 저작물 제작도 할 수 없습니다. 3.5 오픈소스 소프트웨어 라이선스에 따라 사용이 허가된 SDK 구성요소의 사용, 복제 및 배포에는 라이선스 계약이 아닌 해당 오픈소스 소프트웨어 라이선스의 약관만 적용됩니다. 3.6 귀하는 Google이 제공하는 SDK의 형태 및 특성이 사전 통지 없이 변경될 수 있음에 동의하며, 이전 버전의 SDK에서 개발된 애플리케이션이 이후 버전의 SDK와 호환되지 않을 수 있음에 동의합니다. 귀하는 귀하 또는 사용자에게 사전 통지 없이 SDK(또는 SDK에 포함된 기능) 제공을 (영구적 또는 일시적으로) 중단할 수 있는 재량권이 Google에 있음에 동의합니다. 3.7 라이선스 계약의 어느 부분도 귀하에게 Google의 상표 이름, 상표, 서비스 표시, 로고, 도메인 이름 또는 기타 고유한 브랜드 표시에 대한 사용권을 부여하지 않습니다. 3.8 귀하는 SDK에 첨부되었거나 포함된 저작권 및 상표권을 포함한 모든 독점권 고지를 제거하거나 숨기거나 변경하지 않을 것에 동의합니다.

4. 귀하의 SDK 사용

4.1 Google은 본 라이선스 계약에 따라 귀하(또는 귀하의 라이선스 제공자)로부터 귀하가 SDK를 사용하여 개발하는 모든 소프트웨어 애플리케이션에 있어 해당 애플리케이션에 속한 모든 지적 재산권을 포함하여 어떠한 권리, 명의 또는 이권도 취하지 않을 것에 동의합니다. 4.2 귀하는 (a) 본 라이선스 계약 및 (b) 관련 관할권의 모든 관련 법, 규정 또는 일반적으로 용인된 관행 또는 가이드라인(미국 또는 기타 관련 국가의 데이터 또는 소프트웨어 수출입에 관련된 법 포함)에서 허용하는 용도로만 SDK를 사용하고 애플리케이션을 개발할 것에 동의합니다. 4.3 귀하는 일반 사용자를 위한 애플리케이션 개발 목적으로 SDK를 사용할 경우 사용자의 개인 정보 및 법적 권리를 보호할 것에 동의합니다. 사용자가 사용자 이름, 비밀번호 또는 기타 로그인 정보나 개인 정보를 제공할 경우 귀하는 이러한 정보가 귀하의 애플리케이션에 사용될 것임을 알려야 하며 사용자에게 법적으로 적절한 개인정보처리방침을 제공하고 사용자를 보호해야 합니다. 귀하의 애플리케이션이 사용자가 제공한 개인 정보 또는 민감한 정보를 저장하는 경우 안전하게 저장해야 합니다. 사용자가 애플리케이션에 Google 계정 정보를 제공하는 경우 사용자가 허용한 시기와 허용한 용도에 한하여 사용자의 Google 계정에 액세스하기 위해 계정 정보를 사용할 수 있습니다. 4.4 귀하는 Google 또는 모든 이동통신사를 포함하나 이에 국한되지는 않는 모든 제3자의 서버, 네트워크 또는 기타 재산이나 서비스를 방해, 손상 또는 무단 액세스하는 모든 SDK 관련 활동(애플리케이션 개발 또는 배포 포함)에 참여하지 않는다는 데 동의합니다. 4.5 귀하는 Android 및/또는 Android용 애플리케이션을 통해 제작, 전송 또는 표시하는 모든 데이터, 콘텐츠 또는 리소스 및 이로 인한 모든 활동의 결과(Google이 입을 수 있는 손실 또는 손해 포함)에 대한 책임은 전적으로 귀하에게 있으며, Google은 귀하 또는 제3자에 대해 어떠한 책임도 지지 않는 것에 동의합니다. 4.6 귀하는 라이선스 계약, 관련된 제3자 계약이나 서비스 약관 또는 관련 법률이나 규정에 따른 의무 위반 및 이러한 위반의 결과(Google 또는 제3자가 입을 수 있는 손실 또는 손해 포함)에 대한 책임은 전적으로 귀하에게 있으며, Google은 귀하 또는 제3자에 대해 어떠한 책임도 지지 않는 것에 동의합니다.

5. 개발자 인증 정보

5.1 귀하는 Google에서 귀하에게 발행하거나 스스로 선택할 수 있는 개발자 인증 정보에 대해 비밀을 유지할 책임이 있으며 귀하의 개발자 인증 정보에 따라 개발된 모든 애플리케이션에 대한 책임은 전적으로 귀하에게 있습니다.

6. 개인 정보 보호 및 정보

6.1 SDK를 지속적으로 혁신하고 개선하기 위해 Google은 고유 식별자, 연결된 IP 주소, 소프트웨어 버전 번호, 그리고 SDK에서 사용 중인 도구 및/또는 서비스와 해당 도구/서비스의 사용 방법에 대한 정보를 포함하며 이에 국한되지 않는 소프트웨어의 특정 사용 통계를 수집할 수 있습니다. 이러한 정보가 수집되기 전에 SDK는 귀하에게 이를 통지하고 동의를 구합니다. 동의하지 않을 경우 정보가 수집되지 않습니다. 6.2 수집된 데이터는 SDK 개선을 위해 집계 형식으로 검토되며 Google 개인정보처리방침(https://policies.google.com/privacy)에 따라 관리됩니다. 6.3 SDK 개선을 위해 익명처리되고 집계된 데이터 세트를 Google 파트너와 공유할 수 있습니다.

7. 제3자 애플리케이션

7.1 제3자에서 개발한 애플리케이션이나 제3자에서 제공하는 데이터, 콘텐츠 또는 리소스에 액세스하는 애플리케이션을 실행하기 위해 SDK를 사용하는 경우 귀하는 Google이 이러한 애플리케이션, 데이터, 콘텐츠 또는 리소스에 대해 책임지지 않는다는 것에 동의하는 것으로 간주됩니다. 귀하는 이러한 제3자 애플리케이션을 통해 액세스할 수 있는 모든 데이터, 콘텐츠 또는 리소스에 대한 책임은 전적으로 처음 제공한 사람에게 있으며, Google은 귀하가 이 제3자 애플리케이션, 데이터, 콘텐츠 또는 리소스를 사용하거나 액세스함으로써 발생할 수 있는 어떠한 손실 또는 피해에 대해 책임을 지지 않는다는 것을 이해합니다. 7.2 귀하는 제3자 애플리케이션을 통해 귀하에게 제공되는 데이터, 콘텐츠 및 리소스가 제공업체(또는 이 제공업체를 대신하는 기타 개인 또는 회사)가 소유하는 지적 재산권으로 보호될 수 있다는 점을 인지해야 합니다. 귀하는 관련 소유자가 특별히 그러도록 권한을 명시적으로 부여한 경우를 제외하고 이러한 데이터, 콘텐츠 또는 리소스의 일부 또는 전부를 수정, 임대, 대여, 판매 또는 배포하거나 이를 바탕으로 2차 저작물을 만들어서는 안 됩니다. 7.3 귀하는 귀하의 제3자 애플리케이션, 데이터, 콘텐츠 또는 리소스 사용에 귀하 및 관련 제3자 간의 개별 약관이 적용될 수 있음을 이해합니다. 이 경우 본 라이선스 계약은 이러한 제3자와 귀하의 법적 관계에 영향을 주지 않습니다.

8. Android API 사용

8.1 Google 데이터 API 8.1.1 귀하는 Google에서 데이터를 검색하기 위해 API를 사용하는 경우 이 데이터가 Google 또는 데이터를 제공하는 업체(또는 이 제공업체를 대신하는 기타 개인 또는 회사)가 소유하는 지적 재산권으로 보호될 수 있다는 점을 이해합니다. 이러한 API를 사용하는 경우 추가 서비스 약관이 적용될 수 있습니다. 이 서비스 약관에서 허용하지 않는 한 귀하는 이 데이터의 일부 또는 전부를 수정, 임대, 대여, 판매 또는 배포하거나 이를 바탕으로 2차 저작물을 만들어서는 안 됩니다. 8.1.2 Google로부터 사용자의 데이터를 검색하기 위해 API를 사용하는 경우 귀하는 사용자의 명시적인 동의가 있으며 사용자가 귀하에게 그러도록 권한을 부여한 시기에 한하여 제한된 용도로 데이터를 검색할 수 있다는 점을 이해하고 이에 동의합니다. Android Recognition Service API(https://developer.android.com/reference/android/speech/RecognitionService에 설명되어 있으며 때때로 업데이트됨)를 사용하는 경우 Google이 데이터 프로세서 역할을 하는 제품의 데이터 처리 조항(https://privacy.google.com/businesses/gdprprocessorterms/에서 확인할 수 있으며 수시로 업데이트됨)이 API의 사용에 적용된다는 사실을 인정합니다. 수락을 클릭하면 Google이 데이터 프로세서 역할을 하는 제품의 데이터 처리 조항 약관에 동의하는 것으로 간주됩니다.

9. 본 라이선스 계약의 해지

9.1 본 라이선스 계약은 아래에 제시된 대로 귀하 또는 Google에 의해 해지될 때까지 계속 적용됩니다. 9.2 라이선스 계약을 해지하려면 SDK 및 관련 개발자 인증 정보의 사용을 중단하면 됩니다. 9.3 Google은 다음에 해당하는 경우 언제든지 라이선스 계약을 해지할 수 있습니다. (A) 귀하가 본 라이선스 계약의 조항을 위반한 경우, 또는 (B) 법에 따라 Google이 계약을 해지해야 하는 경우, 또는 (C) Google과 함께 귀하에게 API와 같은 SDK의 특정 부분을 제공한 파트너가 Google과의 관계를 종료하거나 귀하에게 SDK의 특정 부분을 제공 중단하는 경우, 또는 (D) Google이 귀하가 거주하거나 서비스를 이용하는 국가의 사용자에게 더 이상 SDK 또는 SDK의 특정 부분을 제공하지 않도록 결정하거나, Google의 단독 재량권에 따라 Google이 귀하에게 SDK 또는 특정 SDK 서비스를 제공하는 것이 더 이상은 상업적으로 실행 불가능하다고 판단되는 경우 9.4 본 라이선스 계약을 해지해도 귀하와 Google이 혜택을 받거나 적용 대상이 되거나 본 라이선스 계약이 적용되는 동안 증가했거나 무기한으로 계속하기로 명시한 모든 법적 권리, 의무 및 책임은 영향을 받지 않으며, 이러한 권리, 의무 및 책임에는 14.7항의 조항이 계속 무기한으로 적용됩니다.

10. 보증 면책조항

10.1 귀하는 전적으로 본인의 책임하에 SDK를 사용하며 SDK가 Google로부터 어떠한 종류의 보증 없이 '있는 그대로' '이용 가능한 형태 그대로' 제공됨을 명시적으로 이해하고 이에 동의합니다. 10.2 SDK 이용 및 이용 과정에서 다운로드하거나 얻게 되는 모든 자료를 사용하는 것은 본인의 재량에 따르며 이에 대한 위험 부담이 전적으로 본인에게 있으며, 그러한 사용으로 인해 발생하는 컴퓨터 시스템 또는 다른 기기의 손상 또는 데이터 손실에 대한 책임은 전적으로 본인에게 있습니다. 10.3 더 나아가, Google은 상품성, 특정 목적에 대한 적합성 및 비침해의 묵시적 보증 등을 포함하되 이에 국한되지 않고 명시적이든 묵시적이든 모든 종류의 보증 및 조건을 명시적으로 부인합니다.

11. 책임의 제한

11.1 귀하는 데이터 손실을 포함하여 귀하에 의해 발생할 수 있는 직접적, 간접적, 부수적, 특수적, 결과적 또는 징벌적 손해에 대하여, Google이나 그 대표자가 그와 같은 손실 가능성을 사전에 통보받았거나 알고 있어야 했는지와 관계없이 Google, 자회사 및 제휴사 또는 라이선스 제공자가 어떠한 책임 이론에 의해서도 책임을 지지 않는다는 점을 명확하게 이해하고 동의합니다.

12. 배상

12.1 귀하는 (a) 귀하가 SDK를 사용하고 (b) 귀하가 SDK를 사용하여 개발하는 애플리케이션이 다른 사람의 저작권, 상표권, 영업비밀, 상품 외장, 특허권 또는 기타 지적 재산권을 침해하거나 다른 사람의 명예를 훼손하거나 퍼블리시티권 또는 사생활 보호권을 침해하며 (c) 귀하가 라이선스 계약을 준수하지 않아 발생하는 모든 손실, 채무, 손해, 비용 및 경비(합리적인 변호사 수임료 포함)뿐만 아니라 모든 청구, 법적 조치, 소송 또는 절차에 대해 Google, 제휴사, Google과 제휴사의 이사, 간부, 직원 및 대리인을 법에서 허용하는 최대 범위까지 보호하고 배상하며 책임을 면제하는 데 동의합니다.

13. 라이선스 계약의 변경

13.1 SDK의 새로운 버전을 배포할 때, Google은 본 라이선스 계약의 내용을 변경할 수 있습니다. 그러한 변경이 이뤄진 경우, Google은 SDK가 제공되는 웹사이트에 새로운 라이선스 계약 버전을 게재할 것입니다. 14.1 본 라이선스 계약은 귀하와 Google 간의 모든 법적 계약을 구성하며, 귀하의 SDK 사용을 규제하고(별도의 서면 계약을 통해 Google이 귀하에게 제공할 수 있는 모든 서비스는 제외), SDK와 관련하여 이전에 귀하와 Google이 맺은 모든 계약을 완전히 대체합니다. 14.2 귀하는 Google이 라이선스 계약에 포함된 또는 Google이 관련 법에 따라 혜택을 얻는 법적 권리 또는 구제 조치를 실행 또는 행사하지 않더라도 Google의 권리에 대한 공식적인 권리 포기를 의미하지 않으며 Google은 이 권리 또는 구제 조치를 여전히 사용할 수 있음에 동의합니다. 14.3 이 문제에 대한 판결권이 있는 관할 법원이 본 라이선스 계약의 조항을 무효로 판결하는 경우 이 조항은 나머지 계약 조항에 영향을 주지 않고 본 라이선스 계약에서 삭제됩니다. 본 라이선스 계약의 나머지 조항은 계속 유효하며 적용 가능합니다. 14.4 귀하는 Google의 자회사가 라이선스 계약에 있어 제3의 수혜자가 되며 자회사는 혜택(또는 권리)을 주는 본 라이선스 계약의 조항을 직접 시행하고 이에 의존할 자격이 있음을 이해하고 이에 동의합니다. 그 외 다른 회사 또는 개인은 본 라이선스 계약에 대한 제3의 수혜자가 될 수 없습니다. 14.5 수출 제한사항. SDK는 미국 수출 법규 및 규정의 적용 대상입니다. 귀하는 SDK에 적용되는 모든 국내 및 국제 수출 법규 및 규정을 준수해야 합니다. 이러한 법에는 목적지, 최종 사용자 및 최종 용도에 대한 제한사항이 포함됩니다. 14.6 본 라이선스 계약에서 부여된 권리는 상대방의 사전 서면 승인 없이 귀하 또는 Google 중 어느 일방에 의해 양도 또는 이전될 수 없습니다. 또한 귀하 또는 Google은 상대방의 사전 서면 승인 없이 본 라이선스 계약에 따른 책임 또는 의무사항을 위임할 수 없습니다. 14.7 본 라이선스 계약 및 라이선스 계약에 따른 Google과 귀하의 관계는 법 조항 저촉 여부와 상관없이 캘리포니아주 법의 규제를 받습니다. 귀하와 Google은 본 라이선스 계약으로부터 발생하는 모든 법적 문제의 해결을 캘리포니아 샌타클래라 카운티 내에 위치한 전속 관할 법원에 의뢰할 것에 동의합니다. 다만 위 규정에도 불구하고 귀하는 Google이 여전히 모든 관할권에서 강제 구제 조치(또는 동등한 유형의 긴급 법적 구제)를 신청할 수 있음에 동의합니다. 2021년 7월 27일
다운로드

verify_app_multiplatform_public_20250602.apk