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

130 lines
3.5 KiB
Swift

//
// CommandQueue.swift
// Persephone
//
// Created by Daniel Barber on 2019/3/15.
// Copyright © 2019 Dan Barber. All rights reserved.
//
import Foundation
extension MPDClient {
func sendCommand(
command: MPDCommand,
userData: Dictionary<String, Any> = [:]
) {
switch command {
// Transport commands
case .prevTrack:
sendPreviousTrack()
case .nextTrack:
sendNextTrack()
case .stop:
sendStop()
case .playPause:
sendPlay()
case .seekCurrentSong:
guard let timeInSeconds = userData["timeInSeconds"] as? Float
else { return }
sendSeekCurrentSong(timeInSeconds: timeInSeconds)
case .setShuffleState:
guard let shuffleState = userData["shuffleState"] as? Bool
else { return }
sendShuffleState(shuffleState: shuffleState)
case .setRepeatState:
guard let repeatState = userData["repeatState"] as? Bool
else { return }
sendRepeatState(repeatState: repeatState)
// Database commands
case .updateDatabase:
sendUpdateDatabase()
// Status commands
case .fetchStatus:
sendRunStatus()
// Queue commands
case .fetchQueue:
sendFetchQueue()
case .playTrack:
guard let queuePos = userData["queuePos"] as? Int
else { return }
sendPlayTrack(at: queuePos)
case .clearQueue:
sendClearQueue()
case .replaceQueue:
guard let songs = userData["songs"] as? [MPDSong]
else { return }
sendReplaceQueue(songs)
case .appendSong:
guard let song = userData["song"] as? MPDSong
else { return }
sendAppendSong(song)
case .removeSong:
guard let queuePos = userData["queuePos"] as? Int
else { return }
sendRemoveSong(at: queuePos)
case .moveSongInQueue:
guard let oldQueuePos = userData["oldQueuePos"] as? Int,
let newQueuePos = userData["newQueuePos"] as? Int
else { return }
sendMoveSongInQueue(at: oldQueuePos, to: newQueuePos)
case .addSongToQueue:
guard let songUri = userData["uri"] as? String,
let queuePos = userData["queuePos"] as? Int
else { return }
sendAddSongToQueue(uri: songUri, at: queuePos)
case .addAlbumToQueue:
guard let album = userData["album"] as? MPDAlbum,
let queuePos = userData["queuePos"] as? Int
else { return }
sendAddAlbumToQueue(album: album, at: queuePos)
// Album commands
case .fetchAllAlbums:
allAlbums()
case .playAlbum:
guard let album = userData["album"] as? MPDAlbum else { return }
sendPlayAlbum(album)
case .getAlbumFirstSong:
guard let album = userData["album"] as? MPDAlbum,
let callback = userData["callback"] as? (MPDSong?) -> Void
else { return }
albumFirstSong(for: album, callback: callback)
case .getAlbumSongs:
guard let album = userData["album"] as? MPDAlbum,
let callback = userData["callback"] as? ([MPDSong]) -> Void
else { return }
albumSongs(for: album, callback: callback)
}
}
func enqueueCommand(
command: MPDCommand,
priority: BlockOperation.QueuePriority = .normal,
userData: Dictionary<String, Any> = [:]
) {
guard isConnected else { return }
noIdle()
let commandOperation = BlockOperation() { [unowned self] in
self.sendCommand(command: command, userData: userData)
self.idle()
}
commandOperation.queuePriority = priority
commandQueue.addOperation(commandOperation)
}
}