From 0727b97119892a37fdeed4f854fee765cf5e29cb Mon Sep 17 00:00:00 2001 From: Owen Roberts Date: Mon, 21 Nov 2022 15:40:37 -0700 Subject: [PATCH] use json array looping to extract clientVersion to prevent DE crash --- .../youtube/YoutubeParsingHelper.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java index b460448dd..e290cd877 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java @@ -607,13 +607,8 @@ public final class YoutubeParsingHelper { final JsonArray serviceTrackingParams = initialData.getObject("responseContext") .getArray("serviceTrackingParams"); - // Try to get version from initial data first - final Stream serviceTrackingParamsStream = serviceTrackingParams.stream() - .filter(JsonObject.class::isInstance) - .map(JsonObject.class::cast); - - clientVersion = getClientVersionFromServiceTrackingParam( - serviceTrackingParamsStream, "CSI", "cver"); + clientVersion = getClientVersionFromServiceTrackingParams( + serviceTrackingParams, "CSI", "cver"); if (clientVersion == null) { try { @@ -626,8 +621,8 @@ public final class YoutubeParsingHelper { // Fallback to get a shortened client version which does not contain the last two // digits if (isNullOrEmpty(clientVersion)) { - clientVersion = getClientVersionFromServiceTrackingParam( - serviceTrackingParamsStream, "ECATCHER", "client.version"); + clientVersion = getClientVersionFromServiceTrackingParams( + serviceTrackingParams, "ECATCHER", "client.version"); } try { @@ -652,6 +647,26 @@ public final class YoutubeParsingHelper { keyAndVersionExtracted = true; } + @Nullable + private static String getClientVersionFromServiceTrackingParams( + @Nonnull final JsonArray serviceTrackingParams, + @Nonnull final String serviceName, + @Nonnull final String clientVersionKey) { + for (int i = 0 ; i < serviceTrackingParams.size(); i++) { + JsonObject item = serviceTrackingParams.getObject(i); + if (item != null && item.getString("service").equals(serviceName) && item.getArray("params") != null) { + JsonArray paramsArray = item.getArray("params"); + for (int j = 0 ; j < paramsArray.size(); j++) { + JsonObject paramItem = paramsArray.getObject(i); + if (paramItem != null && paramItem.getString("key").equals(clientVersionKey)) { + return paramItem.getString("value"); + } + } + } + } + return null; + } + @Nullable private static String getClientVersionFromServiceTrackingParam( @Nonnull final Stream serviceTrackingParamsStream,