muthera 1.0.6 → 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.6",
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,38 @@ class Player extends EventEmitter {
107
115
  !response.tracks ||
108
116
  ["error", "empty"].includes(response.loadType)
109
117
  )
110
- return this.stop();
118
+ return fail();
119
+
120
+ let track =
121
+ response.tracks[
122
+ Math.floor(Math.random() * Math.floor(response.tracks.length))
123
+ ];
124
+
125
+ if (this.connected) {
126
+ this.queue.push(track);
127
+ await this.play();
128
+ } else {
129
+ return fail();
130
+ }
131
+
132
+ return this;
133
+ } catch (e) {
134
+ return fail(e);
135
+ }
136
+ } else if (player.previous.info.sourceName === "youtubemusic") {
137
+ try {
138
+ let data = `https://music.youtube.com/watch?v=${player.previous.info.identifier}&list=RD${player.previous.info.identifier}`;
139
+ let response = await this.muthera.resolve({
140
+ query: data,
141
+ requester: player.previous.info.requester,
142
+ });
143
+
144
+ if (
145
+ !response ||
146
+ !response.tracks ||
147
+ ["error", "empty"].includes(response.loadType)
148
+ )
149
+ return fail();
111
150
 
112
151
  let track =
113
152
  response.tracks[
@@ -118,12 +157,12 @@ class Player extends EventEmitter {
118
157
  this.queue.push(track);
119
158
  await this.play();
120
159
  } else {
121
- return this.stop();
160
+ return fail();
122
161
  }
123
162
 
124
163
  return this;
125
164
  } catch (e) {
126
- return this.stop();
165
+ return fail(e);
127
166
  }
128
167
  } else if (player.previous.info.sourceName === "soundcloud") {
129
168
  try {
@@ -139,7 +178,7 @@ class Player extends EventEmitter {
139
178
  !response.tracks ||
140
179
  ["error", "empty"].includes(response.loadType)
141
180
  )
142
- return this.stop();
181
+ return fail();
143
182
 
144
183
  let track =
145
184
  response.tracks[
@@ -150,19 +189,18 @@ class Player extends EventEmitter {
150
189
  this.queue.push(track);
151
190
  await this.play();
152
191
  } else {
153
- return this.stop();
192
+ return fail();
154
193
  }
155
194
 
156
195
  return this;
157
196
  });
158
197
  } catch (e) {
159
- console.log(e);
160
- return this.stop();
198
+ return fail(e);
161
199
  }
162
200
  } else if (player.previous.info.sourceName === "deezer") {
163
201
  try {
164
202
  const data = await dzAutoPlay(player.previous.info.identifier);
165
- if (!data) return this.stop();
203
+ if (!data) return fail();
166
204
 
167
205
  const response = await this.muthera.resolve({
168
206
  query: data,
@@ -174,8 +212,8 @@ class Player extends EventEmitter {
174
212
  !response.tracks ||
175
213
  ["error", "empty"].includes(response.loadType)
176
214
  )
177
- return this.stop();
178
-
215
+ return fail();
216
+
179
217
  const track =
180
218
  response.tracks[Math.floor(Math.random() * response.tracks.length)];
181
219
 
@@ -183,12 +221,11 @@ class Player extends EventEmitter {
183
221
  this.queue.push(track);
184
222
  await this.play();
185
223
  } else {
186
- return this.stop();
224
+ return fail();
187
225
  }
188
226
  return this;
189
227
  } catch (e) {
190
- console.log(e);
191
- return this.stop();
228
+ return fail(e);
192
229
  }
193
230
  } else if (player.previous.info.sourceName === "applemusic") {
194
231
  try {
@@ -208,7 +245,7 @@ class Player extends EventEmitter {
208
245
  !response.tracks ||
209
246
  ["error", "empty"].includes(response.loadType)
210
247
  )
211
- return this.stop();
248
+ return fail();
212
249
 
213
250
  const track =
214
251
  response.tracks[Math.floor(Math.random() * response.tracks.length)];
@@ -217,13 +254,12 @@ class Player extends EventEmitter {
217
254
  this.queue.push(track);
218
255
  await this.play();
219
256
  } else {
220
- return this.stop();
257
+ return fail();
221
258
  }
222
259
 
223
260
  return this;
224
261
  } catch (e) {
225
- console.log(e);
226
- return this.stop();
262
+ return fail(e);
227
263
  }
228
264
  } else if (player.previous.info.sourceName === "spotify") {
229
265
  try {
@@ -234,7 +270,7 @@ class Player extends EventEmitter {
234
270
  if (platform.includes("dz")) {
235
271
  // Use Deezer related-artist API for proper similar song recommendations
236
272
  const data = await dzAutoPlay(null, title, artist);
237
- if (!data) return this.stop();
273
+ if (!data) return fail();
238
274
 
239
275
  const response = await this.muthera.resolve({
240
276
  query: data,
@@ -247,7 +283,7 @@ class Player extends EventEmitter {
247
283
  ["error", "empty"].includes(response.loadType) ||
248
284
  response.tracks.length === 0
249
285
  )
250
- return this.stop();
286
+ return fail();
251
287
 
252
288
  const track =
253
289
  response.tracks[Math.floor(Math.random() * response.tracks.length)];
@@ -256,7 +292,7 @@ class Player extends EventEmitter {
256
292
  this.queue.push(track);
257
293
  await this.play();
258
294
  } else {
259
- return this.stop();
295
+ return fail();
260
296
  }
261
297
  return this;
262
298
  } else {
@@ -273,7 +309,7 @@ class Player extends EventEmitter {
273
309
  ["error", "empty"].includes(response.loadType) ||
274
310
  response.tracks.length === 0
275
311
  )
276
- return this.stop();
312
+ return fail();
277
313
 
278
314
  const filtered = response.tracks.filter(
279
315
  (t) => t.info.title.toLowerCase() !== title.toLowerCase()
@@ -285,13 +321,12 @@ class Player extends EventEmitter {
285
321
  this.queue.push(track);
286
322
  await this.play();
287
323
  } else {
288
- return this.stop();
324
+ return fail();
289
325
  }
290
326
  return this;
291
327
  }
292
328
  } catch (e) {
293
- console.log(e);
294
- return this.stop();
329
+ return fail(e);
295
330
  }
296
331
  }
297
332
  } else return this;