react-native-youtube-info
Version:
Gets youtube info from crackpot URL (http://www.youtube.com/get_video_info)
216 lines (181 loc) • 8.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _axios = require("axios");
var _axios2 = _interopRequireDefault(_axios);
var _querystring = require("querystring");
var _lodash = require("lodash");
var _lodash2 = _interopRequireDefault(_lodash);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function prepareImageChunk(width, height, url, name) {
return {
width: width,
height: height,
url: url,
name: name
};
}
var Youtube = function () {
function Youtube() {
_classCallCheck(this, Youtube);
}
_createClass(Youtube, null, [{
key: "_crackpotUrl",
/**
* A private method to supply the formed crackpot youtube URL
* @param {string} youtubeId The youtube id from the watch URL
*/
value: function _crackpotUrl(youtubeId) {
var formedUrl = "http://www.youtube.com/get_video_info?video_id=" + youtubeId + "&el=embedded&ps=default&eurl=&gl=US&hl=en";
return formedUrl;
}
}, {
key: "_structureYoutubeResponse",
value: function _structureYoutubeResponse(response) {
var parsedBody = (0, _querystring.parse)(response);
var requiredBody = _lodash2.default.pick(parsedBody, ["title", "author", "keywords", "thumbnail_url", "url_encoded_fmt_stream_map", // Body to JSON (After , seperation)
"player_response", // String to JSON
"status"]);
var listOfVideos = requiredBody["url_encoded_fmt_stream_map"].split(",");
delete requiredBody["url_encoded_fmt_stream_map"];
requiredBody["list_videos"] = _lodash2.default.map(listOfVideos, function (item) {
return (0, _querystring.parse)(item);
});
requiredBody["player_response"] = JSON.parse(requiredBody["player_response"]);
requiredBody["images"] = Youtube._mapThumbnailUrl(requiredBody);
delete requiredBody["thumbnail_url"];
return requiredBody;
}
}, {
key: "_mapThumbnailUrl",
value: function _mapThumbnailUrl(body) {
// Lets try the unknown
var thumbnails = [prepareImageChunk(480, 360, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/0.jpg", "Thumb0"), prepareImageChunk(120, 90, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/1.jpg", "Thumb1"), prepareImageChunk(120, 90, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/2.jpg", "Thumb2"), prepareImageChunk(120, 90, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/3.jpg", "Thumb3")];
var bigImages = [prepareImageChunk(480, 360, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/hqdefault.jpg", "High"), prepareImageChunk(320, 180, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/mqdefault.jpg", "Medium"), prepareImageChunk(120, 90, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/default.jpg", "Normal"), prepareImageChunk(640, 480, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/sddefault.jpg", "Standard"), prepareImageChunk(1920, 1080, body.thumbnail_url.substring(0, body.thumbnail_url.lastIndexOf("/")) + "/maxresdefault.jpg", "MaxResolution")];
return {
thumbnails: thumbnails,
big: bigImages
};
}
}, {
key: "_verifyImages",
value: function _verifyImages(body) {
var proms = [];
var images = body.images;
_lodash2.default.forEach(images.thumbnails, function (image) {
proms.push((0, _axios2.default)({
method: "HEAD",
url: image.url,
cache: "no-cache"
}).then(function (response) {
if (response.status === 200) {
return image;
}
return false;
}));
});
_lodash2.default.forEach(images.big, function (image) {
proms.push((0, _axios2.default)({
method: "HEAD",
url: image.url,
cache: "no-cache"
}).then(function (response) {
if (response.status === 200) {
return image;
}
return false;
}));
});
return Promise.all(proms).then(function (values) {
images = _lodash2.default.filter(values, function (item) {
return item;
});
body.images = images;
return body;
});
}
}, {
key: "_attachHelperMethods",
value: function _attachHelperMethods(body) {
var videoOrdered = Youtube._mapOrder(body.list_videos, ["highres", "hd1080", "hd720", "large", "medium", "small", "tiny"], "quality");
var imagesOrdered = _lodash2.default.filter(body.images, function (item) {
return !["Thumb1", "Thumb2", "Thumb3"].includes(item.name);
});
imagesOrdered = Youtube._mapOrder(imagesOrdered, ["MaxResolution", "Standard", "High", "Thumb0", "Medium", "Normal"], "name");
body.getHighestQualityImage = function () {
return _lodash2.default.first(imagesOrdered);
};
body.getHighestQualityVideo = function () {
return _lodash2.default.first(videoOrdered);
};
body.getLowestQualityImage = function () {
return _lodash2.default.last(imagesOrdered);
};
body.getLowestQualityVideo = function () {
return _lodash2.default.last(videoOrdered);
};
return body;
}
/**
* Sort array of objects based on another array
*/
}, {
key: "_mapOrder",
value: function _mapOrder(array, order, key) {
array.sort(function (a, b) {
var A = a[key],
B = b[key];
if (order.indexOf(A) > order.indexOf(B)) {
return 1;
} else {
return -1;
}
});
return array;
}
}, {
key: "_checkForYoutubeFailure",
value: function _checkForYoutubeFailure(response) {
if (response.indexOf("status=fail") !== -1) {
var parsedBody = (0, _querystring.parse)(response);
var error = new Error(parsedBody.reason);
error.code = parsedBody.errorcode;
throw error;
}
return response;
}
/**
* A method to fetch the required youtube info from the crackpot URL
* @param {string} youtubeId The youtube id from the watch URL
* example: https://www.youtube.com/watch?v=HmZKgaHa3Fg
* HmZKgaHa3Fg would be the youtube video id
*/
}, {
key: "getVideoInfo",
value: function getVideoInfo(youtubeId) {
var youtubeUrl = Youtube._crackpotUrl(youtubeId);
return _axios2.default.get(youtubeUrl).then(function (response) {
// If we get a positive response, lets take it an try getting the information out
if (response.status === 200) {
return response.data;
} else {
throw new Error("Response code is not acceptable to proceed further");
}
}).then(function (response) {
return Youtube._checkForYoutubeFailure(response);
}).then(function (response) {
return Youtube._structureYoutubeResponse(response);
}).then(function (body) {
return Youtube._verifyImages(body);
}).then(function (body) {
return Youtube._attachHelperMethods(body);
});
}
}]);
return Youtube;
}();
exports.default = Youtube;
module.exports = exports["default"];