mirror of https://github.com/calzoneman/sync.git
Use VideoJS for google+
This commit is contained in:
parent
fe9ebfa6b1
commit
ce8ac4591e
118
lib/get-info.js
118
lib/get-info.js
|
@ -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-]+)/);
|
||||||
|
|
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue