From afd3a3bbfb7d58b688598976a42dba0039f9dc93 Mon Sep 17 00:00:00 2001 From: Priveetee Date: Sun, 14 Jun 2026 12:44:55 +0200 Subject: [PATCH] fix(youtube): clarify missing player response errors --- .../extractors/YoutubeStreamExtractor.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java index 72c9fd34..5924111d 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java @@ -1382,11 +1382,14 @@ public void onSuccess(Response response) throws ExtractionException { } } + if (playerResponse == null) { + throw new ContentNotAvailableException( + "Could not fetch a usable YouTube player response. Try logging in."); + } + // Check playability status from the actual stream data source - if (playerResponse != null) { - checkPlayabilityStatus(playerResponse.getObject("playabilityStatus"), videoId); - setStreamType(); - } + checkPlayabilityStatus(playerResponse.getObject("playabilityStatus"), videoId); + setStreamType(); if (streamType != StreamType.LIVE_STREAM && isSabrOnlyResponse() && getHlsManifestUrlFromStreamingData().isEmpty()) { @@ -1418,8 +1421,6 @@ private boolean isSabrOnlyResponse() { return false; } - - public static JsonObject checkPlayabilityStatus(@Nonnull JsonObject playabilityStatus, String videoId) throws ParsingException { String status = playabilityStatus.getString("status"); @@ -1478,6 +1479,10 @@ public static JsonObject checkPlayabilityStatus(@Nonnull JsonObject playabilityS "This video is not available in client's country."); } else { if(detailedErrorMessage != null) { + if (detailedErrorMessage.contains("page needs to be reloaded")) { + throw new ContentNotAvailableException(detailedErrorMessage + + " Try logging in."); + } throw new ContentNotAvailableException(detailedErrorMessage); } throw new ContentNotAvailableException(reason); @@ -1504,8 +1509,8 @@ public static JsonObject checkPlayabilityStatus(@Nonnull JsonObject playabilityS * object. */ private CancellableCall fetchAndroidVRJsonPlayer(@Nonnull final ContentCountry contentCountry, - @Nonnull final Localization localization, - @Nonnull final String videoId) + @Nonnull final Localization localization, + @Nonnull final String videoId) throws IOException, ExtractionException { androidCpn = generateContentPlaybackNonce(); final InnertubeClientRequestInfo innertubeClientRequestInfo = @@ -1536,15 +1541,16 @@ public void onSuccess(Response response) throws ExtractionException { return; } - YoutubeStreamExtractor.this.playerResponse = androidPlayerResponse; - final JsonObject streamingData = androidPlayerResponse.getObject(STREAMING_DATA); if (!isNullOrEmpty(streamingData)) { + YoutubeStreamExtractor.this.playerResponse = androidPlayerResponse; androidStreamingData = streamingData; if (isNullOrEmpty(playerCaptionsTracklistRenderer)) { playerCaptionsTracklistRenderer = androidPlayerResponse.getObject("captions") .getObject("playerCaptionsTracklistRenderer"); } + } else if (YoutubeStreamExtractor.this.playerResponse == null) { + YoutubeStreamExtractor.this.playerResponse = androidPlayerResponse; } } catch (Exception e) { e.printStackTrace();