name: vacuumtube description: "VacuumTube(/opt/VacuumTube/vacuumtube)を Chromium や playwright ではなく直接 remote debugging(CDP, 既定: http://127.0.0.1:9992)で操作して、YouTube TV のホームや視聴画面から BGM・音楽・ニュース動画を選択/再生する。ユーザーが「BGM再生して」「音楽再生して」「ライブニュース再生して」「国連総会の最新ニュース動画見たい」など依頼したときに使う。"
vacuumtube Skill
VacuumTube を直接操作するためのスキルです。Chromium / playwright-cli を使うのではなく、VacuumTube の Electron/Chromium に対して CDP (Chrome DevTools Protocol) で接続して DOM を読み、動画タイルを選択します。
前提
- VacuumTube 本体:
/opt/VacuumTube/vacuumtube - Remote debugging:
127.0.0.1:9992 - 推奨起動:
~/vacuumtube.sh~/.config/VacuumTube/flags.txtに--remote-debugging-port=9992を設定して起動する
確認(CDP):
curl -fsS http://127.0.0.1:9992/json/version
curl -fsS http://127.0.0.1:9992/json/list | jq '.[] | {type,title,url}'
確認(プロセス/ウィンドウ存在):
pgrep -af '^/opt/VacuumTube/vacuumtube( |$)'
DISPLAY=:1 wmctrl -l | rg -i 'VacuumTube'
重要ルール
playwright-cliや通常の Chromium 操作に逃げない。対象は VacuumTube。- スクリーンショット前提で判断しない。CDP で DOM を見る。
Escを連打しない。- 画面状態によっては終了/想定外遷移の原因になる。
- 戻る/ホーム遷移はまず
location.hashを使う。
- VacuumTube 設定オーバーレイ(
#vt-settings-overlay-root)が重なっている場合がある。- DOM で存在判定し、必要なら
display:none/visibility:hiddenで一時的に退避してからタイル選択する。
- DOM で存在判定し、必要なら
典型ユースケース
BGM再生して音楽再生してライブニュース再生して国連総会の最新ニュース動画見たい
基本ワークフロー(推奨)
:9992の CDP エンドポイントを確認json/listからyoutube.com/tvのpagetarget を取得- CDP (
Runtime,Page, 必要ならInput) を有効化 - 現在ルートを確認
location.hashが#/watch?...なら、必要に応じてlocation.hash = '#/'でホームへ戻す
- DOM を横断(shadow DOM 含む)して
ytlr-tile-rendererを列挙 - 可視タイルだけを抽出し、要求に応じてスコアリング
- 選択
- まず DOM の
tile.click()/focus() - 反応しない場合はタイル中心座標へ
Input.dispatchMouseEvent
- まず DOM の
location.hashが#/watch?v=...に変わったら成功- 必要なら再生状態を確認(ただし選択直後の
paused=trueは瞬間値のことがある)
起動・停止(実務向け)
既存プロセスの停止
pkill -TERM -f '^/opt/VacuumTube/vacuumtube( |$)' || true
tmux でバックグラウンド起動(推奨)
VacuumTube を長時間運用する場合は、tmux でデタッチ起動しておくと安定します。
tmux new-session -d -s vacuumtube-bg \
"bash -lc 'export VACUUMTUBE_DISPLAY=:1; export XAUTHORITY=\"$HOME/.Xauthority\"; exec ~/vacuumtube.sh'"
確認:
tmux ls | rg '^vacuumtube-bg:'
pgrep -af '^/opt/VacuumTube/vacuumtube( |$)'
curl -fsS http://127.0.0.1:9992/json/version
起動直後の初期化(起動操作の完了条件)
VacuumTube の「起動操作」は、プロセス起動だけでなく次の 2 点まで含める。
- 起動直後のアカウント選択画面で
YuisekinTVを選ぶ - VacuumTube ウィンドウをデスクトップ右上に配置する
1) アカウント YuisekinTV を選択
- 起動直後は YouTube TV のアカウント選択画面になることがある
- 画面文言の目安:
アカウントを追加,ゲストとして視聴 YuisekinTVの表示は DOM 上でYui ekinTVのように空白分割されることがある(厳密文字列一致に依存しない)
実務上の安定手順:
- まず CDP でアカウント選択画面か判定
- 起動直後の既定フォーカスが
YuisekinTVなら、Enter1 回で選択 - 成功判定は、アカウント選択文言が消え、ホーム画面文言(例:
あなたへのおすすめ)が出ること
補足:
- DOM から
YuisekinTV要素を直接引けない場合がある(テキスト分割/特殊レンダリング) - その場合は
Enterによる既定フォーカス選択を優先する
2) 右上に移動(desktop-windows-layout スキル併用)
起動後は desktop-windows-layout スキルの手順で右上タイルに配置する。
export DISPLAY=:1
WIN_ID=$(wmctrl -l | awk '/VacuumTube$/ {print $1; exit}')
xdotool windowactivate --sync "$WIN_ID"
timeout 2s qdbus org.kde.kglobalaccel /component/kwin \
org.kde.kglobalaccel.Component.invokeShortcut \
'Window Quick Tile Top Right' default || true
wmctrl -lG | awk -v id="$WIN_ID" '$1==id {print}'
期待値(この環境の実測):
X=2048, Y=28, WIDTH=2048, HEIGHT=1052
これで「VacuumTube 起動操作完了」として扱う。
tmux 起動でハマりやすい点
tmuxサーバーが SSH/X11 forwarding のDISPLAY=localhost:10.0を保持していることがある- そのまま
~/vacuumtube.shを起動すると、VacuumTube がlocalhost:10.0を使おうとして失敗する - 実測エラー例:
Missing X server or $DISPLAY
- そのまま
- 対策:
VACUUMTUBE_DISPLAY=:1を明示する(上記コマンド)- 必要に応じて
XAUTHORITY="$HOME/.Xauthority"も明示する
失敗時のログ確認用(セッションが即終了する場合):
tmux new-session -d -s vacuumtube-bg-debug \
"bash -lc 'export VACUUMTUBE_DISPLAY=:1; export XAUTHORITY=\"$HOME/.Xauthority\"; ~/vacuumtube.sh; ec=$?; echo EXIT:$ec; sleep 20'"
tmux capture-pane -pt vacuumtube-bg-debug:0 -S -80
画面状態の判定(CDP / Runtime.evaluate)
最低限見る値:
location.href,location.hashdocument.titledocument.activeElement?.tagNamedocument.body?.innerText(先頭だけ)#vt-settings-overlay-rootの可視状態ytlr-tile-renderer(可視タイル数とタイトル文字列)
動画要素の確認(任意):
const v =
window.yt?.player?.utils?.videoElement_ || document.querySelector("video");
取得項目:
v.pausedv.currentTimev.mutedv.volume
注意:
- 選択直後は
paused=true,currentTime=0,muted=trueが見えることがある - ユーザー体感で再生されていれば、route 遷移確認を優先して成功扱いにしてよい
選択ロジック(ヒューリスティック)
1) BGM / 音楽
優先キーワード(加点):
ambient,ambience,relax,study,focus,music,bgm,lofi,jazz,piano,sleep,atmosphere,chilldeep focus,flow state,serene,ethereal,winter,hyperflow
除外(減点):
news,速報,総理,国会,ウクライナなどニュース系
2) ライブニュース / 最新ニュース
優先キーワード(加点):
live,news,breaking,ライブ,速報,会見,ANN,TBS,NHK,BBC,Reuters- 要求語に合わせる:
国連,国連総会,停戦,ウクライナなど
鮮度の目安(加点):
minutes ago,hours ago,分前,時間前,live
除外(減点):
- 長尺 BGM / ambience / focus music など
国連総会など、具体トピック要求の扱い
優先順:
- ホーム可視タイルに該当トピックがあるか CDP DOM で確認して再生
- 可視タイルになければ、ホーム内の非可視タイル(DOM上に存在)をスコアリングして選択
- それでも無ければ、外部検索/YouTube検索で動画IDを特定して
location.hash = '#/watch?v=<VIDEO_ID>'を使う
補足:
- 「最新」を求められた場合は、タイトルだけでなく
○分前/○時間前等の表示を優先する - 取得結果が曖昧なら、候補を 2-3 件提示して確認を取る
クリック手順(実務上のコツ)
- DOM
click()が効かないことがある - その場合、タイル中心座標に対して CDP の mouse event を送ると通りやすい
- 先に
wmctrl -a VacuumTubeで前面化しておくと安定しやすい
例(前面化):
DISPLAY=:1 wmctrl -a VacuumTube
よくある失敗と対処
curl http://127.0.0.1:9992/json/versionが失敗:- VacuumTube が remote debugging なしで起動している
~/vacuumtube.shで起動し直すtmux起動時はVACUUMTUBE_DISPLAY=:1指定を確認
json/listにyoutube.com/tvがない:- 起動直後の読み込み途中。数秒待って再試行
- クリックしても遷移しない:
- DOM
click()→ 座標クリックの順で試す
- DOM
- 画面がおかしい / タイルが少ない:
- VacuumTube の設定オーバーレイが重なっていないか確認
Escで戻れない/変な画面になる:Esc多用をやめてlocation.hash = '#/'を優先
実行時に見るべき最低限の成功条件
location.hashが#/watch?v=...になったdocument.body.innerText先頭が視聴画面らしい表示(再生時間/概要/チャンネル登録など)に変化した- (任意)
video.currentTimeが増加、またはユーザー体感で再生確認済み
ローカル参照
- VacuumTube ソース:
repos/_youtube/VacuumTube - 手動起動スクリプト:
~/vacuumtube.sh - 本体バイナリ:
/opt/VacuumTube/vacuumtube