mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-06-12 05:07:41 +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 org.jf.dexlib2.AccessFlags
|
||||
|
||||
object PlayerControllerFingerprint : MethodFingerprint(
|
||||
object SegmentPlaybackControllerFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
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.Companion.InsetOverlayViewLayout
|
||||
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.SegmentPlaybackControllerFingerprint
|
||||
import app.revanced.patches.youtube.utils.videoid.general.patch.VideoIdPatch
|
||||
import app.revanced.patches.youtube.utils.videoid.withoutshorts.patch.VideoIdWithoutShortsPatch
|
||||
import app.revanced.util.bytecode.BytecodeHelper.injectInit
|
||||
@ -49,8 +49,8 @@ import org.jf.dexlib2.iface.reference.MethodReference
|
||||
)
|
||||
class SponsorBlockBytecodePatch : BytecodePatch(
|
||||
listOf(
|
||||
PlayerControllerFingerprint,
|
||||
SeekbarFingerprint,
|
||||
SegmentPlaybackControllerFingerprint,
|
||||
TotalTimeFingerprint,
|
||||
YouTubeControlsOverlayFingerprint
|
||||
)
|
||||
@ -199,7 +199,7 @@ class SponsorBlockBytecodePatch : BytecodePatch(
|
||||
getInstruction<ReferenceInstruction>(implementation!!.instructions.count() - 3).reference
|
||||
val rectangleFieldName = (rectangleReference as FieldReference).name
|
||||
|
||||
PlayerControllerFingerprint.result?.let { result ->
|
||||
SegmentPlaybackControllerFingerprint.result?.let { result ->
|
||||
result.mutableMethod.apply {
|
||||
for ((index, instruction) in implementation!!.instructions.withIndex()) {
|
||||
if (instruction.opcode != Opcode.CONST_STRING) continue
|
||||
@ -214,7 +214,7 @@ class SponsorBlockBytecodePatch : BytecodePatch(
|
||||
break
|
||||
}
|
||||
}
|
||||
} ?: return PlayerControllerFingerprint.toErrorResult()
|
||||
} ?: return SegmentPlaybackControllerFingerprint.toErrorResult()
|
||||
}
|
||||
} ?: return RectangleFieldInvalidatorFingerprint.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.VideoIdParentFingerprint
|
||||
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 org.jf.dexlib2.AccessFlags
|
||||
import org.jf.dexlib2.builder.MutableMethodImplementation
|
||||
@ -38,9 +36,7 @@ class VideoIdPatch : BytecodePatch(
|
||||
PlayerInitFingerprint,
|
||||
SeekFingerprint,
|
||||
VideoIdParentFingerprint,
|
||||
VideoLengthFingerprint,
|
||||
VideoTimeHighPrecisionFingerprint,
|
||||
VideoTimeHighPrecisionParentFingerprint
|
||||
VideoLengthFingerprint
|
||||
)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext): PatchResult {
|
||||
@ -80,24 +76,10 @@ class VideoIdPatch : BytecodePatch(
|
||||
} ?: return SeekFingerprint.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
|
||||
*/
|
||||
highPrecisionTimeHook(INTEGRATIONS_CLASS_DESCRIPTOR, "setVideoTime")
|
||||
videoTimeHook(INTEGRATIONS_CLASS_DESCRIPTOR, "setVideoTime")
|
||||
|
||||
/**
|
||||
* Set current video time
|
||||
@ -140,6 +122,8 @@ class VideoIdPatch : BytecodePatch(
|
||||
} ?: return VideoIdFingerprint.toErrorResult()
|
||||
} ?: return VideoIdParentFingerprint.toErrorResult()
|
||||
|
||||
injectCall("$VIDEO_PATH/VideoInformation;->setVideoId(Ljava/lang/String;)V")
|
||||
|
||||
return PatchResultSuccess()
|
||||
}
|
||||
|
||||
@ -149,14 +133,12 @@ class VideoIdPatch : BytecodePatch(
|
||||
private var offset = 0
|
||||
private var playerInitInsertIndex = 4
|
||||
private var timeInitInsertIndex = 2
|
||||
private var highPrecisionInsertIndex = 0
|
||||
|
||||
private var insertIndex: Int = 0
|
||||
private var videoIdRegister: Int = 0
|
||||
private lateinit var insertMethod: MutableMethod
|
||||
private lateinit var playerInitMethod: 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
|
||||
@ -205,20 +187,6 @@ class VideoIdPatch : BytecodePatch(
|
||||
timeInitInsertIndex++,
|
||||
"$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