From 98b9e27b14ea86fedc9a4f42547d5efdcdcffcf5 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Thu, 23 May 2024 01:14:40 +0200 Subject: [PATCH 1/6] fix(YouTube - Client spoof): Spoof iOS client model to fix various side effects This commit also changes the default client spoof to iOS as the only side-effect known now, is HDR not working. --- .../misc/fix/playback/SpoofClientPatch.kt | 25 ++++++++++++++++++- ...tePlayerRequestBodyWithModelFingerprint.kt | 18 +++++++++++++ .../resources/addresources/values/strings.xml | 4 +-- 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlayerRequestBodyWithModelFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt index f843c85f55..b258d47e91 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt @@ -19,6 +19,7 @@ import app.revanced.patches.youtube.misc.fix.playback.fingerprints.* import app.revanced.patches.youtube.misc.settings.SettingsPatch import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHookPatch import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -74,6 +75,7 @@ object SpoofClientPatch : BytecodePatch( BuildPlayerRequestURIFingerprint, SetPlayerRequestClientTypeFingerprint, CreatePlayerRequestBodyFingerprint, + CreatePlayerRequestBodyWithModelFingerprint, // Storyboard spoof. StoryboardRendererSpecFingerprint, @@ -168,6 +170,22 @@ object SpoofClientPatch : BytecodePatch( Triple(clientInfoField, clientInfoClientTypeField, clientInfoClientVersionField) } + val clientInfoClientModelField = CreatePlayerRequestBodyWithModelFingerprint.resultOrThrow().mutableMethod.let { + val instructions = it.getInstructions() + + val getClientModelIndex = it.indexOfFirstInstruction { + getReference().toString() == "Landroid/os/Build;->MODEL:Ljava/lang/String;" + } + + // The next IPUT_OBJECT instruction after getting the client model is setting the client model field. + instructions.subList( + getClientModelIndex, + instructions.lastIndex, + ).first { instruction -> + instruction.opcode == Opcode.IPUT_OBJECT + }.getReference() + } + // endregion // region Spoof client type for /player requests. @@ -216,12 +234,17 @@ object SpoofClientPatch : BytecodePatch( move-result v1 iput v1, v0, $clientInfoClientTypeField + # Set client model to the spoofed value. + iget-object v1, v0, $clientInfoClientModelField + invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->getClientModel(Ljava/lang/String;)Ljava/lang/String; + move-result-object v1 + iput-object v1, v0, $clientInfoClientModelField + # Set client version to the spoofed value. iget-object v1, v0, $clientInfoClientVersionField invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->getClientVersion(Ljava/lang/String;)Ljava/lang/String; move-result-object v1 iput-object v1, v0, $clientInfoClientVersionField - :disabled return-void """, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlayerRequestBodyWithModelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlayerRequestBodyWithModelFingerprint.kt new file mode 100644 index 0000000000..bdf6f8abca --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/CreatePlayerRequestBodyWithModelFingerprint.kt @@ -0,0 +1,18 @@ +package app.revanced.patches.youtube.misc.fix.playback.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.getReference +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +internal object CreatePlayerRequestBodyWithModelFingerprint : MethodFingerprint( + returnType = "L", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf(), + customFingerprint = { methodDef, _ -> + methodDef.implementation!!.instructions.any { + it.getReference().toString() == "Landroid/os/Build;->MODEL:Ljava/lang/String;" + } + }, +) diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 621b7c43bc..49d6d68572 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -1095,8 +1095,8 @@ Spoof client to iOS Spoof the client to iOS instead of an Android Testsuite - Client is spoofed to an iOS client\n\nSide effects include:\n• 60 fps video may not be available\n• No HDR video\n• Some videos may not load\n• Higher video qualities may be missing - Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects include:\n• Subtitles are missing\n• Player gestures may not work\n• Low quality Shorts seekbar thumbnails + Client is spoofed to an iOS client\n\nSide effects include:\n• No HDR video + Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects included, but not limited to, are:\n• Subtitles are missing\n• Player gestures may not work\n• Low quality Shorts seekbar thumbnails\n• Watch history may not work Spoof client thumbnails not available (API timed out) Spoof client thumbnails temporarily not available: %s From ccba89ccb74d49416956d12f4a5d64a9aa4acd30 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 May 2024 11:23:56 +0400 Subject: [PATCH 2/6] refactor: Delete unused code, deprecate fingerprints. --- .../misc/fix/playback/SpoofClientPatch.kt | 1 - .../fix/playback/SpoofClientResourcePatch.kt | 18 ------------- .../misc/fix/playback/SpoofSignaturePatch.kt | 2 +- .../fingerprints/ParamsMapPutFingerprint.kt | 1 + ...rResponseModelImplLiveStreamFingerprint.kt | 1 + .../ScrubbedPreviewLayoutFingerprint.kt | 27 ------------------- ...rePatchScrubbedPreviewLayoutFingerprint.kt | 1 + .../StatsQueryParameterFingerprint.kt | 1 + .../StoryboardThumbnailParentFingerprint.kt | 1 + 9 files changed, 6 insertions(+), 47 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientResourcePatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ScrubbedPreviewLayoutFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt index b258d47e91..188b542ae1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt @@ -35,7 +35,6 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter name = "Spoof client", description = "Spoofs the client to allow video playback.", dependencies = [ - SpoofClientResourcePatch::class, PlayerResponseMethodHookPatch::class, SettingsPatch::class, AddResourcesPatch::class, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientResourcePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientResourcePatch.kt deleted file mode 100644 index 0de192e3f7..0000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientResourcePatch.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch - -@Patch(dependencies = [ResourceMappingPatch::class]) -internal object SpoofClientResourcePatch : ResourcePatch() { - internal var scrubbedPreviewThumbnailResourceId: Long = -1 - - override fun execute(context: ResourceContext) { - scrubbedPreviewThumbnailResourceId = ResourceMappingPatch[ - "id", - "thumbnail", - ] - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt index 5593ee72cf..c82597b3a4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofSignaturePatch.kt @@ -43,7 +43,7 @@ object SpoofSignaturePatch : BytecodePatch( StoryboardRendererDecoderSpecFingerprint, StoryboardRendererDecoderRecommendedLevelFingerprint, StoryboardThumbnailParentFingerprint, - ScrubbedPreviewLayoutFingerprint, + SpoofSignaturePatchScrubbedPreviewLayoutFingerprint, StatsQueryParameterFingerprint, ParamsMapPutFingerprint, ), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ParamsMapPutFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ParamsMapPutFingerprint.kt index 1a60c3064a..bb93acc882 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ParamsMapPutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ParamsMapPutFingerprint.kt @@ -5,6 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object ParamsMapPutFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/PlayerResponseModelImplLiveStreamFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/PlayerResponseModelImplLiveStreamFingerprint.kt index fbd9b0b82b..480bdb11fc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/PlayerResponseModelImplLiveStreamFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/PlayerResponseModelImplLiveStreamFingerprint.kt @@ -6,6 +6,7 @@ import app.revanced.util.containsWideLiteralInstructionValue import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object PlayerResponseModelImplLiveStreamFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ScrubbedPreviewLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ScrubbedPreviewLayoutFingerprint.kt deleted file mode 100644 index 08e4865233..0000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/ScrubbedPreviewLayoutFingerprint.kt +++ /dev/null @@ -1,27 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patches.youtube.misc.fix.playback.SpoofClientResourcePatch -import app.revanced.util.patch.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -internal object ScrubbedPreviewLayoutFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, - returnType = "V", - parameters = listOf("Landroid/content/Context;", "Landroid/util/AttributeSet;", "I", "I"), - opcodes = listOf( - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.INVOKE_VIRTUAL, - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.IPUT_OBJECT, // preview imageview - ), - // This resource is used in ~ 40 different locations, but this method has a distinct list of parameters to match to. - literalSupplier = { SpoofClientResourcePatch.scrubbedPreviewThumbnailResourceId }, -) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/SpoofSignaturePatchScrubbedPreviewLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/SpoofSignaturePatchScrubbedPreviewLayoutFingerprint.kt index 90220a1c32..c15d94db92 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/SpoofSignaturePatchScrubbedPreviewLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/SpoofSignaturePatchScrubbedPreviewLayoutFingerprint.kt @@ -6,6 +6,7 @@ import app.revanced.util.patch.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object SpoofSignaturePatchScrubbedPreviewLayoutFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StatsQueryParameterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StatsQueryParameterFingerprint.kt index a9cc53049a..24c8121367 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StatsQueryParameterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StatsQueryParameterFingerprint.kt @@ -2,6 +2,7 @@ package app.revanced.patches.youtube.misc.fix.playback.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object StatsQueryParameterFingerprint : MethodFingerprint( strings = listOf("adunit"), ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StoryboardThumbnailParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StoryboardThumbnailParentFingerprint.kt index 172001c53f..f8e449405f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StoryboardThumbnailParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/fingerprints/StoryboardThumbnailParentFingerprint.kt @@ -10,6 +10,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * An additional change here might force the thumbnails to be created, * or possibly a change somewhere else (maybe involving YouTube 18.23.35 class `hte`) */ +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object StoryboardThumbnailParentFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/graphics/Bitmap;", From 90333a482227972ea7e321e515b3f291c3027e1f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 May 2024 11:39:21 +0400 Subject: [PATCH 3/6] refactor: Use a setting for test suite instead of iOS. This will also automatically switch existing users to iOS spoofing. --- .../patches/youtube/misc/fix/playback/SpoofClientPatch.kt | 2 +- src/main/resources/addresources/values/strings.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt index 188b542ae1..e4a5249fc8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt @@ -98,7 +98,7 @@ object SpoofClientPatch : BytecodePatch( sorting = Sorting.UNSORTED, preferences = setOf( SwitchPreference("revanced_spoof_client"), - SwitchPreference("revanced_spoof_client_use_ios"), + SwitchPreference("revanced_spoof_client_use_testsuite"), ), ), diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 49d6d68572..92f4e2c59b 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -1093,10 +1093,10 @@ Client is not spoofed\n\nVideo playback may not work Turning off this setting may cause video playback issues. - Spoof client to iOS - Spoof the client to iOS instead of an Android Testsuite - Client is spoofed to an iOS client\n\nSide effects include:\n• No HDR video - Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects included, but not limited to, are:\n• Subtitles are missing\n• Player gestures may not work\n• Low quality Shorts seekbar thumbnails\n• Watch history may not work + Spoof client to Android Testsuite + Spoof the client to Android Testsuite + Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects included, but are not limited to:\n• Speed flyout menu is missing\n• Captions are missing\n• Player swipe gestures may not work\n• Low quality Shorts seekbar thumbnails\n• Watch history may not work + Client is spoofed to an iOS client\n\nSide effects include:\n• No HDR video\n• Speed flyout menu is missing Spoof client thumbnails not available (API timed out) Spoof client thumbnails temporarily not available: %s From a1157d0edbec034f0c5e8d088369f398f686ea42 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 May 2024 11:45:06 +0400 Subject: [PATCH 4/6] fix: Throw an exception if the field is not found --- .../patches/youtube/misc/fix/playback/SpoofClientPatch.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt index e4a5249fc8..8ef61738c3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofClientPatch.kt @@ -101,7 +101,6 @@ object SpoofClientPatch : BytecodePatch( SwitchPreference("revanced_spoof_client_use_testsuite"), ), ), - ) // region Block /initplayback requests to fall back to /get_watch requests. @@ -182,7 +181,7 @@ object SpoofClientPatch : BytecodePatch( instructions.lastIndex, ).first { instruction -> instruction.opcode == Opcode.IPUT_OBJECT - }.getReference() + }.getReference() ?: throw PatchException("Could not find clientInfoClientModelField") } // endregion @@ -206,7 +205,7 @@ object SpoofClientPatch : BytecodePatch( ) } - // Change requestMessage.clientInfo.clientType and requestMessage.clientInfo.clientVersion to the spoofed values. + // Change client info to use the spoofed values. // Do this in a helper method, to remove the need of picking out multiple free registers from the hooked code. result.mutableClass.methods.add( ImmutableMethod( From de7ef5ad04c24643ff07c4878a2e265e075649cd Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 May 2024 12:21:35 +0400 Subject: [PATCH 5/6] fix typo --- src/main/resources/addresources/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 92f4e2c59b..17aeffab8a 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -1095,7 +1095,7 @@ Spoof client to Android Testsuite Spoof the client to Android Testsuite - Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects included, but are not limited to:\n• Speed flyout menu is missing\n• Captions are missing\n• Player swipe gestures may not work\n• Low quality Shorts seekbar thumbnails\n• Watch history may not work + Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects include, but are not limited to:\n• Speed flyout menu is missing\n• Captions are missing\n• Player swipe gestures may not work\n• Low quality Shorts seekbar thumbnails\n• Watch history may not work Client is spoofed to an iOS client\n\nSide effects include:\n• No HDR video\n• Speed flyout menu is missing Spoof client thumbnails not available (API timed out) Spoof client thumbnails temporarily not available: %s From 4424c30ad65b5c91d12dd9d0e364db567e7d6219 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 May 2024 16:21:10 +0400 Subject: [PATCH 6/6] Comments --- src/main/resources/addresources/values/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/addresources/values/strings.xml b/src/main/resources/addresources/values/strings.xml index 17aeffab8a..89ba652c3c 100644 --- a/src/main/resources/addresources/values/strings.xml +++ b/src/main/resources/addresources/values/strings.xml @@ -1092,7 +1092,6 @@ Client is spoofed Client is not spoofed\n\nVideo playback may not work Turning off this setting may cause video playback issues. - Spoof client to Android Testsuite Spoof the client to Android Testsuite Client is spoofed to an Android Testsuite client (iOS client is used for live streams)\n\nSide effects include, but are not limited to:\n• Speed flyout menu is missing\n• Captions are missing\n• Player swipe gestures may not work\n• Low quality Shorts seekbar thumbnails\n• Watch history may not work