Search code examples
iphoneobjective-ciostaglibalbumart

Get album artwork from ID3 tag/Convert function from Java to Objective-C


I've got the following question to ask:

How do you compile taglib with an iOS application?

I'm a bit confused as I added the folder into my project, tried to compile it, but instead it failed with 1640 errors.

How do I make it successfully compile - the reason why I ask is taglib allows for the extraction of album artwork from a tag.

If anyone knows an Objective-C based album artwork extraction class it would help - I don't know why Apple don't add a way of doing this in Core Foundation - because there are methods for extracting some of the data from an ID3 tag.

I can't see why there isn't some Objective-C way of doing it.

Any help appreciated.

EDIT:

After hours upon hours of trying to do this, I've found a Java function here that seems to do the job fine, but I haven't got a clue on how to convert it to Objective-C (or let alone C++ for that matter), as its types seem to be completely different from those that are in Objective-C/C++.

If anyone knows of a way to convert this it would really help, as this seems as my last option as I've tried so many others.


Solution

  • - (void)loadArtworksForFileAtPath:(NSString *)path completion:(void (^)(NSArray *))completion
    {
        NSURL *u = [NSURL fileURLWithPath:path];
        AVURLAsset *a = [AVURLAsset URLAssetWithURL:u options:nil];
        NSArray *k = [NSArray arrayWithObjects:@"commonMetadata", nil];
    
        [a loadValuesAsynchronouslyForKeys:k completionHandler: ^{
            NSArray *artworks = [AVMetadataItem metadataItemsFromArray:a.commonMetadata
                 withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon];
    
             NSMutableArray *artworkImages = [NSMutableArray array];
             for (AVMetadataItem *i in artworks)
             {
                 NSString *keySpace = i.keySpace;
                 UIImage *im = nil;
    
                 if ([keySpace isEqualToString:AVMetadataKeySpaceID3])
                 {
                     NSDictionary *d = [i.value copyWithZone:nil];
                     im = [UIImage imageWithData:[d objectForKey:@"data"]];
                 }
                 else if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes])
                     im = [UIImage imageWithData:[i.value copyWithZone:nil]];
    
                 if (im)
                     [artworkImages addObject:im];
             }
    
             completion(artworkImages);
         }];
    }