From d708f36052ea92c15c7c68d59698e503999525d0 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sun, 15 Sep 2024 20:38:39 +0900 Subject: [PATCH] fix(YouTube Music/Disable auto captions): captions cannot be changed when `Disable forced auto captions` is turned on --- .../general/autocaptions/AutoCaptionsPatch.kt | 25 ++------- .../shared/captions/BaseAutoCaptionsPatch.kt | 56 +++++++++++++++++++ ...dererDecoderRecommendedLevelFingerprint.kt | 5 +- .../fingerprints/SubtitleTrackFingerprint.kt | 2 +- .../StartVideoInformerFingerprint.kt | 2 +- .../general/autocaptions/AutoCaptionsPatch.kt | 46 ++------------- .../components/PlayerComponentsPatch.kt | 2 +- 7 files changed, 72 insertions(+), 66 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt rename src/main/kotlin/app/revanced/patches/{youtube/general/autocaptions => shared/captions}/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt (59%) rename src/main/kotlin/app/revanced/patches/shared/{ => captions}/fingerprints/SubtitleTrackFingerprint.kt (86%) rename src/main/kotlin/app/revanced/patches/{youtube/utils => shared}/fingerprints/StartVideoInformerFingerprint.kt (89%) diff --git a/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt index 22c0d9b64..6b68863a0 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt @@ -1,39 +1,24 @@ package app.revanced.patches.music.general.autocaptions import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE -import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.shared.fingerprints.SubtitleTrackFingerprint +import app.revanced.patches.shared.captions.BaseAutoCaptionsPatch import app.revanced.util.patch.BaseBytecodePatch -import app.revanced.util.resultOrThrow -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") object AutoCaptionsPatch : BaseBytecodePatch( name = "Disable auto captions", description = "Adds an option to disable captions from being automatically enabled.", - dependencies = setOf(SettingsPatch::class), + dependencies = setOf( + BaseAutoCaptionsPatch::class, + SettingsPatch::class + ), compatiblePackages = COMPATIBLE_PACKAGE, - fingerprints = setOf(SubtitleTrackFingerprint), ) { override fun execute(context: BytecodeContext) { - SubtitleTrackFingerprint.resultOrThrow().mutableMethod.apply { - val index = implementation!!.instructions.lastIndex - val register = getInstruction(index).registerA - - addInstructions( - index, """ - invoke-static {v$register}, $GENERAL_CLASS_DESCRIPTOR->disableAutoCaptions(Z)Z - move-result v$register - """ - ) - } - SettingsPatch.addSwitchPreference( CategoryType.GENERAL, "revanced_disable_auto_captions", diff --git a/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt new file mode 100644 index 000000000..1ae96bccb --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt @@ -0,0 +1,56 @@ +package app.revanced.patches.shared.captions + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.shared.captions.fingerprints.StoryboardRendererDecoderRecommendedLevelFingerprint +import app.revanced.patches.shared.captions.fingerprints.SubtitleTrackFingerprint +import app.revanced.patches.shared.fingerprints.StartVideoInformerFingerprint +import app.revanced.patches.shared.integrations.Constants.PATCHES_PATH +import app.revanced.util.resultOrThrow + +@Patch( + description = "Disable forced auto captions for YouTube or YouTube Music." +) +object BaseAutoCaptionsPatch : BytecodePatch( + setOf( + StartVideoInformerFingerprint, + StoryboardRendererDecoderRecommendedLevelFingerprint, + SubtitleTrackFingerprint, + ) +) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$PATCHES_PATH/AutoCaptionsPatch;" + + override fun execute(context: BytecodeContext) { + + SubtitleTrackFingerprint.resultOrThrow().mutableMethod.apply { + addInstructionsWithLabels( + 0, """ + invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->disableAutoCaptions()Z + move-result v0 + if-eqz v0, :disabled + const/4 v0, 0x1 + return v0 + """, ExternalLabel("disabled", getInstruction(0)) + ) + } + + mapOf( + StartVideoInformerFingerprint to 0, + StoryboardRendererDecoderRecommendedLevelFingerprint to 1 + ).forEach { (fingerprint, enabled) -> + fingerprint.resultOrThrow().mutableMethod.addInstructions( + 0, """ + const/4 v0, 0x$enabled + invoke-static {v0}, $INTEGRATIONS_CLASS_DESCRIPTOR->setCaptionsButtonStatus(Z)V + """ + ) + } + + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt similarity index 59% rename from src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt index c06330575..62875e32c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StoryboardRendererDecoderRecommendedLevelFingerprint.kt @@ -1,13 +1,12 @@ -package app.revanced.patches.youtube.general.autocaptions.fingerprints +package app.revanced.patches.shared.captions.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 com.android.tools.smali.dexlib2.AccessFlags internal object StoryboardRendererDecoderRecommendedLevelFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - parameters = listOf(PLAYER_RESPONSE_MODEL_CLASS_DESCRIPTOR), + parameters = listOf("L"), strings = listOf("#-1#") ) diff --git a/src/main/kotlin/app/revanced/patches/shared/fingerprints/SubtitleTrackFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/shared/fingerprints/SubtitleTrackFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt index b97457386..b1a6012a7 100644 --- a/src/main/kotlin/app/revanced/patches/shared/fingerprints/SubtitleTrackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.shared.fingerprints +package app.revanced.patches.shared.captions.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/StartVideoInformerFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/fingerprints/StartVideoInformerFingerprint.kt similarity index 89% rename from src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/StartVideoInformerFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/fingerprints/StartVideoInformerFingerprint.kt index 0609b6a3a..dec566143 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/StartVideoInformerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/fingerprints/StartVideoInformerFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.utils.fingerprints +package app.revanced.patches.shared.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt index 4ed2f9a3d..763631b01 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt @@ -1,57 +1,23 @@ package app.revanced.patches.youtube.general.autocaptions import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.fingerprints.SubtitleTrackFingerprint -import app.revanced.patches.youtube.general.autocaptions.fingerprints.StoryboardRendererDecoderRecommendedLevelFingerprint +import app.revanced.patches.shared.captions.BaseAutoCaptionsPatch import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE -import app.revanced.patches.youtube.utils.fingerprints.StartVideoInformerFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.patch.BaseBytecodePatch -import app.revanced.util.resultOrThrow @Suppress("unused") object AutoCaptionsPatch : BaseBytecodePatch( name = "Disable auto captions", description = "Adds an option to disable captions from being automatically enabled.", - dependencies = setOf(SettingsPatch::class), - compatiblePackages = COMPATIBLE_PACKAGE, - fingerprints = setOf( - SubtitleTrackFingerprint, - StartVideoInformerFingerprint, - StoryboardRendererDecoderRecommendedLevelFingerprint, - ) + dependencies = setOf( + BaseAutoCaptionsPatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { override fun execute(context: BytecodeContext) { - SubtitleTrackFingerprint.resultOrThrow().mutableMethod.apply { - addInstructionsWithLabels( - 0, """ - invoke-static {}, $GENERAL_CLASS_DESCRIPTOR->disableAutoCaptions()Z - move-result v0 - if-eqz v0, :disabled - const/4 v0, 0x1 - return v0 - """, ExternalLabel("disabled", getInstruction(0)) - ) - } - - mapOf( - StartVideoInformerFingerprint to 0, - StoryboardRendererDecoderRecommendedLevelFingerprint to 1 - ).forEach { (fingerprint, enabled) -> - fingerprint.resultOrThrow().mutableMethod.addInstructions( - 0, """ - const/4 v0, 0x$enabled - invoke-static {v0}, $GENERAL_CLASS_DESCRIPTOR->setCaptionsButtonStatus(Z)V - """ - ) - } - /** * Add settings */ diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt index c5ecd85d5..454c38629 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt @@ -9,6 +9,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.shared.fingerprints.StartVideoInformerFingerprint import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.player.components.fingerprints.CrowdfundingBoxFingerprint import app.revanced.patches.youtube.player.components.fingerprints.EngagementPanelControllerFingerprint @@ -33,7 +34,6 @@ import app.revanced.patches.youtube.player.components.fingerprints.WatermarkPare import app.revanced.patches.youtube.player.speedoverlay.SpeedOverlayPatch import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.controlsoverlay.ControlsOverlayConfigPatch -import app.revanced.patches.youtube.utils.fingerprints.StartVideoInformerFingerprint import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint import app.revanced.patches.youtube.utils.fix.suggestedvideoendscreen.SuggestedVideoEndScreenPatch import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH