diff --git a/lib/channel.js b/lib/channel.js index ea3dbe1d..8b40290b 100644 --- a/lib/channel.js +++ b/lib/channel.js @@ -1587,15 +1587,20 @@ Channel.prototype.trySetTemp = function(user, data) { Channel.prototype.dequeue = function(uid) { - var chan = this; - function afterDelete() { - chan.sendAll("delete", { - uid: uid - }); - chan.broadcastPlaylistMeta(); - } - if(!this.playlist.remove(uid, afterDelete)) - return; + var self = this; + self.plqueue.queue(function (q) { + if (self.dead) + return; + + if (self.playlist.remove(uid)) { + self.sendAll("delete", { + uid: uid + }); + self.broadcastPlaylistMeta(); + } + + q.release(); + }); } Channel.prototype.tryDequeue = function(user, data) { @@ -1666,6 +1671,7 @@ Channel.prototype.tryJumpTo = function(user, data) { Channel.prototype.clearqueue = function() { this.playlist.clear(); + this.plqueue.reset(); this.sendAll("playlist", this.playlist.items.toArray()); this.broadcastPlaylistMeta(); } @@ -1683,6 +1689,7 @@ Channel.prototype.shufflequeue = function() { var n = []; var pl = this.playlist.items.toArray(false); this.playlist.clear(); + this.plqueue.reset(); while(pl.length > 0) { var i = parseInt(Math.random() * pl.length); var item = this.playlist.makeItem(pl[i].media); @@ -1732,32 +1739,36 @@ Channel.prototype.tryUpdate = function(user, data) { } Channel.prototype.move = function(data, user) { - var chan = this; - function afterMove() { - if (chan.dead) + var self = this; + self.plqueue.queue(function (q) { + if (self.dead) return; - var moveby = user && user.name ? user.name : null; - if(typeof data.moveby !== "undefined") - moveby = data.moveby; + if (self.playlist.move(data.from, data.after)) { + var moveby = user && user.name ? user.name : null; + if (typeof data.moveby !== "undefined") + moveby = data.moveby; - var fromit = chan.playlist.items.find(data.from); - var afterit = chan.playlist.items.find(data.after); - var aftertitle = afterit && afterit.media ? afterit.media.title : ""; - if(fromit) { - chan.logger.log("### " + user.name + " moved " + fromit.media.title - + (aftertitle ? " after " + aftertitle : "")); + var fromit = self.playlist.items.find(data.from); + var afterit = self.playlist.items.find(data.after); + var aftertitle = (afterit && afterit.media) + ? afterit.media.title : ""; + if (fromit) { + self.logger.log("### " + user.name + " moved " + + fromit.media.title + + (aftertitle ? " after " + aftertitle : "")); + } + + self.sendAll("moveVideo", { + from: data.from, + after: data.after, + moveby: moveby + }); } - chan.sendAll("moveVideo", { - from: data.from, - after: data.after, - moveby: moveby - }); - } - - this.playlist.move(data.from, data.after, afterMove); + q.release(); + }); } Channel.prototype.tryMove = function(user, data) { diff --git a/lib/playlist.js b/lib/playlist.js index 0a4bf4ae..765d5ab8 100644 --- a/lib/playlist.js +++ b/lib/playlist.js @@ -51,10 +51,7 @@ function Playlist(chan) { "mediaUpdate": [], "remove": [], }; - this.lock = false; - this.action_queue = []; this.fnqueue = new AsyncQueue(); - this._qaInterval = false; AllPlaylists[name] = this; this.channel = chan; @@ -88,28 +85,6 @@ function Playlist(chan) { }); } -Playlist.prototype.queueAction = function(data) { - this.action_queue.push(data); - if(this._qaInterval) - return; - var pl = this; - this._qaInterval = setInterval(function() { - var data = pl.action_queue.shift(); - if(data.waiting) { - if(!("expire" in data)) - data.expire = Date.now() + 10000; - if(Date.now() < data.expire) - pl.action_queue.unshift(data); - } - else - data.fn(); - if(pl.action_queue.length == 0) { - clearInterval(pl._qaInterval); - pl._qaInterval = false; - } - }, 100); -} - Playlist.prototype.dump = function() { var arr = this.items.toArray(); var pos = 0; @@ -243,88 +218,35 @@ Playlist.prototype.addMedia = function (data) { }; }; -Playlist.prototype.addYouTubePlaylist = function(data, callback) { - var pos = "append"; - if(data.pos == "next") { - if(!this.current) - pos = "prepend"; - else - pos = this.current.uid; - } - - var pl = this; - this.server.infogetter.getMedia(data.id, data.type, function(err, vids) { - if(err) { - callback(err, null); - return; +Playlist.prototype.remove = function (uid) { + var self = this; + var item = self.items.find(uid); + if (item && self.items.remove(uid)) { + if (item === self.current) { + setImmediate(function () { self._next(); }); } - - if(data.pos === "next") - vids.reverse(); - - vids.forEach(function(media) { - if(data.maxlength && media.seconds > data.maxlength) { - callback("Media is too long!", null); - return; - } - var it = pl.makeItem(media); - it.temp = data.temp; - it.queueby = data.queueby; - pl.queueAction({ - fn: function() { - var err = pl.add(it, pos); - callback(err, err ? null : it); - }, - }); - }); - }); + return true; + } else { + return false; + } } -Playlist.prototype.remove = function(uid, callback) { - var pl = this; - this.queueAction({ - fn: function() { - var item = pl.items.find(uid); - if(pl.items.remove(uid)) { - if(callback) - callback(); - if(item == pl.current) - pl._next(); - } - }, - waiting: false - }); -} - -Playlist.prototype.move = function(from, after, callback) { - var pl = this; - this.queueAction({ - fn: function() { - pl._move(from, after, callback); - }, - waiting: false - }); -} - -Playlist.prototype._move = function(from, after, callback) { +Playlist.prototype.move = function (from, after) { var it = this.items.find(from); - if(!this.items.remove(from)) - return; + if (!this.items.remove(from)) + return false; - if(after === "prepend") { - if(!this.items.prepend(it)) - return; + if (after === "prepend") { + if (!this.items.prepend(it)) + return false; + } else if (after === "append") { + if (!this.items.append(it)) + return false; + } else if (!this.items.insertAfter(it, after)) { + return false; } - else if(after === "append") { - if(!this.items.append(it)) - return; - } - - else if(!this.items.insertAfter(it, after)) - return; - - callback(); + return true; } Playlist.prototype.next = function() { @@ -333,13 +255,11 @@ Playlist.prototype.next = function() { var it = this.current; - if(it.temp) { - var pl = this; - this.remove(it.uid, function() { - pl.on("remove")(it); - }); - } - else { + if (it.temp) { + if (this.remove(it.uid)) { + this.on("remove")(it); + } + } else { this._next(); } @@ -375,10 +295,9 @@ Playlist.prototype.jump = function(uid) { } if(it.temp) { - var pl = this; - this.remove(it.uid, function () { - pl.on("remove")(it); - }); + if (this.remove(it.uid)) { + this.on("remove")(it); + } } return this.current;