メニュー ホーム

ミュージックの動作

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

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

投稿者プロフィール

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

カテゴリー:Mac

會澤 賢一

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

お気軽にコメントを残していってください