2015-06-28 16:42:21 +00:00
|
|
|
var Vimeo = require("cytube-mediaquery/lib/provider/vimeo");
|
2014-07-10 04:20:14 +00:00
|
|
|
var ChannelModule = require("./module");
|
|
|
|
var Config = require("../config");
|
|
|
|
var InfoGetter = require("../get-info");
|
2014-07-10 04:46:45 +00:00
|
|
|
var Logger = require("../logger");
|
2014-07-10 04:20:14 +00:00
|
|
|
|
|
|
|
function MediaRefresherModule(channel) {
|
|
|
|
ChannelModule.apply(this, arguments);
|
|
|
|
this._interval = false;
|
|
|
|
this._media = null;
|
2015-06-28 16:42:21 +00:00
|
|
|
this._playlist = channel.modules.playlist;
|
2014-07-10 04:20:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MediaRefresherModule.prototype = Object.create(ChannelModule.prototype);
|
|
|
|
|
2014-07-10 04:46:45 +00:00
|
|
|
MediaRefresherModule.prototype.onPreMediaChange = function (data, cb) {
|
2014-07-10 04:20:14 +00:00
|
|
|
if (this._interval) clearInterval(this._interval);
|
|
|
|
|
|
|
|
this._media = data;
|
2015-06-28 16:42:21 +00:00
|
|
|
var pl = this._playlist;
|
2014-07-10 04:20:14 +00:00
|
|
|
|
|
|
|
switch (data.type) {
|
|
|
|
case "gd":
|
2015-06-28 16:42:21 +00:00
|
|
|
pl._refreshing = true;
|
2014-07-10 04:46:45 +00:00
|
|
|
return this.initGoogleDocs(data, function () {
|
2015-06-28 16:42:21 +00:00
|
|
|
|
|
|
|
pl._refreshing = false;
|
2014-07-10 04:46:45 +00:00
|
|
|
cb(null, ChannelModule.PASSTHROUGH);
|
|
|
|
});
|
2014-08-07 03:12:57 +00:00
|
|
|
case "gp":
|
2015-06-28 16:42:21 +00:00
|
|
|
pl._refreshing = true;
|
2014-08-07 03:12:57 +00:00
|
|
|
return this.initGooglePlus(data, function () {
|
2015-06-28 16:42:21 +00:00
|
|
|
pl._refreshing = false;
|
2014-08-07 03:12:57 +00:00
|
|
|
cb(null, ChannelModule.PASSTHROUGH);
|
|
|
|
});
|
2014-07-10 04:20:14 +00:00
|
|
|
case "vi":
|
2015-06-28 16:42:21 +00:00
|
|
|
pl._refreshing = true;
|
2014-07-10 04:46:45 +00:00
|
|
|
return this.initVimeo(data, function () {
|
2015-06-28 16:42:21 +00:00
|
|
|
pl._refreshing = false;
|
2014-07-10 04:46:45 +00:00
|
|
|
cb(null, ChannelModule.PASSTHROUGH);
|
|
|
|
});
|
|
|
|
default:
|
|
|
|
return cb(null, ChannelModule.PASSTHROUGH);
|
2014-07-10 04:20:14 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-07-10 04:46:45 +00:00
|
|
|
MediaRefresherModule.prototype.initGoogleDocs = function (data, cb) {
|
2014-07-10 04:20:14 +00:00
|
|
|
var self = this;
|
2014-07-10 04:46:45 +00:00
|
|
|
self.refreshGoogleDocs(data, cb);
|
2014-07-10 04:20:14 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Refresh every 55 minutes.
|
|
|
|
* The expiration is 1 hour, but refresh 5 minutes early to be safe
|
|
|
|
*/
|
|
|
|
self._interval = setInterval(function () {
|
2014-07-10 04:46:45 +00:00
|
|
|
self.refreshGoogleDocs(data);
|
2014-07-10 04:20:14 +00:00
|
|
|
}, 55 * 60 * 1000);
|
|
|
|
};
|
|
|
|
|
2014-07-10 04:46:45 +00:00
|
|
|
MediaRefresherModule.prototype.initVimeo = function (data, cb) {
|
2014-07-10 04:20:14 +00:00
|
|
|
if (!Config.get("vimeo-workaround")) {
|
2014-07-10 05:15:14 +00:00
|
|
|
if (cb) cb();
|
2014-07-10 04:20:14 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var self = this;
|
|
|
|
self.channel.activeLock.lock();
|
2015-06-28 16:42:21 +00:00
|
|
|
Vimeo.extract(data.id).then(function (direct) {
|
|
|
|
if (self.dead || self.channel.dead)
|
2014-07-13 01:39:48 +00:00
|
|
|
return;
|
|
|
|
|
2014-07-10 04:20:14 +00:00
|
|
|
if (self._media === data) {
|
2015-06-28 16:42:21 +00:00
|
|
|
data.meta.direct = direct;
|
2014-07-10 04:20:14 +00:00
|
|
|
self.channel.logger.log("[mediarefresher] Refreshed vimeo video with ID " +
|
|
|
|
data.id);
|
|
|
|
}
|
|
|
|
self.channel.activeLock.release();
|
2014-07-10 04:46:45 +00:00
|
|
|
|
2015-06-28 16:42:21 +00:00
|
|
|
if (cb) cb();
|
|
|
|
}).catch(function (err) {
|
|
|
|
Logger.errlog.log("Unexpected vimeo::extract() fail: " + err.stack);
|
2014-07-10 04:46:45 +00:00
|
|
|
if (cb) cb();
|
2014-07-10 04:20:14 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2014-07-10 04:46:45 +00:00
|
|
|
MediaRefresherModule.prototype.refreshGoogleDocs = function (media, cb) {
|
2014-07-10 04:20:14 +00:00
|
|
|
var self = this;
|
|
|
|
|
|
|
|
if (self.dead || self.channel.dead) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.channel.activeLock.lock();
|
|
|
|
InfoGetter.getMedia(media.id, "gd", function (err, data) {
|
2014-07-13 01:39:48 +00:00
|
|
|
if (self.dead || self.channel.dead) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-13 05:25:55 +00:00
|
|
|
if (typeof err === "string") {
|
|
|
|
err = err.replace(/Google Drive lookup failed: /, "");
|
|
|
|
err = err.replace(/Forbidden/, "Access Denied");
|
|
|
|
err = err.replace(/You don't have permission to access this video\./,
|
|
|
|
"Access Denied");
|
|
|
|
}
|
2015-07-08 20:27:43 +00:00
|
|
|
|
2014-07-10 04:20:14 +00:00
|
|
|
switch (err) {
|
2015-07-08 20:27:43 +00:00
|
|
|
case "Moved Temporarily":
|
|
|
|
self.channel.logger.log("[mediarefresher] Google Docs refresh failed " +
|
|
|
|
"(likely redirect to login page-- make sure it is shared " +
|
|
|
|
"correctly)");
|
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
return;
|
|
|
|
case "Access Denied":
|
|
|
|
case "Not Found":
|
|
|
|
case "Internal Server Error":
|
|
|
|
case "Service Unavailable":
|
|
|
|
case "Google Drive does not permit videos longer than 1 hour to be played":
|
|
|
|
case "Google Drive videos must be shared publicly":
|
2014-07-13 01:39:48 +00:00
|
|
|
self.channel.logger.log("[mediarefresher] Google Docs refresh failed: " +
|
|
|
|
err);
|
2014-07-11 02:52:16 +00:00
|
|
|
self.channel.activeLock.release();
|
2014-07-11 02:54:26 +00:00
|
|
|
if (cb) cb();
|
2014-07-10 04:20:14 +00:00
|
|
|
return;
|
|
|
|
default:
|
|
|
|
if (err) {
|
2014-07-13 01:39:48 +00:00
|
|
|
self.channel.logger.log("[mediarefresher] Google Docs refresh failed: " +
|
|
|
|
err);
|
2014-07-10 04:20:14 +00:00
|
|
|
Logger.errlog.log("Google Docs refresh failed for ID " + media.id +
|
|
|
|
": " + err);
|
2014-07-10 04:46:45 +00:00
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
return;
|
2014-07-10 04:20:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (media !== self._media) {
|
2014-07-10 04:46:45 +00:00
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
return;
|
2014-07-10 04:20:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
self.channel.logger.log("[mediarefresher] Refreshed Google Docs video with ID " +
|
|
|
|
media.id);
|
|
|
|
media.meta = data.meta;
|
|
|
|
self.channel.activeLock.release();
|
2014-07-10 04:46:45 +00:00
|
|
|
if (cb) cb();
|
2014-07-10 04:20:14 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2014-08-07 03:12:57 +00:00
|
|
|
MediaRefresherModule.prototype.initGooglePlus = function (media, cb) {
|
|
|
|
var self = this;
|
|
|
|
|
|
|
|
if (self.dead || self.channel.dead) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.channel.activeLock.lock();
|
|
|
|
InfoGetter.getMedia(media.id, "gp", function (err, data) {
|
|
|
|
if (self.dead || self.channel.dead) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-07-13 05:25:55 +00:00
|
|
|
if (typeof err === "string") {
|
|
|
|
err = err.replace(/Forbidden/, "Access Denied");
|
|
|
|
}
|
2015-07-08 20:27:43 +00:00
|
|
|
|
2014-08-07 03:12:57 +00:00
|
|
|
switch (err) {
|
2015-07-08 20:27:43 +00:00
|
|
|
case "Access Denied":
|
|
|
|
case "Not Found":
|
|
|
|
case "Internal Server Error":
|
|
|
|
case "Service Unavailable":
|
|
|
|
case "The video is still being processed":
|
|
|
|
case "A processing error has occured":
|
|
|
|
case "The video has been processed but is not yet accessible":
|
|
|
|
case ("Unable to retreive video information. Check that the video exists " +
|
|
|
|
"and is shared publicly"):
|
2014-08-07 03:12:57 +00:00
|
|
|
self.channel.logger.log("[mediarefresher] Google+ refresh failed: " +
|
|
|
|
err);
|
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
if (err) {
|
|
|
|
self.channel.logger.log("[mediarefresher] Google+ refresh failed: " +
|
|
|
|
err);
|
|
|
|
Logger.errlog.log("Google+ refresh failed for ID " + media.id +
|
|
|
|
": " + err);
|
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (media !== self._media) {
|
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.channel.logger.log("[mediarefresher] Refreshed Google+ video with ID " +
|
|
|
|
media.id);
|
|
|
|
media.meta = data.meta;
|
|
|
|
self.channel.activeLock.release();
|
|
|
|
if (cb) cb();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2014-07-10 04:20:14 +00:00
|
|
|
module.exports = MediaRefresherModule;
|