ミュージックの動作

ミュージック .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 の穴

結論があるようでないですね〜

投稿者プロフィール

kaizawa
kaizawaブロガー
新潟県在住。1964年生まれ、東京オリンピックの年ですね。
突然燃え上がったり、鎮火したり興味の波が激しいので注意が必要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


Mac

前の記事

M1 iMac の感想