diff --git a/lib/info-extras.js b/lib/info-extras.js index e1c38dcc..beb0e79d 100644 --- a/lib/info-extras.js +++ b/lib/info-extras.js @@ -172,23 +172,37 @@ exports.getRelatedVideos = info => { /** * Get like count. * - * @param {string} body - * @return {number} + * @param {string} info + * @returns {number} */ -const getLikesRegex = /"label":"([\d,]+?) likes"/; -exports.getLikes = body => { - const likes = body.match(getLikesRegex); - return likes ? parseInt(likes[1].replace(/,/g, '')) : null; +exports.getLikes = info => { + try { + let contents = info.response.contents.twoColumnWatchNextResults.results.results.contents; + let video = contents.find(r => r.videoPrimaryInfoRenderer); + let buttons = video.videoPrimaryInfoRenderer.videoActions.menuRenderer.topLevelButtons; + let like = buttons.find(b => b.toggleButtonRenderer && + b.toggleButtonRenderer.defaultIcon.iconType === 'LIKE'); + return parseInt(like.toggleButtonRenderer.defaultText.accessibility.accessibilityData.label.replace(/\D+/g, '')); + } catch (err) { + return null; + } }; /** * Get dislike count. * - * @param {string} body - * @return {number} + * @param {string} info + * @returns {number} */ -const getDislikesRegex = /"label":"([\d,]+?) dislikes"/; -exports.getDislikes = body => { - const dislikes = body.match(getDislikesRegex); - return dislikes ? parseInt(dislikes[1].replace(/,/g, '')) : null; +exports.getDislikes = info => { + try { + let contents = info.response.contents.twoColumnWatchNextResults.results.results.contents; + let video = contents.find(r => r.videoPrimaryInfoRenderer); + let buttons = video.videoPrimaryInfoRenderer.videoActions.menuRenderer.topLevelButtons; + let dislike = buttons.find(b => b.toggleButtonRenderer && + b.toggleButtonRenderer.defaultIcon.iconType === 'DISLIKE'); + return parseInt(dislike.toggleButtonRenderer.defaultText.accessibility.accessibilityData.label.replace(/\D+/g, '')); + } catch (err) { + return null; + } }; diff --git a/lib/info.js b/lib/info.js index f0c45296..319c1d69 100644 --- a/lib/info.js +++ b/lib/info.js @@ -31,7 +31,7 @@ exports.watchPageCache = new Cache(); * @returns {Promise} */ exports.getBasicInfo = async(id, options) => { - let [info, body] = await getJSONWatchPage(id, options); + let info = await getJSONWatchPage(id, options); let player_response = (info.player && info.player.args && info.player.args.player_response) || info.player_response || info.playerResponse; @@ -74,8 +74,8 @@ exports.getBasicInfo = async(id, options) => { let additional = { author: extras.getAuthor(info), media: extras.getMedia(info), - likes: extras.getLikes(body), - dislikes: extras.getDislikes(body), + likes: extras.getLikes(info), + dislikes: extras.getDislikes(info), age_restricted, // Give the standard link to the video. @@ -184,7 +184,7 @@ const getJSONWatchPage = async(id, options, maxRetries = 1) => { throw Error('Unable to retrieve video metadata'); } let info = parsedBody.reduce((part, curr) => Object.assign(curr, part), {}); - return [info, body]; + return info; }; const getEmbedURL = (id, options) => `${EMBED_URL + id}?hl=${options.lang || 'en'}`; diff --git a/test/info-extras-test.js b/test/info-extras-test.js index 6339deb2..7dbf8d37 100644 --- a/test/info-extras-test.js +++ b/test/info-extras-test.js @@ -1,5 +1,3 @@ -const fs = require('fs'); -const path = require('path'); const assert = require('assert-diff'); const extras = require('../lib/info-extras'); @@ -151,17 +149,15 @@ describe('extras.getRelatedVideos()', () => { describe('extras.getLikes()', () => { it('Returns like count', () => { - let html = fs.readFileSync(path.resolve(__dirname, - 'files/videos/regular/watch.json'), 'utf8'); - const likes = extras.getLikes(html); + const info = require('./files/videos/regular/watch.json')[3]; + const likes = extras.getLikes(info); assert.strictEqual(typeof likes, 'number'); }); describe('With no likes', () => { it('Does not return likes', () => { - let html = fs.readFileSync(path.resolve(__dirname, - 'files/videos/no-likes-or-dislikes/watch.json'), 'utf8'); - const likes = extras.getLikes(html); + const info = require('./files/videos/no-likes-or-dislikes/watch.json')[3]; + const likes = extras.getLikes(info); assert.strictEqual(likes, null); }); }); @@ -169,17 +165,15 @@ describe('extras.getLikes()', () => { describe('extras.getDislikes()', () => { it('Returns dislike count', () => { - let html = fs.readFileSync(path.resolve(__dirname, - 'files/videos/regular/watch.json'), 'utf8'); - const dislikes = extras.getDislikes(html); + const info = require('./files/videos/regular/watch.json')[3]; + const dislikes = extras.getDislikes(info); assert.strictEqual(typeof dislikes, 'number'); }); describe('With no dislikes', () => { it('Does not return dislikes', () => { - let html = fs.readFileSync(path.resolve(__dirname, - 'files/videos/no-likes-or-dislikes/watch.json'), 'utf8'); - const dislikes = extras.getDislikes(html); + const info = require('./files/videos/no-likes-or-dislikes/watch.json')[3]; + const dislikes = extras.getDislikes(info); assert.strictEqual(dislikes, null); }); });