Podcastに対応して欲しいという話があったので少し調べてみました。RSSやAtomのアイテムにenclosureエレメントを追加してURLやメディアタイプを指定してあるだけなので、ひとまずそのURLを本文中に埋め込むようにしてみました。
生成するメッセージをマルチパートにした上で、message/external-bodyを使って添付ファイル扱いっぽく見せるという方法も考えたのですが、いろいろと面倒そうな上に、メールでこのタイプのメッセージが送られてきたときのセキュリティ上のリスクがいまいち読みきれないので保留にしました。
で、本文に追加されたURLをクリックすると、リンク先のオーディオファイルが開きます。といってもShellExecuteExで単にOSに渡しているだけなので、まずは関連付けられたブラウザにURLが渡され、ブラウザが必要に応じてプレーヤーを起動するという形になります。
Windowsではこれでも良いのですが、Pocket PCで試すと、ブラウザにURLが渡ったときにダウンロードして保存するかどうかを聞いてきてしまい、プレーヤーにURLを渡してくれません。Windows版でもいちいちブラウザを経由するのはいまいちなのでできればプレーヤーに直接URLを渡してしまいたいところです。
ところが、いまいちこの関連付けの方法がわかりません。方向としては、メディアタイプを取得してから、そのメディアタイプに関連付けられているアプリケーションにURLを渡せば良さそうですが幾つか問題があります。
メディアタイプの取得方法
enclosure限定であればtype属性から取得できますが、できれば単なるURLだけでも取得したいところです。HTTPのHEADリクエストを出せば、Content-Typeは手に入りますが無駄が多いのがいまいちです。URLのファイル名部分の拡張子から取得すると、cgiなどの場合に誤検出しそうですし、セキュリティ上のリスクもあります。
関連付けられたアプリケーションがURLを扱えるのかどうかの判定方法
すべてのアプリケーションが引数としてURLを扱えるわけではないので、扱えるかどうかを判定する必要があります。
関連付けの"%L"って何?
Windows Media Playerの関連付けを見ると、"%1"の代わりに"%L"となっているのですがこれはこれに関するドキュメントが見つかりません。
つまり、IEがリンク先を開くときの動作をエミュレートしたいということになるのでしょうか。そもそも、Pocket PCのIEがURLをプレーヤーに直接渡さないということは、このあたりの機能が欠けているということも考えられるのですが…