Start working on VideoJS for Google Drive
This commit is contained in:
parent
daf2463a6a
commit
fe9ebfa6b1
5 changed files with 293 additions and 94 deletions
109
lib/get-info.js
109
lib/get-info.js
|
|
@ -7,7 +7,7 @@ var CustomEmbedFilter = require("./customembed").filter;
|
|||
var Server = require("./server");
|
||||
var Config = require("./config");
|
||||
var ffmpeg = require("./ffmpeg");
|
||||
require("cytube-mediaquery"); // Initialize sourcemaps
|
||||
var mediaquery = require("cytube-mediaquery");
|
||||
var YouTube = require("cytube-mediaquery/lib/provider/youtube");
|
||||
|
||||
/*
|
||||
|
|
@ -62,6 +62,17 @@ var urlRetrieve = function (transport, options, callback) {
|
|||
req.end();
|
||||
};
|
||||
|
||||
var mediaTypeMap = {
|
||||
"youtube": "yt",
|
||||
"googledrive": "gd",
|
||||
"google+": "gp"
|
||||
};
|
||||
|
||||
function convertMedia(media) {
|
||||
return new Media(media.id, media.title, media.duration, mediaTypeMap[media.type],
|
||||
media.meta);
|
||||
}
|
||||
|
||||
var Getters = {
|
||||
/* youtube.com */
|
||||
yt: function (id, callback) {
|
||||
|
|
@ -506,96 +517,16 @@ var Getters = {
|
|||
|
||||
/* google docs */
|
||||
gd: function (id, callback) {
|
||||
/* WARNING: hacks inbound */
|
||||
var options = {
|
||||
host: "docs.google.com",
|
||||
path: "/file/d/" + id + "/get_video_info?sle=true",
|
||||
port: 443
|
||||
var data = {
|
||||
type: "googledrive",
|
||||
kind: "single",
|
||||
id: id
|
||||
};
|
||||
|
||||
urlRetrieve(https, options, function (status, res) {
|
||||
switch (status) {
|
||||
case 200:
|
||||
break; /* Request is OK, skip to handling data */
|
||||
case 400:
|
||||
return callback("Invalid request", null);
|
||||
case 403:
|
||||
return callback("Private video", null);
|
||||
case 404:
|
||||
return callback("Video not found", null);
|
||||
case 500:
|
||||
case 503:
|
||||
return callback("Service unavailable", null);
|
||||
default:
|
||||
return callback("HTTP " + status, null);
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
var data = {};
|
||||
res.split("&").forEach(function (urlparam) {
|
||||
var pair = urlparam.split("=").map(decodeURIComponent).map(
|
||||
function (s) { return s.replace(/\+/g, ' '); });
|
||||
data[pair[0]] = pair[1];
|
||||
});
|
||||
|
||||
if (data.hasOwnProperty("reason")) {
|
||||
var reason = data.reason;
|
||||
if (reason.indexOf("Unable to play this video at this time.") === 0) {
|
||||
reason = "There is currently a bug with Google Drive which prevents playback " +
|
||||
"of videos 1 hour long or longer.";
|
||||
} else if (reason.indexOf(
|
||||
"You must be signed in to access this video") >= 0) {
|
||||
reason = "This video is not shared properly";
|
||||
}
|
||||
|
||||
|
||||
return callback(reason);
|
||||
}
|
||||
|
||||
if (!data.hasOwnProperty("title")) {
|
||||
return callback("Returned HTML is missing the video title. Are you " +
|
||||
"sure the video is done processing?");
|
||||
}
|
||||
|
||||
if (!data.hasOwnProperty("length_seconds")) {
|
||||
return callback("Returned HTML is missing the video duration. Are you " +
|
||||
"sure the video is done processing?");
|
||||
}
|
||||
|
||||
var title = data.title;
|
||||
var seconds = parseInt(data.length_seconds);
|
||||
|
||||
var videos = {};
|
||||
data.fmt_stream_map.split(",").forEach(function (stream) {
|
||||
var parts = stream.split("|");
|
||||
videos[parts[0]] = parts[1];
|
||||
});
|
||||
|
||||
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],
|
||||
contentType: CONTENT_TYPES[format]
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(direct).length === 0) {
|
||||
return callback("No valid links could be extracted", null);
|
||||
}
|
||||
|
||||
callback(null, new Media(id, title, seconds, "gd", { gpdirect: direct }));
|
||||
} catch (e) {
|
||||
return callback("Failed to parse Google Docs output", null);
|
||||
}
|
||||
mediaquery.lookup(data).then(function (video) {
|
||||
callback(null, convertMedia(video));
|
||||
}).catch(function (err) {
|
||||
callback(err.message || err);
|
||||
});
|
||||
},
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue