diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/fingerprints/LiveLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/fingerprints/LiveLabelFingerprint.kt new file mode 100644 index 000000000..ce97373fe --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/fingerprints/LiveLabelFingerprint.kt @@ -0,0 +1,23 @@ +package app.revanced.patches.youtube.video.speed.bytecode.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import app.revanced.patches.youtube.misc.resourceid.patch.SharedResourceIdPatch +import org.jf.dexlib2.iface.instruction.WideLiteralInstruction +import org.jf.dexlib2.Opcode + +object LiveLabelFingerprint : MethodFingerprint( + returnType = "V", + opcodes = listOf( + Opcode.IGET_OBJECT, + Opcode.IF_NEZ, + Opcode.RETURN_VOID, + Opcode.INVOKE_VIRTUAL, + Opcode.RETURN_VOID + ), + customFingerprint = { methodDef -> + methodDef.implementation?.instructions?.any { + it.opcode.ordinal == Opcode.CONST.ordinal && + (it as? WideLiteralInstruction)?.wideLiteral == SharedResourceIdPatch.chapterRepeatOnResourceId + } == true + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/patch/VideoSpeedBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/patch/VideoSpeedBytecodePatch.kt index 30dc1092c..575d9a849 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/patch/VideoSpeedBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/bytecode/patch/VideoSpeedBytecodePatch.kt @@ -12,28 +12,52 @@ import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patches.shared.annotation.YouTubeCompatibility import app.revanced.patches.youtube.misc.overridespeed.bytecode.fingerprints.VideoSpeedSettingsFingerprint import app.revanced.patches.youtube.misc.overridespeed.bytecode.patch.OverrideSpeedHookPatch +import app.revanced.patches.youtube.misc.resourceid.patch.SharedResourceIdPatch import app.revanced.patches.youtube.misc.videoid.legacy.patch.LegacyVideoIdPatch import app.revanced.patches.youtube.video.speed.bytecode.fingerprints.* import app.revanced.util.bytecode.BytecodeHelper.updatePatchStatus import app.revanced.util.integrations.Constants.VIDEO_PATH +import org.jf.dexlib2.Opcode +import org.jf.dexlib2.builder.instruction.BuilderInstruction35c import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction @Name("default-video-speed-bytecode-patch") @DependsOn( [ LegacyVideoIdPatch::class, - OverrideSpeedHookPatch::class + OverrideSpeedHookPatch::class, + SharedResourceIdPatch::class ] ) @YouTubeCompatibility @Version("0.0.1") class VideoSpeedBytecodePatch : BytecodePatch( listOf( + LiveLabelFingerprint, VideoSpeedSettingsFingerprint ) ) { override fun execute(context: BytecodeContext): PatchResult { + LiveLabelFingerprint.result?.mutableMethod?.let { + with (it.implementation!!.instructions) { + for ((index, instructions) in this.withIndex()) { + if (instructions.opcode != Opcode.INVOKE_VIRTUAL) continue + if ((instructions as BuilderInstruction35c).reference.toString() != + "Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V") continue + + insertIndex = index + 1 + + it.addInstruction( + insertIndex, + "invoke-static {}, $INTEGRATIONS_VIDEO_SPEED_CLASS_DESCRIPTOR->liveVideoStarted()V" + ) + break + } + } + if (insertIndex == 0) return LiveLabelFingerprint.toErrorResult() + } ?: return LiveLabelFingerprint.toErrorResult() + with(OverrideSpeedHookPatch.videoSpeedChangedResult) { val index = scanResult.patternScanResult!!.endIndex val register = @@ -62,5 +86,6 @@ class VideoSpeedBytecodePatch : BytecodePatch( private companion object { const val INTEGRATIONS_VIDEO_SPEED_CLASS_DESCRIPTOR = "$VIDEO_PATH/VideoSpeedPatch;" + var insertIndex: Int = 0 } } \ No newline at end of file