Use new asyncqueue system for moving and deleting
This commit is contained in:
parent
0eda0b8ed2
commit
3666b43f7a
|
@ -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) {
|
||||
|
|
141
lib/playlist.js
141
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;
|
||||
|
|
Loading…
Reference in a new issue