今日、アルバムのアートワークを iTunes に追加したときに、実際には各アルバムのいくつかのトラックにのみ追加されていることを発見しました。そこで私は、誰もがすることを行い、それを修正するスクリプトを作成しようとしました。
3時間ほどいじってからの初挑戦です。アルバム内のすべての曲を選択したことを前提としています。
#! /usr/local/bin/macruby
framework 'Foundation'
framework 'ScriptingBridge'
itunes = SBApplication.applicationWithBundleIdentifier("com.apple.itunes")
tracks = itunes.selection.get
# Find some track with artwork
artwork = tracks.map { |track| track.artworks[0] }.find { |a| a }
raise "No selected song has artwork" if artwork.nil?
# I checked artwork.rawData and it is PNG wrapped in an NSConcreteData.
pngData = artwork.rawData
tracks.each do |track|
if track.artworks[0]
puts "[O] #{track.name}"
else
puts "[X] #{track.name}"
# Adding the same artwork object is apparently NG so we get the data from it
# and make a copy.
# There is probably a more straight-forward way to clone an object but
# artwork.copy raises an exception.
# I have tried using the keys 'data' and 'raw data' instead - same results.
dict = {rawData: pngData}
artwork_copy = itunes.classForScriptingClass('artwork').alloc.initWithProperties(dict)
track.artworks.addObject(artwork_copy)
raise "Didn't actually add the artwork" if track.artworks.empty?
end
end
addObject を呼び出しても例外は発生しませんが、実際にはアートワークがトラックに追加されないことに気付きました (したがって、スクリプトのテストを高速化するために次の行をチェックします)。
私は主に ScriptingBridge の Objective-C の例から作業してきましたが、他の人がこれを行った場所も見つかりません。アートワークを取得する例はたくさんありますが、設定する例は驚くほど少ないです...
私は 4 年前に他の誰かが同様の問題を抱えていた興味深いメーリング リスト スレッドを見つけましたが、彼らも解決に至りませんでした (またはそれを見つけてスレッドに投稿しませんでした。 、彼らは悪い人であり、気分が悪いはずです。)