From 3b7bdc7983fca5f2aca8696b16db580b61b4d9d1 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Tue, 26 Feb 2019 21:46:39 -0500 Subject: [PATCH] WIP: Create operation queue for album art download --- Cartfile | 1 + Cartfile.resolved | 1 + Persephone.xcodeproj/project.pbxproj | 66 ++++++++++++++----- .../Controllers/AlbumViewController.swift | 2 +- .../{AlbumItem.swift => AlbumViewItem.swift} | 16 +++-- Persephone/DataSources/AlbumDataSource.swift | 12 ++-- Persephone/Extensions/NSImage.swift | 2 + .../NSUserInterfaceItemIdentifier.swift | 2 +- Persephone/Models/AlbumItem.swift | 22 +++++++ Persephone/Operations/AlbumArtOperation.swift | 13 ++++ .../Operations/AlbumArtOperations.swift | 20 ++++++ .../{AlbumItem.xib => AlbumViewItem.xib} | 4 +- Persephone/Services/AlbumArtService.swift | 2 +- 13 files changed, 130 insertions(+), 33 deletions(-) rename Persephone/Controllers/{AlbumItem.swift => AlbumViewItem.swift} (83%) create mode 100644 Persephone/Models/AlbumItem.swift create mode 100644 Persephone/Operations/AlbumArtOperation.swift create mode 100644 Persephone/Operations/AlbumArtOperations.swift rename Persephone/Resources/{AlbumItem.xib => AlbumViewItem.xib} (97%) diff --git a/Cartfile b/Cartfile index 0590fd0..ea5d0b2 100644 --- a/Cartfile +++ b/Cartfile @@ -1,2 +1,3 @@ +github "mxcl/PromiseKit" ~> 6.8 github "nhurden/MediaKeyTap" "fix-tis-tsm-error" github "SwiftyJSON/SwiftyJSON" ~> 4.0 diff --git a/Cartfile.resolved b/Cartfile.resolved index 269156c..50a42a3 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,2 +1,3 @@ github "SwiftyJSON/SwiftyJSON" "4.2.0" +github "mxcl/PromiseKit" "6.8.3" github "nhurden/MediaKeyTap" "355d346c56243e6d56487fa46fcad945251e16ae" diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index c972932..3d33ce2 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -16,7 +16,7 @@ E408D3B9220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = E408D3B8220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift */; }; E408D3BE220E03EE0006D9BE /* RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E408D3BD220E03EE0006D9BE /* RawRepresentable.swift */; }; E408D3C2220E134F0006D9BE /* AlbumViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E408D3C1220E134F0006D9BE /* AlbumViewController.swift */; }; - E408D3CB220E341D0006D9BE /* AlbumItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = E408D3C9220E341D0006D9BE /* AlbumItem.xib */; }; + E408D3CB220E341D0006D9BE /* AlbumViewItem.xib in Resources */ = {isa = PBXBuildFile; fileRef = E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */; }; E40F41F3221EDE27004B6CB8 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = E40F41F2221EDE27004B6CB8 /* Preferences.swift */; }; E40FE71B221B904300A4223F /* NSEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E40FE71A221B904300A4223F /* NSEvent.swift */; }; E41B22C021FB6BBA00D544F6 /* libmpdclient.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */; settings = {ATTRIBUTES = (Required, ); }; }; @@ -29,13 +29,20 @@ E42A8F3C22176D6400A13ED9 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = E42A8F3A22176D6400A13ED9 /* README.md */; }; E435E3E2221CD4E200184CFC /* NSFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = E435E3E1221CD4E200184CFC /* NSFont.swift */; }; E435E3E4221CD75D00184CFC /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E435E3E3221CD75D00184CFC /* NSImage.swift */; }; - E450AD772224C0450091BED3 /* SwiftyJSON.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E450AD762224C0450091BED3 /* SwiftyJSON.framework */; }; - E450AD7A2224C1150091BED3 /* SwiftyJSON.framework in Embed Libraries */ = {isa = PBXBuildFile; fileRef = E450AD782224C1150091BED3 /* SwiftyJSON.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E450AD7E222620A10091BED3 /* AlbumItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD7D222620A10091BED3 /* AlbumItem.swift */; }; + E450AD8622262AE60091BED3 /* SwiftyJSON.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E450AD8522262AE60091BED3 /* SwiftyJSON.framework */; }; + E450AD8822262AEC0091BED3 /* SwiftyJSON.framework in Embed Libraries */ = {isa = PBXBuildFile; fileRef = E450AD8522262AE60091BED3 /* SwiftyJSON.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E450AD8B22262B590091BED3 /* AlbumArtOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD8A22262B590091BED3 /* AlbumArtOperation.swift */; }; + E450AD8F22262C620091BED3 /* PromiseKit.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */; }; + E450AD9122262C780091BED3 /* SwiftyJSON.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */; }; + E450AD9222262C970091BED3 /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E450AD8C22262C590091BED3 /* PromiseKit.framework */; }; + E450AD9322262C970091BED3 /* PromiseKit.framework in Embed Libraries */ = {isa = PBXBuildFile; fileRef = E450AD8C22262C590091BED3 /* PromiseKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E450AD9522262DF10091BED3 /* AlbumArtOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = E450AD9422262DF10091BED3 /* AlbumArtOperations.swift */; }; E465049A21E94DF500A70F4C /* WindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E465049921E94DF500A70F4C /* WindowController.swift */; }; E47E2FCC2220573500F747E6 /* MediaKeyTap.framework.dSYM in Resources */ = {isa = PBXBuildFile; fileRef = E47E2FCB2220573500F747E6 /* MediaKeyTap.framework.dSYM */; }; E47E2FD122205C4600F747E6 /* MainSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */; }; E47E2FD322205D2500F747E6 /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD222205D2500F747E6 /* MainWindow.swift */; }; - E47E2FD5222071FD00F747E6 /* AlbumItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD4222071FD00F747E6 /* AlbumItem.swift */; }; + E47E2FD5222071FD00F747E6 /* AlbumViewItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */; }; E47E2FD72220720300F747E6 /* AlbumItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FD62220720300F747E6 /* AlbumItemView.swift */; }; E47E2FDD2220A6D100F747E6 /* Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FDC2220A6D100F747E6 /* Time.swift */; }; E47E2FE52220AA0700F747E6 /* AlbumViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47E2FE42220AA0700F747E6 /* AlbumViewLayout.swift */; }; @@ -81,7 +88,8 @@ files = ( E41B22C121FB6C3300D544F6 /* libmpdclient.2.dylib in Embed Libraries */, E421ACA4221F73C4008B2449 /* MediaKeyTap.framework in Embed Libraries */, - E450AD7A2224C1150091BED3 /* SwiftyJSON.framework in Embed Libraries */, + E450AD8822262AEC0091BED3 /* SwiftyJSON.framework in Embed Libraries */, + E450AD9322262C970091BED3 /* PromiseKit.framework in Embed Libraries */, ); name = "Embed Libraries"; runOnlyForDeploymentPostprocessing = 0; @@ -114,7 +122,7 @@ E408D3B8220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSUserInterfaceItemIdentifier.swift; sourceTree = ""; }; E408D3BD220E03EE0006D9BE /* RawRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawRepresentable.swift; sourceTree = ""; }; E408D3C1220E134F0006D9BE /* AlbumViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumViewController.swift; sourceTree = ""; }; - E408D3C9220E341D0006D9BE /* AlbumItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AlbumItem.xib; sourceTree = ""; }; + E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AlbumViewItem.xib; sourceTree = ""; }; E40F41F2221EDE27004B6CB8 /* Preferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; }; E40FE71A221B904300A4223F /* NSEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEvent.swift; sourceTree = ""; }; E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libmpdclient.2.dylib; path = libmpdclient/output/libmpdclient.2.dylib; sourceTree = ""; }; @@ -161,13 +169,18 @@ E42A8F3A22176D6400A13ED9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; E435E3E1221CD4E200184CFC /* NSFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSFont.swift; sourceTree = ""; }; E435E3E3221CD75D00184CFC /* NSImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImage.swift; sourceTree = ""; }; - E450AD762224C0450091BED3 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = ""; }; - E450AD782224C1150091BED3 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = ""; }; + E450AD7D222620A10091BED3 /* AlbumItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumItem.swift; sourceTree = ""; }; + E450AD8522262AE60091BED3 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = ""; }; + E450AD8A22262B590091BED3 /* AlbumArtOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumArtOperation.swift; sourceTree = ""; }; + E450AD8C22262C590091BED3 /* PromiseKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PromiseKit.framework; path = Carthage/Build/Mac/PromiseKit.framework; sourceTree = ""; }; + E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = PromiseKit.framework.dSYM; path = Carthage/Build/Mac/PromiseKit.framework.dSYM; sourceTree = ""; }; + E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = SwiftyJSON.framework.dSYM; path = Carthage/Build/Mac/SwiftyJSON.framework.dSYM; sourceTree = ""; }; + E450AD9422262DF10091BED3 /* AlbumArtOperations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumArtOperations.swift; sourceTree = ""; }; E465049921E94DF500A70F4C /* WindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowController.swift; sourceTree = ""; }; E47E2FCB2220573500F747E6 /* MediaKeyTap.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = MediaKeyTap.framework.dSYM; path = Carthage/Build/Mac/MediaKeyTap.framework.dSYM; sourceTree = ""; }; E47E2FD022205C4600F747E6 /* MainSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainSplitViewController.swift; sourceTree = ""; }; E47E2FD222205D2500F747E6 /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainWindow.swift; sourceTree = ""; }; - E47E2FD4222071FD00F747E6 /* AlbumItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumItem.swift; sourceTree = ""; }; + E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumViewItem.swift; sourceTree = ""; }; E47E2FD62220720300F747E6 /* AlbumItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumItemView.swift; sourceTree = ""; }; E47E2FDC2220A6D100F747E6 /* Time.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Time.swift; sourceTree = ""; }; E47E2FE42220AA0700F747E6 /* AlbumViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumViewLayout.swift; sourceTree = ""; }; @@ -194,7 +207,8 @@ files = ( E41B22C021FB6BBA00D544F6 /* libmpdclient.2.dylib in Frameworks */, E421ACA3221F73C4008B2449 /* MediaKeyTap.framework in Frameworks */, - E450AD772224C0450091BED3 /* SwiftyJSON.framework in Frameworks */, + E450AD8622262AE60091BED3 /* SwiftyJSON.framework in Frameworks */, + E450AD9222262C970091BED3 /* PromiseKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -218,7 +232,6 @@ E407860F2110CE6E006887B1 = { isa = PBXGroup; children = ( - E450AD782224C1150091BED3 /* SwiftyJSON.framework */, E407861A2110CE6E006887B1 /* Persephone */, E407862D2110CE70006887B1 /* PersephoneTests */, E40786382110CE70006887B1 /* PersephoneUITests */, @@ -242,6 +255,7 @@ E407861A2110CE6E006887B1 /* Persephone */ = { isa = PBXGroup; children = ( + E450AD8922262B420091BED3 /* Operations */, E4A83BF2222207BE0098FED6 /* Services */, E4A83BEC2221F5DD0098FED6 /* Preferences */, E47E2FE32220AA0700F747E6 /* Layouts */, @@ -312,9 +326,12 @@ E41B22BE21FB6B3300D544F6 /* Frameworks */ = { isa = PBXGroup; children = ( - E450AD762224C0450091BED3 /* SwiftyJSON.framework */, - E47E2FCB2220573500F747E6 /* MediaKeyTap.framework.dSYM */, + E450AD8C22262C590091BED3 /* PromiseKit.framework */, + E450AD8E22262C620091BED3 /* PromiseKit.framework.dSYM */, + E450AD8522262AE60091BED3 /* SwiftyJSON.framework */, + E450AD9022262C780091BED3 /* SwiftyJSON.framework.dSYM */, E421ACA1221F73B8008B2449 /* MediaKeyTap.framework */, + E47E2FCB2220573500F747E6 /* MediaKeyTap.framework.dSYM */, E41B22BF21FB6BBA00D544F6 /* libmpdclient.2.dylib */, ); name = Frameworks; @@ -371,6 +388,15 @@ path = mpd; sourceTree = ""; }; + E450AD8922262B420091BED3 /* Operations */ = { + isa = PBXGroup; + children = ( + E450AD8A22262B590091BED3 /* AlbumArtOperation.swift */, + E450AD9422262DF10091BED3 /* AlbumArtOperations.swift */, + ); + path = Operations; + sourceTree = ""; + }; E47E2FE32220AA0700F747E6 /* Layouts */ = { isa = PBXGroup; children = ( @@ -438,7 +464,7 @@ E4D1B597220BA3A20026F233 /* Controllers */ = { isa = PBXGroup; children = ( - E47E2FD4222071FD00F747E6 /* AlbumItem.swift */, + E47E2FD4222071FD00F747E6 /* AlbumViewItem.swift */, E408D3C1220E134F0006D9BE /* AlbumViewController.swift */, E4E8CC932206097F0024217A /* NotificationsController.swift */, E4E8CC912204F4B80024217A /* QueueViewController.swift */, @@ -452,7 +478,7 @@ isa = PBXGroup; children = ( E40786212110CE70006887B1 /* Main.storyboard */, - E408D3C9220E341D0006D9BE /* AlbumItem.xib */, + E408D3C9220E341D0006D9BE /* AlbumViewItem.xib */, ); path = Resources; sourceTree = ""; @@ -472,6 +498,7 @@ E47E2FDC2220A6D100F747E6 /* Time.swift */, E40F41F2221EDE27004B6CB8 /* Preferences.swift */, E4F6B462221E125900ACF42A /* SongItem.swift */, + E450AD7D222620A10091BED3 /* AlbumItem.swift */, ); path = Models; sourceTree = ""; @@ -591,10 +618,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E450AD9122262C780091BED3 /* SwiftyJSON.framework.dSYM in Resources */, E42A8F3B22176D6400A13ED9 /* LICENSE.md in Resources */, E40786202110CE70006887B1 /* Assets.xcassets in Resources */, E42A8F3C22176D6400A13ED9 /* README.md in Resources */, - E408D3CB220E341D0006D9BE /* AlbumItem.xib in Resources */, + E450AD8F22262C620091BED3 /* PromiseKit.framework.dSYM in Resources */, + E408D3CB220E341D0006D9BE /* AlbumViewItem.xib in Resources */, E40786232110CE70006887B1 /* Main.storyboard in Resources */, E47E2FCC2220573500F747E6 /* MediaKeyTap.framework.dSYM in Resources */, ); @@ -649,8 +678,11 @@ E4F6B460221E119B00ACF42A /* QueueDataSource.swift in Sources */, E4A642DA22090CBE00067D21 /* Status.swift in Sources */, E47E2FD72220720300F747E6 /* AlbumItemView.swift in Sources */, + E450AD9522262DF10091BED3 /* AlbumArtOperations.swift in Sources */, + E450AD7E222620A10091BED3 /* AlbumItem.swift in Sources */, E4E8CC942206097F0024217A /* NotificationsController.swift in Sources */, E408D3B6220DD8970006D9BE /* Notification.swift in Sources */, + E450AD8B22262B590091BED3 /* AlbumArtOperation.swift in Sources */, E408D3B9220DE98F0006D9BE /* NSUserInterfaceItemIdentifier.swift in Sources */, E4EB2379220F10B8008C70C0 /* Pair.swift in Sources */, E4F6B463221E125900ACF42A /* SongItem.swift in Sources */, @@ -667,7 +699,7 @@ E41EA46C221636AF0068EF46 /* GeneralPrefsViewController.swift in Sources */, E4E8CC902204EC7F0024217A /* Delegate.swift in Sources */, E4A83BF4222207D50098FED6 /* AlbumArtService.swift in Sources */, - E47E2FD5222071FD00F747E6 /* AlbumItem.swift in Sources */, + E47E2FD5222071FD00F747E6 /* AlbumViewItem.swift in Sources */, E408D3BE220E03EE0006D9BE /* RawRepresentable.swift in Sources */, E4E8CC922204F4B80024217A /* QueueViewController.swift in Sources */, E4EB237B220F7CF1008C70C0 /* Album.swift in Sources */, diff --git a/Persephone/Controllers/AlbumViewController.swift b/Persephone/Controllers/AlbumViewController.swift index 21ee848..144a455 100644 --- a/Persephone/Controllers/AlbumViewController.swift +++ b/Persephone/Controllers/AlbumViewController.swift @@ -57,7 +57,7 @@ class AlbumViewController: NSViewController, guard let albums = notification.userInfo?[Notification.albumsKey] as? [MPDClient.Album] else { return } - dataSource.albums = albums + dataSource.albums = albums.map { AlbumItem(album: $0, coverArt: nil) } albumCollectionView.reloadData() } diff --git a/Persephone/Controllers/AlbumItem.swift b/Persephone/Controllers/AlbumViewItem.swift similarity index 83% rename from Persephone/Controllers/AlbumItem.swift rename to Persephone/Controllers/AlbumViewItem.swift index df04a03..6931c0c 100644 --- a/Persephone/Controllers/AlbumItem.swift +++ b/Persephone/Controllers/AlbumViewItem.swift @@ -1,5 +1,5 @@ // -// AlbumItem.swift +// AlbumViewItem.swift // Persephone // // Created by Daniel Barber on 2019/2/08. @@ -8,9 +8,9 @@ import Cocoa -class AlbumItem: NSCollectionViewItem { +class AlbumViewItem: NSCollectionViewItem { var observer: NSKeyValueObservation? - var album: MPDClient.Album? + var album: AlbumItem? override func viewDidLoad() { super.viewDidLoad() @@ -44,10 +44,16 @@ class AlbumItem: NSCollectionViewItem { } } - func setAlbum(_ album: MPDClient.Album) { + func setAlbum(_ album: AlbumItem) { self.album = album albumTitle.stringValue = album.title albumArtist.stringValue = album.artist + + if let coverArt = album.coverArt { + albumCoverView.image = coverArt + } else { + albumCoverView.image = .defaultCoverArt + } } func setAppearance() { @@ -64,7 +70,7 @@ class AlbumItem: NSCollectionViewItem { @IBAction func playAlbum(_ sender: Any) { guard let album = album else { return } - AppDelegate.mpdClient.playAlbum(album) + AppDelegate.mpdClient.playAlbum(album.album) } @IBOutlet var albumCoverView: NSImageView! diff --git a/Persephone/DataSources/AlbumDataSource.swift b/Persephone/DataSources/AlbumDataSource.swift index 7d63005..965c798 100644 --- a/Persephone/DataSources/AlbumDataSource.swift +++ b/Persephone/DataSources/AlbumDataSource.swift @@ -9,19 +9,19 @@ import Cocoa class AlbumDataSource: NSObject, NSCollectionViewDataSource { - var albums: [MPDClient.Album] = [] + var albums: [AlbumItem] = [] func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { return albums.count } func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { - let item = collectionView.makeItem(withIdentifier: .albumItem, for: indexPath) - guard let albumItem = item as? AlbumItem else { return item } + let item = collectionView.makeItem(withIdentifier: .albumViewItem, for: indexPath) + guard let albumViewItem = item as? AlbumViewItem else { return item } - albumItem.view.wantsLayer = true - albumItem.setAlbum(albums[indexPath.item]) + albumViewItem.view.wantsLayer = true + albumViewItem.setAlbum(albums[indexPath.item]) - return albumItem + return albumViewItem } } diff --git a/Persephone/Extensions/NSImage.swift b/Persephone/Extensions/NSImage.swift index d85c8b9..d44d76f 100644 --- a/Persephone/Extensions/NSImage.swift +++ b/Persephone/Extensions/NSImage.swift @@ -11,4 +11,6 @@ import Cocoa extension NSImage { static let playIcon = NSImage(named: "playButton") static let pauseIcon = NSImage(named: "pauseButton") + + static let defaultCoverArt = NSImage(named: "blankAlbum") } diff --git a/Persephone/Extensions/NSUserInterfaceItemIdentifier.swift b/Persephone/Extensions/NSUserInterfaceItemIdentifier.swift index f80a19a..cbc958e 100644 --- a/Persephone/Extensions/NSUserInterfaceItemIdentifier.swift +++ b/Persephone/Extensions/NSUserInterfaceItemIdentifier.swift @@ -16,5 +16,5 @@ extension NSUserInterfaceItemIdentifier { static let queueSongArtist = NSUserInterfaceItemIdentifier("songArtistCell") static let queueSongTitle = NSUserInterfaceItemIdentifier("songTitleCell") - static let albumItem = NSUserInterfaceItemIdentifier("AlbumItem") + static let albumViewItem = NSUserInterfaceItemIdentifier("AlbumViewItem") } diff --git a/Persephone/Models/AlbumItem.swift b/Persephone/Models/AlbumItem.swift new file mode 100644 index 0000000..eafb627 --- /dev/null +++ b/Persephone/Models/AlbumItem.swift @@ -0,0 +1,22 @@ +// +// AlbumItem.swift +// Persephone +// +// Created by Daniel Barber on 2019/2/26. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import Cocoa + +struct AlbumItem { + var album: MPDClient.Album + var coverArt: NSImage? + + var title: String { + return album.title + } + + var artist: String { + return album.artist + } +} diff --git a/Persephone/Operations/AlbumArtOperation.swift b/Persephone/Operations/AlbumArtOperation.swift new file mode 100644 index 0000000..352c413 --- /dev/null +++ b/Persephone/Operations/AlbumArtOperation.swift @@ -0,0 +1,13 @@ +// +// File.swift +// Persephone +// +// Created by Daniel Barber on 2019/2/26. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import Cocoa + +class AlbumArtOperation: Operation { + +} diff --git a/Persephone/Operations/AlbumArtOperations.swift b/Persephone/Operations/AlbumArtOperations.swift new file mode 100644 index 0000000..ed91018 --- /dev/null +++ b/Persephone/Operations/AlbumArtOperations.swift @@ -0,0 +1,20 @@ +// +// AlbumArtOperationQueue.swift +// Persephone +// +// Created by Daniel Barber on 2019/2/26. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import Cocoa + +class AlbumArtOperations { + static let shared = AlbumArtOperations() + + lazy var fetchAlbumArtQueue: OperationQueue = { + var queue = OperationQueue() + queue.name = "Fetch Album Art queue" + queue.maxConcurrentOperationCount = 1 + return queue + }() +} diff --git a/Persephone/Resources/AlbumItem.xib b/Persephone/Resources/AlbumViewItem.xib similarity index 97% rename from Persephone/Resources/AlbumItem.xib rename to Persephone/Resources/AlbumViewItem.xib index a58c678..a2bf2bf 100644 --- a/Persephone/Resources/AlbumItem.xib +++ b/Persephone/Resources/AlbumViewItem.xib @@ -6,7 +6,7 @@ - + @@ -76,7 +76,7 @@ - + diff --git a/Persephone/Services/AlbumArtService.swift b/Persephone/Services/AlbumArtService.swift index 7a159d8..cfa7a12 100644 --- a/Persephone/Services/AlbumArtService.swift +++ b/Persephone/Services/AlbumArtService.swift @@ -13,7 +13,7 @@ class AlbumArtService: NSObject { static var shared = AlbumArtService() var session = URLSession(configuration: .default) - func fetchAlbumArt(for album: MPDClient.Album, callBack: @escaping (_ image: NSImage) -> Void) { + func fetchAlbumArt(for album: AlbumItem, callBack: @escaping (_ image: NSImage) -> Void) { let artist = album.artist let title = album.title