全く知らなかったのですが、iTunes 9 になって iTunes Music フォルダ(現行バージョンでは iTunes Media に名称が変更されている)に「iTunes に自動的に追加(英語環境では Automatically Add to iTunes)」というフォルダが追加されているのですね。このフォルダに iTunes が取り扱えるファイルを放り込んでおくと、自動的に iTunes に取り込んでくれる...そういうフォルダなのだそうです。
どうも、このような機能は待ち望まれていたもののようです。検索を行うと評判はいいようで、関連する記事も散見されます。例えば、ライフハッカー[日本版]の「「iTunes 9」でウォッチフォルダから新曲自動追加ができるようになった : ライフハッカー[日本版]」という記事。
このような「特定のフォルダを監視し、特定のファイルがフォルダに加えられると何らかの処理を行う...」ということをしたい時に、すぐに思いつくのはフォルダアクションです。あまり、利用されていない...のかな、もしかすると。
ライフハッカー[日本版]と同じことをするのは面白くないので、フォルダアクションで同じような機能を実装してみました。
以下のスクリプトを保存しておき、監視しておきたいフォルダにスクリプトを関連づけておくと、iTunes にファイルを自動的に追加することはできます。
property file_extensions : {".mp3"}
on run -- debug
set file_list to choose file with multiple selections allowed without invisibles
set the_folder to path to home folder -- dummy
adding folder items to the_folder after receiving file_list
end run
on adding folder items to this_folder after receiving these_items
set music_files to {}
repeat with this_item in these_items
set {fine_name, ext} to my splitext(this_item as text)
if ext is in file_extensions then
set end of music_files to contents of this_item
end if
end repeat
if music_files is not {} then
set playlist_name to "Added: " & (short date string of (current date))
tell application "iTunes"
activate
set added_tracks to add music_files
if class of added_tracks is file track then
set added_tracks to {added_tracks}
end if
if not (playlist playlist_name exists) then
set the_playlist to make new playlist with properties {name:playlist_name}
else
set the_playlist to playlist playlist_name
end if
repeat with this_track in added_tracks
duplicate this_track to the_playlist
end repeat
end tell
end if
end adding folder items to
on splitext(file_name)
set reversed_name to (reverse of (characters of file_name)) as text
set num to offset of "." in reversed_name
if num is 0 then
set ext to ""
else
set reversed_ext to text 1 thru num of reversed_name
set ext to (reverse of (characters of reversed_ext)) as text
set ext_num to count ext
set name_length to count file_name
set file_name to text 1 thru (name_length - ext_num) of file_name
end if
return {file_name, ext}
end splitext
フォルダアクションの設定の仕方は...Mac OS X 10.5 と Mac OS X 10.6 では若干異なっているのでしたね。Mac OS X 10.5 の場合は「シゴタノ! — フォルダアクションと Automator で時間をセーブする」を()、Mac OS X 10.6 の場合は「わかばマークのMacの備忘録 : setWeblocThumb」を参考にしてみてください。
これで監視しているフォルダに MP3 ファイルが追加されたら iTunes に自動的に取り込んでくれます。
しかし、試してみると分かると思うのですが、iTunes の add 命令はファイルの複製なのです。オリジナルのファイルはそのまま残ります。また、フォルダアクションは反応がよくて(よすぎて)、例えば、Safari でダウンロードしているファイルなんかだったりした場合、ダウンロード完了まで待ってくれません。だから、上記のスクリプトでは目的が達成できません(Mac OS X 10.6 のフォルダアクションは項目がコピーされている時は処理を待機するようですが...ダウンロードしている項目にも適用されるのかは分かりません)。
上記のフォルダアクションでもいいのですが、何となく釈然としない部分があります。フォルダの更新を監視するなら、launchd があるな...。launchd と AppleScript の組み合わせでいいじゃないか、と。しかし、この思いつきがハマる原因になるとは。
ハマるなどとはつゆとも思わず、とりあえず作り始めました。最初に書いたように「iTunes に自動的に追加」フォルダの名称は言語環境で異なるようで、英語環境では「Automatically Add to iTunes」になります。この辺りの問題に対応するため、バンドル形式のアプリケーションかスクリプトバンドルで保存し、localized string 命令を利用します。
そして、作成したスクリプトを launchd で実行するプログラムに指定します。プログラムの実行は osascript を利用するのですが...ここでハマる。
osascript でスクリプトファイルを指定して実行すると、どうも言語環境を考慮しないようで localized string 命令が英語環境の文字列を返します。まさか、このような部分に問題があるとも思わず、他の部分をいろいろ調べていました。
もちろん、launchd でアプリケーションを直接起動させてもいいのですが...この場合、アプリケーション内のプログラムの実態そのものを指定する必要があります。AppleScript のバンドル形式のアプリケーションの場合は、パッケージ内の /Contents/MacOS/applet がそれにあたります。が、これを起動させても目的の動作は行われません。他の Cocoa アプリケーションのようにこの方法も利用できない。バンドル形式ではないアプレットで保存すると問題はないのですが、そうなると localized string が利用できません。
osascript で実行すると localized string で問題があり、アプリケーションの指定にも問題がある...。どうしたものかと思いましたが、バンドル形式のアプリケーションで保存し、osascript でアプリケーションを起動させてしまえばいいじゃないかと思いつきました。
具体的な launchd の記述は以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.charan.AutomaticallyAddiTunes</string>
<key>Program</key>
<string>/usr/bin/osascript</string>
<key>ProgramArguments</key>
<array>
<string>osascript</string>
<string>-e</string>
<string>tell application "Move to iTunes" to activate</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Users/your_name/Downloads</string>
</array>
</dict>
</plist>
これで、かなり満足したものができました。必要なファイルは以下からダウンロードできます。利用方法は同梱の書類を参照してみてください。まぁ、たいていの場合と同じように「ご利用はご自身の責任で」行ってください。
0 件のコメント :
コメントを投稿