mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1294 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1294 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var ColorThief = require("color-thief-jimp");
 | ||
| var Jimp = require("jimp");
 | ||
| var Functions = require(pathThumbnails + "/handlers/functions.js");
 | ||
| var Frontpage = require(pathThumbnails + "/handlers/frontpage.js");
 | ||
| var projects = require(pathThumbnails + "/handlers/aggregates.js");
 | ||
| var crypto = require("crypto");
 | ||
| var Filter = require("bad-words");
 | ||
| var Search = require(pathThumbnails + "/handlers/search.js");
 | ||
| var filter = new Filter({ placeHolder: "x" });
 | ||
| /*var filter = {
 | ||
|     clean: function(str) {
 | ||
|         return str;
 | ||
|     }
 | ||
| }*/
 | ||
| var request = require("request");
 | ||
| var db = require(pathThumbnails + "/handlers/db.js");
 | ||
| 
 | ||
| function now_playing(list, fn, socket) {
 | ||
|   if (typeof list !== "string" || typeof fn !== "function") {
 | ||
|     socket.emit("update_required");
 | ||
|     return;
 | ||
|   }
 | ||
|   db.collection(list).find({ now_playing: true }, function(err, docs) {
 | ||
|     if (docs.length === 0) {
 | ||
|       fn("No song currently playing");
 | ||
|       return;
 | ||
|     }
 | ||
|     var title = docs[0].title;
 | ||
|     if (title === undefined) fn("No song currently playing");
 | ||
|     else fn(title);
 | ||
|   });
 | ||
| }
 | ||
| 
 | ||
| function join_silent(msg, socket) {
 | ||
|     if (typeof msg === "object" && msg !== undefined && msg !== null) {
 | ||
|       var channelName = msg.channel;
 | ||
|       var tryingPassword = false;
 | ||
|       var password = "";
 | ||
|       if(msg.password != "") {
 | ||
|         tryingPassword = true;
 | ||
|         password = Functions.decrypt_string(msg.password);
 | ||
|         password = crypto
 | ||
|                  .createHash("sha256")
 | ||
|                  .update(password)
 | ||
|                  .digest("base64");
 | ||
|       }
 | ||
| 
 | ||
|       channelName = channelName.toLowerCase(); //.replace(/ /g,'');
 | ||
|       channelName = Functions.removeEmojis(channelName).toLowerCase();
 | ||
|       db.collection(channelName + "_settings").find(function(err, docs) {
 | ||
|         if(docs.length == 0) {
 | ||
|           socket.emit("join_silent_declined", "");
 | ||
|           return;
 | ||
|         }
 | ||
|         if(docs[0].userpass == "" || docs[0].userpass == undefined || docs[0].userpass == password) {
 | ||
|           socket.join(channelName);
 | ||
|           socket.emit("join_silent_accepted", "");
 | ||
| 
 | ||
|           send_play(channelName, socket);
 | ||
|         } else {
 | ||
|           socket.emit("join_silent_declined", "");
 | ||
|         }
 | ||
|       });
 | ||
|     } else {
 | ||
|         return;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| function list(msg, guid, coll, offline, socket) {
 | ||
|   var socketid = socket.zoff_id;
 | ||
|   if (typeof msg === "object" && msg !== undefined && msg !== null) {
 | ||
|     Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
 | ||
|       userpass,
 | ||
|       adminpass,
 | ||
|       gotten
 | ||
|     ) {
 | ||
|       if (gotten && userpass != "" && !msg.hasOwnProperty("pass")) {
 | ||
|         msg.pass = userpass;
 | ||
|       } else {
 | ||
|         msg.pass = crypto
 | ||
|           .createHash("sha256")
 | ||
|           .update(Functions.decrypt_string(msg.pass))
 | ||
|           .digest("base64");
 | ||
|       }
 | ||
|       adminpass = Functions.hash_pass(adminpass);
 | ||
|       if (
 | ||
|         !msg.hasOwnProperty("version") ||
 | ||
|         !msg.hasOwnProperty("channel") ||
 | ||
|         msg.version != VERSION ||
 | ||
|         msg.version == undefined ||
 | ||
|         typeof msg.channel != "string"
 | ||
|       ) {
 | ||
|         var result = {
 | ||
|           channel: {
 | ||
|             expected: "string",
 | ||
|             got: msg.hasOwnProperty("channel") ? typeof msg.channel : undefined
 | ||
|           },
 | ||
|           version: {
 | ||
|             expected: VERSION,
 | ||
|             got: msg.version
 | ||
|           },
 | ||
|           pass: {
 | ||
|             expected: "string",
 | ||
|             got: msg.hasOwnProperty("pass") ? typeof msg.pass : undefined
 | ||
|           }
 | ||
|         };
 | ||
|         socket.emit("update_required", result);
 | ||
|         return;
 | ||
|       }
 | ||
|       coll = msg.channel.toLowerCase(); //.replace(/ /g,'');
 | ||
|       coll = Functions.removeEmojis(coll).toLowerCase();
 | ||
|       //coll = filter.clean(coll);
 | ||
|       var pass = msg.pass;
 | ||
|       db.collection("frontpage_lists").find({ _id: coll }, function(
 | ||
|         err,
 | ||
|         frontpage_lists
 | ||
|       ) {
 | ||
|         if (frontpage_lists.length == 1) {
 | ||
|           db.collection(coll + "_settings").find(function(err, docs) {
 | ||
|             if (
 | ||
|               docs.length == 0 ||
 | ||
|               (docs.length > 0 &&
 | ||
|                 (docs[0].userpass == undefined ||
 | ||
|                   docs[0].userpass == "" ||
 | ||
|                   docs[0].userpass == pass))
 | ||
|             ) {
 | ||
|               if (
 | ||
|                 docs.length > 0 &&
 | ||
|                 docs[0].hasOwnProperty("userpass") &&
 | ||
|                 docs[0].userpass != "" &&
 | ||
|                 docs[0].userpass == pass
 | ||
|               ) {
 | ||
|                 Functions.setSessionUserPass(
 | ||
|                   Functions.getSession(socket),
 | ||
|                   msg.pass,
 | ||
|                   coll,
 | ||
|                   function() {}
 | ||
|                 );
 | ||
|                 socket.emit("auth_accepted", { value: true });
 | ||
|               }
 | ||
|               if (docs.length > 0 && docs[0].userpass != pass) {
 | ||
|                 Functions.setSessionUserPass(
 | ||
|                   Functions.getSession(socket),
 | ||
|                   "",
 | ||
|                   coll,
 | ||
|                   function() {}
 | ||
|                 );
 | ||
|               }
 | ||
|               if (
 | ||
|                 docs.length > 0 &&
 | ||
|                 docs[0].hasOwnProperty("adminpass") &&
 | ||
|                 docs[0].adminpass != "" &&
 | ||
|                 docs[0].adminpass == adminpass
 | ||
|               ) {
 | ||
|                 socket.emit("pw", true);
 | ||
|               }
 | ||
|               in_list = true;
 | ||
|               socket.join(coll);
 | ||
|               Functions.check_inlist(
 | ||
|                 coll,
 | ||
|                 guid,
 | ||
|                 socket,
 | ||
|                 offline,
 | ||
|                 undefined,
 | ||
|                 "place 10"
 | ||
|               );
 | ||
| 
 | ||
|               if (frontpage_lists[0].viewers != undefined) {
 | ||
|                 io.to(coll).emit("viewers", frontpage_lists[0].viewers);
 | ||
|               } else {
 | ||
|                 io.to(coll).emit("viewers", 1);
 | ||
|               }
 | ||
| 
 | ||
|               send_list(coll, socket, true, false, true);
 | ||
|             } else {
 | ||
|               socket.emit("auth_required");
 | ||
|             }
 | ||
|           });
 | ||
|         } else {
 | ||
|           db.createCollection(coll, function(err, docs) {
 | ||
|             db.collection(coll).createIndex(
 | ||
|               { id: 1 },
 | ||
|               { unique: true },
 | ||
|               function(e, d) {
 | ||
|                 var configs = {
 | ||
|                   addsongs: false,
 | ||
|                   adminpass: "",
 | ||
|                   allvideos: true,
 | ||
|                   frontpage: true,
 | ||
|                   longsongs: false,
 | ||
|                   removeplay: false,
 | ||
|                   shuffle: true,
 | ||
|                   skip: false,
 | ||
|                   skips: [],
 | ||
|                   startTime: Functions.get_time(),
 | ||
|                   views: [],
 | ||
|                   vote: false,
 | ||
|                   description: "",
 | ||
|                   thumbnail: "",
 | ||
|                   rules: "",
 | ||
|                   userpass: "",
 | ||
|                   id: "config",
 | ||
|                   toggleChat: true
 | ||
|                 };
 | ||
|                 db.collection(coll + "_settings").insert(configs, function(
 | ||
|                   err,
 | ||
|                   docs
 | ||
|                 ) {
 | ||
|                   socket.join(coll);
 | ||
|                   send_list(coll, socket, true, false, true);
 | ||
|                   db.collection("frontpage_lists").insert(
 | ||
|                     {
 | ||
|                       _id: coll,
 | ||
|                       count: 0,
 | ||
|                       frontpage: true,
 | ||
|                       accessed: Functions.get_time(),
 | ||
|                       viewers: 1
 | ||
|                     },
 | ||
|                     function(e, d) {}
 | ||
|                   );
 | ||
|                   Functions.check_inlist(
 | ||
|                     coll,
 | ||
|                     guid,
 | ||
|                     socket,
 | ||
|                     offline,
 | ||
|                     undefined,
 | ||
|                     "place 11"
 | ||
|                   );
 | ||
|                 });
 | ||
|               }
 | ||
|             );
 | ||
|           });
 | ||
|         }
 | ||
|       });
 | ||
|     });
 | ||
|   } else {
 | ||
|     var result = {
 | ||
|       msg: {
 | ||
|         expected: "object",
 | ||
|         got: typeof msg
 | ||
|       }
 | ||
|     };
 | ||
|     socket.emit("update_required", result);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| function skip(list, guid, coll, offline, socket, callback) {
 | ||
|   var socketid = socket.zoff_id;
 | ||
| 
 | ||
|   if (list !== undefined && list !== null && list !== "") {
 | ||
|     if (coll == undefined && list.hasOwnProperty("channel"))
 | ||
|       coll = list.channel.toLowerCase();
 | ||
|     if (coll !== undefined) {
 | ||
|       try {
 | ||
|         coll = list.channel.toLowerCase(); //.replace(/ /g,'');
 | ||
|         if (coll.length == 0) return;
 | ||
|         coll = Functions.removeEmojis(coll).toLowerCase();
 | ||
|         //coll = coll.replace(/_/g, "");
 | ||
| 
 | ||
|         //coll = filter.clean(coll);
 | ||
|       } catch (e) {
 | ||
|         return;
 | ||
|       }
 | ||
|     }
 | ||
|     if (!list.hasOwnProperty("id") || list.id == undefined) {
 | ||
|       socket.emit("toast", "The list is empty.");
 | ||
|       return;
 | ||
|     }
 | ||
|     if (
 | ||
|       !list.hasOwnProperty("id") ||
 | ||
|       !list.hasOwnProperty("channel") ||
 | ||
|       (typeof list.id != "string" && typeof list.id != "number") ||
 | ||
|       typeof list.channel != "string"
 | ||
|     ) {
 | ||
|       var result = {
 | ||
|         channel: {
 | ||
|           expected: "string",
 | ||
|           got: list.hasOwnProperty("channel") ? typeof list.channel : undefined
 | ||
|         },
 | ||
|         pass: {
 | ||
|           expected: "string",
 | ||
|           got: list.hasOwnProperty("pass") ? typeof list.pass : undefined
 | ||
|         },
 | ||
|         userpass: {
 | ||
|           expected: "string",
 | ||
|           got: list.hasOwnProperty("userpass")
 | ||
|             ? typeof list.userpass
 | ||
|             : undefined
 | ||
|         },
 | ||
|         id: {
 | ||
|           expected: "string",
 | ||
|           got: list.hasOwnProperty("id") ? typeof list.id : undefined
 | ||
|         }
 | ||
|       };
 | ||
|       socket.emit("update_required", result);
 | ||
|       return;
 | ||
|     }
 | ||
|     list.id = list.id + "";
 | ||
|     Functions.getSessionAdminUser(Functions.getSession(socket), coll, function(
 | ||
|       userpass,
 | ||
|       adminpass
 | ||
|     ) {
 | ||
|       if (adminpass != "" || list.pass == undefined) {
 | ||
|         list.pass = Functions.hash_pass(adminpass);
 | ||
|       } else if (list.pass != "") {
 | ||
|         list.pass = Functions.hash_pass(
 | ||
|           Functions.hash_pass(Functions.decrypt_string(list.pass), true)
 | ||
|         );
 | ||
|       } else {
 | ||
|         list.pass = "";
 | ||
|       }
 | ||
|       if (userpass != "" || list.userpass == undefined) {
 | ||
|         list.userpass = userpass;
 | ||
|       } else {
 | ||
|         list.userpass = crypto
 | ||
|           .createHash("sha256")
 | ||
|           .update(Functions.decrypt_string(list.userpass))
 | ||
|           .digest("base64");
 | ||
|       }
 | ||
| 
 | ||
|       db.collection(coll + "_settings").find(function(_err, docs) {
 | ||
|         if (
 | ||
|           docs.length > 0 &&
 | ||
|           (docs[0].userpass == undefined ||
 | ||
|             docs[0].userpass == "" ||
 | ||
|             (list.hasOwnProperty("userpass") &&
 | ||
|               docs[0].userpass == list.userpass))
 | ||
|         ) {
 | ||
|           Functions.check_inlist(
 | ||
|             coll,
 | ||
|             guid,
 | ||
|             socket,
 | ||
|             offline,
 | ||
|             undefined,
 | ||
|             "place 12"
 | ||
|           );
 | ||
| 
 | ||
|           var video_id;
 | ||
|           adminpass = "";
 | ||
|           video_id = list.id;
 | ||
|           var err = list.error;
 | ||
|           Search.check_if_error_or_blocked(
 | ||
|             video_id,
 | ||
|             coll,
 | ||
|             err == "5" ||
 | ||
|               err == "100" ||
 | ||
|               err == "101" ||
 | ||
|               err == "150" ||
 | ||
|               err == 5 ||
 | ||
|               err == 100 ||
 | ||
|               err == 101 ||
 | ||
|               err == 150,
 | ||
|             function(trueError) {
 | ||
|               var error = false;
 | ||
|               if (!trueError) {
 | ||
|                 adminpass = list.pass;
 | ||
|               } else if (trueError) {
 | ||
|                 error = true;
 | ||
|               }
 | ||
|               hash = adminpass;
 | ||
|               //db.collection(coll + "_settings").find(function(err, docs){
 | ||
|               var strictSkip = false;
 | ||
|               var strictSkipNumber = 10;
 | ||
|               if (docs[0].strictSkip) strictSkip = docs[0].strictSkip;
 | ||
|               if (docs[0].strictSkipNumber)
 | ||
|                 strictSkipNumber = docs[0].strictSkipNumber;
 | ||
|               if (docs !== null && docs.length !== 0) {
 | ||
|                 if (
 | ||
|                   !docs[0].skip ||
 | ||
|                   (docs[0].adminpass == hash && docs[0].adminpass !== "") ||
 | ||
|                   error
 | ||
|                 ) {
 | ||
|                   db.collection("frontpage_lists").find({ _id: coll }, function(
 | ||
|                     err,
 | ||
|                     frontpage_viewers
 | ||
|                   ) {
 | ||
|                     if (
 | ||
|                       error ||
 | ||
|                       ((strictSkip &&
 | ||
|                         ((docs[0].adminpass == hash &&
 | ||
|                           docs[0].adminpass !== "") ||
 | ||
|                           docs[0].skips.length + 1 >= strictSkipNumber)) ||
 | ||
|                         (!strictSkip &&
 | ||
|                           ((frontpage_viewers[0].viewers / 2 <=
 | ||
|                             docs[0].skips.length + 1 &&
 | ||
|                             !Functions.contains(docs[0].skips, guid) &&
 | ||
|                             frontpage_viewers[0].viewers != 2) ||
 | ||
|                             (frontpage_viewers[0].viewers == 2 &&
 | ||
|                               docs[0].skips.length + 1 == 2 &&
 | ||
|                               !Functions.contains(docs[0].skips, guid)) ||
 | ||
|                             (docs[0].adminpass == hash &&
 | ||
|                               docs[0].adminpass !== "" &&
 | ||
|                               docs[0].skip))))
 | ||
|                     ) {
 | ||
|                       Functions.checkTimeout(
 | ||
|                         "skip",
 | ||
|                         1,
 | ||
|                         coll,
 | ||
|                         coll,
 | ||
|                         error,
 | ||
|                         true,
 | ||
|                         socket,
 | ||
|                         function() {
 | ||
|                           change_song(coll, error, video_id, docs);
 | ||
|                           socket.emit("toast", "skip");
 | ||
|                           db.collection("user_names").find(
 | ||
|                             { guid: guid },
 | ||
|                             function(err, docs) {
 | ||
|                               if (docs.length == 1) {
 | ||
|                                 db.collection("registered_users").find(
 | ||
|                                   { _id: docs[0].name },
 | ||
|                                   function(err, n) {
 | ||
|                                     var icon = false;
 | ||
|                                     if (n.length > 0 && n[0].icon) {
 | ||
|                                       icon = n[0].icon;
 | ||
|                                     }
 | ||
|                                     io.to(coll).emit("chat", {
 | ||
|                                       from: docs[0].name,
 | ||
|                                       icon: icon,
 | ||
|                                       msg: " skipped"
 | ||
|                                     });
 | ||
|                                   }
 | ||
|                                 );
 | ||
|                               }
 | ||
|                             }
 | ||
|                           );
 | ||
|                         },
 | ||
|                         "The channel is skipping too often, please wait "
 | ||
|                       );
 | ||
|                     } else if (!Functions.contains(docs[0].skips, guid)) {
 | ||
|                       db.collection(coll + "_settings").update(
 | ||
|                         { id: "config" },
 | ||
|                         { $push: { skips: guid } },
 | ||
|                         function(err, d) {
 | ||
|                           if (
 | ||
|                             frontpage_viewers[0].viewers == 2 &&
 | ||
|                             !strictSkip
 | ||
|                           ) {
 | ||
|                             to_skip = 1;
 | ||
|                           } else if (strictSkip) {
 | ||
|                             to_skip =
 | ||
|                               strictSkipNumber - docs[0].skips.length - 1;
 | ||
|                           } else {
 | ||
|                             to_skip =
 | ||
|                               Math.ceil(frontpage_viewers[0].viewers / 2) -
 | ||
|                               docs[0].skips.length -
 | ||
|                               1;
 | ||
|                           }
 | ||
|                           socket.emit(
 | ||
|                             "toast",
 | ||
|                             to_skip + " more are needed to skip!"
 | ||
|                           );
 | ||
|                           db.collection("user_names").find(
 | ||
|                             { guid: guid },
 | ||
|                             function(err, docs) {
 | ||
|                               if (docs.length == 1) {
 | ||
|                                 db.collection("registered_users").find(
 | ||
|                                   { _id: docs[0].name },
 | ||
|                                   function(err, n) {
 | ||
|                                     var icon = false;
 | ||
|                                     if (n.length > 0 && n[0].icon) {
 | ||
|                                       icon = n[0].icon;
 | ||
|                                     }
 | ||
|                                     socket.to(coll).emit("chat", {
 | ||
|                                       from: docs[0].name,
 | ||
|                                       msg: " voted to skip"
 | ||
|                                     });
 | ||
|                                   }
 | ||
|                                 );
 | ||
|                               }
 | ||
|                             }
 | ||
|                           );
 | ||
|                         }
 | ||
|                       );
 | ||
|                     } else {
 | ||
|                       socket.emit("toast", "alreadyskip");
 | ||
|                     }
 | ||
|                   });
 | ||
|                 } else socket.emit("toast", "noskip");
 | ||
|               }
 | ||
|             }
 | ||
|           );
 | ||
|           //});
 | ||
|         } else {
 | ||
|           socket.emit("auth_required");
 | ||
|         }
 | ||
|       });
 | ||
|     });
 | ||
|   } else {
 | ||
|     var result = {
 | ||
|       msg: {
 | ||
|         expected: "object",
 | ||
|         got: typeof list
 | ||
|       }
 | ||
|     };
 | ||
|     socket.emit("update_required", result);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| function change_song(coll, error, id, conf, callback, socket) {
 | ||
|   //coll = coll.replace(/ /g,'');
 | ||
|   //db.collection(coll + "_settings").find(function(err, docs){
 | ||
|   var startTime = conf[0].startTime;
 | ||
|   if (conf !== null && conf.length !== 0) {
 | ||
|     db.collection(coll).aggregate(
 | ||
|       [
 | ||
|         {
 | ||
|           $match: {
 | ||
|             views: {
 | ||
|               $exists: false
 | ||
|             },
 | ||
|             type: {
 | ||
|               $ne: "suggested"
 | ||
|             }
 | ||
|           }
 | ||
|         },
 | ||
|         {
 | ||
|           $sort: {
 | ||
|             now_playing: -1,
 | ||
|             votes: -1,
 | ||
|             added: 1,
 | ||
|             title: 1
 | ||
|           }
 | ||
|         },
 | ||
|         {
 | ||
|           $limit: 2
 | ||
|         }
 | ||
|       ],
 | ||
|       function(err, now_playing_doc) {
 | ||
|         if (now_playing_doc.length == 0) {
 | ||
|           console.log("empty list", coll, callback, id, conf);
 | ||
|         }
 | ||
|         if (
 | ||
|           now_playing_doc.length > 0 &&
 | ||
|           ((id && id == now_playing_doc[0].id) || !id)
 | ||
|         ) {
 | ||
|           if (error) {
 | ||
|             db.collection(coll).remove({ now_playing: true, id: id }, function(
 | ||
|               err,
 | ||
|               docs
 | ||
|             ) {
 | ||
|               var next_song;
 | ||
|               if (now_playing_doc.length == 2)
 | ||
|                 next_song = now_playing_doc[1].id;
 | ||
|               change_song_post(coll, next_song, conf, callback, socket, error);
 | ||
|               if (!callback) {
 | ||
|                 io.to(coll).emit("channel", {
 | ||
|                   type: "deleted",
 | ||
|                   value: now_playing_doc[0].id,
 | ||
|                   removed: true
 | ||
|                 });
 | ||
|               }
 | ||
|               if (docs.deletedCount == 1) {
 | ||
|                 db.collection("frontpage_lists").update(
 | ||
|                   { _id: coll, count: { $gt: 0 } },
 | ||
|                   {
 | ||
|                     $inc: { count: -1 },
 | ||
|                     $set: { accessed: Functions.get_time() }
 | ||
|                   },
 | ||
|                   { upsert: true },
 | ||
|                   function(err, docs) {}
 | ||
|                 );
 | ||
|               }
 | ||
|             });
 | ||
|           } else if (conf[0].removeplay === true) {
 | ||
|             db.collection(coll).remove({ now_playing: true, id: id }, function(
 | ||
|               err,
 | ||
|               docs
 | ||
|             ) {
 | ||
|               var next_song;
 | ||
|               if (now_playing_doc.length == 2)
 | ||
|                 next_song = now_playing_doc[1].id;
 | ||
|               change_song_post(coll, next_song, conf, callback, socket, error);
 | ||
|               if (!callback) {
 | ||
|                 io.to(coll).emit("channel", {
 | ||
|                   type: "deleted",
 | ||
|                   value: now_playing_doc[0].id,
 | ||
|                   removed: true
 | ||
|                 });
 | ||
|               }
 | ||
|               if (docs.deletedCount == 1) {
 | ||
|                 db.collection("frontpage_lists").update(
 | ||
|                   { _id: coll, count: { $gt: 0 } },
 | ||
|                   {
 | ||
|                     $inc: { count: -1 },
 | ||
|                     $set: { accessed: Functions.get_time() }
 | ||
|                   },
 | ||
|                   { upsert: true },
 | ||
|                   function(err, docs) {}
 | ||
|                 );
 | ||
|               }
 | ||
|             });
 | ||
|           } else {
 | ||
|             if (
 | ||
|               (conf[0].skipped_time != undefined &&
 | ||
|                 conf[0].skipped_time != Functions.get_time()) ||
 | ||
|               conf[0].skipped_time == undefined
 | ||
|             ) {
 | ||
|               db.collection(coll).update(
 | ||
|                 { now_playing: true, id: id },
 | ||
|                 {
 | ||
|                   $set: {
 | ||
|                     now_playing: false,
 | ||
|                     votes: 0,
 | ||
|                     guids: []
 | ||
|                   }
 | ||
|                 },
 | ||
|                 { multi: true },
 | ||
|                 function(err, docs) {
 | ||
|                   var next_song;
 | ||
|                   if (now_playing_doc.length == 2)
 | ||
|                     next_song = now_playing_doc[1].id;
 | ||
|                   change_song_post(
 | ||
|                     coll,
 | ||
|                     next_song,
 | ||
|                     conf,
 | ||
|                     callback,
 | ||
|                     socket,
 | ||
|                     error
 | ||
|                   );
 | ||
|                 }
 | ||
|               );
 | ||
|             }
 | ||
|           }
 | ||
|         } else {
 | ||
|           if (
 | ||
|             now_playing_doc.length > 0 &&
 | ||
|             now_playing_doc[0].now_playing == true &&
 | ||
|             now_playing_doc.length > 1 &&
 | ||
|             now_playing_doc[1].id == id
 | ||
|           ) {
 | ||
|             db.collection(coll).update(
 | ||
|               { id: now_playing_doc[0].id },
 | ||
|               { $set: { now_playing: false } },
 | ||
|               function(e, d) {
 | ||
|                 change_song(coll, error, id, conf, callback, socket, error);
 | ||
|               }
 | ||
|             );
 | ||
|           } else {
 | ||
|             return;
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     );
 | ||
|   }
 | ||
|   //});
 | ||
| }
 | ||
| 
 | ||
| function change_song_post(coll, next_song, conf, callback, socket, removed) {
 | ||
|   //coll = coll.replace(/ /g,'');
 | ||
|   db.collection(coll).aggregate(
 | ||
|     [
 | ||
|       {
 | ||
|         $match: {
 | ||
|           now_playing: false,
 | ||
|           type: {
 | ||
|             $ne: "suggested"
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|       {
 | ||
|         $sort: {
 | ||
|           votes: -1,
 | ||
|           added: 1,
 | ||
|           title: 1
 | ||
|         }
 | ||
|       },
 | ||
|       {
 | ||
|         $limit: 2
 | ||
|       }
 | ||
|     ],
 | ||
|     function(err, docs) {
 | ||
|       if (docs !== null && docs.length > 0) {
 | ||
|         var id = docs[0].id;
 | ||
|         if (next_song && next_song != id) {
 | ||
|           if (docs.length == 2 && next_song == docs[1].id) {
 | ||
|             id = docs[1].id;
 | ||
|           } else {
 | ||
|             return;
 | ||
|           }
 | ||
|         }
 | ||
|         db.collection(coll).update(
 | ||
|           { id: id, now_playing: false },
 | ||
|           {
 | ||
|             $set: {
 | ||
|               now_playing: true,
 | ||
|               votes: 0,
 | ||
|               guids: [],
 | ||
|               added: Functions.get_time()
 | ||
|             }
 | ||
|           },
 | ||
|           function(err, returnDocs) {
 | ||
|             if (
 | ||
|               (returnDocs.hasOwnProperty("nModified") &&
 | ||
|                 returnDocs.nModified == 0) ||
 | ||
|               (returnDocs.hasOwnProperty("n") && returnDocs.n == 0)
 | ||
|             ) {
 | ||
|               if (!callback) return;
 | ||
|               callback();
 | ||
|               return;
 | ||
|             }
 | ||
|             db.collection(coll + "_settings").update(
 | ||
|               { id: "config" },
 | ||
|               {
 | ||
|                 $set: {
 | ||
|                   startTime: Functions.get_time(),
 | ||
|                   skips: []
 | ||
|                 }
 | ||
|               },
 | ||
|               function(err, returnDocs) {
 | ||
|                 //db.collection(coll + "_settings").find({id: "config"}, function(err, conf){
 | ||
|                 if (!callback) {
 | ||
|                   io.to(coll).emit("channel", {
 | ||
|                     type: "song_change",
 | ||
|                     time: Functions.get_time(),
 | ||
|                     remove: conf[0].removeplay || removed,
 | ||
|                     id: id
 | ||
|                   });
 | ||
|                   send_play(coll);
 | ||
|                 } else {
 | ||
|                   if (socket == undefined) {
 | ||
|                     io.to(coll).emit("channel", {
 | ||
|                       type: "song_change",
 | ||
|                       time: Functions.get_time(),
 | ||
|                       remove: conf[0].removeplay || removed,
 | ||
|                       id: id
 | ||
|                     });
 | ||
|                   } else {
 | ||
|                     socket.to(coll).emit("channel", {
 | ||
|                       type: "song_change",
 | ||
|                       time: Functions.get_time(),
 | ||
|                       remove: conf[0].removeplay || removed,
 | ||
|                       id: id
 | ||
|                     });
 | ||
|                   }
 | ||
|                   send_play(coll, socket, true);
 | ||
|                   callback();
 | ||
|                 }
 | ||
|                 Frontpage.update_frontpage(
 | ||
|                   coll,
 | ||
|                   docs[0].id,
 | ||
|                   docs[0].title,
 | ||
|                   docs[0].thumbnail,
 | ||
|                   docs[0].source
 | ||
|                 );
 | ||
|                 //});
 | ||
|               }
 | ||
|             );
 | ||
|           }
 | ||
|         );
 | ||
|       }
 | ||
|     }
 | ||
|   );
 | ||
| }
 | ||
| 
 | ||
| function send_list(coll, socket, send, list_send, configs, shuffled) {
 | ||
|   //coll = coll.replace(/ /g,'');
 | ||
|   db.collection(coll + "_settings").aggregate(
 | ||
|     [
 | ||
|       {
 | ||
|         $match: {
 | ||
|           id: "config"
 | ||
|         }
 | ||
|       },
 | ||
|       {
 | ||
|         $project: projects.toShowConfig
 | ||
|       }
 | ||
|     ],
 | ||
|     function(err, _conf) {
 | ||
|       var conf = _conf;
 | ||
|       if (conf.length == 0) {
 | ||
|         var conf = {
 | ||
|           id: "config",
 | ||
|           addsongs: false,
 | ||
|           adminpass: "",
 | ||
|           allvideos: true,
 | ||
|           frontpage: true,
 | ||
|           longsongs: false,
 | ||
|           removeplay: false,
 | ||
|           shuffle: true,
 | ||
|           skip: false,
 | ||
|           skips: [],
 | ||
|           startTime: Functions.get_time(),
 | ||
|           views: [],
 | ||
|           vote: false,
 | ||
|           description: "",
 | ||
|           thumbnail: "",
 | ||
|           rules: "",
 | ||
|           toggleChat: true,
 | ||
|           userpass: ""
 | ||
|         };
 | ||
|         db.collection(coll + "_settings").update(
 | ||
|           { id: "config" },
 | ||
|           conf,
 | ||
|           { upsert: true },
 | ||
|           function(err, docs) {
 | ||
|             send_list(coll, socket, send, list_send, configs, shuffled);
 | ||
|           }
 | ||
|         );
 | ||
|       } else {
 | ||
|         db.collection(coll).aggregate(
 | ||
|           [
 | ||
|             {
 | ||
|               $match: { type: { $ne: "suggested" } }
 | ||
|             },
 | ||
|             {
 | ||
|               $project: projects.project_object
 | ||
|             },
 | ||
|             { $sort: { now_playing: -1, votes: -1, added: 1 } }
 | ||
|           ],
 | ||
|           function(
 | ||
|             err,
 | ||
|             docs //db.collection(coll).find({type: {$ne: "suggested"}}, function(err, docs)
 | ||
|           ) {
 | ||
|             if (docs.length > 0) {
 | ||
|               db.collection(coll).find({ now_playing: true }, function(
 | ||
|                 err,
 | ||
|                 np_docs
 | ||
|               ) {
 | ||
|                 if (np_docs.length == 0) {
 | ||
|                   db.collection(coll).aggregate(
 | ||
|                     [
 | ||
|                       {
 | ||
|                         $match: {
 | ||
|                           views: {
 | ||
|                             $exists: false
 | ||
|                           },
 | ||
|                           type: {
 | ||
|                             $ne: "suggested"
 | ||
|                           }
 | ||
|                         }
 | ||
|                       },
 | ||
|                       {
 | ||
|                         $sort: {
 | ||
|                           now_playing: -1,
 | ||
|                           votes: -1,
 | ||
|                           added: 1,
 | ||
|                           title: 1
 | ||
|                         }
 | ||
|                       },
 | ||
|                       {
 | ||
|                         $limit: 1
 | ||
|                       }
 | ||
|                     ],
 | ||
|                     function(err, now_playing_doc) {
 | ||
|                       if (now_playing_doc[0].now_playing == false) {
 | ||
|                         db.collection(coll).update(
 | ||
|                           { id: now_playing_doc[0].id, now_playing: false },
 | ||
|                           {
 | ||
|                             $set: {
 | ||
|                               now_playing: true,
 | ||
|                               votes: 0,
 | ||
|                               guids: [],
 | ||
|                               added: Functions.get_time()
 | ||
|                             }
 | ||
|                           },
 | ||
|                           function(err, returnDocs) {
 | ||
|                             db.collection(coll + "_settings").update(
 | ||
|                               { id: "config" },
 | ||
|                               {
 | ||
|                                 $set: {
 | ||
|                                   startTime: Functions.get_time(),
 | ||
|                                   skips: []
 | ||
|                                 }
 | ||
|                               },
 | ||
|                               function(err, returnDocs) {
 | ||
|                                 Frontpage.update_frontpage(
 | ||
|                                   coll,
 | ||
|                                   now_playing_doc[0].id,
 | ||
|                                   now_playing_doc[0].title,
 | ||
|                                   now_playing_doc[0].thumbnail,
 | ||
|                                   now_playing_doc[0].source
 | ||
|                                 );
 | ||
|                                 send_list(
 | ||
|                                   coll,
 | ||
|                                   socket,
 | ||
|                                   send,
 | ||
|                                   list_send,
 | ||
|                                   configs,
 | ||
|                                   shuffled
 | ||
|                                 );
 | ||
|                               }
 | ||
|                             );
 | ||
|                           }
 | ||
|                         );
 | ||
|                       }
 | ||
|                     }
 | ||
|                   );
 | ||
|                 } else if (np_docs.length > 1) {
 | ||
|                   db.collection(coll).aggregate(
 | ||
|                     [
 | ||
|                       {
 | ||
|                         $match: {
 | ||
|                           now_playing: true
 | ||
|                         }
 | ||
|                       },
 | ||
|                       {
 | ||
|                         $sort: {
 | ||
|                           now_playing: -1,
 | ||
|                           votes: -1,
 | ||
|                           added: 1,
 | ||
|                           title: 1
 | ||
|                         }
 | ||
|                       }
 | ||
|                     ],
 | ||
|                     function(e, docs) {
 | ||
|                       var real_now_playing = docs[docs.length - 1];
 | ||
|                       db.collection(coll).update(
 | ||
|                         { now_playing: true, id: { $ne: real_now_playing.id } },
 | ||
|                         { $set: { now_playing: false } },
 | ||
|                         { multi: true },
 | ||
|                         function(e, d) {
 | ||
|                           send_list(
 | ||
|                             coll,
 | ||
|                             socket,
 | ||
|                             send,
 | ||
|                             list_send,
 | ||
|                             configs,
 | ||
|                             shuffled
 | ||
|                           );
 | ||
|                         }
 | ||
|                       );
 | ||
|                     }
 | ||
|                   );
 | ||
|                 } else {
 | ||
|                   if (
 | ||
|                     Functions.get_time() - conf[0].startTime >
 | ||
|                     np_docs[0].duration
 | ||
|                   ) {
 | ||
|                     change_song(
 | ||
|                       coll,
 | ||
|                       false,
 | ||
|                       np_docs[0].id,
 | ||
|                       conf,
 | ||
|                       function() {
 | ||
|                         send_list(
 | ||
|                           coll,
 | ||
|                           socket,
 | ||
|                           send,
 | ||
|                           list_send,
 | ||
|                           configs,
 | ||
|                           shuffled
 | ||
|                         );
 | ||
|                       },
 | ||
|                       socket
 | ||
|                     );
 | ||
|                   } else {
 | ||
|                     if (list_send) {
 | ||
|                       io.to(coll).emit("channel", {
 | ||
|                         type: "list",
 | ||
|                         playlist: docs,
 | ||
|                         shuffled: shuffled
 | ||
|                       });
 | ||
|                     } else if (!list_send) {
 | ||
|                       socket.emit("channel", {
 | ||
|                         type: "list",
 | ||
|                         playlist: docs,
 | ||
|                         shuffled: shuffled
 | ||
|                       });
 | ||
|                     }
 | ||
|                     if (socket === undefined && send) {
 | ||
|                       send_play(coll);
 | ||
|                     } else if (send) {
 | ||
|                       send_play(coll, socket);
 | ||
|                     }
 | ||
|                   }
 | ||
|                 }
 | ||
|               });
 | ||
|             } else {
 | ||
|               if (list_send) {
 | ||
|                 io.to(coll).emit("channel", {
 | ||
|                   type: "list",
 | ||
|                   playlist: docs,
 | ||
|                   shuffled: shuffled
 | ||
|                 });
 | ||
|               } else if (!list_send) {
 | ||
|                 socket.emit("channel", {
 | ||
|                   type: "list",
 | ||
|                   playlist: docs,
 | ||
|                   shuffled: shuffled
 | ||
|                 });
 | ||
|               }
 | ||
|               if (socket === undefined && send) {
 | ||
|                 send_play(coll);
 | ||
|               } else if (send) {
 | ||
|                 send_play(coll, socket);
 | ||
|               }
 | ||
|             }
 | ||
|           }
 | ||
|         );
 | ||
|         if (configs) {
 | ||
|           if (conf.length > 0) {
 | ||
|             if (conf[0].adminpass !== "") conf[0].adminpass = true;
 | ||
|             if (conf[0].hasOwnProperty("userpass") && conf[0].userpass != "")
 | ||
|               conf[0].userpass = true;
 | ||
|             else conf[0].userpass = false;
 | ||
|             io.to(coll).emit("conf", conf);
 | ||
|           } else if (conf.length == 0 && docs.length > 0) {
 | ||
|             var conf = {
 | ||
|               id: "config",
 | ||
|               addsongs: false,
 | ||
|               adminpass: "",
 | ||
|               allvideos: true,
 | ||
|               frontpage: true,
 | ||
|               longsongs: false,
 | ||
|               removeplay: false,
 | ||
|               shuffle: true,
 | ||
|               skip: false,
 | ||
|               skips: [],
 | ||
|               startTime: Functions.get_time(),
 | ||
|               views: [],
 | ||
|               vote: false,
 | ||
|               desc: "",
 | ||
|               userpass: ""
 | ||
|             };
 | ||
|             db.collection(coll + "_settings").update(
 | ||
|               { id: "config" },
 | ||
|               conf,
 | ||
|               { upsert: true },
 | ||
|               function(err, docs) {
 | ||
|                 io.to(coll).emit("conf", conf);
 | ||
|               }
 | ||
|             );
 | ||
|           }
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|   );
 | ||
|   if (socket) {
 | ||
|     db.collection(coll)
 | ||
|       .find({ type: "suggested" })
 | ||
|       .sort({ added: 1 }, function(err, sugg) {
 | ||
|         socket.emit("suggested", sugg);
 | ||
|       });
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| function end(obj, coll, guid, offline, socket) {
 | ||
|   var socketid = socket.zoff_id;
 | ||
|   if (typeof obj !== "object") {
 | ||
|     return;
 | ||
|   }
 | ||
|   id = obj.id;
 | ||
| 
 | ||
|   if (id !== undefined && id !== null && id !== "") {
 | ||
|     if (
 | ||
|       !obj.hasOwnProperty("id") ||
 | ||
|       !obj.hasOwnProperty("channel") ||
 | ||
|       (typeof obj.id != "string" && typeof obj.id != "number") ||
 | ||
|       typeof obj.channel != "string"
 | ||
|     ) {
 | ||
|       var result = {
 | ||
|         channel: {
 | ||
|           expected: "string",
 | ||
|           got: obj.hasOwnProperty("channel") ? typeof obj.channel : undefined
 | ||
|         },
 | ||
|         pass: {
 | ||
|           expected: "string",
 | ||
|           got: obj.hasOwnProperty("pass") ? typeof obj.pass : undefined
 | ||
|         },
 | ||
|         id: {
 | ||
|           expected: "string || number",
 | ||
|           got: obj.hasOwnProperty("id") ? typeof obj.id : undefined
 | ||
|         }
 | ||
|       };
 | ||
|       socket.emit("update_required", result);
 | ||
|       return;
 | ||
|     }
 | ||
|     obj.id = obj.id + "";
 | ||
|     id = id + "";
 | ||
|     var callback_function = function() {
 | ||
|       for (var i = 0; i < arguments.length; i++) {
 | ||
|         if (typeof arguments[i] == "function") {
 | ||
|           arguments[i]();
 | ||
|         }
 | ||
|       }
 | ||
|     };
 | ||
|     db.collection(coll + "_settings").find(function(err, docs) {
 | ||
|       var authentication_needed = false;
 | ||
|       if (
 | ||
|         docs.length > 0 &&
 | ||
|         (docs[0].userpass != undefined && docs[0].userpass != "")
 | ||
|       ) {
 | ||
|         callback_function = Functions.getSessionAdminUser;
 | ||
|         authentication_needed = true;
 | ||
|       }
 | ||
|       callback_function(Functions.getSession(socket), coll, function(userpass) {
 | ||
|         if (userpass != "" || obj.pass == undefined) {
 | ||
|           obj.pass = userpass;
 | ||
|         } else {
 | ||
|           obj.pass = crypto
 | ||
|             .createHash("sha256")
 | ||
|             .update(Functions.decrypt_string(obj.pass))
 | ||
|             .digest("base64");
 | ||
|         }
 | ||
|         if (
 | ||
|           !authentication_needed ||
 | ||
|           (authentication_needed &&
 | ||
|             obj.hasOwnProperty("pass") &&
 | ||
|             docs[0].userpass == obj.pass)
 | ||
|         ) {
 | ||
|           Functions.check_inlist(
 | ||
|             coll,
 | ||
|             guid,
 | ||
|             socket,
 | ||
|             offline,
 | ||
|             undefined,
 | ||
|             "place 13"
 | ||
|           );
 | ||
|           db.collection(coll).find({ now_playing: true }, function(err, np) {
 | ||
|             if (err !== null) console.log(err);
 | ||
|             if (
 | ||
|               np !== null &&
 | ||
|               np !== undefined &&
 | ||
|               np.length == 1 &&
 | ||
|               np[0].id == id
 | ||
|             ) {
 | ||
|               var startTime = docs[0].startTime;
 | ||
|               if (
 | ||
|                 startTime + parseInt(np[0].duration) <=
 | ||
|                 Functions.get_time() + 5
 | ||
|               ) {
 | ||
|                 change_song(coll, false, id, docs);
 | ||
|               }
 | ||
|             }
 | ||
|           });
 | ||
|         } else {
 | ||
|           socket.emit("auth_required");
 | ||
|         }
 | ||
|       });
 | ||
|     });
 | ||
|   } else {
 | ||
|     var result = {
 | ||
|       msg: {
 | ||
|         expected: "object",
 | ||
|         got: typeof obj
 | ||
|       }
 | ||
|     };
 | ||
|     socket.emit("update_required", result);
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| function send_play(coll, socket, broadcast) {
 | ||
|   //coll = coll.replace(/ /g,'');
 | ||
|   db.collection(coll).find({ now_playing: true }, function(err, np) {
 | ||
|     db.collection(coll + "_settings").find(function(err, conf) {
 | ||
|       if (err !== null) console.log(err);
 | ||
|       try {
 | ||
|         if (Functions.get_time() - conf[0].startTime > np[0].duration) {
 | ||
|           change_song(coll, false, np[0].id, conf);
 | ||
|         } else if (conf !== null && conf !== undefined && conf.length !== 0) {
 | ||
|           if (conf[0].adminpass !== "") conf[0].adminpass = true;
 | ||
|           if (conf[0].hasOwnProperty("userpass") && conf[0].userpass != "")
 | ||
|             conf[0].userpass = true;
 | ||
|           else conf[0].userpass = false;
 | ||
|           if (!np.hasOwnProperty("start")) np.start = 0;
 | ||
|           if (!np.hasOwnProperty("end")) np.end = np.duration;
 | ||
|           toSend = { np: np, conf: conf, time: Functions.get_time() };
 | ||
|           if (socket === undefined) {
 | ||
|             io.to(coll).emit("np", toSend);
 | ||
|             //
 | ||
|             getNextSong(coll, undefined);
 | ||
|             var url =
 | ||
|               "https://img.youtube.com/vi/" + np[0].id + "/mqdefault.jpg";
 | ||
|             if (np[0].source == "soundcloud") url = np[0].thumbnail;
 | ||
|             sendColor(coll, false, url);
 | ||
|           } else {
 | ||
|             var url =
 | ||
|               "https://img.youtube.com/vi/" + np[0].id + "/mqdefault.jpg";
 | ||
|             if (np[0].source == "soundcloud") url = np[0].thumbnail;
 | ||
|             sendColor(coll, socket, url);
 | ||
|             if (broadcast) {
 | ||
|               socket.to(coll).emit("np", toSend);
 | ||
|               return;
 | ||
|             }
 | ||
|             socket.emit("np", toSend);
 | ||
|           }
 | ||
|         }
 | ||
|       } catch (e) {
 | ||
|         if (socket) {
 | ||
|           if (broadcast) {
 | ||
|             socket.to(coll).emit("np", {});
 | ||
|             return;
 | ||
|           }
 | ||
|           socket.emit("np", {});
 | ||
|         } else {
 | ||
|           io.to(coll).emit("np", {});
 | ||
|         }
 | ||
|       }
 | ||
|     });
 | ||
|   });
 | ||
| }
 | ||
| 
 | ||
| function sendColor(coll, socket, url, ajax, res) {
 | ||
|   if (coll != undefined && typeof coll == "string") {
 | ||
|     //coll = coll.replace(/ /g,'');
 | ||
|   }
 | ||
|   if (url.indexOf("://") == -1)
 | ||
|     url = "https://img.youtube.com/vi/" + url + "/mqdefault.jpg";
 | ||
|   //var url = 'https://img.youtube.com/vi/'+id+'/mqdefault.jpg';
 | ||
| 
 | ||
|   Jimp.read(url)
 | ||
|     .then(function(image) {
 | ||
|       var c = ColorThief.getColor(image);
 | ||
|       if (ajax) {
 | ||
|         res.header({ "Content-Type": "application/json" });
 | ||
|         res.status(200).send(c);
 | ||
|         return;
 | ||
|       } else {
 | ||
|         if (socket) {
 | ||
|           socket.emit("color", { color: c, only: true });
 | ||
|         } else {
 | ||
|           io.to(coll).emit("color", { color: c, only: false });
 | ||
|         }
 | ||
|       }
 | ||
|     })
 | ||
|     .catch(function(err) {
 | ||
|       console.log("Crashed on fetching image, url is " + url);
 | ||
|       console.log("Is ajax: " + ajax);
 | ||
|       if (ajax) {
 | ||
|         res.header({ "Content-Type": "application/json" });
 | ||
|         res.status(404);
 | ||
|         return;
 | ||
|       }
 | ||
|     });
 | ||
| }
 | ||
| 
 | ||
| function getNextSong(coll, socket, callback) {
 | ||
|   //coll = coll.replace(/ /g,'');
 | ||
|   db.collection(coll).aggregate(
 | ||
|     [
 | ||
|       {
 | ||
|         $match: {
 | ||
|           views: {
 | ||
|             $exists: false
 | ||
|           },
 | ||
|           type: {
 | ||
|             $ne: "suggested"
 | ||
|           }
 | ||
|         }
 | ||
|       },
 | ||
|       {
 | ||
|         $sort: {
 | ||
|           now_playing: 1,
 | ||
|           votes: -1,
 | ||
|           added: 1,
 | ||
|           title: 1
 | ||
|         }
 | ||
|       },
 | ||
|       {
 | ||
|         $limit: 1
 | ||
|       }
 | ||
|     ],
 | ||
|     function(err, doc) {
 | ||
|       if (doc.length == 1) {
 | ||
|         var thumbnail = "";
 | ||
|         var source = "youtube";
 | ||
|         if (doc[0].source && doc[0].source == "soundcloud") {
 | ||
|           source = "soundcloud";
 | ||
|           thumbnail = doc[0].thumbnail;
 | ||
|         }
 | ||
|         if (socket != undefined) {
 | ||
|           socket.emit("next_song", {
 | ||
|             videoId: doc[0].id,
 | ||
|             title: doc[0].title,
 | ||
|             source: source,
 | ||
|             thumbnail: thumbnail
 | ||
|           });
 | ||
|         } else {
 | ||
|           io.to(coll).emit("next_song", {
 | ||
|             videoId: doc[0].id,
 | ||
|             title: doc[0].title,
 | ||
|             source: source,
 | ||
|             thumbnail: thumbnail
 | ||
|           });
 | ||
|         }
 | ||
|       }
 | ||
|       if (typeof callback == "function") callback();
 | ||
|     }
 | ||
|   );
 | ||
| }
 | ||
| 
 | ||
| module.exports.join_silent = join_silent;
 | ||
| module.exports.sendColor = sendColor;
 | ||
| module.exports.now_playing = now_playing;
 | ||
| module.exports.list = list;
 | ||
| module.exports.skip = skip;
 | ||
| module.exports.change_song = change_song;
 | ||
| module.exports.change_song_post = change_song_post;
 | ||
| module.exports.send_list = send_list;
 | ||
| module.exports.end = end;
 | ||
| module.exports.send_play = send_play;
 | ||
| module.exports.getNextSong = getNextSong;
 |