【WezTerm】【小ネタ】jq と media-control のワンライナーで再生中の曲名をステータスラインに表示する

以前 tmux のステータスラインに曲情報を表示するというのをやっていたのですが、WezTerm に戻ってきたので、それ用にメンテナンスしました。

tmux のステータスラインに再生中の曲名を表示する

前置き 年末からターミナルを wezterm から ghostty に置き換えてみてるのですが、そのついでに tmux も導入してみています。 tmux にはテーマとして dracula 入れており、ステータスラインに可愛くバッテリーや CPU の状態を表示してくれて気に入っています。 ただ、どの数値もそこまで変化があるわけではなく、寂しい感じがしたので、再生中の曲名を表示するようにしてみました。 デフォルトの設定だと以下のような見た目になります。( README の画像を引用) 曲名を表示するスクリプトの作成 このあたりは特に tmux とかは関係ないです。 Music アプリの曲名だけでよければ、 osascript で取得できます。 $ osascript -e 'tell application "Music" to if player state is playing then name of current track & " - " & artist of current track' 月並みに輝け - 結束バンド 今回はブラウザで再生している YouTube の曲名なども取得したかったので、別のツールを使いました。 使用したのは nowplaying-cli というツールです。 GitHub - kirtan-shah/nowplaying-cli: macOS command-line utility for retrieving currently playing media macOS command-line utility for retrieving currently playing media - GitHub - kirtan-shah/nowplaying-cli: macOS command-line utility for retrieving currently playing media github.com nowplaying-cli について brew で導入可能で、get xxx で曲名やアーティスト名を取得できます。

blog.nabekou29.com

以前はシェルスクリプトを組んでいたのですが、WezTerm だとあまり都合が良くないため、ワンライナーで動くコマンドを作りました。

また、以前使用していた、nowplaying-cli が新しめの macOS (多分 Sequoia 以上 )で動かないため media-control に乗り換えました。

結論

Terminal window
media-control get -h | jq -r '
def truncate(n): if length > n then .[0:(n-3)] + "..." else . end;
if .playing then
"🎵 \(.title) - \(.artist)" | truncate(35)
else
"🚫"
end'

実行すると以下のようになります。実際には絵文字部分は Nerd Font のアイコンを使ってます。

Terminal window
# 再生中
> 🎵 Daydream café - 山田リョウ
# 再生中 (曲名やアーティスト名が長い場合)
> 🎵 空想ルンバ - 大槻ケンヂと絶望少女達 (野中藍, 井上麻里...
# 停止中
> 🚫

WezTerm での設定

wezterm.run_child_process で任意のコマンドを実行できるのですが、PATH が読み込まれないため brew で入れているコマンドはフルパスで指定するなどの工夫が必要です。

他にもいろいろやりようあるっぽいのですが、今回はシンプルにフルパスで指定してます。

local music_info = ""
-- wezterm.run_child_process でエラーになることがあったので安全のために pcall で囲っておく
pcall(function()
local media_control = "/opt/homebrew/bin/media-control"
local jq = "/opt/homebrew/bin/jq"
local jq_format = [[
def truncate(n): if length > n then .[0:(n-3)] + "..." else . end;
if .playing then
"🎵 \(.title) - \(.artist)" | truncate(35)
else
"🚫"
end
]]
local success, title = wezterm.run_child_process({
"zsh",
"-c",
media_control .. " get -h | " .. jq .. " -r '" .. jq_format .. "'",
})
if success then
music_info = title:gsub("%s+", " ")
end
end)
-- ...
-- いい感じに music_info を表示する

全体のコードはこちら: https://github.com/nabekou29/dotfiles/blob/eca83e40fa5c7ba8a0ffb16095d82bf9b9d27a7c/dot_config/wezterm/tabline.lua?plain=1

設定すると画像のように曲情報が表示されます

WezTermのステータスラインに再生中の曲名が表示されている


今回は WezTerm での例でしたが、tmux や Zellij などにも持ち運びやすいコマンドになったと思うので乗り換えのたびにいろいろ設定しないで済みそうです。

以上!良いターミナルライフを。