From 10afc8cc71ff29fea4937fb12fd3d1edf9c581f5 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 15 Mar 2024 16:33:02 +0400 Subject: [PATCH] feat(YouTube - Downloads): Use external downloader when selecting 'Download' in home feed flyout menu (#2881) --- .../interaction/downloads/DownloadsPatch.kt | 41 ++++--------------- ...dActionCommandResolverParentFingerprint.kt | 17 -------- ...egacyDownloadCommandResolverFingerprint.kt | 24 ----------- ....kt => OfflineVideoEndpointFingerprint.kt} | 12 +++--- 4 files changed, 16 insertions(+), 78 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverParentFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/LegacyDownloadCommandResolverFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/{DownloadActionCommandResolverFingerprint.kt => OfflineVideoEndpointFingerprint.kt} (55%) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt index 05bacbd4..e9f2c920 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt @@ -6,9 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.interaction.downloads.fingerprints.DownloadActionCommandResolverFingerprint -import app.revanced.patches.youtube.interaction.downloads.fingerprints.DownloadActionCommandResolverParentFingerprint -import app.revanced.patches.youtube.interaction.downloads.fingerprints.LegacyDownloadCommandResolverFingerprint +import app.revanced.patches.youtube.interaction.downloads.fingerprints.OfflineVideoEndpointFingerprint import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsBytecodePatch import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint import app.revanced.patches.youtube.video.information.VideoInformationPatch @@ -45,8 +43,7 @@ import app.revanced.util.resultOrThrow @Suppress("unused") object DownloadsPatch : BytecodePatch( setOf( - DownloadActionCommandResolverParentFingerprint, - LegacyDownloadCommandResolverFingerprint, + OfflineVideoEndpointFingerprint, MainActivityFingerprint ) ) { @@ -65,36 +62,16 @@ object DownloadsPatch : BytecodePatch( ) } - val commonInstructions = """ - move-result v0 - if-eqz v0, :show_native_downloader - return-void - :show_native_downloader - nop - """ - - DownloadActionCommandResolverFingerprint.resolve(context, - DownloadActionCommandResolverParentFingerprint.resultOrThrow().classDef) - DownloadActionCommandResolverFingerprint.resultOrThrow().mutableMethod.apply { + OfflineVideoEndpointFingerprint.resultOrThrow().mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->inAppDownloadButtonOnClick()Z - $commonInstructions - """ - ) - } - - // Legacy fingerprint is used for old spoofed versions, - // or if download playlist is pressed on any version. - // Downloading playlists is not yet supported, - // as the code this hooks does not easily expost the playlist id. - LegacyDownloadCommandResolverFingerprint.resultOrThrow().mutableMethod.apply { - addInstructionsWithLabels( - 0, - """ - invoke-static/range {p1 .. p1}, $INTEGRATIONS_CLASS_DESCRIPTOR->inAppDownloadPlaylistLegacyOnClick(Ljava/lang/String;)Z - $commonInstructions + invoke-static/range {p3 .. p3}, $INTEGRATIONS_CLASS_DESCRIPTOR->inAppDownloadButtonOnClick(Ljava/lang/String;)Z + move-result v0 + if-eqz v0, :show_native_downloader + return-void + :show_native_downloader + nop """ ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverParentFingerprint.kt deleted file mode 100644 index 8af33d1e..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverParentFingerprint.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.revanced.patches.youtube.interaction.downloads.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.util.patch.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal object DownloadActionCommandResolverParentFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - returnType = "V", - parameters = listOf("L", "L"), - strings = listOf( - // Strings are not unique and found in other methods. - "com.google.android.libraries.youtube.logging.interaction_logger", - "Unknown command" - ), - literalSupplier = { 16 } -) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/LegacyDownloadCommandResolverFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/LegacyDownloadCommandResolverFingerprint.kt deleted file mode 100644 index 36796010..00000000 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/LegacyDownloadCommandResolverFingerprint.kt +++ /dev/null @@ -1,24 +0,0 @@ -package app.revanced.patches.youtube.interaction.downloads.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -/** - * For spoofing to older versions. Also called if download playlist is pressed for any version. - */ -internal object LegacyDownloadCommandResolverFingerprint : MethodFingerprint( - accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, - returnType = "V", - parameters = listOf("Ljava/lang/String;", "Ljava/lang/String;", "L", "L"), - strings = listOf(""), - opcodes = listOf( - Opcode.MOVE_OBJECT_FROM16, - Opcode.MOVE_OBJECT_FROM16, - Opcode.NEW_INSTANCE, - Opcode.INVOKE_DIRECT, - Opcode.IGET_OBJECT, - Opcode.IF_NEZ, - ) -) diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/OfflineVideoEndpointFingerprint.kt similarity index 55% rename from src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/OfflineVideoEndpointFingerprint.kt index 2c74eec1..f28bc556 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/DownloadActionCommandResolverFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/fingerprints/OfflineVideoEndpointFingerprint.kt @@ -4,11 +4,13 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -/** - * Resolves to the class found in [DownloadActionCommandResolverParentFingerprint]. - */ -internal object DownloadActionCommandResolverFingerprint : MethodFingerprint( +internal object OfflineVideoEndpointFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", - parameters = listOf("L", "Ljava/util/Map;") + parameters = listOf( + "Ljava/util/Map;", + "L", + "Ljava/lang/String", // VideoId + "L"), + strings = listOf("Object is not an offlineable video: ") )