Skip to content

Commit

Permalink
Subsonic API: Implement queue sync via "Queue" playlist
Browse files Browse the repository at this point in the history
The extra attributes "position" and "current" (track) are saved as JSON
comment of the playlist.
  • Loading branch information
jplitza committed Oct 15, 2023
1 parent 30b1143 commit 3fc2978
Showing 1 changed file with 36 additions and 4 deletions.
40 changes: 36 additions & 4 deletions lib/Controller/SubsonicController.php
Original file line number Diff line number Diff line change
Expand Up @@ -996,15 +996,47 @@ protected function deleteBookmark(string $id) {
* @SubsonicAPI
*/
protected function getPlayQueue() {
// TODO: not supported yet
return $this->subsonicResponse(['playQueue' => []]);
$playQueue = ['entry' => [], 'changedBy' => $this->userId];
$playlists = $this->playlistBusinessLayer->findAllByName('Queue', $this->userId);
if (\count($playlists) > 1) {
return $this->subsonicErrorResponse(10, 'Found multiple play queues');
} elseif (\count($playlists) == 1) {
$playlist = $playlists[0];
$tracks = $this->playlistBusinessLayer->getPlaylistTracks($playlist->id, $this->userId);
$playQueue['entry'] = $this->tracksToApi($tracks);
$playQueue['changed'] = Util::formatZuluDateTime($playlist->getUpdated());
$comment = $playlist->getComment();
if (!empty($comment) && $additional = \json_decode($comment, true)) {
$playQueue = \array_merge($playQueue, $additional);
}
}
return $this->subsonicResponse(['playQueue' => $playQueue]);
}

/**
* @SubsonicAPI
*/
protected function savePlayQueue() {
// TODO: not supported yet
protected function savePlayQueue(array $id, ?string $current = null, ?int $position = null) {
$playlists = $this->playlistBusinessLayer->findAllByName('Queue', $this->userId);
if (\count($playlists) == 0) {
$playlist = $this->playlistBusinessLayer->create('Queue', $this->userId);
} elseif (\count($playlists) > 1) {
return $this->subsonicErrorResponse(10, 'Found multiple play queues');
} else {
$playlist = $playlists[0];
}

$this->playlistBusinessLayer->setTracks(
\array_map('self::ripIdPrefix', $id),
$playlist->id,
$this->userId
);
$additional = [];
if (isset($current))
$additional['current'] = $current;
if (isset($position))
$additional['position'] = $position;
$this->playlistBusinessLayer->setComment(\json_encode($additional), $playlist->id, $this->userId);
return $this->subsonicResponse([]);
}

Expand Down

0 comments on commit 3fc2978

Please sign in to comment.