[vlc-commits] macosx/playlist: add specific artwork cache

Felix Paul Kühne git at videolan.org
Sun Jan 26 21:52:37 CET 2020


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Sun Jan 26 21:15:50 2020 +0100| [9f4fa06f0ee4ce0cdddbdeac30d6a630a994ceee] | committer: Felix Paul Kühne

macosx/playlist: add specific artwork cache

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9f4fa06f0ee4ce0cdddbdeac30d6a630a994ceee
---

 .../package/macosx/VLC.xcodeproj/project.pbxproj   |  6 ++
 modules/gui/macosx/Makefile.am                     |  2 +
 .../gui/macosx/playlist/VLCPlaylistImageCache.h    | 34 +++++++++
 .../gui/macosx/playlist/VLCPlaylistImageCache.m    | 82 ++++++++++++++++++++++
 modules/gui/macosx/playlist/VLCPlaylistItem.h      |  1 -
 modules/gui/macosx/playlist/VLCPlaylistItem.m      | 21 ++++--
 po/POTFILES.in                                     |  2 +
 7 files changed, 140 insertions(+), 8 deletions(-)

diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj b/extras/package/macosx/VLC.xcodeproj/project.pbxproj
index 38aa696d99..3cd3787692 100644
--- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj
+++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj
@@ -161,6 +161,7 @@
 		7DB7F20920CC07FD00C2CAED /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DB7F20820CC07FD00C2CAED /* WebKit.framework */; };
 		7DB7F20B20CC082800C2CAED /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DB7F20A20CC082800C2CAED /* QuartzCore.framework */; };
 		7DBB7639227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DBB7638227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.m */; };
+		7DBFDD4723DE1FBB00722E3D /* VLCPlaylistImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DBFDD4623DE1FBB00722E3D /* VLCPlaylistImageCache.m */; };
 		7DC21A7422049A6600F98A02 /* VLCOpenInputMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC21A7322049A6600F98A02 /* VLCOpenInputMetadata.m */; };
 		7DD2F5C52081B73B007EE187 /* VLCRemoteControlService.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DD2F5C42081B73B007EE187 /* VLCRemoteControlService.m */; };
 		7DE2F0442282C84A0040DD0A /* VLCLibraryAudioDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE2F0432282C84A0040DD0A /* VLCLibraryAudioDataSource.m */; };
@@ -572,6 +573,8 @@
 		7DBB06631CC2314D004C74D2 /* caopengllayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = caopengllayer.m; path = ../../../modules/video_output/caopengllayer.m; sourceTree = "<group>"; };
 		7DBB7637227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewSupplementaryElementView.h; sourceTree = "<group>"; };
 		7DBB7638227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCollectionViewSupplementaryElementView.m; sourceTree = "<group>"; };
+		7DBFDD4523DE1FBB00722E3D /* VLCPlaylistImageCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCPlaylistImageCache.h; sourceTree = "<group>"; };
+		7DBFDD4623DE1FBB00722E3D /* VLCPlaylistImageCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCPlaylistImageCache.m; sourceTree = "<group>"; };
 		7DC21A7222049A6600F98A02 /* VLCOpenInputMetadata.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCOpenInputMetadata.h; sourceTree = "<group>"; };
 		7DC21A7322049A6600F98A02 /* VLCOpenInputMetadata.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCOpenInputMetadata.m; sourceTree = "<group>"; };
 		7DD2F5C32081B73B007EE187 /* VLCRemoteControlService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCRemoteControlService.h; sourceTree = "<group>"; };
@@ -1086,6 +1089,8 @@
 				7D0F640B2202163E00FDB91F /* VLCPlaylistDataSource.m */,
 				7D445D822202524D00263D34 /* VLCPlaylistItem.h */,
 				7D445D832202524D00263D34 /* VLCPlaylistItem.m */,
+				7DBFDD4523DE1FBB00722E3D /* VLCPlaylistImageCache.h */,
+				7DBFDD4623DE1FBB00722E3D /* VLCPlaylistImageCache.m */,
 				7D445D8C2203375100263D34 /* VLCPlaylistMenuController.h */,
 				7D445D8D2203375100263D34 /* VLCPlaylistMenuController.m */,
 				7D1BF28B22A192000027C50F /* VLCPlaylistSortingMenuController.h */,
@@ -1757,6 +1762,7 @@
 				7DFBDCB7226CDFD600B700A5 /* VLCImageView.m in Sources */,
 				7D404ABF2281892C00B28EF4 /* NSView+VLCAdditions.m in Sources */,
 				7DE9C7DD220728420089108F /* VLCPlayerController.m in Sources */,
+				7DBFDD4723DE1FBB00722E3D /* VLCPlaylistImageCache.m in Sources */,
 				7D93D8FC2316C2DC001C0063 /* VLCCustomCropArWindowController.m in Sources */,
 				1C3113941E508C6900D4DD76 /* VLCAddonsWindowController.m in Sources */,
 				7D92AF2123DDCA8D00D81EA3 /* VLCLibraryImageCache.m in Sources */,
diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am
index f273ccb7cf..2b665a04a6 100644
--- a/modules/gui/macosx/Makefile.am
+++ b/modules/gui/macosx/Makefile.am
@@ -153,6 +153,8 @@ libmacosx_plugin_la_SOURCES = \
 	gui/macosx/playlist/VLCPlaylistController.m \
 	gui/macosx/playlist/VLCPlaylistDataSource.h \
 	gui/macosx/playlist/VLCPlaylistDataSource.m \
+	gui/macosx/playlist/VLCPlaylistImageCache.h \
+	gui/macosx/playlist/VLCPlaylistImageCache.m \
 	gui/macosx/playlist/VLCPlaylistItem.h \
 	gui/macosx/playlist/VLCPlaylistItem.m \
 	gui/macosx/playlist/VLCPlaylistMenuController.h \
diff --git a/modules/gui/macosx/playlist/VLCPlaylistImageCache.h b/modules/gui/macosx/playlist/VLCPlaylistImageCache.h
new file mode 100644
index 0000000000..cb08ccec73
--- /dev/null
+++ b/modules/gui/macosx/playlist/VLCPlaylistImageCache.h
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* VLCPlaylistImageCache.h: MacOS X interface module
+*****************************************************************************
+* Copyright (C) 2020 VLC authors and VideoLAN
+*
+* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+*****************************************************************************/
+
+#import <Cocoa/Cocoa.h>
+#import <vlc_playlist.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+ at interface VLCPlaylistImageCache : NSObject
+
++ (nullable NSImage *)artworkForPlaylistItemWithURL:(NSURL *)artworkURL;
+
+ at end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/gui/macosx/playlist/VLCPlaylistImageCache.m b/modules/gui/macosx/playlist/VLCPlaylistImageCache.m
new file mode 100644
index 0000000000..69404c4ef8
--- /dev/null
+++ b/modules/gui/macosx/playlist/VLCPlaylistImageCache.m
@@ -0,0 +1,82 @@
+/*****************************************************************************
+* VLCPlaylistImageCache.m: MacOS X interface module
+*****************************************************************************
+* Copyright (C) 2020 VLC authors and VideoLAN
+*
+* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+*****************************************************************************/
+
+#import "VLCPlaylistImageCache.h"
+#import "extensions/NSString+Helpers.h"
+#import <vlc_input.h>
+#import <vlc_url.h>
+
+NSUInteger kVLCMaximumPlaylistImageCacheSize = 100;
+
+ at interface VLCPlaylistImageCache()
+{
+    NSCache *_imageCache;
+}
+ at end
+
+ at implementation VLCPlaylistImageCache
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        _imageCache = [[NSCache alloc] init];
+        _imageCache.countLimit = kVLCMaximumPlaylistImageCacheSize;
+    }
+    return self;
+}
+
++ (instancetype)sharedImageCache
+{
+    static dispatch_once_t onceToken;
+    static VLCPlaylistImageCache *sharedImageCache;
+    dispatch_once(&onceToken, ^{
+        sharedImageCache = [[VLCPlaylistImageCache alloc] init];
+    });
+    return sharedImageCache;
+}
+
++ (NSImage *)artworkForPlaylistItemWithURL:(NSURL *)artworkURL
+{
+    return [[VLCPlaylistImageCache sharedImageCache] imageForPlaylistItemWithArtworkURL:artworkURL];
+}
+
+- (NSImage *)imageForPlaylistItemWithArtworkURL:(NSURL *)artworkURL
+{
+    if (artworkURL == nil) {
+        return nil;
+    }
+
+    NSImage *artwork = [_imageCache objectForKey:artworkURL];
+    if (artwork) {
+        return artwork;
+    }
+
+    artwork = [[NSImage alloc] initWithContentsOfURL:artworkURL];
+    if (artwork) {
+        [_imageCache setObject:artwork forKey:artworkURL];
+    }
+
+    return artwork;
+}
+
+ at end
diff --git a/modules/gui/macosx/playlist/VLCPlaylistItem.h b/modules/gui/macosx/playlist/VLCPlaylistItem.h
index 96ff2efb75..227399f7d3 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistItem.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistItem.h
@@ -43,7 +43,6 @@ extern NSString *VLCPlaylistItemPasteboardType;
 
 @property (readwrite, retain, nullable) NSString *artistName;
 @property (readwrite, retain, nullable) NSString *albumName;
- at property (readwrite, retain, nullable) NSString *artworkURLString;
 @property (readonly, copy) NSImage *artworkImage;
 
 - (instancetype)initWithPlaylistItem:(vlc_playlist_item_t *)p_item;
diff --git a/modules/gui/macosx/playlist/VLCPlaylistItem.m b/modules/gui/macosx/playlist/VLCPlaylistItem.m
index cf13dca131..9f281719cb 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistItem.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistItem.m
@@ -25,12 +25,19 @@
 #import <vlc_input.h>
 #import <vlc_url.h>
 
+#import "playlist/VLCPlaylistImageCache.h"
 #import "extensions/NSString+Helpers.h"
 #import "library/VLCInputItem.h"
 #import "library/VLCLibraryDataTypes.h"
 
 NSString *VLCPlaylistItemPasteboardType = @"org.videolan.vlc.playlistitemtype";
 
+ at interface VLCPlaylistItem()
+{
+    NSURL *_artworkURL;
+}
+ at end
+
 @implementation VLCPlaylistItem
 
 - (instancetype)initWithPlaylistItem:(vlc_playlist_item_t *)p_item
@@ -87,7 +94,11 @@ NSString *VLCPlaylistItemPasteboardType = @"org.videolan.vlc.playlistitemtype";
     if (p_media->p_meta) {
         _artistName = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_Artist));
         _albumName = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_Album));
-        _artworkURLString = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_ArtworkURL));
+
+        NSString *artworkURLString = toNSStr(vlc_meta_Get(p_media->p_meta, vlc_meta_ArtworkURL));
+        if (artworkURLString.length > 1) {
+            _artworkURL = [NSURL URLWithString:artworkURLString];
+        }
     }
     vlc_mutex_unlock(&p_media->lock);
 }
@@ -133,14 +144,10 @@ NSString *VLCPlaylistItemPasteboardType = @"org.videolan.vlc.playlistitemtype";
 
 - (NSImage *)artworkImage
 {
-    NSImage *image;
-
-    if (_artworkURLString != nil && _artworkURLString.length > 0) {
-        image = [[NSImage alloc] initWithContentsOfURL: [NSURL URLWithString:_artworkURLString]];
-    } else {
+    NSImage *image = [VLCPlaylistImageCache artworkForPlaylistItemWithURL:_artworkURL];
+    if (!image) {
         image = [NSImage imageNamed: @"noart.png"];
     }
-
     return image;
 }
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 21287b2f21..5a60e71ebc 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -558,6 +558,8 @@ modules/gui/macosx/playlist/VLCPlaylistController.h
 modules/gui/macosx/playlist/VLCPlaylistController.m
 modules/gui/macosx/playlist/VLCPlaylistDataSource.h
 modules/gui/macosx/playlist/VLCPlaylistDataSource.m
+modules/gui/macosx/playlist/VLCPlaylistImageCache.h
+modules/gui/macosx/playlist/VLCPlaylistImageCache.m
 modules/gui/macosx/playlist/VLCPlaylistItem.h
 modules/gui/macosx/playlist/VLCPlaylistItem.m
 modules/gui/macosx/playlist/VLCPlaylistMenuController.h



More information about the vlc-commits mailing list