From bc30e39ae520b48e8b5c040685bef9ade944f492 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Sat, 5 Nov 2022 06:29:42 +0100 Subject: [PATCH] fix: apply multiple changes from integrations, refactor package structure, class names and implementations --- .../youtube/ad/video/patch/VideoAdsPatch.kt | 2 +- .../bytecode/patch/DownloadsBytecodePatch.kt | 2 +- .../patch/OldQualityLayoutPatch.kt | 2 +- .../patch/ReturnYouTubeDislikePatch.kt | 2 +- .../patch/SponsorBlockBytecodePatch.kt | 68 ++++++------- .../annotations/FixPlaybackCompatibility.kt | 2 +- .../{ => fix}/patch/FixPlaybackPatch.kt | 10 +- .../PlayerControllerCompatibility.kt | 2 +- .../CreateVideoPlayerSeekbarFingerprint.kt | 2 +- ...erControllerSetTimeReferenceFingerprint.kt | 2 +- .../fingerprints}/PlayerInitFingerprint.kt | 2 +- .../fingerprints}/SeekFingerprint.kt | 2 +- .../fingerprints}/VideoLengthFingerprint.kt | 2 +- .../fingerprints/VideoTimeFingerprint.kt | 2 +- .../patch/VideoInformationPatch.kt} | 98 +++++++++++++++---- .../RememberVideoQualityCompatibility.kt} | 26 ++--- .../VideoQualityReferenceFingerprint.kt | 34 +++---- .../VideoQualitySetterFingerprint.kt | 52 +++++----- .../VideoUserQualityChangeFingerprint.kt | 50 +++++----- .../patch/RememberVideoQualityPatch.kt | 20 ++-- .../CustomPlaybackSpeedCompatibility.kt | 2 +- .../SpeedArrayGeneratorFingerprint.kt | 4 +- .../fingerprints/SpeedLimiterFingerprint.kt | 4 +- .../VideoSpeedPatchFingerprint.kt | 6 +- .../custom/patch/CustomVideoSpeedPatch.kt} | 23 ++--- .../annotation/VideoIdCompatibility.kt | 2 +- .../videoid/fingerprint/VideoIdFingerprint.kt | 4 +- .../{ => video}/videoid/patch/VideoIdPatch.kt | 36 +++---- 28 files changed, 254 insertions(+), 209 deletions(-) rename src/main/kotlin/app/revanced/patches/youtube/misc/playback/{ => fix}/annotations/FixPlaybackCompatibility.kt (82%) rename src/main/kotlin/app/revanced/patches/youtube/misc/playback/{ => fix}/patch/FixPlaybackPatch.kt (83%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{playercontroller => video/information}/annotation/PlayerControllerCompatibility.kt (82%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{playercontroller/fingerprint => video/information/fingerprints}/CreateVideoPlayerSeekbarFingerprint.kt (86%) rename src/main/kotlin/app/revanced/patches/youtube/{layout/sponsorblock/bytecode => misc/video/information}/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt (88%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{playercontroller/fingerprint => video/information/fingerprints}/PlayerInitFingerprint.kt (87%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{playercontroller/fingerprint => video/information/fingerprints}/SeekFingerprint.kt (85%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{playercontroller/fingerprint => video/information/fingerprints}/VideoLengthFingerprint.kt (91%) rename src/main/kotlin/app/revanced/patches/youtube/{layout/sponsorblock/bytecode => misc/video/information}/fingerprints/VideoTimeFingerprint.kt (85%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{playercontroller/patch/PlayerControllerPatch.kt => video/information/patch/VideoInformationPatch.kt} (54%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{quality/annotations/DefaultVideoQualityCompatibility.kt => video/quality/annotations/RememberVideoQualityCompatibility.kt} (69%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/quality/fingerprints/VideoQualityReferenceFingerprint.kt (71%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/quality/fingerprints/VideoQualitySetterFingerprint.kt (74%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/quality/fingerprints/VideoUserQualityChangeFingerprint.kt (73%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/quality/patch/RememberVideoQualityPatch.kt (80%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{customplaybackspeed => video/speed/custom}/annotations/CustomPlaybackSpeedCompatibility.kt (83%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{customplaybackspeed => video/speed/custom}/fingerprints/SpeedArrayGeneratorFingerprint.kt (81%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{customplaybackspeed => video/speed/custom}/fingerprints/SpeedLimiterFingerprint.kt (82%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{customplaybackspeed => video/speed/custom}/fingerprints/VideoSpeedPatchFingerprint.kt (60%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{customplaybackspeed/patch/CustomPlaybackSpeedPatch.kt => video/speed/custom/patch/CustomVideoSpeedPatch.kt} (89%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/videoid/annotation/VideoIdCompatibility.kt (84%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/videoid/fingerprint/VideoIdFingerprint.kt (80%) rename src/main/kotlin/app/revanced/patches/youtube/misc/{ => video}/videoid/patch/VideoIdPatch.kt (55%) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ad/video/patch/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ad/video/patch/VideoAdsPatch.kt index b1b8231b..21ee64c7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ad/video/patch/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ad/video/patch/VideoAdsPatch.kt @@ -15,7 +15,7 @@ import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.ad.video.annotations.VideoAdsCompatibility import app.revanced.patches.youtube.ad.video.fingerprints.LoadVideoAdsFingerprint import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.playback.patch.FixPlaybackPatch +import app.revanced.patches.youtube.misc.playback.fix.patch.FixPlaybackPatch import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.framework.components.impl.StringResource import app.revanced.patches.youtube.misc.settings.framework.components.impl.SwitchPreference diff --git a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/bytecode/patch/DownloadsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/bytecode/patch/DownloadsBytecodePatch.kt index 2b9de008..c5e6ba0c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/bytecode/patch/DownloadsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/bytecode/patch/DownloadsBytecodePatch.kt @@ -12,7 +12,7 @@ import app.revanced.patcher.patch.annotations.Patch import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch -import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch +import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch @Patch @Name("downloads") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/patch/OldQualityLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/patch/OldQualityLayoutPatch.kt index 2cb2fa7a..581b3c18 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/patch/OldQualityLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/oldqualitylayout/patch/OldQualityLayoutPatch.kt @@ -51,7 +51,7 @@ class OldQualityLayoutPatch : BytecodePatch( // insert the integrations method method.addInstruction( listenerInvokeRegister, // insert the integrations instructions right before the listener - "invoke-static { v$onItemClickViewRegister }, Lapp/revanced/integrations/patches/OldQualityLayoutPatch;->showOldQualityMenu(Landroid/widget/ListView;)V" + "invoke-static { v$onItemClickViewRegister }, Lapp/revanced/integrations/patches/playback/quality/OldQualityLayoutPatch;->showOldQualityMenu(Landroid/widget/ListView;)V" ) return PatchResultSuccess() diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/patch/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/patch/ReturnYouTubeDislikePatch.kt index 4b9dcf5e..0cf0e2c8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/patch/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/patch/ReturnYouTubeDislikePatch.kt @@ -18,7 +18,7 @@ import app.revanced.patches.youtube.layout.returnyoutubedislike.annotations.Retu import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.* import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch +import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch @Patch @DependsOn([IntegrationsPatch::class, VideoIdPatch::class, ReturnYouTubeDislikeResourcePatch::class]) diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt index eabafce9..3f4f6e40 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/patch/SponsorBlockBytecodePatch.kt @@ -8,7 +8,6 @@ import app.revanced.patcher.data.toMethodWalker import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.replaceInstruction -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchResult @@ -23,9 +22,9 @@ import app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints.* import app.revanced.patches.youtube.layout.sponsorblock.resource.patch.SponsorBlockResourcePatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.mapping.patch.ResourceMappingResourcePatch -import app.revanced.patches.youtube.misc.playercontroller.patch.PlayerControllerPatch import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch -import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch +import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch +import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch import org.jf.dexlib2.Opcode import org.jf.dexlib2.iface.instruction.* import org.jf.dexlib2.iface.instruction.formats.Instruction35c @@ -36,7 +35,7 @@ import org.jf.dexlib2.iface.reference.StringReference @Patch @DependsOn( dependencies = [ - PlayerControllerPatch::class, // updates video length and adds method to seek in video + VideoInformationPatch::class, // updates video information and adds method to seek in video PlayerControlsBytecodePatch::class, IntegrationsPatch::class, SponsorBlockResourcePatch::class, @@ -49,9 +48,7 @@ import org.jf.dexlib2.iface.reference.StringReference @Version("0.0.1") class SponsorBlockBytecodePatch : BytecodePatch( listOf( - PlayerControllerSetTimeReferenceFingerprint, CreateVideoPlayerSeekbarFingerprint, - VideoTimeFingerprint, NextGenWatchLayoutFingerprint, AppendTimeFingerprint, PlayerOverlaysLayoutInitFingerprint, @@ -59,36 +56,31 @@ class SponsorBlockBytecodePatch : BytecodePatch( StartVideoInformerFingerprint ) ) { - override fun execute(context: BytecodeContext): PatchResult {/* - Set current video time - */ - val referenceResult = PlayerControllerSetTimeReferenceFingerprint.result!! - val playerControllerSetTimeMethod = - context.toMethodWalker(referenceResult.method) - .nextMethod(referenceResult.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod - playerControllerSetTimeMethod.addInstruction( - 2, - "invoke-static {p1, p2}, Lapp/revanced/integrations/sponsorblock/PlayerController;->setCurrentVideoTime(J)V" - ) + private companion object { + const val INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR = + "Lapp/revanced/integrations/sponsorblock/PlayerController;" + } + + override fun execute(context: BytecodeContext): PatchResult { /* - Set current video time high precision + Hook the video time methods */ - val constructorFingerprint = - object : MethodFingerprint("V", null, listOf("J", "J", "J", "J", "I", "L"), null) {} - constructorFingerprint.resolve(context, VideoTimeFingerprint.result!!.classDef) - - val constructor = constructorFingerprint.result!!.mutableMethod - constructor.addInstruction( - 0, - "invoke-static {p1, p2}, Lapp/revanced/integrations/sponsorblock/PlayerController;->setCurrentVideoTimeHighPrecision(J)V" - ) + with(VideoInformationPatch) { + videoTimeHook( + INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR, + "setVideoTime" + ) + highPrecisionTimeHook( + INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR, + "setHighPrecisionVideoTime" + ) + } /* Set current video id */ - VideoIdPatch.injectCall("Lapp/revanced/integrations/sponsorblock/PlayerController;->setCurrentVideoId(Ljava/lang/String;)V") + VideoIdPatch.injectCall("$INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->setCurrentVideoId(Ljava/lang/String;)V") /* Seekbar drawing @@ -104,7 +96,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( if (instruction.opcode != Opcode.MOVE_OBJECT_FROM16) continue seekbarMethod.addInstruction( index + 1, - "invoke-static {v0}, Lapp/revanced/integrations/sponsorblock/PlayerController;->setSponsorBarRect(Ljava/lang/Object;)V" + "invoke-static {v0}, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V" ) break } @@ -120,7 +112,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( // set the thickness of the segment seekbarMethod.addInstruction( insertIndex, - "invoke-static {v${invokeInstruction.registerC}}, Lapp/revanced/integrations/sponsorblock/PlayerController;->setSponsorBarThickness(I)V" + "invoke-static {v${invokeInstruction.registerC}}, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V" ) break } @@ -141,11 +133,11 @@ class SponsorBlockBytecodePatch : BytecodePatch( // the reason for that is that we get the index, add instructions and then the offset would be wrong seekbarMethod.addInstruction( indexLeft + 1, - "invoke-static {v$rectangleLeftRegister}, Lapp/revanced/integrations/sponsorblock/PlayerController;->setSponsorBarAbsoluteLeft(Landroid/graphics/Rect;)V" + "invoke-static {v$rectangleLeftRegister}, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarAbsoluteLeft(Landroid/graphics/Rect;)V" ) seekbarMethod.addInstruction( indexRight + 1, - "invoke-static {v$rectangleRightRegister}, Lapp/revanced/integrations/sponsorblock/PlayerController;->setSponsorBarAbsoluteRight(Landroid/graphics/Rect;)V" + "invoke-static {v$rectangleRightRegister}, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarAbsoluteRight(Landroid/graphics/Rect;)V" ) /* @@ -157,7 +149,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( } seekbarMethod.addInstruction( drawSegmentInstructionInsertIndex, - "invoke-static {v$canvasInstance, v$centerY}, Lapp/revanced/integrations/sponsorblock/PlayerController;->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V" + "invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V" ) /* @@ -215,7 +207,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( val instanceRegister = 0 NextGenWatchLayoutFingerprint.result!!.mutableMethod.addInstruction( 3, // after super call - "invoke-static/range {p$instanceRegister}, Lapp/revanced/integrations/sponsorblock/PlayerController;->addSkipSponsorView15(Landroid/view/View;)V" + "invoke-static/range {p$instanceRegister}, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->addSkipSponsorView15(Landroid/view/View;)V" ) // append the new time to the player layout @@ -232,7 +224,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( ) // initialize the player controller - PlayerControllerPatch.onCreateHook("Lapp/revanced/integrations/sponsorblock/PlayerController;", "initialize") + VideoInformationPatch.onCreateHook(INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR, "initialize") // initialize the sponsorblock view PlayerOverlaysLayoutInitFingerprint.result!!.mutableMethod.addInstruction( @@ -277,7 +269,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( startVideoInformerMethod.addInstructions( 0, """ const/4 v0, 0x0 - sput-boolean v0, Lapp/revanced/integrations/sponsorblock/PlayerController;->shorts_playing:Z + sput-boolean v0, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->shorts_playing:Z """ ) @@ -286,7 +278,7 @@ class SponsorBlockBytecodePatch : BytecodePatch( shortsPlayerConstructorMethod.addInstructions( 0, """ const/4 v0, 0x1 - sput-boolean v0, Lapp/revanced/integrations/sponsorblock/PlayerController;->shorts_playing:Z + sput-boolean v0, $INTEGRATIONS_PLAYER_CONTROLLER_CLASS_DESCRIPTOR->shorts_playing:Z """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playback/annotations/FixPlaybackCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playback/fix/annotations/FixPlaybackCompatibility.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playback/annotations/FixPlaybackCompatibility.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/playback/fix/annotations/FixPlaybackCompatibility.kt index 8b2d1e74..df111c43 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playback/annotations/FixPlaybackCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playback/fix/annotations/FixPlaybackCompatibility.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playback.annotations +package app.revanced.patches.youtube.misc.playback.fix.annotations import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Package diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playback/patch/FixPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/playback/fix/patch/FixPlaybackPatch.kt similarity index 83% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playback/patch/FixPlaybackPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/playback/fix/patch/FixPlaybackPatch.kt index 1ffb2098..9402fb2d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playback/patch/FixPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/playback/fix/patch/FixPlaybackPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playback.patch +package app.revanced.patches.youtube.misc.playback.fix.patch import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Name @@ -9,16 +9,16 @@ import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.playback.annotations.FixPlaybackCompatibility -import app.revanced.patches.youtube.misc.playercontroller.patch.PlayerControllerPatch +import app.revanced.patches.youtube.misc.playback.fix.annotations.FixPlaybackCompatibility +import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.framework.components.impl.StringResource import app.revanced.patches.youtube.misc.settings.framework.components.impl.SwitchPreference -import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch +import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch @DependsOn([ IntegrationsPatch::class, - PlayerControllerPatch::class, // updates video length and adds method to seek in video, necessary for this patch + VideoInformationPatch::class, // updates video length and adds method to seek in video, necessary for this patch SettingsPatch::class, VideoIdPatch::class ]) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/annotation/PlayerControllerCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/annotation/PlayerControllerCompatibility.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/annotation/PlayerControllerCompatibility.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/annotation/PlayerControllerCompatibility.kt index af62a0be..13af9391 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/annotation/PlayerControllerCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/annotation/PlayerControllerCompatibility.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playercontroller.annotation +package app.revanced.patches.youtube.misc.video.information.annotation import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Package diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/CreateVideoPlayerSeekbarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/CreateVideoPlayerSeekbarFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/CreateVideoPlayerSeekbarFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/CreateVideoPlayerSeekbarFingerprint.kt index f0fa35ac..81513c50 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/CreateVideoPlayerSeekbarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/CreateVideoPlayerSeekbarFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playercontroller.fingerprint +package app.revanced.patches.youtube.misc.video.information.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt similarity index 88% rename from src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt index fa47a3f7..9b97627c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints +package app.revanced.patches.youtube.misc.video.information.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/PlayerInitFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/PlayerInitFingerprint.kt similarity index 87% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/PlayerInitFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/PlayerInitFingerprint.kt index 81f5a61f..21dada96 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/PlayerInitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/PlayerInitFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playercontroller.fingerprint +package app.revanced.patches.youtube.misc.video.information.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/SeekFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/SeekFingerprint.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/SeekFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/SeekFingerprint.kt index 00fa1c87..88a0e2e8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/SeekFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/SeekFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playercontroller.fingerprint +package app.revanced.patches.youtube.misc.video.information.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/VideoLengthFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/VideoLengthFingerprint.kt similarity index 91% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/VideoLengthFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/VideoLengthFingerprint.kt index 22371304..c3d306f9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/fingerprint/VideoLengthFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/VideoLengthFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.playercontroller.fingerprint +package app.revanced.patches.youtube.misc.video.information.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/fingerprints/VideoTimeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/VideoTimeFingerprint.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/fingerprints/VideoTimeFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/VideoTimeFingerprint.kt index d50b23a3..3ebb16a5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/bytecode/fingerprints/VideoTimeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/fingerprints/VideoTimeFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints +package app.revanced.patches.youtube.misc.video.information.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/patch/PlayerControllerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/patch/VideoInformationPatch.kt similarity index 54% rename from src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/patch/PlayerControllerPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/information/patch/VideoInformationPatch.kt index efa8d460..dd239db3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/playercontroller/patch/PlayerControllerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/information/patch/VideoInformationPatch.kt @@ -1,13 +1,15 @@ -package app.revanced.patches.youtube.misc.playercontroller.patch +package app.revanced.patches.youtube.misc.video.information.patch import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.data.toMethodWalker import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.instruction import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchResult @@ -16,11 +18,8 @@ import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.playercontroller.annotation.PlayerControllerCompatibility -import app.revanced.patches.youtube.misc.playercontroller.fingerprint.CreateVideoPlayerSeekbarFingerprint -import app.revanced.patches.youtube.misc.playercontroller.fingerprint.PlayerInitFingerprint -import app.revanced.patches.youtube.misc.playercontroller.fingerprint.SeekFingerprint -import app.revanced.patches.youtube.misc.playercontroller.fingerprint.VideoLengthFingerprint +import app.revanced.patches.youtube.misc.video.speed.remember.annotation.RememberPlaybackSpeedCompatibility +import app.revanced.patches.youtube.misc.video.information.fingerprints.* import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.builder.MutableMethodImplementation import org.jf.dexlib2.iface.instruction.OneRegisterInstruction @@ -28,15 +27,17 @@ import org.jf.dexlib2.immutable.ImmutableMethod import org.jf.dexlib2.immutable.ImmutableMethodParameter import org.jf.dexlib2.util.MethodUtil -@Name("player-controller-hook") -@Description("Hooks the player controller") -@PlayerControllerCompatibility +@Name("video-information") +@Description("Hooks YouTube to get information about the current playing video.") +@RememberPlaybackSpeedCompatibility @Version("0.0.1") @DependsOn([IntegrationsPatch::class]) -class PlayerControllerPatch : BytecodePatch( +class VideoInformationPatch : BytecodePatch( listOf( PlayerInitFingerprint, - CreateVideoPlayerSeekbarFingerprint + CreateVideoPlayerSeekbarFingerprint, + PlayerControllerSetTimeReferenceFingerprint, + VideoTimeFingerprint, ) ) { override fun execute(context: BytecodeContext): PatchResult { @@ -88,29 +89,90 @@ class PlayerControllerPatch : BytecodePatch( addInstruction( videoLengthMethodResult.scanResult.patternScanResult!!.endIndex, - "invoke-static {v$videoLengthRegister, v$dummyRegisterForLong}, $INTEGRATIONS_CLASS_DESCRIPTOR->setCurrentVideoLength(J)V" + "invoke-static {v$videoLengthRegister, v$dummyRegisterForLong}, $INTEGRATIONS_CLASS_DESCRIPTOR->setVideoLength(J)V" ) } } + /* + Set the video time method + */ + with(PlayerControllerSetTimeReferenceFingerprint.result!!) { + timeMethod = context.toMethodWalker(method) + .nextMethod(scanResult.patternScanResult!!.startIndex, true) + .getMethod() as MutableMethod + } + + /* + Set the high precision video time method + */ + highPrecisionTimeMethod = + (object : MethodFingerprint("V", null, listOf("J", "J", "J", "J", "I", "L"), null) {}).also { + it.resolve(context, VideoTimeFingerprint.result!!.classDef) + }.result!!.mutableMethod + + /* + Hook the methods which set the time + */ + highPrecisionTimeHook(INTEGRATIONS_CLASS_DESCRIPTOR, "setVideoTime") + return PatchResultSuccess() } companion object { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/PlayerControllerPatch;" - private const val INSERT_INDEX = 4 + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/VideoInformation;" private lateinit var playerInitMethod: MutableMethod + private lateinit var timeMethod: MutableMethod + private lateinit var highPrecisionTimeMethod: MutableMethod + + private fun MutableMethod.insert(insert: InsertIndex, register: String, descriptor: String) = + addInstruction(insert.index, "invoke-static { $register }, $descriptor") + + private fun MutableMethod.insertTimeHook(insert: InsertIndex, descriptor: String) = + insert(insert, "p1, p2", descriptor) /** * Hook the player controller. * - * @param targetMethodClass The descriptor for the static method to invoke when the player controller is created. + * @param targetMethodClass The descriptor for the class to invoke when the player controller is created. + * @param targetMethodName The name of the static method to invoke when the player controller is created. */ internal fun onCreateHook(targetMethodClass: String, targetMethodName: String) = - playerInitMethod.addInstruction( - INSERT_INDEX, - "invoke-static { v0 }, $targetMethodClass->$targetMethodName(Ljava/lang/Object;)V" + playerInitMethod.insert( + InsertIndex.CREATE, + "v0", + "$targetMethodClass->$targetMethodName(Ljava/lang/Object;)V" ) + + /** + * Hook the video time. + * + * @param targetMethodClass The descriptor for the static method to invoke when the player controller is created. + * @param targetMethodName The name of the static method to invoke when the player controller is created. + */ + internal fun videoTimeHook(targetMethodClass: String, targetMethodName: String) = + timeMethod.insertTimeHook( + InsertIndex.TIME, + "$targetMethodClass->$targetMethodName(J)V" + ) + + /** + * Hook the high precision video time. + * + * @param targetMethodClass The descriptor for the static method to invoke when the player controller is created. + * @param targetMethodName The name of the static method to invoke when the player controller is created. + */ + internal fun highPrecisionTimeHook(targetMethodClass: String, targetMethodName: String) = + highPrecisionTimeMethod.insertTimeHook( + InsertIndex.HIGH_PRECISION_TIME, + "$targetMethodClass->$targetMethodName(J)V" + ) + + enum class InsertIndex(internal val index: Int) { + CREATE(4), + TIME(2), + HIGH_PRECISION_TIME(0), + } } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/annotations/DefaultVideoQualityCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/annotations/RememberVideoQualityCompatibility.kt similarity index 69% rename from src/main/kotlin/app/revanced/patches/youtube/misc/quality/annotations/DefaultVideoQualityCompatibility.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/annotations/RememberVideoQualityCompatibility.kt index 04a7edfd..31d8da2d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/annotations/DefaultVideoQualityCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/annotations/RememberVideoQualityCompatibility.kt @@ -1,13 +1,13 @@ -package app.revanced.patches.youtube.misc.quality.annotations - -import app.revanced.patcher.annotation.Compatibility -import app.revanced.patcher.annotation.Package - -@Compatibility( - [Package( - "com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36") - )] -) -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.RUNTIME) -internal annotation class DefaultVideoQualityCompatibility +package app.revanced.patches.youtube.misc.video.quality.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility( + [Package( + "com.google.android.youtube", arrayOf("17.36.37", "17.41.37", "17.42.35", "17.43.36") + )] +) +@Target(AnnotationTarget.CLASS) +@Retention(AnnotationRetention.RUNTIME) +internal annotation class RememberVideoQualityCompatibility diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoQualityReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoQualityReferenceFingerprint.kt similarity index 71% rename from src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoQualityReferenceFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoQualityReferenceFingerprint.kt index 0bfc31ee..b799bd28 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoQualityReferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoQualityReferenceFingerprint.kt @@ -1,18 +1,18 @@ -package app.revanced.patches.youtube.misc.quality.fingerprints - -import app.revanced.patcher.annotation.Name -import app.revanced.patcher.annotation.Version -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.misc.quality.annotations.DefaultVideoQualityCompatibility -import org.jf.dexlib2.AccessFlags -import org.jf.dexlib2.Opcode - -@Name("video-quality-reference-fingerprint") -@DefaultVideoQualityCompatibility -@Version("0.0.1") -object VideoQualityReferenceFingerprint : MethodFingerprint( - "V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L"), listOf( - Opcode.IPUT_OBJECT, Opcode.RETURN_VOID - ) +package app.revanced.patches.youtube.misc.video.quality.fingerprints + +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +@Name("video-quality-reference-fingerprint") +@RememberVideoQualityCompatibility +@Version("0.0.1") +object VideoQualityReferenceFingerprint : MethodFingerprint( + "V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L"), listOf( + Opcode.IPUT_OBJECT, Opcode.RETURN_VOID + ) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoQualitySetterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoQualitySetterFingerprint.kt similarity index 74% rename from src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoQualitySetterFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoQualitySetterFingerprint.kt index ffa0711f..333a9d1d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoQualitySetterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoQualitySetterFingerprint.kt @@ -1,27 +1,27 @@ - -package app.revanced.patches.youtube.misc.quality.fingerprints - -import app.revanced.patcher.annotation.Name -import app.revanced.patcher.annotation.Version -import app.revanced.patcher.extensions.or - -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.misc.quality.annotations.DefaultVideoQualityCompatibility -import org.jf.dexlib2.AccessFlags -import org.jf.dexlib2.Opcode - -@Name("video-quality-setter-fingerprint") -@DefaultVideoQualityCompatibility -@Version("0.0.1") -object VideoQualitySetterFingerprint : MethodFingerprint( - "V", - AccessFlags.PUBLIC or AccessFlags.FINAL, - listOf("[L", "I", "I", "Z", "I"), - listOf( - Opcode.IF_EQZ, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.IPUT_BOOLEAN, - ) + +package app.revanced.patches.youtube.misc.video.quality.fingerprints + +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.extensions.or + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +@Name("video-quality-setter-fingerprint") +@RememberVideoQualityCompatibility +@Version("0.0.1") +object VideoQualitySetterFingerprint : MethodFingerprint( + "V", + AccessFlags.PUBLIC or AccessFlags.FINAL, + listOf("[L", "I", "I", "Z", "I"), + listOf( + Opcode.IF_EQZ, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.IPUT_BOOLEAN, + ) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoUserQualityChangeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoUserQualityChangeFingerprint.kt similarity index 73% rename from src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoUserQualityChangeFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoUserQualityChangeFingerprint.kt index 292c409f..e2706165 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/fingerprints/VideoUserQualityChangeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/fingerprints/VideoUserQualityChangeFingerprint.kt @@ -1,26 +1,26 @@ - -package app.revanced.patches.youtube.misc.quality.fingerprints - -import app.revanced.patcher.annotation.Name -import app.revanced.patcher.annotation.Version -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint - -import app.revanced.patches.youtube.misc.quality.annotations.DefaultVideoQualityCompatibility -import org.jf.dexlib2.AccessFlags -import org.jf.dexlib2.Opcode - -@Name("video-user-quality-change-fingerprint") -@DefaultVideoQualityCompatibility -@Version("0.0.1") -object VideoUserQualityChangeFingerprint : MethodFingerprint( - "V", - AccessFlags.PUBLIC or AccessFlags.FINAL, - listOf("L","L","I","J"), - listOf( - Opcode.MOVE, - Opcode.MOVE_WIDE, - Opcode.INVOKE_INTERFACE_RANGE, - Opcode.RETURN_VOID - ) + +package app.revanced.patches.youtube.misc.video.quality.fingerprints + +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint + +import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +@Name("video-user-quality-change-fingerprint") +@RememberVideoQualityCompatibility +@Version("0.0.1") +object VideoUserQualityChangeFingerprint : MethodFingerprint( + "V", + AccessFlags.PUBLIC or AccessFlags.FINAL, + listOf("L","L","I","J"), + listOf( + Opcode.MOVE, + Opcode.MOVE_WIDE, + Opcode.INVOKE_INTERFACE_RANGE, + Opcode.RETURN_VOID + ) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/patch/RememberVideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/patch/RememberVideoQualityPatch.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/misc/quality/patch/RememberVideoQualityPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/patch/RememberVideoQualityPatch.kt index 577f35dd..a998eaf3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quality/patch/RememberVideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/quality/patch/RememberVideoQualityPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.quality.patch +package app.revanced.patches.youtube.misc.video.quality.patch import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Name @@ -13,14 +13,14 @@ import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.Patch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.quality.annotations.DefaultVideoQualityCompatibility -import app.revanced.patches.youtube.misc.quality.fingerprints.VideoQualityReferenceFingerprint -import app.revanced.patches.youtube.misc.quality.fingerprints.VideoQualitySetterFingerprint -import app.revanced.patches.youtube.misc.quality.fingerprints.VideoUserQualityChangeFingerprint +import app.revanced.patches.youtube.misc.video.quality.annotations.RememberVideoQualityCompatibility +import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualityReferenceFingerprint +import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoQualitySetterFingerprint +import app.revanced.patches.youtube.misc.video.quality.fingerprints.VideoUserQualityChangeFingerprint import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.framework.components.impl.StringResource import app.revanced.patches.youtube.misc.settings.framework.components.impl.SwitchPreference -import app.revanced.patches.youtube.misc.videoid.patch.VideoIdPatch +import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.reference.FieldReference @@ -28,7 +28,7 @@ import org.jf.dexlib2.iface.reference.FieldReference @DependsOn([IntegrationsPatch::class, VideoIdPatch::class, SettingsPatch::class]) @Name("remember-video-quality") @Description("Adds the ability to remember the video quality you chose in the video quality flyout.") -@DefaultVideoQualityCompatibility +@RememberVideoQualityCompatibility @Version("0.0.1") class RememberVideoQualityPatch : BytecodePatch( listOf( @@ -63,7 +63,7 @@ class RememberVideoQualityPatch : BytecodePatch( (method.implementation!!.instructions.elementAt(0) as ReferenceInstruction).reference as FieldReference } - VideoIdPatch.injectCall("Lapp/revanced/integrations/patches/VideoQualityPatch;->newVideoStarted(Ljava/lang/String;)V") + VideoIdPatch.injectCall("Lapp/revanced/integrations/patches/playback/quality/RememberVideoQualityPatch;->newVideoStarted(Ljava/lang/String;)V") val qIndexMethodName = context.classes.single { it.type == qualityFieldReference.type }.methods.single { it.parameterTypes.first() == "I" }.name @@ -73,14 +73,14 @@ class RememberVideoQualityPatch : BytecodePatch( """ iget-object v0, p0, ${setterMethod.classDef.type}->${qualityFieldReference.name}:${qualityFieldReference.type} const-string v1, "$qIndexMethodName" - invoke-static {p1, p2, v0, v1}, Lapp/revanced/integrations/patches/VideoQualityPatch;->setVideoQuality([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/String;)I + invoke-static {p1, p2, v0, v1}, Lapp/revanced/integrations/patches/playback/quality/RememberVideoQualityPatch;->setVideoQuality([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/String;)I move-result p2 """, ) userQualityMethod.mutableMethod.addInstruction( 0, - "invoke-static {p3}, Lapp/revanced/integrations/patches/VideoQualityPatch;->userChangedQuality(I)V" + "invoke-static {p3}, Lapp/revanced/integrations/patches/playback/quality/RememberVideoQualityPatch;->userChangedQuality(I)V" ) return PatchResultSuccess() diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/annotations/CustomPlaybackSpeedCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/annotations/CustomPlaybackSpeedCompatibility.kt similarity index 83% rename from src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/annotations/CustomPlaybackSpeedCompatibility.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/annotations/CustomPlaybackSpeedCompatibility.kt index 23c46226..56d1e77b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/annotations/CustomPlaybackSpeedCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/annotations/CustomPlaybackSpeedCompatibility.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.customplaybackspeed.annotations +package app.revanced.patches.youtube.misc.video.speed.custom.annotations import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Package diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/SpeedArrayGeneratorFingerprint.kt similarity index 81% rename from src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/SpeedArrayGeneratorFingerprint.kt index 61017189..45f0cc1d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/SpeedArrayGeneratorFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.misc.customplaybackspeed.fingerprints +package app.revanced.patches.youtube.misc.video.speed.custom.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.misc.customplaybackspeed.annotations.CustomPlaybackSpeedCompatibility +import app.revanced.patches.youtube.misc.video.speed.custom.annotations.CustomPlaybackSpeedCompatibility import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.Opcode diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/SpeedLimiterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/SpeedLimiterFingerprint.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/SpeedLimiterFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/SpeedLimiterFingerprint.kt index c60cce99..0db8b5b6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/SpeedLimiterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/SpeedLimiterFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.misc.customplaybackspeed.fingerprints +package app.revanced.patches.youtube.misc.video.speed.custom.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.misc.customplaybackspeed.annotations.CustomPlaybackSpeedCompatibility +import app.revanced.patches.youtube.misc.video.speed.custom.annotations.CustomPlaybackSpeedCompatibility import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.Opcode diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/VideoSpeedPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/VideoSpeedPatchFingerprint.kt similarity index 60% rename from src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/VideoSpeedPatchFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/VideoSpeedPatchFingerprint.kt index e4fad32b..f4522258 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/fingerprints/VideoSpeedPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/fingerprints/VideoSpeedPatchFingerprint.kt @@ -1,9 +1,9 @@ -package app.revanced.patches.youtube.misc.customplaybackspeed.fingerprints +package app.revanced.patches.youtube.misc.video.speed.custom.fingerprints import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.misc.customplaybackspeed.annotations.CustomPlaybackSpeedCompatibility +import app.revanced.patches.youtube.misc.video.speed.custom.annotations.CustomPlaybackSpeedCompatibility import org.jf.dexlib2.Opcode @Name("video-speed-patch-fingerprint") @@ -12,6 +12,6 @@ import org.jf.dexlib2.Opcode object VideoSpeedPatchFingerprint : MethodFingerprint( opcodes = listOf(Opcode.FILL_ARRAY_DATA), customFingerprint = { methodDef -> - methodDef.definingClass.endsWith("VideoSpeedPatch;") && methodDef.name == "" + methodDef.definingClass.endsWith("CustomVideoSpeedPatch;") && methodDef.name == "" } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/patch/CustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/patch/CustomVideoSpeedPatch.kt similarity index 89% rename from src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/patch/CustomPlaybackSpeedPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/patch/CustomVideoSpeedPatch.kt index 518e3472..1b76883b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/customplaybackspeed/patch/CustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/speed/custom/patch/CustomVideoSpeedPatch.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.customplaybackspeed.patch +package app.revanced.patches.youtube.misc.video.speed.custom.patch import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Name @@ -9,12 +9,11 @@ import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.* import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.Patch -import app.revanced.patches.youtube.misc.customplaybackspeed.annotations.CustomPlaybackSpeedCompatibility -import app.revanced.patches.youtube.misc.customplaybackspeed.fingerprints.SpeedArrayGeneratorFingerprint -import app.revanced.patches.youtube.misc.customplaybackspeed.fingerprints.SpeedLimiterFingerprint -import app.revanced.patches.youtube.misc.customplaybackspeed.fingerprints.VideoSpeedPatchFingerprint +import app.revanced.patches.youtube.misc.video.speed.custom.annotations.CustomPlaybackSpeedCompatibility +import app.revanced.patches.youtube.misc.video.speed.custom.fingerprints.SpeedArrayGeneratorFingerprint +import app.revanced.patches.youtube.misc.video.speed.custom.fingerprints.SpeedLimiterFingerprint +import app.revanced.patches.youtube.misc.video.speed.custom.fingerprints.VideoSpeedPatchFingerprint import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.mapping.patch.ResourceMappingResourcePatch import org.jf.dexlib2.builder.instruction.BuilderArrayPayload import org.jf.dexlib2.iface.instruction.NarrowLiteralInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction @@ -25,20 +24,18 @@ import java.util.stream.DoubleStream import kotlin.math.roundToInt @Patch -@Name("custom-playback-speed") -@Description("Adds more video playback speed options.") -@DependsOn([IntegrationsPatch::class, ResourceMappingResourcePatch::class]) +@Name("custom-video-speed") +@Description("Adds more video speed options.") +@DependsOn([IntegrationsPatch::class]) @CustomPlaybackSpeedCompatibility @Version("0.0.1") -class CustomPlaybackSpeedPatch : BytecodePatch( +class CustomVideoSpeedPatch : BytecodePatch( listOf( SpeedArrayGeneratorFingerprint, SpeedLimiterFingerprint, VideoSpeedPatchFingerprint ) ) { override fun execute(context: BytecodeContext): PatchResult { - //TODO: include setting to skip remembering the new speed - val speedLimitMin = minVideoSpeed!!.toFloat() val speedLimitMax = maxVideoSpeed!!.toFloat().coerceAtLeast(speedLimitMin) val speedsGranularity = videoSpeedsGranularity!!.toFloat() @@ -64,7 +61,7 @@ class CustomPlaybackSpeedPatch : BytecodePatch( val arrayLengthConstDestination = (arrayLengthConst as OneRegisterInstruction).registerA - val videoSpeedsArrayType = "Lapp/revanced/integrations/patches/VideoSpeedPatch;->videoSpeeds:[F" + val videoSpeedsArrayType = "Lapp/revanced/integrations/patches/playback/speed/CustomVideoSpeedPatch;->videoSpeeds:[F" arrayGenMethod.addInstructions( arrayLengthConstIndex + 1, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/videoid/annotation/VideoIdCompatibility.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/annotation/VideoIdCompatibility.kt similarity index 84% rename from src/main/kotlin/app/revanced/patches/youtube/misc/videoid/annotation/VideoIdCompatibility.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/annotation/VideoIdCompatibility.kt index ef65b52d..b2e78b82 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/videoid/annotation/VideoIdCompatibility.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/annotation/VideoIdCompatibility.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.misc.videoid.annotation +package app.revanced.patches.youtube.misc.video.videoid.annotation import app.revanced.patcher.annotation.Compatibility import app.revanced.patcher.annotation.Package diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/videoid/fingerprint/VideoIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/fingerprint/VideoIdFingerprint.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/misc/videoid/fingerprint/VideoIdFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/fingerprint/VideoIdFingerprint.kt index aa78b715..2c7c4f97 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/videoid/fingerprint/VideoIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/fingerprint/VideoIdFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.misc.videoid.fingerprint +package app.revanced.patches.youtube.misc.video.videoid.fingerprint import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint -import app.revanced.patches.youtube.misc.videoid.annotation.VideoIdCompatibility +import app.revanced.patches.youtube.misc.video.videoid.annotation.VideoIdCompatibility import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.Opcode diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/videoid/patch/VideoIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/patch/VideoIdPatch.kt similarity index 55% rename from src/main/kotlin/app/revanced/patches/youtube/misc/videoid/patch/VideoIdPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/patch/VideoIdPatch.kt index dfeb1699..da21078f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/videoid/patch/VideoIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/video/videoid/patch/VideoIdPatch.kt @@ -1,19 +1,19 @@ -package app.revanced.patches.youtube.misc.videoid.patch +package app.revanced.patches.youtube.misc.video.videoid.patch import app.revanced.patcher.annotation.Description import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Version import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult +import app.revanced.patcher.extensions.instruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch -import app.revanced.patches.youtube.misc.videoid.annotation.VideoIdCompatibility -import app.revanced.patches.youtube.misc.videoid.fingerprint.VideoIdFingerprint +import app.revanced.patches.youtube.misc.video.videoid.annotation.VideoIdCompatibility +import app.revanced.patches.youtube.misc.video.videoid.fingerprint.VideoIdFingerprint import org.jf.dexlib2.iface.instruction.OneRegisterInstruction @Name("video-id-hook") @@ -27,24 +27,20 @@ class VideoIdPatch : BytecodePatch( ) ) { override fun execute(context: BytecodeContext): PatchResult { - result = VideoIdFingerprint.result!! + with(VideoIdFingerprint.result!!) { + insertMethod = mutableMethod + insertIndex = scanResult.patternScanResult!!.endIndex + 2 - insertMethod = result.mutableMethod - videoIdRegister = - (insertMethod.implementation!!.instructions[result.scanResult.patternScanResult!!.endIndex + 1] as OneRegisterInstruction).registerA - - injectCall("Lapp/revanced/integrations/videoplayer/VideoInformation;->setCurrentVideoId(Ljava/lang/String;)V") - - offset++ // offset so setCurrentVideoId is called before any injected call + videoIdRegister = (insertMethod.instruction(insertIndex - 1) as OneRegisterInstruction).registerA + } return PatchResultSuccess() } companion object { - private var offset = 2 + private var videoIdRegister = 0 + private var insertIndex = 0 - private var videoIdRegister: Int = 0 - private lateinit var result: MethodFingerprintResult private lateinit var insertMethod: MutableMethod /** @@ -53,12 +49,10 @@ class VideoIdPatch : BytecodePatch( */ fun injectCall( methodDescriptor: String - ) { - insertMethod.addInstructions( - result.scanResult.patternScanResult!!.endIndex + offset, // move-result-object offset - "invoke-static {v$videoIdRegister}, $methodDescriptor" - ) - } + ) = insertMethod.addInstructions( + insertIndex, // move-result-object offset + "invoke-static {v$videoIdRegister}, $methodDescriptor" + ) } }