diff --git a/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java b/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java index 15e90f565..ade26a30f 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java @@ -1,6 +1,7 @@ package app.revanced.extension.music.patches.spoof; import static app.revanced.extension.music.settings.Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE; +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_NO_SDK; import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_43_32; import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48; import static app.revanced.extension.shared.spoof.ClientType.VISIONOS; @@ -18,8 +19,9 @@ public class SpoofVideoStreamsPatch { public static void setClientOrderToUse() { List availableClients = List.of( ANDROID_VR_1_43_32, - ANDROID_VR_1_61_48, - VISIONOS + ANDROID_NO_SDK, + VISIONOS, + ANDROID_VR_1_61_48 ); app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse( diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java index cfd79b972..39076b562 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java @@ -54,6 +54,33 @@ public enum ClientType { ANDROID_VR_1_61_48.supportsMultiAudioTracks, "Android VR 1.43" ), + /** + * Video not playable: Paid / Movie / Private / Age-restricted. + * Note: The 'Authorization' key must be excluded from the header. + * + * According to TeamNewPipe in 2022, if the 'androidSdkVersion' field is missing, + * the GVS did not return a valid response: + * [NewPipe#8713 (comment)](https://github.com/TeamNewPipe/NewPipe/issues/8713#issuecomment-1207443550). + * + * According to the latest commit in yt-dlp, the GVS returns a valid response + * even if the 'androidSdkVersion' field is missing: + * [yt-dlp#14693](https://github.com/yt-dlp/yt-dlp/pull/14693). + * + * For some reason, PoToken is not required. + */ + ANDROID_NO_SDK( + 3, + "ANDROID", + "", + "", + "", + Build.VERSION.RELEASE, + "20.05.46", + "com.google.android.youtube/20.05.46 (Linux; U; Android " + Build.VERSION.RELEASE + ") gzip", + false, + true, + "Android No SDK" + ), /** * Cannot play livestreams and lacks HDR, but can play videos with music and labeled "for children". * Google Pixel 9 Pro Fold diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java index 30ef6c0b8..75374c09e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java @@ -1,6 +1,7 @@ package app.revanced.extension.youtube.patches.spoof; import static app.revanced.extension.shared.spoof.ClientType.ANDROID_CREATOR; +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_NO_SDK; import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_43_32; import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48; import static app.revanced.extension.shared.spoof.ClientType.IPADOS; @@ -41,6 +42,7 @@ public class SpoofVideoStreamsPatch { VISIONOS, ANDROID_CREATOR, ANDROID_VR_1_43_32, + ANDROID_NO_SDK, IPADOS); app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java index bf66edbd4..86802ee20 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java @@ -80,29 +80,34 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference { Logger.printDebug(() -> "Updating spoof stream side effects preference"); setEnabled(BaseSettings.SPOOF_VIDEO_STREAMS.get()); - String summary = str("revanced_spoof_video_streams_about_no_audio_tracks"); + String summary = ""; switch (clientType) { case ANDROID_CREATOR -> - summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume") - + '\n' + str("revanced_spoof_video_streams_about_no_av1") - + '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio"); + summary = str("revanced_spoof_video_streams_about_no_audio_tracks") + + '\n' + str("revanced_spoof_video_streams_about_no_stable_volume") + + '\n' + str("revanced_spoof_video_streams_about_no_av1") + + '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio"); // VR 1.61 is not exposed in the UI and should never be reached here. case ANDROID_VR_1_43_32, ANDROID_VR_1_61_48 -> - summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume"); + summary = str("revanced_spoof_video_streams_about_no_audio_tracks") + + '\n' + str("revanced_spoof_video_streams_about_no_stable_volume"); + case ANDROID_NO_SDK -> + summary = str("revanced_spoof_video_streams_about_playback_failure"); case IPADOS -> summary = str("revanced_spoof_video_streams_about_playback_failure") + '\n' + str("revanced_spoof_video_streams_about_no_av1"); case VISIONOS -> summary = str("revanced_spoof_video_streams_about_experimental") - + '\n' + summary + + '\n' + str("revanced_spoof_video_streams_about_no_audio_tracks") + '\n' + str("revanced_spoof_video_streams_about_no_av1"); + default -> Logger.printException(() -> "Unknown client: " + clientType); } // Only iPadOS can play children videos in incognito, but it commonly fails at 1 minute - // or doesn't even start playback at all. List the side effect for other clients + // or doesn't start playback at all. List the side effect for other clients // since they will fall over to iPadOS. - if (clientType != ClientType.IPADOS) { + if (clientType != ClientType.IPADOS && clientType != ClientType.ANDROID_NO_SDK) { summary += '\n' + str("revanced_spoof_video_streams_about_kids_videos"); } diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 439261474..9b6ce74e7 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -185,10 +185,12 @@ Android VR visionOS + Android No SDK ANDROID_VR_1_43_32 VISIONOS + ANDROID_NO_SDK @@ -227,12 +229,14 @@ Android VR Android Studio + Android No SDK visionOS iPadOS ANDROID_VR_1_43_32 ANDROID_CREATOR + ANDROID_NO_SDK VISIONOS IPADOS