Implement UID method of playlist management (#182)

This commit is contained in:
calzoneman 2013-06-27 18:15:29 -04:00
parent d9fc17e0f3
commit 0868ef647d
6 changed files with 251 additions and 189 deletions

View file

@ -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) {

View file

@ -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;

View file

@ -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();

View file

@ -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) {