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 認証用のサービス アカウントを作成します。サービス アカウントを作成すると、次の 2 つのアイテムが作成されます。
    • サービス アカウント ID。
    • サービス アカウント キーを含む JSON ファイル。このファイルは安全に保管してください。これは、後でクライアントを API に対して認証するために必要になります。
  5. Workspace と関連付けられた Google アカウントで REST API を使用できるようになりました。変更が反映されると、サービス アカウントから API を呼び出す準備ができたかどうかが通知されます。
  6. 委任された API 呼び出しを行う準備をするには、こちらの手順に沿って操作します。

継続クラスタを公開する

Engage データを公開するには、次の構文を使用して 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 フィールドに表示されます。entities は、コンテンツ エンティティのリストを表します。このリストは、MovieEntity、TVEpisodeEntity、LiveStreamingVideoEntity、VideoClipEntity の 1 つ以上で構成されます。これは必須項目です。

リクエストの本文

フィールド

型

必須

説明

エンティティ

MediaEntity オブジェクトのリスト

はい

コンテンツ エンティティのリスト(最大 5 個)。上位 5 つのみが保持され、残りは破棄されます。ユーザーがすべてのエンティティの視聴を完了したことを示すために、空のリストを使用できます。

フィールド entities には、個々の movieEntity、tvEpisodeEntity、liveStreamingVideoEntity、videoClipEntity が含まれます。

フィールド

型

説明

movieEntity

MovieEntity

ContinuationCluster 内の映画を表すオブジェクト。

tvEpisodeEntity

TvEpisodeEntity

ContinuationCluster 内のテレビ エピソードを表すオブジェクト。

liveStreamingVideoEntity

LiveStreamingVideoEntity

ContinuationCluster 内のライブ ストリーミング動画を表すオブジェクト。

videoClipEntity

VideoClipEntity

ContinuationCluster 内の動画クリップを表すオブジェクト。

entities 配列内の各オブジェクトは、使用可能な MediaEntity タイプ(MovieEntity、TvEpisodeEntity、LiveStreamingVideoEntity、VideoClipEntity のいずれか)と、共通フィールドおよびタイプ固有のフィールドである必要があります。

次のコード スニペットは、publishContinuationCluster API のリクエスト本文のペイロードを示しています。

{
  "entities": [
    {
      "movieEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "Movie1",
        "platform_specific_playback_uris": [
        {
          "uri": "https://www.example.com/movie_entity_uri_for_android",
          "platforms": [
            "PLATFORM_ANDROID_TV",
            "PLATFORM_ANDROID"
          ]
        },
        {
          "uri": "https://www.example.com/movie_entity_uri_for_iOS",
          "platforms": [
            "PLATFORM_IOS"
          ]
        }
        ],
        "poster_images": [
          {
            "url": "http://www.example.com/movie1_img1.png",
            "width": 1920,
            "height": 1080,
            "accessibility_text": "Movie 1 HD poster"
          },
          {
            "url": "http://www.example.com/movie1_imag2.png",
            "width": 640,
            "height": 360,
            "accessibility_text": "Movie 1 SD poster"
          }
        ],
        "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": [
        {
          "uri": "https://www.example.com/episode_entity_uri_for_android_mobile",
          "platforms": [
            "PLATFORM_ANDROID"
          ]
        },
        {
          "uri": "https://www.example.com/episode_entity_uri_for_android_tv",
          "platforms": [
            "PLATFORM_ANDROID_TV"
          ]
        },
        {
          "uri": "https://www.example.com/episode_entity_uri_for_iOS",
          "platforms": [
            "PLATFORM_IOS"
          ]
        }
        ],
        "poster_images": [
          {
            "url": "http://www.example.com/episode1_img1.png",
            "width": 1920,
            "height": 1080,
            "accessibility_text": "Episode 1 HD poster"
          },
          {
            "url": "http://www.example.com/episode1_imag2.png",
            "width": 640,
            "height": 360,
            "accessibility_text": "Episode 1 SD poster"
          }
        ],
        "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"
      }
    },
    {
      "liveStreamingVideoEntity": {
        "name": "Live Sports Championship",
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "last_engagement_time_millis": 1780978284000,
        "last_play_back_position_time_millis": 1800000,
        "duration_millis": 7200000,
        "platform_specific_playback_uris": [
          {
            "uri": "https://www.example.com/live_streaming_entity_uri_for_android_tv",
            "platforms": ["PLATFORM_ANDROID_TV"]
          }
        ],
        "poster_images": [
          {
            "url": "http://www.example.com/live_stream_image1.png",
            "width": 1920,
            "height": 1080,
            "accessibility_text": "Live Sports Championship Cover Image"
          }
        ],
        "start_time_epoch_millis": 1780976484000,
        "broadcaster": "Global Sports Network",
        "broadcaster_icon": {
          "url": "https://www.example.com/gsports.jpg",
          "width": 512,
          "height": 512,
          "accessibility_text": "Global Sports Network Logo"
        }
      }
    },
    {
      "videoClipEntity": {
        "name": "How to Brew the Perfect Espresso",
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "last_engagement_time_millis": 1780978284000,
        "last_play_back_position_time_millis": 120000,
        "duration_millis": 600000,
        "platform_specific_playback_uris": [
          {
            "uri": "https://www.example.com/video_clip_entity_uri_for_android_tv",
            "platforms": ["PLATFORM_ANDROID_TV"]
          }
        ],
        "poster_images": [
          {
            "url": "http://www.example.com/video_clip_image1.png",
            "width": 1920,
            "height": 1080,
            "accessibility_text": "Espresso Tutorial Cover Image"
          }
        ],
        "created_time_epoch_millis": 1780900000000,
        "creator": "Coffee Enthusiast John",
        "creator_image": {
          "url": "https://www.example.com/image/thumb/creators/john_avatar.jpg",
          "width": 256,
          "height": 256,
          "accessibility_text": "John's Avatar"
        }
      }
    }
  ]
}

Engage データを削除する

clearCluster API を使用して Engage データを削除します。

継続クラスタデータを削除するには、次の構文を使用して clearCluster API に POST リクエストを送信します。

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

ここで

  • package_name: メディア プロバイダのパッケージ名。
  • accountId: システム内のユーザー アカウントの一意の ID。これは、デバイス上のパスで使用されている accountId と一致する必要があります。
  • profileId: システム内のアカウントにおけるユーザーのプロファイルの一意の ID。デバイス上のパスで使用されている profileId と一致する必要があります。

プロフィールのないアカウントの URL は次のとおりです。

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

clearCluster API のペイロードには、reason という 1 つのフィールドのみが含まれます。このフィールドには、データを削除する理由を指定する DeleteReason が含まれます。

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

テスト

データの送信が成功したら、ユーザー テスト アカウントを使用して、想定されるコンテンツが、ターゲットとする Google サーフェス(Google TV、Android および iOS の Google TV モバイルアプリなど)の「続きを見る」行に表示されることを確認します。

テストでは、数分程度の妥当な伝播遅延を許容し、映画の一部を視聴する、エピソードを最後まで視聴するなど、視聴要件を遵守してください。詳しくは、アプリ デベロッパー向けの Watch Next ガイドラインをご覧ください。