Fire App BuilderでのMRSSフィード(iTunesなど)の構成
iTunesなどのサービスで使用される形式仕様(英語のみ)に準拠したiTunes MRSSフィード(英語のみ)を使用する場合は、構成例に従うとセットアップを簡略化できます。Fire App Builderに含まれているサンプルのMRSSフィードでは、Ham Nation(英語のみ)というThis Week in Tech(TWIT)ポッドキャストのフィードが使用されます。このフィードはこちらで公開されています。
MRSSの構成の概要
フィードに含まれている要素がサンプルのiTunesフィードと同じなら、セットアップは簡単です。フィードURLを独自のものに置き換え、TWITの既存のカテゴリーレシピとコンテンツレシピを使用するだけです。
ただし、iTunes MRSSフィードにはさまざまな要素が含まれている可能性があります。サンプルのTWITフィードでは、フィード内のコンテンツ要素が、XPathクエリを通じてカテゴリーレシピとコンテンツレシピのquery
パラメーターとmatchList
パラメーターにマッチングされます。サンプルのTwitTV MRSSフィードと異なるMRSSフィードを使用する場合は、このクエリ構文の一部を調整することが必要になる可能性があります。詳細については、以降の手順で説明します。
url
にYouTube、Vimeo、Dropboxのソースを指定することはできません。ビデオは、アプリからメディアへの直接アクセスを受け入れるホストに配置する必要があります。さらに、アプリでは、前のコードサンプルに記載されているすべての要素をマッチさせる必要があります。たとえば、いずれかの要素(url
など)を省略することはできません。省略した場合はビルドが失敗します。デモ: TWITフィードを使用したFire App Builderの構成
サンプルのTWIT構成を独自のMRSSフィードに入れ替える前に、TWITフィードを使用してFire App Builderをビルドして、その外観と動作を確認しましょう。TWITフィードを使用するようにFire App Builderを構成するには、次の手順を実行します。
-
BasicFileBasedUrlGeneratorConfig.json(アプリのassets > configurationsフォルダ内)を開きます。
url_file
プロパティの値をtwitTvUrlFile.json
に変更します。{ "url_file": "twitTvUrlFile.json" }
-
Shiftキーを2回押して [Search Everywhere] ダイアログボックスを開き、「Navigator.java」と入力してこのファイルを検索します。NAVIGATOR_FILEフィールドの値を
Navigator_TwitTv.json
に変更します。public static final String NAVIGATOR_FILE = "Navigator_TwitTv.json";
これでFire App Builderは、デフォルトのNavigator.jsonではなく、この特定のNavigatorファイルを使用するようになります。
-
[Run App] ボタンをクリックします(Fire TVデバイスでアプリを実行する方法については、ADBを使用してFire TVに接続するを参照してください)。
Fire App BuilderでTWITフィードが読み込まれ、次のように表示されます。
独自のMRSSフィードを使用したFire App Builderの構成
独自のMRSSフィードを使用してFire App Builderを構成する場合、基本的には、TWITフィードを独自のフィードに入れ替え、レシピで同じ要素をマッチさせるだけです。また、いくつかのファイルの名前を変更して、「Twit」ではなく独自のフィード名を反映させることもできます。
-
アプリを構成する前に、iTunes MRSSが実際に検証を通過することを確認します。Cast Feed Validator(英語のみ)にアクセスし、フィードが有効であることを確認します。検証に加えて、Fire App Builderの最小要件を満たすには、フィードに次の要素が必要です。
title
guid
itunes:subtitle
media:content url
media:thumbnail url
これらの要素の実際の例として、サンプルのTWITフィード(英語のみ)を参考にすることができます。これらの要素は、Fire TV UIの
mTitle
、mId
、mDescription
、mUrl
、mCardImageUrl
、mBackgroundImageUrl
の各モデル要素にマッピングされます。有効なiTunesフィードにこれらの要素がない場合は、後でカテゴリーレシピとコンテンツレシピを調整して、類似する要素をターゲットにすることができます。詳細については、以降の手順で説明します。 -
twitTvUrlFile.jsonファイル(アプリのassetsフォルダ内)を複製し、コピーに一意の名前(AcmeUrlFile.jsonなど)を付けます。
ヒント: ファイルを複製するには、ファイル名を右クリックし、[Refactor] > [Copy] の順に選択します。または、ファイルを選択し、Cmd+Cキーを押してコピーして、Cmd+Vキーを押して貼り付けます(Windowsの場合は、Cmdの代わりにCtrlを使用します)。 -
「AcmeUrlFile.json」などの名前を付けたファイルを開き、URLを独自のiTunes MRSSフィードのURLに置き換えます。
{ "urls": [ "http://acmewebsite.come/myfeed.xml" ] }
-
BasicFileBasedUrlGeneratorConfig.json(アプリのassets > configurationsフォルダ内)を開きます。
url_file
の値を、前の手順で作成したファイルの名前(「AcmeUrlFile.json」など)に変更します。{ "url_file": "AcmeUrlFile.json" }
-
Shiftキーを2回押して [Search Everywhere] ダイアログボックスを開き、「Navigator.java」と入力してこのファイルを検索します。NAVIGATOR_FILEフィールドの値を一意の名前(
Navigator_acmemedia.json
など)に変更します。public static final String NAVIGATOR_FILE = "Navigator_acmemedia.json";
これでFire App Builderは、デフォルトのNavigator.jsonではなく、この特定のNavigatorファイルを使用するようになります。
-
Navigator.jsonファイル(app > assets内)を複製し、新しいファイルに、前の手順で使用したものと同じ名前(Navigator_acmemedia.json)を付けます。
-
Navigator_acmemedia.jsonファイル(または前の手順で任意の名前を付けたファイル)を開きます。デフォルトの
globalRecipes
コードには、ハードコードされた特別なカテゴリーが、別のレシピで処理されるコンテンツと共に含まれています。以下に、このセクションを赤色でハイライトして示します。このセクションを削除します。"globalRecipes": [ { "categories": { "dataLoader": "recipes/LightCastDataLoaderRecipe1.json", "dynamicParser": "recipes/LightCastCategoriesRecipe.json" }, "contents": { "dataLoader": "recipes/LightCastDataLoaderRecipe1.json", "dynamicParser": "recipes/LightCastContentsRecipe.json" } }, { "categories": { "name": "Hardcoded Category Name" }, "contents": { "dataLoader": "recipes/LightCastDataLoaderRecipe1.json", "dynamicParser": "recipes/LightCastAllContentsRecipe.json" } } ]
globalRecipes
オブジェクトは次のようになります。"globalRecipes": [ { "categories": { "dataLoader": "recipes/TwitTvDataLoaderRecipe0.json", "dynamicParser": "recipes/TwitTvCategoriesRecipe.json" }, "contents": { "dataLoader": "recipes/TwitTvDataLoaderRecipe0.json", "dynamicParser": "recipes/TwitTvContentsRecipe.json" } } ]
-
同じNavigator_acmemedia.jsonファイルで、以下のファイル名の「TwitTv」という部分を、独自のプロジェクト名を反映するように変更します。
- TwitTvDataLoaderRecipe0.json
- TwitTvCategoriesRecipe.json
- TwitTvContentsRecipe.json
たとえば、アプリの名前がAcmeMediaであった場合、これらのJSONファイルの名前を次のように変更します。
"globalRecipes": [ { "categories": { "dataLoader": "recipes/AcmeMediaDataLoaderRecipe0.json", "dynamicParser": "recipes/AcmeMediaCategoriesRecipe.json" }, "contents": { "dataLoader": "recipes/AcmeMediaDataLoaderRecipe0.json", "dynamicParser": "recipes/AcmeMediaContentsRecipe.json" } } ]
- Android Studioの左ペインにあるファイルの一覧で、TwitTvDataLoaderRecipe0.json、TwitTvContentsRecipe.json、TwitTvCategoriesRecipe.jsonの各ファイル(app > assets > recipes内)を複製するか名前を変更して、前の手順でカスタマイズした名前と同じになるようにします。
- AcmeMediaCategoriesRecipe.jsonファイル(または任意の名前に変更したファイル)を開き、カテゴリーをターゲットにしたクエリがフィードで機能することを確認します。
- XPath Tester(英語のみ)にアクセスします。
- [XML Input] ボックスにXMLフィードを貼り付けます。上部に表示される「This XML file does not appear to have any style information…」というテキストは必ず削除してください。 また、
&
文字(XMLで使用できない文字)は、すべて&
に変更してエスケープする必要があります。 - AcmeMediaCategoriesRecipe.jsonファイルで
query
の値(//item/category/text()
)をコピーし、XPath Testerの [XPath Expression] フィールドに貼り付けます(二重引用符は含めないでください)。 -
[Test XPATH] をクリックします。以下のコードサンプルのような結果が表示されれば、
query
によってフィード内のカテゴリーが正しく識別されています。Text='Technology' Text='Ham Radio' Text='Technology' Text='Ham Radio' Text='Technology' Text='Ham Radio'
クエリでカテゴリーが正しく選択されない場合は、フィードを選択するクエリ構文を調整する必要があります。
名前空間付き要素のターゲット指定<media:category>
のような名前空間付きの要素をターゲットにする場合は、クエリ構文を単純に//item/media:category/text()
に更新できるわけではありません。Fire App BuilderのXMLパーサーでは、XPath式での直接的な名前空間の使用はサポートされません。代わりに、//*[name()='media:category']/text()
を使用します。詳細については、手順7: コンテンツレシピ: queryパラメーターの [XML] タブにある「名前空間付き要素のターゲット指定」セクションを参照してください。
XPathクエリの作成全般の詳細については、手順4: カテゴリーレシピ: queryパラメーターを参照してください。XPathクエリ構文の詳細については、XPath Syntax(英語のみ)またはその他のオンラインリソースを参照してください。
- AcmeMediaContentsRecipe.jsonファイル(または任意の名前を付けたファイル)を開き、コンテンツをターゲットとしたクエリ構文がフィードで機能することを確認します。
- XPath Tester(英語のみ)には、前の手順によって既にフィードが入力されています。
- AcmeMediaContentRecipe.jsonファイルで
query
の値(//item[./category='$$par0$$']
)をコピーし、XPath Testerの [XPath Expression] フィールドに貼り付けます。(二重引用符は含めないでください)。 $$par0$$
変数(標準のXPath構文ではなくFire App Builderに固有の変数)はXPathで認識されないため、カテゴリー名のいずれかに置き換えます。たとえば、//item[./category='Lifestyle']
とします。-
[Test XPATH] をクリックします。以下のコードサンプルのようなアイテムを含む結果が表示されれば、
query
構文によってフィード内のアイテムのコンテンツが正しく識別されています。Element='<item> <title>HN 361: Tonight: Hams Young and Old</title> <itunes:title xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">Tonight: Hams Young and Old</itunes:title> <itunes:episodeType xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">full</itunes:episodeType> <pubDate>Wed, 01 Aug 2018 21:36:19 PDT</pubDate> <itunes:episode xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">361</itunes:episode> <link>https://twit.tv/shows/ham-nation/episodes/361</link> <comments>https://twit.tv/shows/ham-nation/episodes/361</comments> <itunes:author xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">TWiT</itunes:author> <category>Technology</category> <category>Ham Radio</category> <itunes:explicit xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">clean</itunes:explicit> <itunes:subtitle xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> Don Wilbanks interviews 2018 Young Ham of the Year Bryant Rascoll KG5HVO. </itunes:subtitle> <itunes:keywords xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> Ham Radio, arrl, young ham of the year, ham holiday </itunes:keywords> <description> ...
クエリでカテゴリーが正しく選択されない場合は、フィードに合わせてクエリのレシピを調整する必要があります。詳細については、手順7: コンテンツレシピ: queryパラメーターを参照してください。
-
AcmeMediaContentsRecipe.jsonファイル(または任意の名前を付けたファイル)をもう一度開き、
matchList
パラメーターを確認します。デフォルトでは、matchList
パラメーターは次のようになっています。"matchList": [ "title/#text@mTitle", "guid/#text@mId", "itunes:subtitle/#text@mDescription", "media:content/#attributes/url@mUrl", "media:content/media:thumbnail/#attributes/url@mCardImageUrl", "media:content/media:thumbnail/#attributes/url@mBackgroundImageUrl" ]
matchList
パラメーターではXPath式は使用されませんが、構文は似ています。このmatchList
構文の動作について説明すると、matchList
の処理は、query
パラメーターによって返された結果(この例ではフィード内のアイテム)から始まります。したがって、XPath構文を使用してアイテムをターゲットにする必要はありません。アットマーク(
@
)の左側には、ターゲットにするプロパティ(たとえばtitle
)を指定します。アットマーク(@
)の右側には、要素のマッピング先となるFire App Builderモデル要素(たとえばmTitle
)を指定します。matchListパラメーターによるマッピング構文に関する特記
このmatchList
パラメーターの構文では、テキスト、属性、CDATA要素をターゲットにするための特別な手法が使用されています。
- 要素内のテキストをキャプチャするには、#text
を使用します(詳細については、手順8: コンテンツレシピ: matchListパラメーターを参照してください)。
- 要素に指定されている属性をキャプチャするには、#attributes
を使用します(詳細については、手順8: コンテンツレシピ: matchListパラメーターを参照してください)。
-CDATA
要素内のテキストをキャプチャするには、#cdata-section
を使用します(詳細については、手順8: コンテンツレシピ: matchListパラメーターを参照してください)。
- これらの特別なセレクターと、その他のマッチング要件の詳細については、手順8: コンテンツレシピ: matchListパラメーターを参照してください。</li></ul>@
の左側に指定したすべての要素が、フィードのアイテム(つまり、コンテンツレシピのクエリ//item[./category='Lifestyle']
から返された結果)に表示されることを確認します。アイテムには、少なくともtitle
要素、guid
要素、itunes:subtitle
要素、media:content
要素とそのurl
属性、media:content/media:thumbnail
要素とそのurl
属性が必要です。これらのアイテムが存在しない場合や名前が異なる場合は、次の手順に進む前に、ここでマッピングを修正してください。重要: 既に説明したように、フィード要素のurl
にYouTube、Vimeo、Dropboxのソースを指定することはできません。ビデオは、アプリからメディアへの直接アクセスを受け入れ、ファイル拡張子(.mp4など)を使用し、特別な認証を必要としないホストに配置する必要があります。
- [Run App] ボタンをクリックします(Fire TVデバイスでアプリを実行する方法については、ADBを使用してFire TVに接続するを参照してください)。
成功すると、外観はTWIT Ham Nationサンプルアプリに似ていながら、独自のフィードのコンテンツを使用するアプリが完成します。フィードアイテムは、フィード内のcategory
要素に基づいてさまざまなカテゴリーにグループ化されます。同じアイテムに複数のカテゴリーが設定されている場合、そのアイテムは各カテゴリーグループに表示されます。
「Service Unavailable」というメッセージが表示される場合は、Fire App Builderでフィードを解析してUIにマッピングするときに問題が発生した可能性があります。カテゴリーレシピとコンテンツレシピでターゲットにしたすべての要素が、フィード内に存在することを確認してください。必要に応じて、適切な要素がターゲットになるように構文を調整します。
エラーを特定するには、Android Studioの下部にある [Logcat] タブを展開し、「Error」という単語でフィルターを適用します。 メッセージから失敗の理由を探します(「The provided query string is not valid for the given xml」など)。
ロゴの変更方法など、アプリの外観と印象を変更する方法については、アプリのロゴ、アイコン、スプラッシュ画面を変更するを参照してください。