昨日のafplayとBitBarの連携に関する記事で、コードを全く書いていなかったのは、さすがに情報の出し惜しみと思われるかもしれないと、余計な心配をしておりまして、汚い・一貫性のないスクリプトではありますが、公開させていただきます。
さて、afplay の再生アプリに関しては基本的に、「のらぬこの日常を描く」さんのところを参照していただければいいのですが、それだけでは今再生中の楽曲を明示できません。そこでのらぬこさんのスクリプトにちょこっとコードを足します。
#!/bin/sh cd ~/Music kill `pgrep -lf /play.sh | awk '{print $1}'` IS_KILLED=$? pkill afplay if [ "$IS_KILLED" -ne 0 ] then echo play start nohup cat playlist.txt | while read x; do echo -e "$RANDOM\t$x"; done | caffeinate -i sort -k1,1n | cut -f 2- | while read x ;echo "$x" > now.txt ; do afplay -q 1 "$x" ; done >/dev/null 2>&1 & else echo play stoped fi
一行がスクロールする形で表示されているので見にくいのですが、ハイライトした行の2つめの「while read」の後ろ、「echo “$x” > now.txt」が追加した部分です。これで、現在の楽曲情報を「ミュージック」フォルダにテキストファイルとして書き込みます。これは、BitBarのスクリプトとは非同期に行われます。見ればわかりますが、afplay の直前。再生の直前に書き込まれます。これが第一弾。
次にBitBarのスクリプト。これが出し惜しみするわけではないのですが、恥ずかしい。もっとシンプルに書けると思うのですが、書きながら「とりあえず」のレベルだなぁと思っていました。恥ずかしいのですが、以下にスクリプトを書き込みますね。
#!/bin/sh cd ~/Music OLDIFS=$IFS IFS= while read line do fname=${line##*/} fname=${fname%.*} fname=`echo $fname | sed -e 's/^[0-9][^ ]*[ ]//'` artist=`echo $line | sed -e 's/^.*Music\///'` artist=`echo $artist | sed -e 's/\/.*$//'` echo $artist " - " $fname done < now.txt IFS=$OLDIFS
前段、fnameの部分が楽曲名を求めるところなのですが、iTunesのライブラリ構造をそのまま利用しているため、次のようなファイルネームになります。
- 先頭に数字でアルバム中の順番が追加されている。
- 複数枚のCDアルバムの場合「アルバム番号-曲順」という数字を半角ハイフォンでつないだ番号が追加される
fnameのsed正規表現の部分がそれですね。次のアーティスト名の部分は、フォルダ構成の決め打ちです。iTunesのライブラリの場合、おいている場所によって変わるのですが、変わらないのがMusicというフォルダ(ローカライズされてミュージックと表示されていてもフォルダ名はMusic)の次にアーティスト名が来ると言うこと。それを決め打ちで検索しています。
で、echo で表示するとBitBarの方でメニューバーに表示してくれる。そういう形になっています。BitBarはファイル名に時間を書き込んでおくとその時間間隔でスクリプトを実行する機能があります。私は、「nowplay.10s.sh」という名前にして10秒間隔で実行するように指定しています。5秒にしようか(タイムラグがそれだけ短くなる)悩みましたが、大した違いでは無いだろうと言うことで10秒にしています。
説明するのも赤面しますが、もっとシンプルなスクリプトになるはずです。そっと教えてくれると嬉しかったりします。
いかに弱き人といえども、その全力を単一の目的に集中すれば必ずその事を成し得べし。
春日潜庵
投稿者プロフィール

最新の投稿
ラーメン2023年11月26日ラーメン山岡家 ネギ味噌ラーメン
Windows2023年11月23日Windows11マシン不調
TrueNAS2023年11月17日TrueNAS SCALEサーバーのエラー
TrueNAS2023年11月13日もしかしたら、エラーの原因がわかったかも
ああ恥ずかしい。パイプした方がスマートですよね。後で見直しをしたときに自分でわかるように書いたつもりですけど。。。恥ずかしい。