VLCThumbnailsCache.m 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*****************************************************************************
  2. * VLCThumbnailsCache.m
  3. * VLC for iOS
  4. *****************************************************************************
  5. * Copyright (c) 2013 VideoLAN. All rights reserved.
  6. * $Id$
  7. *
  8. * Authors: Gleb Pinigin <gpinigin # gmail.com>
  9. * Felix Paul Kühne <fkuehne # videolan.org>
  10. *
  11. * Refer to the COPYING file of the official project for license.
  12. *****************************************************************************/
  13. #import "VLCThumbnailsCache.h"
  14. #import <CommonCrypto/CommonDigest.h>
  15. static NSInteger MaxCacheSize;
  16. static NSCache *_thumbnailCache;
  17. @implementation VLCThumbnailsCache
  18. #define MAX_CACHE_SIZE_IPHONE 21 // three times the number of items shown on iPhone 5
  19. #define MAX_CACHE_SIZE_IPAD 27 // three times the number of items shown on iPad
  20. +(void)initialize
  21. {
  22. MaxCacheSize = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?
  23. MAX_CACHE_SIZE_IPAD: MAX_CACHE_SIZE_IPHONE;
  24. _thumbnailCache = [[NSCache alloc] init];
  25. [_thumbnailCache setCountLimit: MaxCacheSize];
  26. }
  27. + (NSString *)_md5FromString:(NSString *)string
  28. {
  29. const char *ptr = [string UTF8String];
  30. unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
  31. CC_MD5(ptr, strlen(ptr), md5Buffer);
  32. NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  33. for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
  34. [output appendFormat:@"%02x",md5Buffer[i]];
  35. return [NSString stringWithString:output];
  36. }
  37. + (NSString *)_getArtworkPathFromMedia:(MLFile *)file
  38. {
  39. NSString *artworkURL, *artist, *album, *title;
  40. if (file.isAlbumTrack) {
  41. artist = file.albumTrack.artist;
  42. album = file.albumTrack.album.name;
  43. }
  44. title = file.title;
  45. NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  46. NSString *cacheDir = searchPaths[0];
  47. cacheDir = [cacheDir stringByAppendingFormat:@"/%@", [[NSBundle mainBundle] bundleIdentifier]];
  48. if (artist.length == 0 || album.length == 0) {
  49. /* Use generated hash to find art */
  50. artworkURL = [cacheDir stringByAppendingFormat:@"/art/arturl/%@/art.jpg", [self _md5FromString:title]];
  51. } else {
  52. /* Otherwise, it was cached by artist and album */
  53. artworkURL = [cacheDir stringByAppendingFormat:@"/art/artistalbum/%@/%@/art.jpg", artist, album];
  54. }
  55. return artworkURL;
  56. }
  57. + (UIImage *)thumbnailForMediaFile:(MLFile *)mediaFile
  58. {
  59. if (mediaFile == nil || mediaFile.objectID == nil)
  60. return nil;
  61. NSManagedObjectID *objID = mediaFile.objectID;
  62. UIImage *displayedImage = [_thumbnailCache objectForKey:objID];
  63. if (displayedImage)
  64. return displayedImage;
  65. if (mediaFile.isAlbumTrack || mediaFile.isShowEpisode)
  66. displayedImage = [UIImage imageWithContentsOfFile:[self _getArtworkPathFromMedia:mediaFile]];
  67. if (!displayedImage)
  68. displayedImage = mediaFile.computedThumbnail;
  69. if (displayedImage)
  70. [_thumbnailCache setObject:displayedImage forKey:objID];
  71. return displayedImage;
  72. }
  73. @end