2020-09-25 09:44:30 +02:00
|
|
|
/**
|
|
|
|
* Module that exposes SyncPlay calls to external modules.
|
2020-11-23 14:27:54 +01:00
|
|
|
* @module components/syncPlay/core/Controller
|
2020-09-25 09:44:30 +02:00
|
|
|
*/
|
|
|
|
|
2020-11-23 14:27:54 +01:00
|
|
|
import * as Helper from './Helper';
|
2020-09-25 09:44:30 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Class that exposes SyncPlay calls to external modules.
|
|
|
|
*/
|
2020-11-23 14:27:54 +01:00
|
|
|
class Controller {
|
2020-09-25 09:44:30 +02:00
|
|
|
constructor() {
|
|
|
|
this.manager = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes the controller.
|
2020-11-23 14:27:54 +01:00
|
|
|
* @param {Manager} syncPlayManager The SyncPlay manager.
|
2020-09-25 09:44:30 +02:00
|
|
|
*/
|
|
|
|
init(syncPlayManager) {
|
|
|
|
this.manager = syncPlayManager;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Toggles playback status in SyncPlay group.
|
|
|
|
*/
|
|
|
|
playPause() {
|
|
|
|
if (this.manager.isPlaying()) {
|
|
|
|
this.pause();
|
|
|
|
} else {
|
|
|
|
this.unpause();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Unpauses playback in SyncPlay group.
|
|
|
|
*/
|
|
|
|
unpause() {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlayUnpause();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Pauses playback in SyncPlay group.
|
|
|
|
*/
|
|
|
|
pause() {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlayPause();
|
|
|
|
|
|
|
|
// Pause locally as well, to give the user some little control.
|
|
|
|
const playerWrapper = this.manager.getPlayerWrapper();
|
|
|
|
playerWrapper.localPause();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Seeks playback to specified position in SyncPlay group.
|
|
|
|
* @param {number} positionTicks The position.
|
|
|
|
*/
|
|
|
|
seek(positionTicks) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlaySeek({
|
|
|
|
PositionTicks: positionTicks
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Starts playback in SyncPlay group.
|
|
|
|
* @param {Object} options The play data.
|
|
|
|
*/
|
|
|
|
play(options) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
const sendPlayRequest = (items) => {
|
|
|
|
const queue = items.map(item => item.Id);
|
2022-02-26 15:03:18 +03:00
|
|
|
return apiClient.requestSyncPlaySetNewQueue({
|
2020-11-28 14:24:01 +01:00
|
|
|
PlayingQueue: queue,
|
2020-09-25 09:44:30 +02:00
|
|
|
PlayingItemPosition: options.startIndex ? options.startIndex : 0,
|
|
|
|
StartPositionTicks: options.startPositionTicks ? options.startPositionTicks : 0
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
if (options.items) {
|
2022-02-26 15:03:18 +03:00
|
|
|
return Helper.translateItemsForPlayback(apiClient, options.items, options).then(sendPlayRequest);
|
2020-09-25 09:44:30 +02:00
|
|
|
} else {
|
2022-02-26 15:03:18 +03:00
|
|
|
return Helper.getItemsForPlayback(apiClient, {
|
2020-09-25 09:44:30 +02:00
|
|
|
Ids: options.ids.join(',')
|
|
|
|
}).then(function (result) {
|
2022-02-26 15:03:18 +03:00
|
|
|
return Helper.translateItemsForPlayback(apiClient, result.Items, options).then(sendPlayRequest);
|
2020-09-25 09:44:30 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets current playing item in SyncPlay group.
|
|
|
|
* @param {string} playlistItemId The item playlist identifier.
|
|
|
|
*/
|
|
|
|
setCurrentPlaylistItem(playlistItemId) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlaySetPlaylistItem({
|
|
|
|
PlaylistItemId: playlistItemId
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-01-24 01:02:10 +01:00
|
|
|
/**
|
|
|
|
* Clears the playlist of a SyncPlay group.
|
|
|
|
* @param {Array} clearPlayingItem Whether to remove the playing item as well.
|
|
|
|
*/
|
|
|
|
clearPlaylist(clearPlayingItem = false) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlayRemoveFromPlaylist({
|
|
|
|
ClearPlaylist: true,
|
|
|
|
ClearPlayingItem: clearPlayingItem
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-09-25 09:44:30 +02:00
|
|
|
/**
|
|
|
|
* Removes items from SyncPlay group playlist.
|
|
|
|
* @param {Array} playlistItemIds The items to remove.
|
|
|
|
*/
|
|
|
|
removeFromPlaylist(playlistItemIds) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlayRemoveFromPlaylist({
|
|
|
|
PlaylistItemIds: playlistItemIds
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Moves an item in the SyncPlay group playlist.
|
|
|
|
* @param {string} playlistItemId The item playlist identifier.
|
|
|
|
* @param {number} newIndex The new position.
|
|
|
|
*/
|
|
|
|
movePlaylistItem(playlistItemId, newIndex) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlayMovePlaylistItem({
|
|
|
|
PlaylistItemId: playlistItemId,
|
|
|
|
NewIndex: newIndex
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds items to the SyncPlay group playlist.
|
|
|
|
* @param {Object} options The items to add.
|
|
|
|
* @param {string} mode The queue mode, optional.
|
|
|
|
*/
|
|
|
|
queue(options, mode = 'Queue') {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
if (options.items) {
|
|
|
|
Helper.translateItemsForPlayback(apiClient, options.items, options).then((items) => {
|
|
|
|
const itemIds = items.map(item => item.Id);
|
|
|
|
apiClient.requestSyncPlayQueue({
|
2020-11-28 14:24:01 +01:00
|
|
|
ItemIds: itemIds,
|
2020-09-25 09:44:30 +02:00
|
|
|
Mode: mode
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
Helper.getItemsForPlayback(apiClient, {
|
|
|
|
Ids: options.ids.join(',')
|
|
|
|
}).then(function (result) {
|
|
|
|
Helper.translateItemsForPlayback(apiClient, result.Items, options).then((items) => {
|
|
|
|
const itemIds = items.map(item => item.Id);
|
|
|
|
apiClient.requestSyncPlayQueue({
|
2020-11-28 14:24:01 +01:00
|
|
|
ItemIds: itemIds,
|
2020-09-25 09:44:30 +02:00
|
|
|
Mode: mode
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds items to the SyncPlay group playlist after the playing item.
|
|
|
|
* @param {Object} options The items to add.
|
|
|
|
*/
|
|
|
|
queueNext(options) {
|
|
|
|
this.queue(options, 'QueueNext');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-12-03 15:55:28 +01:00
|
|
|
* Plays next item from playlist in SyncPlay group.
|
2020-09-25 09:44:30 +02:00
|
|
|
*/
|
2020-12-03 15:55:28 +01:00
|
|
|
nextItem() {
|
2020-09-25 09:44:30 +02:00
|
|
|
const apiClient = this.manager.getApiClient();
|
2020-12-03 15:55:28 +01:00
|
|
|
apiClient.requestSyncPlayNextItem({
|
2020-09-25 09:44:30 +02:00
|
|
|
PlaylistItemId: this.manager.getQueueCore().getCurrentPlaylistItemId()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2020-12-03 15:55:28 +01:00
|
|
|
* Plays previous item from playlist in SyncPlay group.
|
2020-09-25 09:44:30 +02:00
|
|
|
*/
|
2020-12-03 15:55:28 +01:00
|
|
|
previousItem() {
|
2020-09-25 09:44:30 +02:00
|
|
|
const apiClient = this.manager.getApiClient();
|
2020-12-03 15:55:28 +01:00
|
|
|
apiClient.requestSyncPlayPreviousItem({
|
2020-09-25 09:44:30 +02:00
|
|
|
PlaylistItemId: this.manager.getQueueCore().getCurrentPlaylistItemId()
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the repeat mode in SyncPlay group.
|
|
|
|
* @param {string} mode The repeat mode.
|
|
|
|
*/
|
|
|
|
setRepeatMode(mode) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlaySetRepeatMode({
|
|
|
|
Mode: mode
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the shuffle mode in SyncPlay group.
|
|
|
|
* @param {string} mode The shuffle mode.
|
|
|
|
*/
|
|
|
|
setShuffleMode(mode) {
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlaySetShuffleMode({
|
|
|
|
Mode: mode
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Toggles the shuffle mode in SyncPlay group.
|
|
|
|
*/
|
|
|
|
toggleShuffleMode() {
|
|
|
|
let mode = this.manager.getQueueCore().getShuffleMode();
|
|
|
|
mode = mode === 'Sorted' ? 'Shuffle' : 'Sorted';
|
|
|
|
|
|
|
|
const apiClient = this.manager.getApiClient();
|
|
|
|
apiClient.requestSyncPlaySetShuffleMode({
|
|
|
|
Mode: mode
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-23 14:27:54 +01:00
|
|
|
export default Controller;
|