CatalinaとRadioでハマった話
少々前に、現行 Mac mini を手に入れまして。
これによって、今まで何世代か前の古いOSを使い続けていたのが、本格的に OSX 10.15 Catalina を使うことに。
そのため、過去に使っていた AppleScript による App など、少々書き換える必要があった中での顛末をメモ的に書いてみます。長いけど。笑
ミュージック(旧iTunes)のインターネットラジオ
聴けなくなってる! これはまずい。
正確に言えば聴けるんだけども。検索窓でカテゴリやステーション名を探せば、Tuneinがホストになっているような見覚えのあるステーション名が、Radioステーションとして出てくる。
じゃあ、それをプレイリストにして自動化するか、と思ったものの、プレイリストに追加することができない!(いくら探しても引っかからなかった。Apple Music 以外のステーションでプレイリストを作る方法がわかる方、教えてください)
ラジオステーションを再生したいだけなのに、どうすりゃいいんだと考え、仕方なくやってみたのが、「最近の再生」にリストされる要素を直接クリックすること。笑
つまりこのやり方だと、一度は手作業でラジオを聴くってことをしなきゃならないので美しくはないのですが。ちなみに今、メニューバーから「ストリーミングURLを開く」でやってみたけどこれも反応がなくダメ。
しょうがない。とにかくやってみよう。
まずは Automator。上のエントリーでやったように、システムとミュージックの音量を設定するところまで、各アクションを配置。
そしてミュージック。
ウインドウのレイアウトはこんな感じですね。
左側のサイドバーの「Radio」を選択すると、右カラムの中段に「最近の再生」が出る。そこの各アイテムにマウスカーソルを乗せると、再生ボタンが現れるのでクリックすると。この動作をシミュレートします。
AppleScript に対応するか、またどこまでするかはソフト(開発元)次第、という話を以前にしましたが、System Events を使うと、実質的にどのUI部品にもアクセスできるため、ほとんどのことが自動でできるということになります。
ただ、自力で部品にたどり着かなければならないので、そこが難儀です。プログラミング的に、操作する対象がわからないとどうにもなりません。
概要はこちらのページが参考になるでしょう。
例えばここにあるように、スクリプトエディタ(アプリケーション>ユーティリティ にあります)で見てみます。
スクリプトエディタは、AppleScript(今は JavaScript<JXA>も書ける)のみを使って自動運転スクリプトを開発するためのエディタです。
システム環境設定を起動したうえで、コードをコピーしてきて貼り付け、再生ボタンを押す。するとこんな風に、現在見えているUI部品がウインドウ下部の「結果」にずらっと出てきます。
カンマ区切りなので、よく見ると「button〜」とか「static text〜」とかあります。こうやって操作対象を絞り込んでいくわけですね。
HTMLを書く人ならわかると思いますが、要素(UI部品)の中にまた要素があってという入れ子の構造になっていることがほとんどなので、階層を深く掘っていかないと目的の部品に辿りつかないということもあり得ます。
面倒でしょう。笑 でも良い方法があります。Automator の「記録」を使うのです。
記録ボタンを押すとこんな小窓が出てきます。その間に何らかの操作をすると自分の行ったそれが Automator で記録され、丸いボタンを押すと停止して元のウインドウに戻る。
で、戻ったのがこれ。「操作を記録」のアクションとして見えている部分です。自分の行った操作が単位ごとに記録されています。
そこからが裏技で、私もネットで情報を拾ううちに知ったのですが、この操作のひと単位、この画像でいうと「テキスト"Radio"をクリックします」の文はドラッグできるようになってるんです。それを窓の下の空いている部分にドラッグして展開した様子も上の画像に収まっています。
わかりますかね、そのまま AppleScript なんですよ。
で、その AppleScript の部分だけを画像にしたのがこれ。ハイ、見事にUI部品のパス…とでも言えばいいのか、階層が拾えました。
でも試しにこのまま(ドラッグ前の状態で)Automator を実行してみてください。上手くいかないんですよこれが。笑
私も正直それが何故かはわからないんです。だからもう手当たり次第思いつくことを試していくしかないなと。
で、結果としてはこうなりました。音量設定の2アクションの下は一旦削除して、「AppleScriptを実行」に差し替え、書き足します。
あるアプリケーションに、System Events を介してマウス操作などのイベントを送りたいという場合は以下のような書き方がテンプレになっています。
そこへ、先ほど得たUI部品のパスと操作を記述するというわけ。
tell application "Music"
activate
tell application "System Events" to tell process "Music"
--何らかの処理
end tell
end tell
右カラムの「最近の再生」のUIは上の画像のように深い階層にありました。サイドバーのUIとベース部分が「splitter group 1 of window 1」まで共通しているので、tell ブロックでこんな風に括り出すことができます。
「window 1」は、ほとんどのアプリケーションで共通の書き方になっています。デフォルトの窓がそれにあたります。
また、サイドバーのアイテムはクリック(click)ではなくセレクト(select)なんですよ! row という要素の場合はセレクトなのかも。ちなみに上から5番目だから row 5 なんですね。変えて試してみると面白い。
もう一つの落とし穴
さて、Automator での記述はこれで一応OK、動くようにはなったのですが、これを起動項目にセットするところでまたハマりました。
何の気なしに、システムのスクリプトフォルダ(Macintosh HD > Library > Scripts)に入れてから、起動項目に追加していたのですが、これはどうもユーザー(現ログインユーザー)のそれに入れないと動かないらしい!
なんだかOSのセキュリティが厳しくなっていて、そんな影響ですかね。まぁよくわからないけど、自分のスクリプトフォルダに入れてからやってみてください。
デフォルトで「ライブラリ」が見えていないと思うけど、Finder で自分のホームを表示している時に、メニューバーの「表示」を選択すると、「"ライブラリ"フォルダを表示」って下の方にありますから。おいこんなところに隠しキャラいたのかよ!てな感じ。笑
書くのも疲れましたが、読むのも疲れたことでしょう。笑
上手くみなさんも自動化できればいいのですが。ではまた!