sync/lib/channel/mediarefresher.js
2014-07-09 21:20:14 -07:00

94 lines
2.6 KiB
JavaScript

var ChannelModule = require("./module");
var Config = require("../config");
var InfoGetter = require("../get-info");
function MediaRefresherModule(channel) {
ChannelModule.apply(this, arguments);
this._interval = false;
this._media = null;
}
MediaRefresherModule.prototype = Object.create(ChannelModule.prototype);
MediaRefresherModule.prototype.onMediaChange = function (data) {
if (this._interval) clearInterval(this._interval);
this._media = data;
switch (data.type) {
case "gd":
return this.initGoogleDocs(data);
case "vi":
return this.initVimeo(data);
}
};
MediaRefresherModule.prototype.initGoogleDocs = function (data) {
var self = this;
self.refreshGoogleDocs(data, true);
/*
* Refresh every 55 minutes.
* The expiration is 1 hour, but refresh 5 minutes early to be safe
*/
self._interval = setInterval(function () {
self.refreshGoogleDocs(data, false);
}, 55 * 60 * 1000);
};
MediaRefresherModule.prototype.initVimeo = function (data) {
if (!Config.get("vimeo-workaround")) {
return;
}
var self = this;
self.channel.activeLock.lock();
InfoGetter.vimeoWorkaround(data.id, function (hack) {
if (self._media === data) {
self.channel.logger.log("[mediarefresher] Refreshed vimeo video with ID " +
data.id);
data.meta.direct = hack;
self.channel.broadcastAll("changeMedia", data.getFullUpdate());
}
self.channel.activeLock.release();
});
};
MediaRefresherModule.prototype.refreshGoogleDocs = function (media, update) {
var self = this;
if (self.dead || self.channel.dead) {
return;
}
self.channel.activeLock.lock();
InfoGetter.getMedia(media.id, "gd", function (err, data) {
switch (err) {
case "HTTP 302":
case "Video not found":
case "Private video":
return;
default:
if (err) {
Logger.errlog.log("Google Docs refresh failed for ID " + media.id +
": " + err);
return self.channel.activeLock.release();
}
}
if (media !== self._media) {
return self.channel.activeLock.release();
}
self.channel.logger.log("[mediarefresher] Refreshed Google Docs video with ID " +
media.id);
media.meta = data.meta;
if (update) {
self.channel.broadcastAll("changeMedia", data.getFullUpdate());
}
self.channel.activeLock.release();
});
};
module.exports = MediaRefresherModule;