From 20e4a35814d0e5d30f31a22b79f4fb9a32c26c4f Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Wed, 12 Oct 2022 15:29:36 +0200 Subject: [PATCH] [YouTube] Support richGridRenderer on channel pages YouTube is deploying a new layout on their channel pages, which uses richGridRenderer JSON objects. --- .../extractors/YoutubeChannelExtractor.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java index f4d9367b8..1622fbe1f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java @@ -332,16 +332,20 @@ public class YoutubeChannelExtractor extends ChannelExtractor { Page nextPage = null; if (getVideoTab() != null) { - final JsonObject gridRenderer = getVideoTab().getObject("content") + final JsonObject tabContent = getVideoTab().getObject("content"); + JsonArray items = tabContent .getObject("sectionListRenderer") .getArray("contents").getObject(0).getObject("itemSectionRenderer") - .getArray("contents").getObject(0).getObject("gridRenderer"); + .getArray("contents").getObject(0).getObject("gridRenderer").getArray("items"); + + if (items.isEmpty()) { + items = tabContent.getObject("richGridRenderer").getArray("contents"); + } final List channelIds = new ArrayList<>(); channelIds.add(getName()); channelIds.add(getUrl()); - final JsonObject continuation = collectStreamsFrom(collector, gridRenderer - .getArray("items"), channelIds); + final JsonObject continuation = collectStreamsFrom(collector, items, channelIds); nextPage = getNextPageFrom(continuation, channelIds); } @@ -433,6 +437,21 @@ public class YoutubeChannelExtractor extends ChannelExtractor { return uploaderUrl; } }); + } else if (video.has("richItemRenderer")) { + collector.commit(new YoutubeStreamInfoItemExtractor( + video.getObject("richItemRenderer") + .getObject("content").getObject("videoRenderer"), timeAgoParser) { + @Override + public String getUploaderName() { + return uploaderName; + } + + @Override + public String getUploaderUrl() { + return uploaderUrl; + } + }); + } else if (video.has("continuationItemRenderer")) { continuation = video.getObject("continuationItemRenderer"); }