From f31c3b6e3192c6cc8924f34f8750e157ea7b2cfe Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:36:44 +0400 Subject: [PATCH 1/3] fix(YouTube - Spoof video streams): Do not start iOS livestreams from the beginning Code from https://github.com/inotia00/revanced-patches/commit/d1b2fe16dbf503e2f15f1dc12fb582f25fed884f#diff-6c9de09efbda0bba16e837485d4baddd9285f45c9800922ddd2e5170c73562c1R143 --- .../shared/spoof/SpoofVideoStreamsPatch.java | 13 +++++++++++++ .../patches/shared/misc/spoof/Fingerprints.kt | 11 +++++++++++ .../shared/misc/spoof/SpoofVideoStreamsPatch.kt | 10 ++++++++++ .../main/resources/addresources/values/strings.xml | 3 +-- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java index 9e61eca990..6fbc853dd0 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java @@ -165,6 +165,19 @@ public static byte[] removeVideoPlaybackPostBody(Uri uri, int method, byte[] pos return postData; } + /** + * Injection point. + * + * Fixes iOS livestreams starting from the beginning. + */ + public static boolean fixHLSCurrentTime(boolean original) { + if (!SPOOF_STREAMING_DATA) { + return original; + } + + return false; + } + public static final class SpoofiOSAvailability implements Setting.Availability { @Override public boolean isAvailable() { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 3976d03e7e..0c82935360 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.fingerprint +import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -110,3 +111,13 @@ internal val buildMediaDataSourceFingerprint = fingerprint { "Ljava/lang/Object;", ) } + +internal const val HLS_CURRENT_TIME_FEATURE_FLAG = 45355374L + +internal val hlsCurrentTimeFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters("Z", "L") + literal { + HLS_CURRENT_TIME_FEATURE_FLAG + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 9b64e386b3..004443ed15 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -12,6 +12,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.insertFeatureFlagBooleanOverride import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation @@ -201,6 +202,15 @@ fun spoofVideoStreamsPatch( } // endregion + // region Fix iOS livestream current time. + + hlsCurrentTimeFingerprint.method.insertFeatureFlagBooleanOverride( + HLS_CURRENT_TIME_FEATURE_FLAG, + "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" + ) + + // endregion + executeBlock() } } diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index e2c26d4f14..d311ca9b2c 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1293,8 +1293,7 @@ Video playback may not work" AVC has a maximum resolution of 1080p, Opus audio codec is not available, and video playback will use more internet data than VP9 or AV1." iOS spoofing side effects "• Private kids videos may not play -• Livestreams start from the beginning -• Videos end 1 second early" +• Livestreams start from the beginning" Android VR spoofing side effects "• Kids videos may not play • Audio track menu is missing From 448b62155892c0763534a0e9ab800e45507ed653 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 16 Dec 2024 18:40:24 +0400 Subject: [PATCH 2/3] fix typo --- patches/src/main/resources/addresources/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index d311ca9b2c..a50e590331 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1293,7 +1293,7 @@ Video playback may not work" AVC has a maximum resolution of 1080p, Opus audio codec is not available, and video playback will use more internet data than VP9 or AV1." iOS spoofing side effects "• Private kids videos may not play -• Livestreams start from the beginning" +• Videos end 1 second early" Android VR spoofing side effects "• Kids videos may not play • Audio track menu is missing From 82bd45c4309bfe016475d60ffd52d59ae4b666a6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 16 Dec 2024 22:43:28 +0400 Subject: [PATCH 3/3] fix: Fix livestream start time only for iOS --- .../extension/shared/spoof/SpoofVideoStreamsPatch.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java index 6fbc853dd0..8e480c40ee 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java @@ -16,6 +16,10 @@ @SuppressWarnings("unused") public class SpoofVideoStreamsPatch { private static final boolean SPOOF_STREAMING_DATA = BaseSettings.SPOOF_VIDEO_STREAMS.get(); + + private static final boolean FIX_HLS_CURRENT_TIME = SPOOF_STREAMING_DATA + && BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.IOS; + /** * Any unreachable ip address. Used to intentionally fail requests. */ @@ -171,11 +175,11 @@ public static byte[] removeVideoPlaybackPostBody(Uri uri, int method, byte[] pos * Fixes iOS livestreams starting from the beginning. */ public static boolean fixHLSCurrentTime(boolean original) { - if (!SPOOF_STREAMING_DATA) { - return original; + if (FIX_HLS_CURRENT_TIME) { + return false; } - return false; + return original; } public static final class SpoofiOSAvailability implements Setting.Availability {