var List = { empty: false, page: 0, can_fit: document.querySelectorAll("#wrapper").length > 0 ? Math.round(Helper.computedStyle("#wrapper", "height") / 71) : 0, element_height: document.querySelectorAll("#wrapper").length > 0 ? Helper.computedStyle("#wrapper", "height") / Math.round(Helper.computedStyle("#wrapper", "height") / 71) - 25 : 0, uris: [], not_found: [], num_songs: 0, found: [], channel_function: function(msg) { if (Helper.mobilecheck()) socket_connected = true; if (user_auth_started) { user_auth_started = false; M.Modal.getInstance(document.getElementById("user_password")).close(); } switch (msg.type) { case "list": //if(full_playlist == undefined || !offline){ if ( (!offline || (offline && !msg.shuffled)) && !(offline && prev_chan_list == chan) ) { prev_chan_list = chan; List.populate_list(msg.playlist); if (full_playlist.length > 0) { Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } } else if ( offline && prev_chan_list == chan && full_playlist != undefined && !msg.shuffled ) { List.populate_list(full_playlist, true); if (full_playlist.length > 0) { Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } } break; case "added": List.added_song(msg.value); if (full_playlist.length > 0) { Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } found_array = []; found_array_index = 0; break; case "deleted": List.deleted_song(msg.value, msg.removed); found_array = []; found_array_index = 0; break; case "vote": if (!offline) { List.voted_song(msg.value, msg.time); if (full_playlist.length > 0) { Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } } found_array = []; found_array_index = 0; break; case "song_change": if ((offline && msg.offline_change) || !offline) { if (window.location.pathname != "/") List.song_change(msg.time, msg.remove, msg.id); if (full_playlist.length > 0) { Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } found_array = []; found_array_index = 0; } break; case "changed_values": List.changedValues(msg.value); break; case "song_change_prev": if ((offline && msg.offline_change) || !offline) { if (window.location.pathname != "/") List.song_change_prev(msg.time); if (full_playlist.length > 0) { Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } found_array = []; found_array_index = 0; } break; } }, changedValues: function(song) { if (song.type == "suggested") { try { document .querySelector("#suggested-" + song.id) .querySelector(".vote-container") .setAttribute("title", song.title); document .querySelector("#suggested-" + song.id) .querySelector(".list-title") .setAttribute("title", song.title); document .querySelector("#suggested-" + song.id) .querySelector(".list-title").innerText = song.title; var _temp_duration = Helper.secondsToOther(song.duration); document .querySelector("#suggested-" + song.id) .querySelector(".card-duration").innerText = Helper.pad(_temp_duration[0]) + ":" + Helper.pad(_temp_duration[1]); document .querySelector("#suggested-" + song.id) .querySelector(".list-image") .setAttribute( "style", "background-image:url('//img.youtube.com/vi/" + song.new_id + "/mqdefault.jpg');" ); document .querySelector("#suggested-" + song.id) .setAttribute("id", song.new_id); } catch (e) {} return; } var i = List.getIndexOfSong(song.id); if (i >= 0 && window.location.pathname != "/") { full_playlist[i].title = song.title; full_playlist[i].duration = song.duration; full_playlist[i].start = song.start; full_playlist[i].end = song.end; full_playlist[i].id = song.new_id; try { document .querySelector("#" + song.id) .querySelector(".vote-container") .setAttribute("title", song.title); document .querySelector("#" + song.id) .querySelector(".list-title") .setAttribute("title", song.title); document .querySelector("#" + song.id) .querySelector(".list-title").innerText = song.title; var _temp_duration = Helper.secondsToOther(song.duration); document .querySelector("#" + song.id) .querySelector(".card-duration").innerText = Helper.pad(_temp_duration[0]) + ":" + Helper.pad(_temp_duration[1]); document .querySelector("#" + song.id) .querySelector(".list-image") .setAttribute( "style", "background-image:url('//img.youtube.com/vi/" + song.new_id + "/mqdefault.jpg');" ); document.querySelector("#" + song.id).setAttribute("id", song.new_id); } catch (e) {} } }, insertAtBeginning: function(song_info, transition) { if (document.querySelector("#wrapper") == null) return; var display = List.page == 0 ? "" : "none"; var add = List.generateSong( song_info, transition, false, true, false, display, false ); document.querySelector("#wrapper").insertAdjacentHTML("beforeend", add); }, insertAtIndex: function(song_info, transition, change) { if (document.querySelector("#wrapper") == null) return; var i = List.getIndexOfSong(song_info.id); if (i == -1) return; if (!song_info.now_playing) { var display = "none"; if (i >= List.page && i < List.page + List.can_fit) display = "inline-flex"; var add = List.generateSong( song_info, transition, false, true, false, display, false ); if (i === 0) { document .querySelector("#wrapper") .insertAdjacentHTML("afterbegin", add); } else { document .querySelector("#wrapper > div:nth-child(" + i + ")") .insertAdjacentHTML("afterend", add); } var added = document.querySelector("#wrapper").children[i]; Helper.css(added, "display", display); if ( display == "inline-flex" && document.querySelector("#wrapper").children.length >= List.page + List.can_fit + 1 ) { Helper.css( document.querySelector("#wrapper").children[List.page + List.can_fit], "display", "none" ); } else if ( i < List.page && document.querySelector("#wrapper").children.length - (List.page + 1) >= 0 ) { Helper.css( document.querySelector("#wrapper").children[List.page], "display", "inline-flex" ); } else if ( document.querySelector("#wrapper").children.length > List.page + List.can_fit ) { Helper.css( document.querySelector("#wrapper").children[ List.page + List.can_fit - 1 ], "display", "inline-flex" ); } if (change && List.page > 0) { Helper.css( document.querySelector("#wrapper").children[List.page - 1], "display", "none" ); } if (transition) { setTimeout(function() { Helper.css(added, "transform", "translateX(0%)"); setTimeout(function() { Helper.removeClass(added, "side_away"); }, 300); }, 5); } } }, calculate_song_heights: function() { if (!Helper.mobilecheck() && !embed && !client) { List.can_fit = Math.round( Helper.computedStyle("#wrapper", "height") / 71 ); List.element_height = Helper.computedStyle("#wrapper", "height") / List.can_fit - 5.3; } else if (embed) { List.can_fit = Math.round(Helper.computedStyle("#wrapper", "height") / 91) + 1; List.element_height = Helper.computedStyle("#wrapper", "height") / List.can_fit - 4; } else if (!client) { List.can_fit = Math.round( (Helper.computedStyle(".tabs", "height") - Helper.computedStyle("header", "height") - 64 - 40) / 71 ) + 1; List.element_height = (window.innerHeight - Helper.computedStyle(".tabs", "height") - Helper.computedStyle("header", "height") - 64 - 40) / List.can_fit - 5; } else { List.can_fit = Math.round(Helper.computedStyle("#wrapper", "height") / 71) + 1; List.element_height = Helper.computedStyle("#wrapper", "height") / List.can_fit - 5.3; } if (List.element_height < 55.2 && !client && !embed) { List.can_fit = List.can_fit - 1; List.element_height = 55.2; List.can_fit = Math.round( (window.innerHeight - Helper.computedStyle(".tabs", "height") - Helper.computedStyle("header", "height") - 64 - 40) / 71 ); List.element_height = (window.innerHeight - Helper.computedStyle(".tabs", "height") - Helper.computedStyle("header", "height") - 64 - 40) / List.can_fit - 5; } else if (List.element_height < 55.2 && embed) { //List.can_fit = List.can_fit - 1; List.can_fit = Math.round( (window.innerHeight - Helper.computedStyle(".tabs", "height") - Helper.computedStyle("header", "height") - 64 - 40) / 71 ); List.element_height = (window.innerHeight - Helper.computedStyle(".tabs", "height") - Helper.computedStyle("header", "height") - 64 - 40) / List.can_fit - 5; List.can_fit = List.can_fit - 2; } }, populate_list: function(msg, no_reset) { if (document.querySelector("#wrapper") == null) return; // This math is fucked and I don't know how it works. Should be fixed sometime if (list_html === undefined) list_html = Helper.html("#list-song-html"); full_playlist = msg; if (offline && !no_reset) { for (var x = 0; x < full_playlist.length; x++) { full_playlist[x].votes = 0; } } List.sortList(); Helper.setHtml("#wrapper", ""); Helper.log(["FULL PLAYLIST", full_playlist]); if (full_playlist.length > 1) { for (var j = 0; j < full_playlist.length; j++) { var _current_song = full_playlist[j]; if (!_current_song.hasOwnProperty("start")) full_playlist[j].start = 0; if (!_current_song.hasOwnProperty("end")) full_playlist[j].end = full_playlist[j].duration; if (!_current_song.now_playing && _current_song.type != "suggested") { //check that the song isnt playing var generated = List.generateSong( _current_song, false, lazy_load, true, false, "inline-flex", true ); document .querySelector("#wrapper") .insertAdjacentHTML("beforeend", generated); } } if ( document.querySelector("#wrapper").children.length > List.can_fit && !document.querySelectorAll("#pageButtons").length ) { Helper.css(".prev_page", "display", "none"); Helper.css(".first_page", "display", "none"); Helper.css(".next_page_hide", "display", "none"); Helper.css(".last_page_hide", "display", "none"); } else if (!document.querySelectorAll("#pageButtons").length) { Helper.css(".prev_page", "display", "none"); Helper.css(".next_page", "display", "none"); Helper.css(".last_page", "display", "none"); Helper.css(".first_page", "display", "none"); Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".prev_page_hide", "display", "inline-flex"); } else { Helper.css(".next_page", "display", "none"); Helper.css(".last_page", "display", "none"); } List.dynamicContentPage(-10); } else { List.empty = true; Helper.setHtml( "#wrapper", "The playlist is empty." ); Helper.css(".prev_page", "display", "none"); Helper.css(".next_page", "display", "none"); Helper.css(".last_page", "display", "none"); Helper.css(".last_page_hide", "display", "inline-flex"); Helper.css(".first_page", "display", "none"); Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".prev_page_hide", "display", "inline-flex"); } Helper.css("#settings", "visibility", "visible"); Helper.css("#settings", "opacity", "1"); Helper.css("#wrapper", "opacity", "1"); Helper.removeClass("#pageButtons", "hide"); if (!embed) { Helper.log(["Starting empty-checker"]); clearTimeout(timed_remove_check); timed_remove_check = setTimeout(function() { if (full_playlist.length > 0) { List.check_error_videos(0); } }, 1500); } }, check_error_videos: function(i) { //Helper.log("Empty-checker at " + i); if (full_playlist.length == 0) return; else if ( full_playlist[i].source == "soundcloud" && full_playlist.length > i + 1 && window.location.pathname != "/" ) List.check_error_videos(i + 1); else { Helper.ajax({ method: "get", url: "https://www.googleapis.com/youtube/v3/videos?id=" + full_playlist[i].id + "&key=" + api_key.youtube + "&part=snippet", success: function(data) { data = JSON.parse(data); //Helper.log("Empty-checker items " + data.items.length); if (data.items.length == 0) { Helper.log([ "Emtpy-checker error at " + full_playlist[i].id + " " + full_playlist[i].title ]); socket.emit("error_video", { channel: chan.toLowerCase(), id: full_playlist[i].id, title: full_playlist[i].title, source: full_playlist[i].source }); } if (full_playlist.length > i + 1 && window.location.pathname != "/") { List.check_error_videos(i + 1); } } }); } }, dynamicContentPageJumpTo: function(page) { if (document.querySelector("#wrapper") == null) return; page = page * List.can_fit; var wrapperChildren = [].slice.call( document.querySelector("#wrapper").children ); if (page > List.page || page < List.page) { Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "none" ); List.page = page; Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "inline-flex" ); if ( List.page > 0 && document.querySelector(".prev_page").style.display == "none" ) { Helper.css(".prev_page", "display", "inline-flex"); Helper.css(".prev_page_hide", "display", "none"); Helper.css(".first_page", "display", "inline-flex"); Helper.css(".first_page_hide", "display", "none"); } if (List.page + List.can_fit >= wrapperChildren.length) { Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".next_page", "display", "none"); Helper.css(".last_page_hide", "display", "inline-flex"); Helper.css(".last_page", "display", "none"); } Helper.setHtml("#pageNumber", List.page / List.can_fit + 1); } }, dynamicContentPage: function(way) { if (document.querySelector("#wrapper") == null) return; var wrapperChildren = [].slice.call( document.querySelector("#wrapper").children ); if (way == 1 || way == 10) { Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "none" ); if (way == 1) { List.page = List.page + List.can_fit; } else if (way == 10) { List.page = Math.floor( (document.querySelector("#wrapper").children.length - 1) / List.can_fit ) * List.can_fit; } Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "inline-flex" ); if ( List.page > 0 && document.querySelector(".prev_page").style.display == "none" ) { Helper.css(".prev_page", "display", "inline-flex"); Helper.css(".prev_page_hide", "display", "none"); Helper.css(".first_page", "display", "inline-flex"); Helper.css(".first_page_hide", "display", "none"); } if ( List.page + List.can_fit >= document.querySelector("#wrapper").children.length ) { Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".next_page", "display", "none"); Helper.css(".last_page_hide", "display", "inline-flex"); Helper.css(".last_page", "display", "none"); } } else { if (way == -10) { Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "none" ); List.page = 0; Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "inline-flex" ); } else { Helper.css( wrapperChildren.slice(List.page - List.can_fit, List.page), "display", "inline-flex" ); Helper.css( wrapperChildren.slice(List.page, List.page + List.can_fit), "display", "none" ); List.page = List.page - List.can_fit < 0 ? 0 : List.page - List.can_fit; } if ( List.page == 0 && document.querySelector(".prev_page").style.display != "none" ) { Helper.css(".prev_page", "display", "none"); Helper.css(".prev_page_hide", "display", "inline-flex"); Helper.css(".first_page", "display", "none"); Helper.css(".first_page_hide", "display", "inline-flex"); } else if (document.querySelector(".prev_page").style.display == "none") { Helper.css(".prev_page_hide", "display", "inline-flex"); Helper.css(".first_page_hide", "display", "inline-flex"); } else { Helper.css(".prev_page_hide", "display", "none"); Helper.css(".first_page_hide", "display", "none"); } if ( List.page + List.can_fit < document.querySelector("#wrapper").children.length ) { Helper.css(".next_page_hide", "display", "none"); Helper.css(".next_page", "display", "inline-flex"); Helper.css(".last_page_hide", "display", "none"); Helper.css(".last_page", "display", "inline-flex"); } } document.querySelector("#pageNumber").innerText = List.page / List.can_fit + 1; }, added_song: function(added) { var now_playing; if (added != undefined) { if (full_playlist.length !== 0) { now_playing = full_playlist.pop(); } full_playlist.push(added); List.sortList(); if (now_playing) { full_playlist.push(now_playing); } if (hostMode) { M.toast({ html: "

New song added

" + added.title + "

", displayLength: 10000 }); document .querySelector("#toast-container") .setAttribute("style", "z-index: 99999999999 !important"); } if ( added.source != "soundcloud" && document.querySelectorAll("#suggested-" + added.id).length > 0 ) { number_suggested = number_suggested - 1; if (number_suggested < 0) number_suggested = 0; var to_display = number_suggested > 9 ? "9+" : number_suggested; if (to_display == 0) { Helper.addClass( document.querySelector(".suggested-link span.badge.new.white"), "hide" ); } document.querySelector( ".suggested-link span.badge.new.white" ).innerText = to_display; Helper.removeElement("#suggested-" + added.id); } if (List.empty) { List.empty = false; } if (document.querySelectorAll("#empty-channel-message").length > 0) { document.querySelector("#empty-channel-message").remove(); } if (intelligentList) { intelligentQueue.push({ type: "add", element: added }); if (Helper.mobilecheck()) { say_updated(); } } else { List.insertAtIndex(added, true); Helper.css( document.querySelector("#wrapper").children[List.page + List.can_fit], "display", "none" ); if ( document.querySelector("#wrapper").children.length > List.page + List.can_fit ) { Helper.css(".next_page_hide", "display", "none"); Helper.removeClass(".next_page", "hide"); Helper.css(".last_page_hide", "display", "none"); Helper.css(".next_page", "display", "inline-flex"); Helper.css(".last_page", "display", "inline-flex"); } else { Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".next_page", "display", "none"); } } } }, deleted_song: function(deleted, removed, intelligentSecond, deleted_index) { try { var index = List.getIndexOfSong(deleted); if (intelligentList && !intelligentSecond) { intelligentQueue.push({ type: "delete", element: full_playlist[index], index: index }); if (Helper.mobilecheck()) { say_updated(); } if (index != -1) full_playlist.splice(index, 1); var this_element = document.getElementById(deleted); Helper.addClass(this_element, "disabled-vote"); this_element.querySelector(".vote-span").innerText = "Deleted"; Helper.addClass( this_element.querySelector(".vote-container"), "deleted-vote-container" ); Helper.removeClass( this_element.querySelector(".vote-container"), "clickable" ); Helper.removeClass( this_element.querySelector(".vote-container"), "vote-container" ); return; } else { //if(!removed) to_delete.style.height = 0; var nextToChange; if (index == -1) index = deleted_index; if ( index < List.page && document.querySelector("#wrapper").children.length - (List.page + 2) >= 0 ) { //Helper.css(document.querySelector("#wrapper").children[List.page], "height", 0 + "px"); nextToChange = document.querySelector("#wrapper").children[List.page]; //Helper.css(document.querySelector("#wrapper").children[List.page], "display", "inline-flex"); //Helper.css(document.querySelector("#wrapper").children[List.page], "height", List.element_height + "px"); } else if ( document.querySelector("#wrapper").children.length > List.page + List.can_fit ) { //Helper.css(document.querySelector("#wrapper").children[List.page + (List.can_fit)], "height", 0 + "px"); nextToChange = document.querySelector("#wrapper").children[ List.page + List.can_fit ]; //Helper.css(document.querySelector("#wrapper").children[List.page + (List.can_fit)], "display", "inline-flex"); //Helper.css(document.querySelector("#wrapper").children[List.page + (List.can_fit)], "height", List.element_height + "px"); } if ( List.page >= document.querySelector("#wrapper").children.length - 1 ) { List.dynamicContentPage(-1); Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".next_page", "display", "none"); Helper.css(".last_page_hide", "display", "inline-flex"); Helper.css(".last_page", "display", "none"); } else if ( List.page + List.can_fit + 1 >= document.querySelector("#wrapper").children.length - 1 ) { Helper.css(".next_page_hide", "display", "inline-flex"); Helper.css(".next_page", "display", "none"); Helper.css(".last_page_hide", "display", "inline-flex"); Helper.css(".last_page", "display", "none"); } if (List.page <= index && List.page - List.can_fit <= index) { Helper.addClass("#" + deleted, "side_away"); //document.getElementById(deleted).querySelector(".mobile-delete").remove(); Helper.css("#" + deleted, "transform", "translateX(-100%)"); setTimeout(function() { Helper.removeElement("#" + deleted); /*var wrapperChildren = [].slice.call(document.querySelector("#wrapper").children); if(wrapperChildren.length > List.can_fit) { Helper.css(wrapperChildren[List.can_fit], "display", "inline-flex"); }*/ if (nextToChange != undefined) { Helper.css(nextToChange, "display", "inline-flex"); Helper.css(nextToChange, "height", List.element_height + "px"); } }, 300); } else { Helper.removeElement("#" + deleted); if (nextToChange != undefined) { Helper.css(nextToChange, "display", "inline-flex"); Helper.css(nextToChange, "height", List.element_height + "px"); } } var index = List.getIndexOfSong(deleted); if (index != -1) full_playlist.splice(index, 1); Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); //} } } catch (err) { var index = List.getIndexOfSong(deleted); if (index != -1) full_playlist.splice(index, 1); if (!List.empty) { try { document.getElementById(deleted).remove(); } catch (e) {} if ( index < List.page && document.querySelector("#wrapper").children.length - (List.page + 1) >= 0 ) { //Helper.css(document.querySelector("#wrapper").children[List.page - 1], "display", "inline-flex"); } else if ( document.querySelector("#wrapper").children.length > List.page + List.can_fit ) { //Helper.css(document.querySelector("#wrapper").children[List.page + (List.can_fit - 1)], "display", "inline-flex"); } if (nextToChange != undefined) { Helper.css(nextToChange, "display", "inline-flex"); Helper.css(nextToChange, "height", List.element_height + "px"); } Player.sendNext({ title: full_playlist[0].title, videoId: full_playlist[0].id, source: full_playlist[0].source, thumbnail: full_playlist[0].thumbnail }); } } if (full_playlist.length < 2) { List.empty = true; Helper.setHtml( "#wrapper", "The playlist is empty." ); } Helper.removeElement("#suggested-" + deleted); if ( List.page + List.can_fit < document.querySelector("#wrapper").children.length + 1 ) { //$(".next_page_hide").css("display", "none"); //$(".next_page").css("display", "flex"); } if (List.page >= document.querySelector("#wrapper").children.length) { List.dynamicContentPage(-1); } Suggestions.checkUserEmpty(); }, voted_song: function(voted, time) { var index_of_song = List.getIndexOfSong(voted); if (index_of_song == -1) return; var song_voted_on = full_playlist[index_of_song]; full_playlist[index_of_song].votes += 1; full_playlist[index_of_song].added = time; if (intelligentList) { document.getElementById(voted).querySelector(".list-votes").innerText = full_playlist[index_of_song].votes; intelligentQueue.push({ type: "vote", element: song_voted_on }); List.sortList(); if (Helper.mobilecheck()) { say_updated(); } } else { List.sortList(); Helper.removeElement("#" + voted); List.insertAtIndex(song_voted_on, false); } }, song_change_prev: function(time) { full_playlist[full_playlist.length - 1].now_playing = false; full_playlist[full_playlist.length - 1].votes = full_playlist[0].votes; full_playlist[full_playlist.length - 1].guids = []; full_playlist[full_playlist.length - 1].added = full_playlist[0].added - 1; full_playlist.unshift(full_playlist.pop()); full_playlist[full_playlist.length - 1].now_playing = true; if (full_playlist.length == 1) return; document .querySelector("#wrapper") .children[ document.querySelector("#wrapper").children.length - 1 ].remove(); var length = full_playlist.length - 2; if (length < 0) { length = 0; } List.insertAtIndex(full_playlist[0], false, true); }, song_change: function(time, remove, id) { try { var length = full_playlist.length - 1; if (full_playlist.length <= 1) { List.empty = true; Helper.setHtml( "#wrapper", "The playlist is empty." ); } if (id != full_playlist[0].id) { return; } var newLast = full_playlist[0]; full_playlist[0].now_playing = true; full_playlist[0].votes = 0; full_playlist[0].guids = []; full_playlist[0].added = time; var i = intelligentQueue.length; while (i--) { var current = intelligentQueue[i]; if (current.type == "delete") { intelligentQueue.splice(i, 1); Helper.removeElement("#" + current.element.id); deleted_elements += 1; } } try { document.getElementById(full_playlist[0].id).remove(); } catch (e) {} if (!remove) { full_playlist[length].now_playing = false; } else { delete full_playlist[length]; } Helper.log(["SONG ON FIRST INDEX", full_playlist[0]]); full_playlist.push(full_playlist.shift()); if (!remove) { if (full_playlist.length >= 2) { var index = full_playlist.length - 2; List.insertAtIndex(full_playlist[index], false, true); } } var wrapperChildren = [].slice.call( document.querySelector("#wrapper").children ); if (wrapperChildren.length >= List.can_fit && deleted_elements > 0) { for (var i = 0; i < deleted_elements + 1; i++) { //Helper.css(wrapperChildren[List.can_fit - 2], "display", "inline-flex"); Helper.css( wrapperChildren[List.page + List.can_fit - 1 - i], "display", "inline-flex" ); } } deleted_elements = 0; } catch (e) {} }, vote: function(id, vote) { Helper.log([ "Voting on video", "client " + client, "socket_connected " + socket_connected ]); if ((client || Helper.mobilecheck()) && !socket_connected) { if (vote != "del") { vote_ajax(id); } else { del_ajax(id); } return; } if ( !offline || (vote == "del" && (hasadmin && (!w_p && adminpass != ""))) ) { /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); if(u == undefined) u = "";*/ emit("vote", { channel: chan, id: id, type: vote }); } else { if (vote == "pos") { List.voted_song(id, new Date().getTime() / 1000); } else { List.deleted_song(id); } } return true; }, skip: function(way) { if (!offline) { /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); if(u == undefined) u = "";*/ emit("skip", { id: video_id, channel: chan.toLowerCase() }); } else { if (way) { Player.playNext(); } else { Player.playPrev(); } } return true; }, exportToSoundCloud: function(thisSong, i) { if (i >= full_playlist.length) { if (List.found.length == 0) { for (var x = 0; x < List.not_found.length; x++) { var data = List.not_found[x]; var not_added_song = document.createElement("div"); not_added_song.innerHTML = not_export_html; not_added_song .querySelector(".extra-add-text") .setAttribute("value", data); not_added_song .querySelector(".extra-add-text") .setAttribute("title", data); document .querySelector(".not-exported-container") .insertAdjacentHTML("beforeend", not_added_song.innerHTML); } Helper.removeClass(".not-exported", "hide"); Helper.addClass(".current_number", "hide"); Helper.addClass("#playlist_loader_export", "hide"); Helper.addClass(".exported-list-container", "hide"); List.found = []; List.not_found = []; } else { SC_player.post("/playlists", { playlist: { title: chan.toLowerCase() + " - Zoff", tracks: List.found, description: "Playlist exported from https://zoff.me/" + Helper.encodeChannelName(chan.toLowerCase()) } }) .then(function(result) { for (var x = 0; x < List.not_found.length; x++) { var data = List.not_found[x]; var not_added_song = document.createElement("div"); not_added_song.innerHTML = not_export_html; not_added_song .querySelector(".extra-add-text") .setAttribute("value", data); not_added_song .querySelector(".extra-add-text") .setAttribute("title", data); document .querySelector(".not-exported-container") .insertAdjacentHTML("beforeend", not_added_song.innerHTML); } Helper.addClass(".current_number", "hide"); Helper.addClass("#playlist_loader_export", "hide"); Helper.addClass(".exported-list-container", "hide"); document .querySelector(".exported-list") .insertAdjacentHTML( "beforeend", "" + result.title + "" ); Helper.removeClass(".not-exported", "hide"); toast("List exported!"); List.found = []; List.not_found = []; }) .catch(function(error) { console.log(error); }); } } else if (thisSong == undefined) { ga("send", "event", "export", "soundcloud"); if (full_playlist.length > 0) { List.exportToSoundCloud(full_playlist[0], 0); } } else if (thisSong != undefined && i != undefined) { var isFound = false; Helper.removeClass(".current_number", "hide"); document.querySelector(".current_number").innerText = i + " of " + full_playlist.length; if (thisSong.source == "soundcloud") { List.found.push({ id: parseInt(thisSong.id) }); List.exportToSoundCloud(full_playlist[i + 1], i + 1); } else { var _title = thisSong.title; _title = Helper.replaceForFind(_title); SC_player.get("/tracks", { q: _title }) .then(function(tracks) { //$("#results").append(result_html); //Helper.css(document.querySelector(".search_results .col.s12"), "display", "block"); for (var y = 0; y < tracks.length; y++) { var song = tracks[y]; if (!song.streamable) continue; var duration = Math.floor(song.duration / 1000); //var secs=Search.durationToSeconds(duration); var secs = duration; if (longsongs == undefined) longsongs = true; if ((longsongs != undefined && !longsongs) || secs < 720) { var title = song.title; if (title.indexOf(song.user.username) == -1) { title = song.user.username + " - " + title; } title = title.toLowerCase(); var id = song.id; if (similarity(title, _title) > 0.6) { List.found.push({ id: parseInt(song.id) }); isFound = true; break; } } } if (!isFound) { List.not_found.push(full_playlist[i].title); } List.exportToSoundCloud(full_playlist[i + 1], i + 1); }) .catch(function(e) { List.not_found.push(full_playlist[i].title); List.exportToSoundCloud(full_playlist[i + 1], i + 1); }); } } }, exportToSpotify: function() { ga("send", "event", "export", "spotify"); Helper.ajax({ type: "GET", url: "https://api.spotify.com/v1/me", headers: { Authorization: "Bearer " + access_token_data.access_token }, success: function(response) { response = JSON.parse(response); var user_id = response.id; Helper.removeClass("#playlist_loader_export", "hide"); Helper.removeClass(".exported-list-container", "hide"); Helper.ajax({ type: "POST", url: "https://api.spotify.com/v1/users/" + user_id + "/playlists", headers: { Authorization: "Bearer " + access_token_data.access_token, "Content-Type": "application/json" }, data: JSON.stringify({ name: chan.toLowerCase() + " - Zoff", description: "Playlist exported from Zoff (https://zoff.me/" + chan.toLowerCase() + "/)", public: true }), success: function(response) { response = JSON.parse(response); var playlist_id = response.id; Helper.ajax({ type: "GET", url: window.location.protocol + "//" + window.location.hostname + "/assets/images/small-square.base64.txt", success: function(base64image) { var image = base64image.substring(0, base64image.length - 1); Helper.ajax({ type: "PUT", url: "https://api.spotify.com/v1/users/" + user_id + "/playlists/" + playlist_id + "/images", headers: { Authorization: "Bearer " + access_token_data.access_token, "Content-Type": "image/jpeg" }, contentType: "image/jpeg", data: image, success: function(resp) {}, error: function(error) { console.error(error); } }); } }); var i = 0; List.searchSpotify( full_playlist[i], playlist_id, user_id, full_playlist, i ); //}); }, error: function(e) {} }); }, error: function(e) { console.error(e); } }); }, searchSpotify: function( curr_song, playlist_id, user_id, full_playlist, current_element ) { var original_track = curr_song.title; var track = curr_song.title.toLowerCase().replace("-", " "); track = Helper.replaceForFind(track); track = encodeURIComponent(track); Helper.removeClass(".current_number", "hide"); document.querySelector(".current_number").innerText = current_element + 1 + " of " + full_playlist.length; Helper.ajax({ type: "GET", url: "https://api.spotify.com/v1/search?q=" + track + "&type=track", headers: { Authorization: "Bearer " + access_token_data.access_token }, async: true, error: function(err) { if (err.status == 429 || err.status == 502) { Helper.log([err.getAllResponseHeaders()]); var retryAfter = err.getResponseHeader("Retry-After"); Helper.log([retryAfter]); if (!retryAfter) retryAfter = 5; retryAfter = parseInt(retryAfter, 10); Helper.log(["Retry-After", retryAfter]); setTimeout(function() { List.searchSpotify( curr_song, playlist_id, user_id, full_playlist, current_element ); }, retryAfter * 1000); } }, success: function(response) { response = JSON.parse(response); var found = false; for (var i = 0; i < response.tracks.items.length; i++) { var data = response.tracks.items[i]; data.name = Helper.replaceForFind(data.name); data.artists[0].name = Helper.replaceForFind(data.artists[0].name); if (data.name.substring(data.name.length - 1) == " ") data.name = data.name.substring(0, data.name.length - 1); if ( data.name.substring(data.name.length - 1) == "." && track.substring(track.length - 1) != "." ) { data.name = data.name.substring(0, data.name.length - 1); } if ( similarity( data.artists[0].name + " - " + data.name, decodeURIComponent(track) ) > 0.6 || (data.artists.length > 1 && similarity( data.artists[0].name + " " + data.artists[1].name + " - " + data.name, decodeURIComponent(track) )) ) { found = true; List.uris.push(data.uri); Helper.log(["Found", track]); //List.num_songs = List.num_songs + 1; break; } else if ( decodeURIComponent(track).indexOf( data.artists[0].name.toLowerCase() ) >= 0 && decodeURIComponent(track).indexOf(data.name.toLowerCase()) >= 0 ) { found = true; List.uris.push(data.uri); Helper.log(["Found", track]); //List.num_songs = List.num_songs + 1; break; } else { var splitted = data.name.split(" "); var toBreak = false; for (var i = 0; i < splitted.length; i++) { if ( (splitted[i] == "and" && track.indexOf("&") >= 0) || (splitted[i] == "&" && track.indexOf("and") >= 0) ) { continue; } else if (track.indexOf(splitted[i]) < 0) { toBreak = true; break; } } if (toBreak) break; found = true; List.uris.push(data.uri); Helper.log(["Found", track]); //List.num_songs = List.num_songs + 1; break; } } if (!found) { List.not_found.push(original_track); List.num_songs = List.num_songs + 1; Helper.log(["Didn't find", original_track]); } if (List.num_songs + List.uris.length == full_playlist.length) { if (List.uris.length > 100) { while (List.uris.length > 100) { List.addToSpotifyPlaylist( List.uris.slice(0, 100), playlist_id, user_id ); List.uris = List.uris.slice(100, List.uris.length); } List.addToSpotifyPlaylist(List.uris, playlist_id, user_id); Helper.addClass("#playlist_loader_export", "hide"); } else { List.addToSpotifyPlaylist(List.uris, playlist_id, user_id); Helper.addClass("#playlist_loader_export", "hide"); } if (document.querySelectorAll(".exported-spotify-list").length == 0) { document .querySelector(".exported-list") .insertAdjacentHTML( "beforeend", "" + chan + "" ); } for (var i = 0; i < List.not_found.length; i++) { var data = List.not_found[i]; var not_added_song = document.createElement("div"); not_added_song.innerHTML = not_export_html; not_added_song .querySelector(".extra-add-text") .setAttribute("value", data); not_added_song .querySelector(".extra-add-text") .setAttribute("title", data); document .querySelector(".not-exported-container") .insertAdjacentHTML("beforeend", not_added_song.innerHTML); } Helper.addClass(".current_number", "hide"); Helper.removeClass(".not-exported", "hide"); Helper.css(".spotify_export_button", "display", "block"); } else { List.searchSpotify( full_playlist[current_element + 1], playlist_id, user_id, full_playlist, current_element + 1 ); } } }); }, addToSpotifyPlaylist: function(uris, playlist_id, user_id) { Helper.ajax({ type: "POST", url: "https://api.spotify.com/v1/users/" + user_id + "/playlists/" + playlist_id + "/tracks", headers: { Authorization: "Bearer " + access_token_data.access_token, "Content-Type": "application/json" }, data: JSON.stringify({ uris: uris }), error: function(response) { var temp_playlist_id = playlist_id; var temp_uris = uris; var temp_user_id = user_id; setTimeout(function() { List.addToSpotifyPlaylist(temp_uris, temp_playlist_id, temp_user_id); }, 3000); }, success: function(response) { Helper.log(["Added songs"]); } }); }, exportToYoutube: function() { ga("send", "event", "export", "youtube"); var request_url = "https://www.googleapis.com/youtube/v3/playlists?part=snippet&key=" + api_key.youtube; Helper.removeClass(".exported-list-container", "hide"); Helper.removeClass("#playlist_loader_export", "hide"); Helper.ajax({ type: "POST", url: request_url, headers: { Authorization: "Bearer " + access_token_data_youtube.access_token, "Content-Type": "application/json" }, data: JSON.stringify({ snippet: { title: Helper.upperFirst(chan.toLowerCase()), description: "Playlist exported from zoff" } }), success: function(response) { response = JSON.parse(response); var number_added = 0; var playlist_id = response.id; var request_url = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&key=" + api_key.youtube; List.addToYoutubePlaylist( playlist_id, full_playlist, number_added, request_url ); }, error: function(response) { console.error(response); toast( "Couldn't export to YouTube for some reason.. Try again later", "red lighten" ); Helper.addClass(".exported-list-container", "hide"); Helper.addClass("#playlist_loader_export", "hide"); Helper.removeClass(".youtube_export_button", "hide"); response = response.responseText; Helper.log(["export to youtube response", response]); } }); }, insertInYouTubePlaylist: function(playlist_id, _videoId, num, request_url) { var _data = JSON.stringify({ snippet: { playlistId: playlist_id, resourceId: { kind: "youtube#video", videoId: _videoId } } }); Helper.ajax({ type: "POST", url: request_url, headers: { Authorization: "Bearer " + access_token_data_youtube.access_token, "Content-Type": "application/json" }, data: _data, success: function(response) { response = JSON.parse(response); Helper.log([ "Added video: " + full_playlist[num].id + " to playlist id " + playlist_id ]); if (num == full_playlist.length - 1) { Helper.log(["All videoes added!"]); Helper.log([ "url: https://www.youtube.com/playlist?list=" + playlist_id ]); document .querySelector(".exported-list") .insertAdjacentHTML( "beforeend", "" + chan + "" ); Helper.addClass("#playlist_loader_export", "hide"); Helper.addClass(".current_number", "hide"); //$(".youtube_export_button").removeClass("hide"); } else { //setTimeout(function(){ Helper.removeClass(".current_number", "hide"); document.querySelector(".current_number").innerText = num + 1 + " of " + full_playlist.length; List.addToYoutubePlaylist( playlist_id, full_playlist, num + 1, request_url ); //}, 50); } }, error: function(response) { console.error(response); } }); }, addToYoutubePlaylist: function(playlist_id, full_playlist, num, request_url) { if (num == full_playlist.length) { Helper.log(["All videoes added!"]); Helper.log(["url: https://www.youtube.com/playlist?list=" + playlist_id]); document .querySelector(".exported-list") .insertAdjacentHTML( "beforeend", "" + chan + "" ); Helper.addClass("#playlist_loader_export", "hide"); Helper.addClass(".current_number", "hide"); return; //$(".youtube_export_button").removeClass("hide"); } if ( full_playlist[num].hasOwnProperty("source") && full_playlist[num].source != "soundcloud" ) { List.insertInYouTubePlaylist( playlist_id, full_playlist[num].id, num, request_url ); } else { var yt_url = "https://www.googleapis.com/youtube/v3/search?key=" + api_key.youtube + "&videoEmbeddable=true&part=id,snippet&fields=items(id,snippet)&type=video&order=relevance&safeSearch=none&maxResults=10&videoCategoryId=10"; yt_url += "&q=" + full_playlist[num].title; var title = full_playlist[num].title; var temptitle = title.split("-"); temptitle = temptitle.join(" ").split(" "); var vid_url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key=" + api_key.youtube + "&id="; Helper.ajax({ type: "GET", url: yt_url, dataType: "jsonp", success: function(response) { response = JSON.parse(response); //Helper.log(response); if (response.items.length === 0) { Helper.log([ "NO MATCH FOR:", "Spotify title: " + title, "Spotify length: " + length ]); var not_added_song = document.createElement("div"); not_added_song.innerHTML = not_export_html; not_added_song.querySelector(".extra-add-text").innerText = title; not_added_song .querySelector(".extra-add-text") .setAttribute("title", title); not_added_song .querySelector(".extra-button-search") .setAttribute("data-text", title); document .querySelector(".not-exported-container") .insertAdjacentHTML("beforeend", not_added_song.innerHTML); Helper.removeClass(".not-exported", "hide"); if (num == full_playlist.length) { Helper.log(["All videoes added!"]); Helper.log([ "url: https://www.youtube.com/playlist?list=" + playlist_id ]); document .querySelector(".exported-list") .insertAdjacentHTML( "beforeend", "" + chan + "" ); Helper.addClass("#playlist_loader_export", "hide"); Helper.addClass(".current_number", "hide"); //$(".youtube_export_button").removeClass("hide"); } else { //setTimeout(function(){ Helper.removeClass(".current_number", "hide"); document.querySelector(".current_number").innerText = num + 1 + " of " + full_playlist.length; List.addToYoutubePlaylist( playlist_id, full_playlist, num + 1, request_url ); //}, 50); } } else if (response.items.length > 0) { for (var i = 0; i < response.items.length; i++) { var data = response.items[i]; vid_url += data.id.videoId + ","; } Helper.ajax({ type: "GET", url: vid_url, dataType: "jsonp", success: function(response) { response = JSON.parse(response); if (response.items.length > 0) { var matched = false; for (var y = 0; y < response.items.length; y++) { var data = response.items[y]; //Helper.log(data); //var title = data.snippet.title; var duration = Search.durationToSeconds( data.contentDetails.duration ); var not_matched = false; if (similarity(data.snippet.title, title) > 0.75) { not_matched = false; } else { for (var i = 0; i < temptitle.length; i++) { var data_title = temptitle[i]; if ( data.snippet.title .toLowerCase() .indexOf(data_title.toLowerCase()) == -1 || !( data.snippet.title.toLowerCase().indexOf("cover") == -1 && title.toLowerCase().indexOf("cover") == -1 && ((data.snippet.title .toLowerCase() .indexOf("remix") == -1 && title.toLowerCase().indexOf("remix") == -1) || (data.snippet.title .toLowerCase() .indexOf("remix") != -1 && title.toLowerCase().indexOf("remix") != -1) || !( data.snippet.title .toLowerCase() .indexOf(data_title.toLowerCase()) == -1 && data.snippet.channelTitle .toLowerCase() .indexOf("vevo") == -1 )) ) ) not_matched = true; else if (duration > 1800) not_matched = true; } } if (!not_matched) { matched = true; List.insertInYouTubePlaylist( playlist_id, data.id, num, request_url ); break; } } if (!matched) { if (num == full_playlist.length - 1) { Helper.log(["All videoes added!"]); Helper.log([ "url: https://www.youtube.com/playlist?list=" + playlist_id ]); document .querySelector(".exported-list") .insertAdjacentHTML( "beforeend", "" + chan + "" ); Helper.addClass("#playlist_loader_export", "hide"); Helper.addClass(".current_number", "hide"); //$(".youtube_export_button").removeClass("hide"); } else { //setTimeout(function(){ Helper.removeClass(".current_number", "hide"); document.querySelector(".current_number").innerText = num + 1 + " of " + full_playlist.length; //}, 50); } Helper.log([ "NO MATCH FOR:", "Spotify title: " + title, "Spotify length: " + length ]); var not_added_song = document.createElement("div"); not_added_song.innerHTML = not_export_html; not_added_song.querySelector( ".extra-add-text" ).value = title; not_added_song .querySelector(".extra-add-text") .setAttribute("value", title); not_added_song .querySelector(".extra-add-text") .setAttribute("title", title); //not_added_song.querySelector(".extra-button-search").setAttribute("data-text", title); document .querySelector(".not-exported-container") .insertAdjacentHTML( "beforeend", not_added_song.innerHTML ); Helper.removeClass(".not-exported", "hide"); List.addToYoutubePlaylist( playlist_id, full_playlist, num + 1, request_url ); } } }, error: function(e) { console.error(e); } }); } }, error: function(e) { console.error(e); } }); } }, sortList: function() { full_playlist.sort( Helper.predicate( { name: "votes", reverse: true }, { name: "added", reverse: false }, { name: "title", reverse: false } ) ); }, show: function() { if (!Helper.mobilecheck() && !chromecastAvailable) { M.Modal.getInstance( document.getElementById("channel-share-modal") ).open(); } if (chromecastAvailable) { castSession.sendMessage("urn:x-cast:zoff.me", { type: "showJoinInfo" }); } }, 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 video_thumb_url = "//img.youtube.com/vi/" + video_id + "/mqdefault.jpg"; if (_song_info.source == "soundcloud") { video_thumb_url = _song_info.thumbnail; } var video_thumb = "background-image:url('" + video_thumb_url + "');"; var song = document.createElement("div"); song.innerHTML = list_html; song = song.cloneNode(true); var image_attr = "style"; if ( _song_info.hasOwnProperty("start") && _song_info.hasOwnProperty("end") ) { _song_info.duration = _song_info.end - _song_info.start; } var attr; var del_attr; //song.find(".list-song"); if (transition) { Helper.css( song.querySelector(".list-song"), "transform", "translateX(100%)" ); Helper.addClass(song.querySelector(".list-song"), "side_away"); } Helper.css( song.querySelector(".list-song"), "height", List.element_height + "px" ); if (!w_p) Helper.removeClass(song.querySelector(".card-action"), "hide"); if (video_votes == 1) song.querySelector(".vote-text").innerText = "vote"; if (lazy) { video_thumb = "//img.youtube.com/vi/" + video_id + "/mqdefault.jpg"; image_attr = "data-original"; } song.querySelector(".list-image").setAttribute(image_attr, video_thumb); 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"); song .querySelector("#list-song") .setAttribute("data-video-source", _song_info.source); song.querySelector("#list-song").setAttribute("id", video_id); song.classList.remove("hide"); song.querySelector(".vote-container").setAttribute("title", video_title); if ( (document.querySelector("#wrapper").children.length >= List.can_fit && initial) || display == "none" ) { Helper.css(song.querySelector(".card"), "display", "none"); } 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]); } else if (!list && !filtered) { //song.querySelector(".card-duration").remove(); //song.querySelector(".list-song").removeClass("playlist-element"); //song.querySelector(".more_button").addClass("hide"); Helper.removeClass(song.querySelector(".suggested_remove"), "hide"); song.querySelector(".vote-text").innerText = ""; song.querySelector(".card-duration").innerText = Helper.pad(_song_info.duration[0]) + ":" + Helper.pad(_song_info.duration[1]); var added_by = "user"; attr = ".add-suggested"; if (user) { del_attr = "del_user_suggested"; } else { del_attr = "del_suggested"; added_by = "system"; } song .querySelector(".vote-container") .setAttribute("class", "clickable add-suggested"); song.querySelector(".add-suggested").setAttribute("title", video_title); //Helper.addClass(song.querySelector(".delete_button"), del_attr); song.querySelector(".list-votes").innerText = _song_info.extra; song.querySelector(".vote-text").innerText = video_votes; 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-video-type", "suggested"); if (_song_info.source == "soundcloud") { song .querySelector(attr) .setAttribute("data-type-thumbnail", _song_info.thumbnail); } song .querySelector(attr) .setAttribute("data-video-source", _song_info.source); song.querySelector("#list-song").setAttribute("data-video-id", video_id); Helper.css(song.querySelector("#list-song"), "display", "inline-flex"); song .querySelector("#list-song") .setAttribute("id", "suggested-" + video_id); var list_image = song.querySelector(".list-image"); 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 = _song_info.tags.join(", "); song.querySelector(".vote-text").remove(); 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(); } if (hostMode) { song.querySelector(".list-remove").style.display = "none"; } song.querySelector(".list-title").innerText = video_title; song.querySelector(".list-title").setAttribute("title", video_title); song.querySelector(attr).setAttribute("data-video-id", video_id); //song.querySelector(".list-image-placeholder").setAttribute("src", video_thumb_url); if (song.querySelectorAll(".list-suggested-image").length > 0) { song .querySelector(".list-suggested-image") .setAttribute(image_attr, video_thumb); } //song.querySelector("."+del_attr).setAttribute("data-video-id", video_id); return song.innerHTML; }, getIndexOfSong: function(id) { try { for (var i = 0; i < full_playlist.length; i++) { if (full_playlist[i].id == id) return i; } return -1; } catch (e) { return -1; } } };