feat(YouTube): Support versions 18.48.39, 18.49.37 and 19.01.34 (#2551)

Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
This commit is contained in:
oSumAtrIX 2024-01-16 19:54:06 +01:00 committed by GitHub
parent 57908dbeef
commit a938e736fa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
71 changed files with 362 additions and 260 deletions

View file

@ -24,15 +24,16 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
], ],
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", "com.google.android.youtube", [
[
"18.32.39", "18.32.39",
"18.37.36", "18.37.36",
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -25,8 +25,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -29,8 +29,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -17,15 +17,10 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch
], ],
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", "com.google.android.youtube", [
[ "18.48.39",
"18.32.39", "18.49.37",
"18.37.36", "19.01.34"
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
] ]

View file

@ -17,15 +17,10 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch
], ],
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", "com.google.android.youtube", [
[ "18.48.39",
"18.32.39", "18.49.37",
"18.37.36", "19.01.34"
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
), ),
] ]

View file

@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -29,8 +29,10 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
[ [
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -25,8 +25,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
[ [
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
], ],

View file

@ -1,7 +1,5 @@
package app.revanced.patches.youtube.interaction.swipecontrols package app.revanced.patches.youtube.interaction.swipecontrols
import app.revanced.util.transformMethods
import app.revanced.util.traverseClassHierarchy
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage import app.revanced.patcher.patch.annotation.CompatiblePackage
@ -10,7 +8,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu
import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint import app.revanced.patches.youtube.interaction.swipecontrols.fingerprints.SwipeControlsHostActivityFingerprint
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
import app.revanced.patches.youtube.shared.fingerprints.WatchWhileActivityFingerprint import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint
import app.revanced.util.transformMethods
import app.revanced.util.traverseClassHierarchy
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
@ -31,8 +31,10 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]
@ -40,19 +42,19 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
@Suppress("unused") @Suppress("unused")
object SwipeControlsBytecodePatch : BytecodePatch( object SwipeControlsBytecodePatch : BytecodePatch(
setOf( setOf(
WatchWhileActivityFingerprint, MainActivityFingerprint,
SwipeControlsHostActivityFingerprint SwipeControlsHostActivityFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext) { override fun execute(context: BytecodeContext) {
val wrapperClass = SwipeControlsHostActivityFingerprint.result!!.mutableClass val wrapperClass = SwipeControlsHostActivityFingerprint.result!!.mutableClass
val targetClass = WatchWhileActivityFingerprint.result!!.mutableClass val targetClass = MainActivityFingerprint.result!!.mutableClass
// inject the wrapper class from integrations into the class hierarchy of WatchWhileActivity // Inject the wrapper class from integrations into the class hierarchy of MainActivity.
wrapperClass.setSuperClass(targetClass.superclass) wrapperClass.setSuperClass(targetClass.superclass)
targetClass.setSuperClass(wrapperClass.type) targetClass.setSuperClass(wrapperClass.type)
// ensure all classes and methods in the hierarchy are non-final, so we can override them in integrations // Ensure all classes and methods in the hierarchy are non-final, so we can override them in integrations.
context.traverseClassHierarchy(targetClass) { context.traverseClassHierarchy(targetClass) {
accessFlags = accessFlags and AccessFlags.FINAL.value.inv() accessFlags = accessFlags and AccessFlags.FINAL.value.inv()
transformMethods { transformMethods {

View file

@ -29,8 +29,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
], ],

View file

@ -27,8 +27,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -37,8 +37,10 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -28,8 +28,10 @@ import com.android.tools.smali.dexlib2.Opcode
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -34,8 +34,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -32,8 +32,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -26,8 +26,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -30,8 +30,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction21c
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -27,8 +27,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -23,8 +23,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -23,8 +23,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -37,8 +37,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -34,8 +34,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -23,8 +23,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -23,8 +23,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -20,15 +20,20 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
SettingsPatch::class SettingsPatch::class
], ],
compatiblePackages = [ compatiblePackages = [
CompatiblePackage("com.google.android.youtube", [ CompatiblePackage(
"com.google.android.youtube", [
"18.32.39", "18.32.39",
"18.37.36", "18.37.36",
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.41",
"18.45.43" "18.45.43",
]) "18.48.39",
"18.49.37",
"19.01.34"
]
)
] ]
) )
@Suppress("unused") @Suppress("unused")

View file

@ -25,8 +25,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"com.google.android.youtube", [ "com.google.android.youtube", [
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -31,8 +31,10 @@ import app.revanced.patches.youtube.shared.fingerprints.SeekbarOnDrawFingerprint
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -35,8 +35,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -22,8 +22,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -19,13 +19,14 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", [ "com.google.android.youtube", [
"18.32.39",
"18.37.36", "18.37.36",
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -24,8 +24,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -18,8 +18,10 @@ import org.w3c.dom.Element
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
], ],

View file

@ -5,7 +5,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.PatchException
@ -18,7 +17,7 @@ import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.Lik
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RemoveLikeFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RemoveLikeFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureAnimatedTextFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureAnimatedTextFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureTextParentFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberMeasureStaticLabelParentFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberSetterFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberSetterFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberTextViewFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.RollingNumberTextViewFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.ShortsTextViewFingerprint import app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints.ShortsTextViewFingerprint
@ -55,11 +54,8 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", [ "com.google.android.youtube", [
"18.38.44", "18.49.37",
"18.43.45", "19.01.34"
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
] ]
@ -76,7 +72,8 @@ object ReturnYouTubeDislikePatch : BytecodePatch(
DislikeFingerprint, DislikeFingerprint,
RemoveLikeFingerprint, RemoveLikeFingerprint,
RollingNumberSetterFingerprint, RollingNumberSetterFingerprint,
RollingNumberMeasureTextParentFingerprint, RollingNumberMeasureStaticLabelParentFingerprint,
RollingNumberMeasureAnimatedTextFingerprint,
RollingNumberTextViewFingerprint, RollingNumberTextViewFingerprint,
RollingNumberTextViewAnimationUpdateFingerprint RollingNumberTextViewAnimationUpdateFingerprint
) )
@ -276,24 +273,19 @@ object ReturnYouTubeDislikePatch : BytecodePatch(
// Rolling Number text views use the measured width of the raw string for layout. // Rolling Number text views use the measured width of the raw string for layout.
// Modify the measure text calculation to include the left drawable separator if needed. // Modify the measure text calculation to include the left drawable separator if needed.
RollingNumberMeasureAnimatedTextFingerprint.also { RollingNumberMeasureAnimatedTextFingerprint.result?.also {
if (!it.resolve(context, RollingNumberMeasureTextParentFingerprint.result!!.classDef)) val scanResult = it.scanResult.patternScanResult!!
throw it.exception // Additional check to verify the opcodes are at the start of the method
}.result?.also { if (scanResult.startIndex != 0) throw PatchException("Unexpected opcode location")
val endIndex = scanResult.endIndex
it.mutableMethod.apply { it.mutableMethod.apply {
val returnInstructionIndex = it.scanResult.patternScanResult!!.endIndex val measuredTextWidthRegister = getInstruction<OneRegisterInstruction>(endIndex).registerA
val measuredTextWidthRegister =
getInstruction<OneRegisterInstruction>(returnInstructionIndex).registerA
replaceInstruction( // Replace instruction to preserve control flow label.
returnInstructionIndex,
"invoke-static {p1, v$measuredTextWidthRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F"
)
addInstructions( addInstructions(
returnInstructionIndex + 1, endIndex + 1,
""" """
invoke-static {p1, v$measuredTextWidthRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F
move-result v$measuredTextWidthRegister move-result v$measuredTextWidthRegister
return v$measuredTextWidthRegister
""" """
) )
} }
@ -301,12 +293,10 @@ object ReturnYouTubeDislikePatch : BytecodePatch(
// Additional text measurement method. Used if YouTube decides not to animate the likes count // Additional text measurement method. Used if YouTube decides not to animate the likes count
// and sometimes used for initial video load. // and sometimes used for initial video load.
RollingNumberMeasureStaticLabelFingerprint.also { RollingNumberMeasureStaticLabelFingerprint.resolve(context, RollingNumberMeasureStaticLabelParentFingerprint.resultOrThrow().classDef)
if (!it.resolve(context, RollingNumberMeasureTextParentFingerprint.result!!.classDef)) RollingNumberMeasureStaticLabelFingerprint.result?.also {
throw it.exception
}.result?.also {
it.mutableMethod.apply {
val measureTextIndex = it.scanResult.patternScanResult!!.startIndex + 1 val measureTextIndex = it.scanResult.patternScanResult!!.startIndex + 1
it.mutableMethod.apply {
val freeRegister = getInstruction<TwoRegisterInstruction>(0).registerA val freeRegister = getInstruction<TwoRegisterInstruction>(0).registerA
addInstructions( addInstructions(

View file

@ -5,19 +5,24 @@ import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
/**
* Resolves to class found in [RollingNumberMeasureTextParentFingerprint].
*/
internal object RollingNumberMeasureAnimatedTextFingerprint : MethodFingerprint( internal object RollingNumberMeasureAnimatedTextFingerprint : MethodFingerprint(
returnType = "F", returnType = "Lj\$/util/Optional;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("Ljava/lang/String;"), parameters = listOf(
"L",
"Ljava/lang/String;",
"L"
),
opcodes = listOf( opcodes = listOf(
Opcode.INVOKE_VIRTUAL, Opcode.IGET, // First instruction of method
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.CONST_HIGH16,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT, Opcode.MOVE_RESULT,
Opcode.ADD_FLOAT_2ADDR, Opcode.CONST_4,
Opcode.ADD_INT_LIT8, Opcode.AGET,
Opcode.GOTO, Opcode.CONST_4,
Opcode.RETURN Opcode.CONST_4, // Measured text width
) )
) )

View file

@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
/** /**
* Resolves to class found in [RollingNumberMeasureTextParentFingerprint]. * Resolves to class found in [RollingNumberMeasureStaticLabelParentFingerprint].
*/ */
internal object RollingNumberMeasureStaticLabelFingerprint : MethodFingerprint( internal object RollingNumberMeasureStaticLabelFingerprint : MethodFingerprint(
returnType = "F", returnType = "F",

View file

@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
internal object RollingNumberMeasureTextParentFingerprint : MethodFingerprint( internal object RollingNumberMeasureStaticLabelParentFingerprint : MethodFingerprint(
returnType = "Ljava/lang/String;", returnType = "Ljava/lang/String;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf(), parameters = listOf(),

View file

@ -26,8 +26,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.37.36", "18.37.36",
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -23,8 +23,10 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -38,13 +38,9 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", [ "com.google.android.youtube", [
"18.32.39", "18.48.39",
"18.37.36", "18.49.37",
"18.38.44", "19.01.34"
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
], ],

View file

@ -28,8 +28,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -24,8 +24,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -32,8 +32,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
) )
) )
] ]

View file

@ -35,8 +35,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -40,8 +40,10 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -10,7 +10,7 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.StringResource
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.misc.settings.SettingsPatch
import app.revanced.patches.youtube.shared.fingerprints.WatchWhileActivityFingerprint import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
@Patch( @Patch(
@ -21,15 +21,15 @@ import com.android.tools.smali.dexlib2.Opcode
) )
@Suppress("unused") @Suppress("unused")
object AnnouncementsPatch : BytecodePatch( object AnnouncementsPatch : BytecodePatch(
setOf(WatchWhileActivityFingerprint) setOf(MainActivityFingerprint)
) { ) {
private const val INTEGRATIONS_CLASS_DESCRIPTOR = private const val INTEGRATIONS_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;" "Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;"
override fun execute(context: BytecodeContext) { override fun execute(context: BytecodeContext) {
val onCreateMethod = WatchWhileActivityFingerprint.result?.let { val onCreateMethod = MainActivityFingerprint.result?.let {
it.mutableClass.methods.find { method -> method.name == "onCreate" } it.mutableClass.methods.find { method -> method.name == "onCreate" }
} ?: throw WatchWhileActivityFingerprint.exception } ?: throw MainActivityFingerprint.exception
val superCallIndex = onCreateMethod.getInstructions().indexOfFirst { it.opcode == Opcode.INVOKE_SUPER_RANGE } val superCallIndex = onCreateMethod.getInstructions().indexOfFirst { it.opcode == Opcode.INVOKE_SUPER_RANGE }

View file

@ -28,8 +28,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -23,12 +23,15 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]
) )
@Suppress("unused")
object SpoofDeviceDimensionsPatch : BytecodePatch( object SpoofDeviceDimensionsPatch : BytecodePatch(
setOf(DeviceDimensionsModelToStringFingerprint) setOf(DeviceDimensionsModelToStringFingerprint)
) { ) {

View file

@ -1,6 +1,5 @@
package app.revanced.patches.youtube.misc.fix.backtoexitgesture package app.revanced.patches.youtube.misc.fix.backtoexitgesture
import app.revanced.util.exception
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprint
@ -10,6 +9,7 @@ import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.OnBa
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewScrollingFingerprint import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewScrollingFingerprint
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingFingerprint import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingFingerprint
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingParentFingerprint import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingParentFingerprint
import app.revanced.util.exception
@Patch(description = "Fixes the swipe back to exit gesture.") @Patch(description = "Fixes the swipe back to exit gesture.")
@Suppress("unused") @Suppress("unused")
@ -37,7 +37,7 @@ internal object FixBackToExitGesturePatch : BytecodePatch(
methodName = "onScrollingViews" methodName = "onScrollingViews"
), ),
OnBackPressedFingerprint to IntegrationsMethod( OnBackPressedFingerprint to IntegrationsMethod(
"p0", "onBackPressed", "Lcom/google/android/apps/youtube/app/watchwhile/WatchWhileActivity;" "p0", "onBackPressed", "Landroid/app/Activity;"
) )
).forEach { (fingerprint, target) -> fingerprint.injectCall(target) } ).forEach { (fingerprint, target) -> fingerprint.injectCall(target) }
} }

View file

@ -12,7 +12,9 @@ internal object OnBackPressedFingerprint : MethodFingerprint(
Opcode.RETURN_VOID Opcode.RETURN_VOID
), ),
customFingerprint = { methodDef, _ -> customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("WatchWhileActivity;") (methodDef.definingClass.endsWith("MainActivity;") ||
// Old versions of YouTube called this class "WatchWhileActivity" instead.
methodDef.definingClass.endsWith("WatchWhileActivity;"))
&& methodDef.name == "onBackPressed" && methodDef.name == "onBackPressed"
} }
) )

View file

@ -10,22 +10,16 @@ import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.UserAgentHeaderBuilderFingerprint import app.revanced.patches.youtube.misc.fix.playback.fingerprints.UserAgentHeaderBuilderFingerprint
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
@Patch( @Patch(
name = "Client spoof", name = "Client spoof",
description = "Adds options to spoof the client to allow video playback.", description = "Adds options to spoof the client to allow video playback.",
dependencies = [SpoofSignaturePatch::class], dependencies = [SpoofSignaturePatch::class],
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", "com.google.android.youtube", [
[ "18.48.39",
"18.32.39", "18.49.37",
"18.37.36", "19.01.34"
"18.38.44",
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
] ]

View file

@ -33,13 +33,9 @@ object GmsCoreSupportPatch : AbstractGmsCoreSupportPatch(
compatiblePackages = setOf( compatiblePackages = setOf(
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", setOf( "com.google.android.youtube", setOf(
"18.32.39", "18.48.39",
"18.37.36", "18.49.37",
"18.38.44", "19.01.34"
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
) )
) )
), ),

View file

@ -25,12 +25,15 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
[ [
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]
) )
@Suppress("unused")
object BypassURLRedirectsPatch : BytecodePatch( object BypassURLRedirectsPatch : BytecodePatch(
setOf(ABUriParserFingerprint, HTTPUriParserFingerprint) setOf(ABUriParserFingerprint, HTTPUriParserFingerprint)
) { ) {

View file

@ -28,8 +28,10 @@ import com.android.tools.smali.dexlib2.iface.reference.StringReference
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -34,13 +34,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", "com.google.android.youtube",
[ [
"18.32.39", "18.48.39",
"18.37.36", "18.49.37",
"18.38.44", "19.01.34"
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
] ]

View file

@ -30,8 +30,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
[ [
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -4,10 +4,12 @@ import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.fingerprint.MethodFingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
internal object WatchWhileActivityFingerprint : MethodFingerprint( internal object MainActivityFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
parameters = listOf(), parameters = listOf(),
customFingerprint = { methodDef, _ -> customFingerprint = { methodDef, _ ->
methodDef.definingClass.endsWith("WatchWhileActivity;") methodDef.definingClass.endsWith("MainActivity;")
// Old versions of YouTube called this class "WatchWhileActivity" instead.
|| methodDef.definingClass.endsWith("WatchWhileActivity;")
} }
) )

View file

@ -26,8 +26,10 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]

View file

@ -1,6 +1,5 @@
package app.revanced.patches.youtube.video.information package app.revanced.patches.youtube.video.information
import app.revanced.util.exception
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
@ -14,6 +13,7 @@ import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
import app.revanced.patches.youtube.video.information.fingerprints.* import app.revanced.patches.youtube.video.information.fingerprints.*
import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch
import app.revanced.patches.youtube.video.videoid.VideoIdPatch import app.revanced.patches.youtube.video.videoid.VideoIdPatch
import app.revanced.util.exception
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.BuilderInstruction import com.android.tools.smali.dexlib2.builder.BuilderInstruction

View file

@ -18,29 +18,44 @@ object PlayerResponseMethodHookPatch :
BytecodePatch(setOf(PlayerParameterBuilderFingerprint)), BytecodePatch(setOf(PlayerParameterBuilderFingerprint)),
Closeable, Closeable,
MutableSet<PlayerResponseMethodHookPatch.Hook> by mutableSetOf() { MutableSet<PlayerResponseMethodHookPatch.Hook> by mutableSetOf() {
private const val VIDEO_ID_PARAMETER = 1
private const val IS_SHORT_AND_OPENING_OR_PLAYING_PARAMETER = 11 // Parameter numbers of the patched method.
private const val PROTO_BUFFER_PARAMETER_PARAMETER = 3 private const val PARAMETER_VIDEO_ID = 1
private const val PARAMETER_PROTO_BUFFER = 3
private const val PARAMETER_IS_SHORT_AND_OPENING_OR_PLAYING = 11
// Temporary 4-bit registers used to pass the parameters to integrations.
private const val REGISTER_VIDEO_ID = 0
private const val REGISTER_PROTO_BUFFER = 1
private const val REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING = 2
private lateinit var playerResponseMethod: MutableMethod private lateinit var playerResponseMethod: MutableMethod
private var numberOfInstructionsAdded = 0
override fun execute(context: BytecodeContext) { override fun execute(context: BytecodeContext) {
playerResponseMethod = PlayerParameterBuilderFingerprint.result?.mutableMethod playerResponseMethod = PlayerParameterBuilderFingerprint.result?.mutableMethod
?: throw PlayerParameterBuilderFingerprint.exception ?: throw PlayerParameterBuilderFingerprint.exception
} }
override fun close() { override fun close() {
fun hookVideoId(hook: Hook) = playerResponseMethod.addInstruction( fun hookVideoId(hook: Hook) {
0, "invoke-static {p$VIDEO_ID_PARAMETER, p$IS_SHORT_AND_OPENING_OR_PLAYING_PARAMETER}, $hook" playerResponseMethod.addInstruction(
0, "invoke-static {v$REGISTER_VIDEO_ID, v$REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING}, $hook"
) )
numberOfInstructionsAdded++
}
fun hookProtoBufferParameter(hook: Hook) = playerResponseMethod.addInstructions( fun hookProtoBufferParameter(hook: Hook) {
playerResponseMethod.addInstructions(
0, 0,
""" """
invoke-static {p$PROTO_BUFFER_PARAMETER_PARAMETER, p$IS_SHORT_AND_OPENING_OR_PLAYING_PARAMETER}, $hook invoke-static {v$REGISTER_PROTO_BUFFER, v$REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING}, $hook
move-result-object p$PROTO_BUFFER_PARAMETER_PARAMETER move-result-object v$REGISTER_PROTO_BUFFER
""" """
) )
numberOfInstructionsAdded += 2
}
// Reverse the order in order to preserve insertion order of the hooks. // Reverse the order in order to preserve insertion order of the hooks.
val beforeVideoIdHooks = filterIsInstance<Hook.ProtoBufferParameterBeforeVideoId>().asReversed() val beforeVideoIdHooks = filterIsInstance<Hook.ProtoBufferParameterBeforeVideoId>().asReversed()
@ -51,6 +66,23 @@ object PlayerResponseMethodHookPatch :
afterVideoIdHooks.forEach(::hookProtoBufferParameter) afterVideoIdHooks.forEach(::hookProtoBufferParameter)
videoIdHooks.forEach(::hookVideoId) videoIdHooks.forEach(::hookVideoId)
beforeVideoIdHooks.forEach(::hookProtoBufferParameter) beforeVideoIdHooks.forEach(::hookProtoBufferParameter)
// On some app targets the method has too many registers pushing the parameters past v15.
// Move the parameters to 4-bit registers so they can be passed to integrations.
playerResponseMethod.addInstructions(
0, """
move-object/from16 v$REGISTER_VIDEO_ID, p$PARAMETER_VIDEO_ID
move-object/from16 v$REGISTER_PROTO_BUFFER, p$PARAMETER_PROTO_BUFFER
move/from16 v$REGISTER_IS_SHORT_AND_OPENING_OR_PLAYING, p$PARAMETER_IS_SHORT_AND_OPENING_OR_PLAYING
""",
)
numberOfInstructionsAdded += 3
// Move the modified register back.
playerResponseMethod.addInstruction(
numberOfInstructionsAdded,
"move-object/from16 p$PARAMETER_PROTO_BUFFER, v$REGISTER_PROTO_BUFFER"
)
} }
internal abstract class Hook(private val methodDescriptor: String) { internal abstract class Hook(private val methodDescriptor: String) {

View file

@ -31,13 +31,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", [ "com.google.android.youtube", [
"18.32.39", "18.48.39",
"18.37.36", "18.49.37",
"18.38.44", "19.01.34"
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
] ]

View file

@ -14,13 +14,9 @@ import app.revanced.patches.youtube.video.speed.remember.RememberPlaybackSpeedPa
compatiblePackages = [ compatiblePackages = [
CompatiblePackage( CompatiblePackage(
"com.google.android.youtube", [ "com.google.android.youtube", [
"18.32.39", "18.48.39",
"18.37.36", "18.49.37",
"18.38.44", "19.01.34"
"18.43.45",
"18.44.41",
"18.45.41",
"18.45.43"
] ]
) )
] ]

View file

@ -29,7 +29,13 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableField
@Patch( @Patch(
description = "Adds custom playback speed options.", description = "Adds custom playback speed options.",
dependencies = [IntegrationsPatch::class, LithoFilterPatch::class, SettingsPatch::class, RecyclerViewTreeHookPatch::class] dependencies = [
IntegrationsPatch::class,
LithoFilterPatch::class,
SettingsPatch::class,
RecyclerViewTreeHookPatch::class,
CustomPlaybackSpeedResourcePatch::class
]
) )
object CustomPlaybackSpeedPatch : BytecodePatch( object CustomPlaybackSpeedPatch : BytecodePatch(
setOf( setOf(

View file

@ -0,0 +1,15 @@
package app.revanced.patches.youtube.video.speed.custom
import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch
internal object CustomPlaybackSpeedResourcePatch : ResourcePatch() {
var speedUnavailableId: Long = -1
override fun execute(context: ResourceContext) {
speedUnavailableId = ResourceMappingPatch.resourceMappings.single {
it.type == "string" && it.name == "varispeed_unavailable_message"
}.id
}
}

View file

@ -1,7 +1,10 @@
package app.revanced.patches.youtube.video.speed.custom.fingerprints package app.revanced.patches.youtube.video.speed.custom.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.youtube.video.speed.custom.CustomPlaybackSpeedResourcePatch
import app.revanced.util.patch.LiteralValueFingerprint
internal object ShowOldPlaybackSpeedMenuFingerprint : MethodFingerprint( internal object ShowOldPlaybackSpeedMenuFingerprint : LiteralValueFingerprint(
strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT") literalSupplier = {
CustomPlaybackSpeedResourcePatch.speedUnavailableId
}
) )

View file

@ -1,6 +1,5 @@
package app.revanced.patches.youtube.video.videoid package app.revanced.patches.youtube.video.videoid
import app.revanced.util.exception
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
@ -13,6 +12,7 @@ import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch
import app.revanced.patches.youtube.video.videoid.fingerprint.VideoIdFingerprint import app.revanced.patches.youtube.video.videoid.fingerprint.VideoIdFingerprint
import app.revanced.patches.youtube.video.videoid.fingerprint.VideoIdFingerprintBackgroundPlay import app.revanced.patches.youtube.video.videoid.fingerprint.VideoIdFingerprintBackgroundPlay
import app.revanced.util.exception
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Patch( @Patch(
@ -49,7 +49,7 @@ object VideoIdPatch : BytecodePatch(
consumer(it, insertIndex, videoIdRegister) consumer(it, insertIndex, videoIdRegister)
} }
} ?: throw VideoIdFingerprint.exception } ?: throw exception
VideoIdFingerprint.setFields { method, index, register -> VideoIdFingerprint.setFields { method, index, register ->
videoIdMethod = method videoIdMethod = method

View file

@ -10,19 +10,13 @@ internal object VideoIdFingerprint : MethodFingerprint(
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L"), parameters = listOf("L"),
opcodes = listOf( opcodes = listOf(
Opcode.MOVE_RESULT_OBJECT,
Opcode.IF_EQZ,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.IGET_OBJECT, Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE, Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE, Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT Opcode.MOVE_RESULT_OBJECT,
) )
) )

View file

@ -10,18 +10,10 @@ internal object VideoIdFingerprintBackgroundPlay : MethodFingerprint(
accessFlags = AccessFlags.DECLARED_SYNCHRONIZED or AccessFlags.FINAL or AccessFlags.PUBLIC, accessFlags = AccessFlags.DECLARED_SYNCHRONIZED or AccessFlags.FINAL or AccessFlags.PUBLIC,
parameters = listOf("L"), parameters = listOf("L"),
opcodes = listOf( opcodes = listOf(
Opcode.MONITOR_EXIT,
Opcode.RETURN_VOID,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.NEW_ARRAY,
Opcode.SGET_OBJECT,
Opcode.APUT_OBJECT,
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT, Opcode.MOVE_RESULT,
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.INVOKE_INTERFACE, Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,

View file

@ -30,8 +30,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
"18.38.44", "18.38.44",
"18.43.45", "18.43.45",
"18.44.41", "18.44.41",
"18.45.41", "18.45.43",
"18.45.43" "18.48.39",
"18.49.37",
"19.01.34"
] ]
) )
] ]