mirror of
https://github.com/inotia00/revanced-patches.git
synced 2025-05-08 10:34:33 +02:00
feat(YouTube/Spoof streaming data): match with ReVanced
This commit is contained in:
parent
2d6142bce8
commit
1ef8639a7a
@ -11,12 +11,13 @@ import app.revanced.patches.youtube.utils.compatibility.Constants
|
|||||||
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildBrowseRequestFingerprint
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildBrowseRequestFingerprint
|
||||||
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildInitPlaybackRequestFingerprint
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildInitPlaybackRequestFingerprint
|
||||||
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildMediaDataSourceFingerprint
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildMediaDataSourceFingerprint
|
||||||
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildPlayerRequestURIFingerprint
|
||||||
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.CreateStreamingDataFingerprint
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.CreateStreamingDataFingerprint
|
||||||
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.NerdsStatsVideoFormatBuilderFingerprint
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.NerdsStatsVideoFormatBuilderFingerprint
|
||||||
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.ProtobufClassParseByteBufferFingerprint
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.ProtobufClassParseByteBufferFingerprint
|
||||||
import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH
|
import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH
|
||||||
import app.revanced.patches.youtube.utils.settings.SettingsPatch
|
import app.revanced.patches.youtube.utils.settings.SettingsPatch
|
||||||
import app.revanced.patches.youtube.video.videoid.VideoIdPatch
|
import app.revanced.util.findOpcodeIndicesReversed
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
import app.revanced.util.patch.BaseBytecodePatch
|
import app.revanced.util.patch.BaseBytecodePatch
|
||||||
import app.revanced.util.resultOrThrow
|
import app.revanced.util.resultOrThrow
|
||||||
@ -32,13 +33,13 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
dependencies = setOf(
|
dependencies = setOf(
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
SpoofUserAgentPatch::class,
|
SpoofUserAgentPatch::class,
|
||||||
VideoIdPatch::class,
|
|
||||||
),
|
),
|
||||||
compatiblePackages = Constants.COMPATIBLE_PACKAGE,
|
compatiblePackages = Constants.COMPATIBLE_PACKAGE,
|
||||||
fingerprints = setOf(
|
fingerprints = setOf(
|
||||||
BuildBrowseRequestFingerprint,
|
BuildBrowseRequestFingerprint,
|
||||||
BuildInitPlaybackRequestFingerprint,
|
BuildInitPlaybackRequestFingerprint,
|
||||||
BuildMediaDataSourceFingerprint,
|
BuildMediaDataSourceFingerprint,
|
||||||
|
BuildPlayerRequestURIFingerprint,
|
||||||
CreateStreamingDataFingerprint,
|
CreateStreamingDataFingerprint,
|
||||||
ProtobufClassParseByteBufferFingerprint,
|
ProtobufClassParseByteBufferFingerprint,
|
||||||
|
|
||||||
@ -51,6 +52,27 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
|
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
|
|
||||||
|
// region Block /get_watch requests to fall back to /player requests.
|
||||||
|
|
||||||
|
BuildPlayerRequestURIFingerprint.resultOrThrow().let {
|
||||||
|
it.mutableMethod.apply {
|
||||||
|
val invokeToStringIndex =
|
||||||
|
BuildPlayerRequestURIFingerprint.indexOfToStringInstruction(this)
|
||||||
|
val uriRegister =
|
||||||
|
getInstruction<FiveRegisterInstruction>(invokeToStringIndex).registerC
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
invokeToStringIndex,
|
||||||
|
"""
|
||||||
|
invoke-static { v$uriRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri;
|
||||||
|
move-result-object v$uriRegister
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
|
|
||||||
// region Block /initplayback requests to fall back to /get_watch requests.
|
// region Block /initplayback requests to fall back to /get_watch requests.
|
||||||
|
|
||||||
BuildInitPlaybackRequestFingerprint.resultOrThrow().let {
|
BuildInitPlaybackRequestFingerprint.resultOrThrow().let {
|
||||||
@ -71,7 +93,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Copy request headers for streaming data fetch.
|
// region Fetch replacement streams.
|
||||||
|
|
||||||
BuildBrowseRequestFingerprint.resultOrThrow().let { result ->
|
BuildBrowseRequestFingerprint.resultOrThrow().let { result ->
|
||||||
result.mutableMethod.apply {
|
result.mutableMethod.apply {
|
||||||
@ -89,7 +111,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
var smaliInstructions =
|
var smaliInstructions =
|
||||||
"invoke-static { v$urlRegister, v$mapRegister }, " +
|
"invoke-static { v$urlRegister, v$mapRegister }, " +
|
||||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->" +
|
"$INTEGRATIONS_CLASS_DESCRIPTOR->" +
|
||||||
"setFetchHeaders(Ljava/lang/String;Ljava/util/Map;)V"
|
"fetchStreams(Ljava/lang/String;Ljava/util/Map;)V"
|
||||||
|
|
||||||
if (entrySetIndex < 0) smaliInstructions = """
|
if (entrySetIndex < 0) smaliInstructions = """
|
||||||
move-object/from16 v$mapRegister, p1
|
move-object/from16 v$mapRegister, p1
|
||||||
@ -160,6 +182,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
iget-object v$freeRegister, v$freeRegister, $getStreamingDataField
|
iget-object v$freeRegister, v$freeRegister, $getStreamingDataField
|
||||||
if-eqz v0, :disabled
|
if-eqz v0, :disabled
|
||||||
iput-object v$freeRegister, p0, $setStreamingDataField
|
iput-object v$freeRegister, p0, $setStreamingDataField
|
||||||
|
|
||||||
""",
|
""",
|
||||||
ExternalLabel("disabled", getInstruction(insertIndex))
|
ExternalLabel("disabled", getInstruction(insertIndex))
|
||||||
)
|
)
|
||||||
@ -189,7 +212,7 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
invoke-static { v1, v2, v3 }, $INTEGRATIONS_CLASS_DESCRIPTOR->removeVideoPlaybackPostBody(Landroid/net/Uri;I[B)[B
|
invoke-static { v1, v2, v3 }, $INTEGRATIONS_CLASS_DESCRIPTOR->removeVideoPlaybackPostBody(Landroid/net/Uri;I[B)[B
|
||||||
move-result-object v1
|
move-result-object v1
|
||||||
iput-object v1, v0, $definingClass->d:[B
|
iput-object v1, v0, $definingClass->d:[B
|
||||||
""",
|
""",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,27 +222,20 @@ object SpoofStreamingDataPatch : BaseBytecodePatch(
|
|||||||
// region Append spoof info.
|
// region Append spoof info.
|
||||||
|
|
||||||
NerdsStatsVideoFormatBuilderFingerprint.resultOrThrow().mutableMethod.apply {
|
NerdsStatsVideoFormatBuilderFingerprint.resultOrThrow().mutableMethod.apply {
|
||||||
for (index in implementation!!.instructions.size - 1 downTo 0) {
|
findOpcodeIndicesReversed(Opcode.RETURN_OBJECT).forEach{ index ->
|
||||||
val instruction = getInstruction(index)
|
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||||
if (instruction.opcode != Opcode.RETURN_OBJECT)
|
|
||||||
continue
|
|
||||||
|
|
||||||
val register = (instruction as OneRegisterInstruction).registerA
|
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
index, """
|
index, """
|
||||||
invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->appendSpoofedClient(Ljava/lang/String;)Ljava/lang/String;
|
invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->appendSpoofedClient(Ljava/lang/String;)Ljava/lang/String;
|
||||||
move-result-object v$register
|
move-result-object v$register
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// Prefetch streaming data.
|
|
||||||
VideoIdPatch.hookPlayerResponseVideoId("$INTEGRATIONS_CLASS_DESCRIPTOR->fetchStreamingData(Ljava/lang/String;Z)V")
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add settings
|
* Add settings
|
||||||
*/
|
*/
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
package app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import app.revanced.patches.youtube.utils.fix.streamingdata.fingerprints.BuildPlayerRequestURIFingerprint.indexOfToStringInstruction
|
||||||
|
import app.revanced.util.getReference
|
||||||
|
import app.revanced.util.indexOfFirstInstruction
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
import com.android.tools.smali.dexlib2.iface.Method
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
|
internal object BuildPlayerRequestURIFingerprint : MethodFingerprint(
|
||||||
|
returnType = "Ljava/lang/String;",
|
||||||
|
strings = listOf(
|
||||||
|
"key",
|
||||||
|
"asig",
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
indexOfToStringInstruction(methodDef) >= 0
|
||||||
|
},
|
||||||
|
) {
|
||||||
|
fun indexOfToStringInstruction(methodDef: Method) =
|
||||||
|
methodDef.indexOfFirstInstruction {
|
||||||
|
opcode == Opcode.INVOKE_VIRTUAL &&
|
||||||
|
getReference<MethodReference>().toString() == "Landroid/net/Uri;->toString()Ljava/lang/String;"
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user