From 678565dd8d657a306f9f477024e971bbb2b35f27 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sun, 13 Oct 2024 22:24:21 +0900 Subject: [PATCH] chore(YouTube): replace with a fingerprint that supports a wider range of versions --- ...cessibilityOfflineButtonSyncFingerprint.kt | 32 +++++++++++++---- .../utils/resourceid/SharedResourceIdPatch.kt | 2 -- .../youtube/video/videoid/VideoIdPatch.kt | 5 +-- .../fingerprints/VideoIdFingerprint.kt | 34 +++++++++++++++++-- .../fingerprints/VideoIdParentFingerprint.kt | 9 ----- 5 files changed, 59 insertions(+), 23 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdParentFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt index d3cea0a63..3fb775748 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt @@ -1,12 +1,32 @@ package app.revanced.patches.youtube.general.downloads.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccessibilityOfflineButtonSync -import app.revanced.util.fingerprint.LiteralValueFingerprint +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.general.downloads.fingerprints.AccessibilityOfflineButtonSyncFingerprint.ENDS_WITH_PARAMETER_LIST +import app.revanced.util.parametersEqual import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.util.MethodUtil -internal object AccessibilityOfflineButtonSyncFingerprint : LiteralValueFingerprint( +internal object AccessibilityOfflineButtonSyncFingerprint : MethodFingerprint( returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { AccessibilityOfflineButtonSync }, -) \ No newline at end of file + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + customFingerprint = custom@{ methodDef, _ -> + if (!MethodUtil.isConstructor(methodDef)) { + return@custom false + } + val parameterTypes = methodDef.parameterTypes + val parameterSize = parameterTypes.size + if (parameterSize < 6) { + return@custom false + } + + val endsWithMethodParameterList = parameterTypes.slice(parameterSize - 3..< parameterSize) + parametersEqual(ENDS_WITH_PARAMETER_LIST, endsWithMethodParameterList) + } +) { + private val ENDS_WITH_PARAMETER_LIST = listOf( + "Lcom/google/android/apps/youtube/app/offline/ui/OfflineArrowView;", + "I", + "Landroid/view/View${'$'}OnClickListener;" + ) +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt index 0819c4138..db6bd75fd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt @@ -17,7 +17,6 @@ import app.revanced.patches.shared.mapping.ResourceType.STYLE @Patch(dependencies = [ResourceMappingPatch::class]) object SharedResourceIdPatch : ResourcePatch() { - var AccessibilityOfflineButtonSync = -1L var AccountSwitcherAccessibility = -1L var ActionBarRingo = -1L var ActionBarRingoBackground = -1L @@ -127,7 +126,6 @@ object SharedResourceIdPatch : ResourcePatch() { override fun execute(context: ResourceContext) { - AccessibilityOfflineButtonSync = getId(STRING, "accessibility_offline_button_sync") AccountSwitcherAccessibility = getId(STRING, "account_switcher_accessibility_label") ActionBarRingo = getId(LAYOUT, "action_bar_ringo") ActionBarRingoBackground = getId(LAYOUT, "action_bar_ringo_background") diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index 2e3aa2153..c0e9727c1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -10,7 +10,6 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch import app.revanced.patches.youtube.video.videoid.fingerprints.VideoIdFingerprint -import app.revanced.patches.youtube.video.videoid.fingerprints.VideoIdParentFingerprint import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -19,7 +18,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction dependencies = [PlayerResponseMethodHookPatch::class], ) object VideoIdPatch : BytecodePatch( - setOf(VideoIdParentFingerprint) + setOf(VideoIdFingerprint) ) { private var videoIdRegister = 0 private var videoIdInsertIndex = 0 @@ -44,8 +43,6 @@ object VideoIdPatch : BytecodePatch( } } - VideoIdFingerprint.resolve(context, VideoIdParentFingerprint.resultOrThrow().classDef) - VideoIdFingerprint.setFields { method, index, register -> videoIdMethod = method videoIdInsertIndex = index diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdFingerprint.kt index 7158d20dc..a67b54615 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdFingerprint.kt @@ -2,8 +2,13 @@ package app.revanced.patches.youtube.video.videoid.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.PlayerResponseModelUtils.PLAYER_RESPONSE_MODEL_CLASS_DESCRIPTOR +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal object VideoIdFingerprint : MethodFingerprint( returnType = "V", @@ -14,5 +19,30 @@ internal object VideoIdFingerprint : MethodFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT - ) -) + ), + customFingerprint = custom@{ methodDef, classDef -> + if (!classDef.fields.any { it.type == "Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;" }) { + return@custom false + } + val implementation = methodDef.implementation + ?: return@custom false + val instructions = implementation.instructions + val instructionCount = instructions.count() + if (instructionCount < 30) { + return@custom false + } + + val reference = (instructions.elementAt(instructionCount - 2) as? ReferenceInstruction)?.reference.toString() + if (reference != "Ljava/util/Map;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;") { + return@custom false + } + + methodDef.indexOfFirstInstruction { + val methodReference = getReference() + opcode == Opcode.INVOKE_INTERFACE && + methodReference?.returnType == "Ljava/lang/String;" && + methodReference.parameterTypes.isEmpty() && + methodReference.definingClass == PLAYER_RESPONSE_MODEL_CLASS_DESCRIPTOR + } >= 0 + }, +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdParentFingerprint.kt deleted file mode 100644 index cec98bfca..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/video/videoid/fingerprints/VideoIdParentFingerprint.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.video.videoid.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint - -internal object VideoIdParentFingerprint : MethodFingerprint( - returnType = "V", - parameters = listOf("Ljava/lang/Object;", "Ljava/lang/Exception;"), - strings = listOf("error retrieving subtitle"), -)