|
@@ -7,6 +7,7 @@ import { isAdminRequired, isLoginRequired } from "./hooks";
|
|
|
import moduleManager from "../../index";
|
|
|
|
|
|
const DBModule = moduleManager.modules.db;
|
|
|
+const CacheModule = moduleManager.modules.cache;
|
|
|
const UtilsModule = moduleManager.modules.utils;
|
|
|
const YouTubeModule = moduleManager.modules.youtube;
|
|
|
|
|
@@ -345,5 +346,183 @@ export default {
|
|
|
);
|
|
|
return cb({ status: "error", message: err });
|
|
|
});
|
|
|
+ }),
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Requests a set of YouTube videos as an admin
|
|
|
+ *
|
|
|
+ * @param {object} session - the session object automatically added by the websocket
|
|
|
+ * @param {string} url - the url of the the YouTube playlist
|
|
|
+ * @param {boolean} musicOnly - whether to only get music from the playlist
|
|
|
+ * @param {boolean} musicOnly - whether to return videos
|
|
|
+ * @param {Function} cb - gets called with the result
|
|
|
+ */
|
|
|
+ requestSetAdmin: isAdminRequired(async function requestSetAdmin(session, url, musicOnly, returnVideos, cb) {
|
|
|
+ this.keepLongJob();
|
|
|
+ this.publishProgress({
|
|
|
+ status: "started",
|
|
|
+ title: "Import playlist",
|
|
|
+ message: "Importing playlist.",
|
|
|
+ id: this.toString()
|
|
|
+ });
|
|
|
+ await CacheModule.runJob("RPUSH", { key: `longJobs.requestSetAdmin`, value: this.toString() }, this);
|
|
|
+ await CacheModule.runJob(
|
|
|
+ "HSET",
|
|
|
+ {
|
|
|
+ table: `requestSetAdmin`,
|
|
|
+ key: this.toString(),
|
|
|
+ value: { payload: { url, musicOnly, returnVideos }, response: null }
|
|
|
+ },
|
|
|
+ this
|
|
|
+ );
|
|
|
+
|
|
|
+ YouTubeModule.runJob("REQUEST_SET", { url, musicOnly, returnVideos }, this)
|
|
|
+ .then(async response => {
|
|
|
+ this.log(
|
|
|
+ "SUCCESS",
|
|
|
+ "REQUEST_SET_ADMIN",
|
|
|
+ `Successfully imported a YouTube playlist to be requested for admin "${session.userId}".`
|
|
|
+ );
|
|
|
+ this.publishProgress({
|
|
|
+ status: "success",
|
|
|
+ message: `Playlist is done importing. ${response.successful} were added succesfully, ${response.failed} failed (${response.alreadyInDatabase} were already in database)`
|
|
|
+ });
|
|
|
+ await CacheModule.runJob(
|
|
|
+ "HSET",
|
|
|
+ {
|
|
|
+ table: `requestSetAdmin`,
|
|
|
+ key: this.toString(),
|
|
|
+ value: { payload: { url, musicOnly, returnVideos }, response }
|
|
|
+ },
|
|
|
+ this
|
|
|
+ );
|
|
|
+ return cb({
|
|
|
+ status: "success",
|
|
|
+ message: `Playlist is done importing. ${response.successful} were added succesfully, ${response.failed} failed (${response.alreadyInDatabase} were already in database)`,
|
|
|
+ videos: returnVideos ? response.videos : null
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch(async err => {
|
|
|
+ err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);
|
|
|
+ this.log(
|
|
|
+ "ERROR",
|
|
|
+ "REQUEST_SET_ADMIN",
|
|
|
+ `Importing a YouTube playlist to be requested failed for admin "${session.userId}". "${err}"`
|
|
|
+ );
|
|
|
+ this.publishProgress({
|
|
|
+ status: "error",
|
|
|
+ message: err
|
|
|
+ });
|
|
|
+ return cb({ status: "error", message: err });
|
|
|
+ });
|
|
|
+ }),
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets request set admin long jobs
|
|
|
+ *
|
|
|
+ * @param {object} session - the session object automatically added by the websocket
|
|
|
+ * @param {Function} cb - gets called with the result
|
|
|
+ */
|
|
|
+ getRequestSetAdminLongJobs: isLoginRequired(async function getRequestSetAdminLongJobs(session, cb) {
|
|
|
+ async.waterfall(
|
|
|
+ [
|
|
|
+ next => {
|
|
|
+ CacheModule.runJob(
|
|
|
+ "LRANGE",
|
|
|
+ {
|
|
|
+ key: `longJobs.requestSetAdmin`
|
|
|
+ },
|
|
|
+ this
|
|
|
+ )
|
|
|
+ .then(longJobUuids => next(null, longJobUuids))
|
|
|
+ .catch(next);
|
|
|
+ },
|
|
|
+
|
|
|
+ (longJobUuids, next) => {
|
|
|
+ next(
|
|
|
+ null,
|
|
|
+ longJobUuids.map(longJobUuid => ({
|
|
|
+ job: moduleManager.jobManager.getJob(longJobUuid),
|
|
|
+ uuid: longJobUuid
|
|
|
+ }))
|
|
|
+ );
|
|
|
+ },
|
|
|
+
|
|
|
+ (longJobs, next) => {
|
|
|
+ async.eachLimit(
|
|
|
+ longJobs,
|
|
|
+ 1,
|
|
|
+ (longJob, next) => {
|
|
|
+ CacheModule.runJob("HGET", { table: "requestSetAdmin", key: longJob.uuid }, this)
|
|
|
+ .then(value => {
|
|
|
+ if (value) {
|
|
|
+ const { payload, response } = value;
|
|
|
+ longJob.payload = payload;
|
|
|
+ longJob.response = response;
|
|
|
+ }
|
|
|
+ next();
|
|
|
+ })
|
|
|
+ .catch(console.log);
|
|
|
+ },
|
|
|
+ err => {
|
|
|
+ next(err, longJobs);
|
|
|
+ }
|
|
|
+ );
|
|
|
+ },
|
|
|
+
|
|
|
+ (longJobs, next) => {
|
|
|
+ longJobs.forEach(({ job }) => {
|
|
|
+ if (job && job.onProgress)
|
|
|
+ job.onProgress.on("progress", data => {
|
|
|
+ this.publishProgress(
|
|
|
+ {
|
|
|
+ id: job.toString(),
|
|
|
+ ...data
|
|
|
+ },
|
|
|
+ true
|
|
|
+ );
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ next(
|
|
|
+ null,
|
|
|
+ longJobs.map(({ job, uuid, payload, response }) => ({
|
|
|
+ id: uuid,
|
|
|
+ name: job ? job.longJobTitle : "",
|
|
|
+ status: job ? job.lastProgressData.status : "",
|
|
|
+ message: job ? job.lastProgressData.message : "",
|
|
|
+ payload,
|
|
|
+ response
|
|
|
+ }))
|
|
|
+ );
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ async (err, longJobs) => {
|
|
|
+ if (err) {
|
|
|
+ err = await UtilsModule.runJob("GET_ERROR", { error: err }, this);
|
|
|
+
|
|
|
+ this.log(
|
|
|
+ "ERROR",
|
|
|
+ "GET_REQUEST_SET_ADMIN_LONG_JOBS",
|
|
|
+ `Couldn't get request set admin long jobs for user "${session.userId}". "${err}"`
|
|
|
+ );
|
|
|
+
|
|
|
+ return cb({ status: "error", message: err });
|
|
|
+ }
|
|
|
+
|
|
|
+ this.log(
|
|
|
+ "SUCCESS",
|
|
|
+ "GET_REQUEST_SET_ADMIN_LONG_JOBS",
|
|
|
+ `Got request set admin long jobs for user "${session.userId}".`
|
|
|
+ );
|
|
|
+
|
|
|
+ return cb({
|
|
|
+ status: "success",
|
|
|
+ data: {
|
|
|
+ longJobs
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ );
|
|
|
})
|
|
|
};
|