全てを applescript でしようとしたけど applescript では何も出来ない,という驚愕の(ry
天気良いのに昼間っから,アルコールをグビングビンどぅりんきんしながら,キーをパッチンコパッチンコこーでぃんぐ,んな休みの日.
ダメ人間まっしぐら.
ほぼ半日使ったけど,すべて無駄でした,という,とある体たらくな日曜の記録.
今回の作業で,すべてがスッキリするはずだったのに,かえってイラダチツノル.
時間返せ.
つか,自分が悪いんですがね prz
全部 applescript でできんじゃぬ?
と思ったのが,間違いの始まりだったこと,この時知る由もなく.
楽するために,レコーディングした mp3 データに色々情報を埋める話はしました. タイトルなどを入れられるようにしたり,アートワークイメージを埋められるようにしたり,そして再生位置を記憶するオプションを制御するようにしたり...
出来るにはできた.
けど.たった 1 つのファイルのプロパティを制御するのに,;
- mid3v2
- eyed3 (eyed3_script)
- applescript
と 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)
っっんもー.
参考にした情報は,この辺り.;
- MacScripter _ Error -54 File permission error
- Join Together File Permission Error -54 - iLounge Forums
- iTunes error -54 in AppleScript Apple Support Communities
ということで,また例によってこんなんで動かしながら試してみる.
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 /
だそう.
あそ.
あーおしまい,おしまい.
あーおやすみ,おしまい.