@@ -813,22 +813,21 @@ public void onFetchPage(@Nonnull final Downloader downloader)
813813 final Localization localization = getExtractorLocalization ();
814814 final ContentCountry contentCountry = getExtractorContentCountry ();
815815
816- final PoTokenProvider poTokenproviderInstance = poTokenProvider ;
817- final boolean noPoTokenProviderSet = poTokenproviderInstance == null ;
816+ final PoTokenProvider poTokenProviderInstance = poTokenProvider ;
817+ final boolean noPoTokenProviderSet = poTokenProviderInstance == null ;
818818
819- fetchHtml5Client (localization , contentCountry , videoId , poTokenproviderInstance ,
820- noPoTokenProviderSet );
819+ fetchHtml5Client (localization , contentCountry , videoId , poTokenProviderInstance );
821820
822821 setStreamType ();
823822
824823 final PoTokenResult androidPoTokenResult = noPoTokenProviderSet ? null
825- : poTokenproviderInstance .getAndroidClientPoToken (videoId );
824+ : poTokenProviderInstance .getAndroidClientPoToken (videoId );
826825
827826 fetchAndroidClient (localization , contentCountry , videoId , androidPoTokenResult );
828827
829828 if (fetchIosClient ) {
830829 final PoTokenResult iosPoTokenResult = noPoTokenProviderSet ? null
831- : poTokenproviderInstance .getIosClientPoToken (videoId );
830+ : poTokenProviderInstance .getIosClientPoToken (videoId );
832831 fetchIosClient (localization , contentCountry , videoId , iosPoTokenResult );
833832 }
834833
@@ -904,82 +903,32 @@ private static void checkPlayabilityStatus(@Nonnull final JsonObject playability
904903 private void fetchHtml5Client (@ Nonnull final Localization localization ,
905904 @ Nonnull final ContentCountry contentCountry ,
906905 @ Nonnull final String videoId ,
907- @ Nullable final PoTokenProvider poTokenProviderInstance ,
908- final boolean noPoTokenProviderSet )
906+ @ Nullable final PoTokenProvider poTokenProviderInstance )
909907 throws IOException , ExtractionException {
910908 html5Cpn = generateContentPlaybackNonce ();
911909
912- // Suppress NPE warning as nullability is already checked before and passed with
913- // noPoTokenProviderSet
914- //noinspection DataFlowIssue
915- final PoTokenResult webPoTokenResult = noPoTokenProviderSet ? null
916- : poTokenProviderInstance .getWebClientPoToken (videoId );
917- final JsonObject webPlayerResponse ;
918- if (noPoTokenProviderSet || webPoTokenResult == null ) {
919- webPlayerResponse = YoutubeStreamHelper .getWebMetadataPlayerResponse (
910+ final JsonObject webPlayerResponse = YoutubeStreamHelper .getWebMetadataPlayerResponse (
920911 localization , contentCountry , videoId );
921912
922- throwExceptionIfPlayerResponseNotValid (webPlayerResponse , videoId );
913+ throwExceptionIfPlayerResponseNotValid (webPlayerResponse , videoId );
923914
924- // Save the webPlayerResponse into playerResponse in the case the video cannot be
925- // played, so some metadata can be retrieved
926- playerResponse = webPlayerResponse ;
927-
928- // The microformat JSON object of the content is only returned on the WEB client,
929- // so we need to store it instead of getting it directly from the playerResponse
930- playerMicroFormatRenderer = playerResponse .getObject ("microformat" )
931- .getObject ("playerMicroformatRenderer" );
915+ // Save the webPlayerResponse into playerResponse in the case the video cannot be
916+ // played, so some metadata can be retrieved
917+ playerResponse = webPlayerResponse ;
932918
933- final JsonObject playabilityStatus = webPlayerResponse .getObject (PLAYABILITY_STATUS );
919+ // The microformat JSON object of the content is only returned on the WEB client,
920+ // so we need to store it instead of getting it directly from the playerResponse
921+ playerMicroFormatRenderer = playerResponse .getObject ("microformat" )
922+ .getObject ("playerMicroformatRenderer" );
934923
935- if (isVideoAgeRestricted (playabilityStatus )) {
936- fetchHtml5EmbedClient (localization , contentCountry , videoId ,
937- noPoTokenProviderSet ? null
938- : poTokenProviderInstance .getWebEmbedClientPoToken (videoId ));
939- } else {
940- checkPlayabilityStatus (playabilityStatus );
924+ final JsonObject playabilityStatus = webPlayerResponse .getObject (PLAYABILITY_STATUS );
941925
942- final JsonObject tvHtml5PlayerResponse =
943- YoutubeStreamHelper .getTvHtml5PlayerResponse (
944- localization , contentCountry , videoId , html5Cpn ,
945- YoutubeJavaScriptPlayerManager .getSignatureTimestamp (videoId ));
946-
947- if (isPlayerResponseNotValid (tvHtml5PlayerResponse , videoId )) {
948- throw new ExtractionException ("TVHTML5 player response is not valid" );
949- }
950-
951- html5StreamingData = tvHtml5PlayerResponse .getObject (STREAMING_DATA );
952- playerCaptionsTracklistRenderer = tvHtml5PlayerResponse .getObject (CAPTIONS )
953- .getObject (PLAYER_CAPTIONS_TRACKLIST_RENDERER );
954- }
926+ if (isVideoAgeRestricted (playabilityStatus )) {
927+ fetchHtml5EmbedClient (localization , contentCountry , videoId ,
928+ poTokenProviderInstance == null ? null
929+ : poTokenProviderInstance .getWebEmbedClientPoToken (videoId ));
955930 } else {
956- webPlayerResponse = YoutubeStreamHelper .getWebFullPlayerResponse (
957- localization , contentCountry , videoId , html5Cpn , webPoTokenResult ,
958- YoutubeJavaScriptPlayerManager .getSignatureTimestamp (videoId ));
959-
960- throwExceptionIfPlayerResponseNotValid (webPlayerResponse , videoId );
961-
962- // Save the webPlayerResponse into playerResponse in the case the video cannot be
963- // played, so some metadata can be retrieved
964- playerResponse = webPlayerResponse ;
965-
966- // The microformat JSON object of the content is only returned on the WEB client,
967- // so we need to store it instead of getting it directly from the playerResponse
968- playerMicroFormatRenderer = playerResponse .getObject ("microformat" )
969- .getObject ("playerMicroformatRenderer" );
970-
971- final JsonObject playabilityStatus = webPlayerResponse .getObject (PLAYABILITY_STATUS );
972-
973- if (isVideoAgeRestricted (playabilityStatus )) {
974- fetchHtml5EmbedClient (localization , contentCountry , videoId ,
975- poTokenProviderInstance .getWebEmbedClientPoToken (videoId ));
976- } else {
977- checkPlayabilityStatus (playabilityStatus );
978- html5StreamingData = webPlayerResponse .getObject (STREAMING_DATA );
979- playerCaptionsTracklistRenderer = webPlayerResponse .getObject (CAPTIONS )
980- .getObject (PLAYER_CAPTIONS_TRACKLIST_RENDERER );
981- html5StreamingUrlsPoToken = webPoTokenResult .streamingDataPoToken ;
982- }
931+ checkPlayabilityStatus (playabilityStatus );
983932 }
984933 }
985934
@@ -1383,6 +1332,11 @@ private ItagInfo buildAndAddItagInfoToList(
13831332 // This url has an obfuscated signature
13841333 final String cipherString = formatData .getString (CIPHER ,
13851334 formatData .getString (SIGNATURE_CIPHER ));
1335+
1336+ if (isNullOrEmpty (cipherString )) {
1337+ return null ;
1338+ }
1339+
13861340 final var cipher = Parser .compatParseMap (cipherString );
13871341 final String signature = YoutubeJavaScriptPlayerManager .deobfuscateSignature (videoId ,
13881342 cipher .getOrDefault ("s" , "" ));
0 commit comments