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

全てを applescript でしようとしたけど applescript では何も出来ない,という驚愕の(ry

tech macos shellscript applescript radiko

天気良いのに昼間っから,アルコールをグビングビンどぅりんきんしながら,キーをパッチンコパッチンコこーでぃんぐ,んな休みの日.
ダメ人間まっしぐら.

ほぼ半日使ったけど,すべて無駄でした,という,とある体たらくな日曜の記録.
今回の作業で,すべてがスッキリするはずだったのに,かえってイラダチツノル.

時間返せ.
つか,自分が悪いんですがね prz

全部 applescript でできんじゃぬ?

と思ったのが,間違いの始まりだったこと,この時知る由もなく.

楽するために,レコーディングした mp3 データに色々情報を埋める話はしました. タイトルなどを入れられるようにしたり,アートワークイメージを埋められるようにしたり,そして再生位置を記憶するオプションを制御するようにしたり...

出来るにはできた.

けど.たった 1 つのファイルのプロパティを制御するのに,;

と 3 つのプロセスを行ったり来たりする,というのはあまりに不細工すぎる. そう,ずーっと思っていたのです. 何か,この一所懸命感は実に馬鹿げている,と.

当初,導入するつもりのなかった,否実はそれ以前に,使ったら負けとまで思っていた applescript
今となってはこれを使わざるを得ない所まで来てしまっているのだし...もう負け認めてw,間違いなく出来るはずの applescript で全てをまかなってしまえば,となる.当然.

そうすれば処理も,コードの見通しもよくなるでしょうし.

ということで飛び降りた.

やってみたこと

アイディアはこうなりますよね.

呼び出し元,shellscript 側はこんな感じ.必要箇所のみ.;

osascript "${DIR_MYRADIKO}/setradiko.scpt" ${track} \
    "${titleis} \
    "${artistis}" \
    "${albumis}" \
    "${ganreis}" \
    ${year} \
    "${coverartis}"

タイトルなどをセットしている mid3v2 や,アートワークの eyed3 の部分は削除.だいぶスッキリ.こういうのすき.

そして,applescript 側はこう.;

# arguments ;
# item 1. "${target}"
# item 2. "${titleis}"
# item 3. "${artistis}"
# item 4. "${albumis}"
# item 5. "${ganreis}"
# item 6. ${year}
# item 7. "${coverartis}"

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

    # set info
    tell application "iTunes"
        # make a track
        set aTrack to (add theFile)

        #try
        # title
        set name of aTrack to item 2 of argv
        # artist
        set artist of aTrack to item 3 of argv
        # album
        set album of aTrack to item 4 of argv
        # ganre
        set genre of aTrack to item 5 of argv
        # year
        set year of aTrack to item 6 of argv
        # artwork
        set theArtwork to read (POSIX file item 7 of argv) as picture
        set data of artwork 1 of aTrack to theArtwork
        # and "remember playback position"
        set bookmarkable of aTrack to true
        #on error
        #end try
    end tell
end run

で,エラーを吐くわけ.

execution error: iTunes got an error: File permission error. (-54)

っっんもー.

参考にした情報は,この辺り.;

ということで,また例によってこんなんで動かしながら試してみる.

set aFile to choose file
tell application "iTunes"
    set aTrack to (add aFile)

    # title
    set name of aTrack to "曲名"
    # artist
    set artist of aTrack to "アーティスト"
    # album
    set album of aTrack to "アルバム"
    # genre
    set genre of aTrack to "ジャンル"
    # year
    set year of aTrack to 2013
    # artwork
    #set theArtwork to read (POSIX file "") picture
    #set data of artwork 1 of aTrack to theArtwork

    # remember playback position
    set bookmarkable of aTrack to true
end tell

結果不思議なことを知ります.

対象ファイルが,どこにいるか,によって結果が異なる.ん?

こういうことです.
音声ファイルは,itunes に送る前と後で,2 つになる.

同じ script を走らせても, 前者,送る前のファイルを選択すると失敗して, 後者,itunes に送られた後の,ライブラリーフォルダー内に収まっているファイルを選ぶと,うまく行く.

permission 言うので,ちなみに,と調べて切ると,;

% ls -l ~/radiko/_2itunes/check.mp3
-rw-rw-rw-  1 **snip**  staff  28752608 **snip**
% ls -l ~/Music/iTunes/iTunes\ Media/Music/Unknown\ Artist/Unknown\ Album/check.mp3
-rw-r--r--  1 **snip**  staff  28752608 **snip**

finder にあるのが 666,itunes に取り込まれると 644.
ん? むしろ itunes に読み込む前の方が書き込みできるような気もしないですが...よくわからない.

ま,とりあえず,ターゲットファイルを変えてやれば良いと言うことになりますね.

applescript の add コマンドで追加させたことにより,消した処理.
shellscript 上で [iTunes自動的に追加] ディレクトリにファイルを持って行く処理を復活させます....めんどいけどっ :(

Can’t make file ":<タイトル>" into type alias. (-1700)

itunes に読み込んだ後のファイルをターゲットにするようにしました.

# send itunes
# toitunes=`find ${HOME} -name "${ADD2ITUNES}" -type d | grep -vi trash`
toitunes=$(mdfind -onlyin ${DIR_MYITUNESLIB} "kMDItemFSName == '${ADD2ITUNES}' && kMDItemKind == 'フォルダ'")
if [ "${toitunes}" ]; then
    cp "${target}" "${toitunes}"
    if [ "$?" = "0" ]; then
        track=$(mdfind -onlyin ${DIR_MYITUNESLIB} $(basename ${target}))

        # radiko
        osascript "${DIR_MYRADIKO}/setradiko.scpt" ${track} \
            "${titleis} \
            "${artistis}" \
            "${albumis}" \
            "${ganreis}" \
            ${year} \
            "${coverartis}"
    fi
fi

[iTunes自動的に追加] に放った後,itunes のライブラリーディレクトリーを探して,そのファイルに対し,例の情報をセットする applescript を走らせる,と言う塩梅です.

そしたら....
ターゲットとするファイルの取得ができていない.というか,出来ていたり,いなかったりするんです.

っんめんっどくっせー,と思いながら策を探す.

ふと,先に斜め読みで頭の片隅にあったこんな記述.;

The -54 is a file open error. iTunes is too busy examining the just-added joined file for volume information, so that the routine in Join Together that applies tags cannot be completed. The fixed version waits for iTunes to finish this process and then applies the tags after iTunes closes the file.

そんな原始的な話あるのかね,と半ば疑いつつも,ファイルが移動する間の時間を噛ますように変更.

toitunes=$(mdfind -onlyin ${DIR_MYITUNESLIB} "kMDItemFSName == '${ADD2ITUNES}' && kMDItemKind == 'フォルダ'")
if [ "${toitunes}" ]; then
    cp "${target}" "${toitunes}"
    if [ "$?" = "0" ]; then
    track=$(mdfind -onlyin ${DIR_MYITUNESLIB} $(basename ${target}))
    if [ ! ${track} ]; then
        while :
        do
            sleep 2
            track=$(mdfind -onlyin ${DIR_MYITUNESLIB} $(basename ${target}))
            if [ ${track} ]; then break ;fi
        done
    fi

    # radiko
    osascript "${DIR_MYRADIKO}/setradiko.scpt" ${track} \
        "${titleis} \
        "${artistis}" \
        "${albumis}" \
        "${ganreis}" \
        ${year} \
        "${coverartis}"
    fi
fi

で結果.
確かに,ファイルの動きに処理がツイテいけていない,という話みたいです.なんかな,と言う感じです.

と,今度こそイケるだろう,と期待していたら...

execution error: Can’t make file ":ラジオなんですけど 2013.02.17" into type alias. (-1700)

だって.

もういい.

ということで,元に戻しました,とさ.

それから,色々と切り口かえて試してはみたのですが,
どうも applescript で一括処理,というのは不安定っぽい印象.
同じタイミングで,同じことをやっているのに,ファイルによって埋まったり埋まらなかったり,全く同じデータでもタイミングによってうまく行く時とそうでない時があったり,とかとか...

もうこれ以上時間をつぎ込みたくない.と,本気でイラッとし,
結局,元の状態にコードを戻しました.

とさ.

ちなみに

エラーは applescript でも itunes でもない
みたい? ですよ.

相手にしてきた,-54 も,嫌がらせの -1700,いずれも. 何か,carbon framework から出してるようなものみたいで 'MacErrors.h' というデータを見ると分かるそうです.

ちなみに参考までに,-54 と -1700 それぞれ覗いてみると ;

permErr = -54, /permissions error (on file open)/ errAECoercionFail = -1700, / bad parameter data or unable to coerce the data supplied /

だそう.

あそ.

あーおしまい,おしまい.

あーおやすみ,おしまい.