Merge branch 'dev' -- run update.js
This commit is contained in:
commit
ee1b6c3255
15 changed files with 1223 additions and 414 deletions
|
|
@ -650,25 +650,35 @@ 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");
|
||||
queueAction({
|
||||
fn: function () {
|
||||
var li = makeQueueEntry(data.item, true);
|
||||
li.hide();
|
||||
var q = $("#queue");
|
||||
li.attr("title", data.item.queueby
|
||||
? ("Added by: " + data.item.queueby)
|
||||
: "Added by: Unknown");
|
||||
if(data.after === "prepend") {
|
||||
li.prependTo(q);
|
||||
li.show("blind");
|
||||
return true;
|
||||
}
|
||||
else if(data.after === "append") {
|
||||
li.appendTo(q);
|
||||
li.show("blind");
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
var liafter = playlistFind(data.after);
|
||||
if(!liafter) {
|
||||
return false;
|
||||
}
|
||||
li.insertAfter(liafter);
|
||||
li.show("blind");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
queueFail: function(data) {
|
||||
|
|
@ -681,89 +691,77 @@ Callbacks = {
|
|||
},
|
||||
|
||||
setTemp: function(data) {
|
||||
var li = $("#queue").children()[data.position];
|
||||
li = $(li);
|
||||
var li = $(".pluid-" + data.uid);
|
||||
if(li.length == 0)
|
||||
return false;
|
||||
|
||||
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 = $("#queue").children()[data.position];
|
||||
$(li).remove();
|
||||
queueAction({
|
||||
fn: function () {
|
||||
var li = $(".pluid-" + data.uid);
|
||||
li.hide("blind", function() {
|
||||
li.remove();
|
||||
});
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
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.moveby != CLIENT.name) {
|
||||
queueAction({
|
||||
fn: function () {
|
||||
playlistMove(data.from, data.after);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
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");
|
||||
setCurrent: function(uid) {
|
||||
queueAction({
|
||||
fn: function () {
|
||||
PL_CURRENT = uid;
|
||||
var qli = $("#queue li");
|
||||
qli.removeClass("queue_active");
|
||||
var li = $(".pluid-" + uid);
|
||||
if(li.length == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
li.addClass("queue_active");
|
||||
scrollQueue();
|
||||
return true;
|
||||
},
|
||||
can_wait: true
|
||||
});
|
||||
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);
|
||||
},
|
||||
|
||||
changeMedia: function(data) {
|
||||
if(CHANNEL.opts.allow_voteskip)
|
||||
$("#voteskip").attr("disabled", false);
|
||||
|
||||
$("#currenttitle").text("Currently Playing: " + data.title);
|
||||
|
||||
if(data.type != "sc" && PLAYER.type == "sc")
|
||||
// [](/goddamnitmango)
|
||||
fixSoundcloudShit();
|
||||
|
|
@ -859,7 +857,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,11 +987,14 @@ Callbacks = {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
var SOCKET_DEBUG = true;
|
||||
setupCallbacks = function() {
|
||||
console.log(socket);
|
||||
for(var key in Callbacks) {
|
||||
(function(key) {
|
||||
socket.on(key, function(data) {
|
||||
if(SOCKET_DEBUG)
|
||||
console.log(key, data);
|
||||
Callbacks[key](data);
|
||||
});
|
||||
})(key);
|
||||
|
|
|
|||
|
|
@ -49,9 +49,21 @@
|
|||
genPermissionsEditor();
|
||||
|
||||
$("#chanopts_submit").click(function() {
|
||||
var hms = $("#opt_maxlength").val().split(":");
|
||||
var len = 0;
|
||||
if(hms.length == 3) {
|
||||
len = parseInt(hms[0]) * 3600 + parseInt(hms[1]) * 60 + parseInt(hms[2]);
|
||||
}
|
||||
else if(hms.length == 2) {
|
||||
len = parseInt(hms[0]) * 60 + parseInt(hms[1]);
|
||||
}
|
||||
else {
|
||||
len = parseInt(hms[0]);
|
||||
}
|
||||
socket.emit("setOptions", {
|
||||
allow_voteskip: $("#opt_allow_voteskip").prop("checked"),
|
||||
voteskip_ratio: parseFloat($("#opt_voteskip_ratio").val()),
|
||||
maxlength: len,
|
||||
pagetitle: $("#opt_pagetitle").val() || CHANNEL.name,
|
||||
externalcss: $("#opt_externalcss").val(),
|
||||
externaljs: $("#opt_externaljs").val(),
|
||||
|
|
|
|||
|
|
@ -40,7 +40,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;
|
||||
|
|
@ -64,8 +64,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;
|
||||
var NO_STORAGE = typeof localStorage == "undefined" || localStorage === null;
|
||||
|
|
|
|||
|
|
@ -211,16 +211,18 @@ $("#mediarefresh").click(function() {
|
|||
|
||||
$("#queue").sortable({
|
||||
start: function(ev, ui) {
|
||||
PL_FROM = ui.item.prevAll().length;
|
||||
PL_FROM = ui.item.data("uid");
|
||||
},
|
||||
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 = "prepend";
|
||||
else
|
||||
PL_AFTER = $(prev[0]).data("uid");
|
||||
socket.emit("moveMedia", {
|
||||
from: PL_FROM,
|
||||
after: PL_AFTER
|
||||
});
|
||||
}
|
||||
});
|
||||
$("#queue").disableSelection();
|
||||
|
|
@ -337,12 +339,14 @@ $("#shuffleplaylist").click(function() {
|
|||
|
||||
/* layout stuff */
|
||||
$(window).resize(function() {
|
||||
VWIDTH = $("#ytapiplayer").parent().css("width").replace("px", "");
|
||||
var VHEIGHT = ""+parseInt(parseInt(VWIDTH) * 9 / 16);
|
||||
VWIDTH = $("#queue").css("width").replace("px", "");
|
||||
VHEIGHT = ""+parseInt(parseInt(VWIDTH) * 9 / 16);
|
||||
$("#messagebuffer").css("height", (VHEIGHT - 31) + "px");
|
||||
$("#userlist").css("height", (VHEIGHT - 31) + "px");
|
||||
$("#ytapiplayer").attr("width", VWIDTH);
|
||||
$("#ytapiplayer").attr("height", VHEIGHT);
|
||||
if($("#ytapiplayer").length > 0) {
|
||||
$("#ytapiplayer").attr("width", VWIDTH);
|
||||
$("#ytapiplayer").attr("height", VHEIGHT);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -204,7 +204,48 @@ function addUserDropdown(entry, name) {
|
|||
|
||||
/* queue stuff */
|
||||
|
||||
function makeQueueEntry(video, addbtns) {
|
||||
function scrollQueue() {
|
||||
var li = playlistFind(PL_CURRENT);
|
||||
if(!li)
|
||||
return;
|
||||
|
||||
li = $(li);
|
||||
$("#queue").scrollTop(0);
|
||||
var scroll = li.position().top - $("#queue").position().top;
|
||||
$("#queue").scrollTop(scroll);
|
||||
}
|
||||
|
||||
function makeQueueEntry(item, addbtns) {
|
||||
var video = item.media;
|
||||
var li = $("<li/>");
|
||||
li.addClass("queue_entry");
|
||||
li.addClass("pluid-" + item.uid);
|
||||
li.data("uid", item.uid);
|
||||
li.data("media", video);
|
||||
li.data("temp", item.temp);
|
||||
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);
|
||||
if(item.temp) {
|
||||
li.addClass("queue_temp");
|
||||
}
|
||||
|
||||
if(addbtns)
|
||||
addQueueButtons(li);
|
||||
return li;
|
||||
}
|
||||
|
||||
function makeSearchEntry(video) {
|
||||
var li = $("<li/>");
|
||||
li.addClass("queue_entry");
|
||||
li.data("media", video);
|
||||
|
|
@ -221,12 +262,7 @@ function makeQueueEntry(video, addbtns) {
|
|||
var time = $("<span/>").addClass("qe_time").appendTo(li);
|
||||
time.text(video.duration);
|
||||
var clear = $("<div/>").addClass("qe_clear").appendTo(li);
|
||||
if(video.temp) {
|
||||
li.addClass("queue_temp");
|
||||
}
|
||||
|
||||
if(addbtns)
|
||||
addQueueButtons(li);
|
||||
return li;
|
||||
}
|
||||
|
||||
|
|
@ -238,8 +274,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("uid"));
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
|
|
@ -248,10 +283,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("uid"),
|
||||
after: PL_CURRENT,
|
||||
moveby: null
|
||||
});
|
||||
})
|
||||
|
|
@ -259,14 +293,13 @@ function addQueueButtons(li) {
|
|||
}
|
||||
// Temp/Untemp
|
||||
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")
|
||||
.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,
|
||||
uid: li.data("uid"),
|
||||
temp: !temp
|
||||
});
|
||||
})
|
||||
|
|
@ -277,8 +310,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("uid"));
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
|
|
@ -542,7 +574,10 @@ function applyOpts() {
|
|||
}
|
||||
|
||||
if(USEROPTS.hidevid) {
|
||||
$("#qualitywrap").html("");
|
||||
$("#videowrap").remove();
|
||||
$("#chatwrap").removeClass("span5").addClass("span12");
|
||||
$("#chatline").removeClass().addClass("span12");
|
||||
}
|
||||
|
||||
$("#chatbtn").remove();
|
||||
|
|
@ -765,6 +800,22 @@ function handleModPermissions() {
|
|||
$("#opt_enable_link_regex").prop("checked", CHANNEL.opts.enable_link_regex);
|
||||
$("#opt_allow_voteskip").prop("checked", CHANNEL.opts.allow_voteskip);
|
||||
$("#opt_voteskip_ratio").val(CHANNEL.opts.voteskip_ratio);
|
||||
(function() {
|
||||
if(typeof CHANNEL.opts.maxlength != "number") {
|
||||
$("#opt_maxlength").val("");
|
||||
return;
|
||||
}
|
||||
var h = parseInt(CHANNEL.opts.maxlength / 3600);
|
||||
h = ""+h;
|
||||
if(h.length < 2) h = "0" + h;
|
||||
var m = parseInt((CHANNEL.opts.maxlength % 3600) / 60);
|
||||
m = ""+m;
|
||||
if(m.length < 2) m = "0" + m;
|
||||
var s = parseInt(CHANNEL.opts.maxlength % 60);
|
||||
s = ""+s;
|
||||
if(s.length < 2) s = "0" + s;
|
||||
$("#opt_maxlength").val(h + ":" + m + ":" + s);
|
||||
})();
|
||||
$("#csstext").val(CHANNEL.css);
|
||||
$("#jstext").val(CHANNEL.js);
|
||||
$("#motdtext").val(CHANNEL.motd_text);
|
||||
|
|
@ -882,7 +933,7 @@ function loadSearchPage(page) {
|
|||
var results = $("#library").data("entries");
|
||||
var start = page * 100;
|
||||
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(results[i].thumb) {
|
||||
addLibraryButtons(li, results[i].id, "yt");
|
||||
|
|
@ -947,24 +998,73 @@ function addLibraryButtons(li, id, type) {
|
|||
|
||||
/* queue stuff */
|
||||
|
||||
function playlistMove(from, to) {
|
||||
if(from < 0 || to < 0)
|
||||
return false;
|
||||
var q = $("#queue");
|
||||
if(from >= q.children().length)
|
||||
var PL_QUEUED_ACTIONS = [];
|
||||
var PL_ACTION_INTERVAL = false;
|
||||
|
||||
function queueAction(data) {
|
||||
PL_QUEUED_ACTIONS.push(data);
|
||||
if(PL_ACTION_INTERVAL)
|
||||
return;
|
||||
PL_ACTION_INTERVAL = setInterval(function () {
|
||||
var data = PL_QUEUED_ACTIONS.shift();
|
||||
if(!("expire" in data))
|
||||
data.expire = Date.now() + 5000;
|
||||
if(!data.fn()) {
|
||||
if(data.can_wait && Date.now() < data.expire)
|
||||
PL_QUEUED_ACTIONS.push(data);
|
||||
else if(Date.now() < data.expire)
|
||||
PL_QUEUED_ACTIONS.unshift(data);
|
||||
}
|
||||
if(PL_QUEUED_ACTIONS.length == 0) {
|
||||
clearInterval(PL_ACTION_INTERVAL);
|
||||
PL_ACTION_INTERVAL = false;
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
|
||||
// Because jQuery UI does weird things
|
||||
function playlistFind(uid) {
|
||||
var children = document.getElementById("queue").children;
|
||||
for(var i in children) {
|
||||
if(typeof children[i].getAttribute != "function")
|
||||
continue;
|
||||
if(children[i].getAttribute("class").indexOf("pluid-" + uid) != -1)
|
||||
return children[i];
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function playlistMove(from, after) {
|
||||
var lifrom = $(".pluid-" + from);
|
||||
if(lifrom.length == 0)
|
||||
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 q = $("#queue");
|
||||
|
||||
if(after === "prepend") {
|
||||
lifrom.hide("blind", function() {
|
||||
lifrom.detach();
|
||||
lifrom.prependTo(q);
|
||||
lifrom.show("blind");
|
||||
});
|
||||
}
|
||||
else if(after === "append") {
|
||||
lifrom.hide("blind", function() {
|
||||
lifrom.detach();
|
||||
lifrom.appendTo(q);
|
||||
lifrom.show("blind");
|
||||
});
|
||||
}
|
||||
else {
|
||||
var liafter = $(".pluid-" + after);
|
||||
if(liafter.length == 0)
|
||||
return false;
|
||||
lifrom.hide("blind", function() {
|
||||
lifrom.detach();
|
||||
lifrom.insertAfter(liafter);
|
||||
lifrom.show("blind");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function parseMediaLink(url) {
|
||||
|
|
@ -1201,12 +1301,15 @@ function fluidLayout() {
|
|||
$(".container").each(function() {
|
||||
$(this).removeClass("container").addClass("container-fluid");
|
||||
});
|
||||
VWIDTH = $("#ytapiplayer").parent().css("width").replace("px", "");
|
||||
// Video might not be there, but the playlist is
|
||||
VWIDTH = $("#queue").css("width").replace("px", "");
|
||||
VHEIGHT = ""+parseInt(parseInt(VWIDTH) * 9 / 16);
|
||||
if($("#ytapiplayer").length > 0) {
|
||||
$("#ytapiplayer").attr("width", VWIDTH);
|
||||
$("#ytapiplayer").attr("height", VHEIGHT);
|
||||
}
|
||||
$("#messagebuffer").css("height", (VHEIGHT - 31) + "px");
|
||||
$("#userlist").css("height", (VHEIGHT - 31) + "px");
|
||||
$("#ytapiplayer").attr("width", VWIDTH);
|
||||
$("#ytapiplayer").attr("height", VHEIGHT);
|
||||
$("#chatline").removeClass().addClass("span12");
|
||||
$("#channelsettingswrap3").css("margin-left", "0");
|
||||
}
|
||||
|
|
@ -1301,6 +1404,7 @@ function genPermissionsEditor() {
|
|||
makeOption("Jump to video", "playlistjump", standard, CHANNEL.perms.playlistjump+"");
|
||||
makeOption("Queue playlist", "playlistaddlist", standard, CHANNEL.perms.playlistaddlist+"");
|
||||
makeOption("Queue livestream", "playlistaddlive", standard, CHANNEL.perms.playlistaddlive+"");
|
||||
makeOption("Exceed maximum media length", "exceedmaxlength", standard, CHANNEL.perms.exceedmaxlength+"");
|
||||
makeOption("Add nontemporary media", "addnontemp", standard, CHANNEL.perms.addnontemp+"");
|
||||
makeOption("Temp/untemp playlist item", "settemp", standard, CHANNEL.perms.settemp+"");
|
||||
makeOption("Shuffle playlist", "playlistshuffle", standard, CHANNEL.perms.playlistshuffle+"");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue