mirror of https://github.com/calzoneman/sync.git
Continue work on playlist changes
This commit is contained in:
parent
eefd62593b
commit
9a3563ca45
12
channel.js
12
channel.js
|
@ -35,7 +35,7 @@ var Channel = function(name) {
|
||||||
// Initialize defaults
|
// Initialize defaults
|
||||||
this.registered = false;
|
this.registered = false;
|
||||||
this.users = [];
|
this.users = [];
|
||||||
this.playlist = new Playlist();
|
this.playlist = new Playlist(this);
|
||||||
this.library = {};
|
this.library = {};
|
||||||
this.position = -1;
|
this.position = -1;
|
||||||
this.drinks = 0;
|
this.drinks = 0;
|
||||||
|
@ -170,7 +170,7 @@ Channel.prototype.loadDump = function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(data.playlist) {
|
else if(data.playlist) {
|
||||||
this.playlist = new Playlist(data.playlist);
|
//TODO fix
|
||||||
this.playlist.current = this.playlist.find(data.currentUID) || null;
|
this.playlist.current = this.playlist.find(data.currentUID) || null;
|
||||||
}
|
}
|
||||||
this.sendAll("playlist", this.playlist.toArray());
|
this.sendAll("playlist", this.playlist.toArray());
|
||||||
|
@ -1334,7 +1334,7 @@ Channel.prototype.jumpTo = function(uid) {
|
||||||
if(this.leader == null && !isLive(this.playlist.current.media.type)) {
|
if(this.leader == null && !isLive(this.playlist.current.media.type)) {
|
||||||
this.time = new Date().getTime();
|
this.time = new Date().getTime();
|
||||||
if(this.playlist.current.media.uid != oid) {
|
if(this.playlist.current.media.uid != oid) {
|
||||||
mediaUpdate(this, this.playlist.current.media);
|
//mediaUpdate(this, this.playlist.current.media);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1373,7 +1373,7 @@ Channel.prototype.shufflequeue = function() {
|
||||||
n.push(pl[i]);
|
n.push(pl[i]);
|
||||||
pl.splice(i, 1);
|
pl.splice(i, 1);
|
||||||
}
|
}
|
||||||
this.playlist = new Playlist(n);
|
// TODO fix
|
||||||
this.playlist.current = this.playlist.last;
|
this.playlist.current = this.playlist.last;
|
||||||
this.playNext();
|
this.playNext();
|
||||||
this.sendAll("playlist", this.playlist.toArray());
|
this.sendAll("playlist", this.playlist.toArray());
|
||||||
|
@ -1920,17 +1920,21 @@ Channel.prototype.changeLeader = function(name) {
|
||||||
}
|
}
|
||||||
if(name == "") {
|
if(name == "") {
|
||||||
this.logger.log("*** Resuming autolead");
|
this.logger.log("*** Resuming autolead");
|
||||||
|
/*
|
||||||
if(this.playlist.current != null && !isLive(this.playlist.current.media.type)) {
|
if(this.playlist.current != null && !isLive(this.playlist.current.media.type)) {
|
||||||
this.playlist.current.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.playlist.current.media.id);
|
mediaUpdate(this, this.playlist.current.media.id);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
this.playlist.lead(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for(var i = 0; i < this.users.length; i++) {
|
for(var i = 0; i < this.users.length; i++) {
|
||||||
if(this.users[i].name == name) {
|
if(this.users[i].name == name) {
|
||||||
this.logger.log("*** Assigned leader: " + name);
|
this.logger.log("*** Assigned leader: " + name);
|
||||||
|
this.playlist.lead(false);
|
||||||
this.leader = this.users[i];
|
this.leader = this.users[i];
|
||||||
if(this.users[i].rank < 1.5) {
|
if(this.users[i].rank < 1.5) {
|
||||||
this.users[i].oldrank = this.users[i].rank;
|
this.users[i].oldrank = this.users[i].rank;
|
||||||
|
|
104
playlist.js
104
playlist.js
|
@ -16,17 +16,42 @@ PlaylistItem.prototype.pack = function() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function Playlist(items) {
|
function Playlist(chan) {
|
||||||
this.next_uid = 0;
|
this.next_uid = 0;
|
||||||
this.first = null;
|
this.first = null;
|
||||||
this.last = null;
|
this.last = null;
|
||||||
this.current = null;
|
this.current = null;
|
||||||
this.length = 0;
|
this.length = 0;
|
||||||
|
this._leadInterval = false;
|
||||||
|
this._lastUpdate = 0;
|
||||||
|
this._counter = 0;
|
||||||
|
this.leading = true;
|
||||||
|
this.callbacks = {
|
||||||
|
"changeMedia": [],
|
||||||
|
"mediaUpdate": []
|
||||||
|
};
|
||||||
|
|
||||||
if(items !== undefined) {
|
if(chan) {
|
||||||
items.forEach(function(it) {
|
this.on("mediaUpdate", function(m) {
|
||||||
this.append(it);
|
chan.sendAll("mediaUpdate", m.timeupdate());
|
||||||
});
|
});
|
||||||
|
this.on("changeMedia", function(m) {
|
||||||
|
chan.sendAll("changeMedia", m.fullupdate());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.on = function(ev, fn) {
|
||||||
|
if(typeof fn === "undefined") {
|
||||||
|
var pl = this;
|
||||||
|
return function() {
|
||||||
|
for(var i = 0; i < pl.callbacks[ev].length; i++) {
|
||||||
|
pl.callbacks[ev][i].apply(this, arguments);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(typeof fn === "function") {
|
||||||
|
this.callbacks[ev].push(fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +84,7 @@ Playlist.prototype.prepend = function(plitem) {
|
||||||
else {
|
else {
|
||||||
this.current = plitem;
|
this.current = plitem;
|
||||||
this.last = plitem;
|
this.last = plitem;
|
||||||
|
this.startPlayback();
|
||||||
}
|
}
|
||||||
this.first = plitem;
|
this.first = plitem;
|
||||||
this.first.prev = null;
|
this.first.prev = null;
|
||||||
|
@ -75,6 +101,7 @@ Playlist.prototype.append = function(plitem) {
|
||||||
else {
|
else {
|
||||||
this.first = plitem;
|
this.first = plitem;
|
||||||
this.current = plitem;
|
this.current = plitem;
|
||||||
|
this.startPlayback();
|
||||||
}
|
}
|
||||||
this.last = plitem;
|
this.last = plitem;
|
||||||
this.last.next = null;
|
this.last.next = null;
|
||||||
|
@ -143,8 +170,7 @@ Playlist.prototype._next = function() {
|
||||||
this.current = this.first;
|
this.current = this.first;
|
||||||
|
|
||||||
if(this.current) {
|
if(this.current) {
|
||||||
this.current.media.paused = false;
|
this.startPlayback();
|
||||||
this.current.media.currentTime = -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,8 +187,7 @@ Playlist.prototype.jump = function(uid) {
|
||||||
this.current = jmp;
|
this.current = jmp;
|
||||||
|
|
||||||
if(this.current) {
|
if(this.current) {
|
||||||
this.current.media.paused = false;
|
this.startPlayback();
|
||||||
this.current.media.currentTime = -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(it.temp) {
|
if(it.temp) {
|
||||||
|
@ -188,6 +213,69 @@ Playlist.prototype.clear = function() {
|
||||||
this.current = null;
|
this.current = null;
|
||||||
this.length = 0;
|
this.length = 0;
|
||||||
this.next_uid = 0;
|
this.next_uid = 0;
|
||||||
|
clearInterval(this._leadInterval);
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.lead = function(lead) {
|
||||||
|
this.leading = lead;
|
||||||
|
if(!this.leading && this._leadInterval) {
|
||||||
|
clearInterval(this._leadInterval);
|
||||||
|
this._leadInterval = false;
|
||||||
|
}
|
||||||
|
else if(this.leading && !this._leadInterval) {
|
||||||
|
this._leadInterval = setInterval(function() {
|
||||||
|
pl._leadLoop();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist.prototype.startPlayback = function() {
|
||||||
|
this.current.media.paused = true;
|
||||||
|
this.current.media.currentTime = -2;
|
||||||
|
var pl = this;
|
||||||
|
setTimeout(function() {
|
||||||
|
pl.current.media.paused = false;
|
||||||
|
pl.on("mediaUpdate")(pl.current.media);
|
||||||
|
}, 2000);
|
||||||
|
if(this.leading && !this._leadInterval && !isLive(this.current.media.type)) {
|
||||||
|
this._leadInterval = setInterval(function() {
|
||||||
|
pl._leadLoop();
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
else if(!this.leading && this._leadInterval) {
|
||||||
|
clearInterval(this._leadInterval);
|
||||||
|
this._leadInterval = false;
|
||||||
|
}
|
||||||
|
this.on("changeMedia")(this.current.media);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isLive(type) {
|
||||||
|
return type == "li" // Livestream.com
|
||||||
|
|| type == "tw" // Twitch.tv
|
||||||
|
|| type == "jt" // Justin.tv
|
||||||
|
|| type == "rt" // RTMP
|
||||||
|
|| type == "jw" // JWPlayer
|
||||||
|
|| type == "us" // Ustream.tv
|
||||||
|
|| type == "im";// Imgur album
|
||||||
|
}
|
||||||
|
|
||||||
|
const UPDATE_INTERVAL = 5;
|
||||||
|
|
||||||
|
Playlist.prototype._leadLoop = function() {
|
||||||
|
if(this.current == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.current.media.currentTime += (Date.now() - this._lastUpdate) / 1000.0;
|
||||||
|
this._lastUpdate = Date.now();
|
||||||
|
this._counter++;
|
||||||
|
console.log("lead", this._counter);
|
||||||
|
|
||||||
|
if(this.current.media.currentTime >= this.current.media.seconds + 2) {
|
||||||
|
this.next();
|
||||||
|
}
|
||||||
|
else if(this._counter % UPDATE_INTERVAL == 0) {
|
||||||
|
this.on("mediaUpdate")(this.current.media);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Playlist;
|
module.exports = Playlist;
|
||||||
|
|
|
@ -723,13 +723,15 @@ Callbacks = {
|
||||||
var qli = $("#queue li");
|
var qli = $("#queue li");
|
||||||
$("#queue li").removeClass("queue_active");
|
$("#queue li").removeClass("queue_active");
|
||||||
var li = $(".pluid-" + data.uid);
|
var li = $(".pluid-" + data.uid);
|
||||||
if(li.length == 0)
|
if(li.length == 0) {
|
||||||
return false;
|
console.log("couldn't find uid" + data.uid);
|
||||||
|
}
|
||||||
|
// TODO send separate frame for highlight
|
||||||
|
|
||||||
li.addClass("queue_active");
|
//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);
|
||||||
|
|
Loading…
Reference in New Issue