From 8c29f679165c27e98ef0f0586e0bec6f966e6482 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Mon, 13 Dec 2021 23:17:15 +0100 Subject: [PATCH] Cleanup old listeners in attachListeners even if the player doesn't idle --- play-dl/index.ts | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/play-dl/index.ts b/play-dl/index.ts index cdadf95..ca0f1e7 100644 --- a/play-dl/index.ts +++ b/play-dl/index.ts @@ -423,14 +423,29 @@ export function authorization(): void { * @param resource A {@link YouTubeStream} or {@link SoundCloudStream} */ export function attachListeners(player: EventEmitter, resource: YouTubeStream | SoundCloudStream) { + // cleanup existing listeners if they are still registered + type listenerType = (...args: any[]) => void; + + const listeners = player.listeners(AudioPlayerStatus.Idle); + for (const cleanup of listeners) { + if ((cleanup as any).__playDlAttachedListener) { + cleanup(); + player.removeListener(AudioPlayerStatus.Idle, cleanup as listenerType); + } + } + const pauseListener = () => resource.pause(); const resumeListener = () => resource.resume(); - player.on(AudioPlayerStatus.Paused, pauseListener); - player.on(AudioPlayerStatus.AutoPaused, pauseListener); - player.on(AudioPlayerStatus.Playing, resumeListener); - player.once(AudioPlayerStatus.Idle, () => { + const idleListener = () => { player.removeListener(AudioPlayerStatus.Paused, pauseListener); player.removeListener(AudioPlayerStatus.AutoPaused, pauseListener); player.removeListener(AudioPlayerStatus.Playing, resumeListener); - }); + }; + pauseListener.__playDlAttachedListener = true; + resumeListener.__playDlAttachedListener = true; + idleListener.__playDlAttachedListener = true; + player.on(AudioPlayerStatus.Paused, pauseListener); + player.on(AudioPlayerStatus.AutoPaused, pauseListener); + player.on(AudioPlayerStatus.Playing, resumeListener); + player.once(AudioPlayerStatus.Idle, idleListener); }