|
@@ -49,7 +49,7 @@ class _SongsModule extends CoreClass {
|
|
|
|
|
|
this.setStage(2);
|
|
this.setStage(2);
|
|
|
|
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -115,8 +115,8 @@ class _SongsModule extends CoreClass {
|
|
reject(new Error(err));
|
|
reject(new Error(err));
|
|
} else resolve();
|
|
} else resolve();
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -127,7 +127,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_SONG(payload) {
|
|
GET_SONG(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -161,8 +161,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ song });
|
|
return resolve({ song });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -174,7 +174,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_SONGS(payload) {
|
|
GET_SONGS(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -201,8 +201,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ songs });
|
|
return resolve({ songs });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -215,7 +215,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
ENSURE_SONG_EXISTS_BY_YOUTUBE_ID(payload) {
|
|
ENSURE_SONG_EXISTS_BY_YOUTUBE_ID(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -257,8 +257,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ song });
|
|
return resolve({ song });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -269,7 +269,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_SONG_FROM_YOUTUBE_ID(payload) {
|
|
GET_SONG_FROM_YOUTUBE_ID(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -280,8 +280,61 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ song });
|
|
return resolve({ song });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Create song
|
|
|
|
+ *
|
|
|
|
+ * @param {object} payload - an object containing the payload
|
|
|
|
+ * @param {string} payload.song - the song object
|
|
|
|
+ * @param {string} payload.userId - the user id of the person requesting the song
|
|
|
|
+ * @returns {Promise} - returns a promise (resolve, reject)
|
|
|
|
+ */
|
|
|
|
+ CREATE_SONG(payload) {
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ async.waterfall(
|
|
|
|
+ [
|
|
|
|
+ next => {
|
|
|
|
+ DBModule.runJob("GET_MODEL", { modelName: "user" }, this)
|
|
|
|
+ .then(UserModel => {
|
|
|
|
+ UserModel.findOne(
|
|
|
|
+ { _id: payload.userId },
|
|
|
|
+ { "preferences.anonymousSongRequests": 1 },
|
|
|
|
+ next
|
|
|
|
+ );
|
|
|
|
+ })
|
|
|
|
+ .catch(next);
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ (user, next) => {
|
|
|
|
+ const song = new SongsModule.SongModel({
|
|
|
|
+ ...payload.song,
|
|
|
|
+ requestedBy: user.preferences.anonymousSongRequests ? null : payload.userId,
|
|
|
|
+ requestedAt: Date.now()
|
|
|
|
+ });
|
|
|
|
+ if (song.verified) {
|
|
|
|
+ song.verifiedBy = payload.userId;
|
|
|
|
+ song.verifiedAt = Date.now();
|
|
|
|
+ }
|
|
|
|
+ song.save({ validateBeforeSave: true }, err => {
|
|
|
|
+ if (err) return next(err, song);
|
|
|
|
+ return next(null, song);
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+
|
|
|
|
+ (song, next) => {
|
|
|
|
+ SongsModule.runJob("UPDATE_SONG", { songId: song._id });
|
|
|
|
+ return next(null, song);
|
|
|
|
+ }
|
|
|
|
+ ],
|
|
|
|
+ (err, song) => {
|
|
|
|
+ if (err && err !== true) return reject(new Error(err));
|
|
|
|
+ return resolve({ song });
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -293,7 +346,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
UPDATE_SONG(payload) {
|
|
UPDATE_SONG(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -439,7 +492,11 @@ class _SongsModule extends CoreClass {
|
|
song.genres,
|
|
song.genres,
|
|
1,
|
|
1,
|
|
(genre, next) => {
|
|
(genre, next) => {
|
|
- PlaylistsModule.runJob("AUTOFILL_GENRE_PLAYLIST", { genre }, this)
|
|
|
|
|
|
+ PlaylistsModule.runJob(
|
|
|
|
+ "AUTOFILL_GENRE_PLAYLIST",
|
|
|
|
+ { genre, createPlaylist: song.verified },
|
|
|
|
+ this
|
|
|
|
+ )
|
|
.then(() => {
|
|
.then(() => {
|
|
next();
|
|
next();
|
|
})
|
|
})
|
|
@@ -477,8 +534,8 @@ class _SongsModule extends CoreClass {
|
|
|
|
|
|
return resolve(song);
|
|
return resolve(song);
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -493,7 +550,7 @@ class _SongsModule extends CoreClass {
|
|
const playlistModel = await DBModule.runJob("GET_MODEL", { modelName: "playlist" }, this);
|
|
const playlistModel = await DBModule.runJob("GET_MODEL", { modelName: "playlist" }, this);
|
|
const stationModel = await DBModule.runJob("GET_MODEL", { modelName: "station" }, this);
|
|
const stationModel = await DBModule.runJob("GET_MODEL", { modelName: "station" }, this);
|
|
|
|
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
// Get songs from Mongo
|
|
// Get songs from Mongo
|
|
@@ -710,16 +767,17 @@ class _SongsModule extends CoreClass {
|
|
const genresToAutofill = new Set();
|
|
const genresToAutofill = new Set();
|
|
|
|
|
|
songs.forEach(song => {
|
|
songs.forEach(song => {
|
|
- song.genres.forEach(genre => {
|
|
|
|
- genresToAutofill.add(genre);
|
|
|
|
- });
|
|
|
|
|
|
+ if (song.verified)
|
|
|
|
+ song.genres.forEach(genre => {
|
|
|
|
+ genresToAutofill.add(genre);
|
|
|
|
+ });
|
|
});
|
|
});
|
|
|
|
|
|
async.eachLimit(
|
|
async.eachLimit(
|
|
genresToAutofill,
|
|
genresToAutofill,
|
|
1,
|
|
1,
|
|
(genre, next) => {
|
|
(genre, next) => {
|
|
- PlaylistsModule.runJob("AUTOFILL_GENRE_PLAYLIST", { genre }, this)
|
|
|
|
|
|
+ PlaylistsModule.runJob("AUTOFILL_GENRE_PLAYLIST", { genre, createPlaylist: true }, this)
|
|
.then(() => {
|
|
.then(() => {
|
|
next();
|
|
next();
|
|
})
|
|
})
|
|
@@ -754,8 +812,8 @@ class _SongsModule extends CoreClass {
|
|
|
|
|
|
return resolve();
|
|
return resolve();
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -764,7 +822,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
UPDATE_ALL_SONGS() {
|
|
UPDATE_ALL_SONGS() {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -798,8 +856,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve();
|
|
return resolve();
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
// /**
|
|
// /**
|
|
@@ -894,7 +952,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns promise (reject, resolve)
|
|
* @returns {Promise} - returns promise (reject, resolve)
|
|
*/
|
|
*/
|
|
SEARCH(payload) {
|
|
SEARCH(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -976,8 +1034,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve(data);
|
|
return resolve(data);
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1081,7 +1139,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_ALL_GENRES() {
|
|
GET_ALL_GENRES() {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -1106,8 +1164,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ genres });
|
|
return resolve({ genres });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1116,7 +1174,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_ALL_ARTISTS() {
|
|
GET_ALL_ARTISTS() {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -1141,8 +1199,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ artists });
|
|
return resolve({ artists });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1153,7 +1211,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_ALL_SONGS_WITH_GENRE(payload) {
|
|
GET_ALL_SONGS_WITH_GENRE(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -1170,8 +1228,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ songs });
|
|
return resolve({ songs });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -1182,7 +1240,7 @@ class _SongsModule extends CoreClass {
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
* @returns {Promise} - returns a promise (resolve, reject)
|
|
*/
|
|
*/
|
|
GET_ALL_SONGS_WITH_ARTIST(payload) {
|
|
GET_ALL_SONGS_WITH_ARTIST(payload) {
|
|
- return new Promise((resolve, reject) =>
|
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
async.waterfall(
|
|
async.waterfall(
|
|
[
|
|
[
|
|
next => {
|
|
next => {
|
|
@@ -1199,8 +1257,8 @@ class _SongsModule extends CoreClass {
|
|
if (err && err !== true) return reject(new Error(err));
|
|
if (err && err !== true) return reject(new Error(err));
|
|
return resolve({ songs });
|
|
return resolve({ songs });
|
|
}
|
|
}
|
|
- )
|
|
|
|
- );
|
|
|
|
|
|
+ );
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
// runjob songs GET_ORPHANED_PLAYLIST_SONGS {}
|
|
// runjob songs GET_ORPHANED_PLAYLIST_SONGS {}
|