diff options
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/player.ts | 34 | ||||
| -rw-r--r-- | src/services/queue.ts | 14 |
2 files changed, 20 insertions, 28 deletions
diff --git a/src/services/player.ts b/src/services/player.ts index 74803f8..ff14e23 100644 --- a/src/services/player.ts +++ b/src/services/player.ts @@ -19,6 +19,7 @@ export default class { private readonly queue: Queue; private readonly cacheDir: string; private dispatcher: StreamDispatcher | null = null; + private nowPlaying: QueuedSong | null = null; private playPositionInterval: NodeJS.Timeout | undefined; private positionInSeconds = 0; @@ -44,6 +45,7 @@ export default class { this.voiceConnection.disconnect(); } + this.positionInSeconds = 0; this.voiceConnection = null; this.dispatcher = null; } @@ -56,7 +58,7 @@ export default class { throw new Error('Not connected to a voice channel.'); } - const currentSong = this.getCurrentSong(); + const currentSong = this.queue.getCurrent(); if (!currentSong) { throw new Error('No song currently playing'); @@ -85,26 +87,17 @@ export default class { throw new Error('Not connected to a voice channel.'); } - const currentSong = this.getCurrentSong(); + const currentSong = this.queue.getCurrent(); if (!currentSong) { throw new Error('Queue empty.'); } // Resume from paused state - if (this.status === STATUS.PAUSED && this.getPosition() !== 0) { - if (this.dispatcher) { - this.dispatcher.resume(); - this.status = STATUS.PLAYING; - return; - } - - if (!currentSong.isLive) { - await this.seek(this.getPosition()); - return; - } - - // Must be livestream, continue + if (this.status === STATUS.PAUSED && this.getPosition() !== 0 && this.dispatcher && currentSong.url === this.nowPlaying?.url) { + this.dispatcher.resume(); + this.status = STATUS.PLAYING; + return; } if (await this.isCached(currentSong.url)) { @@ -117,6 +110,7 @@ export default class { this.attachListeners(); this.status = STATUS.PLAYING; + this.nowPlaying = currentSong; this.startTrackingPosition(); } @@ -135,16 +129,6 @@ export default class { this.stopTrackingPosition(); } - private getCurrentSong(): QueuedSong|null { - const songs = this.queue.get(); - - if (songs.length === 0) { - return null; - } - - return songs[0]; - } - private getCachedPath(url: string): string { return path.join(this.cacheDir, hasha(url)); } diff --git a/src/services/queue.ts b/src/services/queue.ts index c929eea..1c766f1 100644 --- a/src/services/queue.ts +++ b/src/services/queue.ts @@ -34,8 +34,16 @@ export default class { } } + getCurrent(): QueuedSong | null { + if (this.queue[this.position]) { + return this.queue[this.position]; + } + + return null; + } + get(): QueuedSong[] { - return this.queue.slice(this.position); + return this.queue.slice(this.position + 1); } add(song: QueuedSong): void { @@ -61,7 +69,7 @@ export default class { } shuffle(): void { - this.queue = [this.queue[0], ...shuffle(this.queue.slice(1))]; + this.queue = [...this.queue.slice(0, this.position), this.queue[this.position], this.queue[0], ...shuffle(this.queue.slice(this.position + 1))]; } clear(): void { @@ -76,7 +84,7 @@ export default class { } size(): number { - return this.queue.length; + return this.get().length; } isEmpty(): boolean { |
