0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ホバープレビューのシーク中に本編の音が戻る不具合:再生状態と音声許可を分ける

0
Last updated at Posted at 2026-10-16

追記:公式ストアで公開しました(2026-10-29)

Chrome ウェブストア · Microsoft Edge アドオン

ストアから追加してYouTubeを再読み込みするだけで使えます。デベロッパーモードやZIP展開は不要です。全機能無料です。手動版を使っている場合は、重複を避けるため古いコピーを無効にしてください。

はじめに

ブラウザー拡張を作っていて、関連動画プレビューのシークバーを動かすと、ミュートしていたメイン動画の音が戻る不具合に遭遇しました。プレビューはまだ同じサムネイル内にあり、ユーザーも音を消していません。

原因を整理する鍵は、「再生中」と「音を出してよい」を別の状態にすることでした。この記事は、私たちが制作した無料拡張「Preview & Shorts Controls for YouTube」v0.5.2の実装と、Edgeでの実使用テストをもとにした開発メモです。第三者によるレビューではありません。日本語の翻訳・文章整理にはAIを使用しています。

1. pauseをユーザーの離脱と同一視しない

シークや読み込みの途中では、動画が一時停止することがあります。そこで video.paused だけを見て「プレビュー終了→メイン動画のミュート解除」と判断すると、カーソルがサムネイル内にある間もメインの音が割り込んできます。

v0.5.2では、関連プレビューに対する音声の許可を、DOMに記録した状態と動画の識別情報から判定します。audio-guard.js の audible() は、音声オン、対象の一致、音量が正であることを確認します。syncMain() は、この許可があるプレビューの存在を基準にメイン動画のミュートを維持し、paused は終了条件にしません。

状態を分けると、次のように整理できます。

状態 プレビュー音声 メイン音声
新しいカードにホバー ミュート 以前の状態
音声ボタンを押す ユーザー指定音量 一時ミュート
同じプレビュー内でシーク・読み込み 音声許可を保持 一時ミュートを維持
カードから離れる・プレビューをミュート 音声許可を解除 保存した以前の状態に復元

2. 復元先も識別する

メイン動画を一時ミュートする前に、動画要素、ミュート状態、音量、ページURL、src 属性を保存します。復元時は要素が接続されていることと、URL・src が同じことを確認します。

SPAで別の動画へ移動した後に、古いセッションの音量を新しい動画へ書き戻さないためです。これは万能な動画ID判定ではありません。要素・URL・ソースの変更を使った、今回の実装での復元ガードです。

3. シークバー操作でカードのクリック処理を発火させない

サムネイルは通常リンクでもあります。追加したスライダーのクリックがカードへ伝わると、シークするつもりで動画ページへ移動したり、プレビューの後片付けが走ったりします。

volume-controller.js では、自分が追加したコントロールだけを識別し、そのポインター・クリックイベントをキャプチャ段階で処理しています。通常のサムネイルリンクはそのまま残します。離脱判定でも relatedTarget がカード・プレビュー・音量バー・シークバーの内側かを確認します。

スライダーのドラッグ中は目標時刻を保持し、ポインターを離した時点で確定します。ドラッグ以外の入力には120msの待ち時間を入れています。シークを確定した後も音声許可をリセットせず、同じ動画の再生を再開します。

4. 後からミュートするだけでは最初の音を防げなかった

別の問題として、ホバー直後に一瞬だけ音が出ることもありました。再生後のイベントを待ってミュートすると、その前に音が出る可能性があります。

今回の拡張では、ページ側の処理で対象プレビューを限定し、play() 呼び出し前と muted / volume の設定時に音声状態を調整しています。プロトタイプのラッパーを使うため、他の拡張やサイト変更との衝突に注意が必要です。すべての動画へ無条件に適用せず、対象の判定、元の記述子の保持、解除時の復元を入れています。一般的なサイト向けにそのまま移植できる方法ではありません。

5. SPAの後片付けも状態の一部

MutationObserverで追加要素を検知するだけでは不十分でした。ページ移動、タブ非表示、ウィンドウのフォーカス喪失、設定変更でもコントロールと音声許可を整理します。解除処理では監視の切断、イベントの解除、タイマーの消去も行います。

テストでは、通常のホバーだけでなく「音を出す→同じカード内で何度かシーク→外へ移動→別カードへ移動→SPAで別ページへ移動」を確認しました。ユーザーから報告された、関連動画の位置によって再現性が違うケースも比較しました。これは現在の環境での確認であり、YouTubeのすべてのプレイヤー状態を保証するものではありません。

実装と試用

実装は GitHubのextensionディレクトリ に公開しています。この記事で触れた中心ファイルは audio-guard.js と volume-controller.js です。ソースは確認用に公開しており、再利用用のオープンソースライセンスはまだ選定していません。

試す場合は 日本語のインストールガイド を参照してください。PC版Chrome・Edge向けで、現在は上記の公式ストアからインストールできます。GitHubのZIPによる手動インストールも選べます。広告ブロック機能ではなく、YouTubeの内部構造変更で動かなくなる可能性があります。

同じように「読み込み中」と「ユーザーの離脱」を混同して起きた不具合があれば、どの状態を分離したか教えてもらえると嬉しいです。製品の再現報告はGitHub Issuesでも受け付けています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?