refactor: move the patch to the correct path

This commit is contained in:
inotia00
2023-06-18 23:09:08 +09:00
parent 03148b5c81
commit 5c99e9a16a
410 changed files with 3807 additions and 3505 deletions

View File

@ -0,0 +1,81 @@
package app.revanced.patches.youtube.player.autoplaybutton.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
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.patch.annotations.Patch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.shared.fingerprints.LayoutConstructorFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.AutoNavPreviewStub
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.bytecode.getStringIndex
import app.revanced.util.bytecode.getWideLiteralIndex
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.iface.instruction.Instruction
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.reference.MethodReference
@Patch
@Name("hide-autoplay-button")
@Description("Hides the autoplay button in the video player.")
@DependsOn(
[
SettingsPatch::class,
SharedResourceIdPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HideAutoplayButtonPatch : BytecodePatch(
listOf(LayoutConstructorFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
LayoutConstructorFingerprint.result?.let {
it.mutableMethod.apply {
val dummyRegister = getInstruction<OneRegisterInstruction>(getStringIndex("1.0x")).registerA
val insertIndex = getWideLiteralIndex(AutoNavPreviewStub)
val branchIndex = implementation!!.instructions.subList(insertIndex + 1, implementation!!.instructions.size - 1).indexOfFirst { instruction ->
((instruction as? ReferenceInstruction)?.reference as? MethodReference)?.name == "addOnLayoutChangeListener"
} + 2
val jumpInstruction = getInstruction<Instruction>(insertIndex + branchIndex)
addInstructionsWithLabels(
insertIndex, """
invoke-static {}, $PLAYER->hideAutoPlayButton()Z
move-result v$dummyRegister
if-nez v$dummyRegister, :hidden
""", ExternalLabel("hidden", jumpInstruction)
)
}
} ?: return LayoutConstructorFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_AUTOPLAY_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-autoplay-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,65 @@
package app.revanced.patches.youtube.player.captionsbutton.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.shared.fingerprints.SubtitleButtonControllerFingerprint
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
@Patch
@Name("hide-captions-button")
@Description("Hides the captions button in the video player.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class HideCaptionsButtonBytecodePatch : BytecodePatch(
listOf(SubtitleButtonControllerFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
SubtitleButtonControllerFingerprint.result?.let {
it.mutableMethod.apply {
val targetIndex = implementation!!.instructions.indexOfFirst { instruction ->
instruction.opcode == Opcode.IGET_OBJECT
}
val targetRegister = getInstruction<TwoRegisterInstruction>(targetIndex).registerA
val insertIndex = implementation!!.instructions.indexOfFirst { instruction ->
instruction.opcode == Opcode.IGET_BOOLEAN
} + 1
addInstruction(
insertIndex,
"invoke-static {v$targetRegister}, $PLAYER->hideCaptionsButton(Landroid/widget/ImageView;)V"
)
}
} ?: return SubtitleButtonControllerFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_CAPTIONS_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-captions-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,7 @@
package app.revanced.patches.youtube.player.castbutton.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object CastButtonFingerprint : MethodFingerprint(
customFingerprint = { it, _ -> it.definingClass.endsWith("MediaRouteButton;") && it.name == "setVisibility" }
)

View File

@ -0,0 +1,54 @@
package app.revanced.patches.youtube.player.castbutton.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructions
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.castbutton.fingerprints.CastButtonFingerprint
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
@Patch
@Name("hide-cast-button")
@Description("Hides the cast button in the video player.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class HideCastButtonPatch : BytecodePatch(
listOf(CastButtonFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
CastButtonFingerprint.result?.let {
it.mutableMethod.apply {
addInstructions(
0, """
invoke-static {p1}, $PLAYER->hideCastButton(I)I
move-result p1
"""
)
}
} ?: return CastButtonFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_CAST_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-cast-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,44 @@
package app.revanced.patches.youtube.player.collapsebutton.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.utils.playerbutton.patch.PlayerButtonPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
@Patch
@Name("hide-collapse-button")
@Description("Hides the collapse button in the video player.")
@DependsOn(
[
PlayerButtonPatch::class,
SettingsPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HideCollapseButtonPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_COLLAPSE_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-collapse-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,17 @@
package app.revanced.patches.youtube.player.endscreencards.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.EndScreenElementLayoutCircle
import app.revanced.util.bytecode.isWideLiteralExists
import org.jf.dexlib2.Opcode
object LayoutCircleFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.CONST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
),
customFingerprint = { it, _ -> it.isWideLiteralExists(EndScreenElementLayoutCircle) }
)

View File

@ -0,0 +1,17 @@
package app.revanced.patches.youtube.player.endscreencards.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.EndScreenElementLayoutIcon
import app.revanced.util.bytecode.isWideLiteralExists
import org.jf.dexlib2.Opcode
object LayoutIconFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.CONST_4,
Opcode.CONST,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
),
customFingerprint = { it, _ -> it.isWideLiteralExists(EndScreenElementLayoutIcon) }
)

View File

@ -0,0 +1,17 @@
package app.revanced.patches.youtube.player.endscreencards.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.EndScreenElementLayoutVideo
import app.revanced.util.bytecode.isWideLiteralExists
import org.jf.dexlib2.Opcode
object LayoutVideoFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.CONST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
),
customFingerprint = { it, _ -> it.isWideLiteralExists(EndScreenElementLayoutVideo) }
)

View File

@ -0,0 +1,74 @@
package app.revanced.patches.youtube.player.endscreencards.patch
import app.revanced.extensions.injectHideCall
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.getInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprintResult
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.endscreencards.fingerprints.LayoutCircleFingerprint
import app.revanced.patches.youtube.player.endscreencards.fingerprints.LayoutIconFingerprint
import app.revanced.patches.youtube.player.endscreencards.fingerprints.LayoutVideoFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch
@Name("hide-endscreen-cards")
@Description("Hides the suggested video cards at the end of a video in fullscreen.")
@DependsOn(
[
SettingsPatch::class,
SharedResourceIdPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HideEndScreenCardsPatch : BytecodePatch(
listOf(
LayoutCircleFingerprint,
LayoutIconFingerprint,
LayoutVideoFingerprint,
)
) {
override fun execute(context: BytecodeContext): PatchResult {
fun MethodFingerprintResult.injectHideCalls() {
val index = scanResult.patternScanResult!!.endIndex
mutableMethod.apply {
val register = this.getInstruction<OneRegisterInstruction>(index).registerA
implementation!!.injectHideCall(index + 1, register, "layout/PlayerPatch", "hideEndScreen")
}
}
listOf(
LayoutCircleFingerprint,
LayoutIconFingerprint,
LayoutVideoFingerprint
).forEach {
it.result?.injectHideCalls() ?: return it.toErrorResult()
}
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_END_SCREEN_CARDS"
)
)
SettingsPatch.updatePatchStatus("hide-endscreen-cards")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,10 @@
package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.util.bytecode.isWide32LiteralExists
object FilmStripOverlayConfigFingerprint : MethodFingerprint(
returnType = "Z",
parameters = listOf(),
customFingerprint = { it, _ -> it.isWide32LiteralExists(45381958) }
)

View File

@ -0,0 +1,11 @@
package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
object FilmStripOverlayInteractionFingerprint : MethodFingerprint(
returnType = "Z",
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("L")
)

View File

@ -0,0 +1,13 @@
package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.Scrubbing
import app.revanced.util.bytecode.isWideLiteralExists
import org.jf.dexlib2.AccessFlags
object FilmStripOverlayParentFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
customFingerprint = { it, _ -> it.isWideLiteralExists(Scrubbing) }
)

View File

@ -0,0 +1,14 @@
package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object FilmStripOverlayPreviewFingerprint : MethodFingerprint(
returnType = "Z",
parameters = listOf("F"),
opcodes = listOf(
Opcode.SUB_FLOAT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT
)
)

View File

@ -0,0 +1,10 @@
package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.WatchWhileTimeBarOverlayStub
import app.revanced.util.bytecode.isWideLiteralExists
object TimeBarOnClickListenerFingerprint : MethodFingerprint(
returnType = "V",
customFingerprint = { it, _ -> it.definingClass.endsWith("YouTubeControlsOverlay;") && it.isWideLiteralExists(WatchWhileTimeBarOverlayStub) }
)

View File

@ -0,0 +1,113 @@
package app.revanced.patches.youtube.player.filmstripoverlay.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
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.patch.annotations.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.filmstripoverlay.fingerprints.*
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.WatchWhileTimeBarOverlayStub
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.bytecode.getWideLiteralIndex
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
import org.jf.dexlib2.iface.reference.MethodReference
@Patch
@Name("hide-filmstrip-overlay")
@Description("Hide filmstrip overlay on swipe controls.")
@DependsOn(
[
SettingsPatch::class,
SharedResourceIdPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HideFilmstripOverlayPatch : BytecodePatch(
listOf(
FilmStripOverlayParentFingerprint,
TimeBarOnClickListenerFingerprint
)
) {
override fun execute(context: BytecodeContext): PatchResult {
FilmStripOverlayParentFingerprint.result?.classDef?.let { classDef ->
arrayOf(
FilmStripOverlayConfigFingerprint,
FilmStripOverlayInteractionFingerprint,
FilmStripOverlayPreviewFingerprint
).forEach { fingerprint ->
fingerprint.also { it.resolve(context, classDef) }.result?.mutableMethod?.injectHook()
?: return fingerprint.toErrorResult()
}
} ?: return FilmStripOverlayParentFingerprint.toErrorResult()
TimeBarOnClickListenerFingerprint.result?.let {
it.mutableMethod.apply {
val freeIndex = getWideLiteralIndex(WatchWhileTimeBarOverlayStub)
val freeRegister = getInstruction<OneRegisterInstruction>(freeIndex).registerA
val insertIndex = getIndex("bringChildToFront") + 1
val jumpIndex = getIndex("setOnClickListener") + 3
addInstructionsWithLabels(
insertIndex, """
invoke-static {}, $PLAYER->hideFilmstripOverlay()Z
move-result v$freeRegister
if-nez v$freeRegister, :hidden
""", ExternalLabel("hidden", getInstruction(jumpIndex))
)
}
} ?: return TimeBarOnClickListenerFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_FILMSTRIP_OVERLAY"
)
)
SettingsPatch.updatePatchStatus("hide-filmstrip-overlay")
return PatchResultSuccess()
}
private companion object {
fun MutableMethod.injectHook() {
addInstructionsWithLabels(
0, """
invoke-static {}, $PLAYER->hideFilmstripOverlay()Z
move-result v0
if-eqz v0, :shown
const/4 v0, 0x0
return v0
""", ExternalLabel("shown", getInstruction(0))
)
}
fun MutableMethod.getIndex(methodName: String): Int {
return implementation!!.instructions.indexOfFirst { instruction ->
if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return@indexOfFirst false
return@indexOfFirst ((instruction as Instruction35c).reference as MethodReference).name == methodName
}
}
}
}

View File

@ -0,0 +1,8 @@
package app.revanced.patches.youtube.player.hapticfeedback.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object MarkerHapticsFingerprint : MethodFingerprint(
returnType = "V",
strings = listOf("Failed to execute markers haptics vibrate.")
)

View File

@ -0,0 +1,8 @@
package app.revanced.patches.youtube.player.hapticfeedback.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object ScrubbingHapticsFingerprint : MethodFingerprint(
returnType = "V",
strings = listOf("Failed to haptics vibrate for fine scrubbing.")
)

View File

@ -0,0 +1,15 @@
package app.revanced.patches.youtube.player.hapticfeedback.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object SeekHapticsFingerprint : MethodFingerprint(
returnType = "V",
opcodes = listOf(
Opcode.SGET,
Opcode.CONST_16,
Opcode.IF_LE
),
strings = listOf("Failed to easy seek haptics vibrate."),
customFingerprint = { it, _ -> it.name == "run" }
)

View File

@ -0,0 +1,8 @@
package app.revanced.patches.youtube.player.hapticfeedback.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object ZoomHapticsFingerprint : MethodFingerprint(
returnType = "V",
strings = listOf("Failed to haptics vibrate for video zoom")
)

View File

@ -0,0 +1,95 @@
package app.revanced.patches.youtube.player.hapticfeedback.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
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.patch.annotations.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.hapticfeedback.fingerprints.*
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch
@Name("disable-haptic-feedback")
@Description("Disable haptic feedback when swiping.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class HapticFeedBackPatch : BytecodePatch(
listOf(
MarkerHapticsFingerprint,
SeekHapticsFingerprint,
ScrubbingHapticsFingerprint,
ZoomHapticsFingerprint
)
) {
override fun execute(context: BytecodeContext): PatchResult {
arrayOf(
SeekHapticsFingerprint to "disableSeekVibrate",
ScrubbingHapticsFingerprint to "disableScrubbingVibrate",
MarkerHapticsFingerprint to "disableChapterVibrate",
ZoomHapticsFingerprint to "disableZoomVibrate"
).map { (fingerprint, name) -> fingerprint.injectHook(name) }
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: DISABLE_HAPTIC_FEEDBACK"
)
)
SettingsPatch.updatePatchStatus("disable-haptic-feedback")
return PatchResultSuccess()
}
private companion object {
fun MethodFingerprint.injectHook(methodName: String) {
result?.let {
it.mutableMethod.apply {
var index = 0
var register = 0
if (this.name == "run") {
index = it.scanResult.patternScanResult!!.startIndex
register = getInstruction<OneRegisterInstruction>(index).registerA
}
injectHook(index, register, methodName)
}
} ?: throw toErrorResult()
}
fun MutableMethod.injectHook(
index: Int,
register: Int,
name: String
) {
addInstructionsWithLabels(
index, """
invoke-static {}, $PLAYER->$name()Z
move-result v$register
if-eqz v$register, :vibrate
return-void
""", ExternalLabel("vibrate", getInstruction(index))
)
}
}
}

View File

@ -0,0 +1,13 @@
package app.revanced.patches.youtube.player.infocards.fingerprints
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 InfoCardsIncognitoFingerprint : MethodFingerprint(
returnType = "L",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
opcodes = listOf(Opcode.IGET_BOOLEAN),
strings = listOf("vibrator")
)

View File

@ -0,0 +1,11 @@
package app.revanced.patches.youtube.player.infocards.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
object InfoCardsIncognitoParentFingerprint : MethodFingerprint(
returnType = "L",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
strings = listOf("player_overlay_info_card_teaser"),
)

View File

@ -0,0 +1,63 @@
package app.revanced.patches.youtube.player.infocards.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.infocards.fingerprints.InfoCardsIncognitoFingerprint
import app.revanced.patches.youtube.player.infocards.fingerprints.InfoCardsIncognitoParentFingerprint
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
@Patch
@Name("hide-info-cards")
@Description("Hides info-cards in videos.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class HideInfoCardsPatch : BytecodePatch(
listOf(InfoCardsIncognitoParentFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
InfoCardsIncognitoParentFingerprint.result?.classDef?.let { classDef ->
InfoCardsIncognitoFingerprint.also { it.resolve(context, classDef) }.result?.let {
it.mutableMethod.apply {
val targetIndex = it.scanResult.patternScanResult!!.startIndex
val targetRegister = getInstruction<TwoRegisterInstruction>(targetIndex).registerA
addInstructions(
targetIndex + 1, """
invoke-static {v$targetRegister}, $PLAYER->hideInfoCard(Z)Z
move-result v$targetRegister
"""
)
}
} ?: return InfoCardsIncognitoFingerprint.toErrorResult()
} ?: return InfoCardsIncognitoParentFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_INFO_CARDS"
)
)
SettingsPatch.updatePatchStatus("hide-info-cards")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,44 @@
package app.revanced.patches.youtube.player.livechatbutton.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.utils.playerbutton.patch.PlayerButtonPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
@Patch
@Name("hide-live-chat-button")
@Description("Hides the live chat button in the video player (for old layout).")
@DependsOn(
[
PlayerButtonPatch::class,
SettingsPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HideLiveChatButtonPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_LIVE_CHATS_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-live-chat-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,9 @@
package app.revanced.patches.youtube.player.musicbutton.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object MusicAppDeeplinkButtonFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("Z", "Z"),
customFingerprint = { it, _ -> it.definingClass.endsWith("MusicAppDeeplinkButtonController;") }
)

View File

@ -0,0 +1,58 @@
package app.revanced.patches.youtube.player.musicbutton.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
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.patch.annotations.Patch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.musicbutton.fingerprints.MusicAppDeeplinkButtonFingerprint
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
@Patch
@Name("hide-music-button")
@Description("Hides the YouTube Music button in the video player.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class HideMusicButtonPatch : BytecodePatch(
listOf(MusicAppDeeplinkButtonFingerprint)
){
override fun execute(context: BytecodeContext): PatchResult {
MusicAppDeeplinkButtonFingerprint.result?.let {
it.mutableMethod.apply {
addInstructionsWithLabels(
0, """
invoke-static {}, $PLAYER->hideMusicButton()Z
move-result v0
if-nez v0, :hidden
""", ExternalLabel("hidden", getInstruction(implementation!!.instructions.size - 1))
)
}
} ?: return MusicAppDeeplinkButtonFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_YOUTUBE_MUSIC_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-music-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,7 @@
package app.revanced.patches.youtube.player.playerbuttonbg.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object HidePlayerButtonFingerprint : MethodFingerprint (
customFingerprint = { it, _ -> it.definingClass.endsWith("PlayerPatch;") && it.name == "hidePlayerButton" }
)

View File

@ -0,0 +1,57 @@
package app.revanced.patches.youtube.player.playerbuttonbg.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstruction
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.playerbuttonbg.fingerprints.HidePlayerButtonFingerprint
import app.revanced.patches.youtube.utils.playerbutton.patch.PlayerButtonPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.INTEGRATIONS_PATH
@Patch
@Name("hide-player-button-background")
@Description("Hide player button background.")
@DependsOn(
[
PlayerButtonPatch::class,
SettingsPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HidePlayerButtonBackgroundPatch : BytecodePatch(
listOf(HidePlayerButtonFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
HidePlayerButtonFingerprint.result?.mutableMethod?.addInstruction(
0,
"invoke-static {p0}, " +
"$INTEGRATIONS_PATH/utils/ResourceHelper;->" +
"hidePlayerButtonBackground(Landroid/view/View;)V"
) ?: return HidePlayerButtonFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_PLAYER_BUTTON_BACKGROUND"
)
)
SettingsPatch.updatePatchStatus("hide-player-button-background")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,9 @@
package app.revanced.patches.youtube.player.playeroverlayfilter.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.ScrimOverlay
import app.revanced.util.bytecode.isWideLiteralExists
object ScrimOverlayFingerprint : MethodFingerprint(
customFingerprint = { it, _ -> it.definingClass.endsWith("YouTubeControlsOverlay;") && it.isWideLiteralExists(ScrimOverlay) }
)

View File

@ -0,0 +1,72 @@
package app.revanced.patches.youtube.player.playeroverlayfilter.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.playeroverlayfilter.fingerprints.ScrimOverlayFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.ScrimOverlay
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.bytecode.getWideLiteralIndex
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
@Patch
@Name("hide-player-overlay-filter")
@Description("Remove the dark filter layer from the player's background.")
@DependsOn(
[
SettingsPatch::class,
SharedResourceIdPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class PlayerOverlayFilterPatch : BytecodePatch(
listOf(ScrimOverlayFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
ScrimOverlayFingerprint.result?.let {
it.mutableMethod.apply {
val targetIndex = getWideLiteralIndex(ScrimOverlay) + 3
val targetParameter = getInstruction<ReferenceInstruction>(targetIndex).reference
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
if (!targetParameter.toString().endsWith("Landroid/widget/ImageView;"))
return PatchResultError("Method signature parameter did not match: $targetParameter")
addInstruction(
targetIndex + 1,
"invoke-static {v$targetRegister}, $PLAYER->hidePlayerOverlayFilter(Landroid/widget/ImageView;)V"
)
}
} ?: return ScrimOverlayFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_PLAYER_OVERLAY_FILTER"
)
)
SettingsPatch.updatePatchStatus("hide-player-overlay-filter")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,44 @@
package app.revanced.patches.youtube.player.previousnextbutton.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.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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.utils.playerbutton.patch.PlayerButtonPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
@Patch
@Name("hide-previous-next-button")
@Description("Hides the previous and next button in the player controller.")
@DependsOn(
[
PlayerButtonPatch::class,
SettingsPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class HidePreviousNextButtonPatch : BytecodePatch() {
override fun execute(context: BytecodeContext): PatchResult {
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_PREVIOUS_NEXT_BUTTON"
)
)
SettingsPatch.updatePatchStatus("hide-previous-next-button")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,10 @@
package app.revanced.patches.youtube.player.seekmessage.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.EasySeekEduContainer
import app.revanced.util.bytecode.isWideLiteralExists
object SeekEduContainerFingerprint : MethodFingerprint(
returnType = "V",
customFingerprint = { it, _ -> it.isWideLiteralExists(EasySeekEduContainer) }
)

View File

@ -0,0 +1,65 @@
package app.revanced.patches.youtube.player.seekmessage.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
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.patch.annotations.Patch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.seekmessage.fingerprints.SeekEduContainerFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
@Patch
@Name("hide-seek-message")
@Description("Hides the 'Slide left or right to seek' message container.")
@DependsOn(
[
SettingsPatch::class,
SharedResourceIdPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class SeekMessagePatch : BytecodePatch(
listOf(SeekEduContainerFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
SeekEduContainerFingerprint.result?.let {
it.mutableMethod.apply {
addInstructionsWithLabels(
0, """
invoke-static {}, $PLAYER->hideSeekMessage()Z
move-result v0
if-eqz v0, :default
return-void
""", ExternalLabel("default", getInstruction(0))
)
}
} ?: return SeekEduContainerFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_SEEK_MESSAGE"
)
)
SettingsPatch.updatePatchStatus("hide-seek-message")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,17 @@
package app.revanced.patches.youtube.player.suggestactions.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch.Companion.SuggestedAction
import app.revanced.util.bytecode.isWideLiteralExists
import org.jf.dexlib2.Opcode
object SuggestedActionsFingerprint : MethodFingerprint(
returnType = "V",
opcodes = listOf(
Opcode.CONST,
Opcode.CONST_4,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT
),
customFingerprint = { it, _ -> it.isWideLiteralExists(SuggestedAction) }
)

View File

@ -0,0 +1,61 @@
package app.revanced.patches.youtube.player.suggestactions.patch
import app.revanced.extensions.injectHideCall
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.getInstruction
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.suggestactions.fingerprints.SuggestedActionsFingerprint
import app.revanced.patches.youtube.misc.litho.patch.LithoFilterPatch
import app.revanced.patches.youtube.utils.resourceid.patch.SharedResourceIdPatch
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch
@Name("hide-suggested-actions")
@Description("Hide the suggested actions bar inside the player.")
@DependsOn(
[
LithoFilterPatch::class,
SettingsPatch::class,
SharedResourceIdPatch::class
]
)
@YouTubeCompatibility
@Version("0.0.1")
class SuggestedActionsPatch : BytecodePatch(
listOf(SuggestedActionsFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
SuggestedActionsFingerprint.result?.let{
it.mutableMethod.apply {
val targetIndex = it.scanResult.patternScanResult!!.endIndex
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
implementation!!.injectHideCall(targetIndex + 1, targetRegister, "layout/PlayerPatch", "hideSuggestedActions")
}
} ?: return SuggestedActionsFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_SUGGESTED_ACTION"
)
)
SettingsPatch.updatePatchStatus("hide-suggested-actions")
return PatchResultSuccess()
}
}

View File

@ -0,0 +1,17 @@
package app.revanced.patches.youtube.player.watermark.fingerprints
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 HideWatermarkFingerprint : MethodFingerprint (
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L", "L"),
opcodes = listOf(
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.IGET_BOOLEAN
)
)

View File

@ -0,0 +1,11 @@
package app.revanced.patches.youtube.player.watermark.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
object HideWatermarkParentFingerprint : MethodFingerprint (
returnType = "L",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
strings = listOf("player_overlay_in_video_programming")
)

View File

@ -0,0 +1,66 @@
package app.revanced.patches.youtube.player.watermark.patch
import app.revanced.extensions.toErrorResult
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.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
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.patch.annotations.Patch
import app.revanced.patches.shared.annotation.YouTubeCompatibility
import app.revanced.patches.youtube.player.watermark.fingerprints.HideWatermarkFingerprint
import app.revanced.patches.youtube.player.watermark.fingerprints.HideWatermarkParentFingerprint
import app.revanced.patches.youtube.utils.settings.resource.patch.SettingsPatch
import app.revanced.util.integrations.Constants.PLAYER
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
@Patch
@Name("hide-channel-watermark")
@Description("Hides creator's watermarks on videos.")
@DependsOn([SettingsPatch::class])
@YouTubeCompatibility
@Version("0.0.1")
class HideChannelWatermarkBytecodePatch : BytecodePatch(
listOf(HideWatermarkParentFingerprint)
) {
override fun execute(context: BytecodeContext): PatchResult {
HideWatermarkParentFingerprint.result?.let { parentResult ->
HideWatermarkFingerprint.also { it.resolve(context, parentResult.classDef) }.result?.let {
it.mutableMethod.apply {
val insertIndex = it.scanResult.patternScanResult!!.endIndex
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
removeInstruction(insertIndex)
addInstructions(
insertIndex, """
invoke-static {}, $PLAYER->hideChannelWatermark()Z
move-result v$register
"""
)
}
} ?: return HideWatermarkFingerprint.toErrorResult()
} ?: return HideWatermarkParentFingerprint.toErrorResult()
/**
* Add settings
*/
SettingsPatch.addPreference(
arrayOf(
"PREFERENCE: PLAYER_SETTINGS",
"SETTINGS: HIDE_CHANNEL_WATERMARK"
)
)
SettingsPatch.updatePatchStatus("hide-channel-watermark")
return PatchResultSuccess()
}
}