diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 14b3f78c7..99bd4d1e5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -10,8 +10,8 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch -import app.revanced.patches.youtube.misc.links.fingerprints.OpenLinksDirectlyPrimaryFingerprint -import app.revanced.patches.youtube.misc.links.fingerprints.OpenLinksDirectlySecondaryFingerprint +import app.revanced.patches.youtube.misc.links.fingerprints.ABUriParserFingerprint +import app.revanced.patches.youtube.misc.links.fingerprints.HTTPUriParserFingerprint import app.revanced.patches.youtube.misc.settings.SettingsPatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -23,20 +23,13 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction CompatiblePackage( "com.google.android.youtube", [ - "18.16.37", - "18.19.35", - "18.20.39", - "18.23.35", - "18.29.38", - "18.32.39", - "18.37.36", - "18.38.44" + "18.43.45" ] ) ] ) object BypassURLRedirectsPatch : BytecodePatch( - setOf(OpenLinksDirectlyPrimaryFingerprint, OpenLinksDirectlySecondaryFingerprint) + setOf(ABUriParserFingerprint, HTTPUriParserFingerprint) ) { override fun execute(context: BytecodeContext) { SettingsPatch.PreferenceScreen.MISC.addPreferences( @@ -48,14 +41,14 @@ object BypassURLRedirectsPatch : BytecodePatch( ) ) - arrayOf( - OpenLinksDirectlyPrimaryFingerprint, - OpenLinksDirectlySecondaryFingerprint - ).map { - it.result ?: throw it.exception - }.forEach { result -> + mapOf( + ABUriParserFingerprint to 7, // Offset to Uri.parse. + HTTPUriParserFingerprint to 0 // Offset to Uri.parse. + ).map { (fingerprint, offset) -> + (fingerprint.result ?: throw fingerprint.exception) to offset + }.forEach { (result, offset) -> result.mutableMethod.apply { - val insertIndex = result.scanResult.patternScanResult!!.startIndex + val insertIndex = result.scanResult.patternScanResult!!.startIndex + offset val uriStringRegister = getInstruction(insertIndex).registerC replaceInstruction( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/OpenLinksDirectlyPrimaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/ABUriParserFingerprint.kt similarity index 53% rename from src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/OpenLinksDirectlyPrimaryFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/ABUriParserFingerprint.kt index 7aad8d30f..3bd70fbbd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/OpenLinksDirectlyPrimaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/ABUriParserFingerprint.kt @@ -5,16 +5,25 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object OpenLinksDirectlyPrimaryFingerprint : MethodFingerprint( +object ABUriParserFingerprint : MethodFingerprint( returnType = "Ljava/lang/Object", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/Object"), opcodes = listOf( + Opcode.RETURN_OBJECT, + Opcode.CHECK_CAST, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_OBJECT, + Opcode.CHECK_CAST, + Opcode.RETURN_OBJECT, + Opcode.CHECK_CAST, Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.SGET, - Opcode.SGET_OBJECT - ) + Opcode.CHECK_CAST + ), + customFingerprint = { methodDef, classDef -> + // This method is always called "a" because this kind of class always has a single method. + methodDef.name == "a" && classDef.methods.count() == 3 + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/OpenLinksDirectlySecondaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/HTTPUriParserFingerprint.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/OpenLinksDirectlySecondaryFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/HTTPUriParserFingerprint.kt index 47a930050..b9dd490cd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/OpenLinksDirectlySecondaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/links/fingerprints/HTTPUriParserFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object OpenLinksDirectlySecondaryFingerprint : MethodFingerprint( +object HTTPUriParserFingerprint : MethodFingerprint( returnType = "Landroid/net/Uri", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("Ljava/lang/String"),