Use VideoJS for google+

This commit is contained in:
calzoneman 2015-05-15 01:19:08 -05:00
parent fe9ebfa6b1
commit ce8ac4591e
3 changed files with 22 additions and 109 deletions

View file

@ -530,6 +530,21 @@ var Getters = {
}); });
}, },
/* Google+ videos */
gp: function (id, callback) {
var data = {
type: "google+",
kind: "single",
id: id
};
mediaquery.lookup(data).then(function (video) {
callback(null, convertMedia(video));
}).catch(function (err) {
callback(err.message || err);
});
},
/* ffmpeg for raw files */ /* ffmpeg for raw files */
fi: function (id, cb) { fi: function (id, cb) {
ffmpeg.query(id, function (err, data) { ffmpeg.query(id, function (err, data) {
@ -545,109 +560,6 @@ var Getters = {
}); });
}, },
/*
* Google+ videos
*
* Also known as Picasa Web Albums.
*
*/
gp: function (id, cb) {
var idparts = id.split("_");
if (idparts.length !== 3) {
return cb("Invalid Google+ video ID");
}
var options = {
host: "picasaweb.google.com",
path: '/data/feed/api/user/'+idparts[0]+'/albumid/'+idparts[1]+'/photoid/'+idparts[2]+'?kind=tag',
port: 443
};
urlRetrieve(https, options, function (status, res) {
switch (status) {
case 200:
break; /* Request is OK, skip to handling data */
case 400:
return cb("Invalid request", null);
case 403:
return cb("Private video", null);
case 404:
return cb("Video not found", null);
case 500:
case 503:
return cb("Service unavailable", null);
default:
return cb("HTTP " + status, null);
}
try {
var $ = cheerio.load(res, { xmlMode: true });
switch ($("gphoto\\:videostatus").text()) {
case "final":
break; /* Incoming Fun. */
case "pending":
return cb("The video is still being processed.", null);
case "failed":
return cb("A processing error has occured and the video should be deleted.", null);
case "ready":
return cb("The video has been processed but still needs a thumbnail.", null);
}
var duration = parseInt($("gphoto\\:originalvideo").attr("duration"),10);
var title = $("media\\:title").text();
var videos = {};
$('media\\:content[medium="video"]').each(function(index, element){
var url = $(this).attr("url");
var match = url.match(/itag=(\d+)/)
if (!match) {
match = url.match(/googleusercontent.*=m(\d+)$/);
}
if (match && match[1]) {
var type = match[1];
videos[type] = {
format: type,
link: url
};
}
});
$ = null;
var direct = {};
for (var key in GOOGLE_PREFERENCE) {
for (var i = 0; i < GOOGLE_PREFERENCE[key].length; i++) {
var format = GOOGLE_PREFERENCE[key][i];
if (format in videos) {
direct[key] = {
url: videos[format].link,
contentType: CONTENT_TYPES[format]
};
break;
}
}
}
if (Object.keys(direct).length === 0) {
return cb("Unable to retrieve video data from Google+. The videos " +
"may have not finished processing yet.");
} else if (!title) {
return cb("Unable to retrieve title from Google+. Check that " +
"the album exists and is shared publicly.");
} else if (!duration) {
return cb("Unable to retreive duration from Google+. This might be " +
"because the video is still processing.");
}
var media = new Media(id, title, duration, "gp", { gpdirect: direct });
cb(null, media);
} catch (e) {
cb("Unknown error");
Logger.errlog.log("Unknown error for Google+ ID " + id + ": " + e.stack);
}
});
},
/* hitbox.tv */ /* hitbox.tv */
hb: function (id, callback) { hb: function (id, callback) {
var m = id.match(/([\w-]+)/); var m = id.match(/([\w-]+)/);

View file

@ -3,6 +3,7 @@ TYPE_MAP =
vi: VimeoPlayer vi: VimeoPlayer
dm: DailymotionPlayer dm: DailymotionPlayer
gd: VideoJSPlayer gd: VideoJSPlayer
gp: VideoJSPlayer
window.loadMediaPlayer = (data) -> window.loadMediaPlayer = (data) ->
if data.type of TYPE_MAP if data.type of TYPE_MAP
@ -63,10 +64,9 @@ window.handleMediaUpdate = (data) ->
# Dailymotion can't seek very accurately in Flash due to keyframe # Dailymotion can't seek very accurately in Flash due to keyframe
# placement. Accuracy should not be set lower than 5 or the video # placement. Accuracy should not be set lower than 5 or the video
# may be very choppy. # may be very choppy.
if PLAYER.mediaType is 'dm' # TODO: instanceof DailymotionPlayer if PLAYER instanceof DailymotionPlayer
accuracy = Math.max(accuracy, 5) accuracy = Math.max(accuracy, 5)
if diff > accuracy if diff > accuracy
# The player is behind the correct time # The player is behind the correct time
PLAYER.seekTo(time) PLAYER.seekTo(time)
@ -75,7 +75,7 @@ window.handleMediaUpdate = (data) ->
# Don't seek all the way back, to account for possible buffering. # Don't seek all the way back, to account for possible buffering.
# However, do seek all the way back for Dailymotion due to the # However, do seek all the way back for Dailymotion due to the
# keyframe issue mentioned above. # keyframe issue mentioned above.
if PLAYER.mediaType isnt 'dm' # TODO: instanceof DailymotionPlayer if not (PLAYER instanceof DailymotionPlayer)
time += 1 time += 1
PLAYER.seekTo(time) PLAYER.seekTo(time)
) )

View file

@ -597,7 +597,8 @@
yt: YouTubePlayer, yt: YouTubePlayer,
vi: VimeoPlayer, vi: VimeoPlayer,
dm: DailymotionPlayer, dm: DailymotionPlayer,
gd: VideoJSPlayer gd: VideoJSPlayer,
gp: VideoJSPlayer
}; };
window.loadMediaPlayer = function(data) { window.loadMediaPlayer = function(data) {
@ -651,13 +652,13 @@
time = data.currentTime; time = data.currentTime;
diff = (time - seconds) || time; diff = (time - seconds) || time;
accuracy = USEROPTS.sync_accuracy; accuracy = USEROPTS.sync_accuracy;
if (PLAYER.mediaType === 'dm') { if (PLAYER instanceof DailymotionPlayer) {
accuracy = Math.max(accuracy, 5); accuracy = Math.max(accuracy, 5);
} }
if (diff > accuracy) { if (diff > accuracy) {
return PLAYER.seekTo(time); return PLAYER.seekTo(time);
} else if (diff < -accuracy) { } else if (diff < -accuracy) {
if (PLAYER.mediaType !== 'dm') { if (!(PLAYER instanceof DailymotionPlayer)) {
time += 1; time += 1;
} }
return PLAYER.seekTo(time); return PLAYER.seekTo(time);