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
|
@@ -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,7 @@ class Player extends EventEmitter {
|
|
|
107
115
|
!response.tracks ||
|
|
108
116
|
["error", "empty"].includes(response.loadType)
|
|
109
117
|
)
|
|
110
|
-
return
|
|
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
|
|
129
|
+
return fail();
|
|
122
130
|
}
|
|
123
131
|
|
|
124
132
|
return this;
|
|
125
133
|
} catch (e) {
|
|
126
|
-
return
|
|
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
|
|
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
|
|
160
|
+
return fail();
|
|
153
161
|
}
|
|
154
162
|
|
|
155
163
|
return this;
|
|
156
164
|
} catch (e) {
|
|
157
|
-
return
|
|
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
|
|
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
|
|
192
|
+
return fail();
|
|
185
193
|
}
|
|
186
194
|
|
|
187
195
|
return this;
|
|
188
196
|
});
|
|
189
197
|
} catch (e) {
|
|
190
|
-
|
|
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
|
|
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
|
|
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
|
|
224
|
+
return fail();
|
|
218
225
|
}
|
|
219
226
|
return this;
|
|
220
227
|
} catch (e) {
|
|
221
|
-
|
|
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
|
|
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
|
|
257
|
+
return fail();
|
|
252
258
|
}
|
|
253
259
|
|
|
254
260
|
return this;
|
|
255
261
|
} catch (e) {
|
|
256
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
324
|
+
return fail();
|
|
320
325
|
}
|
|
321
326
|
return this;
|
|
322
327
|
}
|
|
323
328
|
} catch (e) {
|
|
324
|
-
|
|
325
|
-
return this.stop();
|
|
329
|
+
return fail(e);
|
|
326
330
|
}
|
|
327
331
|
}
|
|
328
332
|
} else return this;
|