開発者コンソール

共通のおすすめを送信する


共通のおすすめを送信する

アプリを起動すると、Fire App Builderはメディアフィードから共通のおすすめのリストを読み取り、Fire TVのホーム画面の [ダウンロード済みアプリからのおすすめ] 行に送信します。この記事では、共有のおすすめを設定する手順について詳しく説明します。

簡単にまとめると、フィードにglobalRecommendations要素を追加します。次に、新しいレシピでこのglobalRecommendations要素をターゲットにします。そのレシピとデータローダーを参照するセクションをNavigator.jsonファイルに追加します。

おすすめに関する全般的な情報については、おすすめ機能の概要を参照してください。

共通のおすすめの構成

  1. フィード内に、そのフィード全体に対する1つのglobalRecommendationsプロパティを追加して、コンテンツID文字列の配列を指定します。コンテンツID文字列の配列は、おすすめのメディアに関連している必要があります。

    たとえば、フィードがJSON形式の場合、globalRecommendationsプロパティは次のようになります。

    {
    "items": [
      {
        "id": "162270",
        "title": "Thai Recipes - Thai Chicken Noodles Recipe",
        "description": "Thai Recipes - Thai Chicken Noodles Recipe",
        "duration": "355",
        "thumbURL": "http:\/\/l2.cdn01.net\/\_thumbs\/0000162\/0162270\/0162270__015f" type="jpg",
        "imgURL": "http:\/\/l2.cdn01.net\/\_thumbs\/0000162\/0162270\/0162270__015f" type="jpg",
        "videoURL": "http:\/\/media.cdn01.net\/802E1F\/process\/encoded\/video_1880k\/0000162\/0162270\/D8HFLX0AC.mp4?source=firetv&channel_id=6341",
        "categories": [
          "International Cuisine"
        ],
        "channel_id": "6341",
        "recommendations": [
          "162269",
          "162266",
          "162265",
          "162264"
        ]
      },
    
      ...
    
        ],
        "globalRecommendations": [
          "99605",
          "99551",
          "99570",
          "99580",
          "112683"
        ]
      }
    

    フィードがXML形式の場合は、次のようになります。

    ...
    <item>
        <title>サンプルタイトル</title>
        <pubDate>Wed, 26 Oct 2016 20:34:22 PDT</pubDate>
        <link>https://example.com/myshow/episodes/110</link>
        <author>サンプル作者名</author>
        <category>テクノロジー</category>
        <category>ガジェット</category>
        <recommendations>
          <guid>162269</guid>
          <guid>162266</guid>
          <guid>162265</guid>
          <guid>162264</guid>
        </recommendations>
     </item>
         <globalrecommendations>
              <guid>99605</guid>
              <guid>99551</guid>
              <guid>99570</guid>
              <guid>99580</guid>
              <guid>112683</guid>
          </globalrecommendations>
      ...
    

    共通のrecommendationsプロパティは、フィード内の任意の場所に記述でき、globalRecommendations以外の名前を使用することもできます。ただし、コンテンツは文字列の配列である必要があります。以降の手順では、この要素を対象にするクエリをレシピに記述します。

    iTunesの仕様に準拠するMRSSフィードでは、XMLで使用するカスタム名前空間を定義する必要があるため、カスタム要素を追加するには、より多くのコーディングが必要になる可能性があります(XMLにカスタム名前空間を追加する手順については、このドキュメントでは説明しません)。

  2. Navigator.jsonで、次のように、globalRecipesオブジェクトの後にrecommendationRecipesオブジェクトを追加します。

    ...
    "globalRecipes": [
       {
         "categories": {
           "dataLoader": "recipes/LightCastDataLoaderRecipe1.json",
           "dynamicParser": "recipes/LightCastCategoriesRecipe.json"
         },
         "contents": {
           "dataLoader": "recipes/LightCastDataLoaderRecipe1.json",
           "dynamicParser": "recipes/LightCastContentsRecipe.json"
         }
       }
     ],
     "recommendationRecipes": [
       {
         "contents": {
           "dataLoader": "recipes/LightCastDataLoaderRecipe1.json",
           "dynamicParser": "recipes/LightCastGlobalRecParserRecipe.json"
         }
       }
     ],
    ...
    

    (コードサンプル内の省略記号(...)は、これが抜粋であり、残りのコードが省略されていることを示しています。省略記号はコードにコピーしないでください。)

    dynamicParserプロパティで参照されるファイルでは、フィード内の共通のおすすめを特定して処理するレシピを指定します。

  3. recommendationRecipesオブジェクトで、dataLoaderの値を、globalRecipesオブジェクト内で使用した同じデータローダーファイルへの参照に置き換えます。たとえば、recipes/AcmeDataLoaderRecipe1.jsonのように指定します(詳細については、メディアフィードを読み込むを参照してください)。
  4. recommendationRecipesオブジェクトで、dynamicParserの値を、カスタム名を持つ新しいレシピファイルへの参照に置き換えます。たとえば、recipes/AcmeGlobalRecParserRecipe.jsonのように指定します。その後、このファイルをアプリのassets > recipesフォルダに作成します。
  5. (任意)アプリから送信する共通のおすすめの数を制限するには、次のように、Navigator.jsonでnumberOfGlobalRecommendationsプロパティ(config内)を使用して制限を指定します。

    "config": {
      "showRelatedContent": true,
      "useCategoryAsDefaultRelatedContent": true,
      "searchAlgo": "basic",
      "numberOfGlobalRecommendations": 3,
      "numberOfRelatedRecommendations": 3
    }
    

    この数が、アプリから送信できる共通のおすすめの合計数の上限になります。おすすめがこの数に達すると、更新のタイミング(6時間ごと、またはアプリが再起動されたとき)まで、アプリはそれ以上の共通のおすすめを送信しなくなります。

    Fire TVに [ダウンロード済みアプリからのおすすめ] 行が表示されるには、すべてのアプリを合わせて5件以上のおすすめが送信される必要があります。ここで共通のおすすめの数を指定しなかった場合は、デフォルトで5が使用されます。

  6. 手順4で作成した共通のおすすめの解析レシピ(AcmeGlobalRecParserRecipe.jsonなど)を開き、次のレシピを挿入します。

    {
    "cooker": "DynamicParser",
    "format": "json",
    "model": "java.lang.String",
    "modelType": "array",
    "query": "$.globalRecommendations[*]",
    "matchList": [
      "StringKey@ModelValue"
      ]
    }
    

    このレシピについて、以下に少し詳しく説明します。

    • このレシピで想定されているformatjsonです(フィードがXML形式の場合は、formatの値をjsonからxmlに変更します)。
    • このレシピで想定されているmodelStringです。
    • modelTypearrayに設定されているため、Fire App Builderは、このレシピから文字列配列が返されることを想定します。
    • queryから文字列のリストが返されると、matchListパラメーターにより、StringKeyを使用して文字列が直接マッチングされます。Fire App Builderは、これらの文字列をモデルにマッピングします。

    (これらの設定は、共通のおすすめのクエリがJSON形式の文字列配列に一致する限り重要ではありません。一致しない場合は、レシピの設定を適宜調整できます。詳細については、レシピ構成の概要を参照してください。)

  7. queryの値をカスタマイズして、フィード内のrecommendationsプロパティをターゲットにします。

    JSONを使用している場合は、クエリにJayway JsonPath(英語のみ)の構文を使用します。フィードがXMLの場合は、XPath式(英語のみ)を使用します。

    これらのクエリを作成する方法については、カテゴリーレシピをセットアップするqueryパラメーターのセクションを参照してください。

    上に示したサンプルのqueryの場合、$.globalRecommendations[*]というクエリは、ルートディレクトリからglobalRecommendations配列を検索し、配列内のすべての要素を選択します(前述のXMLフィードを使用した場合のクエリは、//globalrecommendations/guid/text()のようになります)。 すべての階層から再帰的にglobalRecommendationsオブジェクトを検索するクエリが必要な場合は、$..globalRecommendations[*]を使用します。

  8. クエリでglobalRecommendations要素が正しくターゲットになっていることを確認するには、オンラインのエバリュエーターでクエリをテストします。

    • JSONフィードの場合は、Jayway JsonPath Evaluator(英語のみ)を使用してクエリをテストします。
    • XMLフィードの場合は、XPath Evaluator(英語のみ)を使用してクエリをテストします。

    クエリの結果がコンテンツID文字列のリストになっている必要があります。Fire App Builderは、これらのコンテンツIDを使用しておすすめを作成します。

    アイテムにAmazonエクストラ(年齢レーティングなど)が含まれている場合は、それらのエクストラがおすすめと共に送信されます。

    共通のおすすめは、アプリの起動時に1回送信されるほか、アプリを開いているときにフィードが更新されたタイミングでも送信されます。フィードの更新間隔は、DataLoadManagerConfig.jsonファイル(アプリのassets > configurationsフォルダ内)にある値に関連付けられています。このファイル内でのプロパティは"data_updater.duration": 14400(4時間)です。また、12時間ごとにデバイスのスリープを解除し、おすすめを更新するアラームも設定されています。

共通のおすすめのテスト

おすすめをテストする一般的な手順については、Fire TVのドキュメントの おすすめ機能をテストする方法を参照してください。

Fire TVの [ダウンロード済みアプリからのおすすめ] 行は、Fire App Builderアプリでは制御できません。ただし、Android Studioのログを確認すれば、アプリがおすすめを作成して送信していることがわかります。

アプリを起動した後、Android Studioで画面の下部にある [Android Monitor] をクリックし、「recommendation」という単語でフィルターを適用します。共通のおすすめが作成され、送信されていることをログで確認できます。以下に例を示します。

03-24 18:39:09.365 18717-18757/com.amazon.android.calypso D/RecommendationTable: record updated in database: RecommendationRecord{mContentId='99570', mRecommendationId=4, mType='Global'}
03-24 18:39:09.368 18717-18757/com.amazon.android.calypso D/RecommendationSender: Built recommendation - Consuming Passions Chips Recipe | Belgian Style

mType='Global'は、送信されたおすすめが共通のおすすめであることを示します。

テストでは、Navigator.jsonファイルで設定した上限を超えておすすめが送信されることはありません。たとえば、Navigator.jsonで次のように指定されているとします。

"numberOfGlobalRecommendations": 3

この場合、globalRecommendationsのリストに5つのコンテンツIDが含まれていたとしても、送信されるおすすめは3つだけです。

古いおすすめの削除

ユーザーが [ダウンロード済みアプリからのおすすめ] 行のビデオをクリックして最後まで(一部ではなく)視聴すると、Fire App Builderはそのビデオを視聴済みとしてマークし、対応するアイテムをおすすめから削除します。この履歴はFire App Builderのデータベースに保存されます。

ただし、6時間が経過してFire App Builderが更新されると、ユーザーがそのコンテンツを視聴済みの場合でも、同じ共通のおすすめが再度送信されます。より高度なロジックを実装するには、共通のおすすめをフィードで管理し、定期的に調整する必要があります。

次のステップ

次のトピックの関連のおすすめを送信するに進みましょう。関連のおすすめでは、ユーザーが視聴したメディアごとに固有のおすすめを送信します。