diff options
-rw-r--r-- | backend.js | 15 | ||||
-rw-r--r-- | socket.js | 27 |
2 files changed, 40 insertions, 2 deletions
diff --git a/backend.js b/backend.js index e75b1a8..0864d09 100644 --- a/backend.js +++ b/backend.js @@ -68,6 +68,7 @@ class QueuePlayer extends EventEmitter { this.pauseNextTrack = false this.queueEndMode = 'end' // end, loop, shuffle this.alwaysStartPaused = false + this.waitWhenDonePlaying = false this.playedTrackToEnd = false this.timeData = null @@ -444,7 +445,10 @@ class QueuePlayer extends EventEmitter { if (playingThisTrack) { this.playedTrackToEnd = true - this.playNext(item) + this.emit('done playing', this.playingTrack) + if (!this.waitWhenDonePlaying && !this.playNext(item)) { + this.clearPlayingTrack() + } } } @@ -695,6 +699,7 @@ export default class Backend extends EventEmitter { this.queuePlayers = [] this.alwaysStartPaused = false + this.waitWhenDonePlaying = false this.recordStore = new RecordStore() this.throttleMetadata = throttlePromise(10) @@ -727,6 +732,7 @@ export default class Backend extends EventEmitter { } queuePlayer.alwaysStartPaused = this.alwaysStartPaused + queuePlayer.waitWhenDonePlaying = this.waitWhenDonePlaying this.queuePlayers.push(queuePlayer) this.emit('added queue player', queuePlayer) @@ -862,6 +868,13 @@ export default class Backend extends EventEmitter { } } + setWaitWhenDonePlaying(value) { + this.waitWhenDonePlaying = !!value + for (const queuePlayer of this.queuePlayers) { + queuePlayer.waitWhenDonePlaying = !!value + } + } + async stopPlayingAll() { for (const queuePlayer of this.queuePlayers) { await queuePlayer.stopPlaying() diff --git a/socket.js b/socket.js index aea2ee8..52a2d51 100644 --- a/socket.js +++ b/socket.js @@ -170,6 +170,7 @@ function validateCommand(command) { ) case 'status': return ( + command.status === 'done-playing' || ( command.status === 'ready-to-resume' && typeof command.queuePlayer === 'string' @@ -227,8 +228,9 @@ export function makeSocketServer() { server.canonicalBackend = null - // readyToResume -> queue player id -> array: socket + // <variable> -> queue player id -> array: socket const readyToResume = {} + const donePlaying = {} server.on('connection', socket => { sockets.push(socket) @@ -263,6 +265,19 @@ export function makeSocketServer() { if (command.code === 'status') { switch (command.status) { + case 'done-playing': { + const doneSockets = donePlaying[command.queuePlayer] + if (doneSockets && !doneSockets.includes(socket)) { + doneSockets.push(socket) + if (doneSockets.length === sockets.length) { + // determine next track + for (const socket of sockets) { + // play next track + } + delete donePlaying[command.queuePlayer] + } + } + } case 'ready-to-resume': { const readySockets = readyToResume[command.queuePlayer] if (readySockets && !readySockets.includes(socket)) { @@ -276,6 +291,7 @@ export function makeSocketServer() { startingTrack: true, paused: false }) + '\n') + donePlaying[command.queuePlayer] = [] } delete readyToResume[command.queuePlayer] } @@ -396,6 +412,7 @@ export function attachBackendToSocketClient(backend, client, { // other through commands lives here. backend.setAlwaysStartPaused(true) + backend.setWaitWhenDonePlaying(true) function logCommand(command) { const nickToMessage = nickname => `\x1b[32;1m${nickname}\x1b[0m` @@ -609,6 +626,14 @@ export function attachBackendToSocketClient(backend, client, { }) }) + backend.on('done playing', queuePlayer => { + client.sendCommand({ + code: 'status', + status: 'done-playing', + queuePlayer: queuePlayer.id + }) + }) + backend.on('playing', (queuePlayer, track) => { if (track) { client.sendCommand({ |