From 8970092017b085478901ba7d6f678d986fef503a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Sun, 24 Feb 2019 22:44:59 +0100 Subject: [PATCH 01/12] Started tags work --- server/public/assets/js/listeners.js | 6 ++-- server/public/assets/js/search.js | 42 ++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 9cea3bbc..1731c96d 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -1461,6 +1461,7 @@ function addDynamicListeners() { if(substr != " Date: Sun, 24 Feb 2019 23:39:36 +0100 Subject: [PATCH 02/12] Tags add for add songs and in api --- server/handlers/aggregates.js | 4 +++- server/handlers/list_change.js | 10 +++++++--- server/public/assets/js/list.js | 3 +++ server/public/assets/js/listeners.js | 9 +++++---- server/public/assets/js/search.js | 6 ++++-- server/public/assets/js/suggestions.js | 5 +++-- 6 files changed, 25 insertions(+), 12 deletions(-) diff --git a/server/handlers/aggregates.js b/server/handlers/aggregates.js index 40e2e472..2c16bdd3 100644 --- a/server/handlers/aggregates.js +++ b/server/handlers/aggregates.js @@ -35,7 +35,8 @@ var project_object = { $ifNull: [ "$thumbnail", { $concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] } ] - } + }, + "tags": { $ifNull: [ "$tags", [] ] }, }; var toShowChannel = { @@ -48,6 +49,7 @@ var toShowChannel = { duration: 1, type: 1, _id: 0, + tags: 1, now_playing: 1, type: 1, source: 1, diff --git a/server/handlers/list_change.js b/server/handlers/list_change.js index a99e12d7..2666ba7d 100644 --- a/server/handlers/list_change.js +++ b/server/handlers/list_change.js @@ -70,7 +70,8 @@ function addFromOtherList(arr, guid, offline, socket) { "end": 1, "type": 1, "source": 1, - "thumbnail": 1 + "thumbnail": 1, + "tags": 1 }; var to_set_np = true; if(np.length > 0) { @@ -241,6 +242,7 @@ function addPlaylist(arr, guid, offline, socket) { this_element.start = parseInt(this_element.start); this_element.end = parseInt(this_element.end); this_element.type = "video"; + if(this_element.tags == undefined) this_element.tags = []; this_element.duration = parseInt(this_element.duration); if(this_element.start > this_element.end) { this_element.start = 0; @@ -425,6 +427,7 @@ function add_function(arr, coll, guid, offline, socket) { var hash = arr.adminpass; var duration = parseInt(arr.duration); var source = arr.source; + var tags = arr.tags; conf = docs; if(docs !== null && docs.length !== 0 && ((docs[0].addsongs === true && (hash == docs[0].adminpass || docs[0].adminpass === "")) || docs[0].addsongs === false)) { @@ -439,7 +442,7 @@ function add_function(arr, coll, guid, offline, socket) { } else { np = false; } - var new_song = {"added": added,"guids":guids,"id":id,"now_playing":np,"title":title,"votes":votes, "duration":duration, "start": parseInt(start), "end": parseInt(end), "type": "video", "source": source}; + var new_song = {"added": added,"guids":guids,"id":id,"now_playing":np,"title":title,"tags":tags,"votes":votes, "duration":duration, "start": parseInt(start), "end": parseInt(end), "type": "video", "source": source}; if(source == "soundcloud") { if(arr.thumbnail.indexOf("https://i1.sndcdn.com") > -1 || arr.thumbnail.indexOf("https://w1.sndcdn.com") > -1) { new_song.thumbnail = arr.thumbnail; @@ -482,7 +485,8 @@ function add_function(arr, coll, guid, offline, socket) { "duration":duration, "start": start, "end": end, - "type":"suggested" + "type":"suggested", + "tags":tags }; var source = arr.source; if(source == "soundcloud") { diff --git a/server/public/assets/js/list.js b/server/public/assets/js/list.js index de7cd5a3..9448397c 100755 --- a/server/public/assets/js/list.js +++ b/server/public/assets/js/list.js @@ -1247,6 +1247,8 @@ var List = { var video_id = _song_info.id; var video_title = _song_info.title; var video_votes = _song_info.votes; + var tags = ""; + if(_song_info.tags != undefined) _song_info.tags.toLowerCase(); var video_thumb_url = "//img.youtube.com/vi/"+video_id+"/mqdefault.jpg"; if(_song_info.source == "soundcloud") { video_thumb_url = _song_info.thumbnail; @@ -1316,6 +1318,7 @@ var List = { song.querySelector(attr).setAttribute("data-video-title", video_title); song.querySelector(attr).setAttribute("data-video-length", _song_info.length); song.querySelector(attr).setAttribute("data-added-by", added_by); + song.querySelector(attr).setAttribute("data-tags", tags); song.querySelector(attr).setAttribute("data-video-type", "suggested"); if(_song_info.source == "soundcloud") { song.querySelector(attr).setAttribute("data-type-thumbnail", _song_info.thumbnail); diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index df0ebe56..3ae6c727 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -1461,7 +1461,7 @@ function addDynamicListeners() { if(substr != " original_length) { @@ -1654,13 +1654,14 @@ function addDynamicListeners() { var title = e.getAttribute("data-video-title"); var length = e.getAttribute("data-video-length"); var added_by = e.getAttribute("data-added-by"); + var tags = e.getAttribute("data-tags"); var source = "youtube"; var thumbnail; if(e.getAttribute("data-video-source") != undefined) { source = "soundcloud"; thumbnail = e.getAttribute("data-type-thumbnail"); } - Search.submit(id, title, parseInt(length), false, 0, 1, 0, parseInt(length), source, thumbnail); + Search.submit(id, title, parseInt(length), false, 0, 1, 0, parseInt(length), source, thumbnail, tags); if(added_by == "user") { number_suggested = number_suggested - 1; if(number_suggested < 0) number_suggested = 0; diff --git a/server/public/assets/js/search.js b/server/public/assets/js/search.js index e5f02930..ce85b5f3 100755 --- a/server/public/assets/js/search.js +++ b/server/public/assets/js/search.js @@ -108,7 +108,8 @@ var Search = { var id=song.id; duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s"); var thumb=song.snippet.thumbnails.medium.url; - + var tags = ""; + if(song.snippet.tags != undefined) tags = song.snippet.tags.join(","); //$("#results").append(result_html); var songs = pre_result.cloneNode(true); songs.querySelector(".search-title").innerText = title; @@ -120,7 +121,7 @@ var Search = { songs.querySelector("#add-many").setAttribute("data-video-length", secs); //$($(songs).querySelector("div")[0]).setAttribute("onclick", "submitAndClose('"+id+"','"+enc_title+"',"+secs+");"); songs.querySelector("#temp-results").setAttribute("data-video-id", id); - songs.querySelector("#temp-results").setAttribute("data-video-tags", song.snippet.tags.join(",")); + songs.querySelector("#temp-results").setAttribute("data-tags", tags.toLowerCase()); songs.querySelector("#temp-results").setAttribute("data-video-title", enc_title); songs.querySelector("#temp-results").setAttribute("data-video-length", secs); songs.querySelector(".open-externally").setAttribute("href", "https://www.youtube.com/watch?v=" + id); @@ -247,6 +248,7 @@ var Search = { songs.querySelector("#add-many").setAttribute("data-video-title", enc_title); songs.querySelector("#add-many").setAttribute("data-video-length", secs); //$($(songs).querySelector("div")[0]).setAttribute("onclick", "submitAndClose('"+id+"','"+enc_title+"',"+secs+");"); + songs.querySelector("#temp-results").setAttribute("data-tags", song.genre.toLowerCase()); songs.querySelector("#temp-results").setAttribute("data-video-id", id); songs.querySelector("#temp-results").setAttribute("data-video-title", enc_title); songs.querySelector("#temp-results").setAttribute("data-video-length", secs); diff --git a/server/public/assets/js/suggestions.js b/server/public/assets/js/suggestions.js index d24d6de7..b51be3f6 100755 --- a/server/public/assets/js/suggestions.js +++ b/server/public/assets/js/suggestions.js @@ -63,7 +63,7 @@ var Suggestions = { Helper.removeClass("#suggest-song-html", "hide"); } var get_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&relatedToVideoId="+id+"&type=video&key="+api_key.youtube; - var video_urls = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,statistics&key="+api_key.youtube+"&id="; + var video_urls = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,statistics&fields=pageInfo,items(id,contentDetails,snippet(categoryId,channelTitle,publishedAt,title,description,tags,thumbnails))&key="+api_key.youtube+"&id="; Helper.ajax({ type: "GET", @@ -93,6 +93,7 @@ var Suggestions = { duration = Helper.secondsToOther(Search.durationToSeconds(duration)); var video_id = song.id; var video_title = song.snippet.title; + var tags = song.snippet.tags; var viewCount = 0; try { viewCount = song.statistics.viewCount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); @@ -101,7 +102,7 @@ var Suggestions = { } try { - document.getElementById("suggest-song-html").insertAdjacentHTML("beforeend", List.generateSong({id: video_id, title: video_title, length: length, duration: duration, votes: viewCount, extra: "Views", source: "youtube"}, false, false, false)); + document.getElementById("suggest-song-html").insertAdjacentHTML("beforeend", List.generateSong({id: video_id, title: video_title, length: length, duration: duration, votes: viewCount, extra: "Views", source: "youtube", tags:tags}, false, false, false)); } catch(e) {} } } From 6c0c110b68ab52d2d6d9051dd51f23d377797b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Sun, 24 Feb 2019 23:59:00 +0100 Subject: [PATCH 03/12] Added search-endpoint for fetching by category --- server/apps/client.js | 2 +- server/public/assets/js/list.js | 2 +- server/routing/client/api.js | 88 ++++++++++++++++++++++++++++++++- 3 files changed, 89 insertions(+), 3 deletions(-) diff --git a/server/apps/client.js b/server/apps/client.js index 8861f99f..4e448e43 100755 --- a/server/apps/client.js +++ b/server/apps/client.js @@ -72,7 +72,7 @@ app.use(bodyParser.urlencoded({ // to support URL-encoded bodies extended: true })); app.use(cookieParser()); -app.set('json spaces', 2); +//app.set('json spaces', 2); io = require('socket.io')({ pingTimeout: 25000, diff --git a/server/public/assets/js/list.js b/server/public/assets/js/list.js index 9448397c..9ed21f8f 100755 --- a/server/public/assets/js/list.js +++ b/server/public/assets/js/list.js @@ -1248,7 +1248,7 @@ var List = { var video_title = _song_info.title; var video_votes = _song_info.votes; var tags = ""; - if(_song_info.tags != undefined) _song_info.tags.toLowerCase(); + if(_song_info.tags != undefined) _song_info.tags.join(",").toLowerCase(); var video_thumb_url = "//img.youtube.com/vi/"+video_id+"/mqdefault.jpg"; if(_song_info.source == "soundcloud") { video_thumb_url = _song_info.thumbnail; diff --git a/server/routing/client/api.js b/server/routing/client/api.js index edf27440..95f8c8a1 100644 --- a/server/routing/client/api.js +++ b/server/routing/client/api.js @@ -732,6 +732,90 @@ router.route('/api/list/:channel_name/__np__').post(function(req, res) { }); }); + +router.route('/api/search/:channel_name/').post(function(req, res) { + res.header("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + res.header({"Content-Type": "application/json"}); + try { + var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; + var guid = Functions.hash_pass(req.get('User-Agent') + ip + req.headers["accept-language"]); + var channel_name = cleanChannelName(req.params.channel_name); + var userpass; + if(req.body.hasOwnProperty("userpass")) { + req.body.userpass = req.body.userpass == "" ? "" : crypto.createHash('sha256').update(req.body.userpass, 'utf8').digest("base64"); + userpass = req.body.userpass; + } else { + userpass = ""; + } + var searchQuery = ""; + if(req.body.searchQuery == undefined || req.body.searchQuery == "") { + var to_send = error.formatting; + to_send.results = [result]; + res.status(400).send(to_send); + return; + } + searchQuery = req.body.searchQuery; + var token = ""; + if(req.body.hasOwnProperty("token")) { + token = req.body.token; + } + } catch(e) { + var result = { + userpass: { + expected: "string", + got: req.body.hasOwnProperty("userpass") ? typeof(req.body.userpass) : undefined + } + }; + var to_send = error.formatting; + to_send.results = [result]; + res.status(400).send(to_send); + return; + } + var cookie = req.cookies._uI; + Functions.getSessionAdminUser(cookie, channel_name, function(_u, _a) { + if(req.body.userpass == "") { + //userpass = Functions.hash_pass(Functions.hash_pass(Functions.decrypt_string(_u))) + userpass = _u; + } + token_db.collection("api_token").find({token: token}, function(err, token_docs) { + var authorized = false; + var origin; + try { + origin = req.headers.referer.split("/")[2]; + } catch(e) { origin = ""; } + if(token_docs.length == 1 && token_docs[0].token == token && (token_docs[0].origin == "*" || origin.indexOf(token_docs[0].origin) > -1)) { + authorized = true; + } + checkOveruseApiToken(authorized, token_docs, res, function() { + checkTimeout(guid, res, authorized, "POST", function() { + db.collection(channel_name + "_settings").find({ id: "config" }, function(err, conf) { + if(authorized) { + incrementToken(token); + } + if(conf.length == 0) { + res.status(404).send(error.not_found.list); + return; + } else if(conf[0].userpass != userpass && conf[0].userpass != "" && conf[0].userpass != undefined) { + res.status(403).send(error.not_authenticated); + return; + } + db.collection(channel_name).find({tags: {$regex : ".*" + searchQuery + ".*"}}, function(e, results) { + if(results.length == 0) { + res.status(404).send(error.not_found.list); + return; + } + var to_return = error.no_error; + to_return.results = results; + res.status(200).send(to_return); + }); + }); + }); + }); + }); + }); +}); + router.route('/api/list/:channel_name/:video_id').post(function(req,res) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); @@ -770,6 +854,8 @@ router.route('/api/list/:channel_name/:video_id').post(function(req,res) { var duration = parseInt(req.body.duration); var start_time = parseInt(req.body.start_time); var end_time = parseInt(req.body.end_time); + var tags = []; + if(req.body.tags != undefined) tags = req.body.tags.split(","); var source = req.body.source; if(source == "soundcloud" && !req.body.hasOwnProperty("thumbnail")) { throw "Wrong format"; @@ -852,7 +938,7 @@ router.route('/api/list/:channel_name/:video_id').post(function(req,res) { if(now_playing.length == 0 && authenticated) { set_np = true; } - var new_song = {"added": Functions.get_time(),"guids":[guid],"id":video_id,"now_playing":set_np,"title":title,"votes":1, "duration":duration, "start": parseInt(start_time), "end": parseInt(end_time), "type": song_type, "source": source}; + var new_song = {"tags": tags, "added": Functions.get_time(),"guids":[guid],"id":video_id,"now_playing":set_np,"title":title,"votes":1, "duration":duration, "start": parseInt(start_time), "end": parseInt(end_time), "type": song_type, "source": source}; var runFunction = Search.get_correct_info; if(source == "soundcloud") { if(req.body.thumbnail.indexOf("https://i1.sndcdn.com") > -1 || req.body.thumbnail.indexOf("https://w1.sndcdn.com") > -1) { From 1a6632002987beaf70abddff1e1300e7b69ab466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Mon, 25 Feb 2019 00:01:04 +0100 Subject: [PATCH 04/12] More correct error message on no video find with those tags --- server/routing/client/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/routing/client/api.js b/server/routing/client/api.js index 95f8c8a1..a4fcad53 100644 --- a/server/routing/client/api.js +++ b/server/routing/client/api.js @@ -802,7 +802,7 @@ router.route('/api/search/:channel_name/').post(function(req, res) { } db.collection(channel_name).find({tags: {$regex : ".*" + searchQuery + ".*"}}, function(e, results) { if(results.length == 0) { - res.status(404).send(error.not_found.list); + res.status(404).send(error.not_found.local); return; } var to_return = error.no_error; From c3bfac72c6b006e8208a30a5c51048b396c99fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Tue, 26 Feb 2019 21:42:30 +0100 Subject: [PATCH 05/12] Modal and filter somewhat working --- server/handlers/list_change.js | 2 + server/handlers/search.js | 43 +++++++++++++++++-- server/public/assets/css/style.css | 6 ++- server/public/assets/js/channel.js | 5 +++ server/public/assets/js/functions.js | 31 +++++++++++++ server/public/assets/js/list.js | 26 ++++++++--- server/public/assets/js/listeners.js | 26 ++++++++--- server/public/assets/js/search.js | 19 +++----- server/public/assets/js/suggestions.js | 5 +-- .../public/partials/channel/modal.handlebars | 17 ++++++++ .../public/partials/channel/tabs.handlebars | 1 + server/routing/client/api.js | 2 +- 12 files changed, 148 insertions(+), 35 deletions(-) diff --git a/server/handlers/list_change.js b/server/handlers/list_change.js index 2666ba7d..bcc6ec0a 100644 --- a/server/handlers/list_change.js +++ b/server/handlers/list_change.js @@ -459,9 +459,11 @@ function add_function(arr, coll, guid, offline, socket) { var thumbnail = arr.thumbnail != undefined ? arr.thumbnail : undefined; Frontpage.update_frontpage(coll, id, title, thumbnail, arr.source); if(source != "soundcloud") Search.get_correct_info(new_song, coll, false); + else if(source == "soundcloud") Search.get_genres(new_song, coll); } else { io.to(coll).emit("channel", {type: "added", value: new_song}); if(source != "soundcloud") Search.get_correct_info(new_song, coll, true); + else if(source == "soundcloud") Search.get_genres(new_song, coll); } db.collection("frontpage_lists").update({_id:coll}, {$inc:{count:1}, $set:{accessed: Functions.get_time()}}, {upsert:true}, function(err, docs){}); List.getNextSong(coll, undefined); diff --git a/server/handlers/search.js b/server/handlers/search.js index c9651fea..1ad43ec4 100644 --- a/server/handlers/search.js +++ b/server/handlers/search.js @@ -3,6 +3,7 @@ var time_regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*) try { var keys = require(path.join(__dirname, '../config/api_key.js')); var key = keys.youtube; + var soundcloudKey = keys.soundcloud; } catch(e) { console.log("Error - missing file"); console.log("Seems you forgot to create the file api_key.js in /server/config/. Have a look at api_key.example.js."); @@ -11,11 +12,30 @@ try { var request = require('request'); var db = require(pathThumbnails + '/handlers/db.js'); +function get_genres(song, channel) { + console.log(song); + request("http://api.soundcloud.com/tracks/" + song.id + "?client_id=" + soundcloudKey, function(err, response, body) { + var object = JSON.parse(body); + var genres = object.genre + "," + object.tag_list.replace(/"/g, ""); + genres = genres.toLowerCase().split(","); + genres = genres.filter(function (el) { + return el != null; + }); + db.collection(channel).update({"id": song.id}, { + $set: { + "tags": genres + } + }, function(e,d) { + + }); + }); +} + function get_correct_info(song_generated, channel, broadcast, callback) { //channel = channel.replace(/ /g,''); request({ type: "GET", - url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key="+key+"&id=" + song_generated.id, + url: "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,topicDetails&key="+key+"&id=" + song_generated.id, }, function(error, response, body) { try { @@ -23,6 +43,13 @@ function get_correct_info(song_generated, channel, broadcast, callback) { if(resp.items.length == 1) { var duration = parseInt(durationToSeconds(resp.items[0].contentDetails.duration)); var title = resp.items[0].snippet.localized.title; + var genre = resp.items[0].topicDetails.topicCategories; + genre = genre.join(","); + genre = genre.replace(new RegExp("https://en.wikipedia.org/wiki/", "g"), ""); + genre = genre.replace(/_/g, " ").toLowerCase().split(","); + genre = genre.filter(function (el) { + return el != null; + }); if(title != song_generated.title || duration < parseInt(song_generated.duration)) { if(title != song_generated.title) { song_generated.title = title; @@ -38,6 +65,7 @@ function get_correct_info(song_generated, channel, broadcast, callback) { "start": song_generated.start, "end": song_generated.end, "title": song_generated.title, + "tags": genre } }, function(err, docs) { if(broadcast && docs.nModified == 1) { @@ -55,9 +83,15 @@ function get_correct_info(song_generated, channel, broadcast, callback) { } }); } else { - if(typeof(callback) == "function") { - callback(song_generated, true); - } + db.collection(channel).update({"id": song_generated.id}, { + $set: { + "tags": genre + } + }, function(e,d) { + if(typeof(callback) == "function") { + callback(song_generated, true); + } + }); } } else { findSimilar(song_generated, channel, broadcast, callback) @@ -213,5 +247,6 @@ function durationToSeconds(duration) { return hours*60*60+minutes*60+seconds; } +module.exports.get_genres = get_genres; module.exports.check_error_video = check_error_video; module.exports.get_correct_info = get_correct_info; diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 499519a1..85508bbe 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -1180,7 +1180,7 @@ margin:-1px; padding-left: 8px; } -#close_find_form_button { +#close_find_form_button, #open_advanced_filter { display: flex; align-self: center; padding-left: 10px; @@ -2109,6 +2109,10 @@ nav ul li:hover, nav ul li.active { height:66px; margin: 2.5px 0 2.5px -1px !important; } +.filtered-search-element { + background-color: #2d2d2d; + display: flex; +} .card:hover{ box-shadow: 0 5px 5px 0 rgba(0,0,0,0.16), 0 5px 10px 0 rgba(0,0,0,0.12); } diff --git a/server/public/assets/js/channel.js b/server/public/assets/js/channel.js index 0cdd6502..3b1b5604 100644 --- a/server/public/assets/js/channel.js +++ b/server/public/assets/js/channel.js @@ -143,6 +143,11 @@ var Channel = { Helper.removeElement(".embed-button-footer"); Helper.removeElement(".tabs"); } + M.Modal.init(document.getElementById("advanced_filter"), { + onCloseEnd: function() { + document.querySelector(".filter-results").innerHTML = ""; + } + }); M.Modal.init(document.getElementById("help")); M.Modal.init(document.getElementById("contact")); M.Modal.init(document.getElementById("channel-share-modal")); diff --git a/server/public/assets/js/functions.js b/server/public/assets/js/functions.js index 5db9d648..8cae821a 100644 --- a/server/public/assets/js/functions.js +++ b/server/public/assets/js/functions.js @@ -21,6 +21,37 @@ function removeAllListeners() { socket.removeEventListener(id); } +function filterPlaylistElements() { + Helper.ajax({ + type: "POST", + headers: { + "Content-Type": "application/json" + }, + url: "/api/search/" + chan.toLowerCase(), + data: { + searchQuery: document.getElementById("filtersearch_input").value, + token: zoff_api_token + }, + success: function(data){ + var json = JSON.parse(data); + document.querySelector(".filter-results").innerHTML = ""; + if(json.results.length > 0) { + for(var i = 0; i < json.results.length; i++) { + document.querySelector(".filter-results").innerHTML += List.generateSong(json.results[i], false, false, true, false, "block", false, true);; + } + } else { + toast("Couldn't find any items with those tags..", "red"); + document.querySelector(".filter-results").innerHTML = "Couldn't find any items with those tags.."; + } + }, + error: function() { + toast("Couldn't find any items with those tags..", "red"); + + document.querySelector(".filter-results").innerHTML = "Couldn't find any items with those tags.."; + } + }); +} + function say_updated() { setTimeout(function() { before_toast(); diff --git a/server/public/assets/js/list.js b/server/public/assets/js/list.js index 9ed21f8f..cf2b8392 100755 --- a/server/public/assets/js/list.js +++ b/server/public/assets/js/list.js @@ -1242,13 +1242,11 @@ var List = { } }, - generateSong: function(_song_info, transition, lazy, list, user, display, initial) { + generateSong: function(_song_info, transition, lazy, list, user, display, initial, filtered) { if(list_html === undefined) list_html = Helper.html("#list-song-html"); var video_id = _song_info.id; var video_title = _song_info.title; var video_votes = _song_info.votes; - var tags = ""; - if(_song_info.tags != undefined) _song_info.tags.join(",").toLowerCase(); var video_thumb_url = "//img.youtube.com/vi/"+video_id+"/mqdefault.jpg"; if(_song_info.source == "soundcloud") { video_thumb_url = _song_info.thumbnail; @@ -1277,8 +1275,8 @@ var List = { } song.querySelector(".list-image").setAttribute(image_attr,video_thumb); - if(list){ - song.querySelector("#list-song") + if(list && !filtered){ + //song.querySelector("#list-song") song.querySelector(".list-votes").innerText = video_votes; song.querySelector("#list-song").setAttribute("data-video-id", video_id); song.querySelector("#list-song").setAttribute("data-video-type", "song"); @@ -1294,7 +1292,7 @@ var List = { var _temp_duration = Helper.secondsToOther(_song_info.duration); song.querySelector(".card-duration").innerText = Helper.pad(_temp_duration[0]) + ":" + Helper.pad(_temp_duration[1]); - }else if(!list){ + }else if(!list && !filtered){ //song.querySelector(".card-duration").remove(); //song.querySelector(".list-song").removeClass("playlist-element"); @@ -1318,7 +1316,6 @@ var List = { song.querySelector(attr).setAttribute("data-video-title", video_title); song.querySelector(attr).setAttribute("data-video-length", _song_info.length); song.querySelector(attr).setAttribute("data-added-by", added_by); - song.querySelector(attr).setAttribute("data-tags", tags); song.querySelector(attr).setAttribute("data-video-type", "suggested"); if(_song_info.source == "soundcloud") { song.querySelector(attr).setAttribute("data-type-thumbnail", _song_info.thumbnail); @@ -1332,6 +1329,21 @@ var List = { list_image.classList.remove("list-image"); list_image.className += " list-suggested-image"; //song.querySelector(".list-image").setAttribute("class", song.querySelector(".list-image").getAttribute("class").replace("list-image", "list-suggested-image")); + } else if(filtered) { + song.querySelector("#list-song").className += " filtered-search-element"; + song.querySelector(".list-votes").innerText = video_votes; + song.querySelector("#list-song").setAttribute("data-video-id", video_id); + song.querySelector("#list-song").setAttribute("data-video-type", "song"); + song.querySelector("#list-song").setAttribute("data-video-source", _song_info.source); + song.querySelector("#list-song").setAttribute("id", "filtered-" + video_id); + song.classList.remove("hide"); + song.className += " filtered-search-element"; + song.querySelector(".vote-container").setAttribute("title", video_title); + attr = ".vote-container"; + del_attr = "delete_button"; + + var _temp_duration = Helper.secondsToOther(_song_info.duration); + song.querySelector(".card-duration").innerText = Helper.pad(_temp_duration[0]) + ":" + Helper.pad(_temp_duration[1]); } if(!embed) { song.querySelector(".mobile-delete").remove(); diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 3ae6c727..011213d6 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -682,13 +682,28 @@ function addDynamicListeners() { this.preventDefault(); Helper.toggleClass("#find_div", "hide"); document.getElementById("find_input").value = ""; - document.getElementById("find_input").blur(); + document.getElementById("find_input").focus(); Helper.removeClass(".highlight", "highlight"); found_array = []; found_array_index = 0; find_word = ""; }); + addListener("click", "#open_advanced_filter", function(e) { + this.preventDefault(); + M.Modal.getInstance(document.getElementById("advanced_filter")).open(); + }); + + addListener("submit", "#filter-form", function(e) { + this.preventDefault(); + filterPlaylistElements(); + }); + + addListener("click", ".submit-filter-search", function(e) { + this.preventDefault(); + filterPlaylistElements(); + }); + addListener("click", ".delete-context-menu", function(e) { var that = e; if(that.classList.contains("context-menu-disabled")) { @@ -1461,7 +1476,6 @@ function addDynamicListeners() { if(substr != " original_length) { @@ -1626,7 +1639,7 @@ function addDynamicListeners() { var length = parseInt(end) - parseInt(start); e.parentElement.parentElement.parentElement.remove(); - Search.submit(id, title, length, false, 0, 1, start, end, source, thumbnail, tags); + Search.submit(id, title, length, false, 0, 1, start, end, source, thumbnail); } catch(event) { M.toast({html: "Only numbers are accepted as song start and end parameters..", displayLength: 3000, classes: "red lighten"}); } @@ -1654,14 +1667,13 @@ function addDynamicListeners() { var title = e.getAttribute("data-video-title"); var length = e.getAttribute("data-video-length"); var added_by = e.getAttribute("data-added-by"); - var tags = e.getAttribute("data-tags"); var source = "youtube"; var thumbnail; if(e.getAttribute("data-video-source") != undefined) { source = "soundcloud"; thumbnail = e.getAttribute("data-type-thumbnail"); } - Search.submit(id, title, parseInt(length), false, 0, 1, 0, parseInt(length), source, thumbnail, tags); + Search.submit(id, title, parseInt(length), false, 0, 1, 0, parseInt(length), source, thumbnail); if(added_by == "user") { number_suggested = number_suggested - 1; if(number_suggested < 0) number_suggested = 0; diff --git a/server/public/assets/js/search.js b/server/public/assets/js/search.js index ce85b5f3..5b4361cb 100755 --- a/server/public/assets/js/search.js +++ b/server/public/assets/js/search.js @@ -48,12 +48,12 @@ var Search = { yt_url+="&q="+keyword; if(music)yt_url+="&videoCategoryId=10"; if(pagination) yt_url += "&pageToken=" + pagination; - var vid_url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&fields=pageInfo,items(id,contentDetails,snippet(categoryId,channelTitle,publishedAt,title,description,tags,thumbnails))&key="+api_key.youtube+"&id="; + var vid_url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&fields=pageInfo,items(id,contentDetails,snippet(categoryId,channelTitle,publishedAt,title,description,thumbnails))&key="+api_key.youtube+"&id="; if(related) { var yt_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=25&relatedToVideoId="+keyword+"&type=video&key="+api_key.youtube; var vid_url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key="+api_key.youtube+"&id="; } - //https://www.googleapis.com/youtube/v3/videos?key={API-key}&fields=items(snippet(title,description,tags))&part=snippet&id={video_id} + //https://www.googleapis.com/youtube/v3/videos?key={API-key}&fields=items(snippet(title,description))&part=snippet&id={video_id} Helper.addClass(document.querySelector("#search-btn .material-icons"), "hide"); Helper.removeClass("#search_loader", "hide"); @@ -108,8 +108,6 @@ var Search = { var id=song.id; duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s"); var thumb=song.snippet.thumbnails.medium.url; - var tags = ""; - if(song.snippet.tags != undefined) tags = song.snippet.tags.join(","); //$("#results").append(result_html); var songs = pre_result.cloneNode(true); songs.querySelector(".search-title").innerText = title; @@ -121,7 +119,6 @@ var Search = { songs.querySelector("#add-many").setAttribute("data-video-length", secs); //$($(songs).querySelector("div")[0]).setAttribute("onclick", "submitAndClose('"+id+"','"+enc_title+"',"+secs+");"); songs.querySelector("#temp-results").setAttribute("data-video-id", id); - songs.querySelector("#temp-results").setAttribute("data-tags", tags.toLowerCase()); songs.querySelector("#temp-results").setAttribute("data-video-title", enc_title); songs.querySelector("#temp-results").setAttribute("data-video-length", secs); songs.querySelector(".open-externally").setAttribute("href", "https://www.youtube.com/watch?v=" + id); @@ -248,7 +245,6 @@ var Search = { songs.querySelector("#add-many").setAttribute("data-video-title", enc_title); songs.querySelector("#add-many").setAttribute("data-video-length", secs); //$($(songs).querySelector("div")[0]).setAttribute("onclick", "submitAndClose('"+id+"','"+enc_title+"',"+secs+");"); - songs.querySelector("#temp-results").setAttribute("data-tags", song.genre.toLowerCase()); songs.querySelector("#temp-results").setAttribute("data-video-id", id); songs.querySelector("#temp-results").setAttribute("data-video-title", enc_title); songs.querySelector("#temp-results").setAttribute("data-video-length", secs); @@ -445,8 +441,8 @@ var Search = { } }, -submitAndClose: function(id,title,duration, start, end, source, thumbnail, tags){ - Search.submit(id,title, duration, false, 0, 1, start, end, source, thumbnail, tags); +submitAndClose: function(id,title,duration, start, end, source, thumbnail){ + Search.submit(id,title, duration, false, 0, 1, start, end, source, thumbnail); Helper.setHtml("#results", ''); Search.showSearch(); document.getElementById("search").value = ""; @@ -649,9 +645,9 @@ addVideos: function(ids){ }); }, -submit: function(id,title,duration, playlist, num, full_num, start, end, source, thumbnail, tags){ +submit: function(id,title,duration, playlist, num, full_num, start, end, source, thumbnail){ if((client || Helper.mobilecheck()) && !socket_connected) { - add_ajax(id, title, duration, playlist, num, full_num, start, end, source, thumbnail, tags); + add_ajax(id, title, duration, playlist, num, full_num, start, end, source, thumbnail); return; } if(offline && document.getElementsByName("addsongs")[0].checked && document.getElementsByName("addsongs")[0].disabled){ @@ -688,8 +684,7 @@ submit: function(id,title,duration, playlist, num, full_num, start, end, source, list: chan.toLowerCase(), duration: duration, source: source, - thumbnail: thumbnail, - tags: tags + thumbnail: thumbnail }); }//[id, decodeURIComponent(title), adminpass, duration, playlist]); }, diff --git a/server/public/assets/js/suggestions.js b/server/public/assets/js/suggestions.js index b51be3f6..f76f58d4 100755 --- a/server/public/assets/js/suggestions.js +++ b/server/public/assets/js/suggestions.js @@ -63,7 +63,7 @@ var Suggestions = { Helper.removeClass("#suggest-song-html", "hide"); } var get_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&relatedToVideoId="+id+"&type=video&key="+api_key.youtube; - var video_urls = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,statistics&fields=pageInfo,items(id,contentDetails,snippet(categoryId,channelTitle,publishedAt,title,description,tags,thumbnails))&key="+api_key.youtube+"&id="; + var video_urls = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id,statistics&fields=pageInfo,items(id,contentDetails,snippet(categoryId,channelTitle,publishedAt,title,description,thumbnails))&key="+api_key.youtube+"&id="; Helper.ajax({ type: "GET", @@ -93,7 +93,6 @@ var Suggestions = { duration = Helper.secondsToOther(Search.durationToSeconds(duration)); var video_id = song.id; var video_title = song.snippet.title; - var tags = song.snippet.tags; var viewCount = 0; try { viewCount = song.statistics.viewCount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); @@ -102,7 +101,7 @@ var Suggestions = { } try { - document.getElementById("suggest-song-html").insertAdjacentHTML("beforeend", List.generateSong({id: video_id, title: video_title, length: length, duration: duration, votes: viewCount, extra: "Views", source: "youtube", tags:tags}, false, false, false)); + document.getElementById("suggest-song-html").insertAdjacentHTML("beforeend", List.generateSong({id: video_id, title: video_title, length: length, duration: duration, votes: viewCount, extra: "Views", source: "youtube"}, false, false, false)); } catch(e) {} } } diff --git a/server/public/partials/channel/modal.handlebars b/server/public/partials/channel/modal.handlebars index da115d46..9d0d1c7a 100644 --- a/server/public/partials/channel/modal.handlebars +++ b/server/public/partials/channel/modal.handlebars @@ -39,6 +39,23 @@ {{/unless}} +