diff --git a/Persephone.xcodeproj/project.pbxproj b/Persephone.xcodeproj/project.pbxproj index 300c183..e77941a 100644 --- a/Persephone.xcodeproj/project.pbxproj +++ b/Persephone.xcodeproj/project.pbxproj @@ -74,6 +74,7 @@ E489E39D22B9CF0000CA8CBD /* NSView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489E39C22B9CF0000CA8CBD /* NSView.swift */; }; E489E3A422B9D31800CA8CBD /* DraggedSongView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */; }; E489E3A522B9D31800CA8CBD /* DraggedSongView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E489E3A322B9D31800CA8CBD /* DraggedSongView.xib */; }; + E48E92D7235113DF00A5E1BB /* Metadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = E48E92D6235113DF00A5E1BB /* Metadata.swift */; }; E4928E0B2218D62A001D4BEA /* CGColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4928E0A2218D62A001D4BEA /* CGColor.swift */; }; E49A5482233E580800EED353 /* PromiseKit in Frameworks */ = {isa = PBXBuildFile; productRef = E49A5481233E580800EED353 /* PromiseKit */; }; E49A5485233E5ADC00EED353 /* Differ in Frameworks */ = {isa = PBXBuildFile; productRef = E49A5484233E5ADC00EED353 /* Differ */; }; @@ -278,6 +279,7 @@ E489E39C22B9CF0000CA8CBD /* NSView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSView.swift; sourceTree = ""; }; E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggedSongView.swift; sourceTree = ""; }; E489E3A322B9D31800CA8CBD /* DraggedSongView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DraggedSongView.xib; sourceTree = ""; }; + E48E92D6235113DF00A5E1BB /* Metadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Metadata.swift; sourceTree = ""; }; E4928E0A2218D62A001D4BEA /* CGColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGColor.swift; sourceTree = ""; }; E4A3A6A022A457B600EA2C40 /* AlbumDetailSongListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumDetailSongListView.swift; sourceTree = ""; }; E4A642D922090CBE00067D21 /* MPDStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDStatus.swift; sourceTree = ""; }; @@ -734,6 +736,7 @@ E419E2862249B96600216A8C /* Song.swift */, E47E2FDC2220A6D100F747E6 /* Time.swift */, E4B11B72226A6C770075461B /* TrackTimer.swift */, + E48E92D6235113DF00A5E1BB /* Metadata.swift */, ); path = Models; sourceTree = ""; @@ -947,6 +950,7 @@ E41E5307223C019100173814 /* MPDClient+Status.swift in Sources */, E41E5310223EF6CE00173814 /* CoverArtService+Remote.swift in Sources */, E442CCCD2347E73C00004E0C /* Artist.swift in Sources */, + E48E92D7235113DF00A5E1BB /* Metadata.swift in Sources */, E41E530B223C033700173814 /* MPDClient+Album.swift in Sources */, E42410B62241B956005ED6DF /* MPDClient+Database.swift in Sources */, E4235640228623D2001216D6 /* QueueSongTitleView.swift in Sources */, diff --git a/Persephone/Components/Browser/Album Browser/AlbumDataSource.swift b/Persephone/Components/Browser/Album Browser/AlbumDataSource.swift index 21f7422..be21924 100644 --- a/Persephone/Components/Browser/Album Browser/AlbumDataSource.swift +++ b/Persephone/Components/Browser/Album Browser/AlbumDataSource.swift @@ -28,6 +28,15 @@ class AlbumDataSource: NSObject, NSCollectionViewDataSource { App.mpdClient.getAlbumFirstSong(for: albums[indexPath.item].mpdAlbum) { mpdSong in guard let mpdSong = mpdSong else { return } + DispatchQueue.main.async { + App.store.dispatch( + UpdateAlbumMetaData( + metadata: Metadata(date: mpdSong.date), + albumIndex: indexPath.item + ) + ) + } + CoverArtService(song: Song(mpdSong: mpdSong)) .fetchCoverArt() .done { image in diff --git a/Persephone/Components/Browser/Album Detail/AlbumDetailView.swift b/Persephone/Components/Browser/Album Detail/AlbumDetailView.swift index f7ca636..94e4b72 100644 --- a/Persephone/Components/Browser/Album Detail/AlbumDetailView.swift +++ b/Persephone/Components/Browser/Album Detail/AlbumDetailView.swift @@ -17,7 +17,7 @@ class AlbumDetailView: NSViewController { @IBOutlet var albumTracksView: NSTableView! @IBOutlet var albumTitle: NSTextField! - @IBOutlet var albumArtist: NSTextField! + @IBOutlet var albumMetadata: NSTextFieldCell! @IBOutlet var albumCoverView: NSImageView! override func viewDidLoad() { @@ -41,8 +41,10 @@ class AlbumDetailView: NSViewController { getAlbumSongs(for: album) + let date = album.metadata?.date ?? "" + albumTitle.stringValue = album.title - albumArtist.stringValue = album.artist + albumMetadata.stringValue = "\(album.artist) · \(date)" switch album.coverArt { case .loaded(let coverArt): @@ -58,7 +60,7 @@ class AlbumDetailView: NSViewController { dataSource.albumSongs = [] albumTracksView.reloadData() albumTitle.stringValue = "" - albumArtist.stringValue = "" + albumMetadata.stringValue = "" albumCoverView.image = .defaultCoverArt App.store.dispatch(SetSelectedSong(selectedSong: nil)) diff --git a/Persephone/Components/Browser/Album Detail/AlbumDetailView.xib b/Persephone/Components/Browser/Album Detail/AlbumDetailView.xib index 1129cc1..ecb8700 100644 --- a/Persephone/Components/Browser/Album Detail/AlbumDetailView.xib +++ b/Persephone/Components/Browser/Album Detail/AlbumDetailView.xib @@ -10,6 +10,7 @@ + @@ -34,7 +35,7 @@ - + @@ -219,15 +220,15 @@ - + - - - + + - + diff --git a/Persephone/MPDClient/Models/MPDSong.swift b/Persephone/MPDClient/Models/MPDSong.swift index 84d0a15..df4cba3 100644 --- a/Persephone/MPDClient/Models/MPDSong.swift +++ b/Persephone/MPDClient/Models/MPDSong.swift @@ -48,6 +48,10 @@ extension MPDClient { } } + var date: String { + return getTag(.date) + } + func getTag(_ tagType: MPDTag) -> String { guard let tag = mpd_song_get_tag(song, tagType.mpdTag(), 0) else { return "" } diff --git a/Persephone/Models/Album.swift b/Persephone/Models/Album.swift index df91dc7..ca67bf2 100644 --- a/Persephone/Models/Album.swift +++ b/Persephone/Models/Album.swift @@ -12,6 +12,7 @@ import CryptoSwift struct Album { var mpdAlbum: MPDClient.MPDAlbum var coverArt: Loading = .notLoaded + var metadata: Metadata? init(mpdAlbum: MPDClient.MPDAlbum) { self.mpdAlbum = mpdAlbum diff --git a/Persephone/Models/Metadata.swift b/Persephone/Models/Metadata.swift new file mode 100644 index 0000000..8474e7e --- /dev/null +++ b/Persephone/Models/Metadata.swift @@ -0,0 +1,13 @@ +// +// Metadata.swift +// Persephone +// +// Created by Daniel Barber on 2019/10/11. +// Copyright © 2019 Dan Barber. All rights reserved. +// + +import Foundation + +struct Metadata { + var date: String? +} diff --git a/Persephone/State/Actions/AlbumListActions.swift b/Persephone/State/Actions/AlbumListActions.swift index bab922c..1457335 100644 --- a/Persephone/State/Actions/AlbumListActions.swift +++ b/Persephone/State/Actions/AlbumListActions.swift @@ -16,6 +16,11 @@ struct UpdateCoverArtAction: Action { var albumIndex: Int } +struct UpdateAlbumMetaData: Action { + var metadata: Metadata + var albumIndex: Int +} + struct UpdateAlbumListAction: Action { var albums: [MPDClient.MPDAlbum] } diff --git a/Persephone/State/Reducers/AlbumListReducer.swift b/Persephone/State/Reducers/AlbumListReducer.swift index f97a7ff..ea5603d 100644 --- a/Persephone/State/Reducers/AlbumListReducer.swift +++ b/Persephone/State/Reducers/AlbumListReducer.swift @@ -18,6 +18,9 @@ func albumListReducer(action: Action, state: AlbumListState?) -> AlbumListState case let action as UpdateCoverArtAction: state.albums[action.albumIndex].coverArt = .loaded(action.coverArt) + case let action as UpdateAlbumMetaData: + state.albums[action.albumIndex].metadata = action.metadata + case is ResetAlbumListCoverArtAction: state.albums = state.albums.map { var album = $0