昨日の 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秒にしています。
説明するのも赤面しますが、もっとシンプルなスクリプトになるはずです。そっと教えてくれると嬉しかったりします。
いかに弱き人といえども、その全力を単一の目的に集中すれば必ずその事を成し得べし。
春日潜庵
投稿者プロフィール

最新の投稿
ノン・カテゴリ2025年1月12日2 つになってしまった
Mac2025年1月10日iPhone の保護フィルムが割れた
ノン・カテゴリ2025年1月2日正月早々、階段から落ちた
Windows2024年12月18日Windows11 のログインについて
ああ恥ずかしい。パイプした方がスマートですよね。後で見直しをしたときに自分でわかるように書いたつもりですけど。。。恥ずかしい。