diff --git a/server/handlers/list.js b/server/handlers/list.js index 5e805d64..c802c353 100644 --- a/server/handlers/list.js +++ b/server/handlers/list.js @@ -5,6 +5,7 @@ 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) { @@ -187,80 +188,82 @@ function skip(list, guid, coll, offline, socket, callback) { 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; err = list.error; - var error = false; - var video_id; - if(err != "5" && err != "100" && err != "101" && err != "150") - { - adminpass = list.pass; - }else if(err == "5" || err == "100" || err == "101" || err == "150"){ - 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) + Search.check_if_error_or_blocked(video_id, coll, 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) { - db.collection("frontpage_lists").find({"_id": coll}, function(err, frontpage_viewers){ - if( - (strictSkip && (error || (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"}); - }); + if(!docs[0].skip || (docs[0].adminpass == hash && docs[0].adminpass !== "") || error) + { + + db.collection("frontpage_lists").find({"_id": coll}, function(err, frontpage_viewers){ + if( + (strictSkip && (error || (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"}); + }) + } + }); }); - }, "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("toast", "alreadyskip"); + } + }); + }else + socket.emit("toast", "noskip"); + } + }); //}); } else { socket.emit("auth_required"); @@ -307,44 +310,23 @@ function change_song(coll, error, id, conf, callback, socket) { console.log("empty list", coll, callback, id, conf); } if(now_playing_doc.length > 0 && ((id && id == now_playing_doc[0].id) || !id)) { - if(error && now_playing_doc[0].source == "youtube"){ - request('http://img.youtube.com/vi/'+now_playing_doc[0].id+'/mqdefault.jpg', function (err, response, body) { - if (err || response.statusCode == 404) { - 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); - 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 + "_settings").update({id: "config"}, {$set: {skipped_time: Functions.get_time()}}, function(err, updated){ - 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; - if(docs.n >= 1) change_song_post(coll, next_song, conf, callback, socket); - }); - }); + 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); + 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}); } @@ -353,7 +335,6 @@ function change_song(coll, error, id, conf, callback, socket) { } }); } 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:{ @@ -364,14 +345,14 @@ function change_song(coll, error, id, conf, callback, socket) { },{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); + 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); + change_song(coll, error, id, conf, callback, socket, error); }) } else { return; @@ -382,7 +363,7 @@ function change_song(coll, error, id, conf, callback, socket) { //}); } -function change_song_post(coll, next_song, conf, callback, socket) { +function change_song_post(coll, next_song, conf, callback, socket, removed) { //coll = coll.replace(/ /g,''); db.collection(coll).aggregate([{ $match:{ @@ -425,13 +406,13 @@ function change_song_post(coll, next_song, conf, callback, socket) { }, 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}); + io.to(coll).emit("channel", {type: "song_change", time: Functions.get_time(), remove: conf[0].removeplay || removed}); send_play(coll); } else { if(socket == undefined) { - io.to(coll).emit("channel", {type: "song_change", time: Functions.get_time(), remove: conf[0].removeplay}); + io.to(coll).emit("channel", {type: "song_change", time: Functions.get_time(), remove: conf[0].removeplay || removed}); } else { - socket.to(coll).emit("channel", {type: "song_change", time: Functions.get_time(), remove: conf[0].removeplay}); + socket.to(coll).emit("channel", {type: "song_change", time: Functions.get_time(), remove: conf[0].removeplay || removed}); } send_play(coll, socket, true); callback(); diff --git a/server/handlers/search.js b/server/handlers/search.js index c75c195a..65151aff 100644 --- a/server/handlers/search.js +++ b/server/handlers/search.js @@ -12,6 +12,60 @@ try { var request = require('request'); var db = require(pathThumbnails + '/handlers/db.js'); +function check_if_error_or_blocked(id, channel, errored, callback) { + if(!errored) { + callback(false); + return; + } + db.collection(channel).find({id: id, now_playing: true}, function(err, song) { + if(song.length == 0) { + callback(false); + return; + } + var song_info = song[0]; + if(song_info.source != "soundcloud") { + request({ + type: "GET", + url: "https://www.googleapis.com/youtube/v3/videos?part=id,status,contentDetails&key="+key+"&id=" + song_info.id, + }, function(error, response, body) { + try { + var resp = JSON.parse(body); + if(resp.pageInfo.totalResults == 0) { + callback(true); + return; + } else if(!resp.status.embeddable) { + callback(true); + return; + } + callback(false); + return; + } catch(e){ + callback(true); + return; + } + }); + } else { + request({ + type: "GET", + url: "http://api.soundcloud.com/tracks/" + song_info.id + "?client_id=" + soundcloudKey, + }, function(error, response, body) { + try { + var resp = JSON.parse(body); + if(resp.sharing != "public" || resp.embeddable_by != "all") { + callback(true); + return; + } + callback(false); + return; + } catch(e){ + callback(true); + return; + } + }); + } + }); +} + function filterFunction(el) { return el != null && el != "" && @@ -162,14 +216,11 @@ function get_genres_youtube_recursive(arr, channel, i, callback) { url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key="+key+"&id=" + ids.join(","), }, function(error, response, body) { if(error) { - console.log(arr, channel, i, arr[i]); - console.log("error start 1", error, ids, "error end"); get_genres_youtube_recursive(arr, channel, i + ids.length, callback); return; } var resp = JSON.parse(body); if(!resp.hasOwnProperty("items")) { - console.log("error start 2", resp, ids, "error end"); get_genres_youtube_recursive(arr, channel, i + ids.length, callback); return; } @@ -203,12 +254,10 @@ function get_genres_youtube(ids, channel) { url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key="+key+"&id=" + ids, }, function(error, response, body) { if(error) { - console.log("error start", error, ids, "error end"); return; } var resp = JSON.parse(body); if(!resp.hasOwnProperty("items")) { - console.log("error start", resp, ids, "error end"); return; } if(resp.items.length > 0) { @@ -445,6 +494,7 @@ function durationToSeconds(duration) { return hours*60*60+minutes*60+seconds; } +module.exports.check_if_error_or_blocked = check_if_error_or_blocked; module.exports.get_genres_list_recursive = get_genres_list_recursive; module.exports.get_genres_soundcloud = get_genres_soundcloud; module.exports.get_genres_youtube = get_genres_youtube; diff --git a/server/public/assets/js/player.js b/server/public/assets/js/player.js index 59c50a26..fa79ee2c 100755 --- a/server/public/assets/js/player.js +++ b/server/public/assets/js/player.js @@ -345,6 +345,7 @@ var Player = { Player.soundcloud_player.bind("finish", Player.soundcloudFinish); Player.soundcloud_player.bind("pause", Player.soundcloudPause); Player.soundcloud_player.bind("play", Player.soundcloudPlay); + Player.soundcloud_player.bind("error", Player.soundcloudError); window.player = player; Player.soundcloud_dead = false; SC_player.get('/tracks', { @@ -355,16 +356,19 @@ var Player = { document.querySelector("#soundcloud_listen_link").href = sound.permalink_url; document.querySelector(".soundcloud_info_container .green").href = sound.user.permalink_url; //document.querySelector(".soundcloud_info_container .red").href = sound.user.permalink_url; - }).catch(function(){}); + }).catch(function(e){}); if(_autoplay) { player.play().then(function(){ Player.soundcloud_player.setVolume(embed ? 1 : Crypt.get_volume() / 100); Player.soundcloud_player.seek((seekTo) * 1000); - }).catch(function(e){ - }); + }).catch(function(e){}); } }).catch(function(error) { - Player.initializeSCWidget(_autoplay, id); + if(error.status == 404) { + Player.errorHandler({data: 5}); + } else { + Player.initializeSCWidget(_autoplay, id); + } }); //Player.initializeSCWidget(_autoplay, id); //Player.initializeSCWidget(_autoplay, id); @@ -401,6 +405,7 @@ var Player = { Player.soundcloud_player.unbind("finish", Player.soundcloudFinish); Player.soundcloud_player.unbind("pause", Player.soundcloudPause); Player.soundcloud_player.unbind("play", Player.soundcloudPlay); + Player.soundcloud_player.unbind("error", Player.soundcloudError); //Player.soundcloud_player.unbind("seek", Player.soundcloudSeek); }catch(e){} var this_autoplay = ""; @@ -418,10 +423,15 @@ var Player = { Player.soundcloud_player.bind("finish", Player.soundcloudFinish); Player.soundcloud_player.bind("pause", Player.soundcloudPause); Player.soundcloud_player.bind("play", Player.soundcloudPlay); + Player.soundcloud_player.bind("error", Player.soundcloudError); Player.soundcloud_player.load('https://api.soundcloud.com/tracks/' + id + this_autoplay, {single_active: false}); } }, + soundcloudError: function() { + Player.errorHandler({data: "5"}); + }, + addSCWidgetElements: function() { try { Player.soundcloud_player = SC_widget.Widget(document.querySelector("#scplayerElement")); @@ -429,6 +439,7 @@ var Player = { Player.soundcloud_player.bind("finish", Player.soundcloudFinish); Player.soundcloud_player.bind("pause", Player.soundcloudPause); Player.soundcloud_player.bind("play", Player.soundcloudPlay); + Player.soundcloud_player.bind("error", Player.soundcloudError); SC_player.get('/tracks', { ids: id @@ -438,7 +449,8 @@ var Player = { document.querySelector("#soundcloud_listen_link").href = sound.permalink_url; document.querySelector(".soundcloud_info_container .green").href = sound.user.permalink_url; //document.querySelector(".soundcloud_info_container .red").href = sound.user.permalink_url; - }).catch(function(){}); + }).catch(function(e){ + }); } catch(e) { setTimeout(function() { Player.addSCWidgetElements();