diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index c2b73fbee..6d4a3c6cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -25,14 +25,26 @@ internal val videoIdBackgroundPlayFingerprint = fingerprint { returns("V") parameters("L") opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ, - Opcode.IGET_OBJECT, Opcode.IF_EQZ, Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT_OBJECT, + Opcode.IPUT_OBJECT, + Opcode.MONITOR_EXIT, + Opcode.RETURN_VOID, + Opcode.MONITOR_EXIT, + Opcode.RETURN_VOID ) + // The target snippet of code is buried in a huge switch block and the target method + // has been changed many times by YT which makes identifying it more difficult than usual. + custom { method, classDef -> + // Access flags changed in 19.36 + AccessFlags.FINAL.isSet(method.accessFlags) && + AccessFlags.DECLARED_SYNCHRONIZED.isSet(method.accessFlags) && + classDef.methods.count() == 17 && + method.implementation != null && + method.indexOfPlayerResponseModelString() >= 0 + } + } internal val videoIdParentFingerprint = fingerprint {