Browse Source

VLCThumbnailsCache: add a lookup mechanism for album art

Felix Paul Kühne 11 years ago
parent
commit
815b455701
1 changed files with 44 additions and 1 deletions
  1. 44 1
      Sources/VLCThumbnailsCache.m

+ 44 - 1
Sources/VLCThumbnailsCache.m

@@ -12,6 +12,7 @@
  *****************************************************************************/
 
 #import "VLCThumbnailsCache.h"
+#import <CommonCrypto/CommonDigest.h>
 
 static NSInteger MaxCacheSize;
 static NSCache *_thumbnailCache;
@@ -30,6 +31,43 @@ static NSCache *_thumbnailCache;
     [_thumbnailCache setCountLimit: MaxCacheSize];
 }
 
++ (NSString *)_md5FromString:(NSString *)string
+{
+    const char *ptr = [string UTF8String];
+    unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
+    CC_MD5(ptr, strlen(ptr), md5Buffer);
+    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
+    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
+        [output appendFormat:@"%02x",md5Buffer[i]];
+
+    return [NSString stringWithString:output];
+}
+
++ (NSString *)_getArtworkPathFromMedia:(MLFile *)file
+{
+    NSString *artworkURL, *artist, *album, *title;
+
+    if (file.isAlbumTrack) {
+        artist = file.albumTrack.artist;
+        album = file.albumTrack.album.name;
+    }
+    title = file.title;
+
+    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+    NSString *cacheDir = searchPaths[0];
+    cacheDir = [cacheDir stringByAppendingFormat:@"/%@", [[NSBundle mainBundle] bundleIdentifier]];
+
+    if (artist.length == 0 || album.length == 0) {
+        /* Use generated hash to find art */
+        artworkURL = [cacheDir stringByAppendingFormat:@"/art/arturl/%@/art.jpg", [self _md5FromString:title]];
+    } else {
+        /* Otherwise, it was cached by artist and album */
+        artworkURL = [cacheDir stringByAppendingFormat:@"/art/artistalbum/%@/%@/art.jpg", artist, album];
+    }
+
+    return artworkURL;
+}
+
 + (UIImage *)thumbnailForMediaFile:(MLFile *)mediaFile
 {
     if (mediaFile == nil || mediaFile.objectID == nil)
@@ -41,7 +79,12 @@ static NSCache *_thumbnailCache;
     if (displayedImage)
         return displayedImage;
 
-    displayedImage = mediaFile.computedThumbnail;
+    if (mediaFile.isAlbumTrack || mediaFile.isShowEpisode)
+        displayedImage = [UIImage imageWithContentsOfFile:[self _getArtworkPathFromMedia:mediaFile]];
+
+    if (!displayedImage)
+        displayedImage = mediaFile.computedThumbnail;
+
     if (displayedImage)
         [_thumbnailCache setObject:displayedImage forKey:objID];