Subscribed unsubscribe Subscribe Subscribe

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 がよしなに送られる。便利。