Implement UID method of playlist management (#182)
This commit is contained in:
parent
d9fc17e0f3
commit
0868ef647d
6 changed files with 251 additions and 189 deletions
|
|
@ -649,25 +649,25 @@ Callbacks = {
|
|||
},
|
||||
|
||||
queue: function(data) {
|
||||
// Wait until pending movements are completed
|
||||
if(PL_MOVING || PL_ADDING || PL_DELETING) {
|
||||
setTimeout(function() {
|
||||
Callbacks.queue(data);
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
var li = makeQueueEntry(data.media, true);
|
||||
li.hide();
|
||||
var idx = data.pos;
|
||||
var q = $("#queue");
|
||||
li.attr("title", data.media.queueby
|
||||
? ("Added by: " + data.media.queueby)
|
||||
: "Added by: Unknown");
|
||||
if(idx < q.children().length - 1)
|
||||
li.insertBefore(q.children()[idx])
|
||||
else
|
||||
li.appendTo(q);
|
||||
li.show("blind");
|
||||
if(data.after == "") {
|
||||
li.prependTo(q);
|
||||
li.show("blind");
|
||||
return;
|
||||
}
|
||||
var qli = q.find("li");
|
||||
for(var i = 0; i < qli.length; i++) {
|
||||
if($(qli[i]).data("hash") == data.after) {
|
||||
li.insertAfter(qli[i]);
|
||||
li.show("blind");
|
||||
return;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
queueFail: function(data) {
|
||||
|
|
@ -680,89 +680,79 @@ Callbacks = {
|
|||
},
|
||||
|
||||
setTemp: function(data) {
|
||||
var li = $("#queue").children()[data.position];
|
||||
li = $(li);
|
||||
var li = false;
|
||||
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;
|
||||
if(data.temp)
|
||||
li.addClass("queue_temp");
|
||||
else
|
||||
li.removeClass("queue_temp");
|
||||
var btn = li.find(".qbtn-tmp");
|
||||
btn.data("temp", data.temp);
|
||||
if(data.temp) {
|
||||
btn.html(btn.html().replace("Make Temporary",
|
||||
"Make Permanent"));
|
||||
}
|
||||
else {
|
||||
btn.html(btn.html().replace("Make Permanent",
|
||||
"Make Temporary"));
|
||||
if(btn.length > 0) {
|
||||
btn.data("temp", data.temp);
|
||||
if(data.temp) {
|
||||
btn.html(btn.html().replace("Make Temporary",
|
||||
"Make Permanent"));
|
||||
}
|
||||
else {
|
||||
btn.html(btn.html().replace("Make Permanent",
|
||||
"Make Temporary"));
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"delete": function(data) {
|
||||
// Wait until any pending manipulation is finished
|
||||
if(PL_MOVING || PL_ADDING || PL_DELETING) {
|
||||
setTimeout(function() {
|
||||
Callbacks["delete"](data);
|
||||
}, 100);
|
||||
return;
|
||||
var li = false;
|
||||
var qli = $("#queue li");
|
||||
for(var i = 0; i < qli.length; i++) {
|
||||
if($(qli[i]).data("hash") == data.hash) {
|
||||
li = $(qli[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
var li = $("#queue").children()[data.position];
|
||||
$(li).remove();
|
||||
if(!li)
|
||||
return;
|
||||
li.hide("blind", function() {
|
||||
li.remove();
|
||||
});
|
||||
},
|
||||
|
||||
moveVideo: function(data) {
|
||||
// Wait until any pending manipulation is finished
|
||||
if(PL_MOVING || PL_ADDING || PL_DELETING) {
|
||||
setTimeout(function() {
|
||||
Callbacks.moveVideo(position);
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
if(data.from < POSITION && data.to >= POSITION)
|
||||
POSITION--;
|
||||
else if(data.from > POSITION && data.to <= POSITION)
|
||||
POSITION++;
|
||||
else if(data.from == POSITION)
|
||||
POSITION = data.to;
|
||||
if(data.moveby != CLIENT.name)
|
||||
playlistMove(data.from, data.to);
|
||||
},
|
||||
|
||||
setPosition: function(position) {
|
||||
// Wait until any pending manipulation is finished
|
||||
if(PL_MOVING || PL_ADDING || PL_DELETING) {
|
||||
setTimeout(function() {
|
||||
Callbacks.setPosition(position);
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
$("#queue li").each(function() {
|
||||
$(this).removeClass("queue_active");
|
||||
});
|
||||
if(position < 0)
|
||||
return;
|
||||
POSITION = position;
|
||||
var linew = $("#queue").children()[POSITION];
|
||||
// jQuery UI's sortable thingy kinda fucks this up initially
|
||||
// Wait until it's done
|
||||
if(!$(linew).hasClass("queue_entry")) {
|
||||
setTimeout(function() {
|
||||
Callbacks.setPosition(position);
|
||||
}, 100);
|
||||
return;
|
||||
}
|
||||
$(linew).addClass("queue_active");
|
||||
|
||||
$("#queue").scrollTop(0);
|
||||
var scroll = $(linew).position().top - $("#queue").position().top;
|
||||
$("#queue").scrollTop(scroll);
|
||||
|
||||
if(CHANNEL.opts.allow_voteskip)
|
||||
$("#voteskip").attr("disabled", false);
|
||||
playlistMove(data.from, data.after);
|
||||
},
|
||||
|
||||
changeMedia: function(data) {
|
||||
MEDIA = data;
|
||||
var qli = $("#queue li");
|
||||
var li = false;
|
||||
$("#queue li").removeClass("queue_active");
|
||||
for(var i = 0; i < qli.length; i++) {
|
||||
if($(qli[i]).data("hash") == MEDIA.hash) {
|
||||
$(qli[i]).addClass("queue_active");
|
||||
li = $(qli[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(li) {
|
||||
$("#queue").scrollTop(0);
|
||||
var scroll = li.position().top - $("#queue").position().top;
|
||||
$("#queue").scrollTop(scroll);
|
||||
}
|
||||
|
||||
if(CHANNEL.opts.allow_voteskip)
|
||||
$("#voteskip").attr("disabled", false);
|
||||
|
||||
$("#currenttitle").text("Currently Playing: " + data.title);
|
||||
|
||||
if(data.type != "sc" && PLAYER.type == "sc")
|
||||
// [](/goddamnitmango)
|
||||
fixSoundcloudShit();
|
||||
|
|
@ -858,7 +848,6 @@ Callbacks = {
|
|||
for(var i = 0; i < data.options.length; i++) {
|
||||
(function(i) {
|
||||
var callback = function() {
|
||||
console.log("vote", i);
|
||||
socket.emit("vote", {
|
||||
option: i
|
||||
});
|
||||
|
|
@ -990,7 +979,6 @@ Callbacks = {
|
|||
}
|
||||
}
|
||||
setupCallbacks = function() {
|
||||
console.log(socket);
|
||||
for(var key in Callbacks) {
|
||||
(function(key) {
|
||||
socket.on(key, function(data) {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ if($("#ytapiplayer").length > 0) {
|
|||
var VWIDTH = $("#ytapiplayer").parent().css("width").replace("px", "");
|
||||
var VHEIGHT = ""+parseInt(parseInt(VWIDTH) * 9 / 16);
|
||||
}
|
||||
var POSITION = -1;
|
||||
var MEDIA = { hash: "" };
|
||||
var PL_MOVING = false;
|
||||
var PL_ADDING = false;
|
||||
var PL_DELETING = false;
|
||||
|
|
@ -63,8 +63,8 @@ var KICKED = false;
|
|||
var NAME = readCookie("cytube_uname");
|
||||
var SESSION = readCookie("cytube_session");
|
||||
var LEADTMR = false;
|
||||
var PL_FROM = 0;
|
||||
var PL_TO = 0;
|
||||
var PL_FROM = "";
|
||||
var PL_AFTER = "";
|
||||
var FILTER_FROM = 0;
|
||||
var FILTER_TO = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -203,16 +203,18 @@ $("#userpl_save").click(function() {
|
|||
|
||||
$("#queue").sortable({
|
||||
start: function(ev, ui) {
|
||||
PL_FROM = ui.item.prevAll().length;
|
||||
PL_FROM = ui.item.data("hash");
|
||||
},
|
||||
update: function(ev, ui) {
|
||||
PL_TO = ui.item.prevAll().length;
|
||||
if(PL_TO != PL_FROM) {
|
||||
socket.emit("moveMedia", {
|
||||
from: PL_FROM,
|
||||
to: PL_TO
|
||||
});
|
||||
}
|
||||
var prev = ui.item.prevAll();
|
||||
if(prev.length == 0)
|
||||
PL_AFTER = "";
|
||||
else
|
||||
PL_AFTER = $(prev[0]).data("hash");
|
||||
socket.emit("moveMedia", {
|
||||
from: PL_FROM,
|
||||
after: PL_AFTER
|
||||
});
|
||||
}
|
||||
});
|
||||
$("#queue").disableSelection();
|
||||
|
|
|
|||
|
|
@ -208,6 +208,7 @@ function makeQueueEntry(video, addbtns) {
|
|||
var li = $("<li/>");
|
||||
li.addClass("queue_entry");
|
||||
li.data("media", video);
|
||||
li.data("hash", video.hash);
|
||||
if(video.thumb) {
|
||||
$("<img/>").attr("src", video.thumb.url)
|
||||
.css("float", "left")
|
||||
|
|
@ -238,8 +239,7 @@ function addQueueButtons(li) {
|
|||
$("<button/>").addClass("btn btn-mini qbtn-play")
|
||||
.html("<i class='icon-play'></i>Play")
|
||||
.click(function() {
|
||||
var i = $("#queue").children().index(li);
|
||||
socket.emit("jumpTo", i);
|
||||
socket.emit("jumpTo", li.data("hash"));
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
|
|
@ -248,10 +248,9 @@ function addQueueButtons(li) {
|
|||
$("<button/>").addClass("btn btn-mini qbtn-next")
|
||||
.html("<i class='icon-share-alt'></i>Queue Next")
|
||||
.click(function() {
|
||||
var i = $("#queue").children().index(li);
|
||||
socket.emit("moveMedia", {
|
||||
from: i,
|
||||
to: i < POSITION ? POSITION : POSITION + 1,
|
||||
from: li.data("hash"),
|
||||
after: MEDIA.hash,
|
||||
moveby: null
|
||||
});
|
||||
})
|
||||
|
|
@ -263,10 +262,9 @@ function addQueueButtons(li) {
|
|||
$("<button/>").addClass("btn btn-mini qbtn-tmp")
|
||||
.html("<i class='icon-flag'></i>" + tempstr)
|
||||
.click(function() {
|
||||
var i = $("#queue").children().index(li);
|
||||
var temp = li.find(".qbtn-tmp").data("temp");
|
||||
socket.emit("setTemp", {
|
||||
position: i,
|
||||
hash: li.data("hash"),
|
||||
temp: !temp
|
||||
});
|
||||
})
|
||||
|
|
@ -277,8 +275,7 @@ function addQueueButtons(li) {
|
|||
$("<button/>").addClass("btn btn-mini qbtn-delete")
|
||||
.html("<i class='icon-trash'></i>Delete")
|
||||
.click(function() {
|
||||
var i = $("#queue").children().index(li);
|
||||
socket.emit("delete", i);
|
||||
socket.emit("delete", li.data("hash"));
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
|
|
@ -947,24 +944,39 @@ function addLibraryButtons(li, id, type) {
|
|||
|
||||
/* queue stuff */
|
||||
|
||||
function playlistMove(from, to) {
|
||||
if(from < 0 || to < 0)
|
||||
return false;
|
||||
function playlistMove(from, after) {
|
||||
var lifrom = false;
|
||||
var liafter = false;
|
||||
var q = $("#queue");
|
||||
if(from >= q.children().length)
|
||||
return false;
|
||||
|
||||
MOVING = true;
|
||||
var old = $(q.children()[from]);
|
||||
old.hide("blind", function() {
|
||||
old.detach();
|
||||
if(to >= q.children().length)
|
||||
old.appendTo(q);
|
||||
else
|
||||
old.insertBefore(q.children()[to]);
|
||||
old.show("blind");
|
||||
MOVING = false;
|
||||
});
|
||||
var qli = $("#queue li");
|
||||
for(var i = 0; i < qli.length; i++) {
|
||||
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.detach();
|
||||
lifrom.prependTo(q);
|
||||
lifrom.show("blind");
|
||||
});
|
||||
}
|
||||
else {
|
||||
lifrom.hide("blind", function() {
|
||||
lifrom.detach();
|
||||
lifrom.insertAfter(liafter);
|
||||
lifrom.show("blind");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function parseMediaLink(url) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue