Auto hide next up card for Amazon Prime Video v2.11.0/v2.11.1 リリース

JavaScriptchat_bubble0

Amazon Prime VideoのNext up等の邪魔な要素を非表示にする「Auto hide next up card for Amazon Prime Video v2.11.1」をリリースしました。

変更点

v2.11.0

  • xhookが動作する度にユーザーの設定を判定しないように改善
  • 左下に動画の解像度を表示する機能を追加(強制的に最高画質で再生する機能のオプションとして)
  • mpdの識別の改善
  • 広告関連のデータを除去する機能の修正
  • 広告関連のデータを除去する機能が有効な時は広告スキップを実行しないように変更
  • ダイアログ内のツールチップの要素をクリックするとツールチップと同じテキストのアラートを表示するように

v2.11.1

  • 広告関連のデータを除去する機能の修正

通信の監視・改変のためにxhookというライブラリの機能を使用していますが、v2.10.4までは全ての通信に対して毎回ユーザーの設定を判定するという無駄な実装になっていました。v2.11.0ではこれを改善することで僅かにパフォーマンスが向上したと思います。

強制的に最高画質で再生する機能のオプションとして「左下に動画の解像度を表示する機能」を追加しました。プライムビデオはいつの頃からかブラウザで視聴する場合に左下に「HD」と表示しなくなりました。それが以前から気になっていたので、v2.11.0では解像度を表示する機能を追加しました。動画のマニフェストファイルであるmpdファイルから解像度とURLの情報を取得し、再生されるmp4のURLと照合することで解像度を割り出します。最高画質を強制しないとバッファの関係で実際に再生されている動画の解像度と一致しなくなることがあるので、最高画質の強制は必須にしています。

「mpdの識別の改善」については、元々URLの判定と合わせてレスポンスヘッダーの判定もしていたのですが、レスポンスヘッダーのcontent-typeがtext/xmlではないことがあるというパターンを観測したので、そのような場合には中身を見てmpdかどうかを判定するようにしました。私が把握している限りでは再現性の無い非常に稀なパターンですが、数行追加するだけで済むので対処しました。

広告関連のデータを除去する機能については、本編の途中で広告が入るパターンに対応しきれていなかったのでそれに対処しました。mpdでは動画の再生開始位置(start属性)が記述可能で、広告が無い場合は0或いは記述が無く(0扱い)、また動画としては1つの扱いになっています。広告が本編の開始前に再生されるパターンの場合、mpdの中身は「広告」「本編」の順になっています。動画が複数という扱いになり、本編のstart属性は広告の合計時間の直後になっています。このパターンでは広告除去後にstart属性を0にするか消すかで対処できます。v2.10.4ではここまでは対応できていました。

本編の途中で広告が入るパターンの場合、mpdの中身は「本編1」「広告1」「本編2」「広告2」「本編3」のような構成になります。これまではこのパターンに対応できておらず、広告除去後に1つ目以外のstart属性を適切に変更していなかったために動画が途中で止まる可能性があるという問題がありました。v2.11.1ではその問題に対処しました。取れる方法は2つあり、1つがstart属性を適切な値で更新することで、私が取ったのはそちらです。もう1つは全ての動画情報のstart属性を消すことで、その場合おそらくプライムビデオは前から順番に再生するっぽい?です。私はプライムビデオの仕様に沿ったやり方の方が良いと思ったので値を更新する方法を取りましたが、start属性は形式がISO8601のdurationで、いくつか事情があってライブラリを採用せず自力+ChatGPTでパースと秒からの変換を実装したので少し不安が残る状態となっています。完璧な実装とは思っていないので、もし動画が途中で止まるなどの問題が発生した場合は除去の機能は無効にしてください。

「広告関連のデータを除去する機能が有効な時は広告スキップを実行しないように変更」については、除去漏れが発生した場合には広告スキップの精度を保証できないので、意図しないスキップを避けるために変更を加えました。正確には除去漏れというか貫通というべきかもしれませんが…。xhookの問題なのかどうかよく分からないのですが、極々稀に、明らかに除去対象になっているだろうというパターンでも広告が再生されることが私の環境ではあったので…。再現性が無い問題は本当に辛いです。

v2.11.0でダイアログ内のツールチップ周りを改善しました。ツールチップをtitle属性に頼っているのでv2.10.4まではマウスカーソルを当てないと表示されませんでしたが、v2.11.0ではクリックした際にツールチップと同じ内容のアラートを表示するようにしました。title属性に頼らないツールチップを実装することは可能ではありますが面倒なので、手っ取り早くアラートで対処したという感じです。


個人的に分からないことがあるのですが、Next upと合わせて表示されるReactions(好き/好きではない)って今どうなっているんですかね?私の環境では3月下旬辺りから表示されなくなっていてテストできていないんですが…。あれは今年2月辺りから報告があったもののその時点では私の環境では表示されず、3月に入ってようやく表示されるようになったのでv2.5.0で非表示に対応しました。ただ私の環境ではこの記事執筆時点では表示されませんし、何よりReactionsは私が確認できていた時点では要素に分かりやすい名前が付いていなかったのでReactionsだけが該当する条件で取得して非表示といことをやっていて、そこが不安なんですよね…。今も表示されるなら表示される条件が知りたい…。

あと、これはxhookをプライムビデオで使ってみようと考えているユーザースクリプト・拡張機能の開発者向けの情報というか私のメモのようなものですが、xhook.after()を非同期で使う機能はプライムビデオでは使わない方が良いと思います。v2.11.0でxhookが動作する度にユーザーの設定を判定しないように改善するに当たって、ついでに試してみたのですが、プライムビデオの画面で割と高頻度で「That shouldn't have happened. It looks like something went wrong on our side. Let's find you a great video to watch instead.」というエラーが発生しました。非同期ではない実装にしてみるとエラーが出なくなったのでxhook.after()の非同期の機能とプライムビデオの相性が悪いのだと思います。なお非同期の機能を試したのはxhookによる監視・改変の順序を正確に制御したかったためです。今のところは非同期で対応しなくても順番に実行されますが、今後の事を考えると良い方法だと思ったんですけどね…。

ブラウザ拡張機能

藤乃音りょう