From c82317e318217e7c32245aaee17902769459767a Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Mon, 8 Aug 2022 22:06:10 +0200 Subject: [PATCH] [YouTube] Spoof more mobile clients Additional parameters have been added to the player requests of ANDROID and IOS clients: - for both clients: osName and osVersion: their respective values are: - for the ANDROID one: Android and 12; - for the IOS one: iOS and 15.6.0.19G71. - for the ANDROID client: androidTargetSdkVersion, with the Android SDK version corresponding to the Android version used in the player requests of this client. This parameter is now required with this client to be sure to get a correct player response, otherwise, the one of a video saying that this content is not available in this app and to watch it with the latest version of YouTube can be returned instead; - for the IOS client: deviceMake, with Apple as its value. The iOS version sent in the IOS client player requests has been also updated to the version 15.6 of the OS. Finally, a comment about the requirement to use the signature timestamp from the player JavaScript base file for HTML5 player requests on videos with obfuscated URLs has been added and replaces a previous one which may be not true. --- .../youtube/YoutubeParsingHelper.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 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 53564905..2458a97c 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 @@ -1183,6 +1183,20 @@ public final class YoutubeParsingHelper { .value("clientName", "ANDROID") .value("clientVersion", ANDROID_YOUTUBE_CLIENT_VERSION) .value("platform", "MOBILE") + .value("osName", "Android") + .value("osVersion", "12") + /* + A valid Android SDK version is required to be sure to get a valid player + response + If this parameter is not provided, the player response may be replaced by + the one of a 5-minute video saying the message "The following content is + not available on this app. Watch this content on the latest version on + YouTube" + See https://github.com/TeamNewPipe/NewPipe/issues/8713 + The Android SDK version corresponding to the Android version used in + requests is sent + */ + .value("androidSdkVersion", 31) .value("hl", localization.getLocalizationCode()) .value("gl", contentCountry.getCountryCode()) .end() @@ -1205,9 +1219,16 @@ public final class YoutubeParsingHelper { .object("client") .value("clientName", "IOS") .value("clientVersion", IOS_YOUTUBE_CLIENT_VERSION) + .value("deviceMake", "Apple") // Device model is required to get 60fps streams .value("deviceModel", IOS_DEVICE_MODEL) .value("platform", "MOBILE") + .value("osName", "iOS") + // The value of this field seems to use the following structure: + // "iOS version.0.build version" + // The build version corresponding to the iOS version used can be found on + // https://www.theiphonewiki.com/wiki/Firmware/iPhone/15.x#iPhone_13 + .value("osVersion", "15.6.0.19G71") .value("hl", localization.getLocalizationCode()) .value("gl", contentCountry.getCountryCode()) .end() @@ -1262,8 +1283,8 @@ public final class YoutubeParsingHelper { : prepareDesktopJsonBuilder(localization, contentCountry)) .object("playbackContext") .object("contentPlaybackContext") - // Some parameters which are sent by the official WEB client in player - // requests, which seems to avoid throttling on streams from it + // Signature timestamp from the JavaScript base player is needed to get + // working obfuscated URLs .value("signatureTimestamp", sts) .value("referer", "https://www.youtube.com/watch?v=" + videoId) .end() @@ -1314,9 +1335,9 @@ public final class YoutubeParsingHelper { */ @Nonnull public static String getIosUserAgent(@Nullable final Localization localization) { - // Spoofing an iPhone running iOS 15.4 with the hardcoded mobile client version + // Spoofing an iPhone 13 running iOS 15.6 with the hardcoded version of the iOS app return "com.google.ios.youtube/" + IOS_YOUTUBE_CLIENT_VERSION - + "(" + IOS_DEVICE_MODEL + "; U; CPU iOS 15_4 like Mac OS X; " + + "(" + IOS_DEVICE_MODEL + "; U; CPU iOS 15_6 like Mac OS X; " + (localization != null ? localization : Localization.DEFAULT).getCountryCode() + ")"; }