こんばんは。おはようございます。
仕事で 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.Stage
の destroy
を明示的に呼ぶ必要があった。4.2 でも存在しているメソッドだったけど、明示的に呼ばないといけないように変更されたみたい。
うちでは再生が完了したときに ActionScript でJSのコールバックを呼ぶようにしているので、そこが呼ばれたら stage.destroy()
するようにしたらうまくいった。
ちなみに
いまの最新は 5.4
です。
5.3, 5.4 は下位互換があるみたいで、更新に気付けず、意図せずに5.2のランタイムを使ってたけど動いていました。
Swiffy の API はドキュメントがないので、プロパティの一覧をみながら一個一個試すか、minify されたランタイムを読むしかない。 だいたいこれを使ってる http://jsbeautifier.org/