5757public class YoutubeChannelExtractor extends ChannelExtractor {
5858
5959 private JsonObject jsonResponse ;
60+
6061 @ SuppressWarnings ("OptionalUsedAsFieldOrParameterType" )
6162 private Optional <YoutubeChannelHelper .ChannelHeader > channelHeader ;
6263
@@ -89,6 +90,7 @@ public void onFetchPage(@Nonnull final Downloader downloader)
8990 "EgZ2aWRlb3PyBgQKAjoA" , getExtractorLocalization (), getExtractorContentCountry ());
9091
9192 jsonResponse = data .jsonResponse ;
93+ channelHeader = YoutubeChannelHelper .getChannelHeader (jsonResponse );
9294 channelId = data .channelId ;
9395 channelAgeGateRenderer = getChannelAgeGateRenderer ();
9496 }
@@ -115,12 +117,8 @@ private JsonObject getChannelAgeGateRenderer() {
115117 }
116118
117119 @ Nonnull
118- private Optional <YoutubeChannelHelper .ChannelHeader > getChannelHeader () {
119- //noinspection OptionalAssignedToNull
120- if (channelHeader == null ) {
121- channelHeader = YoutubeChannelHelper .getChannelHeader (jsonResponse );
122- }
123- return channelHeader ;
120+ private Optional <JsonObject > getChannelHeaderJson () {
121+ return channelHeader .map (it -> it .json );
124122 }
125123
126124 @ Nonnull
@@ -136,9 +134,9 @@ public String getUrl() throws ParsingException {
136134 @ Nonnull
137135 @ Override
138136 public String getId () throws ParsingException {
139- return getChannelHeader ()
140- .flatMap (header -> Optional .ofNullable (header .json . getString ("channelId" ))
141- .or (() -> Optional .ofNullable (header .json . getObject ("navigationEndpoint" )
137+ return getChannelHeaderJson ()
138+ .flatMap (header -> Optional .ofNullable (header .getString ("channelId" ))
139+ .or (() -> Optional .ofNullable (header .getObject ("navigationEndpoint" )
142140 .getObject ("browseEndpoint" )
143141 .getString ("browseId" ))
144142 ))
@@ -160,8 +158,8 @@ public String getName() throws ParsingException {
160158 return metadataRendererTitle ;
161159 }
162160
163- return getChannelHeader ().flatMap (header -> {
164- final Object title = header .json . get ("title" );
161+ return getChannelHeaderJson ().flatMap (header -> {
162+ final Object title = header .get ("title" );
165163 if (title instanceof String ) {
166164 return Optional .of ((String ) title );
167165 } else if (title instanceof JsonObject ) {
@@ -180,7 +178,7 @@ public String getAvatarUrl() throws ParsingException {
180178 if (channelAgeGateRenderer != null ) {
181179 avatarJsonObjectContainer = channelAgeGateRenderer ;
182180 } else {
183- avatarJsonObjectContainer = getChannelHeader (). map ( header -> header . json )
181+ avatarJsonObjectContainer = getChannelHeaderJson ( )
184182 .orElseThrow (() -> new ParsingException ("Could not get avatar URL" ));
185183 }
186184
@@ -196,8 +194,8 @@ public String getBannerUrl() throws ParsingException {
196194 return "" ;
197195 }
198196
199- return getChannelHeader ().flatMap (header -> Optional .ofNullable (
200- header .json . getObject ("banner" )
197+ return getChannelHeaderJson ().flatMap (header -> Optional .ofNullable (
198+ header .getObject ("banner" )
201199 .getArray ("thumbnails" )
202200 .getObject (0 )
203201 .getString ("url" )))
@@ -226,9 +224,9 @@ public long getSubscriberCount() throws ParsingException {
226224 return UNKNOWN_SUBSCRIBER_COUNT ;
227225 }
228226
229- final Optional <YoutubeChannelHelper . ChannelHeader > headerOpt = getChannelHeader ();
227+ final Optional <JsonObject > headerOpt = getChannelHeaderJson ();
230228 if (headerOpt .isPresent ()) {
231- final JsonObject header = headerOpt .get (). json ;
229+ final JsonObject header = headerOpt .get ();
232230 JsonObject textObject = null ;
233231
234232 if (header .has ("subscriberCountText" )) {
@@ -285,9 +283,8 @@ public boolean isVerified() throws ParsingException {
285283 return false ;
286284 }
287285
288- final Optional <YoutubeChannelHelper .ChannelHeader > headerOpt = getChannelHeader ();
289- if (headerOpt .isPresent ()) {
290- final YoutubeChannelHelper .ChannelHeader header = headerOpt .get ();
286+ if (channelHeader .isPresent ()) {
287+ final YoutubeChannelHelper .ChannelHeader header = channelHeader .get ();
291288
292289 // The CarouselHeaderRenderer does not contain any verification badges.
293290 // Since it is only shown on YT-internal channels or on channels of large organizations
0 commit comments