• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: How to manage/embed Covert Art from Mp3 Files with Cocoa App?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to manage/embed Covert Art from Mp3 Files with Cocoa App?


  • Subject: Re: How to manage/embed Covert Art from Mp3 Files with Cocoa App?
  • From: Daniel Thorpe <email@hidden>
  • Date: Mon, 23 Jun 2008 14:30:00 +0100

Hello everyone,

I raised this problem on the list in May, although I was unable to follow up in timely fashion. I've since had time to look at it again, and I see some more people have asked about adding artwork to iTunes. As Jens suggests, an ID3 framework http://drewfamily.homemail.com.au/Cocoa_-_ID3Tag_framework.html exists, which although a little out of date does work. Here is what I did to write artwork to mp3 files in iTunes. Note you'll need to generate the header file for iTunes to use the Scripting Bridge - run the following command from Terminal.app : sdef /Applications/ iTunes.app | sdp -fh --basename iTunes

First, I used the ScriptingBridge to get a reference to my iTunes Music Library:

// Create an iTunes application objeect
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesLibraryPlaylist *library;
for(iTunesSource *source in [iTunes sources]) {
if(source.kind == iTunesESrcLibrary) {
for(iTunesLibraryPlaylist *playlist in [source libraryPlaylists]) {
if([playlist.name isEqualToString:@"Library"]) {
library = playlist;
break;
}
}
}
}


Using an iTunesLibraryPlaylist allows you to call [library fileTracks] which returns an array of iTunesFileTrack references. These are necessary (rather than iTunesTrack references) so that you can get the location attribute of the files. To get the tracks for a particular artist/album I used this method:

- (NSArray *)tracksForAlbum:(Album *)album byArtist:(Artist *)artist {

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(artist like %@) && (album like %@)", artist.name, album.name];
SBElementArray *tracks = [library fileTracks];
NSArray *albumTracks = [tracks filteredArrayUsingPredicate:predicate];
return albumTracks;
}


The above method is what Apple suggests doing when using the ScriptingBridge (<http://developer.apple.com/documentation/Cocoa/Conceptual/ScriptingBridgeConcepts/UsingScriptingBridge/chapter_3_section_7.html#//apple_ref/doc/uid/TP40006104-CH4-SW6 >), rather than iterating through the whole library, however it still crashes iTunes, although my music library has over 40,000 tracks. Therefore I'd suggest that before running this, quit iTunes, rename your entire iTunes library folder (~/Music/iTunes/) to something else (~/Music/iTunes main/) and then start iTunes again, so it'll create an empty library - then add the music you want to add artwork to.

You can iterate over this NSArray and access each track using the ID3 tag framework, assuming an image to embed for the artwork needs to be stored as an NSBitmapImageRep exists:


NSBitmapImageRep *newArtwork; // this needs to exist TagAPI *id3Tag = [[TagAPI alloc] initWithGenreList:nil]; NSArray *tracks = [self tracksForAlbum:anAlbum byArtist:anArtist];

for(iTunesFileTrack *track in tracks) {
[track get];
[id3Tag examineFile:[track.location path]];

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:newArtwork, @"Image",
@"NSTIFFFileType", @"Mime Type",
@"Other", @"Picture Type",
@"", @"Description", nil];
[id3Tag setImages:[NSMutableArray arrayWithObject:dic]];
if([id3Tag updateFile] == 0) {
NSLog(@"successfully processed %@", [id3Tag getTitle]);
} else {
NSLog(@"failed to process %@", [id3Tag getTitle]);
}
}


That should embed your artwork into the files - iTunes probably wont display the artwork until you select or play the track. This doesn't work for .m4a files however. It looks like it might be possible to use the - (void)addImage:(NSImage *)image forDuration:(QTTime)duration withAttributes:(NSDictionary *)attributes method of QTTrack/QTMovie from the QTKit, although I've not implemented it myself yet....

Anyway, hope this helps someone, or if anyone has a better method - let us all know!

Cheers
Dan


On 11 Jun 2008, at 14:59, Nicolas Goles wrote:

Hi, I want to develop a Cocoa Application to manage an embed Cover Art files
to Mp3's. The thing is that I don't know how to achieve this, or where to
read about how to do it. I asked in several places / googled a lot and ended
up here.
Could anyone help me out a bit ? Link me to some reading would be amazing,
but if you get into more detailed explanation, that would be great too.


Thanks a lot .
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


References: 
 >How to manage/embed Covert Art from Mp3 Files with Cocoa App? (From: "Nicolas Goles" <email@hidden>)

  • Prev by Date: Re: Error when building a Cocoa-Java app
  • Next by Date: Re: NSPanel should not close on command-W
  • Previous by thread: Re: How to manage/embed Covert Art from Mp3 Files with Cocoa App?
  • Next by thread: disabling Print in modal panel
  • Index(es):
    • Date
    • Thread