diff --git a/lib/channel/mediarefresher.js b/lib/channel/mediarefresher.js index bb3def8a..6d4d7428 100644 --- a/lib/channel/mediarefresher.js +++ b/lib/channel/mediarefresher.js @@ -1,3 +1,4 @@ +var Vimeo = require("cytube-mediaquery/lib/provider/vimeo"); var ChannelModule = require("./module"); var Config = require("../config"); var InfoGetter = require("../get-info"); @@ -7,6 +8,7 @@ function MediaRefresherModule(channel) { ChannelModule.apply(this, arguments); this._interval = false; this._media = null; + this._playlist = channel.modules.playlist; } MediaRefresherModule.prototype = Object.create(ChannelModule.prototype); @@ -15,18 +17,26 @@ MediaRefresherModule.prototype.onPreMediaChange = function (data, cb) { if (this._interval) clearInterval(this._interval); this._media = data; + var pl = this._playlist; switch (data.type) { case "gd": + pl._refreshing = true; return this.initGoogleDocs(data, function () { + + pl._refreshing = false; cb(null, ChannelModule.PASSTHROUGH); }); case "gp": + pl._refreshing = true; return this.initGooglePlus(data, function () { + pl._refreshing = false; cb(null, ChannelModule.PASSTHROUGH); }); case "vi": + pl._refreshing = true; return this.initVimeo(data, function () { + pl._refreshing = false; cb(null, ChannelModule.PASSTHROUGH); }); default: @@ -55,18 +65,20 @@ MediaRefresherModule.prototype.initVimeo = function (data, cb) { var self = this; self.channel.activeLock.lock(); - InfoGetter.vimeoWorkaround(data.id, function (hack) { - if (self.dead || self.channel.dead) { + Vimeo.extract(data.id).then(function (direct) { + if (self.dead || self.channel.dead) return; - } if (self._media === data) { + data.meta.direct = direct; self.channel.logger.log("[mediarefresher] Refreshed vimeo video with ID " + data.id); - data.meta.direct = hack; } self.channel.activeLock.release(); + if (cb) cb(); + }).catch(function (err) { + Logger.errlog.log("Unexpected vimeo::extract() fail: " + err.stack); if (cb) cb(); }); }; diff --git a/lib/channel/playlist.js b/lib/channel/playlist.js index 327d1323..42fbf508 100644 --- a/lib/channel/playlist.js +++ b/lib/channel/playlist.js @@ -3,7 +3,6 @@ var AsyncQueue = require("../asyncqueue"); var Media = require("../media"); var util = require("../utilities"); var InfoGetter = require("../get-info"); -var vimeoWorkaround = InfoGetter.vimeoWorkaround; var Config = require("../config"); var Flags = require("../flags"); var db = require("../database"); @@ -90,7 +89,7 @@ function PlaylistModule(channel) { this._leadInterval = false; this._lastUpdate = 0; this._counter = 0; - this._gdRefreshTimer = false; + this._refreshing = false; if (this.channel.modules.chat) { this.channel.modules.chat.registerCommand("/clean", this.handleClean.bind(this)); @@ -167,11 +166,6 @@ PlaylistModule.prototype.unload = function () { this._leadInterval = false; } - if (this._gdRefreshTimer) { - clearInterval(this._gdRefreshTimer); - this._gdRefreshTimer = false; - } - this.channel = null; }; @@ -265,7 +259,7 @@ PlaylistModule.prototype.sendPlaylist = function (users) { }; PlaylistModule.prototype.sendChangeMedia = function (users) { - if (!this.current || !this.current.media) { + if (!this.current || !this.current.media || this._refreshing) { return; } @@ -1116,8 +1110,6 @@ PlaylistModule.prototype.refreshGoogleDocs = function (cb) { } var abort = function () { - clearInterval(self._gdRefreshTimer); - self._gdRefreshTimer = false; if (self.current) { self.current.media.meta.object = self.current.media.meta.object || null; self.current.media.meta.failed = true; diff --git a/lib/get-info.js b/lib/get-info.js index 0925eaa7..375949a4 100644 --- a/lib/get-info.js +++ b/lib/get-info.js @@ -832,97 +832,6 @@ var Getters = { }, }; -/** - * Function to workaround Vimeo being a dick and blocking my domain from embeds. - * Retrieves the player page and extracts the direct links to the MP4 encoded videos. - */ -function vimeoWorkaround(id, cb) { - if (typeof cb !== "function") { - return; - } - - var failcount = 0; - - var inner = function () { - var options = { - host: "player.vimeo.com", - path: "/video/" + id, - headers: { - "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0", - "Referrer": "player.vimeo.com" - } - }; - - var parse = function (data) { - var i = data.indexOf("{\"cdn_url\""); - if (i === -1) { - setImmediate(function () { - cb({}); - }); - return; - } - var j = data.indexOf("};", i); - var json = data.substring(i, j+1); - try { - json = JSON.parse(json); - if (!json.request.files) { - setImmediate(function () { - cb({}); - }); - return; - } - var codec = json.request.files.codecs[0]; - var files = json.request.files[codec]; - setImmediate(function () { - cb(files); - }); - } catch (e) { - // This shouldn't happen due to the user-agent, but just in case - if (data.indexOf("crawler") !== -1) { - Logger.syslog.log("Warning: vimdeoWorkaround got crawler response"); - failcount++; - if (failcount > 4) { - Logger.errlog.log("vimeoWorkaround got bad response 5 times!"+ - " Giving up."); - setImmediate(function () { - cb({}); - }); - } else { - setImmediate(function () { - inner(); - }); - } - return; - } else if (data.indexOf("This video does not exist.") !== -1) { - cb({}); - return; - } else if (data.indexOf("Because of its privacy settings, this video cannot be played here.") !== -1) { - cb({}); - } - Logger.errlog.log("Vimeo workaround error: "); - Logger.errlog.log(e); - Logger.errlog.log("http://vimeo.com/" + id); - setImmediate(function () { - cb({}); - }); - } - }; - - urlRetrieve(http, options, function (status, buffer) { - if (status !== 200) { - setImmediate(function () { - cb({}); - }); - return; - } - - parse(buffer); - }); - }; - - inner(); -} - module.exports = { Getters: Getters, getMedia: function (id, type, callback) { @@ -931,7 +840,5 @@ module.exports = { } else { callback("Unknown media type '" + type + "'", null); } - }, - - vimeoWorkaround: vimeoWorkaround + } }; diff --git a/player/update.coffee b/player/update.coffee index 83090d14..8550bdb0 100644 --- a/player/update.coffee +++ b/player/update.coffee @@ -14,7 +14,9 @@ TYPE_MAP = im: ImgurPlayer window.loadMediaPlayer = (data) -> - if data.type of TYPE_MAP + if data.meta.direct + window.PLAYER = new VideoJSPlayer(data) + else if data.type of TYPE_MAP try window.PLAYER = TYPE_MAP[data.type](data) catch e diff --git a/player/videojs.coffee b/player/videojs.coffee index ea745146..913506cf 100644 --- a/player/videojs.coffee +++ b/player/videojs.coffee @@ -17,6 +17,7 @@ sortSources = (sources) -> flv = [] nonflv = [] sources[quality].forEach((source) -> + source.quality = quality if source.contentType == 'flv' flv.push(source) else @@ -28,6 +29,7 @@ sortSources = (sources) -> return sourceOrder.concat(flvOrder).map((source) -> type: "video/#{source.contentType}" src: source.link + quality: source.quality ) window.VideoJSPlayer = class VideoJSPlayer extends Player @@ -45,18 +47,17 @@ window.VideoJSPlayer = class VideoJSPlayer extends Player sources = sortSources(data.meta.direct) if sources.length == 0 - # Temporary fix for race condition caused by channel playlist - # sending a changeMedia in onPostUserJoin before mediarefresher - # has refreshed it. - # TODO: Actually fix this on the server side rather than this - # hack. + console.error('VideoJSPlayer::constructor(): data.meta.direct + has no sources!') @mediaType = null return sources.forEach((source) -> - $('').attr('src', source.src) - .attr('type', source.type) - .appendTo(video) + $('').attr( + src: source.src + type: source.type + 'data-quality': source.quality + ).appendTo(video) ) @player = videojs(video[0], autoplay: true, controls: true) diff --git a/www/js/player-new.js b/www/js/player-new.js index 800f15f7..fef60edc 100644 --- a/www/js/player-new.js +++ b/www/js/player-new.js @@ -465,6 +465,7 @@ flv = []; nonflv = []; sources[quality].forEach(function(source) { + source.quality = quality; if (source.contentType === 'flv') { return flv.push(source); } else { @@ -478,7 +479,8 @@ return sourceOrder.concat(flvOrder).map(function(source) { return { type: "video/" + source.contentType, - src: source.link + src: source.link, + quality: source.quality }; }); }; @@ -501,11 +503,16 @@ removeOld(video); sources = sortSources(data.meta.direct); if (sources.length === 0) { + console.error('VideoJSPlayer::constructor(): data.meta.direct has no sources!'); _this.mediaType = null; return; } sources.forEach(function(source) { - return $('').attr('src', source.src).attr('type', source.type).appendTo(video); + return $('').attr({ + src: source.src, + type: source.type, + 'data-quality': source.quality + }).appendTo(video); }); _this.player = videojs(video[0], { autoplay: true, @@ -983,7 +990,9 @@ window.loadMediaPlayer = function(data) { var e; - if (data.type in TYPE_MAP) { + if (data.meta.direct) { + return window.PLAYER = new VideoJSPlayer(data); + } else if (data.type in TYPE_MAP) { try { return window.PLAYER = TYPE_MAP[data.type](data); } catch (_error) {