Continue rewriting things
This commit is contained in:
parent
161a116e59
commit
42fc2e45c8
9 changed files with 1159 additions and 458 deletions
|
|
@ -16,7 +16,7 @@ Callbacks = {
|
|||
socket.emit("joinChannel", {
|
||||
name: CHANNEL.name
|
||||
});
|
||||
if(uname && session) {
|
||||
if(NAME && SESSION) {
|
||||
socket.emit("login", {
|
||||
name: NAME,
|
||||
session: SESSION
|
||||
|
|
@ -231,7 +231,8 @@ Callbacks = {
|
|||
setPermissions: function(perms) {
|
||||
CHANNEL.perms = perms;
|
||||
if(CLIENT.rank >= Rank.Admin)
|
||||
genPermissionsEditor();
|
||||
1;
|
||||
//genPermissionsEditor();
|
||||
handlePermissionChange();
|
||||
},
|
||||
|
||||
|
|
@ -464,9 +465,9 @@ Callbacks = {
|
|||
}
|
||||
},
|
||||
|
||||
drinkCount: function(data) {
|
||||
if(data.count != 0) {
|
||||
var text = data.count + " drink";
|
||||
drinkCount: function(count) {
|
||||
if(count != 0) {
|
||||
var text = count + " drink";
|
||||
if(data.count != 1) {
|
||||
text += "s";
|
||||
}
|
||||
|
|
@ -484,7 +485,6 @@ Callbacks = {
|
|||
var q = $("#queue");
|
||||
q.html("");
|
||||
|
||||
|
||||
for(var i = 0; i < data.length; i++) {
|
||||
Callbacks.queue({
|
||||
media: data[i],
|
||||
|
|
@ -550,7 +550,8 @@ Callbacks = {
|
|||
},
|
||||
|
||||
moveVideo: function(data) {
|
||||
playlistMove(data.src, data.dest);
|
||||
if(data.moveby != CLIENT.name)
|
||||
playlistMove(data.src, data.dest);
|
||||
},
|
||||
|
||||
setPosition: function(data) {
|
||||
|
|
@ -598,22 +599,7 @@ Callbacks = {
|
|||
|
||||
setPlaylistLocked: function(data) {
|
||||
CHANNEL.openqueue = !data.locked;
|
||||
// TODO handlePermissionsChange?
|
||||
if(CHANNEL.openqueue) {
|
||||
$("#playlist_controls").css("display", "");
|
||||
if(RANK < Rank.Moderator) {
|
||||
$("#qlockbtn").css("display", "none");
|
||||
rebuildPlaylist();
|
||||
if(!CHANNELOPTS.qopen_allow_qnext)
|
||||
$("#queue_next").attr("disabled", true);
|
||||
if(!CHANNELOPTS.qopen_allow_playnext)
|
||||
$("#play_next").attr("disabled", true);
|
||||
}
|
||||
}
|
||||
else if(RANK < Rank.Moderator && !LEADER) {
|
||||
$("#playlist_controls").css("display", "none");
|
||||
rebuildPlaylist();
|
||||
}
|
||||
handlePermissionChange();
|
||||
if(CHANNEL.openqueue) {
|
||||
$("#qlockbtn").removeClass("btn-danger")
|
||||
.addClass("btn-success")
|
||||
|
|
@ -802,25 +788,39 @@ Callbacks = {
|
|||
}
|
||||
|
||||
/*
|
||||
pl = [];
|
||||
for(var i = 0; i < 10; i++) {
|
||||
var m = {
|
||||
title: "Test " + i,
|
||||
type: "yt",
|
||||
id: "test" + i,
|
||||
seconds: 0,
|
||||
duration: "00:00"
|
||||
};
|
||||
pl.push(m);
|
||||
}
|
||||
setTimeout(function() {
|
||||
Callbacks.playlist(pl);
|
||||
}, 1000);
|
||||
*/
|
||||
|
||||
$.getScript(IO_URL+"/socket.io/socket.io.js", function() {
|
||||
try {
|
||||
socket = io.connect(IO_URL);
|
||||
for(var key in Callbacks) {
|
||||
socket.on(key, Callbacks[key]);
|
||||
}
|
||||
setupCallbacks();
|
||||
}
|
||||
catch(e) {
|
||||
Callbacks.disconnect();
|
||||
}
|
||||
});
|
||||
*/
|
||||
|
||||
setupCallbacks = function() {
|
||||
for(var key in Callbacks) {
|
||||
(function(key) {
|
||||
socket.on(key, function() {
|
||||
Callbacks[key]();
|
||||
socket.on(key, function(data) {
|
||||
Callbacks[key](data);
|
||||
});
|
||||
})(key);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ var CHANNEL = {
|
|||
};
|
||||
|
||||
var PLAYER = false;
|
||||
var FLUIDLAYOUT = false;
|
||||
var VWIDTH = $("#ytapiplayer").parent().css("width").replace("px", "");
|
||||
var VHEIGHT = ""+parseInt(parseInt(VWIDTH) * 9 / 16);
|
||||
var POSITION = -1;
|
||||
|
|
@ -39,6 +40,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;
|
||||
|
||||
function getOrDefault(k, def) {
|
||||
var v = localStorage.getItem(k);
|
||||
|
|
|
|||
556
www/assets/js/player.js
Normal file
556
www/assets/js/player.js
Normal file
|
|
@ -0,0 +1,556 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
Copyright (c) 2013 Calvin Montgomery
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
var Player = function(data) {
|
||||
if(!data) {
|
||||
data = {
|
||||
id: "",
|
||||
type: "null"
|
||||
};
|
||||
}
|
||||
this.id = data.id;
|
||||
this.type = data.type;
|
||||
this.diff = 0;
|
||||
|
||||
switch(this.type) {
|
||||
case "yt":
|
||||
this.initYouTube();
|
||||
break;
|
||||
case "vi":
|
||||
this.initVimeo();
|
||||
break;
|
||||
case "dm":
|
||||
this.initDailymotion();
|
||||
break;
|
||||
case "sc":
|
||||
this.initSoundcloud();
|
||||
break;
|
||||
case "li":
|
||||
this.initLivestream();
|
||||
break;
|
||||
case "tw":
|
||||
this.initTwitch();
|
||||
break;
|
||||
case "jt":
|
||||
this.initJustinTV();
|
||||
break;
|
||||
case "rt":
|
||||
this.initRTMP();
|
||||
break;
|
||||
case "jw":
|
||||
this.initJWPlayer();
|
||||
break;
|
||||
case "us":
|
||||
this.initUstream();
|
||||
break;
|
||||
case "im":
|
||||
this.initImgur();
|
||||
break;
|
||||
default:
|
||||
this.nullPlayer();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Player.prototype.nullPlayer = function() {
|
||||
this.player = null;
|
||||
this.load = function(data) { }
|
||||
this.play = function() { }
|
||||
this.pause = function() { }
|
||||
this.getTime = function(callback) { }
|
||||
this.seek = function(time) { }
|
||||
}
|
||||
|
||||
Player.prototype.initYouTube = function() {
|
||||
this.removeOld();
|
||||
this.player = new YT.Player("ytapiplayer", {
|
||||
height: VHEIGHT,
|
||||
width: VWIDTH,
|
||||
videoId: this.id,
|
||||
playerVars: {
|
||||
"autoplay": 1,
|
||||
"controls": 1,
|
||||
},
|
||||
events: {
|
||||
onReady: function() {
|
||||
socket.emit("playerReady");
|
||||
},
|
||||
onStateChange: function(ev) {
|
||||
if(PLAYER.paused && ev.data != YT.PlayerState.PAUSED
|
||||
|| !PLAYER.paused && ev.data == YT.PlayerState.PAUSED) {
|
||||
PLAYER.paused = (ev.data == YT.PlayerState.PAUSED);
|
||||
sendVideoUpdate();
|
||||
}
|
||||
else {
|
||||
PLAYER.paused = (ev.data == YT.PlayerState.PAUSED);
|
||||
}
|
||||
if(CLIENT.leader && ev.data == YT.PlayerState.ENDED) {
|
||||
socket.emit("playNext");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
$("#ytapiplayer").css("border", "none");
|
||||
|
||||
this.load = function(data) {
|
||||
if(this.player.loadVideoById) {
|
||||
this.player.loadVideoById(data.id, data.currentTime);
|
||||
this.id = data.id;
|
||||
}
|
||||
}
|
||||
|
||||
this.pause = function() {
|
||||
this.player.pauseVideo();
|
||||
}
|
||||
|
||||
this.play = function() {
|
||||
this.player.playVideo();
|
||||
}
|
||||
|
||||
this.getTime = function(callback) {
|
||||
callback(this.player.getCurrentTime());
|
||||
}
|
||||
|
||||
this.seek = function(time) {
|
||||
this.player.seekTo(time, true);
|
||||
}
|
||||
}
|
||||
|
||||
Player.prototype.initVimeo = function() {
|
||||
var iframe = $("<iframe/>").insertBefore($("#ytapiplayer"));
|
||||
$("#ytapiplayer").remove();
|
||||
iframe.attr("id", "ytapiplayer");
|
||||
iframe.attr("width", VWIDTH);
|
||||
iframe.attr("height", VHEIGHT);
|
||||
iframe.attr("src", "http://player.vimeo.com/video/"+this.id+"?api=1&player_id=ytapiplayer");
|
||||
iframe.attr("webkitAllowFullScreen", "");
|
||||
iframe.attr("mozallowfullscreen", "");
|
||||
iframe.attr("allowFullScreen", "");
|
||||
iframe.css("border", "none");
|
||||
|
||||
this.player = $f(iframe[0]);
|
||||
$f(iframe[0]).addEvent("ready", function() {
|
||||
socket.emit("playerReady");
|
||||
this.player = $f(iframe[0]);
|
||||
this.player.api("play");
|
||||
|
||||
this.player.addEvent("finish", function() {
|
||||
if(CLIENT.leader) {
|
||||
socket.emit("playNext");
|
||||
}
|
||||
});
|
||||
|
||||
this.player.addEvent("pause", function() {
|
||||
PLAYER.paused = true;
|
||||
sendVideoUpdate();
|
||||
});
|
||||
|
||||
this.player.addEvent("play", function() {
|
||||
PLAYER.paused = false;
|
||||
sendVideoUpdate();
|
||||
});
|
||||
}.bind(this));
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initVimeo();
|
||||
}
|
||||
|
||||
this.pause = function() {
|
||||
this.player.api("pause");
|
||||
}
|
||||
|
||||
this.play = function() {
|
||||
this.player.api("play");
|
||||
}
|
||||
|
||||
this.getTime = function(callback) {
|
||||
// Vimeo api returns time as a string because fuck logic
|
||||
this.player.api("getCurrentTime", function(time) {
|
||||
callback(parseFloat(time));
|
||||
});
|
||||
}
|
||||
|
||||
this.seek = function(time) {
|
||||
this.player.api("seekTo", time);
|
||||
}
|
||||
}
|
||||
|
||||
Player.prototype.initDailymotion = function() {
|
||||
this.removeOld();
|
||||
this.player = DM.player("ytapiplayer", {
|
||||
video: this.id,
|
||||
width: parseInt(VWIDTH),
|
||||
height: parseInt(VHEIGHT),
|
||||
params: {autoplay: 1}
|
||||
});
|
||||
|
||||
this.player.addEventListener("apiready", function(e) {
|
||||
socket.emit("playerReady");
|
||||
this.player.addEventListener("ended", function(e) {
|
||||
if(CLIENT.leader) {
|
||||
socket.emit("playNext");
|
||||
}
|
||||
});
|
||||
|
||||
this.player.addEventListener("pause", function(e) {
|
||||
PLAYER.paused = true;
|
||||
sendVideoUpdate();
|
||||
});
|
||||
|
||||
this.player.addEventListener("playing", function(e) {
|
||||
PLAYER.paused = false;
|
||||
sendVideoUpdate();
|
||||
});
|
||||
}.bind(this));
|
||||
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.player.api("load", data.id);
|
||||
}
|
||||
|
||||
this.pause = function() {
|
||||
this.player.api("pause");
|
||||
}
|
||||
|
||||
this.play = function() {
|
||||
this.player.api("play");
|
||||
}
|
||||
|
||||
this.getTime = function(callback) {
|
||||
callback(this.player.currentTime);
|
||||
}
|
||||
|
||||
this.seek = function(seconds) {
|
||||
this.player.api("seek", seconds);
|
||||
}
|
||||
}
|
||||
|
||||
Player.prototype.initSoundcloud = function() {
|
||||
unfixSoundcloudShit();
|
||||
var iframe = $("<iframe/>").insertBefore($("#ytapiplayer"));
|
||||
$("#ytapiplayer").remove();
|
||||
|
||||
iframe.attr("id", "ytapiplayer");
|
||||
iframe.attr("src", "https://w.soundcloud.com/player/?url=" + this.id);
|
||||
iframe.css("width", "100%").attr("height", "166");
|
||||
iframe.css("border", "none");
|
||||
|
||||
this.player = SC.Widget("ytapiplayer");
|
||||
|
||||
this.player.bind(SC.Widget.Events.READY, function() {
|
||||
socket.emit("playerReady");
|
||||
this.player.load(this.id, {auto_play: true});
|
||||
|
||||
this.player.bind(SC.Widget.Events.PAUSE, function() {
|
||||
PLAYER.paused = true;
|
||||
sendVideoUpdate();
|
||||
});
|
||||
|
||||
this.player.bind(SC.Widget.Events.PLAY, function() {
|
||||
PLAYER.paused = false;
|
||||
sendVideoUpdate();
|
||||
});
|
||||
|
||||
this.player.bind(SC.Widget.Events.FINISH, function() {
|
||||
if(CLIENT.leader) {
|
||||
socket.emit("playNext");
|
||||
}
|
||||
});
|
||||
}.bind(this));
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.player.load(data.id, {auto_play: true});
|
||||
}
|
||||
|
||||
this.pause = function() {
|
||||
this.player.pause();
|
||||
}
|
||||
|
||||
this.play = function() {
|
||||
this.player.play();
|
||||
}
|
||||
|
||||
this.getTime = function(callback) {
|
||||
this.player.getPosition(function(pos) {
|
||||
callback(pos / 1000);
|
||||
});
|
||||
}
|
||||
|
||||
this.seek = function(seconds) {
|
||||
this.player.seekTo(seconds * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
Player.prototype.initLivestream = function() {
|
||||
this.removeOld();
|
||||
var flashvars = {channel: this.id};
|
||||
var params = {AllowScriptAccess: "always"};
|
||||
swfobject.embedSWF("http://cdn.livestream.com/chromelessPlayer/v20/playerapi.swf", "ytapiplayer", VWIDTH, VHEIGHT, "9.0.0", "expressInstall.swf", flashvars, params);
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initLivestream();
|
||||
}
|
||||
|
||||
this.pause = function() { }
|
||||
|
||||
this.play = function() { }
|
||||
|
||||
this.getTime = function() { }
|
||||
|
||||
this.seek = function() { }
|
||||
}
|
||||
|
||||
Player.prototype.initTwitch = function() {
|
||||
this.removeOld();
|
||||
var url = "http://www.twitch.tv/widgets/live_embed_player.swf?channel="+this.id;
|
||||
var params = {
|
||||
allowFullScreen:"true",
|
||||
allowScriptAccess:"always",
|
||||
allowNetworking:"all",
|
||||
movie:"http://www.twitch.tv/widgets/live_embed_player.swf",
|
||||
id: "live_embed_player_flash",
|
||||
flashvars:"hostname=www.twitch.tv&channel="+this.id+"&auto_play=true&start_volume=100"
|
||||
};
|
||||
swfobject.embedSWF( url, "ytapiplayer", VWIDTH, VHEIGHT, "8", null, null, params, {} );
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initTwitch();
|
||||
}
|
||||
|
||||
this.pause = function() { }
|
||||
|
||||
this.play = function() { }
|
||||
|
||||
this.getTime = function() { }
|
||||
|
||||
this.seek = function() { }
|
||||
}
|
||||
|
||||
Player.prototype.initJustinTV = function() {
|
||||
this.removeOld();
|
||||
var url = "http://www.justin.tv/widgets/live_embed_player.swf?channel="+this.id;
|
||||
var params = {
|
||||
allowFullScreen:"true",
|
||||
allowScriptAccess:"always",
|
||||
allowNetworking:"all",
|
||||
movie:"http://www.justin.tv/widgets/live_embed_player.swf",
|
||||
id: "live_embed_player_flash",
|
||||
flashvars:"hostname=www.justin.tv&channel="+this.id+"&auto_play=true&start_volume=100"
|
||||
};
|
||||
swfobject.embedSWF( url, "ytapiplayer", VWIDTH, VHEIGHT, "8", null, null, params, {} );
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initTwitch();
|
||||
}
|
||||
|
||||
this.pause = function() { }
|
||||
|
||||
this.play = function() { }
|
||||
|
||||
this.getTime = function() { }
|
||||
|
||||
this.seek = function() { }
|
||||
}
|
||||
|
||||
Player.prototype.initRTMP = function() {
|
||||
this.removeOld();
|
||||
var url = "http://fpdownload.adobe.com/strobe/FlashPlayerPlayback_101.swf";
|
||||
var src = encodeURIComponent(this.id);
|
||||
var params = {
|
||||
allowFullScreen:"true",
|
||||
allowScriptAccess:"always",
|
||||
allowNetworking:"all",
|
||||
wMode:"direct",
|
||||
movie:"http://fpdownload.adobe.com/strobe/FlashPlayerPlayback_101.swf",
|
||||
flashvars:"src="+src+"&streamType=live&autoPlay=true"
|
||||
};
|
||||
swfobject.embedSWF(url, "ytapiplayer", VWIDTH, VHEIGHT, "8", null, null, params, {} );
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initTwitch();
|
||||
}
|
||||
|
||||
this.pause = function() { }
|
||||
|
||||
this.play = function() { }
|
||||
|
||||
this.getTime = function() { }
|
||||
|
||||
this.seek = function() { }
|
||||
}
|
||||
|
||||
Player.prototype.initJWPlayer = function() {
|
||||
if(typeof jwplayer == "undefined") {
|
||||
setTimeout(function() {
|
||||
this.initJWPlayer();
|
||||
}.bind(this), 100);
|
||||
return;
|
||||
}
|
||||
this.removeOld();
|
||||
|
||||
jwplayer("ytapiplayer").setup({
|
||||
file: this.id,
|
||||
width: VWIDTH,
|
||||
height: VHEIGHT,
|
||||
autostart: true
|
||||
});
|
||||
|
||||
jwplayer().onPlay(function() {
|
||||
this.paused = false;
|
||||
}.bind(this));
|
||||
jwplayer().onPause(function() {
|
||||
this.paused = true;
|
||||
}.bind(this));
|
||||
jwplayer().onComplete(function() {
|
||||
socket.emit("playNext");
|
||||
});
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initJWPlayer();
|
||||
}
|
||||
|
||||
this.pause = function() {
|
||||
jwplayer().pause(true);
|
||||
}
|
||||
|
||||
this.play = function() {
|
||||
jwplayer().play(true);
|
||||
}
|
||||
|
||||
this.getTime = function(callback) {
|
||||
// Only return time for non-live media
|
||||
if(jwplayer().getDuration() != -1) {
|
||||
callback(jwplayer().getPosition());
|
||||
}
|
||||
}
|
||||
|
||||
this.seek = function(time) {
|
||||
jwplayer().seek(time);
|
||||
}
|
||||
}
|
||||
|
||||
Player.prototype.initUstream = function() {
|
||||
var iframe = $("<iframe/>").insertBefore($("#ytapiplayer"));
|
||||
$("#ytapiplayer").remove();
|
||||
iframe.attr("id", "ytapiplayer");
|
||||
iframe.attr("width", VWIDTH);
|
||||
iframe.attr("height", VHEIGHT);
|
||||
iframe.attr("src", "http://www.ustream.tv/embed/"+this.id+"?v=3&wmode=direct");
|
||||
iframe.attr("frameborder", "0");
|
||||
iframe.attr("scrolling", "no");
|
||||
iframe.css("border", "none");
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initUstream();
|
||||
}
|
||||
|
||||
this.pause = function() { }
|
||||
|
||||
this.play = function() { }
|
||||
|
||||
this.getTime = function() { }
|
||||
|
||||
this.seek = function() { }
|
||||
}
|
||||
|
||||
Player.prototype.initImgur = function() {
|
||||
var iframe = $("<iframe/>").insertBefore($("#ytapiplayer"));
|
||||
$("#ytapiplayer").remove();
|
||||
iframe.attr("id", "ytapiplayer");
|
||||
iframe.attr("width", VWIDTH);
|
||||
iframe.attr("height", VHEIGHT);
|
||||
iframe.attr("src", "http://imgur.com/a/"+this.id+"/embed");
|
||||
iframe.attr("frameborder", "0");
|
||||
iframe.attr("scrolling", "no");
|
||||
iframe.css("border", "none");
|
||||
|
||||
this.load = function(data) {
|
||||
this.id = data.id;
|
||||
this.initImgur()
|
||||
}
|
||||
|
||||
this.pause = function() { }
|
||||
|
||||
this.play = function() { }
|
||||
|
||||
this.getTime = function() { }
|
||||
|
||||
this.seek = function() { }
|
||||
}
|
||||
|
||||
Player.prototype.update = function(data) {
|
||||
if(data.id && data.id != this.id) {
|
||||
if(data.currentTime < 0) {
|
||||
data.currentTime = 0;
|
||||
}
|
||||
this.load(data);
|
||||
}
|
||||
if(!USEROPTS.synch) {
|
||||
return;
|
||||
}
|
||||
if(data.paused) {
|
||||
this.seek(data.currentTime);
|
||||
this.pause();
|
||||
}
|
||||
else {
|
||||
this.play();
|
||||
}
|
||||
if(CLIENT.leader) {
|
||||
return;
|
||||
}
|
||||
this.getTime(function(seconds) {
|
||||
var time = data.currentTime;
|
||||
var diff = time - seconds || time;
|
||||
|
||||
if(diff > USEROPTS.sync_accuracy) {
|
||||
this.seek(time);
|
||||
}
|
||||
else if(diff < -USEROPTS.sync_accuracy) {
|
||||
this.seek(time + 1);
|
||||
}
|
||||
}.bind(this));
|
||||
}
|
||||
|
||||
Player.prototype.removeOld = function() {
|
||||
var old = $("#ytapiplayer");
|
||||
var placeholder = $("<div/>").insertBefore(old);
|
||||
old.remove();
|
||||
placeholder.attr("id", "ytapiplayer");
|
||||
}
|
||||
|
||||
Player.prototype.hide = function() {
|
||||
if(!/chrome/ig.test(navigator.userAgent)) {
|
||||
return;
|
||||
}
|
||||
this.size = {
|
||||
width: $("#ytapiplayer").attr("width"),
|
||||
height: $("#ytapiplayer").attr("height")
|
||||
};
|
||||
$("#ytapiplayer").attr("width", 1)
|
||||
.attr("height", 1);
|
||||
}
|
||||
|
||||
Player.prototype.unhide = function() {
|
||||
if(!/chrome/ig.test(navigator.userAgent)) {
|
||||
return;
|
||||
}
|
||||
$("#ytapiplayer").attr("width", this.size.width)
|
||||
.attr("height", this.size.height);
|
||||
}
|
||||
|
|
@ -158,7 +158,20 @@ $("#userpl_save").click(function() {
|
|||
/* playlist controls */
|
||||
|
||||
$(function() {
|
||||
$("#queue").sortable();
|
||||
$("#queue").sortable({
|
||||
start: function(ev, ui) {
|
||||
PL_FROM = ui.item.prevAll().length;
|
||||
},
|
||||
update: function(ev, ui) {
|
||||
PL_TO = ui.item.prevAll().length;
|
||||
if(PL_TO != PL_FROM) {
|
||||
socket.emit("moveMedia", {
|
||||
from: PL_FROM,
|
||||
to: PL_TO
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
$("#queue").disableSelection();
|
||||
});
|
||||
|
||||
|
|
@ -245,3 +258,59 @@ $("#shuffleplaylist").click(function() {
|
|||
socket.emit("shufflePlaylist");
|
||||
}
|
||||
});
|
||||
|
||||
/* layout stuff */
|
||||
$(window).resize(function() {
|
||||
VWIDTH = $("#ytapiplayer").parent().css("width").replace("px", "");
|
||||
var 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);
|
||||
});
|
||||
|
||||
/* initial YouTube api */
|
||||
|
||||
if(!USEROPTS.hidevid) {
|
||||
var tag = document.createElement("script");
|
||||
tag.src = "http://www.youtube.com/iframe_api";
|
||||
var firstScriptTag = document.getElementsByTagName("script")[0];
|
||||
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
|
||||
}
|
||||
|
||||
function onYouTubeIframeAPIReady() {
|
||||
if(!PLAYER)
|
||||
PLAYER = new Player({id:"", type: "yt"});
|
||||
if(FLUIDLAYOUT)
|
||||
fluid();
|
||||
}
|
||||
|
||||
/* load channel */
|
||||
|
||||
var loc = document.location+"";
|
||||
var m = loc.match(/\/r\/([a-zA-Z0-9-_]+)$/);
|
||||
if(m) {
|
||||
CHANNEL.name = m[1];
|
||||
}
|
||||
else {
|
||||
var main = $("#main");
|
||||
var container = $("<div/>").addClass("container").insertBefore(main);
|
||||
var row = $("<div/>").addClass("row").appendTo(container);
|
||||
var div = $("<div/>").addClass("span6").appendTo(row);
|
||||
main.css("display", "none");
|
||||
var label = $("<label/>").text("Enter Channel:").appendTo(div);
|
||||
var entry = $("<input/>").attr("type", "text").appendTo(div);
|
||||
entry.keydown(function(ev) {
|
||||
var host = ""+document.location;
|
||||
host = host.replace("http://", "");
|
||||
host = host.substring(0, host.indexOf("/"));
|
||||
if(ev.keyCode == 13) {
|
||||
document.location = "http://" + host + "/r/" + entry.val();
|
||||
socket.emit("joinChannel", {
|
||||
name: entry.val()
|
||||
});
|
||||
container.remove();
|
||||
main.css("display", "");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,8 +18,37 @@ function makeAlert(title, text, klass) {
|
|||
return al;
|
||||
}
|
||||
|
||||
function formatURL(data) {
|
||||
switch(data.type) {
|
||||
case "yt":
|
||||
return "http://youtube.com/watch?v=" + data.id;
|
||||
case "vi":
|
||||
return "http://vimeo.com/" + data.id;
|
||||
case "dm":
|
||||
return "http://dailymotion.com/video/" + data.id;
|
||||
case "sc":
|
||||
return data.id;
|
||||
case "li":
|
||||
return "http://livestream.com/" + data.id;
|
||||
case "tw":
|
||||
return "http://twitch.tv/" + data.id;
|
||||
case "jt":
|
||||
return "http://justin.tv/" + data.id;
|
||||
case "rt":
|
||||
return data.id;
|
||||
case "jw":
|
||||
return data.id;
|
||||
case "im":
|
||||
return "http://imgur.com/a/" + data.id;
|
||||
case "us":
|
||||
return "http://ustream.tv/" + data.id;
|
||||
default:
|
||||
return "#";
|
||||
}
|
||||
}
|
||||
|
||||
function formatUserlistItem(div, data) {
|
||||
var name = $(div.children[1]);
|
||||
var name = $(div.children()[1]);
|
||||
name.removeClass();
|
||||
name.css("font-style", "");
|
||||
name.addClass(getNameColor(data.rank));
|
||||
|
|
@ -49,7 +78,7 @@ function formatUserlistItem(div, data) {
|
|||
profile.remove();
|
||||
});
|
||||
|
||||
var flair = div.children[0];
|
||||
var flair = div.children()[0];
|
||||
flair.innerHTML = "";
|
||||
// denote current leader with a star
|
||||
if(data.leader) {
|
||||
|
|
@ -205,7 +234,7 @@ function makeQueueEntry(video) {
|
|||
}
|
||||
var title = $("<a/>").addClass("qe_title").appendTo(li)
|
||||
.text(video.title)
|
||||
.attr("href", "#")//formatURL(video))
|
||||
.attr("href", formatURL(video))
|
||||
.attr("target", "_blank");
|
||||
var time = $("<span/>").addClass("qe_time").appendTo(li);
|
||||
time.text(video.duration);
|
||||
|
|
@ -214,47 +243,61 @@ function makeQueueEntry(video) {
|
|||
li.addClass("queue_temp");
|
||||
}
|
||||
|
||||
// TODO Permissions
|
||||
addQueueButtons(li);
|
||||
|
||||
return li;
|
||||
}
|
||||
|
||||
function addQueueButtons(li) {
|
||||
li.find(".btn-group").remove();
|
||||
var menu = $("<div/>").addClass("btn-group").appendTo(li);
|
||||
// Play
|
||||
$("<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);
|
||||
})
|
||||
.appendTo(menu);
|
||||
if(hasPermission("playlistjump")) {
|
||||
$("<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);
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
// Queue next
|
||||
$("<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", {
|
||||
src: i,
|
||||
dest: i < POSITION ? POSITION : POSITION + 1
|
||||
});
|
||||
})
|
||||
.appendTo(menu);
|
||||
if(hasPermission("playlistnext")) {
|
||||
$("<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", {
|
||||
src: i,
|
||||
dest: i < POSITION ? POSITION : POSITION + 1
|
||||
});
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
// Temp/Untemp
|
||||
$("<button/>").addClass("btn btn-mini qbtn-tmp")
|
||||
.html("<i class='icon-flag'></i>Make Temporary")
|
||||
.click(function() {
|
||||
var i = $("#queue").children().index(li);
|
||||
var temp = li.find(".qbtn-tmp").data("temp");
|
||||
socket.emit("setTemp", {
|
||||
position: i,
|
||||
temp: !temp
|
||||
});
|
||||
})
|
||||
.appendTo(menu);
|
||||
if(hasPermission("settemp")) {
|
||||
$("<button/>").addClass("btn btn-mini qbtn-tmp")
|
||||
.html("<i class='icon-flag'></i>Make Temporary")
|
||||
.click(function() {
|
||||
var i = $("#queue").children().index(li);
|
||||
var temp = li.find(".qbtn-tmp").data("temp");
|
||||
socket.emit("setTemp", {
|
||||
position: i,
|
||||
temp: !temp
|
||||
});
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
// Delete
|
||||
$("<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);
|
||||
})
|
||||
.appendTo(menu);
|
||||
if(hasPermission("playlistdelete")) {
|
||||
$("<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);
|
||||
})
|
||||
.appendTo(menu);
|
||||
}
|
||||
|
||||
menu.hide();
|
||||
|
||||
|
|
@ -266,21 +309,12 @@ function makeQueueEntry(video) {
|
|||
menu.hide("blind");
|
||||
return false;
|
||||
});
|
||||
|
||||
menu.blur(function() {
|
||||
menu.hide();
|
||||
});
|
||||
return li;
|
||||
}
|
||||
|
||||
function addQueueButtons(li) {
|
||||
|
||||
}
|
||||
|
||||
function rebuildPlaylist() {
|
||||
$("#queue li").each(function() {
|
||||
$(this).find(".btn-group").remove();
|
||||
addQueueButtons(this);
|
||||
addQueueButtons($(this));
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -733,7 +767,7 @@ function loadSearchPage(page) {
|
|||
var li = makeQueueEntry(results[i]);
|
||||
if(hasPermission("playlistadd")) {
|
||||
if(results[i].thumb) {
|
||||
addLibraryButtons(li, results[i].id, true);
|
||||
addLibraryButtons(li, results[i].id, "yt");
|
||||
}
|
||||
else {
|
||||
addLibraryButtons(li, results[i].id);
|
||||
|
|
@ -748,3 +782,206 @@ function loadSearchPage(page) {
|
|||
$($("#search_pagination").find("li")[page]).addClass("active");
|
||||
}
|
||||
}
|
||||
|
||||
function addLibraryButtons(li, id, type) {
|
||||
var btns = $("<div/>").addClass("btn-group")
|
||||
.prependTo(li);
|
||||
|
||||
if(hasPermission("playlistadd")) {
|
||||
if(hasPermission("playlistnext")) {
|
||||
$("<button/>").addClass("btn btn-mini")
|
||||
.text("Next")
|
||||
.click(function() {
|
||||
socket.emit("queue", {
|
||||
id: id,
|
||||
pos: "next",
|
||||
type: type
|
||||
});
|
||||
})
|
||||
.appendTo(btns);
|
||||
}
|
||||
$("<button/>").addClass("btn btn-mini")
|
||||
.text("End")
|
||||
.click(function() {
|
||||
socket.emit("queue", {
|
||||
id: id,
|
||||
pos: "end",
|
||||
type: type
|
||||
});
|
||||
})
|
||||
.appendTo(btns);
|
||||
}
|
||||
}
|
||||
|
||||
/* queue stuff */
|
||||
|
||||
function playlistMove(from, to) {
|
||||
if(from < 0 || to < 0)
|
||||
return false;
|
||||
var q = $("#queue");
|
||||
if(from >= q.children().length)
|
||||
return false;
|
||||
|
||||
var old = $(q.children()[from]);
|
||||
old.hide("blind", function() {
|
||||
old.remove();
|
||||
if(to >= q.children().length)
|
||||
old.appendTo(q);
|
||||
else
|
||||
old.insertBefore(q.children()[to]);
|
||||
old.show("blind");
|
||||
});
|
||||
}
|
||||
|
||||
function parseMediaLink(url) {
|
||||
if(typeof url != "string") {
|
||||
return {
|
||||
id: null,
|
||||
type: null
|
||||
};
|
||||
}
|
||||
url = url.trim();
|
||||
|
||||
if(url.indexOf("jw:") == 0) {
|
||||
return {
|
||||
id: url.substring(3),
|
||||
type: "jw"
|
||||
};
|
||||
}
|
||||
|
||||
if(url.indexOf("rtmp://") == 0) {
|
||||
return {
|
||||
id: url,
|
||||
type: "rt"
|
||||
};
|
||||
}
|
||||
|
||||
var m;
|
||||
if((m = url.match(/youtube\.com\/watch\?v=([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "yt"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/youtu\.be\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "yt"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/youtube\.com\/playlist\?list=([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "yp"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/twitch\.tv\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "tw"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/justin\.tv\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "jt"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/livestream\.com\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "li"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/ustream\.tv\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "us"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/vimeo\.com\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "vi"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/dailymotion\.com\/video\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "dm"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/imgur\.com\/a\/([^&#]+)/))) {
|
||||
return {
|
||||
id: m[1],
|
||||
type: "im"
|
||||
};
|
||||
}
|
||||
|
||||
if((m = url.match(/soundcloud\.com\/([^&#]+)/))) {
|
||||
return {
|
||||
id: url,
|
||||
type: "sc"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/* chat */
|
||||
|
||||
function addChatMessage(data) {
|
||||
if(IGNORED.indexOf(data.username) != -1) {
|
||||
return;
|
||||
}
|
||||
var div = formatChatMessage(data);
|
||||
div.data("sender", data.username);
|
||||
div.appendTo($("#messagebuffer"));
|
||||
div.mouseover(function() {
|
||||
$("#messagebuffer").children().each(function() {
|
||||
var name = $(this).data("sender");
|
||||
if(name == data.username) {
|
||||
$(this).addClass("nick-hover");
|
||||
}
|
||||
});
|
||||
});
|
||||
div.mouseleave(function() {
|
||||
$("#messagebuffer").children().each(function() {
|
||||
$(this).removeClass("nick-hover");
|
||||
});
|
||||
});
|
||||
// Cap chatbox at most recent 100 messages
|
||||
if($("#messagebuffer").children().length > 100) {
|
||||
$($("#messagebuffer").children()[0]).remove();
|
||||
}
|
||||
if(SCROLLCHAT)
|
||||
scrollChat();
|
||||
if(USEROPTS.blink_title && !FOCUSED && !TITLE_BLINK) {
|
||||
TITLE_BLINK = setInterval(function() {
|
||||
if(document.title == "*Chat*")
|
||||
document.title = PAGETITLE;
|
||||
else
|
||||
document.title = "*Chat*";
|
||||
}, 1000);
|
||||
}
|
||||
if(CLIENT.name && data.username != CLIENT.name) {
|
||||
if(data.msg.toUpperCase().indexOf(CLIENT.name.toUpperCase()) != -1) {
|
||||
div.addClass("nick-highlight");
|
||||
if(!FOCUSED && !TITLE_BLINK) {
|
||||
TITLE_BLINK = setInterval(function() {
|
||||
if(document.title == "*Chat*")
|
||||
document.title = PAGETITLE;
|
||||
else
|
||||
document.title = "*Chat*";
|
||||
}, 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue