From d1b2fe16dbf503e2f15f1dc12fb582f25fed884f Mon Sep 17 00:00:00 2001
From: inotia00 <108592928+inotia00@users.noreply.github.com>
Date: Mon, 16 Dec 2024 21:54:57 +0900
Subject: [PATCH] fix(YouTube - Spoof streaming data): On `iOS` clients,
livestreams always start from the beginning
---
.../shared/patches/spoof/SpoofStreamingDataPatch.java | 10 ++++++++++
.../SpoofStreamingDataSideEffectsPreference.java | 8 +-------
.../spoof/streamingdata/BaseSpoofStreamingDataPatch.kt | 10 ++++++++++
.../patches/shared/spoof/streamingdata/Fingerprints.kt | 9 +++++++++
.../resources/youtube/settings/host/values/strings.xml | 4 +---
5 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofStreamingDataPatch.java b/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofStreamingDataPatch.java
index 21a21379f..2bb2a233b 100644
--- a/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofStreamingDataPatch.java
+++ b/extensions/shared/src/main/java/app/revanced/extension/shared/patches/spoof/SpoofStreamingDataPatch.java
@@ -78,6 +78,16 @@ public class SpoofStreamingDataPatch {
return SPOOF_STREAMING_DATA;
}
+ /**
+ * Injection point.
+ */
+ public static boolean fixHLSCurrentTime(boolean original) {
+ if (!SPOOF_STREAMING_DATA) {
+ return original;
+ }
+ return false;
+ }
+
/**
* Injection point.
*/
diff --git a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java
index 40b64919d..92eec6bcf 100644
--- a/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java
+++ b/extensions/shared/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java
@@ -64,13 +64,7 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
private void updateUI() {
final ClientType clientType = Settings.SPOOF_STREAMING_DATA_TYPE.get();
-
- final String summaryTextKey;
- if (clientType == ClientType.IOS && Settings.SPOOF_STREAMING_DATA_IOS_SKIP_LIVESTREAM_PLAYBACK.get()) {
- summaryTextKey = "revanced_spoof_streaming_data_side_effects_ios_skip_livestream_playback";
- } else {
- summaryTextKey = "revanced_spoof_streaming_data_side_effects_" + clientType.name().toLowerCase();
- }
+ final String summaryTextKey = "revanced_spoof_streaming_data_side_effects_" + clientType.name().toLowerCase();
setSummary(str(summaryTextKey));
setEnabled(Settings.SPOOF_STREAMING_DATA.get());
diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/BaseSpoofStreamingDataPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/BaseSpoofStreamingDataPatch.kt
index a8beb08eb..956a1818e 100644
--- a/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/BaseSpoofStreamingDataPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/BaseSpoofStreamingDataPatch.kt
@@ -12,6 +12,7 @@ import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.shared.extension.Constants.SPOOF_PATH
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.fingerprint.definingClassOrThrow
+import app.revanced.util.fingerprint.injectLiteralInstructionBooleanCall
import app.revanced.util.fingerprint.matchOrThrow
import app.revanced.util.fingerprint.methodOrThrow
import app.revanced.util.getReference
@@ -209,6 +210,15 @@ fun baseSpoofStreamingDataPatch(
// endregion
+ // region Fix iOS livestream current time.
+
+ hlsCurrentTimeFingerprint.injectLiteralInstructionBooleanCall(
+ HLS_CURRENT_TIME_FEATURE_FLAG,
+ "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z"
+ )
+
+ // endregion
+
executeBlock()
}
diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/Fingerprints.kt
index 040316141..45e2739df 100644
--- a/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/Fingerprints.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/shared/spoof/streamingdata/Fingerprints.kt
@@ -134,3 +134,12 @@ internal val protobufClassParseByteBufferFingerprint = legacyFingerprint(
),
customFingerprint = { method, _ -> method.name == "parseFrom" },
)
+
+internal const val HLS_CURRENT_TIME_FEATURE_FLAG = 45355374L
+
+internal val hlsCurrentTimeFingerprint = legacyFingerprint(
+ name = "hlsCurrentTimeFingerprint",
+ accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
+ parameters = listOf("Z", "L"),
+ literals = listOf(HLS_CURRENT_TIME_FEATURE_FLAG),
+)
diff --git a/patches/src/main/resources/youtube/settings/host/values/strings.xml b/patches/src/main/resources/youtube/settings/host/values/strings.xml
index 7f4d6fef1..4e2aa35f6 100644
--- a/patches/src/main/resources/youtube/settings/host/values/strings.xml
+++ b/patches/src/main/resources/youtube/settings/host/values/strings.xml
@@ -1903,9 +1903,7 @@ Tap on the continue button and disable battery optimizations."
Android TV
Android VR
Spoofing side effects
- "• Livestreams start from the beginning.
-• Videos may end 1 second early."
- • Videos may end 1 second early.
+ • Videos may end 1 second early.
"• Audio track menu is missing.
• Stable volume is not available."
"• Audio track menu is missing.