apple tv と slideshow のやりとりをする方法
airshow という apple tv のスライドショー機能に外から画像を入れられるものを作った。
apple tv と airplay でやりとりをするさいに、スライドショー機能を使ったものがあまりないみたいなので、メモ代わりに。 apple tv とやりとりをする場合、下記がまとまっているので参考にする
写真一枚を表示する時とかはこちらから、アクセスするだけなので繋ぎっぱなしにする必用がないけど、スライドショーを行う場合は、 繋ぎっぱなしでやりとりをする。apple tv 側から、画像が必用な際にアクセスが来ます。
handshake
POST /reverse HTTP/1.1 Upgrade: PTTH/1.0 X-Apple-Purpose: slideshow Content-Length: 0 X-Apple-Session-ID: ............ Connection: Upgrade
という感じで apple tv に送るとレスポンスが返ってくる
/slideshows/1
/slideshows/1 に対して put すると slideshow をスタートする
PUT /slideshows/1 HTTP/1.1 Content-Type: text/x-apple-plist+xml X-Apple-Session-ID: .... Content-Length: .... plist ...
body の plist には
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>settings</key> <dict> <key>slideDuration</key> <integer>3</integer> <key>theme</key> <string>Classic</string> </dict> <key>state</key> <string>playing</string> </dict> </plist>
のような xml で送る。この settings の所は GET /slideshow-features で得られる。
GET /slideshows/1/assets/1
上の request が成功すると次は、 apple tv 側から、 GET /slideshows/1/assets/1 というリクエストが来るので、
HTTP/1.1 200 OK Content-Type: application/x-apple-binary-plist Content-Length: .... binary plist ...
という response を返す必用がある。
body の binary plist の所は
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>data</key> <data>.......</data> <key>info</key> <dict> <key>id</key> <integer>1</integer> <key>key</key> <integer>1</integer> </dict> </dict> </plist>
みたいな感じの binary plist で返す必用がある。 plist じゃなくて binary plist なので ruby だと https://github.com/ckruse/CFPropertyList とかで encode をする
あとはこの GET /slideshows/1/assets/1 を返しまくれば slideshow がよしなに送られる。便利。