cog/Plugins/CueSheet/CueSheetMetadataReader.m

94 lines
2.4 KiB
Objective-C

//
// CueSheetMetadataReader.m
// CueSheet
//
// Created by Vincent Spader on 10/12/07.
// Copyright 2007 __MyCompanyName__. All rights reserved.
//
#import "CueSheetMetadataReader.h"
#import "CueSheetDecoder.h"
#import "CueSheet.h"
#import "CueSheetTrack.h"
#import "AudioMetadataReader.h"
#import "NSDictionary+Merge.h"
@implementation CueSheetMetadataReader
+ (NSArray *)fileTypes
{
return [CueSheetDecoder fileTypes];
}
+ (NSArray *)mimeTypes
{
return [CueSheetDecoder mimeTypes];
}
+ (float)priority
{
return 16.0f;
}
+ (NSDictionary *)metadataForURL:(NSURL *)url
{
if (![url isFileURL]) {
return nil;
}
BOOL embedded = NO;
CueSheet *cuesheet = nil;
NSDictionary * fileMetadata;
Class audioMetadataReader = NSClassFromString(@"AudioMetadataReader");
NSString *ext = [url pathExtension];
if ([ext caseInsensitiveCompare:@"cue"] != NSOrderedSame)
{
// Embedded cuesheet check
fileMetadata = [audioMetadataReader metadataForURL:url skipCue:YES];
NSString * sheet = [fileMetadata objectForKey:@"cuesheet"];
if ([sheet length])
{
cuesheet = [CueSheet cueSheetWithString:sheet withFilename:[url path]];
embedded = YES;
}
}
else
cuesheet = [CueSheet cueSheetWithFile:[url path]];
if (!cuesheet)
return nil;
NSArray *tracks = [cuesheet tracks];
for (CueSheetTrack *track in tracks)
{
if ([[url fragment] isEqualToString:[track track]])
{
// Class supplied by CogAudio, which is guaranteed to be present
if (!embedded)
fileMetadata = [audioMetadataReader metadataForURL:[track url] skipCue:YES];
NSDictionary * cuesheetMetadata = [NSDictionary dictionaryWithObjectsAndKeys:
[track artist], @"artist",
[track album], @"album",
[track title], @"title",
[NSNumber numberWithInt:[[track track] intValue]], @"track",
[track genre], @"genre",
[NSNumber numberWithInt:[[track year] intValue]], @"year",
[NSNumber numberWithFloat:[track albumGain]], @"replayGainAlbumGain",
[NSNumber numberWithFloat:[track albumPeak]], @"replayGainAlbumPeak",
[NSNumber numberWithFloat:[track trackGain]], @"replayGainTrackGain",
[NSNumber numberWithFloat:[track trackPeak]], @"replayGainTrackPeak",
nil];
return [fileMetadata dictionaryByMergingWith:cuesheetMetadata];
}
}
return nil;
}
@end