mirror of
https://github.com/revanced/revanced-patches
synced 2025-01-31 14:27:32 +01:00
fix(YouTube - Spoof client): Fix tracking history on brand accounts (#3480)
This commit is contained in:
parent
7572e31a31
commit
69c1f16f7e
@ -83,6 +83,9 @@ object SpoofClientPatch : BytecodePatch(
|
|||||||
|
|
||||||
// Player speed menu item.
|
// Player speed menu item.
|
||||||
CreatePlaybackSpeedMenuItemFingerprint,
|
CreatePlaybackSpeedMenuItemFingerprint,
|
||||||
|
|
||||||
|
// Watch history.
|
||||||
|
GetTrackingUriFingerprint,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||||
@ -153,7 +156,7 @@ object SpoofClientPatch : BytecodePatch(
|
|||||||
.getInstructions().find { instruction ->
|
.getInstructions().find { instruction ->
|
||||||
// requestMessage.clientInfo = clientInfoBuilder.build();
|
// requestMessage.clientInfo = clientInfoBuilder.build();
|
||||||
instruction.opcode == Opcode.IPUT_OBJECT &&
|
instruction.opcode == Opcode.IPUT_OBJECT &&
|
||||||
instruction.getReference<FieldReference>()?.type == CLIENT_INFO_CLASS_DESCRIPTOR
|
instruction.getReference<FieldReference>()?.type == CLIENT_INFO_CLASS_DESCRIPTOR
|
||||||
}?.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoField")
|
}?.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoField")
|
||||||
|
|
||||||
// Client info object's client type field.
|
// Client info object's client type field.
|
||||||
@ -164,13 +167,15 @@ object SpoofClientPatch : BytecodePatch(
|
|||||||
// Client info object's client version field.
|
// Client info object's client version field.
|
||||||
val clientInfoClientVersionField = result.mutableMethod
|
val clientInfoClientVersionField = result.mutableMethod
|
||||||
.getInstruction(result.scanResult.stringsScanResult!!.matches.first().index + 1)
|
.getInstruction(result.scanResult.stringsScanResult!!.matches.first().index + 1)
|
||||||
.getReference<FieldReference>() ?: throw PatchException("Could not find clientInfoClientVersionField")
|
.getReference<FieldReference>()
|
||||||
|
?: throw PatchException("Could not find clientInfoClientVersionField")
|
||||||
|
|
||||||
Triple(clientInfoField, clientInfoClientTypeField, clientInfoClientVersionField)
|
Triple(clientInfoField, clientInfoClientTypeField, clientInfoClientVersionField)
|
||||||
}
|
}
|
||||||
|
|
||||||
val clientInfoClientModelField = CreatePlayerRequestBodyWithModelFingerprint.resultOrThrow().let {
|
val clientInfoClientModelField = CreatePlayerRequestBodyWithModelFingerprint.resultOrThrow().let {
|
||||||
val getClientModelIndex = CreatePlayerRequestBodyWithModelFingerprint.indexOfBuildModelInstruction(it.method)
|
val getClientModelIndex =
|
||||||
|
CreatePlayerRequestBodyWithModelFingerprint.indexOfBuildModelInstruction(it.method)
|
||||||
|
|
||||||
// The next IPUT_OBJECT instruction after getting the client model is setting the client model field.
|
// The next IPUT_OBJECT instruction after getting the client model is setting the client model field.
|
||||||
val index = it.mutableMethod.indexOfFirstInstructionOrThrow(getClientModelIndex) {
|
val index = it.mutableMethod.indexOfFirstInstructionOrThrow(getClientModelIndex) {
|
||||||
@ -198,7 +203,7 @@ object SpoofClientPatch : BytecodePatch(
|
|||||||
addInstruction(
|
addInstruction(
|
||||||
checkCastIndex + 1,
|
checkCastIndex + 1,
|
||||||
"invoke-static { v$requestMessageInstanceRegister }," +
|
"invoke-static { v$requestMessageInstanceRegister }," +
|
||||||
" ${result.classDef.type}->$setClientInfoMethodName($clientInfoContainerClassName)V",
|
" ${result.classDef.type}->$setClientInfoMethodName($clientInfoContainerClassName)V",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,7 +296,8 @@ object SpoofClientPatch : BytecodePatch(
|
|||||||
|
|
||||||
it.mutableMethod.apply {
|
it.mutableMethod.apply {
|
||||||
// Find the conditional check if the playback speed menu item is not created.
|
// Find the conditional check if the playback speed menu item is not created.
|
||||||
val shouldCreateMenuIndex = indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ }
|
val shouldCreateMenuIndex =
|
||||||
|
indexOfFirstInstructionOrThrow(scanResult.endIndex) { opcode == Opcode.IF_EQZ }
|
||||||
val shouldCreateMenuRegister = getInstruction<OneRegisterInstruction>(shouldCreateMenuIndex).registerA
|
val shouldCreateMenuRegister = getInstruction<OneRegisterInstruction>(shouldCreateMenuIndex).registerA
|
||||||
|
|
||||||
addInstructions(
|
addInstructions(
|
||||||
@ -305,5 +311,24 @@ object SpoofClientPatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
// Fix watch history if spoofing to iOS.
|
||||||
|
|
||||||
|
GetTrackingUriFingerprint.resultOrThrow().let {
|
||||||
|
it.mutableMethod.apply {
|
||||||
|
val returnUrlIndex = it.scanResult.patternScanResult!!.endIndex
|
||||||
|
val urlRegister = getInstruction<OneRegisterInstruction>(returnUrlIndex).registerA
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
returnUrlIndex,
|
||||||
|
"""
|
||||||
|
invoke-static { v$urlRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideTrackingUrl(Landroid/net/Uri;)Landroid/net/Uri;
|
||||||
|
move-result-object v$urlRegister
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
|
internal object GetTrackingUriFingerprint : MethodFingerprint(
|
||||||
|
returnType = "Landroid/net/Uri;",
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = emptyList(),
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.RETURN_OBJECT
|
||||||
|
),
|
||||||
|
customFingerprint = { _, classDef ->
|
||||||
|
classDef.endsWith("TrackingUrlModel;")
|
||||||
|
}
|
||||||
|
)
|
@ -1132,7 +1132,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
|||||||
<string name="revanced_spoof_client_summary_off">Client is not spoofed\n\nVideo playback may not work</string>
|
<string name="revanced_spoof_client_summary_off">Client is not spoofed\n\nVideo playback may not work</string>
|
||||||
<string name="revanced_spoof_client_user_dialog_message">Turning off this setting may cause video playback issues.</string>
|
<string name="revanced_spoof_client_user_dialog_message">Turning off this setting may cause video playback issues.</string>
|
||||||
<string name="revanced_spoof_client_use_ios_title">Spoof client to iOS</string>
|
<string name="revanced_spoof_client_use_ios_title">Spoof client to iOS</string>
|
||||||
<string name="revanced_spoof_client_use_ios_summary_on">Client is currently spoofed to iOS\n\nSide effects include:\n• No HDR video\n• Watch history may not work\n• Higher video qualities may be missing\n• Live streams cannot play as audio only\n• Live streams not available on Android 8.0</string>
|
<string name="revanced_spoof_client_use_ios_summary_on">Client is currently spoofed to iOS\n\nSide effects include:\n• No HDR video\n• Higher video qualities may be missing\n• Live streams cannot play as audio only\n• Live streams not available on Android 8.0</string>
|
||||||
<string name="revanced_spoof_client_use_ios_summary_off">Client is currently spoofed to Android VR\n\nSide effects include:\n• No HDR video\n• Kids videos do not playback\n• Paused videos can randomly resume\n• Low quality Shorts seekbar thumbnails\n• Download action button is always hidden\n• End screen cards are always hidden</string>
|
<string name="revanced_spoof_client_use_ios_summary_off">Client is currently spoofed to Android VR\n\nSide effects include:\n• No HDR video\n• Kids videos do not playback\n• Paused videos can randomly resume\n• Low quality Shorts seekbar thumbnails\n• Download action button is always hidden\n• End screen cards are always hidden</string>
|
||||||
<string name="revanced_spoof_client_storyboard_timeout">Spoof client thumbnails not available (API timed out)</string>
|
<string name="revanced_spoof_client_storyboard_timeout">Spoof client thumbnails not available (API timed out)</string>
|
||||||
<string name="revanced_spoof_client_storyboard_io_exception">Spoof client thumbnails temporarily not available: %s</string>
|
<string name="revanced_spoof_client_storyboard_io_exception">Spoof client thumbnails temporarily not available: %s</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user