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

2025-08-14T05:40:16+09:00 | 1分で読めます | 更新日時 2025-08-14T05:40:16+09:00

@

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

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

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

結論

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 のアイコンを使ってます。

# 再生中
> 🎵 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 などにも持ち運びやすいコマンドになったと思うので乗り換えのたびにいろいろ設定しないで済みそうです。

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

© 2024 - 2025 nabekou29 Blog

🌱 Powered by Hugo with theme Dream.

About Me

ソフトウェアエンジニア5年目。 主に Web のフロントエンドの開発をしています。

個人では Neovim の拡張や Chrome の拡張を作ったりして遊んでます。 一時期電子工作にもハマってましたが最近はあまりできてない。