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
|
@@ -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)
|
|
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)
|
|
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
|
|
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
|
|
160
|
+
return fail();
|
|
122
161
|
}
|
|
123
162
|
|
|
124
163
|
return this;
|
|
125
164
|
} catch (e) {
|
|
126
|
-
return
|
|
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
|
|
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
|
|
192
|
+
return fail();
|
|
154
193
|
}
|
|
155
194
|
|
|
156
195
|
return this;
|
|
157
196
|
});
|
|
158
197
|
} catch (e) {
|
|
159
|
-
|
|
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
|
|
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
|
|
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
|
|
224
|
+
return fail();
|
|
187
225
|
}
|
|
188
226
|
return this;
|
|
189
227
|
} catch (e) {
|
|
190
|
-
|
|
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
|
|
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
|
|
257
|
+
return fail();
|
|
221
258
|
}
|
|
222
259
|
|
|
223
260
|
return this;
|
|
224
261
|
} catch (e) {
|
|
225
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
324
|
+
return fail();
|
|
289
325
|
}
|
|
290
326
|
return this;
|
|
291
327
|
}
|
|
292
328
|
} catch (e) {
|
|
293
|
-
|
|
294
|
-
return this.stop();
|
|
329
|
+
return fail(e);
|
|
295
330
|
}
|
|
296
331
|
}
|
|
297
332
|
} else return this;
|