fix(youtube/sponsorblock): fix some segments skipping slightly too late

This commit is contained in:
inotia00
2023-07-23 02:54:03 +09:00
parent db82839a9c
commit 8a748e979e
5 changed files with 9 additions and 67 deletions

View File

@ -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;"),

View File

@ -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()

View File

@ -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,
)
)

View File

@ -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=")
)

View File

@ -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"
)
}
}