1

今日、アルバムのアートワークを 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 年前に他の誰かが同様の問題を抱えていた興味深いメーリング リスト スレッドを見つけましたが、彼らも解決に至りませんでした (またはそれを見つけてスレッドに投稿しませんでした。 、彼らは悪い人であり、気分が悪いはずです。)

4

1 に答える 1

1

Objective-Cこれは私のために働くコードの例です。私は知りませんmacruby

iTunesApplication *iTunesApp = [SBApplication applicationWithBundleIdentifier: @"com.apple.iTunes"];
SBElementArray *tracks = [[iTunesApp selection] get];
NSArray *trackWithArt = [tracks filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"artworks[SIZE] > 0"]]; 
if ([trackWithArt count] > 0) {
    NSImage *tData = (NSImage*)[[[[trackWithArt objectAtIndex:0] artworks] objectAtIndex:0] data];
    for (iTunesTrack *tObj in [tracks filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"artworks[SIZE] = 0"]]) {
        [[[[tObj artworks] objectAtIndex:0] propertyWithCode:'pPCT'] setTo:tData];
    }
}

動作する別の方法を次に示します。

ループ内の行を次のように置き換えます。

iTunesArtwork *tArtw = [[tObj artworks] objectAtIndex:0];
tArtw.data = tData; // set the track's artwork

上記の両方に相当する MacRuby (私は明白な理由から後者を使用しています):

    # 0x70504354 = 'pPCT'
    track.artworks.objectAtIndex(0).propertyWithCode(0x70504354).setTo(artwork.data)
    # or,
    track.artworks.objectAtIndex(0).data = artwork.data

-

別の方法: AppleScript を使用するのは非常に簡単です。

于 2012-10-28T23:43:13.507 に答える