/*! **| Cytube Playlist Enhancements **| Copyright Xaekai 2014 - 2016 **| Version 2018.01.21.2200 **| **@optional whispers **@preserve */ "use strict"; function playlist(active) { var queue = []; var selector = `#queue > .queue_entry${active ? ".queue_active" : ""}`; $(selector).each(function () { var data = $(this).data(); var addedby; if ($(this).attr("data-original-title")) { addedby = $(this) .attr("data-original-title") .match(/: ([-\w\u00c0-\u00ff]{1,20})$/)[1]; } else { addedby = $(this) .attr("title") .match(/: ([-\w\u00c0-\u00ff]{1,20})$/)[1]; } queue.push({ uid: data.uid, media: data.media, temp: data.temp, active: $(this).hasClass("queue_active"), addedby: addedby }); }); return active ? queue[0] : queue; } (function (CyTube_Playlist) { return CyTube_Playlist(window, document, window.jQuery); })(function (window, document, $, undefined) { if (typeof Storage === "undefined") { console.error("[XaeTube: Enhanced Playlist]", "localStorage not supported. Aborting load."); return; } else { console.info("[XaeTube: Enhanced Playlist]", "Loading Module."); } if (!window[CHANNEL.name]) { window[CHANNEL.name] = {}; } const options = Object.assign( {}, { collapse: true, hidePlaylist: false, inlineBlame: false, moveReporting: false, quickQuality: false, quickShuffle: true, recentMedia: false, simpleLeader: false, syncCheck: false, thumbnails: false, markAlert: true, timeEstimates: false, volumeControl: false, }, window[CHANNEL.name].modulesOptions ? window[CHANNEL.name].modulesOptions.playlist : undefined ); ({ start: function () { if (!options.syncCheck) { return; } if (CLIENT.psync) { return; } else { CLIENT.psync = this; } socket.on("setPlaylistMeta", (data) => { this.syncCheck(data); }); socket.on("queue", (data) => { this.resetTimer(data); }); }, syncCheck: function (data) { if (CHANNEL.perms.seeplaylist > CLIENT.rank) { return; } if (Math.abs(this.sinceLast - Date.now()) < this.cooldown) { return; } var playlistCount = $("ul#queue li.queue_entry").length; if (Math.abs(playlistCount - data.count) > 1) { this.setTimer(); } }, setTimer: function () { if (this.state.activeTimer) { this.sinceLast = Date.now(); clearTimeout(this.state.tock); } else { this.state.activeTimer = true; } this.state.tock = setTimeout(this.syncFix.bind(this), this.delay); }, resetTimer: function (data) { if (this.state.activeTimer) { this.setTimer(); } }, syncFix: function () { this.state.activeTimer = false; socket.emit("requestPlaylist"); this.sinceLast = Date.now(); }, state: { active: false, tock: 0 }, sinceLast: Date.now(), cooldown: 120 * 1e3, delay: 5 * 1e3, }.start()); ({ start: function () { if (!options.thumbnails) { return; } if (CLIENT.thumbnailer) { return; } else { CLIENT.thumbnailer = this; } $(""); var _mQE = window.makeQueueEntry; window.makeQueueEntry = function (item, addbtns) { var li = _mQE(item, addbtns); li[0].dataset.seconds = item.media.seconds; return li; }; function calculateRemainingTime() { function secondsToTimeStr(d) { d = Number(d); var h = Math.floor(d / 3600); var m = Math.floor((d % 3600) / 60); var s = Math.floor((d % 3600) % 60); return (h > 0 ? h + ":" + (m < 10 ? "0" : "") : "") + m + ":" + (s < 10 ? "0" : "") + s; } var q = document.querySelectorAll("#queue li"); var m = document.querySelector("#plmeta"); var active, cycle = [], total = 0; var currentTime = m && "playtime" in m.dataset && m.dataset["playtime"] >= 0 ? m.dataset["playtime"] : 0; if (q.length == 0) return; q.each(function injectDOM() { if (!this.querySelector(".qe_time")) return; if (!active) { if (this.classList.contains("queue_active")) { active = this; total += parseInt(this.dataset.seconds) - currentTime; this.querySelector(".qe_time").dataset.timeleft = "Time left: " + secondsToTimeStr(total) + " | "; } else cycle.push(this); return; } else { this.querySelector(".qe_time").dataset.timeleft = "Time till: " + secondsToTimeStr(total) + " | "; total += parseInt(this.dataset.seconds); } }); cycle.each(function () { this.querySelector(".qe_time").dataset.timeleft = "Time till: " + secondsToTimeStr(total) + " | "; total += parseInt(this.dataset.seconds); }); } socket.on("mediaUpdate", function (data) { var meta = document.querySelector("#plmeta"); if (meta && (!meta.dataset["playtime"] || !data.paused)) { meta.dataset["playtime"] = Math.abs(Math.ceil(data.currentTime)); } if (!data.paused) { calculateRemainingTime(); } }); socket.emit("requestPlaylist"); })(); ({ maxhist: 10, history: [], synch: function () { localStorage.setItem(`${CHANNEL.name}_RecentMedia`, JSON.stringify(this.history)); }, view: function () { function createEntry(media) { var li = $("