Skip to content

Commit

Permalink
[YouTube] Don't provide streaming URLs which have an non-decoded n param
Browse files Browse the repository at this point in the history
This param used to throttle bandwidth of streaming URLs which have this
parameter when the correct value is not provided but it is not the case
anymore, as the streaming URLs return now an HTTP response code 403 in
this case.
  • Loading branch information
AudricV committed Jul 23, 2024
1 parent 22f8181 commit d73de6b
Showing 1 changed file with 10 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -634,28 +634,6 @@ public List<VideoStream> getVideoOnlyStreams() throws ExtractionException {
getVideoStreamBuilderHelper(true), "video-only");
}

/**
* Try to deobfuscate a streaming URL and fall back to the given URL, because decryption may
* fail if YouTube changes break something.
*
* <p>
* This way a breaking change from YouTube does not result in a broken extractor.
* </p>
*
* @param streamingUrl the streaming URL to which deobfuscating its throttling parameter if
* there is one
* @param videoId the video ID to use when extracting JavaScript player code, if needed
*/
private String tryDeobfuscateThrottlingParameterOfUrl(@Nonnull final String streamingUrl,
@Nonnull final String videoId) {
try {
return YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated(
videoId, streamingUrl);
} catch (final ParsingException e) {
return streamingUrl;
}
}

@Override
@Nonnull
public List<SubtitlesStream> getSubtitlesDefault() throws ParsingException {
Expand Down Expand Up @@ -1286,7 +1264,8 @@ private java.util.stream.Stream<ItagInfo> getStreamsFromStreamingDataKey(
itagItem.itagType, contentPlaybackNonce);
}
} catch (final ExtractionException ignored) {
// if the itag is not supported and getItag fails, we end up here
// If the itag is not supported, the n parameter of HTML5 clients cannot be
// decoded or buildAndAddItagInfoToList fails, we end up here
}
return null;
})
Expand Down Expand Up @@ -1315,8 +1294,14 @@ private ItagInfo buildAndAddItagInfoToList(
// Add the content playback nonce to the stream URL
streamUrl += "&" + CPN + "=" + contentPlaybackNonce;

// Decrypt the n parameter if it is present
streamUrl = tryDeobfuscateThrottlingParameterOfUrl(streamUrl, videoId);
// Decode the n parameter if it is present
// If it cannot be decoded, the stream cannot be used as streaming URLs return HTTP 403
// responses if it has not the right value
// Exceptions thrown by
// YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated are so
// propagated to the parent which ignores streams in this case
streamUrl = YoutubeJavaScriptPlayerManager.getUrlWithThrottlingParameterDeobfuscated(
videoId, streamUrl);

final JsonObject initRange = formatData.getObject("initRange");
final JsonObject indexRange = formatData.getObject("indexRange");
Expand Down

0 comments on commit d73de6b

Please sign in to comment.