iTunes のアートワークをファイルに書き出す

個人的には人気アプリケーションは、

  1. iTunes
  2. Safari
  3. Finder

だと思います。人気アプリケーションといっても AppleScript の話題で触れられることの多いアプリケーションです。AppleScript で検索するとよく見る話題が上記のアプリケーション関連。このサイトでは触れることのないアプリケーションともいえます。既に書かれているのにわざわざ書くこともないよな...と思って触れることがなかったのでした。同様に知っていても書かない話題は多数あります。例えば、AppleScript の日本語問題とか。

が、ちょっと考えを改めました。気づいたというか。これだけ書かれているということは、要求があるんだということに。そこで、少しは、軟派な話題でも取り扱ってみるか、と(エラソーに...)。

で、iTunes。iTunes 7 になってからアートワークを自動でダウンロードして取得できるようになりました。取得したアートワークは ~/Music/iTunes フォルダ(デフォルト)の中にある Album Artwork フォルダの階層深いところに保管されているようです。

このダウンロードされたアートワークをファイルに書き出すのが目的です。まずは、iTunes で現在再生中の曲のアートワークを取得してみます。

Script Editor で開く

tell application "iTunes"
    try
        set thisTrack to current track
    on error errMsg number errNum
        -- 再生中でないと current track は取得できないので
        return
    end try

    tell thisTrack
        if exists artworks then
            return artworks -- アートワークの取得
        end if
    end tell
end tell

最初のエラートラップは、ちゃんと調べるのが面倒だから仕掛けているだけでたいした意味はありません。現在再生中の曲を取得して、その曲のアートワークを調べています。一つの曲に複数のアートワークを設定できるので複数形です。アートワークが設定されているかどうかは exists で調べることができます。

AppleScript から調べている限り、ダウンロードされたアートワークか、自分で設定したアートワークかといったことはあまり気にする必要がないようです。どちらのアートワークでも data 属性を取得できるようですし。つまり、アートワークが設定されているかどうかを調べればいいだけで、ダウンロードされて保管されている拡張子 itc のファイルにアクセスする必要はないのです。もちろん、itc から画像を取得したいとなると別ですが、その場合は、こちらの記事を参照するといいと思います。

アートワークのファイルタイプが JPEG や PNG でも data 属性で取得できるのは picture、つまり、PICT 形式です。だから、ファイルタイプはなにかといったことも気にする必要がなく、単純に write 命令でファイルに書き出せばいいようです。

Script Editor で開く

tell application "iTunes"
    try
        set thisTrack to current track
    on error errMsg number errNum
        -- 再生中でないと current track は取得できないので
        return
    end try

    tell thisTrack
        if exists artworks then
            set thisArtist to artist
            set thisAlbum to album
            set desktopFolder to path to desktop as Unicode text
            repeat with i from 1 to count artworks
                set fileName to thisArtist & "_" & thisAlbum & "_" & (i as string)
                set theFile to (desktopFolder & fileName & ".pict") as Unicode text
                set theResult to my saveAsPICT(theFile, data of artwork i)
                if theResult then
                    my openWithPreview(theFile)
                end if
            end repeat
        end if
    end tell
end tell

on saveAsPICT(theFile, theData)
    try
        set fh to open for access file theFile with write permission
        set eof of fh to 512
        write theData to fh starting at 513
        close access fh
        return true
    on error errMsg number errNum
        try
            close access fh
        end try
        log {errNum, errMsg}
        return false
    end try
end saveAsPICT

on openWithPreview(theFile)
    tell application "Finder"
        set theFile to document file theFile
        set file type of theFile to "    "
        set creator type of theFile to "    "
    end tell
end openWithPreview

ただ、書き出せばいいといってもいくつか注意点があります。AppleScript の write 命令で書き出されたファイルはクリエータータイプが ttxt、ファイルタイプが TEXT になります。これをそのまま開こうとすると TextEdit で開こうとします。今回は画像ファイルを書き出すのですから TextEdit で開こうとしても開けません。そこで、ファイルタイプとクリエータータイプを変更(具体的には両方とも半角スペース 4 つ)し、プレビューで開くようにします。

もう一点。artwork クラスの data 属性は picture(PICT)を返します。これをそのままファイルに書き出しても開くことができないファイルになります。AppleScript の write 命令で picture を書き出すには eof を 512 バイトに設定し、513 バイト目から書き出す必要があります。

PICT で書き出すことができたら、後は煮て食おうが焼いて食おうがお気に召すままに。

0 件のコメント :

コメントを投稿