iTunesライブラリ中の各trackのアートワークの画像フォーマットの種別を集計するAppleScriptです。
iTunesライブラリ中の各trackのアートワークの画像フォーマットについては、iTunes.app上で楽曲を何曲か選択状態にした状態で、
tell application "iTunes"
set aSel to selection
–> {file track id 50115 of user playlist id 43242 of source id 65 of application "iTunes"}
repeat with i in aSel
set j to contents of i
set aFormat to (format of artwork 1 of j) as string
log aFormat
–> (*JPEG picture*)
end repeat
end tell
★Click Here to Open This Script
のように、個別に取り出すことが可能です。
ただし、iTunes内の(数千とか数万)trackすべてについて集計を行いたい、といった場合にiTunes.appに対して問い合わせを行うと、Objective-CだろうがSwiftだろうがAppleScriptだろうが、どの言語を使っても膨大な処理時間がかかります。
そこで、iTunesLibrary.frameworkを介して、iTunesライブラリに直接アクセスしてアートワーク画像の集計を行なってみました。iTunes.appに対して数千個のtrackのアートワークの画像フォーマットを確認していては、処理に何時間かかるかわかりませんが、直接Frameworkの機能を呼び出せば、迅速に処理できます。
開発環境(MacBook Pro 2012 Core i7 2.66GHz)で、iTunesに音楽が6,800曲程度入っている環境で、集計処理に10秒程度かかりました。アートワークにアクセスすると楽曲情報よりも多めに処理時間がかかるようです。
アートワークの種別については、iTunesLibrary.frameworkが定めるところでは9種類ほど画像フォーマットが存在し、自分の環境ではJPEGが多く、PNGもありました。
macOS 10.14でも動かしてみましたが、とくに問題ありません。GUIアプリへの問い合わせではないので、「オートメーション」の許可ダイアログも表示されません。
AppleScript名:各trackのartworkの種別を集計 v2.scptd |
— Created 2018-10-16 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "iTunesLibrary" –https://developer.apple.com/documentation/ituneslibrary/itlibartwork/itlibartworkformat?language=objc property ITLibArtworkFormatNone : 0 property ITLibArtworkFormatBitmap : 1 property ITLibArtworkFormatJPEG : 2 property ITLibArtworkFormatJPEG2000 : 3 property ITLibArtworkFormatGIF : 4 property ITLibArtworkFormatPNG : 5 property ITLibArtworkFormatBMP : 6 property ITLibArtworkFormatTIFF : 7 property ITLibArtworkFormatPICT : 8 set library to current application’s ITLibrary’s libraryWithAPIVersion:"1.0" |error|:(missing value) if library is equal to missing value then return set playLists to library’s allPlaylists() set gArray to library’s allMediaItems()’s artwork set imgFormatArray to gArray’s imageDataFormat set aRes to countItemsByItsAppearance(imgFormatArray) of me –>{{theName:2, numberOfTimes:4001}, {theName:missing value, numberOfTimes:2659}, {theName:5, numberOfTimes:1884}} –出現回数で集計 on countItemsByItsAppearance(aList) set aSet to current application’s NSCountedSet’s alloc()’s initWithArray:aList set bArray to current application’s NSMutableArray’s array() set theEnumerator to aSet’s objectEnumerator() repeat set aValue to theEnumerator’s nextObject() if aValue is missing value then exit repeat bArray’s addObject:(current application’s NSDictionary’s dictionaryWithObjects:{aValue, (aSet’s countForObject:aValue)} forKeys:{"theName", "numberOfTimes"}) end repeat –出現回数(numberOfTimes)で降順ソート set theDesc to current application’s NSSortDescriptor’s sortDescriptorWithKey:"numberOfTimes" ascending:false bArray’s sortUsingDescriptors:{theDesc} return bArray as list end countItemsByItsAppearance |