continue working on channel.js
This commit is contained in:
parent
1b3199a4ef
commit
89cca0d552
|
|
@ -1129,6 +1129,255 @@ Channel.prototype.sendDrinks = function (users) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets video-related variables
|
||||||
|
*/
|
||||||
|
Channel.prototype.resetVideo = function () {
|
||||||
|
this.voteskip = false;
|
||||||
|
this.sendVoteskipUpdate(this.users);
|
||||||
|
this.drinks = 0;
|
||||||
|
this.sendDrinks(this.users);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles a queue message from a client
|
||||||
|
*/
|
||||||
|
Channel.prototype.handleQueue = function (user, data) {
|
||||||
|
// Verify the user has permission to add
|
||||||
|
if (!this.hasPermission(user, "playlistadd")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify data types
|
||||||
|
if (typeof data.id !== "string" && data.id !== false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var id = data.id || false;
|
||||||
|
|
||||||
|
if (typeof data.type !== "string") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var type = data.type;
|
||||||
|
var link = util.formatLink(id, type);
|
||||||
|
|
||||||
|
// Verify user has the permission to add at the position given
|
||||||
|
if (data.pos === "next" && !this.hasPermission(user, "playlistnext")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var pos = data.pos || "end";
|
||||||
|
|
||||||
|
// Verify user has permission to add a YouTube playlist, if relevant
|
||||||
|
if (data.type === "yp" && !this.hasPermission(user, "playlistaddlist")) {
|
||||||
|
user.socket.emit("queueFail", {
|
||||||
|
msg: "You don't have permission to add playlists",
|
||||||
|
link: link
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify the user has permission to add livestreams, if relevant
|
||||||
|
if (isLive(type) && !this.hasPermission(user, "playlistaddlive")) {
|
||||||
|
user.socket.emit("queueFail", {
|
||||||
|
msg: "You don't have permission to add livestreams",
|
||||||
|
link: link
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify the user has permission to add a Custom Embed, if relevant
|
||||||
|
if (data.type === "cu" && !this.hasPermission(user, "playlistaddcustom")) {
|
||||||
|
user.socket.emit("queueFail", {
|
||||||
|
msg: "You don't have permission to add custom embeds",
|
||||||
|
link: null
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Always reset any user-provided title if it's not a custom embed.
|
||||||
|
* Additionally reset if it is a custom embed but a title is not provided
|
||||||
|
*/
|
||||||
|
if (typeof data.title !== "string" || data.type !== "cu") {
|
||||||
|
data.title = false;
|
||||||
|
}
|
||||||
|
var title = data.title || false;
|
||||||
|
|
||||||
|
var queueby = user != null ? user.name : "";
|
||||||
|
var temp = data.temp || !this.hasPermission(user, "addnontemp");
|
||||||
|
|
||||||
|
// Throttle video adds
|
||||||
|
var limit = {
|
||||||
|
burst: 3,
|
||||||
|
sustained: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
if (user.rank >= 2 || this.leader === user) {
|
||||||
|
limit = {
|
||||||
|
burst: 10,
|
||||||
|
sustained: 2
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.queueLimiter.throttle(limit)) {
|
||||||
|
user.socket.emit("queueFail", {
|
||||||
|
msg: "You are adding videos too quickly",
|
||||||
|
link: null
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actually add the video
|
||||||
|
this.addMedia({
|
||||||
|
id: id,
|
||||||
|
title: title,
|
||||||
|
pos: pos,
|
||||||
|
queueby: queueby,
|
||||||
|
temp: temp,
|
||||||
|
type: type,
|
||||||
|
maxlength: this.hasPermission(user, "exceedmaxlength") ? 0 : this.opts.maxlength
|
||||||
|
}, function (err, media) {
|
||||||
|
if (err) {
|
||||||
|
user.socket.emit("queueFail", {
|
||||||
|
msg: err,
|
||||||
|
link: link
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (media.restricted) {
|
||||||
|
user.socket.emit("queueWarn", {
|
||||||
|
msg: "This video is blocked in the following countries: " +
|
||||||
|
media.restricted,
|
||||||
|
link: link
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a video to the playlist
|
||||||
|
*/
|
||||||
|
Channel.prototype.addMedia = function (data, callback) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
if (data.type === "cu" && typeof data.title === "string") {
|
||||||
|
var t = data.title;
|
||||||
|
if (t.length > 100) {
|
||||||
|
t = t.substring(0, 97) + "...";
|
||||||
|
}
|
||||||
|
data.title = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.pos === "end") {
|
||||||
|
data.pos === "append";
|
||||||
|
}
|
||||||
|
|
||||||
|
var afterLookup = function (lock, shouldCache, media) {
|
||||||
|
if (data.maxlength && media.seconds > data.maxlength) {
|
||||||
|
callback("Maximum length exceeded: " + data.maxlength + " seconds", null);
|
||||||
|
lock.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
media.pos = data.pos;
|
||||||
|
media.queueby = data.queueby;
|
||||||
|
media.temp = data.temp;
|
||||||
|
var res = self.playlist.addMedia(media);
|
||||||
|
if (res.error) {
|
||||||
|
callback(res.error, null);
|
||||||
|
lock.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.logger.log("### " + data.queueby + " queued " + media.title);
|
||||||
|
|
||||||
|
var item = res.item;
|
||||||
|
var packet = {
|
||||||
|
item: item.pack(),
|
||||||
|
after: item.prev ? item.prev.uid : "prepend"
|
||||||
|
};
|
||||||
|
self.users.forEach(function (u) {
|
||||||
|
u.socket.emit("queue", packet);
|
||||||
|
});
|
||||||
|
|
||||||
|
self.sendPlaylistMeta(self.users);
|
||||||
|
|
||||||
|
if (shouldCache) {
|
||||||
|
self.cacheMedia(media);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock.release();
|
||||||
|
callback(null, media);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Cached video data
|
||||||
|
if (data.type !== "cu" && typeof data.title === "string") {
|
||||||
|
self.plqueue.queue(function (lock) {
|
||||||
|
var m = new Media(data.id, data.title, data.seconds, data.type);
|
||||||
|
afterData(lock, false, m);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// YouTube playlists
|
||||||
|
if (data.type === "yp") {
|
||||||
|
self.plqueue.queue(function (lock) {
|
||||||
|
InfoGetter.getMedia(data.id, data.type, function (e, vids) {
|
||||||
|
if (e) {
|
||||||
|
callback(e, null);
|
||||||
|
lock.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If queueing next, reverse queue order so the videos end up
|
||||||
|
// in the correct order
|
||||||
|
if (data.pos === "next") {
|
||||||
|
vids.reverse();
|
||||||
|
// Special case to ensure correct playlist order
|
||||||
|
if (self.playlist.length === 0) {
|
||||||
|
vids.unshift(vids.pop());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only want to release the lock after the entire playlist
|
||||||
|
// is processed. Set up a dummy so the same code will work.
|
||||||
|
var dummy = {
|
||||||
|
release: function () { }
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 0; i < vids.length; i++) {
|
||||||
|
afterData(dummy, false, vids[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
lock.release();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cases where there is no cached data in the database
|
||||||
|
if (!self.registered || util.isLive(data.type)) {
|
||||||
|
self.plqueue.queue(function (lock) {
|
||||||
|
InfoGetter.getMedia(data.id, data.type, function (e, media) {
|
||||||
|
if (e) {
|
||||||
|
callback(e, null);
|
||||||
|
lock.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
afterData(lock, false, media);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, the "normal" case
|
||||||
|
self.plqueue.queue(function (lock) {
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches channel library
|
* Searches channel library
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue