aboutsummaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
Diffstat (limited to 'src/services')
-rw-r--r--src/services/player.ts34
-rw-r--r--src/services/queue.ts14
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 {