ミュージック .app の動作ですが、ローカルファイル再生を想定していたんですけど、アップルのクラウド上にファイルがある場合、ストリーミングを優先するんでしょうか。少なくとも、私の環境ではそのようになってるみたいです。
経緯
M1 iMac に切り替える前、アップルスクリプトとシェルスクリプトを併用して、再生している楽曲名とアーティスト名をメニューバーに表示させていました。 Bitbar というアプリの手を借りています。
ところがです、 M1 iMac に切り替えた後、エラーになるんです。いや、正確には楽曲のデータを抽出できなくなってしまいました。アップルスクリプトの location でファイルのパスを取り込んで、それを分析していたんですね。ところが、 location でエラーになります。取得できないと言うことで、ブランクになってしまいます。アップルスクリプトの仕様が変わったのかなぁとか色々考えたのです。
ちょっとしたことでクエスチョンマークが …
ところが、全ての楽曲でそうなると思っていたら、楽曲の location を得ることができる楽曲もあるんです。そして、しばらくするとその楽曲も location を得ることができなくなります。おかしいです。で、どんな楽曲がエラーになり、どの楽曲がならないのかを調べることにしました。
これ、サラッと書いていますが、かなり長い間迷宮に入っていました。 3 週間ぐらいあーでもないこーでもないと七転八倒していました。そして、たまたまレンタルショップで購入してきたシングル CD を iTunes に登録し、その曲をスクリプトで参照してみたところこれが参照できることに気がつきました。
参照できる楽曲がわかったので、他の楽曲との違いを探ることにしたんですが、さっぱりわかりません。とりあえず 2 〜 3 日頭を冷やして別のことをしていたんですね。そして、数日後にまた違いを探そうとしたら、数日前にはデータを参照できた楽曲が参照できなくなっています、もう訳がわかりません。
原因追及を諦めて、別の方法を試してみたら
もう悩むのをやめて別の方法でメニューバーに楽曲を表示できないか探ってみました。私、アップルスクリプトの仕様が変わったんだと思っていたんですね。なので、アップルスクリプトではなく、シェルスクリプトで楽曲名などを獲得できないか、探していたんですが、これがない。探し方が悪いのかもしれませんが、見つけることができませんでした。
仕方ないので再びアップルスクリプトで他の方法を探ってみようとしました。すると、できるんですよ。私、 location にこだわっていたんですが、 current track から name/artist が取得できるじゃありませんか。取得できれば、文字列を工夫して後は Bitbar に渡してメニューバーに表示させることができました。
目的は達成できたわけです。
location ではエラーになる、なぜ?
アップルスクリプトの location というのは、特定トラックのファイル位置を返すクエリです。実は、 name/artist を獲得できる楽曲も、 location は獲得できないことがわかりました。 location はファイルの位置を返します。ファイルの位置が特定できない。しかし、再生楽曲の情報は獲得可能。これが 1 つ。
そして、最初は location でファイル位置を特定できたのに、特定できなくなる。これが 2 つ目。ここから、ストリーミング再生がぼんやりと浮かんできました。
アップルは、ロスレスオーディオや、 Dolby Atmos 対応を進めています。ストリーミング再生ってあまり好きじゃないんです。好きな楽曲が、何らかの理由で配信停止になったり、そもそも配信されていなかったりしますよね。なので、ストリーミング再生ではなく、手元にファイルを置いて置く方を好みます。しかし、今再生しているのはストリーミングなのか、ローカルファイル再生なのかちょっとわからないですよね。
まとめにかえて
確信もってそうだと言えないところがミソなんですが、新規で登録した楽曲は、アップルのデータベースとの突き合わせが終わっていませんから、当然ローカルファイル再生になります。しかし、時間がたつとデータベースとの突き合わせが終わり、ローカルファイル再生ではなく、ストリーミング再生に切り替わる。そう考えれば、 location が取得可能状態から不可能状態に変わるのもうなずけます。
ストリーミング楽曲の場合、ファイルの位置を返す location はエラーというか、参照不能と言うことでブランクを返す。個人的にはそれで納得してしまったんですが、情報があったら欲しいです。
蛇足ついでに
on writeToFileAsUTF8(thisData, targetFile, appendF as boolean)
tell current application
try
set the targetFile to the targetFile as text
set the openTargetFile to open for access file targetFile with write permission
if appendF is false then set eof of the openTargetFile to 0
write thisData to the openTargetFile as «class utf8» starting at eof
close access the openTargetFile
return
on error
try
close access file targetFile
end try
return false
end try
end tell
end writeToFileAsUTF8
script MyScript
if application "Music" is running then
tell application "Music"
if player state is playing then
set playing_track to the current track -- 演奏中のトラックを取得
set playing_artist to artist of playing_track
set playing_name to the name of playing_track
set playing_string to playing_artist & " - " & playing_name
my writeToFileAsUTF8(playing_string, "Macintosh HD:Users:<ID>:Music:Music_now.txt", false)
end if
end tell
end if
end script
on run
local tempScript
copy MyScript to tempScript
run tempScript
end run
#!/bin/bash
cd ~/Music
osascript chk_Music.scpt
filname="Music_now.txt"
cat $filname
exit 0
最初のコードを chk_Music.scpt ファイルで保存して、 2 つ目のコードを 10 秒おきに実行させます。 Bitbar は標準出力をメニューバーに表示させます。最初のコードでやたら面倒な関数を使っていますが、アップルスクリプトで UTF-8 で出力するためにはちと面倒なので下記からコピペしました。
指定文字コードでファイル書き出し( UTF-8 ) v2 – AppleScript の穴
結論があるようでないですね〜
投稿者プロフィール
最新の投稿
- Mac2024年9月11日iPhone16Pro
- Linux2024年9月8日24.04 の Update ではまった
- ノン・カテゴリ2024年7月21日Kindle 世代交代
- Linux2024年7月7日convert → magick