muthera 1.0.7 → 1.0.8

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muthera",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "A simple Lavalink wrapper for Discord music bot. Forked from Niizuki.",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -147,7 +147,7 @@ async function dzAutoPlay(trackId, title = null, artist = null, retries = 3) {
147
147
  } catch (_) {}
148
148
  }
149
149
 
150
- if (!trackData || trackData.error) throw new Error("Deezer track not found");
150
+ if (!trackData || trackData.error) return null;
151
151
 
152
152
  const originalTrackId = String(trackData.id);
153
153
  const artistId = trackData.artist?.id ? String(trackData.artist.id) : null;
@@ -196,7 +196,7 @@ async function dzAutoPlay(trackId, title = null, artist = null, retries = 3) {
196
196
  }
197
197
 
198
198
  const arr = Array.from(candidates.values());
199
- if (!arr.length) throw new Error("No Deezer recommendations found");
199
+ if (!arr.length) return null;
200
200
  const pick = arr[Math.floor(Math.random() * arr.length)];
201
201
  return `https://www.deezer.com/track/${pick.id}`;
202
202
  }
@@ -92,6 +92,14 @@ class Player extends EventEmitter {
92
92
 
93
93
  this.isAutoplay = true;
94
94
 
95
+ // Helper: emit autoplayFailed instead of stop() to avoid re-triggering
96
+ // TrackEndEvent → queueEnd → autoplay infinite loop
97
+ const fail = (e) => {
98
+ if (e) console.log(e);
99
+ this.muthera.emit("autoplayFailed", this);
100
+ return this;
101
+ };
102
+
95
103
  if (player.previous) {
96
104
  if (player.previous.info.sourceName === "youtube") {
97
105
  try {
@@ -107,7 +115,7 @@ class Player extends EventEmitter {
107
115
  !response.tracks ||
108
116
  ["error", "empty"].includes(response.loadType)
109
117
  )
110
- return this.stop();
118
+ return fail();
111
119
 
112
120
  let track =
113
121
  response.tracks[
@@ -118,12 +126,12 @@ class Player extends EventEmitter {
118
126
  this.queue.push(track);
119
127
  await this.play();
120
128
  } else {
121
- return this.stop();
129
+ return fail();
122
130
  }
123
131
 
124
132
  return this;
125
133
  } catch (e) {
126
- return this.stop();
134
+ return fail(e);
127
135
  }
128
136
  } else if (player.previous.info.sourceName === "youtubemusic") {
129
137
  try {
@@ -138,7 +146,7 @@ class Player extends EventEmitter {
138
146
  !response.tracks ||
139
147
  ["error", "empty"].includes(response.loadType)
140
148
  )
141
- return this.stop();
149
+ return fail();
142
150
 
143
151
  let track =
144
152
  response.tracks[
@@ -149,12 +157,12 @@ class Player extends EventEmitter {
149
157
  this.queue.push(track);
150
158
  await this.play();
151
159
  } else {
152
- return this.stop();
160
+ return fail();
153
161
  }
154
162
 
155
163
  return this;
156
164
  } catch (e) {
157
- return this.stop();
165
+ return fail(e);
158
166
  }
159
167
  } else if (player.previous.info.sourceName === "soundcloud") {
160
168
  try {
@@ -170,7 +178,7 @@ class Player extends EventEmitter {
170
178
  !response.tracks ||
171
179
  ["error", "empty"].includes(response.loadType)
172
180
  )
173
- return this.stop();
181
+ return fail();
174
182
 
175
183
  let track =
176
184
  response.tracks[
@@ -181,19 +189,18 @@ class Player extends EventEmitter {
181
189
  this.queue.push(track);
182
190
  await this.play();
183
191
  } else {
184
- return this.stop();
192
+ return fail();
185
193
  }
186
194
 
187
195
  return this;
188
196
  });
189
197
  } catch (e) {
190
- console.log(e);
191
- return this.stop();
198
+ return fail(e);
192
199
  }
193
200
  } else if (player.previous.info.sourceName === "deezer") {
194
201
  try {
195
202
  const data = await dzAutoPlay(player.previous.info.identifier);
196
- if (!data) return this.stop();
203
+ if (!data) return fail();
197
204
 
198
205
  const response = await this.muthera.resolve({
199
206
  query: data,
@@ -205,8 +212,8 @@ class Player extends EventEmitter {
205
212
  !response.tracks ||
206
213
  ["error", "empty"].includes(response.loadType)
207
214
  )
208
- return this.stop();
209
-
215
+ return fail();
216
+
210
217
  const track =
211
218
  response.tracks[Math.floor(Math.random() * response.tracks.length)];
212
219
 
@@ -214,12 +221,11 @@ class Player extends EventEmitter {
214
221
  this.queue.push(track);
215
222
  await this.play();
216
223
  } else {
217
- return this.stop();
224
+ return fail();
218
225
  }
219
226
  return this;
220
227
  } catch (e) {
221
- console.log(e);
222
- return this.stop();
228
+ return fail(e);
223
229
  }
224
230
  } else if (player.previous.info.sourceName === "applemusic") {
225
231
  try {
@@ -239,7 +245,7 @@ class Player extends EventEmitter {
239
245
  !response.tracks ||
240
246
  ["error", "empty"].includes(response.loadType)
241
247
  )
242
- return this.stop();
248
+ return fail();
243
249
 
244
250
  const track =
245
251
  response.tracks[Math.floor(Math.random() * response.tracks.length)];
@@ -248,13 +254,12 @@ class Player extends EventEmitter {
248
254
  this.queue.push(track);
249
255
  await this.play();
250
256
  } else {
251
- return this.stop();
257
+ return fail();
252
258
  }
253
259
 
254
260
  return this;
255
261
  } catch (e) {
256
- console.log(e);
257
- return this.stop();
262
+ return fail(e);
258
263
  }
259
264
  } else if (player.previous.info.sourceName === "spotify") {
260
265
  try {
@@ -265,7 +270,7 @@ class Player extends EventEmitter {
265
270
  if (platform.includes("dz")) {
266
271
  // Use Deezer related-artist API for proper similar song recommendations
267
272
  const data = await dzAutoPlay(null, title, artist);
268
- if (!data) return this.stop();
273
+ if (!data) return fail();
269
274
 
270
275
  const response = await this.muthera.resolve({
271
276
  query: data,
@@ -278,7 +283,7 @@ class Player extends EventEmitter {
278
283
  ["error", "empty"].includes(response.loadType) ||
279
284
  response.tracks.length === 0
280
285
  )
281
- return this.stop();
286
+ return fail();
282
287
 
283
288
  const track =
284
289
  response.tracks[Math.floor(Math.random() * response.tracks.length)];
@@ -287,7 +292,7 @@ class Player extends EventEmitter {
287
292
  this.queue.push(track);
288
293
  await this.play();
289
294
  } else {
290
- return this.stop();
295
+ return fail();
291
296
  }
292
297
  return this;
293
298
  } else {
@@ -304,7 +309,7 @@ class Player extends EventEmitter {
304
309
  ["error", "empty"].includes(response.loadType) ||
305
310
  response.tracks.length === 0
306
311
  )
307
- return this.stop();
312
+ return fail();
308
313
 
309
314
  const filtered = response.tracks.filter(
310
315
  (t) => t.info.title.toLowerCase() !== title.toLowerCase()
@@ -316,13 +321,12 @@ class Player extends EventEmitter {
316
321
  this.queue.push(track);
317
322
  await this.play();
318
323
  } else {
319
- return this.stop();
324
+ return fail();
320
325
  }
321
326
  return this;
322
327
  }
323
328
  } catch (e) {
324
- console.log(e);
325
- return this.stop();
329
+ return fail(e);
326
330
  }
327
331
  }
328
332
  } else return this;