步骤6 - 可选: 集成线性电视数据
如果您希望自己的内容在Live(直播)和Search(搜索)选项卡中更具可见度,并减少发送到个人客户设备的数据量,则可以通过目录引入向亚马逊提供您的节目、节目表和电视台。通过线性目录引入,您可以发送单个元数据文件并将其自动发送到所有客户设备,延迟低于基于Gracenote的服务器集成。
如果您已经通过目录引入向亚马逊引入了视频点播 (VOD) 目录,则添加线性电视数据也与之类似。XML格式具有类似的结构,但包含额外的数据,例如用于在用户界面中显示内容的节目表和节目。
添加线性电视目录的注意事项:
- 线性数据集成是可选的。
- 尽管该文件格式补充了现有的VOD格式,但还需要其他步骤上传线性电视数据。如果您已经有了VOD内容的目录,则仍必须为线性电视创建单独的目录。
步骤1: 准备您的线性目录文件
准备线性目录与创建VOD目录文件类似。主要区别在于线性电视独有的额外元素。
- Stations(必填): 对应于您插入Android电视数据库的频道,这些频道会在电子节目指南 (EPG) 中出现。电视台应包含标题、时区和以下图像:
- stationCover: 宽高比为16:9且最低分辨率为1920像素x1080像素的JPEG或PNG。该图像包含电视台品牌,当未提供特定于内容的图像时,该品牌将作为回退显示。
- stationHB: 宽高比为1:1且最低分辨率为400像素x400像素的PNG。图像具有透明背景和浅色电视台品牌,适用于较暗的背景。
- Lineups(必填): 将您的电视台范围限定在特定的国家/地区。您必须用区域声明时间表,以确保您的数据只在应该显示它们的国家/地区中显示。
- Broadcasts(必填): 将电视台与时间表关联,使亚马逊能够确定您的电视台应出现在哪些国家/地区。
- Schedules(必填): 将您在线性目录文件中提供的电影和剧集数据与电视台关联。此信息出现在EPG中。
- Movies、Episodes和Seasons(必填): Fire TV在EPG以及Live和Search中的其他地方显示的核心元数据。标题、描述、内容评级和图像都包含在目录的这一部分中。
有关更多详细信息,请参见步骤1: 创建您的目录文件。
步骤2: 验证您的目录文件
创建目录文件后,必须确保该文件为格式正确的XML文件,并根据CDF架构进行验证。如果目录文件格式错误或目录文件无效,则目录引入服务会予以拒绝。在本地对文件进行验证有助于找出会导致无法成功引入文件的错误。
有关验证的更多信息,请参阅验证目录文件的工具。
步骤3: 针对线性目录引入设置您的AWS账户
目录引入使用亚马逊网络服务 (AWS) 工具上传您的目录,并可管理有权访问用于存储您的目录的工具的用户。在上传目录文件之前,您必须设置自己的AWS账户并与您的亚马逊代表交换账户信息。
您的亚马逊代表为您创建用于线性目录引入的文件夹,并为您提供对AWS S3存储桶的访问权限。由于亚马逊创建了S3存储桶,因此该存储桶不会出现在您的AWS S3控制台中。但是,您可以使用命令行界面 (CLI) 访问该文件夹,在其中可以查看该文件夹的内容并将文件上传到该文件夹。接下来的各部分将提供可用于与S3文件夹交互的命令。
如果您还没有AWS账户,请按照步骤A: 登录或注册AWS账户(仅限新AWS用户)中的说明进行操作。
步骤4: 将您的线性目录上传到亚马逊
将您的目录上传到您的亚马逊代表提供给您的文件夹,例如sample_application/。
键入以下命令,用您的目录文件名替换<catalog_file_name.xml>
,用S3文件夹名称替换<s3_folder_name>
。必须使用--acl bucket-owner-full-control
选项,这样亚马逊才能读取您上传的文件并引入您的目录。
$ aws s3api put-object --body <catalog_file_name.xml> --bucket cdf2-amazon-firetv --key <s3_folder_name>/catalog.xml --region us-east-1 --acl bucket-owner-full-control
--
字符粘贴为双短划线而不是n短划线。此外,请确保使用bucket-owner-full-control
来设置--acl
参数;否则,上传将失败。此命令可成功上传大小不超过2GB的文件。如果成功,AWS CLI会对文件的VersionID、ETag和Expiration显示一组标签。
引入目录后,您会收到一封电子邮件。
步骤5: 将您的应用与线性目录关联
现在,您已成功将线性目录发送到亚马逊,是时候将您的应用与您在目录文件中声明的电视台关联了。
以下代码引用的“外部ID类型”是前几部分中步骤3和4中的S3文件夹名称。例如,如果您的亚马逊代表为您分配了一个名为sample_application的文件夹,则您的外部ID类型将为“sample_application”。
以下代码引用的“外部ID值”对应于您在线性目录文件中发送的电视台的ID。例如,如果您声明了一个ID为abc123的电视台,则外部ID值为“abc123”。
代码示例
/**
* 用于存储外部ID类型的变量,用于匹配的服务元数据。有效类型为
* 下面定义为带有前缀“EXTERNAL_ID_TYPE_”的常量
* 空值或无效数据将导致元数据的服务匹配失败
*/
private final static String EXTERNAL_ID_TYPE = "externalIdType";
/**
* 用于存储外部ID的值的变量,用于匹配的服务元数据。
* 空值或无效数据将导致元数据的服务匹配失败
*/
private final static String EXTERNAL_ID_VALUE = "externalIdValue";
public void fillStationId(ContentValues values) {
try {
String jsonString = new JSONObject()
.put(EXTERNAL_ID_TYPE, "#Actual Id Type#") // 替换为您Amazon Catalog的唯一命名空间,例如"test_cdf2"
.put(EXTERNAL_ID_VALUE, "#Actual Id Value#") // 替换为与频道关联的唯一CDF Station ID,例如"station-001"、"station-child-001"、"station-002"、"station-child-002"、"station-003"、"station-child-003"
.toString();
// 将JSON字符串添加到频道的contentValues
values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, jsonString.getBytes());
} catch (JSONException e) {
Log.e(TAG, "Error when adding data to blob " + e);
}
}
public fun fillStationId(values: ContentValues) {
try {
val jsonString = JSONObject()
.put(
外部ID类型 ,
"#Actual Id Type#"
) // 替换为您Amazon Catalog的唯一命名空间,例如"test_cdf2"
.put(
外部ID类型,
"#Actual Id Value#"
) // 替换为与频道关联的唯一CDF Station ID,例如"station-001"、"station-child-001"、"station-002"、"station-child-002"、"station-003"、"station-child-003"
.toString()
// 将JSON字符串添加到频道的contentValues
values.put(TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA, jsonString.toByteArray())
} catch (JSONException e) {
Log.e(TAG, "Error when adding data to blob " + e)
}
}
companion object {
/**
* 用于存储外部ID类型的变量,用于匹配的服务元数据。有效类型为
* 下面定义为带有前缀“EXTERNAL_ID_TYPE_”的常量
* 空值或无效数据将导致元数据的服务匹配失败
*/
private const val EXTERNAL_ID_TYPE: 字符串 = "externalIdType"
/**
* 用于存储外部ID的值的变量,用于匹配的服务元数据。
* 空值或无效数据将导致元数据的服务匹配失败
*/
private const val EXTERNAL_ID_VALUE: String = "externalIdValue"
}
有关更多详细信息,请参阅插入CDF电视台ID。
后续步骤
完成这些步骤后,您应该能够看到自己的频道。请按照检查点: 在Fire TV的用户界面中显示一个频道中的说明进行操作。
Last updated: 2025年5月5日