ziplayer 0.2.5 → 0.2.7-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,73 @@ exports.PluginManager = exports.BasePlugin = void 0;
4
4
  const timeout_1 = require("../utils/timeout");
5
5
  var BasePlugin_1 = require("./BasePlugin");
6
6
  Object.defineProperty(exports, "BasePlugin", { enumerable: true, get: function () { return BasePlugin_1.BasePlugin; } });
7
+ function levenshtein(a, b) {
8
+ const matrix = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
9
+ for (let i = 0; i <= a.length; i++)
10
+ matrix[i][0] = i;
11
+ for (let j = 0; j <= b.length; j++)
12
+ matrix[0][j] = j;
13
+ for (let i = 1; i <= a.length; i++) {
14
+ for (let j = 1; j <= b.length; j++) {
15
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
16
+ matrix[i][j] = Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost);
17
+ }
18
+ }
19
+ return matrix[a.length][b.length];
20
+ }
21
+ function similarity(a, b) {
22
+ if (!a || !b)
23
+ return 0;
24
+ const dist = levenshtein(a, b);
25
+ const maxLen = Math.max(a.length, b.length);
26
+ return 1 - dist / maxLen; // 0 → 1
27
+ }
28
+ function normalize(str) {
29
+ return str
30
+ .toLowerCase()
31
+ .replace(/\(.*?\)|\[.*?\]/g, "") // remove (remix), [lyrics]
32
+ .replace(/[^a-z0-9\s]/g, "")
33
+ .replace(/\s+/g, " ")
34
+ .trim();
35
+ }
36
+ const MUSIC_KEYWORDS = ["official", "mv", "audio", "lyrics", "remix", "cover", "ft", "feat", "prod", "music video"];
37
+ const NON_MUSIC_KEYWORDS = ["reaction", "review", "podcast", "interview", "vlog", "live stream", "news", "tiktok"];
38
+ function detectContentType(title) {
39
+ const t = title.toLowerCase();
40
+ let score = 0;
41
+ for (const k of MUSIC_KEYWORDS) {
42
+ if (t.includes(k))
43
+ score += 2;
44
+ }
45
+ for (const k of NON_MUSIC_KEYWORDS) {
46
+ if (t.includes(k))
47
+ score -= 3;
48
+ }
49
+ return score;
50
+ }
51
+ function tokenOverlap(a, b) {
52
+ const setA = new Set(a.split(" "));
53
+ const setB = new Set(b.split(" "));
54
+ let match = 0;
55
+ for (const word of setA) {
56
+ if (setB.has(word))
57
+ match++;
58
+ }
59
+ return match / Math.max(setA.size, setB.size);
60
+ }
61
+ function scoreTrack(base, candidate) {
62
+ const titleA = normalize(base.title);
63
+ const titleB = normalize(candidate.title);
64
+ let score = 0;
65
+ // ===== FUZZY =====
66
+ const sim = similarity(titleA, titleB); // 0 → 1
67
+ score += sim * 50;
68
+ // ===== TOKEN MATCH =====
69
+ score += tokenOverlap(titleA, titleB) * 30;
70
+ // ===== CONTENT TYPE =====
71
+ score += detectContentType(candidate.title);
72
+ return score;
73
+ }
7
74
  // Plugin factory
8
75
  class PluginManager {
9
76
  constructor(player, manager, options) {
@@ -11,11 +78,11 @@ class PluginManager {
11
78
  this.player = player;
12
79
  this.manager = manager;
13
80
  this.options = options;
14
- this.debug = (message, ...optionalParams) => {
15
- if (manager.debugEnabled) {
16
- manager.emit("debug", `[ExtensionManager] ${message}`, ...optionalParams);
17
- }
18
- };
81
+ }
82
+ debug(message, ...optionalParams) {
83
+ if (this.manager.debugEnabled) {
84
+ this.manager.emit("debug", `[Plugins] ${message}`, ...optionalParams);
85
+ }
19
86
  }
20
87
  register(plugin) {
21
88
  this.plugins.set(plugin.name, plugin);
@@ -36,51 +103,139 @@ class PluginManager {
36
103
  this.plugins.clear();
37
104
  }
38
105
  async getStream(track) {
39
- let streamInfo = null;
40
- const plugin = this.get(track.source) || this.findPlugin(track.url);
41
- if (!plugin) {
42
- this.debug(`[Player] No plugin found for track: ${track.title}`);
106
+ const timeoutMs = this.options.extractorTimeout ?? 50000;
107
+ const primary = this.get(track.source) || this.findPlugin(track.url);
108
+ if (!primary) {
109
+ this.debug(`No plugin found for track: ${track.title}`);
43
110
  return null;
44
111
  }
45
- this.debug(`[Player] Getting stream for track: ${track.title}`);
46
- this.debug(`[Player] Using plugin: ${plugin.name}`);
47
- this.debug(`[Track] Track Info:`, track);
48
- const timeoutMs = this.options.extractorTimeout ?? 50000;
49
112
  try {
50
- streamInfo = await (0, timeout_1.withTimeout)(plugin.getStream(track), timeoutMs, "getStream timed out");
51
- if (!streamInfo?.stream) {
52
- throw new Error(`No stream returned from ${plugin.name}`);
53
- }
113
+ const controller = new AbortController();
114
+ const result = await (0, timeout_1.withTimeout)(primary.getStream(track, controller.signal), timeoutMs, "Primary timeout");
115
+ if (result?.stream)
116
+ return result;
117
+ throw new Error("Primary failed");
54
118
  }
55
- catch (streamError) {
56
- this.debug(`[Player] getStream failed, trying getFallback:`, streamError);
57
- const allplugs = this.getAll();
58
- for (const p of allplugs) {
59
- try {
60
- if (typeof p.getStream == "function") {
61
- streamInfo = await (0, timeout_1.withTimeout)(p.getStream(track), timeoutMs, `getStream timed out for plugin ${p.name}`);
62
- if (streamInfo?.stream) {
63
- this.debug(`[Player] getStream succeeded with plugin ${p.name} for track: ${track.title}`);
64
- return streamInfo;
119
+ catch {
120
+ this.debug("Primary failed fallback parallel");
121
+ }
122
+ // ===== FALLBACK PARALLEL =====
123
+ const plugins = this.getAll()
124
+ .filter((p) => p !== primary)
125
+ .map((p) => {
126
+ p.priority ??= 0;
127
+ return p;
128
+ })
129
+ .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
130
+ // group by priority
131
+ const groups = new Map();
132
+ for (const p of plugins) {
133
+ if (!groups.has(p.priority ?? 0))
134
+ groups.set(p.priority ?? 0, []);
135
+ groups.get(p.priority ?? 0).push(p);
136
+ }
137
+ for (const [priority, group] of groups) {
138
+ this.debug(`Running group priority=${priority}`);
139
+ const controller = new AbortController();
140
+ try {
141
+ const promises = group.map((p) => {
142
+ const run = async () => {
143
+ try {
144
+ let result = null;
145
+ if (p.getStream) {
146
+ try {
147
+ result = await (0, timeout_1.withTimeout)(p.getStream(track, controller.signal), timeoutMs, `Timeout ${p.name}`);
148
+ }
149
+ catch (err) {
150
+ // getStream thất bại → log rồi thử getFallback
151
+ this.debug(`getStream failed for ${p.name}, trying getFallback`, err);
152
+ }
153
+ if (result?.stream) {
154
+ this.debug(`Success via ${p.name}`);
155
+ controller.abort();
156
+ return result;
157
+ }
158
+ }
159
+ if (p.getFallback) {
160
+ result = await (0, timeout_1.withTimeout)(p.getFallback(track, controller.signal), timeoutMs, `Fallback timeout ${p.name}`);
161
+ if (result?.stream) {
162
+ this.debug(`Fallback via ${p.name}`);
163
+ controller.abort();
164
+ return result;
165
+ }
166
+ }
167
+ throw new Error("No stream");
65
168
  }
66
- }
67
- if (typeof p.getFallback == "function") {
68
- streamInfo = await (0, timeout_1.withTimeout)(p.getFallback(track), timeoutMs, `getFallback timed out for plugin ${p.name}`);
69
- if (streamInfo?.stream) {
70
- this.debug(`[Player] getFallback succeeded with plugin ${p.name} for track: ${track.title}`);
71
- return streamInfo;
169
+ catch (err) {
170
+ if (controller.signal.aborted)
171
+ throw new Error("Aborted");
172
+ this.debug(`Failed ${p.name}`, err);
173
+ throw err;
72
174
  }
73
- }
74
- }
75
- catch (fallbackError) {
76
- this.debug(`[Player] getFallback failed with plugin ${p.name}:`, fallbackError);
175
+ };
176
+ return run();
177
+ });
178
+ const result = await Promise.any(promises);
179
+ if (result?.stream)
180
+ return result;
181
+ }
182
+ catch {
183
+ this.debug(`Priority group ${priority} failed`);
184
+ controller.abort();
185
+ }
186
+ }
187
+ throw new Error(`All plugins failed for track: ${track.title}`);
188
+ }
189
+ /**
190
+ * Get related tracks for a given track
191
+ * @param {Track} track Track to find related tracks for
192
+ * @returns {Track[]} Related tracks or empty array
193
+ * @example
194
+ * const related = await player.getRelatedTracks(track);
195
+ * console.log(`Found ${related.length} related tracks`);
196
+ */
197
+ async getRelatedTracks(track) {
198
+ if (!track)
199
+ return [];
200
+ const timeoutMs = this.options.extractorTimeout ?? 15000;
201
+ const limit = 20;
202
+ const allPlugins = this.getAll()
203
+ .filter((p) => typeof p.getRelatedTracks === "function")
204
+ .sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
205
+ const history = this.player.queue.previousTracks;
206
+ const results = [];
207
+ // ===== TRY ALL PLUGINS (NOT JUST FIRST SUCCESS) =====
208
+ await Promise.allSettled(allPlugins.map(async (p) => {
209
+ try {
210
+ this.debug(`[RelatedTracks] Querying ${p.name}`);
211
+ const related = await (0, timeout_1.withTimeout)(p.getRelatedTracks(track, { limit, history }), timeoutMs, `Timeout ${p.name}`);
212
+ if (Array.isArray(related)) {
213
+ results.push(...related);
77
214
  }
78
215
  }
79
- if (!streamInfo?.stream) {
80
- throw new Error(`All getFallback attempts failed for track: ${track.title}`);
216
+ catch (err) {
217
+ this.debug(`[RelatedTracks] ${p.name} failed`, err);
218
+ }
219
+ }));
220
+ if (results.length === 0) {
221
+ this.debug(`[RelatedTracks] No results`);
222
+ return [];
223
+ }
224
+ // ===== DEDUPE =====
225
+ const unique = new Map();
226
+ for (const t of results) {
227
+ if (!unique.has(t.url)) {
228
+ unique.set(t.url, t);
81
229
  }
82
230
  }
83
- return streamInfo;
231
+ // ===== SCORE + SORT =====
232
+ const ranked = Array.from(unique.values())
233
+ .map((t) => ({ track: t, score: scoreTrack(track, t) }))
234
+ .sort((a, b) => b.score - a.score)
235
+ .slice(0, limit)
236
+ .map((x) => x.track);
237
+ this.debug(`[RelatedTracks] Final ${ranked.length} tracks`);
238
+ return ranked;
84
239
  }
85
240
  }
86
241
  exports.PluginManager = PluginManager;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"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"}
@@ -119,15 +119,6 @@ export declare class Player extends EventEmitter {
119
119
  pluginCount: number;
120
120
  ttsFiltered: boolean;
121
121
  };
122
- /**
123
- * Get related tracks for a given track
124
- * @param {Track} track Track to find related tracks for
125
- * @returns {Track[]} Related tracks or empty array
126
- * @example
127
- * const related = await player.getRelatedTracks(track);
128
- * console.log(`Found ${related.length} related tracks`);
129
- */
130
- getRelatedTracks(track: Track): Promise<Track[]>;
131
122
  private generateWillNext;
132
123
  /**
133
124
  * Play a track, search query, search result, or play from queue
@@ -1 +1 @@
1
- {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Player.d.ts","sourceRoot":"","sources":["../../src/structures/Player.ts"],"names":[],"mappings":"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"}
@@ -84,7 +84,7 @@ class Player extends events_1.EventEmitter {
84
84
  createPlayer: false,
85
85
  interrupt: true,
86
86
  volume: 100,
87
- Max_Time_TTS: 60000,
87
+ Max_Time_TTS: 60_000,
88
88
  ...(options?.tts || {}),
89
89
  },
90
90
  };
@@ -114,19 +114,13 @@ class Player extends events_1.EventEmitter {
114
114
  * @private
115
115
  */
116
116
  destroyCurrentStream() {
117
- try {
118
- // Get the metadata from current resource to find the stream
119
- if (this.currentResource) {
120
- const stream = this.currentResource?.metadata?.stream || this.currentResource?.stream;
121
- if (stream && typeof stream.destroy === "function") {
122
- stream.destroy();
123
- this.debug(`[Player] Destroyed current stream`);
124
- }
125
- }
126
- }
127
- catch (error) {
128
- this.debug(`[Player] Error destroying current stream:`, error);
117
+ if (!this.currentResource)
118
+ return;
119
+ const stream = this.currentResource?.metadata?.stream ?? this.currentResource?.stream;
120
+ if (stream?.destroy) {
121
+ stream.destroy();
129
122
  }
123
+ this.currentResource = null;
130
124
  }
131
125
  //#region Search
132
126
  /**
@@ -275,45 +269,11 @@ class Player extends events_1.EventEmitter {
275
269
  ttsFiltered: allPlugins.length > plugins.length,
276
270
  };
277
271
  }
278
- /**
279
- * Get related tracks for a given track
280
- * @param {Track} track Track to find related tracks for
281
- * @returns {Track[]} Related tracks or empty array
282
- * @example
283
- * const related = await player.getRelatedTracks(track);
284
- * console.log(`Found ${related.length} related tracks`);
285
- */
286
- async getRelatedTracks(track) {
287
- if (!track)
288
- return [];
289
- const preferred = this.pluginManager.findPlugin(track.url) || this.pluginManager.get(track.source);
290
- const all = this.pluginManager.getAll();
291
- const candidates = [...(preferred ? [preferred] : []), ...all.filter((p) => p !== preferred)].filter((p) => typeof p.getRelatedTracks === "function");
292
- for (const p of candidates) {
293
- try {
294
- this.debug(`[Player] Trying related from plugin: ${p.name}`);
295
- const related = await (0, timeout_1.withTimeout)(p.getRelatedTracks(track.url, {
296
- limit: 10,
297
- history: this.queue.previousTracks,
298
- }), this.options.extractorTimeout ?? 15000, `getRelatedTracks timed out for ${p.name}`);
299
- if (Array.isArray(related) && related.length > 0) {
300
- return related; // success
301
- }
302
- this.debug(`[Player] ${p.name} returned no related tracks`);
303
- }
304
- catch (err) {
305
- this.debug(`[Player] getRelatedTracks error from ${p.name}:`, err);
306
- return [];
307
- // try next candidate
308
- }
309
- }
310
- return [];
311
- }
312
272
  async generateWillNext() {
313
273
  const lastTrack = this.queue.previousTracks[this.queue.previousTracks.length - 1] ?? this.queue.currentTrack;
314
274
  if (!lastTrack)
315
275
  return;
316
- const related = await this.getRelatedTracks(lastTrack);
276
+ const related = await this.pluginManager.getRelatedTracks(lastTrack);
317
277
  if (!related || related.length === 0)
318
278
  return;
319
279
  const randomchoice = Math.floor(Math.random() * related.length);
@@ -542,16 +502,6 @@ class Player extends events_1.EventEmitter {
542
502
  try {
543
503
  // Destroy the old stream and resource before creating a new one
544
504
  this.destroyCurrentStream();
545
- if (this.currentResource) {
546
- try {
547
- const oldStream = this.currentResource._readableState?.stream || this.currentResource.stream;
548
- if (oldStream && typeof oldStream.destroy === "function") {
549
- oldStream.destroy();
550
- }
551
- }
552
- catch { }
553
- this.currentResource = null;
554
- }
555
505
  this.currentResource = await this.createResource(streamInfo, track, 0);
556
506
  if (this.volumeInterval) {
557
507
  clearInterval(this.volumeInterval);
@@ -560,7 +510,7 @@ class Player extends events_1.EventEmitter {
560
510
  this.currentResource.volume?.setVolume(this.volume / 100);
561
511
  this.debug(`[Player] Playing resource for track: ${track.title}`);
562
512
  this.audioPlayer.play(this.currentResource);
563
- await (0, voice_1.entersState)(this.audioPlayer, voice_1.AudioPlayerStatus.Playing, 5000);
513
+ await (0, voice_1.entersState)(this.audioPlayer, voice_1.AudioPlayerStatus.Playing, 5_000);
564
514
  return true;
565
515
  }
566
516
  catch (resourceError) {
@@ -578,7 +528,7 @@ class Player extends events_1.EventEmitter {
578
528
  this.currentResource = fallbackResource;
579
529
  this.currentResource.volume?.setVolume(this.volume / 100);
580
530
  this.audioPlayer.play(this.currentResource);
581
- await (0, voice_1.entersState)(this.audioPlayer, voice_1.AudioPlayerStatus.Playing, 5000);
531
+ await (0, voice_1.entersState)(this.audioPlayer, voice_1.AudioPlayerStatus.Playing, 5_000);
582
532
  return true;
583
533
  }
584
534
  catch (fallbackError) {
@@ -606,36 +556,37 @@ class Player extends events_1.EventEmitter {
606
556
  }
607
557
  }
608
558
  async playNext() {
609
- this.debug(`[Player] playNext called`);
610
- const track = this.queue.next(this.skipLoop);
611
- this.skipLoop = false;
612
- if (!track) {
613
- if (this.queue.autoPlay()) {
614
- const willnext = this.queue.willNextTrack();
615
- if (willnext) {
616
- this.debug(`[Player] Auto-playing next track: ${willnext.title}`);
617
- this.queue.addMultiple([willnext]);
618
- return this.playNext();
559
+ this.debug(`[Player] playNext called by ${new Error().stack?.split("\n")[2]?.trim()}`);
560
+ while (true) {
561
+ const track = this.queue.next(this.skipLoop);
562
+ this.skipLoop = false;
563
+ if (!track) {
564
+ if (this.queue.autoPlay()) {
565
+ const willnext = this.queue.willNextTrack();
566
+ if (willnext) {
567
+ this.queue.addMultiple([willnext]);
568
+ continue;
569
+ }
619
570
  }
571
+ this.debug(`[Player] No next track in queue`);
572
+ this.isPlaying = false;
573
+ this.emit("queueEnd");
574
+ if (this.options.leaveOnEnd) {
575
+ this.scheduleLeave();
576
+ }
577
+ return false;
620
578
  }
621
- this.debug(`[Player] No next track in queue`);
622
- this.isPlaying = false;
623
- this.emit("queueEnd");
624
- if (this.options.leaveOnEnd) {
625
- this.scheduleLeave();
579
+ this.generateWillNext();
580
+ this.clearLeaveTimeout();
581
+ this.debug(`[Player] playNext called for track: ${track.title}`);
582
+ try {
583
+ return await this.startTrack(track);
584
+ }
585
+ catch (err) {
586
+ this.debug(`[Player] playNext error:`, err);
587
+ this.emit("playerError", err, track);
588
+ continue;
626
589
  }
627
- return false;
628
- }
629
- this.generateWillNext();
630
- // A new track is about to play; ensure we don't leave mid-playback
631
- this.clearLeaveTimeout();
632
- try {
633
- return await this.startTrack(track);
634
- }
635
- catch (error) {
636
- this.debug(`[Player] playNext error:`, error);
637
- this.emit("playerError", error, track);
638
- return this.playNext();
639
590
  }
640
591
  }
641
592
  //#endregion
@@ -694,7 +645,7 @@ class Player extends events_1.EventEmitter {
694
645
  this.emit("ttsStart", { track });
695
646
  ttsPlayer.play(resource);
696
647
  // Wait until TTS starts then finishes
697
- await (0, voice_1.entersState)(ttsPlayer, voice_1.AudioPlayerStatus.Playing, 5000).catch(() => null);
648
+ await (0, voice_1.entersState)(ttsPlayer, voice_1.AudioPlayerStatus.Playing, 5_000).catch(() => null);
698
649
  // Derive timeoutMs from resource/track duration when available, with a sensible cap
699
650
  const md = resource?.metadata ?? {};
700
651
  const declared = typeof md.duration === "number" ? md.duration
@@ -705,8 +656,8 @@ class Player extends events_1.EventEmitter {
705
656
  declared
706
657
  : declared * 1000
707
658
  : undefined;
708
- const cap = this.options?.tts?.Max_Time_TTS ?? 60000;
709
- const idleTimeout = declaredMs ? Math.min(cap, Math.max(1000, declaredMs + 1500)) : cap;
659
+ const cap = this.options?.tts?.Max_Time_TTS ?? 60_000;
660
+ const idleTimeout = declaredMs ? Math.min(cap, Math.max(1_000, declaredMs + 1_500)) : cap;
710
661
  await (0, voice_1.entersState)(ttsPlayer, voice_1.AudioPlayerStatus.Idle, idleTimeout).catch(() => null);
711
662
  // Swap back and resume if needed
712
663
  this.connection.subscribe(this.audioPlayer);
@@ -754,11 +705,23 @@ class Player extends events_1.EventEmitter {
754
705
  selfDeaf: this.options.selfDeaf ?? true,
755
706
  selfMute: this.options.selfMute ?? false,
756
707
  });
757
- await (0, voice_1.entersState)(connection, voice_1.VoiceConnectionStatus.Ready, 50000);
708
+ await (0, voice_1.entersState)(connection, voice_1.VoiceConnectionStatus.Ready, 50_000);
758
709
  this.connection = connection;
759
- connection.on(voice_1.VoiceConnectionStatus.Disconnected, () => {
760
- this.debug(`[Player] VoiceConnectionStatus.Disconnected`);
761
- this.destroy();
710
+ connection.on(voice_1.VoiceConnectionStatus.Disconnected, async () => {
711
+ try {
712
+ // move channel
713
+ await Promise.race([
714
+ (0, voice_1.entersState)(connection, voice_1.VoiceConnectionStatus.Signalling, 5_000),
715
+ (0, voice_1.entersState)(connection, voice_1.VoiceConnectionStatus.Connecting, 5_000),
716
+ ]);
717
+ // Signalling/Connecting → reconnect
718
+ this.debug(`[Player] Reconnecting after channel move...`);
719
+ }
720
+ catch {
721
+ // no reconnect in 5 giây → disconnect
722
+ this.debug(`[Player] Truly disconnected, destroying player`);
723
+ this.destroy();
724
+ }
762
725
  });
763
726
  connection.on("error", (error) => {
764
727
  this.debug(`[Player] Voice connection error:`, error);
@@ -825,6 +788,8 @@ class Player extends events_1.EventEmitter {
825
788
  this.debug(`[Player] stop called`);
826
789
  this.queue.clear();
827
790
  const result = this.audioPlayer.stop();
791
+ this.destroyCurrentStream();
792
+ this.currentResource = null;
828
793
  this.isPlaying = false;
829
794
  this.isPaused = false;
830
795
  this.emit("playerStop");
@@ -1256,6 +1221,7 @@ class Player extends events_1.EventEmitter {
1256
1221
  }
1257
1222
  // Destroy current stream before stopping audio
1258
1223
  this.destroyCurrentStream();
1224
+ this.audioPlayer.removeAllListeners();
1259
1225
  this.audioPlayer.stop(true);
1260
1226
  if (this.ttsPlayer) {
1261
1227
  try {