mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-06-13 05:37:40 +02:00
fix(youtube/sponsorblock): fix some segments skipping slightly too late
This commit is contained in:
@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or
|
|||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
|
||||||
object PlayerControllerFingerprint : MethodFingerprint(
|
object SegmentPlaybackControllerFingerprint : MethodFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||||
parameters = listOf("Ljava/lang/Object;"),
|
parameters = listOf("Ljava/lang/Object;"),
|
@ -21,8 +21,8 @@ import app.revanced.patches.youtube.utils.playercontrols.patch.PlayerControlsPat
|
|||||||
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
|
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
|
||||||
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.InsetOverlayViewLayout
|
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.InsetOverlayViewLayout
|
||||||
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.TotalTime
|
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.TotalTime
|
||||||
import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.PlayerControllerFingerprint
|
|
||||||
import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.RectangleFieldInvalidatorFingerprint
|
import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.RectangleFieldInvalidatorFingerprint
|
||||||
|
import app.revanced.patches.youtube.utils.sponsorblock.bytecode.fingerprints.SegmentPlaybackControllerFingerprint
|
||||||
import app.revanced.patches.youtube.utils.videoid.general.patch.VideoIdPatch
|
import app.revanced.patches.youtube.utils.videoid.general.patch.VideoIdPatch
|
||||||
import app.revanced.patches.youtube.utils.videoid.withoutshorts.patch.VideoIdWithoutShortsPatch
|
import app.revanced.patches.youtube.utils.videoid.withoutshorts.patch.VideoIdWithoutShortsPatch
|
||||||
import app.revanced.util.bytecode.BytecodeHelper.injectInit
|
import app.revanced.util.bytecode.BytecodeHelper.injectInit
|
||||||
@ -49,8 +49,8 @@ import org.jf.dexlib2.iface.reference.MethodReference
|
|||||||
)
|
)
|
||||||
class SponsorBlockBytecodePatch : BytecodePatch(
|
class SponsorBlockBytecodePatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
PlayerControllerFingerprint,
|
|
||||||
SeekbarFingerprint,
|
SeekbarFingerprint,
|
||||||
|
SegmentPlaybackControllerFingerprint,
|
||||||
TotalTimeFingerprint,
|
TotalTimeFingerprint,
|
||||||
YouTubeControlsOverlayFingerprint
|
YouTubeControlsOverlayFingerprint
|
||||||
)
|
)
|
||||||
@ -199,7 +199,7 @@ class SponsorBlockBytecodePatch : BytecodePatch(
|
|||||||
getInstruction<ReferenceInstruction>(implementation!!.instructions.count() - 3).reference
|
getInstruction<ReferenceInstruction>(implementation!!.instructions.count() - 3).reference
|
||||||
val rectangleFieldName = (rectangleReference as FieldReference).name
|
val rectangleFieldName = (rectangleReference as FieldReference).name
|
||||||
|
|
||||||
PlayerControllerFingerprint.result?.let { result ->
|
SegmentPlaybackControllerFingerprint.result?.let { result ->
|
||||||
result.mutableMethod.apply {
|
result.mutableMethod.apply {
|
||||||
for ((index, instruction) in implementation!!.instructions.withIndex()) {
|
for ((index, instruction) in implementation!!.instructions.withIndex()) {
|
||||||
if (instruction.opcode != Opcode.CONST_STRING) continue
|
if (instruction.opcode != Opcode.CONST_STRING) continue
|
||||||
@ -214,7 +214,7 @@ class SponsorBlockBytecodePatch : BytecodePatch(
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ?: return PlayerControllerFingerprint.toErrorResult()
|
} ?: return SegmentPlaybackControllerFingerprint.toErrorResult()
|
||||||
}
|
}
|
||||||
} ?: return RectangleFieldInvalidatorFingerprint.toErrorResult()
|
} ?: return RectangleFieldInvalidatorFingerprint.toErrorResult()
|
||||||
} ?: return SeekbarFingerprint.toErrorResult()
|
} ?: return SeekbarFingerprint.toErrorResult()
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
package app.revanced.patches.youtube.utils.videoid.general.fingerprint
|
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import org.jf.dexlib2.AccessFlags
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
|
|
||||||
object VideoTimeHighPrecisionFingerprint : MethodFingerprint(
|
|
||||||
returnType = "V",
|
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
|
||||||
parameters = listOf("J", "J", "J", "J", "I", "L"),
|
|
||||||
opcodes = listOf(
|
|
||||||
Opcode.INVOKE_DIRECT,
|
|
||||||
Opcode.IPUT_WIDE,
|
|
||||||
Opcode.IPUT_WIDE,
|
|
||||||
Opcode.IPUT_WIDE,
|
|
||||||
Opcode.IPUT_WIDE,
|
|
||||||
)
|
|
||||||
)
|
|
@ -1,7 +0,0 @@
|
|||||||
package app.revanced.patches.youtube.utils.videoid.general.fingerprint
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
|
|
||||||
object VideoTimeHighPrecisionParentFingerprint : MethodFingerprint(
|
|
||||||
strings = listOf("MedialibPlayerTimeInfo{currentPositionMillis=")
|
|
||||||
)
|
|
@ -21,8 +21,6 @@ import app.revanced.patches.youtube.utils.videoid.general.fingerprint.SeekFinger
|
|||||||
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoIdFingerprint
|
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoIdFingerprint
|
||||||
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoIdParentFingerprint
|
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoIdParentFingerprint
|
||||||
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoLengthFingerprint
|
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoLengthFingerprint
|
||||||
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoTimeHighPrecisionFingerprint
|
|
||||||
import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoTimeHighPrecisionParentFingerprint
|
|
||||||
import app.revanced.util.integrations.Constants.VIDEO_PATH
|
import app.revanced.util.integrations.Constants.VIDEO_PATH
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.builder.MutableMethodImplementation
|
import org.jf.dexlib2.builder.MutableMethodImplementation
|
||||||
@ -38,9 +36,7 @@ class VideoIdPatch : BytecodePatch(
|
|||||||
PlayerInitFingerprint,
|
PlayerInitFingerprint,
|
||||||
SeekFingerprint,
|
SeekFingerprint,
|
||||||
VideoIdParentFingerprint,
|
VideoIdParentFingerprint,
|
||||||
VideoLengthFingerprint,
|
VideoLengthFingerprint
|
||||||
VideoTimeHighPrecisionFingerprint,
|
|
||||||
VideoTimeHighPrecisionParentFingerprint
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
@ -80,24 +76,10 @@ class VideoIdPatch : BytecodePatch(
|
|||||||
} ?: return SeekFingerprint.toErrorResult()
|
} ?: return SeekFingerprint.toErrorResult()
|
||||||
} ?: return PlayerInitFingerprint.toErrorResult()
|
} ?: return PlayerInitFingerprint.toErrorResult()
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the high precision video time method
|
|
||||||
*/
|
|
||||||
VideoTimeHighPrecisionParentFingerprint.result?.let { parentResult ->
|
|
||||||
VideoTimeHighPrecisionFingerprint.also {
|
|
||||||
it.resolve(
|
|
||||||
context,
|
|
||||||
parentResult.classDef
|
|
||||||
)
|
|
||||||
}.result?.mutableMethod?.let { method ->
|
|
||||||
highPrecisionTimeMethod = method
|
|
||||||
} ?: return VideoTimeHighPrecisionFingerprint.toErrorResult()
|
|
||||||
} ?: return VideoTimeHighPrecisionParentFingerprint.toErrorResult()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hook the methods which set the time
|
* Hook the methods which set the time
|
||||||
*/
|
*/
|
||||||
highPrecisionTimeHook(INTEGRATIONS_CLASS_DESCRIPTOR, "setVideoTime")
|
videoTimeHook(INTEGRATIONS_CLASS_DESCRIPTOR, "setVideoTime")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set current video time
|
* Set current video time
|
||||||
@ -140,6 +122,8 @@ class VideoIdPatch : BytecodePatch(
|
|||||||
} ?: return VideoIdFingerprint.toErrorResult()
|
} ?: return VideoIdFingerprint.toErrorResult()
|
||||||
} ?: return VideoIdParentFingerprint.toErrorResult()
|
} ?: return VideoIdParentFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
injectCall("$VIDEO_PATH/VideoInformation;->setVideoId(Ljava/lang/String;)V")
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,14 +133,12 @@ class VideoIdPatch : BytecodePatch(
|
|||||||
private var offset = 0
|
private var offset = 0
|
||||||
private var playerInitInsertIndex = 4
|
private var playerInitInsertIndex = 4
|
||||||
private var timeInitInsertIndex = 2
|
private var timeInitInsertIndex = 2
|
||||||
private var highPrecisionInsertIndex = 0
|
|
||||||
|
|
||||||
private var insertIndex: Int = 0
|
private var insertIndex: Int = 0
|
||||||
private var videoIdRegister: Int = 0
|
private var videoIdRegister: Int = 0
|
||||||
private lateinit var insertMethod: MutableMethod
|
private lateinit var insertMethod: MutableMethod
|
||||||
private lateinit var playerInitMethod: MutableMethod
|
private lateinit var playerInitMethod: MutableMethod
|
||||||
private lateinit var timeMethod: MutableMethod
|
private lateinit var timeMethod: MutableMethod
|
||||||
private lateinit var highPrecisionTimeMethod: MutableMethod
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an invoke-static instruction, called with the new id when the video changes
|
* Adds an invoke-static instruction, called with the new id when the video changes
|
||||||
@ -205,20 +187,6 @@ class VideoIdPatch : BytecodePatch(
|
|||||||
timeInitInsertIndex++,
|
timeInitInsertIndex++,
|
||||||
"$targetMethodClass->$targetMethodName(J)V"
|
"$targetMethodClass->$targetMethodName(J)V"
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* Hook the high precision video time.
|
|
||||||
* The hooks is called extremely often (10 to 15 times a seconds), so use with caution.
|
|
||||||
* Note: the hook is usually called _off_ the main thread
|
|
||||||
*
|
|
||||||
* @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(
|
|
||||||
highPrecisionInsertIndex++,
|
|
||||||
"$targetMethodClass->$targetMethodName(J)V"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user