From 1dffbaf0aa73f0f703516648d5cd935000fa2770 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 29 May 2023 11:23:54 +0400 Subject: [PATCH] fix(youtube/integrations): fix playback of embedded videos (#2304) --- .../APIPlayerServiceFingerprint.kt | 17 ++++++++++++++++ ...print.kt => ApplicationInitFingerprint.kt} | 6 +++++- ...mbeddedPlayerControlsOverlayFingerprint.kt | 9 ++++++++- .../fingerprints/EmbeddedPlayerFingerprint.kt | 20 +++++++++++++++++++ .../RemoteEmbedFragmentFingerprint.kt | 19 ++++++++++++++++++ .../RemoteEmbeddedPlayerFingerprint.kt | 19 ++++++++++++++++++ .../fingerprints/ServiceFingerprint.kt | 8 -------- .../StandalonePlayerActivityFingerprint.kt | 18 +++++++++++++++++ .../StandalonePlayerFingerprint.kt | 10 ---------- .../integrations/patch/IntegrationsPatch.kt | 19 ++++++++++++++---- 10 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/{InitFingerprint.kt => ApplicationInitFingerprint.kt} (51%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ServiceFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt new file mode 100644 index 000000000..87607a770 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/APIPlayerServiceFingerprint.kt @@ -0,0 +1,17 @@ +package app.revanced.patches.youtube.misc.integrations.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint +import org.jf.dexlib2.AccessFlags + +/** + * For embedded playback. + * It appears this hook may no longer be needed as one of the constructor parameters is the already hooked + * [EmbeddedPlayerControlsOverlayFingerprint] + */ +object APIPlayerServiceFingerprint : IntegrationsFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lcom/google/android/apps/youtube/embeddedplayer/service/service/jar/ApiPlayerService;" }, + // Integrations context is the first method parameter. + contextRegisterResolver = { it.implementation!!.registerCount - it.parameters.size } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/InitFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/InitFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt index be3b5d8b7..7adb101ca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/InitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ApplicationInitFingerprint.kt @@ -2,6 +2,10 @@ package app.revanced.patches.youtube.misc.integrations.fingerprints import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint -object InitFingerprint : IntegrationsFingerprint( +/** + * Hooks the context when the app is launched as a regular application (and is not an embedded video playback). + */ +object ApplicationInitFingerprint : IntegrationsFingerprint( strings = listOf("Application creation", "Application.onCreate"), + // Integrations context is the Activity itself. ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt index 395fd022b..80e477460 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt @@ -4,12 +4,19 @@ import app.revanced.patcher.extensions.or import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint import org.jf.dexlib2.AccessFlags +/** + * For embedded playback inside Google Play store (and probably other situations as well). + * + * Note: this fingerprint may no longer be needed, as it appears + * [RemoteEmbedFragmentFingerprint] may be set before this hook is called. + */ object EmbeddedPlayerControlsOverlayFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, returnType = "V", - parameters = listOf("L", "L", "L"), + parameters = listOf("Landroid/content/Context;", "L", "L"), customFingerprint = { methodDef, _ -> methodDef.definingClass.startsWith("Lcom/google/android/apps/youtube/embeddedplayer/service/ui/overlays/controlsoverlay/remoteloaded/") }, + // Integrations context is the first method parameter. contextRegisterResolver = { it.implementation!!.registerCount - it.parameters.size } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt new file mode 100644 index 000000000..766156470 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/EmbeddedPlayerFingerprint.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.youtube.misc.integrations.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint +import org.jf.dexlib2.AccessFlags + +/** + * For embedded playback inside the Google app (such as the in app 'discover' tab). + * + * Note: this fingerprint may or may not be needed, as + * [RemoteEmbedFragmentFingerprint] might be set before this is called. + */ +object EmbeddedPlayerFingerprint : IntegrationsFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, + returnType = "L", + parameters = listOf("L", "L", "Landroid/content/Context;"), + strings = listOf("android.hardware.type.television"), // String is also found in other classes + // Integrations context is the third method parameter. + contextRegisterResolver = { it.implementation!!.registerCount - it.parameters.size + 2 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt new file mode 100644 index 000000000..e719289ff --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt @@ -0,0 +1,19 @@ +package app.revanced.patches.youtube.misc.integrations.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint +import org.jf.dexlib2.AccessFlags + +/** + * For embedded playback. Likely covers Google Play store and other Google products. + */ +object RemoteEmbedFragmentFingerprint : IntegrationsFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + returnType = "V", + parameters = listOf("Landroid/content/Context;", "L", "L"), + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "Lcom/google/android/apps/youtube/embeddedplayer/service/jar/client/RemoteEmbedFragment;" + }, + // Integrations context is the first method parameter. + contextRegisterResolver = { it.implementation!!.registerCount - it.parameters.size } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt new file mode 100644 index 000000000..6a16bf267 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt @@ -0,0 +1,19 @@ +package app.revanced.patches.youtube.misc.integrations.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint +import org.jf.dexlib2.AccessFlags + +/** + * For embedded playback inside 3rd party android app (such as 3rd party Reddit apps). + */ +object RemoteEmbeddedPlayerFingerprint : IntegrationsFingerprint( + accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, + returnType = "V", + parameters = listOf("Landroid/content/Context;", "L", "L", "Z"), + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "Lcom/google/android/youtube/api/jar/client/RemoteEmbeddedPlayer;" + }, + // Integrations context is the first method parameter. + contextRegisterResolver = { it.implementation!!.registerCount - it.parameters.size } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ServiceFingerprint.kt deleted file mode 100644 index dd5868d78..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/ServiceFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.youtube.misc.integrations.fingerprints - -import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint - -object ServiceFingerprint : IntegrationsFingerprint( - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("ApiPlayerService;") && methodDef.name == "" }, - contextRegisterResolver = { it.implementation!!.registerCount - it.parameters.size } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt new file mode 100644 index 000000000..799b80ee5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.misc.integrations.fingerprints + +import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint + +/** + * Old API activity to embed YouTube into 3rd party Android apps. + * + * In 2023 supported was ended and is no longer available, + * but this may still be used by older apps: + * https://developers.google.com/youtube/android/player + */ +object StandalonePlayerActivityFingerprint : IntegrationsFingerprint( + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "Lcom/google/android/youtube/api/StandalonePlayerActivity;" + && methodDef.name == "onCreate" + }, + // Integrations context is the Activity itself. +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerFingerprint.kt deleted file mode 100644 index ff7106145..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/fingerprints/StandalonePlayerFingerprint.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.misc.integrations.fingerprints - -import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch.IntegrationsFingerprint - -object StandalonePlayerFingerprint : IntegrationsFingerprint( - strings = listOf( - "Invalid PlaybackStartDescriptor. Returning the instance itself.", - "com.google.android.music", - ), -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/patch/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/patch/IntegrationsPatch.kt index 10a9dc93d..aeaba8952 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/patch/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/integrations/patch/IntegrationsPatch.kt @@ -4,15 +4,26 @@ import app.revanced.patcher.annotation.Name import app.revanced.patcher.patch.annotations.RequiresIntegrations import app.revanced.patches.shared.integrations.patch.AbstractIntegrationsPatch import app.revanced.patches.youtube.misc.integrations.annotations.IntegrationsCompatibility -import app.revanced.patches.youtube.misc.integrations.fingerprints.InitFingerprint import app.revanced.patches.youtube.misc.integrations.fingerprints.EmbeddedPlayerControlsOverlayFingerprint -import app.revanced.patches.youtube.misc.integrations.fingerprints.ServiceFingerprint -import app.revanced.patches.youtube.misc.integrations.fingerprints.StandalonePlayerFingerprint +import app.revanced.patches.youtube.misc.integrations.fingerprints.EmbeddedPlayerFingerprint +import app.revanced.patches.youtube.misc.integrations.fingerprints.ApplicationInitFingerprint +import app.revanced.patches.youtube.misc.integrations.fingerprints.RemoteEmbedFragmentFingerprint +import app.revanced.patches.youtube.misc.integrations.fingerprints.RemoteEmbeddedPlayerFingerprint +import app.revanced.patches.youtube.misc.integrations.fingerprints.APIPlayerServiceFingerprint +import app.revanced.patches.youtube.misc.integrations.fingerprints.StandalonePlayerActivityFingerprint @Name("integrations") @IntegrationsCompatibility @RequiresIntegrations class IntegrationsPatch : AbstractIntegrationsPatch( "Lapp/revanced/integrations/utils/ReVancedUtils;", - listOf(InitFingerprint, StandalonePlayerFingerprint, ServiceFingerprint, EmbeddedPlayerControlsOverlayFingerprint), + listOf( + ApplicationInitFingerprint, + StandalonePlayerActivityFingerprint, + RemoteEmbeddedPlayerFingerprint, + RemoteEmbedFragmentFingerprint, + EmbeddedPlayerControlsOverlayFingerprint, + EmbeddedPlayerFingerprint, + APIPlayerServiceFingerprint, + ), ) \ No newline at end of file