Skip to content
This repository has been archived by the owner on Jan 9, 2024. It is now read-only.

Commit

Permalink
fix: sturdy parseText (#112)
Browse files Browse the repository at this point in the history
* make parseText more sturdy

* add value to return when failed
* check if runs actually exists

* update tests

* add testcase that produced error

* update all usages of parseText

* fix parseText(undefined) error
  • Loading branch information
TimeForANinja authored Apr 10, 2021
1 parent 0ecef92 commit d95c2d7
Show file tree
Hide file tree
Showing 5 changed files with 254 additions and 6 deletions.
6 changes: 3 additions & 3 deletions lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const main = module.exports = async(linkOrId, options, rt = 3) => {
// Pass Errors from the API
if (parsed.json.alerts && !parsed.json.contents) {
let error = parsed.json.alerts.find(a => a.alertRenderer && a.alertRenderer.type === 'ERROR');
if (error) throw new Error(`API-Error: ${UTIL.parseText(error.alertRenderer.text)}`);
if (error) throw new Error(`API-Error: ${UTIL.parseText(error.alertRenderer.text, '* no message *')}`);
}

const info = parsed.json.sidebar
Expand All @@ -44,12 +44,12 @@ const main = module.exports = async(linkOrId, options, rt = 3) => {
const resp = {
id: plistId,
url: `${BASE_PLIST_URL}list=${plistId}`,
title: UTIL.parseText(info.title),
title: UTIL.parseText(info.title, ''),
estimatedItemCount: UTIL.parseIntegerFromText(info.stats[0]),
views: info.stats.length === 3 ? UTIL.parseIntegerFromText(info.stats[1]) : 0,
thumbnails,
bestThumbnail: thumbnails[0],
lastUpdated: UTIL.parseText(info.stats[2]),
lastUpdated: UTIL.parseText(info.stats[2], ''),
description: Array.isArray(info.description) && info.description.length ? UTIL.parseText(info.description) : null,
visibility: info.badges && JSON.stringify(info.badges).includes('UNLISTED') ? 'unlisted' : 'everyone',
author: !secInfo ? null : {
Expand Down
2 changes: 1 addition & 1 deletion lib/parseItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const parseItem = item => {
const author = info.shortBylineText.runs[0];

return {
title: UTIL.parseText(info.title),
title: UTIL.parseText(info.title, ''),
index: info.index ? UTIL.parseIntegerFromText(info.index) : -1,
id: info.videoId,
shortUrl: BASE_VIDEO_URL + info.videoId,
Expand Down
9 changes: 8 additions & 1 deletion lib/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,14 @@ exports.parseBody = (body, options = {}) => {
};

// Parsing utility
const parseText = exports.parseText = txt => txt.simpleText || txt.runs.map(a => a.text).join('');
const parseText = exports.parseText = (txt, def = null) => {
if (typeof txt !== 'object') return def;
if (Object.prototype.hasOwnProperty.call(txt, 'simpleText')) return txt.simpleText;
if (Array.isArray(txt.runs)) {
return txt.runs.map(a => a.text).join('');
}
return def;
};

exports.parseIntegerFromText = txt => Number(parseText(txt).replace(/\D+/g, ''));

Expand Down
227 changes: 227 additions & 0 deletions test/typeFiles/playlistVideoRenderer_04.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
{
"specialities": "video without title",
"type": "playlistVideoRenderer",
"parsed": {
"title": "",
"index": 250,
"id": "nc1kN8ZSfGQ",
"url": "https://www.youtube.com/watch?v=nc1kN8ZSfGQ&list=PLZ4DbyIWUwCq4V8bIEa8jm2ozHZVuREJP&index=250",
"shortUrl": "https://www.youtube.com/watch?v=nc1kN8ZSfGQ",
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBJqXGOsFHqvUUu0iqWMaCTMZxHrw",
"width": 336,
"height": 188
},
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEjCPYBEIoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCQlJ7Vp-MxI2GYkuP6QpqHuWWc5A",
"width": 246,
"height": 138
},
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEiCMQBEG5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ==&rs=AOn4CLARElecVBBwpl9Nl13x8gIWcOuiiw",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEiCKgBEF5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ==&rs=AOn4CLAuTSTl_O1iyg3INugshHLk1G-lWQ",
"width": 168,
"height": 94
}
],
"bestThumbnail": {
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBJqXGOsFHqvUUu0iqWMaCTMZxHrw",
"width": 336,
"height": 188
},
"isLive": false,
"duration": "0:39",
"durationSec": 39,
"isPlayable": true,
"author": {
"url": "https://www.youtube.com/c/HyperMetal101",
"channelID": "UCSezUnbvCLYBXuUlPcXU_QQ",
"name": "hyper"
}
},
"raw": {
"playlistVideoRenderer": {
"videoId": "nc1kN8ZSfGQ",
"thumbnail": {
"thumbnails": [
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEiCKgBEF5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ==&rs=AOn4CLAuTSTl_O1iyg3INugshHLk1G-lWQ",
"width": 168,
"height": 94
},
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEiCMQBEG5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ==&rs=AOn4CLARElecVBBwpl9Nl13x8gIWcOuiiw",
"width": 196,
"height": 110
},
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEjCPYBEIoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLCQlJ7Vp-MxI2GYkuP6QpqHuWWc5A",
"width": 246,
"height": 138
},
{
"url": "https://i.ytimg.com/vi/nc1kN8ZSfGQ/hqdefault.jpg?sqp=-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE=&rs=AOn4CLBJqXGOsFHqvUUu0iqWMaCTMZxHrw",
"width": 336,
"height": 188
}
]
},
"title": {
"accessibility": {
"accessibilityData": {
"label": "­ by hyper 3 years ago 39 seconds"
}
}
},
"index": {
"simpleText": "250"
},
"shortBylineText": {
"runs": [
{
"text": "hyper",
"navigationEndpoint": {
"clickTrackingParams": "CHIQxjQYMSITCMbt0Nr83-8CFWHXcwEdzOkOTg==",
"commandMetadata": {
"webCommandMetadata": {
"url": "/c/HyperMetal101",
"webPageType": "WEB_PAGE_TYPE_CHANNEL",
"rootVe": 3611,
"apiUrl": "/youtubei/v1/browse"
}
},
"browseEndpoint": {
"browseId": "UCSezUnbvCLYBXuUlPcXU_QQ",
"canonicalBaseUrl": "/c/HyperMetal101"
}
}
}
]
},
"lengthText": {
"accessibility": {
"accessibilityData": {
"label": "39 seconds"
}
},
"simpleText": "0:39"
},
"navigationEndpoint": {
"clickTrackingParams": "CHIQxjQYMSITCMbt0Nr83-8CFWHXcwEdzOkOTjIKcGxwcF92aWRlb1okVkxQTFo0RGJ5SVdVd0NxNFY4YklFYThqbTJvekhaVnVSRUpQmgEDEPos",
"commandMetadata": {
"webCommandMetadata": {
"url": "/watch?v=nc1kN8ZSfGQ&list=PLZ4DbyIWUwCq4V8bIEa8jm2ozHZVuREJP&index=250",
"webPageType": "WEB_PAGE_TYPE_WATCH",
"rootVe": 3832
}
},
"watchEndpoint": {
"videoId": "nc1kN8ZSfGQ",
"playlistId": "PLZ4DbyIWUwCq4V8bIEa8jm2ozHZVuREJP",
"index": 249,
"params": "OAI%3D"
}
},
"lengthSeconds": "39",
"trackingParams": "CHIQxjQYMSITCMbt0Nr83-8CFWHXcwEdzOkOTg==",
"isPlayable": true,
"menu": {
"menuRenderer": {
"items": [
{
"menuServiceItemRenderer": {
"text": {
"runs": [
{
"text": "Add to queue"
}
]
},
"icon": {
"iconType": "ADD_TO_QUEUE_TAIL"
},
"serviceEndpoint": {
"clickTrackingParams": "CHMQ_pgEGAIiEwjG7dDa_N_vAhVh13MBHczpDk4=",
"commandMetadata": {
"webCommandMetadata": {
"sendPost": true
}
},
"signalServiceEndpoint": {
"signal": "CLIENT_SIGNAL",
"actions": [
{
"clickTrackingParams": "CHMQ_pgEGAIiEwjG7dDa_N_vAhVh13MBHczpDk4=",
"addToPlaylistCommand": {
"openMiniplayer": true,
"videoId": "nc1kN8ZSfGQ",
"listType": "PLAYLIST_EDIT_LIST_TYPE_QUEUE",
"onCreateListCommand": {
"clickTrackingParams": "CHMQ_pgEGAIiEwjG7dDa_N_vAhVh13MBHczpDk4=",
"commandMetadata": {
"webCommandMetadata": {
"sendPost": true,
"apiUrl": "/youtubei/v1/playlist/create"
}
},
"createPlaylistServiceEndpoint": {
"videoIds": [
"nc1kN8ZSfGQ"
],
"params": "CAQ%3D"
}
},
"videoIds": [
"nc1kN8ZSfGQ"
]
}
}
]
}
},
"trackingParams": "CHMQ_pgEGAIiEwjG7dDa_N_vAhVh13MBHczpDk4="
}
}
],
"trackingParams": "CHIQxjQYMSITCMbt0Nr83-8CFWHXcwEdzOkOTg==",
"accessibility": {
"accessibilityData": {
"label": "Action menu"
}
}
}
},
"thumbnailOverlays": [
{
"thumbnailOverlayTimeStatusRenderer": {
"text": {
"accessibility": {
"accessibilityData": {
"label": "39 seconds"
}
},
"simpleText": "0:39"
},
"style": "DEFAULT"
}
},
{
"thumbnailOverlayNowPlayingRenderer": {
"text": {
"runs": [
{
"text": "Now playing"
}
]
}
}
}
]
}
}
}
16 changes: 15 additions & 1 deletion test/utils-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ describe('utils.parseText()', () => {
);
});

it('parges from runs', () => {
it('parses from runs', () => {
ASSERT.equal(
UTILS.parseText({ runs: [{ text: 'a ' }, { text: 'b' }, { text: ' c' }] }),
'a b c',
Expand All @@ -88,6 +88,20 @@ describe('utils.parseText()', () => {
'simpleText',
);
});

it('picks default withput simpletext and runs', () => {
ASSERT.equal(
UTILS.parseText({ runs: 'runs is no array' }, 'default-value'),
'default-value',
);
});

it('does not error when passed undefined', () => {
ASSERT.equal(
UTILS.parseText(undefined, 'default-value'),
'default-value',
);
});
});

describe('utils.parseIntegerFromText()', () => {
Expand Down

0 comments on commit d95c2d7

Please sign in to comment.