UNPKG

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
"use strict"; 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"];