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