@@ -92,25 +92,63 @@ public String getName() throws ParsingException {
9292
9393 @ Nonnull
9494 @ Override
95- public InfoItemsPage <StreamInfoItem > getInitialPage () {
95+ public InfoItemsPage <StreamInfoItem > getInitialPage () throws ParsingException {
9696 final StreamInfoItemsCollector collector = new StreamInfoItemsCollector (getServiceId ());
9797 final TimeAgoParser timeAgoParser = getTimeAgoParser ();
98- final JsonArray itemSectionRenderers = initialData .getObject ("contents" )
99- .getObject ("twoColumnBrowseResultsRenderer" ).getArray ("tabs" ).getObject (0 )
100- .getObject ("tabRenderer" ).getObject ("content" ).getObject ("sectionListRenderer" )
101- .getArray ("contents" );
102-
103- for (final Object itemSectionRenderer : itemSectionRenderers ) {
104- final JsonObject expandedShelfContentsRenderer = ((JsonObject ) itemSectionRenderer )
105- .getObject ("itemSectionRenderer" ).getArray ("contents" ).getObject (0 )
106- .getObject ("shelfRenderer" ).getObject ("content" )
107- .getObject ("expandedShelfContentsRenderer" );
108- for (final Object ul : expandedShelfContentsRenderer .getArray ("items" )) {
109- final JsonObject videoInfo = ((JsonObject ) ul ).getObject ("videoRenderer" );
110- collector .commit (new YoutubeStreamInfoItemExtractor (videoInfo , timeAgoParser ));
111- }
98+ final JsonObject tabContent = getTrendingTabRenderer ().getObject ("content" );
99+
100+ if (tabContent .has ("richGridRenderer" )) {
101+ tabContent .getObject ("richGridRenderer" )
102+ .getArray ("contents" )
103+ .stream ()
104+ .filter (JsonObject .class ::isInstance )
105+ .map (JsonObject .class ::cast )
106+ // Filter Trending shorts and Recently trending sections
107+ .filter (content -> content .has ("richItemRenderer" ))
108+ .map (content -> content .getObject ("richItemRenderer" )
109+ .getObject ("content" )
110+ .getObject ("videoRenderer" ))
111+ .forEachOrdered (videoRenderer -> collector .commit (
112+ new YoutubeStreamInfoItemExtractor (videoRenderer , timeAgoParser )));
113+ } else if (tabContent .has ("sectionListRenderer" )) {
114+ tabContent .getObject ("sectionListRenderer" )
115+ .getArray ("contents" )
116+ .stream ()
117+ .filter (JsonObject .class ::isInstance )
118+ .map (JsonObject .class ::cast )
119+ .flatMap (content -> content .getObject ("itemSectionRenderer" )
120+ .getArray ("contents" )
121+ .stream ())
122+ .filter (JsonObject .class ::isInstance )
123+ .map (JsonObject .class ::cast )
124+ .map (content -> content .getObject ("shelfRenderer" ))
125+ // Filter Trending shorts and Recently trending sections which have a title,
126+ // contrary to normal trends
127+ .filter (shelfRenderer -> !shelfRenderer .has ("title" ))
128+ .flatMap (shelfRenderer -> shelfRenderer .getObject ("content" )
129+ .getObject ("expandedShelfContentsRenderer" )
130+ .getArray ("items" )
131+ .stream ())
132+ .filter (JsonObject .class ::isInstance )
133+ .map (JsonObject .class ::cast )
134+ .map (item -> item .getObject ("videoRenderer" ))
135+ .forEachOrdered (videoRenderer -> collector .commit (
136+ new YoutubeStreamInfoItemExtractor (videoRenderer , timeAgoParser )));
112137 }
113-
114138 return new InfoItemsPage <>(collector , null );
115139 }
140+
141+ private JsonObject getTrendingTabRenderer () throws ParsingException {
142+ return initialData .getObject ("contents" )
143+ .getObject ("twoColumnBrowseResultsRenderer" )
144+ .getArray ("tabs" )
145+ .stream ()
146+ .filter (JsonObject .class ::isInstance )
147+ .map (JsonObject .class ::cast )
148+ .map (tab -> tab .getObject ("tabRenderer" ))
149+ .filter (tabRenderer -> tabRenderer .getBoolean ("selected" ))
150+ // There should be at most one tab selected
151+ .findFirst ()
152+ .orElseThrow (() -> new ParsingException ("Could not get \" Now\" trending tab" ));
153+ }
116154}
0 commit comments