diff --git a/Audio/PluginController.mm b/Audio/PluginController.mm index cc5f6c94e..bc2ec9146 100644 --- a/Audio/PluginController.mm +++ b/Audio/PluginController.mm @@ -642,6 +642,19 @@ static NSString *xmlEscapeString(NSString * string) { return [[decoder alloc] init]; } ++ (BOOL)isCoverFile:(NSString *)fileName { + for(NSString *coverFileName in [PluginController coverNames]) { + if([[[[fileName lastPathComponent] stringByDeletingPathExtension] lowercaseString] hasSuffix:coverFileName]) { + return true; + } + } + return false; +} + ++ (NSArray *)coverNames { + return @[@"cover", @"folder", @"album", @"front"]; +} + - (NSDictionary *)metadataForURL:(NSURL *)url skipCue:(BOOL)skip { NSString *urlScheme = [url scheme]; if([urlScheme isEqualToString:@"http"] || @@ -651,40 +664,76 @@ static NSString *xmlEscapeString(NSString * string) { NSDictionary *cacheData = cache_access_metadata(url); if(cacheData) return cacheData; - NSString *ext = [url pathExtension]; - NSArray *readers = [metadataReaders objectForKey:[ext lowercaseString]]; - NSString *classString; - if(readers) { - if([readers count] > 1) { - if(skip) { - NSMutableArray *_readers = [readers mutableCopy]; - for(int i = 0; i < [_readers count];) { - if([[_readers objectAtIndex:i] isEqualToString:@"CueSheetMetadataReader"]) - [_readers removeObjectAtIndex:i]; - else - ++i; + do { + NSString *ext = [url pathExtension]; + NSArray *readers = [metadataReaders objectForKey:[ext lowercaseString]]; + NSString *classString; + if(readers) { + if([readers count] > 1) { + if(skip) { + NSMutableArray *_readers = [readers mutableCopy]; + for(int i = 0; i < [_readers count];) { + if([[_readers objectAtIndex:i] isEqualToString:@"CueSheetMetadataReader"]) + [_readers removeObjectAtIndex:i]; + else + ++i; + } + cacheData = [CogMetadataReaderMulti metadataForURL:url readers:_readers]; + break; } - cacheData = [CogMetadataReaderMulti metadataForURL:url readers:_readers]; - cache_insert_metadata(url, cacheData); - return cacheData; + cacheData = [CogMetadataReaderMulti metadataForURL:url readers:readers]; + break; + } else { + classString = [readers objectAtIndex:0]; } - cacheData = [CogMetadataReaderMulti metadataForURL:url readers:readers]; - cache_insert_metadata(url, cacheData); - return cacheData; } else { - classString = [readers objectAtIndex:0]; + cacheData = nil; + break; } - } else { - return nil; + + if(skip && [classString isEqualToString:@"CueSheetMetadataReader"]) { + cacheData = nil; + break; + } + + Class metadataReader = NSClassFromString(classString); + + cacheData = [metadataReader metadataForURL:url]; + } while(0); + + if(cacheData == nil) { + cacheData = [NSDictionary dictionary]; } - if(skip && [classString isEqualToString:@"CueSheetMetadataReader"]) { - return nil; + if(cacheData) { + NSData *image = [cacheData objectForKey:@"albumArt"]; + + if(nil == image) { + // Try to load image from external file + + NSString *path = [[url path] stringByDeletingLastPathComponent]; + + // Gather list of candidate image files + + NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]; + NSArray *types = @[@"jpg", @"jpeg", @"png", @"gif", @"webp", @"avif"]; + NSArray *imageFileNames = [fileNames pathsMatchingExtensions:types]; + + for(NSString *fileName in imageFileNames) { + if([PluginController isCoverFile:fileName]) { + image = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:fileName]]; + break; + } + } + + if(image) { + NSMutableDictionary *data = [cacheData mutableCopy]; + [data setValue:image forKey:@"albumArt"]; + cacheData = data; + } + } } - Class metadataReader = NSClassFromString(classString); - - cacheData = [metadataReader metadataForURL:url]; cache_insert_metadata(url, cacheData); return cacheData; } diff --git a/Plugins/TagLib/TagLibMetadataReader.h b/Plugins/TagLib/TagLibMetadataReader.h index a8d08f078..dbafa9a1a 100644 --- a/Plugins/TagLib/TagLibMetadataReader.h +++ b/Plugins/TagLib/TagLibMetadataReader.h @@ -13,7 +13,4 @@ @interface TagLibMetadataReader : NSObject { } -+ (BOOL)isCoverFile:(NSString *)fileName; -+ (NSArray *)coverNames; - @end diff --git a/Plugins/TagLib/TagLibMetadataReader.m b/Plugins/TagLib/TagLibMetadataReader.m index 3ca83b1d3..ed97236b2 100644 --- a/Plugins/TagLib/TagLibMetadataReader.m +++ b/Plugins/TagLib/TagLibMetadataReader.m @@ -196,25 +196,6 @@ } } - if(nil == image) { - // Try to load image from external file - - NSString *path = [[url path] stringByDeletingLastPathComponent]; - - // Gather list of candidate image files - - NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]; - NSArray *types = @[@"jpg", @"jpeg", @"png", @"gif", @"webp", @"avif"]; - NSArray *imageFileNames = [fileNames pathsMatchingExtensions:types]; - - for(NSString *fileName in imageFileNames) { - if([TagLibMetadataReader isCoverFile:fileName]) { - image = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:fileName]]; - break; - } - } - } - if(nil != image) { [dict setObject:image forKey:@"albumArt"]; } @@ -225,19 +206,6 @@ return dict; } -+ (BOOL)isCoverFile:(NSString *)fileName { - for(NSString *coverFileName in [TagLibMetadataReader coverNames]) { - if([[[[fileName lastPathComponent] stringByDeletingPathExtension] lowercaseString] hasSuffix:coverFileName]) { - return true; - } - } - return false; -} - -+ (NSArray *)coverNames { - return @[@"cover", @"folder", @"album", @"front"]; -} - + (NSArray *)fileTypes { // May be a way to get a list of supported formats return @[@"ape", @"asf", @"wma", @"ogg", @"opus", @"mpc", @"flac", @"mp3", @"tak", @"ac3", @"apl", @"dts", @"dtshd", @"tta", @"wav", @"aif", @"aiff", @"wv", @"wvp"];