mirror of
https://github.com/danbee/persephone
synced 2025-03-04 08:39:11 +00:00
Add year to album details display
This commit is contained in:
parent
3eae535be6
commit
93d01d5176
@ -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 = "<group>"; };
|
||||
E489E3A222B9D31800CA8CBD /* DraggedSongView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggedSongView.swift; sourceTree = "<group>"; };
|
||||
E489E3A322B9D31800CA8CBD /* DraggedSongView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DraggedSongView.xib; sourceTree = "<group>"; };
|
||||
E48E92D6235113DF00A5E1BB /* Metadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Metadata.swift; sourceTree = "<group>"; };
|
||||
E4928E0A2218D62A001D4BEA /* CGColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGColor.swift; sourceTree = "<group>"; };
|
||||
E4A3A6A022A457B600EA2C40 /* AlbumDetailSongListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumDetailSongListView.swift; sourceTree = "<group>"; };
|
||||
E4A642D922090CBE00067D21 /* MPDStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPDStatus.swift; sourceTree = "<group>"; };
|
||||
@ -734,6 +736,7 @@
|
||||
E419E2862249B96600216A8C /* Song.swift */,
|
||||
E47E2FDC2220A6D100F747E6 /* Time.swift */,
|
||||
E4B11B72226A6C770075461B /* TrackTimer.swift */,
|
||||
E48E92D6235113DF00A5E1BB /* Metadata.swift */,
|
||||
);
|
||||
path = Models;
|
||||
sourceTree = "<group>";
|
||||
@ -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 */,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
<connections>
|
||||
<outlet property="albumArtist" destination="4Jx-I5-Nkv" id="mct-x3-yYC"/>
|
||||
<outlet property="albumCoverView" destination="FWd-vZ-5CT" id="aHh-Bz-XQW"/>
|
||||
<outlet property="albumMetadata" destination="ztJ-4E-qvI" id="YGK-TG-RPt"/>
|
||||
<outlet property="albumTitle" destination="m2v-pR-e9v" id="M5i-u6-Nev"/>
|
||||
<outlet property="albumTracksView" destination="ehr-qh-87Q" id="fSa-Di-CqI"/>
|
||||
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||
@ -34,7 +35,7 @@
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4Jx-I5-Nkv">
|
||||
<rect key="frame" x="357" y="488" width="448" height="19"/>
|
||||
<textFieldCell key="cell" title="Artist Name" id="ztJ-4E-qvI">
|
||||
<textFieldCell key="cell" title="Metadata" id="ztJ-4E-qvI">
|
||||
<font key="font" metaFont="system" size="16"/>
|
||||
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
@ -219,15 +220,15 @@
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
<button verticalHuggingPriority="750" misplaced="YES" imageHugsTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jMU-bv-TNF">
|
||||
<rect key="frame" x="31" y="32" width="119" height="35"/>
|
||||
<button verticalHuggingPriority="750" imageHugsTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jMU-bv-TNF">
|
||||
<rect key="frame" x="31" y="184" width="119" height="35"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="33" id="2uQ-mC-4QY"/>
|
||||
<constraint firstAttribute="width" constant="119" id="h2n-ZB-Ufr"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="smallSquare" title="Play Album" bezelStyle="smallSquare" image="playButton" imagePosition="left" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Rtg-Zd-JYc">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<font key="font" metaFont="systemMedium" size="13"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="playAlbum:" target="-2" id="LTw-Lg-yH2"/>
|
||||
@ -235,20 +236,20 @@
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="BOb-Lr-10M" firstAttribute="top" secondItem="4Jx-I5-Nkv" secondAttribute="bottom" constant="29" id="1ty-6R-dGL"/>
|
||||
<constraint firstItem="FWd-vZ-5CT" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="31" id="694-aS-G4N"/>
|
||||
<constraint firstItem="jMU-bv-TNF" firstAttribute="leading" secondItem="FWd-vZ-5CT" secondAttribute="leading" id="AwZ-M4-fep"/>
|
||||
<constraint firstItem="BOb-Lr-10M" firstAttribute="leading" secondItem="4Jx-I5-Nkv" secondAttribute="leading" id="GEK-R3-Sw6"/>
|
||||
<constraint firstItem="BOb-Lr-10M" firstAttribute="top" secondItem="4Jx-I5-Nkv" secondAttribute="bottom" constant="29" id="K5g-Kd-iHK"/>
|
||||
<constraint firstAttribute="bottom" secondItem="BOb-Lr-10M" secondAttribute="bottom" constant="33" id="MZ6-81-2qe"/>
|
||||
<constraint firstItem="4Jx-I5-Nkv" firstAttribute="leading" secondItem="m2v-pR-e9v" secondAttribute="leading" id="NaJ-VT-uln"/>
|
||||
<constraint firstAttribute="bottom" secondItem="BOb-Lr-10M" secondAttribute="bottom" constant="33" id="Q1M-yZ-LHD"/>
|
||||
<constraint firstItem="FWd-vZ-5CT" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="25" id="QA9-xn-fzY"/>
|
||||
<constraint firstItem="m2v-pR-e9v" firstAttribute="top" secondItem="FWd-vZ-5CT" secondAttribute="top" id="bqi-HD-KZW"/>
|
||||
<constraint firstItem="jMU-bv-TNF" firstAttribute="top" secondItem="FWd-vZ-5CT" secondAttribute="bottom" constant="25" id="dd1-6b-TEN"/>
|
||||
<constraint firstItem="4Jx-I5-Nkv" firstAttribute="trailing" secondItem="m2v-pR-e9v" secondAttribute="trailing" id="dmh-TC-Ncr"/>
|
||||
<constraint firstItem="m2v-pR-e9v" firstAttribute="leading" secondItem="FWd-vZ-5CT" secondAttribute="trailing" constant="28" id="icS-vq-PkK"/>
|
||||
<constraint firstItem="4Jx-I5-Nkv" firstAttribute="top" secondItem="m2v-pR-e9v" secondAttribute="bottom" constant="8" symbolic="YES" id="nTZ-Ew-sDQ"/>
|
||||
<constraint firstItem="BOb-Lr-10M" firstAttribute="leading" secondItem="4Jx-I5-Nkv" secondAttribute="leading" id="pXJ-Jl-uAG"/>
|
||||
<constraint firstAttribute="trailing" secondItem="m2v-pR-e9v" secondAttribute="trailing" constant="20" symbolic="YES" id="qyi-X9-6B9"/>
|
||||
<constraint firstItem="BOb-Lr-10M" firstAttribute="trailing" secondItem="4Jx-I5-Nkv" secondAttribute="trailing" id="sPx-cY-MeX"/>
|
||||
<constraint firstItem="BOb-Lr-10M" firstAttribute="trailing" secondItem="4Jx-I5-Nkv" secondAttribute="trailing" id="zOM-i7-cog"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="262.5" y="121"/>
|
||||
</customView>
|
||||
|
||||
@ -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 "" }
|
||||
|
||||
@ -12,6 +12,7 @@ import CryptoSwift
|
||||
struct Album {
|
||||
var mpdAlbum: MPDClient.MPDAlbum
|
||||
var coverArt: Loading<NSImage?> = .notLoaded
|
||||
var metadata: Metadata?
|
||||
|
||||
init(mpdAlbum: MPDClient.MPDAlbum) {
|
||||
self.mpdAlbum = mpdAlbum
|
||||
|
||||
13
Persephone/Models/Metadata.swift
Normal file
13
Persephone/Models/Metadata.swift
Normal file
@ -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?
|
||||
}
|
||||
@ -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]
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user