ちなみに

火曜日の空は僕を押しつぶした。

Swiffyと彼女の事情

こんばんは。おはようございます。

仕事で Swiffy を使っているのですが、いろいろ悩まされます。彼女のようにきまぐれで、後戻りを許してくれません。

Swiffy は基本的には 公式サイト で SWF を専用のJSON形式に変換してくれて、これを JS のランタイムに食わせて実行します。 このJSON部分さえ保存しておけば任意のタイミングで実行できるので、ふつうはSWFを指定するとサイトに投げて出力されたHTMLからJSONを抜き出すスクリプトを書いて運用します。

くせものなのはこの変換部分が秘匿されていることで、かつ過去のバージョンが使えないため、バージョンが上ったら強制的に新しいバージョンでしか使えないことです。

え、ふつうの事じゃないかですって。そうですね、僕も最新のを使うのが普通だと思います。しかしながらこいつ。だいたい互換性を捨ててきます。つまり過去のバージョンで変換したJSONを新しいバージョンのランタイムに食わせると動かなかったり、逆に新しいJSONを過去のランタイムに食わせると動かなくなります(こっちは普通ですね)。

よって、全てのSWFを新しいバージョンで変換しなおすか、表示するJSONのバージョンを見て、使うランタイムを切り替えるかする必要がでてきます。(JSONの中に "v": 5.4.0 みたいな感じてバージョン書いてる)

うちではランタイムを切り替える方法を取っていたのですが、同じページに複数のバージョンの動画が混在した場合はどうでしょうか…どかん。ぶつかります。つらいです。

彼女の機嫌を損ねないようにつきあい続けるのか、それとも浮気するのか。
贅沢な悩みはつきません。

閑話休題

今回、5.2のランタイムから5.3 に上げたときに以下の二点が非互換になっていました。

  • 背景を透明にするのに backgroundColor というキーと値を JSON から削除するハックが使えなくなった
  • 再生が終了しても動画が無限に復活する

それぞれ以下のように解決しています。

□ 背景透過

backgroundColor を削除しても背景が透過されずに真っ黒になっていた。

調べてみると swiffy.Stage に backgroundColor というプロパティと setBackground というメソッドが追加されていることが分かり、backgroundColor を見てみると 'rgb(0,0,0)' が変えってきた。もともと指定していないと背景色が rgba(0,0,0,0) のなったので透過されていたが、これでは真っ黒になって当然。 次に stage.setBackground() のように空で setBackground を叩いてみたら、設定がクリアされて、backgroundColor の値が 'rgba(0,0,0,0)' になった。

var container = document.getElementById('swiffyContainer');
var stage = new swiffy.Stage(container, json)
// console.log(stage.backgroundColor); #=> 'rgb(0,0,0)'
stage.setBackground(); // 背景透過
// console.log(stage.backgroundColor); #=> 'rgba(0,0,0,0)'
stage.start();

これでよし。

□ 無限復活

こちらは swiffy.Stagedestroy を明示的に呼ぶ必要があった。4.2 でも存在しているメソッドだったけど、明示的に呼ばないといけないように変更されたみたい。 うちでは再生が完了したときに ActionScript でJSのコールバックを呼ぶようにしているので、そこが呼ばれたら stage.destroy() するようにしたらうまくいった。

ちなみに

いまの最新は 5.4 です。
5.3, 5.4 は下位互換があるみたいで、更新に気付けず、意図せずに5.2のランタイムを使ってたけど動いていました。

Swiffy の API はドキュメントがないので、プロパティの一覧をみながら一個一個試すか、minify されたランタイムを読むしかない。 だいたいこれを使ってる http://jsbeautifier.org/