diff --git a/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofClientPatch.java b/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofClientPatch.java index 12fe6d571..f26063a4f 100644 --- a/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofClientPatch.java +++ b/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofClientPatch.java @@ -131,4 +131,16 @@ public class SpoofClientPatch extends BlockRequestPatch { } return original; } + + /** + * Injection point. + *

+ * Return false to force disable playback feature flag. + */ + public static boolean forceDisablePlaybackFeatureFlag(boolean original) { + if (SPOOF_CLIENT) { + return false; + } + return original; + } } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/Fingerprints.kt index 2e75b52cd..f69913007 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/Fingerprints.kt @@ -39,4 +39,20 @@ internal val userAgentHeaderBuilderFingerprint = legacyFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("Landroid/content/Context;"), strings = listOf("(Linux; U; Android "), +) + +/** + * If this flag is activated, a playback issue occurs. + * (Regardless of the 'Spoof client') + * + * Added in YouTube Music 7.33+ + */ +internal const val PLAYBACK_FEATURE_FLAG = 45665455L + +internal val playbackFeatureFlagFingerprint = legacyFingerprint( + name = "playbackFeatureFlagFingerprint", + returnType = "Z", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = emptyList(), + literals = listOf(PLAYBACK_FEATURE_FLAG), ) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/SpoofClientPatch.kt index 712812ca1..386955825 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/utils/fix/client/SpoofClientPatch.kt @@ -13,6 +13,8 @@ import app.revanced.patches.music.utils.extension.Constants.VIDEO_PATH import app.revanced.patches.music.utils.patch.PatchList.SPOOF_CLIENT import app.revanced.patches.music.utils.playbackRateBottomSheetClassFingerprint import app.revanced.patches.music.utils.playbackSpeedBottomSheetFingerprint +import app.revanced.patches.music.utils.playservice.is_7_33_or_greater +import app.revanced.patches.music.utils.playservice.versionCheckPatch import app.revanced.patches.music.utils.resourceid.sharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.varispeedUnavailableTitle import app.revanced.patches.music.utils.settings.CategoryType @@ -30,6 +32,7 @@ import app.revanced.patches.shared.indexOfManufacturerInstruction import app.revanced.patches.shared.indexOfModelInstruction import app.revanced.patches.shared.indexOfReleaseInstruction import app.revanced.util.findMethodOrThrow +import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall import app.revanced.util.fingerprint.matchOrThrow import app.revanced.util.fingerprint.methodOrThrow import app.revanced.util.fingerprint.mutableClassOrThrow @@ -69,6 +72,7 @@ val spoofClientPatch = bytecodePatch( settingsPatch, sharedResourceIdPatch, blockRequestPatch, + versionCheckPatch, customPlaybackSpeedPatch( "$VIDEO_PATH/CustomPlaybackSpeedPatch;", 5.0f @@ -334,6 +338,17 @@ val spoofClientPatch = bytecodePatch( // endregion + // region fix for feature flags + + if (is_7_33_or_greater) { + playbackFeatureFlagFingerprint.injectLiteralInstructionBooleanCall( + PLAYBACK_FEATURE_FLAG, + "$EXTENSION_CLASS_DESCRIPTOR->forceDisablePlaybackFeatureFlag(Z)Z" + ) + } + + // endregion + findMethodOrThrow("$PATCHES_PATH/PatchStatus;") { name == "SpoofClient" }.replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/utils/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/utils/playservice/VersionCheckPatch.kt index 334d5bdfe..abe386ff8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/utils/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/utils/playservice/VersionCheckPatch.kt @@ -33,6 +33,8 @@ var is_7_27_or_greater = false private set var is_7_29_or_greater = false private set +var is_7_33_or_greater = false + private set var is_8_03_or_greater = false private set @@ -64,6 +66,7 @@ val versionCheckPatch = resourcePatch( is_7_25_or_greater = 244399000 <= playStoreServicesVersion is_7_27_or_greater = 244515000 <= playStoreServicesVersion is_7_29_or_greater = 244799000 <= playStoreServicesVersion + is_7_33_or_greater = 245199000 <= playStoreServicesVersion is_8_03_or_greater = 250399000 <= playStoreServicesVersion } }