1
1
mirror of https://github.com/danbee/persephone synced 2025-03-04 08:39:11 +00:00

Compare commits

...

5 Commits

Author SHA1 Message Date
123f9c1e4a
Tweak priorities of commands 2020-02-16 14:39:12 -05:00
cd2e5efc95
Cache the small image when we get the browser art
We use the RawImageDataProvider here to pass the already downloaded
image onto this transform, to avoid fetching it from MPD again. The
180x180 size artwork is plenty big enough to use as source for the 32x32
queue/dragged song artwork.
2020-02-16 12:51:11 -05:00
a663315013
💄 2020-02-16 12:50:56 -05:00
6236884195
Fix a nasty deadlock 2020-02-16 12:50:32 -05:00
cff3e7bfc6
Bump version to 0.16.0-prealpha 2020-02-15 21:47:30 -05:00
8 changed files with 121 additions and 65 deletions

View File

@ -1201,7 +1201,7 @@
"$(inherited)",
"$(PROJECT_DIR)/libmpdclient/output",
);
MARKETING_VERSION = "0.15.2-alpha";
MARKETING_VERSION = "0.16.0-prealpha";
PRODUCT_BUNDLE_IDENTIFIER = me.danbarber.Persephone;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -1233,7 +1233,7 @@
"$(inherited)",
"$(PROJECT_DIR)/libmpdclient/output",
);
MARKETING_VERSION = "0.15.2-alpha";
MARKETING_VERSION = "0.16.0-prealpha";
PRODUCT_BUNDLE_IDENTIFIER = me.danbarber.Persephone;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";

View File

@ -71,7 +71,34 @@ class AlbumViewItem: NSCollectionViewItem {
.processor(DownsamplingImageProcessor(size: .albumListCoverSize)),
.scaleFactor(2),
]
)
) { result in
switch result {
case .success(let imageResult):
guard let imageData = imageResult.image.tiffRepresentation
else { return }
let rawProvider = RawImageDataProvider(
data: imageData,
cacheKey: album.hash
)
self.cacheSmallCover(provider: rawProvider)
case .failure(_):
break
}
}
}
func cacheSmallCover(provider: ImageDataProvider) {
_ = KingfisherManager.shared.retrieveImage(
with: .provider(provider),
options: [
.memoryCacheExpiration(.never),
.processor(DownsamplingImageProcessor(size: .queueSongCoverSize)),
.scaleFactor(2),
]
) { result in }
}
func setAppearance(selected isSelected: Bool) {

View File

@ -145,19 +145,6 @@ class AlbumDetailView: NSViewController {
.scaleFactor(2),
]
)
cacheSmallCover(provider: provider)
}
func cacheSmallCover(provider: MPDAlbumArtImageDataProvider) {
_ = KingfisherManager.shared.retrieveImage(
with: .provider(provider),
options: [
.memoryCacheExpiration(.never),
.processor(DownsamplingImageProcessor(size: .queueSongCoverSize)),
.scaleFactor(2),
]
) { result in }
}
func setAppearance() {

View File

@ -154,6 +154,7 @@ extension MPDClient {
self.idle(forceIdle)
}
commandOperation.queuePriority = priority
commandQueue.addOperation(commandOperation)
}

View File

@ -42,48 +42,48 @@ extension MPDClient {
func handleIdleResult(_ result: mpd_idle) {
let mpdIdle = MPDIdle(rawValue: result.rawValue)
let wasIdle: Bool
do {
idleLock.lock()
defer { idleLock.unlock() }
if isIdle {
isIdle = false
if mpdIdle.contains(.database) {
self.fetchAllAlbums()
}
if mpdIdle.contains(.queue) {
self.fetchQueue()
self.fetchStatus()
self.delegate?.didUpdateQueue(mpdClient: self, queue: self.queue)
if let status = self.status {
self.delegate?.didUpdateQueuePos(mpdClient: self, song: status.song)
}
}
if mpdIdle.contains(.player) || mpdIdle.contains(.options) {
self.fetchStatus()
if let status = self.status {
self.delegate?.didUpdateStatus(mpdClient: self, status: status)
self.delegate?.didUpdateQueuePos(mpdClient: self, song: status.song)
}
}
if mpdIdle.contains(.update) {
self.fetchStatus()
if self.status?.updating ?? false {
self.delegate?.willStartDatabaseUpdate(mpdClient: self)
} else {
self.delegate?.didFinishDatabaseUpdate(mpdClient: self)
}
}
}
wasIdle = isIdle
isIdle = false
}
if !mpdIdle.isEmpty {
self.idle()
if wasIdle {
if mpdIdle.contains(.database) {
self.fetchAllAlbums()
}
if mpdIdle.contains(.queue) {
self.fetchQueue()
self.fetchStatus()
self.delegate?.didUpdateQueue(mpdClient: self, queue: self.queue)
if let status = self.status {
self.delegate?.didUpdateQueuePos(mpdClient: self, song: status.song)
}
}
if mpdIdle.contains(.player) || mpdIdle.contains(.options) {
self.fetchStatus()
if let status = self.status {
self.delegate?.didUpdateStatus(mpdClient: self, status: status)
self.delegate?.didUpdateQueuePos(mpdClient: self, song: status.song)
}
}
if mpdIdle.contains(.update) {
self.fetchStatus()
if self.status?.updating ?? false {
self.delegate?.willStartDatabaseUpdate(mpdClient: self)
} else {
self.delegate?.didFinishDatabaseUpdate(mpdClient: self)
}
}
if !mpdIdle.isEmpty {
self.idle()
}
}
}
}

View File

@ -19,27 +19,51 @@ extension MPDClient {
}
func playTrack(at queuePos: Int) {
enqueueCommand(command: .playTrack, userData: ["queuePos": queuePos])
enqueueCommand(
command: .playTrack,
forceIdle: true,
userData: ["queuePos": queuePos]
)
}
func appendSong(_ song: MPDSong) {
enqueueCommand(command: .appendSong, userData: ["song": song])
enqueueCommand(
command: .appendSong,
forceIdle: true,
userData: ["song": song]
)
}
func removeSong(at queuePos: Int) {
enqueueCommand(command: .removeSong, userData: ["queuePos": queuePos])
enqueueCommand(
command: .removeSong,
forceIdle: true,
userData: ["queuePos": queuePos]
)
}
func moveSongInQueue(at queuePos: Int, to newQueuePos: Int) {
enqueueCommand(command: .moveSongInQueue, userData: ["oldQueuePos": queuePos, "newQueuePos": newQueuePos])
enqueueCommand(
command: .moveSongInQueue,
forceIdle: true,
userData: ["oldQueuePos": queuePos, "newQueuePos": newQueuePos]
)
}
func addSongToQueue(songUri: String, at queuePos: Int) {
enqueueCommand(command: .addSongToQueue, userData: ["uri": songUri, "queuePos": queuePos])
enqueueCommand(
command: .addSongToQueue,
forceIdle: true,
userData: ["uri": songUri, "queuePos": queuePos]
)
}
func addAlbumToQueue(album: MPDAlbum, at queuePos: Int) {
enqueueCommand(command: .addAlbumToQueue, userData: ["album": album, "queuePos": queuePos])
enqueueCommand(
command: .addAlbumToQueue,
forceIdle: true,
userData: ["album": album, "queuePos": queuePos]
)
}
func sendPlayTrack(at queuePos: Int) {

View File

@ -18,6 +18,7 @@ extension MPDClient {
) {
enqueueCommand(
command: .fetchAlbumArt,
priority: .low,
userData: [
"songUri": songUri,
"callback": callback,

View File

@ -11,25 +11,41 @@ import mpdclient
extension MPDClient {
func playPause() {
enqueueCommand(command: .playPause, priority: .veryHigh, forceIdle: true)
enqueueCommand(
command: .playPause,
priority: .high,
forceIdle: true
)
}
func stop() {
enqueueCommand(command: .stop, priority: .veryHigh, forceIdle: true)
enqueueCommand(
command: .stop,
priority: .high,
forceIdle: true
)
}
func prevTrack() {
enqueueCommand(command: .prevTrack, priority: .veryHigh, forceIdle: true)
enqueueCommand(
command: .prevTrack,
priority: .high,
forceIdle: true
)
}
func nextTrack() {
enqueueCommand(command: .nextTrack, priority: .veryHigh, forceIdle: true)
enqueueCommand(
command: .nextTrack,
priority: .high,
forceIdle: true
)
}
func seekCurrentSong(timeInSeconds: Float) {
enqueueCommand(
command: .seekCurrentSong,
priority: .veryHigh,
priority: .high,
forceIdle: true,
userData: ["timeInSeconds": timeInSeconds]
)
@ -38,7 +54,7 @@ extension MPDClient {
func setShuffleState(shuffleState: Bool) {
enqueueCommand(
command: .setShuffleState,
priority: .veryHigh,
priority: .high,
forceIdle: true,
userData: ["shuffleState": shuffleState]
)
@ -47,7 +63,7 @@ extension MPDClient {
func setRepeatState(repeatState: Bool) {
enqueueCommand(
command: .setRepeatState,
priority: .veryHigh,
priority: .high,
forceIdle: true,
userData: ["repeatState": repeatState]
)