From 9495cf49ef8a872be64de6c971c1919b4b9a8720 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Thu, 13 Nov 2025 09:40:28 +0200
Subject: [PATCH] fix(YouTube - Hide player flyout menu items): Allow hiding
audio menu with 'Android No SDK' client type
---
.../shared/spoof/SpoofVideoStreamsPatch.java | 2 +-
.../components/LayoutComponentsFilter.java | 27 +++++++++----------
.../PlayerFlyoutMenuItemsFilter.java | 6 +----
.../resources/addresources/values/strings.xml | 5 ++--
4 files changed, 18 insertions(+), 22 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 77ef1a663..38fbac993 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
@@ -72,7 +72,7 @@ public class SpoofVideoStreamsPatch {
public static boolean spoofingToClientWithNoMultiAudioStreams() {
return isPatchIncluded()
&& SPOOF_STREAMING_DATA
- && preferredClient != ClientType.IPADOS;
+ && !preferredClient.supportsMultiAudioTracks;
}
/**
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java
index c096e17e8..00429359f 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java
@@ -21,13 +21,14 @@ import app.revanced.extension.youtube.shared.PlayerType;
@SuppressWarnings("unused")
public final class LayoutComponentsFilter extends Filter {
- private static final StringTrieSearch mixPlaylistsExceptions = new StringTrieSearch(
+ private static final StringTrieSearch mixPlaylistsContextExceptions = new StringTrieSearch(
"V.ED", // Playlist browse id.
"java.lang.ref.WeakReference"
);
- private static final ByteArrayFilterGroup mixPlaylistsExceptions2 = new ByteArrayFilterGroup(
+ private static final ByteArrayFilterGroup mixPlaylistsBufferExceptions = new ByteArrayFilterGroup(
null,
- "cell_description_body"
+ "cell_description_body",
+ "channel_profile"
);
private static final ByteArrayFilterGroup mixPlaylists = new ByteArrayFilterGroup(
null,
@@ -380,17 +381,15 @@ public final class LayoutComponentsFilter extends Filter {
return false;
}
- // Prevent playlist items being hidden, if a mix playlist is present in it.
- if (mixPlaylistsExceptions.matches(conversionContext.toString())) {
- return false;
- }
-
- // Prevent hiding the description of some videos accidentally.
- if (mixPlaylistsExceptions2.check(bytes).isFiltered()) {
- return false;
- }
-
- if (mixPlaylists.check(bytes).isFiltered()) {
+ if (mixPlaylists.check(bytes).isFiltered()
+ // Prevent hiding the description of some videos accidentally.
+ && !mixPlaylistsBufferExceptions.check(bytes).isFiltered()
+ // Prevent playlist items being hidden, if a mix playlist is present in it.
+ // Check last since it requires creating a context string.
+ //
+ // FIXME: The conversion context passed in does not always generate a valid toString.
+ // This string check may no longer be needed, or the patch may be broken.
+ && !mixPlaylistsContextExceptions.matches(conversionContext.toString())) {
Logger.printDebug(() -> "Filtered mix playlist");
return true;
}
diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java
index 1872e6856..eae4eacfc 100644
--- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java
+++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java
@@ -12,13 +12,9 @@ import java.util.List;
public class PlayerFlyoutMenuItemsFilter extends Filter {
public static final class HideAudioFlyoutMenuAvailability implements Setting.Availability {
- private static final boolean AVAILABLE_ON_LAUNCH = !SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams();
-
@Override
public boolean isAvailable() {
- // Check conditions of launch and now. Otherwise if spoofing is changed
- // without a restart the setting will show as available when it's not.
- return AVAILABLE_ON_LAUNCH && !SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams();
+ return !SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams();
}
@Override
diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml
index 3a5c69201..38c3bfb9d 100644
--- a/patches/src/main/resources/addresources/values/strings.xml
+++ b/patches/src/main/resources/addresources/values/strings.xml
@@ -807,10 +807,11 @@ If changing this setting does not take effect, try switching to Incognito mode."
Hide Audio track
Audio track menu is hidden
Audio track menu is shown
-
+
"Audio track menu is hidden
-To show the Audio track menu, change \'Spoof video streams\' to iPadOS"
+To show the Audio track menu, change \'Spoof video streams\' to \'Android No SDK\'"
Hide Watch in VR
Watch in VR menu is hidden