前回のエントリーからテストを重ね、わかったことなどを書きます。
まず作成中の拡張機能について。
YouTubeの動画を流す時、音量の平均値を計算し、その結果を元にスレッショルド(しきい値)を設定し、スレッショルドを超える音量が来た場合に自動で抑えてくれる機能。
絶対的に規定以上の音量を抑えるのではなく、突発的な大きい音を軽減する目的。
問題1
スレッショルドを大きく超える値が連続して飛んできた場合、例えば動画途中からBGMがかかりスレッショルドを超え続けるなど、音量がスレッショルド以下にならなければ機能がトリガーされたままになってしまう。このような音量の増加は上記の「突発的な大きい音」には当らないので、なんとかして機能を外す方法が必要となる。
対策案1
機能の作動時間を秒数で決めてしまう。簡単な解決策だが機能が外れた時に大きな音量が継続している場合、またトリガーされてしまい音量は意味なく上下されることになり不快である。
対策案2
機能がホールドされている間、スレッショルドを少しずつ上げていく。
スレッショルドがいずれ音量を上回るので、機能が外れることになる。
(音量の平均値の計算はスレッショルド以下の数値を確認してから始まるようにしているので、こういう処置になりました)
この対策をすると、機能が外れた時点でスレッショルドが十分に高くなっているので、音量の平均値の再計算が邪魔されることなく機能が正常に作動する。
以上です、当然対策案の2を採用しました。そもそもユーザーがボリューム上げる可能性だってありましたもんね 笑
機能がホールドされるのを防ぐ処置は必須でした。
さて、これで調子良く動作したのですが...
YouTube用の拡張機能は中々クセモノで、以前からYouTubeのトップページから動画試聴ページに移動する時に問題が発生しています。
今回の機能が作動して欲しいのは当然、動画試聴ページの方だけなのですが、そのためにマニフェストファイルというものに、URLを指定するのです。
こんな感じの書式になります。
"content_scripts": [
{
"matches": ["https://*.youtube.com/*"],
"js": [
"content.js"
]
}
],
matches の所に作動して欲しいページを指定、*.youtube.com/*から始るURLの時だけcontens.jsを動かしてね、ということなんですが、このままだとトップページでも作動してしまいます。
動画試聴ページのURLは 'youtube.com/watch?v=' こうなっていますので、そのように指定するのですが...ダメなんですよねぇ、トップページで作動しようとしてしまいます。
別に全ページで作動させればいいじゃん、って思うじゃないですか?
YouTubeではAjaxを利用してページの一部分だけ読み込みをし直す手法を取っているんです。一度エラーが出てしまうと無理をしない限りもう一度機能をトリガーさせられません。
そこで MutationObserver という機能でタイトルが変わった時を察知させようとしたり頑張ってるんですがねぇ...何故かトップページから動画試聴ページに初めて飛ぶ時だけが上手くいかないんです。動画ページでリロードすると以降はうまく作動するんですけど。
どうやら憎きクロスオリジン系のエラーが出ているそうです、狙った通りに作動するまで公開はお預けになりそうです。残念。