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

161 lines
4.4 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 {
case .connect:
guard let host = userData["host"] as? String,
let port = userData["port"] as? Int
else { return }
createConnection(host: host, port: port)
case .disconnect:
freeConnection()
// 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)
// Artist commands
case .fetchAllArtists:
allArtists()
// Album commands
case .fetchAlbums:
guard let filter = userData["filter"] as? String else { return }
albums(filter: filter)
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)
// Song commands
case .fetchAlbumArt:
guard let songUri = userData["songUri"] as? String,
let offset = userData["offset"] as? Int32,
let callback = userData["callback"] as? (Data?) -> Void
else { return }
let imageData = userData["imageData"] as? Data? ?? nil
sendFetchAlbumArt(
forUri: songUri,
imageData: imageData,
offset: offset,
callback: callback
)
}
}
func enqueueCommand(
command: MPDCommand,
priority: BlockOperation.QueuePriority = .normal,
forceIdle: Bool = false,
userData: Dictionary<String, Any> = [:]
) {
guard isConnected else { return }
noIdle()
let commandOperation = BlockOperation() { [unowned self] in
self.sendCommand(command: command, userData: userData)
self.idle(forceIdle)
}
commandOperation.queuePriority = priority
commandQueue.addOperation(commandOperation)
}
}