[WIP] Playlist changes
This commit is contained in:
parent
d05fd3caa9
commit
eefd62593b
387
channel.js
387
channel.js
|
|
@ -25,6 +25,7 @@ var Auth = require("./auth.js");
|
||||||
var ChatCommand = require("./chatcommand.js");
|
var ChatCommand = require("./chatcommand.js");
|
||||||
var Filter = require("./filter.js").Filter;
|
var Filter = require("./filter.js").Filter;
|
||||||
var ActionLog = require("./actionlog");
|
var ActionLog = require("./actionlog");
|
||||||
|
var Playlist = require("./playlist");
|
||||||
|
|
||||||
var Channel = function(name) {
|
var Channel = function(name) {
|
||||||
Logger.syslog.log("Opening channel " + name);
|
Logger.syslog.log("Opening channel " + name);
|
||||||
|
|
@ -34,10 +35,9 @@ var Channel = function(name) {
|
||||||
// Initialize defaults
|
// Initialize defaults
|
||||||
this.registered = false;
|
this.registered = false;
|
||||||
this.users = [];
|
this.users = [];
|
||||||
this.queue = [];
|
this.playlist = new Playlist();
|
||||||
this.library = {};
|
this.library = {};
|
||||||
this.position = -1;
|
this.position = -1;
|
||||||
this.media = null;
|
|
||||||
this.drinks = 0;
|
this.drinks = 0;
|
||||||
this.leader = null;
|
this.leader = null;
|
||||||
this.chatbuffer = [];
|
this.chatbuffer = [];
|
||||||
|
|
@ -155,17 +155,25 @@ Channel.prototype.loadDump = function() {
|
||||||
try {
|
try {
|
||||||
this.logger.log("*** Loading channel dump from disk");
|
this.logger.log("*** Loading channel dump from disk");
|
||||||
data = JSON.parse(data);
|
data = JSON.parse(data);
|
||||||
for(var i = 0; i < data.queue.length; i++) {
|
// TODO fix loading
|
||||||
var e = data.queue[i];
|
if(data.queue) {
|
||||||
var m = new Media(e.id, e.title, e.seconds, e.type);
|
for(var i = 0; i < data.queue.length; i++) {
|
||||||
m.queueby = data.queue[i].queueby ? data.queue[i].queueby
|
var e = data.queue[i];
|
||||||
: "";
|
var m = new Media(e.id, e.title, e.seconds, e.type);
|
||||||
if(e.temp !== undefined) {
|
var p = this.playlist.makeItem(m);
|
||||||
m.temp = e.temp;
|
p.queueby = data.queue[i].queueby ? data.queue[i].queueby
|
||||||
|
: "";
|
||||||
|
if(e.temp !== undefined) {
|
||||||
|
p.temp = e.temp;
|
||||||
|
}
|
||||||
|
//this.playlist.append(p);
|
||||||
}
|
}
|
||||||
this.queue.push(m);
|
|
||||||
}
|
}
|
||||||
this.sendAll("playlist", this.queue);
|
else if(data.playlist) {
|
||||||
|
this.playlist = new Playlist(data.playlist);
|
||||||
|
this.playlist.current = this.playlist.find(data.currentUID) || null;
|
||||||
|
}
|
||||||
|
this.sendAll("playlist", this.playlist.toArray());
|
||||||
this.broadcastPlaylistMeta();
|
this.broadcastPlaylistMeta();
|
||||||
// Backwards compatibility
|
// Backwards compatibility
|
||||||
if(data.currentPosition != undefined) {
|
if(data.currentPosition != undefined) {
|
||||||
|
|
@ -176,11 +184,6 @@ Channel.prototype.loadDump = function() {
|
||||||
}
|
}
|
||||||
if(this.position < -1)
|
if(this.position < -1)
|
||||||
this.position = -1;
|
this.position = -1;
|
||||||
if(this.queue.length > 0)
|
|
||||||
this.playNext();
|
|
||||||
if(this.media && data.currentTime) {
|
|
||||||
this.media.currentTime = data.currentTime;
|
|
||||||
}
|
|
||||||
for(var key in data.opts) {
|
for(var key in data.opts) {
|
||||||
// Gotta love backwards compatibility
|
// Gotta love backwards compatibility
|
||||||
if(key == "customcss" || key == "customjs") {
|
if(key == "customcss" || key == "customjs") {
|
||||||
|
|
@ -246,7 +249,7 @@ Channel.prototype.saveDump = function() {
|
||||||
var dump = {
|
var dump = {
|
||||||
position: this.position,
|
position: this.position,
|
||||||
currentTime: this.media ? this.media.currentTime : 0,
|
currentTime: this.media ? this.media.currentTime : 0,
|
||||||
queue: this.queue,
|
playlist: this.playlist.toArray(),
|
||||||
opts: this.opts,
|
opts: this.opts,
|
||||||
permissions: this.permissions,
|
permissions: this.permissions,
|
||||||
filters: filts,
|
filters: filts,
|
||||||
|
|
@ -727,13 +730,13 @@ Channel.prototype.sendChannelRanks = function(user) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.sendPlaylist = function(user) {
|
Channel.prototype.sendPlaylist = function(user) {
|
||||||
user.socket.emit("playlist", this.queue);
|
user.socket.emit("playlist", this.playlist.toArray());
|
||||||
user.socket.emit("setPlaylistMeta", this.plmeta);
|
user.socket.emit("setPlaylistMeta", this.plmeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.sendMediaUpdate = function(user) {
|
Channel.prototype.sendMediaUpdate = function(user) {
|
||||||
if(this.media != null) {
|
if(this.playlist.current != null) {
|
||||||
user.socket.emit("changeMedia", this.media.fullupdate());
|
user.socket.emit("changeMedia", this.playlist.current.media.fullupdate());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -778,12 +781,14 @@ Channel.prototype.sendAllWithPermission = function(perm, msg, data) {
|
||||||
|
|
||||||
Channel.prototype.broadcastPlaylistMeta = function() {
|
Channel.prototype.broadcastPlaylistMeta = function() {
|
||||||
var total = 0;
|
var total = 0;
|
||||||
for(var i = 0; i < this.queue.length; i++) {
|
var iter = this.playlist.first;
|
||||||
total += this.queue[i].seconds;
|
while(iter != null) {
|
||||||
|
total += iter.media.seconds;
|
||||||
|
iter = iter.next;
|
||||||
}
|
}
|
||||||
var timestr = formatTime(total);
|
var timestr = formatTime(total);
|
||||||
var packet = {
|
var packet = {
|
||||||
count: this.queue.length,
|
count: this.playlist.length,
|
||||||
time: timestr
|
time: timestr
|
||||||
};
|
};
|
||||||
this.plmeta = packet;
|
this.plmeta = packet;
|
||||||
|
|
@ -1001,44 +1006,41 @@ function isLive(type) {
|
||||||
|| type == "im";// Imgur album
|
|| type == "im";// Imgur album
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.queueAdd = function(media, after) {
|
Channel.prototype.queueAdd = function(item, after) {
|
||||||
if(after === "") {
|
if(after === "prepend")
|
||||||
this.queue.splice(0, 0, media);
|
this.playlist.prepend(item);
|
||||||
}
|
else if(after === "append")
|
||||||
else {
|
this.playlist.append(item);
|
||||||
for(var i = 0; i < this.queue.length; i++) {
|
else
|
||||||
if(this.queue[i].hash == after) {
|
this.playlist.insertAfter(item, after);
|
||||||
this.queue.splice(i+1, 0, media);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.sendAll("queue", {
|
this.sendAll("queue", {
|
||||||
media: media.pack(),
|
item: item.pack(),
|
||||||
after: after
|
after: after
|
||||||
});
|
});
|
||||||
|
|
||||||
this.broadcastPlaylistMeta();
|
this.broadcastPlaylistMeta();
|
||||||
if(this.queue.length == 1) {
|
if(this.playlist.length == 1)
|
||||||
this.jumpTo(media.hash);
|
this.sendAll("changeMedia", this.playlist.current.media.fullupdate());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.autoTemp = function(media, user) {
|
Channel.prototype.autoTemp = function(item, user) {
|
||||||
if(isLive(media.type)) {
|
if(isLive(item.media.type)) {
|
||||||
media.temp = true;
|
item.temp = true;
|
||||||
}
|
}
|
||||||
if(!this.hasPermission(user, "addnontemp")) {
|
if(!this.hasPermission(user, "addnontemp")) {
|
||||||
media.temp = true;
|
item.temp = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.enqueue = function(data, user, callback) {
|
Channel.prototype.enqueue = function(data, user, callback) {
|
||||||
var after = "";
|
var after = "";
|
||||||
if(data.pos == "next" && this.queue.length > 0 && this.position >= 0) {
|
var current = this.playlist.current;
|
||||||
after = this.queue[this.position].hash;
|
if(data.pos == "next") {
|
||||||
|
after = current ? current.uid : "prepend";
|
||||||
}
|
}
|
||||||
else if(data.pos == "end" && this.queue.length > 0) {
|
else if(data.pos == "end") {
|
||||||
after = this.queue[this.queue.length - 1].hash;
|
after = "append";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isLive(data.type) && !this.hasPermission(user, "playlistaddlive")) {
|
if(isLive(data.type) && !this.hasPermission(user, "playlistaddlive")) {
|
||||||
|
|
@ -1049,9 +1051,10 @@ Channel.prototype.enqueue = function(data, user, callback) {
|
||||||
// Prefer cache over looking up new data
|
// Prefer cache over looking up new data
|
||||||
if(data.id in this.library) {
|
if(data.id in this.library) {
|
||||||
var media = this.library[data.id].dup();
|
var media = this.library[data.id].dup();
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
this.logger.log("*** Queued from cache: id=" + data.id);
|
this.logger.log("*** Queued from cache: id=" + data.id);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
|
|
@ -1072,71 +1075,79 @@ Channel.prototype.enqueue = function(data, user, callback) {
|
||||||
user.socket.emit("queueFail", err);
|
user.socket.emit("queueFail", err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(item);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
this.cacheMedia(media);
|
this.cacheMedia(media);
|
||||||
if(data.type == "yp")
|
if(data.type == "yp")
|
||||||
after = media.hash;
|
after = item.uid;
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
break;
|
break;
|
||||||
case "li":
|
case "li":
|
||||||
var media = new Media(data.id, "Livestream - " + data.id, "--:--", "li");
|
var media = new Media(data.id, "Livestream.com - " + data.id, "--:--", "li");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
break;
|
break;
|
||||||
case "tw":
|
case "tw":
|
||||||
var media = new Media(data.id, "Twitch - " + data.id, "--:--", "tw");
|
var media = new Media(data.id, "Twitch.tv - " + data.id, "--:--", "tw");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
break;
|
break;
|
||||||
case "jt":
|
case "jt":
|
||||||
var media = new Media(data.id, "JustinTV - " + data.id, "--:--", "jt");
|
var media = new Media(data.id, "Justin.tv - " + data.id, "--:--", "jt");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
break;
|
break;
|
||||||
case "us":
|
case "us":
|
||||||
InfoGetter.getUstream(data.id, function(id) {
|
InfoGetter.getUstream(data.id, function(id) {
|
||||||
var media = new Media(id, "Ustream - " + data.id, "--:--", "us");
|
var media = new Media(id, "Ustream.tv - " + data.id, "--:--", "us");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
break;
|
break;
|
||||||
case "rt":
|
case "rt":
|
||||||
var media = new Media(data.id, "Livestream", "--:--", "rt");
|
var media = new Media(data.id, "Livestream", "--:--", "rt");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
break;
|
break;
|
||||||
case "jw":
|
case "jw":
|
||||||
var media = new Media(data.id, "JWPlayer Stream - " + data.id, "--:--", "jw");
|
var media = new Media(data.id, "JWPlayer Stream - " + data.id, "--:--", "jw");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
break;
|
break;
|
||||||
case "im":
|
case "im":
|
||||||
var media = new Media(data.id, "Imgur Album", "--:--", "im");
|
var media = new Media(data.id, "Imgur Album", "--:--", "im");
|
||||||
media.queueby = user ? user.name : "";
|
var item = this.playlist.makeItem(media);
|
||||||
this.autoTemp(media, user);
|
item.queueby = user ? user.name : "";
|
||||||
this.queueAdd(media, after);
|
this.autoTemp(item, user);
|
||||||
|
this.queueAdd(item, after);
|
||||||
if(callback)
|
if(callback)
|
||||||
callback();
|
callback();
|
||||||
break;
|
break;
|
||||||
|
|
@ -1223,19 +1234,13 @@ Channel.prototype.tryQueuePlaylist = function(user, data) {
|
||||||
this.enqueueList(data, user);
|
this.enqueueList(data, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.setTemp = function(hash, temp) {
|
Channel.prototype.setTemp = function(uid, temp) {
|
||||||
var m = false;
|
var item = this.playlist.find(uid);
|
||||||
for(var i = 0; i < this.queue.length; i++) {
|
if(!item)
|
||||||
if(this.queue[i].hash == hash) {
|
|
||||||
m = this.queue[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!m)
|
|
||||||
return;
|
return;
|
||||||
m.temp = temp;
|
item.temp = temp;
|
||||||
this.sendAll("setTemp", {
|
this.sendAll("setTemp", {
|
||||||
hash: hash,
|
uid: uid,
|
||||||
temp: temp
|
temp: temp
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -1248,47 +1253,24 @@ Channel.prototype.trySetTemp = function(user, data) {
|
||||||
if(!this.hasPermission(user, "settemp")) {
|
if(!this.hasPermission(user, "settemp")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(typeof data.hash != "string" || typeof data.temp != "boolean") {
|
if(typeof data.uid != "number" || typeof data.temp != "boolean") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setTemp(data.hash, data.temp);
|
this.setTemp(data.uid, data.temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Channel.prototype.dequeue = function(hash, removeonly) {
|
Channel.prototype.dequeue = function(uid, removeonly) {
|
||||||
var m = false;
|
if(!this.playlist.remove(uid))
|
||||||
var mpos = 0;
|
|
||||||
for(var i = 0; i < this.queue.length; i++) {
|
|
||||||
if(this.queue[i].hash == hash) {
|
|
||||||
mpos = i;
|
|
||||||
m = this.queue[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!m) {
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
this.queue.splice(mpos, 1);
|
|
||||||
this.sendAll("delete", {
|
this.sendAll("delete", {
|
||||||
hash: hash
|
uid: uid
|
||||||
});
|
});
|
||||||
this.broadcastPlaylistMeta();
|
this.broadcastPlaylistMeta();
|
||||||
|
|
||||||
if(removeonly)
|
if(removeonly)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// If you remove the currently playing video, play the next one
|
|
||||||
if(mpos == this.position) {
|
|
||||||
this.position--;
|
|
||||||
this.playNext();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// If you remove a video whose position is before the one currently
|
|
||||||
// playing, you have to reduce the position of the one playing
|
|
||||||
if(mpos < this.position) {
|
|
||||||
this.position--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.tryDequeue = function(user, data) {
|
Channel.prototype.tryDequeue = function(user, data) {
|
||||||
|
|
@ -1296,7 +1278,7 @@ Channel.prototype.tryDequeue = function(user, data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(typeof data !== "string")
|
if(typeof data !== "number")
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.dequeue(data);
|
this.dequeue(data);
|
||||||
|
|
@ -1314,9 +1296,22 @@ Channel.prototype.tryUncache = function(user, data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Channel.prototype.resetVideoMeta = function() {
|
||||||
|
this.voteskip = false;
|
||||||
|
this.broadcastVoteskipUpdate();
|
||||||
|
this.drinks = 0;
|
||||||
|
this.broadcastDrinks();
|
||||||
|
if(this.playlist.current) {
|
||||||
|
this.playlist.current.media["currentTime"];
|
||||||
|
this.playlist.current.media["paused"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Channel.prototype.playNext = function() {
|
Channel.prototype.playNext = function() {
|
||||||
var pos = this.position + 1 >= this.queue.length ? 0 : this.position + 1;
|
this.resetVideoMeta();
|
||||||
this.jumpTo(this.queue[pos].hash);
|
this.playlist.next();
|
||||||
|
if(this.playlist.current)
|
||||||
|
this.sendAll("changeMedia", this.playlist.current.media.fullupdate());
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.tryPlayNext = function(user) {
|
Channel.prototype.tryPlayNext = function(user) {
|
||||||
|
|
@ -1327,50 +1322,19 @@ Channel.prototype.tryPlayNext = function(user) {
|
||||||
this.playNext();
|
this.playNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.jumpTo = function(hash) {
|
Channel.prototype.jumpTo = function(uid) {
|
||||||
var m = false;
|
this.resetVideoMeta();
|
||||||
var mpos = 0;
|
var oid = this.playlist.current ? this.playlist.current.uid : -1;
|
||||||
for(var i = 0; i < this.queue.length; i++) {
|
if(!this.playlist.jump(uid))
|
||||||
if(this.queue[i].hash == hash) {
|
|
||||||
m = this.queue[i];
|
|
||||||
mpos = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!m)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Reset voteskip
|
this.sendAll("changeMedia", this.playlist.current.media.fullupdate());
|
||||||
this.voteskip = false;
|
|
||||||
this.broadcastVoteskipUpdate();
|
|
||||||
this.drinks = 0;
|
|
||||||
this.broadcastDrinks();
|
|
||||||
|
|
||||||
var old = this.position;
|
|
||||||
if(this.media && this.media.temp) {
|
|
||||||
this.dequeue(this.media.hash, true);
|
|
||||||
if(mpos > old && mpos > 0) {
|
|
||||||
mpos--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(this.media) {
|
|
||||||
delete this.media["currentTime"];
|
|
||||||
delete this.media["paused"];
|
|
||||||
}
|
|
||||||
this.position = mpos;
|
|
||||||
var oid = this.media ? this.media.id : "";
|
|
||||||
this.media = m;
|
|
||||||
this.media.currentTime = -1;
|
|
||||||
this.media.paused = false;
|
|
||||||
|
|
||||||
this.sendAll("changeMedia", this.media.fullupdate());
|
|
||||||
|
|
||||||
// If it's not a livestream, enable autolead
|
// If it's not a livestream, enable autolead
|
||||||
if(this.leader == null && !isLive(this.media.type)) {
|
if(this.leader == null && !isLive(this.playlist.current.media.type)) {
|
||||||
this.time = new Date().getTime();
|
this.time = new Date().getTime();
|
||||||
if(this.media.id != oid) {
|
if(this.playlist.current.media.uid != oid) {
|
||||||
mediaUpdate(this, this.media.id);
|
mediaUpdate(this, this.playlist.current.media);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1380,7 +1344,7 @@ Channel.prototype.tryJumpTo = function(user, data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(typeof data !== "string") {
|
if(typeof data !== "number") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1388,10 +1352,8 @@ Channel.prototype.tryJumpTo = function(user, data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.clearqueue = function() {
|
Channel.prototype.clearqueue = function() {
|
||||||
this.queue = [];
|
this.playlist.clear();
|
||||||
for(var i = 0; i < this.users.length; i++) {
|
this.sendAll("playlist", this.playlist.toArray());
|
||||||
this.sendPlaylist(this.users[i]);
|
|
||||||
}
|
|
||||||
this.broadcastPlaylistMeta();
|
this.broadcastPlaylistMeta();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1404,18 +1366,17 @@ Channel.prototype.tryClearqueue = function(user) {
|
||||||
|
|
||||||
Channel.prototype.shufflequeue = function() {
|
Channel.prototype.shufflequeue = function() {
|
||||||
var n = [];
|
var n = [];
|
||||||
var current = false;
|
var pl = this.playlist.toArray();
|
||||||
while(this.queue.length > 0) {
|
var current = pl.current;
|
||||||
var i = parseInt(Math.random() * this.queue.length);
|
while(pl.length > 0) {
|
||||||
n.push(this.queue[i]);
|
var i = parseInt(Math.random() * pl.length);
|
||||||
if(!current && i == this.position) {
|
n.push(pl[i]);
|
||||||
this.position = n.length - 1;
|
pl.splice(i, 1);
|
||||||
current = true;
|
|
||||||
}
|
|
||||||
this.queue.splice(i, 1);
|
|
||||||
}
|
}
|
||||||
this.queue = n;
|
this.playlist = new Playlist(n);
|
||||||
this.sendAll("playlist", this.queue);
|
this.playlist.current = this.playlist.last;
|
||||||
|
this.playNext();
|
||||||
|
this.sendAll("playlist", this.playlist.toArray());
|
||||||
this.sendAll("setPlaylistMeta", this.plmeta);
|
this.sendAll("setPlaylistMeta", this.plmeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1436,54 +1397,44 @@ Channel.prototype.tryUpdate = function(user, data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.media == null) {
|
if(this.playlist.current === null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isLive(this.media.type) && this.media.type != "jw") {
|
if(isLive(this.playlist.current.media.type) && this.playlist.current.media.type != "jw") {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.media.id != data.id) {
|
if(this.playlist.current.media.id != data.id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.media.currentTime = data.currentTime;
|
this.playlist.current.media.currentTime = data.currentTime;
|
||||||
this.media.paused = data.paused;
|
this.playlist.current.media.paused = data.paused;
|
||||||
this.sendAll("mediaUpdate", this.media.timeupdate());
|
this.sendAll("mediaUpdate", this.playlist.current.media.timeupdate());
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.move = function(data, user) {
|
Channel.prototype.move = function(data, user) {
|
||||||
var mfrom = false;
|
var item = this.playlist.find(data.from);
|
||||||
var fromidx = false;
|
if(!this.playlist.remove(data.from)) {
|
||||||
var mafter = false;
|
console.log("remove failed");
|
||||||
var toidx = false;
|
return;
|
||||||
// Find the two elements
|
|
||||||
for(var i = 0; i < this.queue.length; i++) {
|
|
||||||
if(this.queue[i].hash == data.from) {
|
|
||||||
mfrom = this.queue[i];
|
|
||||||
fromidx = i;
|
|
||||||
if(data.after === "" || mafter)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(this.queue[i].hash == data.after) {
|
|
||||||
mafter = this.queue[i];
|
|
||||||
toidx = i+1;
|
|
||||||
if(mfrom)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.queue.splice(fromidx, 1);
|
if(data.after === "prepend") {
|
||||||
if(data.after === "") {
|
if(!this.playlist.prepend(item)) {
|
||||||
this.queue.splice(0, 0, mfrom);
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else if(data.after === "append") {
|
||||||
var to = toidx;
|
if(!this.playlist.append(item)) {
|
||||||
if(fromidx < toidx)
|
return;
|
||||||
toidx--;
|
}
|
||||||
this.queue.splice(toidx, 0, mfrom);
|
|
||||||
}
|
}
|
||||||
|
else if(!this.playlist.insertAfter(item, data.after)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var moveby = user && user.name ? user.name : null;
|
var moveby = user && user.name ? user.name : null;
|
||||||
if(typeof data.moveby !== "undefined")
|
if(typeof data.moveby !== "undefined")
|
||||||
moveby = data.moveby;
|
moveby = data.moveby;
|
||||||
|
|
@ -1493,18 +1444,6 @@ Channel.prototype.move = function(data, user) {
|
||||||
after: data.after,
|
after: data.after,
|
||||||
moveby: moveby
|
moveby: moveby
|
||||||
});
|
});
|
||||||
|
|
||||||
// Account for moving things around the active video
|
|
||||||
if(fromidx < this.position && toidx >= this.position) {
|
|
||||||
this.position--;
|
|
||||||
}
|
|
||||||
else if(fromidx > this.position && toidx <= this.position) {
|
|
||||||
this.position++
|
|
||||||
}
|
|
||||||
else if(fromidx == this.position) {
|
|
||||||
this.position = toidx;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel.prototype.tryMove = function(user, data) {
|
Channel.prototype.tryMove = function(user, data) {
|
||||||
|
|
@ -1512,7 +1451,7 @@ Channel.prototype.tryMove = function(user, data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(typeof data.from !== "string" || typeof data.after !== "string")
|
if(typeof data.from !== "number" || (typeof data.after !== "number" && typeof data.after !== "string"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.move(data, user);
|
this.move(data, user);
|
||||||
|
|
@ -1981,11 +1920,11 @@ Channel.prototype.changeLeader = function(name) {
|
||||||
}
|
}
|
||||||
if(name == "") {
|
if(name == "") {
|
||||||
this.logger.log("*** Resuming autolead");
|
this.logger.log("*** Resuming autolead");
|
||||||
if(this.media != null && !isLive(this.media.type)) {
|
if(this.playlist.current != null && !isLive(this.playlist.current.media.type)) {
|
||||||
this.media.paused = false;
|
this.playlist.current.media.paused = false;
|
||||||
this.time = new Date().getTime();
|
this.time = new Date().getTime();
|
||||||
this.i = 0;
|
this.i = 0;
|
||||||
mediaUpdate(this, this.media.id);
|
mediaUpdate(this, this.playlist.current.media.id);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
193
playlist.js
Normal file
193
playlist.js
Normal file
|
|
@ -0,0 +1,193 @@
|
||||||
|
function PlaylistItem(media, uid) {
|
||||||
|
this.media = media;
|
||||||
|
this.uid = uid;
|
||||||
|
this.temp = false;
|
||||||
|
this.queueby = "";
|
||||||
|
this.prev = null;
|
||||||
|
this.next = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
PlaylistItem.prototype.pack = function() {
|
||||||
|
return {
|
||||||
|
media: this.media,
|
||||||
|
uid: this.uid,
|
||||||
|
temp: this.temp,
|
||||||
|
queueby: this.queueby
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function Playlist(items) {
|
||||||
|
this.next_uid = 0;
|
||||||
|
this.first = null;
|
||||||
|
this.last = null;
|
||||||
|
this.current = null;
|
||||||
|
this.length = 0;
|
||||||
|
|
||||||
|
if(items !== undefined) {
|
||||||
|
items.forEach(function(it) {
|
||||||
|
this.append(it);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.makeItem = function(media) {
|
||||||
|
return new PlaylistItem(media, this.next_uid++);
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.find = function(uid) {
|
||||||
|
if(this.first === null)
|
||||||
|
return false;
|
||||||
|
var item = this.first;
|
||||||
|
var iter = this.first;
|
||||||
|
while(iter != null && item.uid != uid) {
|
||||||
|
item = iter;
|
||||||
|
iter = iter.next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(item && item.uid == uid)
|
||||||
|
return item;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.prepend = function(plitem) {
|
||||||
|
if(this.first !== null) {
|
||||||
|
plitem.next = this.first;
|
||||||
|
this.first.prev = plitem;
|
||||||
|
}
|
||||||
|
// prepending to empty list
|
||||||
|
else {
|
||||||
|
this.current = plitem;
|
||||||
|
this.last = plitem;
|
||||||
|
}
|
||||||
|
this.first = plitem;
|
||||||
|
this.first.prev = null;
|
||||||
|
this.length++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.append = function(plitem) {
|
||||||
|
if(this.last != null) {
|
||||||
|
plitem.prev = this.last;
|
||||||
|
this.last.next = plitem;
|
||||||
|
}
|
||||||
|
// appending to empty list
|
||||||
|
else {
|
||||||
|
this.first = plitem;
|
||||||
|
this.current = plitem;
|
||||||
|
}
|
||||||
|
this.last = plitem;
|
||||||
|
this.last.next = null;
|
||||||
|
this.length++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.insertAfter = function(plitem, uid) {
|
||||||
|
var item = this.find(uid);
|
||||||
|
|
||||||
|
if(item) {
|
||||||
|
plitem.next = item.next;
|
||||||
|
plitem.prev = item;
|
||||||
|
item.next = plitem;
|
||||||
|
if(item == this.last) {
|
||||||
|
this.last = plitem;
|
||||||
|
}
|
||||||
|
this.length++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.remove = function(uid, next) {
|
||||||
|
var item = this.find(uid);
|
||||||
|
if(!item)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if(item == this.first)
|
||||||
|
this.first = item.next;
|
||||||
|
if(item == this.last)
|
||||||
|
this.last = item.prev;
|
||||||
|
|
||||||
|
if(item.prev)
|
||||||
|
item.prev.next = item.next;
|
||||||
|
if(item.next)
|
||||||
|
item.next.prev = item.prev;
|
||||||
|
|
||||||
|
if(this.current == item && next)
|
||||||
|
this._next();
|
||||||
|
|
||||||
|
this.length--;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.next = function() {
|
||||||
|
if(!this.current)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var it = this.current;
|
||||||
|
this._next();
|
||||||
|
|
||||||
|
if(it.temp) {
|
||||||
|
this.remove(it.uid, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.current;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype._next = function() {
|
||||||
|
if(!this.current)
|
||||||
|
return;
|
||||||
|
this.current = this.current.next;
|
||||||
|
if(this.current === null && this.first !== null)
|
||||||
|
this.current = this.first;
|
||||||
|
|
||||||
|
if(this.current) {
|
||||||
|
this.current.media.paused = false;
|
||||||
|
this.current.media.currentTime = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.jump = function(uid) {
|
||||||
|
if(!this.current)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var jmp = this.find(uid);
|
||||||
|
if(!jmp)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var it = this.current;
|
||||||
|
|
||||||
|
this.current = jmp;
|
||||||
|
|
||||||
|
if(this.current) {
|
||||||
|
this.current.media.paused = false;
|
||||||
|
this.current.media.currentTime = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(it.temp) {
|
||||||
|
this.remove(it.uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.current;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.toArray = function() {
|
||||||
|
var arr = [];
|
||||||
|
var item = this.first;
|
||||||
|
while(item != null) {
|
||||||
|
arr.push(item.pack());
|
||||||
|
item = item.next;
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.clear = function() {
|
||||||
|
this.first = null;
|
||||||
|
this.last = null;
|
||||||
|
this.current = null;
|
||||||
|
this.length = 0;
|
||||||
|
this.next_uid = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Playlist;
|
||||||
|
|
@ -649,24 +649,27 @@ Callbacks = {
|
||||||
},
|
},
|
||||||
|
|
||||||
queue: function(data) {
|
queue: function(data) {
|
||||||
var li = makeQueueEntry(data.media, true);
|
var li = makeQueueEntry(data.item, true);
|
||||||
li.hide();
|
li.hide();
|
||||||
var q = $("#queue");
|
var q = $("#queue");
|
||||||
li.attr("title", data.media.queueby
|
li.attr("title", data.item.queueby
|
||||||
? ("Added by: " + data.media.queueby)
|
? ("Added by: " + data.item.queueby)
|
||||||
: "Added by: Unknown");
|
: "Added by: Unknown");
|
||||||
if(data.after == "") {
|
if(data.after === "prepend") {
|
||||||
li.prependTo(q);
|
li.prependTo(q);
|
||||||
li.show("blind");
|
li.show("blind");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var qli = q.find("li");
|
else if(data.after === "append") {
|
||||||
for(var i = 0; i < qli.length; i++) {
|
li.appendTo(q);
|
||||||
if($(qli[i]).data("hash") == data.after) {
|
li.show("blind");
|
||||||
li.insertAfter(qli[i]);
|
}
|
||||||
li.show("blind");
|
else {
|
||||||
return;
|
var liafter = $(".pluid-" + data.after);
|
||||||
}
|
if(liafter.length == 0)
|
||||||
|
return false;
|
||||||
|
li.insertAfter(liafter);
|
||||||
|
li.show("blind");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -680,20 +683,15 @@ Callbacks = {
|
||||||
},
|
},
|
||||||
|
|
||||||
setTemp: function(data) {
|
setTemp: function(data) {
|
||||||
var li = false;
|
var li = $(".pluid-" + data.uid);
|
||||||
var qli = $("#queue li");
|
if(li.length == 0)
|
||||||
for(var i = 0; i < qli.length; i++) {
|
return false;
|
||||||
if($(qli[i]).data("hash") == data.hash) {
|
|
||||||
li = $(qli[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!li)
|
|
||||||
return;
|
|
||||||
if(data.temp)
|
if(data.temp)
|
||||||
li.addClass("queue_temp");
|
li.addClass("queue_temp");
|
||||||
else
|
else
|
||||||
li.removeClass("queue_temp");
|
li.removeClass("queue_temp");
|
||||||
|
|
||||||
var btn = li.find(".qbtn-tmp");
|
var btn = li.find(".qbtn-tmp");
|
||||||
if(btn.length > 0) {
|
if(btn.length > 0) {
|
||||||
btn.data("temp", data.temp);
|
btn.data("temp", data.temp);
|
||||||
|
|
@ -709,16 +707,7 @@ Callbacks = {
|
||||||
},
|
},
|
||||||
|
|
||||||
"delete": function(data) {
|
"delete": function(data) {
|
||||||
var li = false;
|
var li = $(".pluid-" + data.uid);
|
||||||
var qli = $("#queue li");
|
|
||||||
for(var i = 0; i < qli.length; i++) {
|
|
||||||
if($(qli[i]).data("hash") == data.hash) {
|
|
||||||
li = $(qli[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!li)
|
|
||||||
return;
|
|
||||||
li.hide("blind", function() {
|
li.hide("blind", function() {
|
||||||
li.remove();
|
li.remove();
|
||||||
});
|
});
|
||||||
|
|
@ -730,23 +719,17 @@ Callbacks = {
|
||||||
},
|
},
|
||||||
|
|
||||||
changeMedia: function(data) {
|
changeMedia: function(data) {
|
||||||
MEDIA = data;
|
PL_CURRENT = data.uid;
|
||||||
var qli = $("#queue li");
|
var qli = $("#queue li");
|
||||||
var li = false;
|
|
||||||
$("#queue li").removeClass("queue_active");
|
$("#queue li").removeClass("queue_active");
|
||||||
for(var i = 0; i < qli.length; i++) {
|
var li = $(".pluid-" + data.uid);
|
||||||
if($(qli[i]).data("hash") == MEDIA.hash) {
|
if(li.length == 0)
|
||||||
$(qli[i]).addClass("queue_active");
|
return false;
|
||||||
li = $(qli[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(li) {
|
li.addClass("queue_active");
|
||||||
$("#queue").scrollTop(0);
|
$("#queue").scrollTop(0);
|
||||||
var scroll = li.position().top - $("#queue").position().top;
|
var scroll = li.position().top - $("#queue").position().top;
|
||||||
$("#queue").scrollTop(scroll);
|
$("#queue").scrollTop(scroll);
|
||||||
}
|
|
||||||
|
|
||||||
if(CHANNEL.opts.allow_voteskip)
|
if(CHANNEL.opts.allow_voteskip)
|
||||||
$("#voteskip").attr("disabled", false);
|
$("#voteskip").attr("disabled", false);
|
||||||
|
|
@ -978,10 +961,14 @@ Callbacks = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var SOCKET_DEBUG = true;
|
||||||
setupCallbacks = function() {
|
setupCallbacks = function() {
|
||||||
for(var key in Callbacks) {
|
for(var key in Callbacks) {
|
||||||
(function(key) {
|
(function(key) {
|
||||||
socket.on(key, function(data) {
|
socket.on(key, function(data) {
|
||||||
|
if(SOCKET_DEBUG)
|
||||||
|
console.log(key, data);
|
||||||
Callbacks[key](data);
|
Callbacks[key](data);
|
||||||
});
|
});
|
||||||
})(key);
|
})(key);
|
||||||
|
|
|
||||||
|
|
@ -203,14 +203,14 @@ $("#userpl_save").click(function() {
|
||||||
|
|
||||||
$("#queue").sortable({
|
$("#queue").sortable({
|
||||||
start: function(ev, ui) {
|
start: function(ev, ui) {
|
||||||
PL_FROM = ui.item.data("hash");
|
PL_FROM = ui.item.data("uid");
|
||||||
},
|
},
|
||||||
update: function(ev, ui) {
|
update: function(ev, ui) {
|
||||||
var prev = ui.item.prevAll();
|
var prev = ui.item.prevAll();
|
||||||
if(prev.length == 0)
|
if(prev.length == 0)
|
||||||
PL_AFTER = "";
|
PL_AFTER = "prepend";
|
||||||
else
|
else
|
||||||
PL_AFTER = $(prev[0]).data("hash");
|
PL_AFTER = $(prev[0]).data("uid");
|
||||||
socket.emit("moveMedia", {
|
socket.emit("moveMedia", {
|
||||||
from: PL_FROM,
|
from: PL_FROM,
|
||||||
after: PL_AFTER
|
after: PL_AFTER
|
||||||
|
|
|
||||||
|
|
@ -204,11 +204,14 @@ function addUserDropdown(entry, name) {
|
||||||
|
|
||||||
/* queue stuff */
|
/* queue stuff */
|
||||||
|
|
||||||
function makeQueueEntry(video, addbtns) {
|
function makeQueueEntry(item, addbtns) {
|
||||||
|
var video = item.media;
|
||||||
var li = $("<li/>");
|
var li = $("<li/>");
|
||||||
li.addClass("queue_entry");
|
li.addClass("queue_entry");
|
||||||
|
li.addClass("pluid-" + item.uid);
|
||||||
|
li.data("uid", item.uid);
|
||||||
li.data("media", video);
|
li.data("media", video);
|
||||||
li.data("hash", video.hash);
|
li.data("temp", item.temp);
|
||||||
if(video.thumb) {
|
if(video.thumb) {
|
||||||
$("<img/>").attr("src", video.thumb.url)
|
$("<img/>").attr("src", video.thumb.url)
|
||||||
.css("float", "left")
|
.css("float", "left")
|
||||||
|
|
@ -222,7 +225,7 @@ function makeQueueEntry(video, addbtns) {
|
||||||
var time = $("<span/>").addClass("qe_time").appendTo(li);
|
var time = $("<span/>").addClass("qe_time").appendTo(li);
|
||||||
time.text(video.duration);
|
time.text(video.duration);
|
||||||
var clear = $("<div/>").addClass("qe_clear").appendTo(li);
|
var clear = $("<div/>").addClass("qe_clear").appendTo(li);
|
||||||
if(video.temp) {
|
if(item.temp) {
|
||||||
li.addClass("queue_temp");
|
li.addClass("queue_temp");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -231,6 +234,27 @@ function makeQueueEntry(video, addbtns) {
|
||||||
return li;
|
return li;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function makeSearchEntry(video) {
|
||||||
|
var li = $("<li/>");
|
||||||
|
li.addClass("queue_entry");
|
||||||
|
li.data("media", video);
|
||||||
|
if(video.thumb) {
|
||||||
|
$("<img/>").attr("src", video.thumb.url)
|
||||||
|
.css("float", "left")
|
||||||
|
.css("clear", "both")
|
||||||
|
.appendTo(li);
|
||||||
|
}
|
||||||
|
var title = $("<a/>").addClass("qe_title").appendTo(li)
|
||||||
|
.text(video.title)
|
||||||
|
.attr("href", formatURL(video))
|
||||||
|
.attr("target", "_blank");
|
||||||
|
var time = $("<span/>").addClass("qe_time").appendTo(li);
|
||||||
|
time.text(video.duration);
|
||||||
|
var clear = $("<div/>").addClass("qe_clear").appendTo(li);
|
||||||
|
|
||||||
|
return li;
|
||||||
|
}
|
||||||
|
|
||||||
function addQueueButtons(li) {
|
function addQueueButtons(li) {
|
||||||
li.find(".btn-group").remove();
|
li.find(".btn-group").remove();
|
||||||
var menu = $("<div/>").addClass("btn-group").appendTo(li);
|
var menu = $("<div/>").addClass("btn-group").appendTo(li);
|
||||||
|
|
@ -239,7 +263,7 @@ function addQueueButtons(li) {
|
||||||
$("<button/>").addClass("btn btn-mini qbtn-play")
|
$("<button/>").addClass("btn btn-mini qbtn-play")
|
||||||
.html("<i class='icon-play'></i>Play")
|
.html("<i class='icon-play'></i>Play")
|
||||||
.click(function() {
|
.click(function() {
|
||||||
socket.emit("jumpTo", li.data("hash"));
|
socket.emit("jumpTo", li.data("uid"));
|
||||||
})
|
})
|
||||||
.appendTo(menu);
|
.appendTo(menu);
|
||||||
}
|
}
|
||||||
|
|
@ -249,8 +273,8 @@ function addQueueButtons(li) {
|
||||||
.html("<i class='icon-share-alt'></i>Queue Next")
|
.html("<i class='icon-share-alt'></i>Queue Next")
|
||||||
.click(function() {
|
.click(function() {
|
||||||
socket.emit("moveMedia", {
|
socket.emit("moveMedia", {
|
||||||
from: li.data("hash"),
|
from: li.data("uid"),
|
||||||
after: MEDIA.hash,
|
after: PL_CURRENT,
|
||||||
moveby: null
|
moveby: null
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
@ -258,13 +282,13 @@ function addQueueButtons(li) {
|
||||||
}
|
}
|
||||||
// Temp/Untemp
|
// Temp/Untemp
|
||||||
if(hasPermission("settemp")) {
|
if(hasPermission("settemp")) {
|
||||||
var tempstr = li.data("media").temp?"Make Permanent":"Make Temporary";
|
var tempstr = li.data("temp")?"Make Permanent":"Make Temporary";
|
||||||
$("<button/>").addClass("btn btn-mini qbtn-tmp")
|
$("<button/>").addClass("btn btn-mini qbtn-tmp")
|
||||||
.html("<i class='icon-flag'></i>" + tempstr)
|
.html("<i class='icon-flag'></i>" + tempstr)
|
||||||
.click(function() {
|
.click(function() {
|
||||||
var temp = li.find(".qbtn-tmp").data("temp");
|
var temp = li.find(".qbtn-tmp").data("temp");
|
||||||
socket.emit("setTemp", {
|
socket.emit("setTemp", {
|
||||||
hash: li.data("hash"),
|
uid: li.data("uid"),
|
||||||
temp: !temp
|
temp: !temp
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
@ -275,7 +299,7 @@ function addQueueButtons(li) {
|
||||||
$("<button/>").addClass("btn btn-mini qbtn-delete")
|
$("<button/>").addClass("btn btn-mini qbtn-delete")
|
||||||
.html("<i class='icon-trash'></i>Delete")
|
.html("<i class='icon-trash'></i>Delete")
|
||||||
.click(function() {
|
.click(function() {
|
||||||
socket.emit("delete", li.data("hash"));
|
socket.emit("delete", li.data("uid"));
|
||||||
})
|
})
|
||||||
.appendTo(menu);
|
.appendTo(menu);
|
||||||
}
|
}
|
||||||
|
|
@ -879,7 +903,7 @@ function loadSearchPage(page) {
|
||||||
var results = $("#library").data("entries");
|
var results = $("#library").data("entries");
|
||||||
var start = page * 100;
|
var start = page * 100;
|
||||||
for(var i = start; i < start + 100 && i < results.length; i++) {
|
for(var i = start; i < start + 100 && i < results.length; i++) {
|
||||||
var li = makeQueueEntry(results[i], false);
|
var li = makeSearchEntry(results[i], false);
|
||||||
if(hasPermission("playlistadd")) {
|
if(hasPermission("playlistadd")) {
|
||||||
if(results[i].thumb) {
|
if(results[i].thumb) {
|
||||||
addLibraryButtons(li, results[i].id, "yt");
|
addLibraryButtons(li, results[i].id, "yt");
|
||||||
|
|
@ -945,32 +969,30 @@ function addLibraryButtons(li, id, type) {
|
||||||
/* queue stuff */
|
/* queue stuff */
|
||||||
|
|
||||||
function playlistMove(from, after) {
|
function playlistMove(from, after) {
|
||||||
var lifrom = false;
|
var lifrom = $(".pluid-" + from);
|
||||||
var liafter = false;
|
if(lifrom.length == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
var q = $("#queue");
|
var q = $("#queue");
|
||||||
var qli = $("#queue li");
|
|
||||||
for(var i = 0; i < qli.length; i++) {
|
if(after === "prepend") {
|
||||||
if($(qli[i]).data("hash") == from) {
|
|
||||||
lifrom = $(qli[i]);
|
|
||||||
if(after === "" || liafter)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if($(qli[i]).data("hash") == after) {
|
|
||||||
liafter = qli[i];
|
|
||||||
if(lifrom)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!lifrom)
|
|
||||||
return;
|
|
||||||
if(after === "") {
|
|
||||||
lifrom.hide("blind", function() {
|
lifrom.hide("blind", function() {
|
||||||
lifrom.detach();
|
lifrom.detach();
|
||||||
lifrom.prependTo(q);
|
lifrom.prependTo(q);
|
||||||
lifrom.show("blind");
|
lifrom.show("blind");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else if(after === "append") {
|
||||||
|
lifrom.hide("blind", function() {
|
||||||
|
lifrom.detach();
|
||||||
|
lifrom.appendTo(q);
|
||||||
|
lifrom.show("blind");
|
||||||
|
});
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
|
var liafter = $(".pluid-" + after);
|
||||||
|
if(liafter.length == 0)
|
||||||
|
return false;
|
||||||
lifrom.hide("blind", function() {
|
lifrom.hide("blind", function() {
|
||||||
lifrom.detach();
|
lifrom.detach();
|
||||||
lifrom.insertAfter(liafter);
|
lifrom.insertAfter(liafter);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue