mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1295 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1295 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");
 | 
						||
 | 
						||
// done
 | 
						||
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;
 |