読者です 読者をやめる 読者になる 読者になる

itunes の [再生位置を記憶する] をshellscript からコントロールしたい 2/2

tech macos shellscript applescript radiko

ちょっと備忘録のために,applescript の作業でやったことをメモ.
10 行に満たないコードですが(笑

先日は.
itunes の [再生位置を記憶する] は,;

そして [再生位置を記憶する] の皮を被った 'bookmarkable' へのアクセスには applescript
というところまででした.

さて,ここからの流れは結構サクサクでした.

shellscript 側 では,'osascript'

この作業に取り掛かる前,別件でたまたま目にしていた 'osascript' というコマンド.
もちろんこの時点で詳細は知らないけど,存在と概要だけは頭の隅にあって,これを使えば良いだろうと言う程度の事だけはボンヤリと把握できていました.

'osascript',これを使えば shellscript から applescript を実行することができるらしい.
この点は ok.

考えているストーリー

今回のケース,
shellscript 側では、対象としたいファイル(トラック)の特定までは出来てる.
ので,ここで 'osascript' を使って,「このファイル(トラック)をよろしくね」と applescript 側に投げれば良い,となる.

で,applescript 側では,教えてもらったファイル(トラック),いちトラック毎の処理で,
これに対し 'bookmarkable' の内容をセットしてやれば ok.
うんうん.

気になるのは,

  • 引数のやりとり.
  • itunes の外側,つまり finder 上で bookmarkable にアクセスできるのか.できなければその方法.

この 2 点.
この壁の前に立った時,ちょっと心配になる.

'bookmarkable' で本当に [再生位置を記憶する] を制御できる?

あまり大風呂敷を,つか大きくないけど,広げちゃうようなことはせず,
ステップを組みながら,ボトムアップなやり方で作業をすることに.

まずは,'bookmarkable' で [再生位置を記憶する] を制御すること,について.

まさにビンゴの情報があったので,これを参照しながら,
見よう見まねで,こんなのを用意してみました.
動かしながら.ファイルのハンドリングに関するお作法も見たかったし.;

set aFile to choose file
tell application "iTunes"
    set aTrack to (add aFile)
    set bookmarkable of aTrack to true
end tell

他,参考にさせていただいたページは,以下です.どれもが選択ダイアログ choose folder/file ですが.;

itunes の外で bookmarkable はアクセスできる?

ここで触れようとしていることは失敗事例でして,その意味からも別に要らない情報ですが,自分自身少々手こずったポイントでしたので,内向きですが残しておこうと思います.

結論は,やっぱ,できない.
ではどうするか,それは itunes に入らなくてはならない.

当初の自分の頭の中そのままコーディングして,実はこう書いてました.通り過ぎた後で思えばアホなことをやっているのですが,あえて晒します.;

set aFile to choose file
tell application "Finder"
    tell application "iTunes"
    set bookmarkable of aFile to true
    end tell
end tell

色々言葉の使い方正確ではないですが,素人的な感覚で捉えたイメージで表現させてもらいますと,
"Finder" オブジェクト,という言い方で良いのかしら,へアクセスしたままの状態で,対象の音声ファイルの 'bookmarkable' を設定する.
まるで,例えば,それは普通に finder 上で右クリックなりメニューから設定するイメージ.

で,やっぱり itunes にいかなくてはならないんだ,と.

itunes に対象ファイルを持って行く? そっちに移動するには? とかとか...で?

itunes の懐に入るには,itunes のトラックとして add

itunes に tell ステートメントでアクセスし,その中で,入れたいファイルを add コマンドでトラックに放る,ということみたいです.

tell application "iTunes"
    set aTrack to (add aFile)
    set bookmarkable of aTrack to true
end tell

上の例では,
"aFile" が対象とするファイルで,イメージとしてはココに対象ファイルのパスを入れるイメージ.イメージですよ.
そして "aTrack" が itunes に入った時のトラック.
ファイル名とかは,このケースだと,すでに id3tag 入れている,と.

入れるライブラリーの設定は今回は必要ないので,ここではしない.

元ファイルは,今居る場所から移動する?,と気になったけど,そうではないみたい.オリジナルとして残ってる.

トラックに,ファイルを追加 add すれば良い,というのが何か感覚的になじめなくてすっと落ちてこないですけど,これはこんなもんだ,仕様だと覚えるものですね.

乱文失礼.

今振り返ると,当たり前,と思っている自分もいるのですがね.

対象とするファイルを applescript 側に渡す方法

お互い,引数として遣り取りできるのが有るといいのだけど,と...

ドキュメント見ると,ありました.引用.;

a.scpt:
on run argv
    return "hello, " & item 1 of argv & "."
end run

% osascript a.scpt world
hello, world.

shellscript 側は osascript <applescriptファイル> <引数> で投げる

上の例ですと,% osascript a.scpt world の "world" が引数ですね.

ここに [再生位置を記憶する] をセットしたいファイルのパスを置けばと良いわけですね.
ちなみに引数に空白スペースを含むケースでは,'' で囲む必要があるとのこと.メモ.

そして同じく,その "a.scpt" に使いたい applescript のパスを記載するわけですね.ok.

applescript 側は on run <引数> で受け,item <引数のインデックス> of <引数> で引き出す

上の例ですと,on run argv の "argv" が値を受け取る側の引数.

そして引数の値を取り出すには,同様に,item 1 of argv の部分.ok.

applescript 側で引数を受け取る場合は,
run ハンドラーのパラメータとして引数を並べる,という所がルールみたい.;

Any arguments following the script will be passed as a list of strings to the direct parameter of the ``run'' handler.

ということでこうなりました

shellscript の方は,必要箇所のみ記載.

shellscript 側,.sh は, ;

:(snip)
osascript "${DIR_MYRADIKO}/setradiko.scpt" ${target}

applescript 側,.scpt は, ;

on run argv
    set a to item 1 of argv
    set theFile to (a as POSIX file) as alias

    tell application "iTunes"
        set aTrack to (add theFile)
        set bookmarkable of aTrack to true
    end tell

end run

うんできた.

applescrit でパス表記はコロン区切りがネイティブらしい

最後に,上述コード,この部分についてメモ ;

set theFile to (a as POSIX file) as alias

パス表記に関する情報は,このあたりが参考になりましたので,それを見ていただくとして.
(a as POSIX file) で a のPOSIX path形式,良く使われるスラッシュ区切り表記,のパスを,applescript で良く使うMac OS形式,コロン区切りの表記にしてやっています.
やり方は上の方法だけではなく,幾つかあるみたいです.

そして,as alias は,"ファイル名を変更したり、ゴミ箱に捨てたりしても",そのファイルを参照してもらうようにしています.
あると良いかな,と思って.

これについては,こちらが参考になりました.

ということで,radiko の録音処理はこうなりました,と.

長文失礼しました.

おしまい.です.