From f2136d8cd9642f1e7854bb870baf2940353960bf Mon Sep 17 00:00:00 2001 From: Yonle Date: Sun, 15 Jan 2023 21:52:16 +0700 Subject: [PATCH 1/4] parseItem: Return channel obj as null if no playerHeader Related issue: https://github.com/TimeForANinja/node-ytsr/issues/174 Signed-off-by: Yonle --- lib/parseItem.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/parseItem.js b/lib/parseItem.js index 4caa1a8..94ef37e 100644 --- a/lib/parseItem.js +++ b/lib/parseItem.js @@ -351,9 +351,10 @@ const parseMovie = obj => { }; const parseShort = obj => { - const playerHeader = obj.navigationEndpoint.reelWatchEndpoint.overlay - .reelPlayerOverlayRenderer.reelPlayerHeaderSupportedRenderers.reelPlayerHeaderRenderer; - const channelNavEndpoint = playerHeader.channelTitleText.runs[0].navigationEndpoint; + const playerOverlay = obj.navigationEndpoint.reelWatchEndpoint.overlay.reelPlayerOverlayRenderer; + const playerHeader = playerOverlay.reelPlayerHeaderSupportedRenderers && + playerOverlay.reelPlayerHeaderSupportedRenderers.reelPlayerHeaderRenderer; + return { type: 'short', title: UTIL.parseText(obj.headline, ''), @@ -364,13 +365,18 @@ const parseShort = obj => { views: UTIL.parseText(obj.viewCountText, ''), published: UTIL.parseText(playerHeader.timestampText, ''), - channel: { - name: UTIL.parseText(playerHeader.channelTitleText, ''), - channelID: channelNavEndpoint.browseEndpoint.browseId, - url: new URL(channelNavEndpoint.commandMetadata.webCommandMetadata.url, BASE_VIDEO_URL).toString(), - bestAvatar: prepImg(playerHeader.channelThumbnail.thumbnails)[0] || null, - avatars: prepImg(playerHeader.channelThumbnail.thumbnails), - }, + channel: (() => { + if (!playerHeader) return null; + + const channelNavEndpoint = playerHeader.channelTitleText.runs[0].navigationEndpoint; + return { + name: UTIL.parseText(playerHeader.channelTitleText, ''), + channelID: channelNavEndpoint.browseEndpoint.browseId, + url: new URL(channelNavEndpoint.commandMetadata.webCommandMetadata.url, BASE_VIDEO_URL).toString(), + bestAvatar: prepImg(playerHeader.channelThumbnail.thumbnails)[0] || null, + avatars: prepImg(playerHeader.channelThumbnail.thumbnails), + } + })(), }; }; From ede368022efd0073e524b7bf1cf7d716b795f85c Mon Sep 17 00:00:00 2001 From: Yonle Date: Sun, 15 Jan 2023 22:18:40 +0700 Subject: [PATCH 2/4] parseItem: Make "published" as null if no playerHeader Signed-off-by: Yonle --- lib/parseItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parseItem.js b/lib/parseItem.js index 94ef37e..aaa6d9a 100644 --- a/lib/parseItem.js +++ b/lib/parseItem.js @@ -363,7 +363,7 @@ const parseShort = obj => { bestThumbnail: prepImg(obj.thumbnail.thumbnails)[0], thumbnails: prepImg(obj.thumbnail.thumbnails), views: UTIL.parseText(obj.viewCountText, ''), - published: UTIL.parseText(playerHeader.timestampText, ''), + published: UTIL.parseText(playerHeader && playerHeader.timestampText, ''), channel: (() => { if (!playerHeader) return null; From e927bbe5f9bc6395f5953d34182800d6f28e86dc Mon Sep 17 00:00:00 2001 From: Yonle Date: Tue, 17 Jan 2023 22:50:49 +0700 Subject: [PATCH 3/4] parseItem: Ignore adSlotRenderer for now Signed-off-by: Yonle --- lib/parseItem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/parseItem.js b/lib/parseItem.js index aaa6d9a..da7bbde 100644 --- a/lib/parseItem.js +++ b/lib/parseItem.js @@ -56,6 +56,7 @@ const parseItem = (item, resp) => { return parseClarification(item[type]); // Skip Adds for now + case 'adSlotRenderer': case 'carouselAdRenderer': case 'searchPyvRenderer': case 'promotedVideoRenderer': From d2f0342141d3d185cde745645b7f1e3840eb2322 Mon Sep 17 00:00:00 2001 From: Yonle Date: Wed, 18 Jan 2023 07:26:39 +0700 Subject: [PATCH 4/4] parseItem: Get "LIVE" badges, not "LIVE NOW" Signed-off-by: Yonle --- lib/parseItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/parseItem.js b/lib/parseItem.js index da7bbde..77abb9a 100644 --- a/lib/parseItem.js +++ b/lib/parseItem.js @@ -121,7 +121,7 @@ const parseVideo = obj => { author.navigationEndpoint.commandMetadata.webCommandMetadata.url; } const badges = Array.isArray(obj.badges) ? obj.badges.map(a => a.metadataBadgeRenderer.label) : []; - const isLive = badges.some(b => b === 'LIVE NOW'); + const isLive = badges.some(b => b === 'LIVE'); const upcoming = obj.upcomingEventData ? Number(`${obj.upcomingEventData.startTime}000`) : null; const ctsr = obj.channelThumbnailSupportedRenderers; const authorImg = !ctsr ? { thumbnail: { thumbnails: [] } } : ctsr.channelThumbnailWithLinkRenderer;