diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java index 5f47290e9..78015ea79 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java @@ -177,10 +177,7 @@ public final class AdsFilter extends Filter { boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == playerShoppingShelf) { - if (contentIndex == 0 && playerShoppingShelfBuffer.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return contentIndex == 0 && playerShoppingShelfBuffer.check(protobufBufferArray).isFiltered(); } // Check for the index because of likelihood of false positives. @@ -198,13 +195,10 @@ public final class AdsFilter extends Filter { } if (matchedGroup == channelProfile) { - if (visitStoreButton.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return visitStoreButton.check(protobufBufferArray).isFiltered(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java index 308be8ce8..3ad2070ed 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java @@ -99,29 +99,23 @@ final class ButtonsFilter extends Filter { boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == likeSubscribeGlow) { - if ((path.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) || path.startsWith(COMPACT_CHANNEL_BAR_PATH_PREFIX)) - && path.contains(ANIMATED_VECTOR_TYPE_PATH)) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return (path.startsWith(VIDEO_ACTION_BAR_PATH_PREFIX) || path.startsWith(COMPACT_CHANNEL_BAR_PATH_PREFIX)) + && path.contains(ANIMATED_VECTOR_TYPE_PATH); } // If the current matched group is the action bar group, // in case every filter group is enabled, hide the action bar. if (matchedGroup == actionBarGroup) { - if (!isEveryFilterGroupEnabled()) { - return false; - } - } else if (matchedGroup == bufferFilterPathGroup) { - // Make sure the current path is the right one - // to avoid false positives. - if (!path.startsWith(VIDEO_ACTION_BAR_PATH)) return false; - - // In case the group list has no match, return false. - if (!bufferButtonsGroupList.check(protobufBufferArray).isFiltered()) return false; + return isEveryFilterGroupEnabled(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + if (matchedGroup == bufferFilterPathGroup) { + // Make sure the current path is the right one + // to avoid false positives. + return path.startsWith(VIDEO_ACTION_BAR_PATH) + && bufferButtonsGroupList.check(protobufBufferArray).isFiltered(); + } + + return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java index ec58b2ee2..d30504c2c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java @@ -88,22 +88,15 @@ final class CommentsFilter extends Filter { if (matchedGroup == commentComposer) { // To completely hide the emoji buttons (and leave no empty space), the timestamp button is // also hidden because the buffer is exactly the same and there's no way selectively hide. - if (contentIndex == 0 + return contentIndex == 0 && path.endsWith(TIMESTAMP_OR_EMOJI_BUTTONS_ENDS_WITH_PATH) - && emojiPickerBufferGroup.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + && emojiPickerBufferGroup.check(protobufBufferArray).isFiltered(); } if (matchedGroup == filterChipBar) { - if (aiCommentsSummary.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return aiCommentsSummary.check(protobufBufferArray).isFiltered(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java index 37062d6e2..263921fff 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CustomFilter.java @@ -153,9 +153,11 @@ final class CustomFilter extends Filter { if (custom.startsWith && contentIndex != 0) { return false; } - if (custom.bufferSearch != null && !custom.bufferSearch.matches(protobufBufferArray)) { - return false; + + if (custom.bufferSearch == null) { + return true; // No buffer filter, only path filtering. } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + + return custom.bufferSearch.matches(protobufBufferArray); } } \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java index d74b7c9b8..8e69ac407 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java @@ -94,13 +94,9 @@ final class DescriptionComponentsFilter extends Filter { if (exceptions.matches(path)) return false; if (matchedGroup == macroMarkersCarousel) { - if (contentIndex == 0 && macroMarkersCarouselGroupList.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return contentIndex == 0 && macroMarkersCarouselGroupList.check(protobufBufferArray).isFiltered(); } - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java index 42b86d589..ddec956f0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/Filter.java @@ -6,9 +6,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.settings.BaseSettings; - /** * Filters litho based components. * @@ -62,10 +59,7 @@ abstract class Filter { * Called after an enabled filter has been matched. * Default implementation is to always filter the matched component and log the action. * Subclasses can perform additional or different checks if needed. - *

- * If the content is to be filtered, subclasses should always - * call this method (and never return a plain 'true'). - * That way the logs will always show when a component was filtered and which filter hide it. + * *

* Method is called off the main thread. * @@ -76,14 +70,6 @@ abstract class Filter { */ boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { - if (BaseSettings.DEBUG.get()) { - String filterSimpleName = getClass().getSimpleName(); - if (contentType == FilterContentType.IDENTIFIER) { - Logger.printDebug(() -> filterSimpleName + " Filtered identifier: " + identifier); - } else { - Logger.printDebug(() -> filterSimpleName + " Filtered path: " + path); - } - } return true; } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java index d365d6802..45fdcd7d2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java @@ -576,7 +576,7 @@ final class KeywordContentFilter extends Filter { MutableReference matchRef = new MutableReference<>(); if (bufferSearch.matches(protobufBufferArray, matchRef)) { updateStats(true, matchRef.value); - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } updateStats(false, null); 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 e82a6b30f..c6c1e1e6e 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 @@ -286,43 +286,29 @@ public final class LayoutComponentsFilter extends Filter { // From 2025, the medical information panel is no longer shown in the search results. // Therefore, this identifier does not filter when the search bar is activated. if (matchedGroup == singleItemInformationPanel) { - if (PlayerType.getCurrent().isMaximizedOrFullscreen() || !NavigationBar.isSearchBarActive()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return PlayerType.getCurrent().isMaximizedOrFullscreen() || !NavigationBar.isSearchBarActive(); } // The groups are excluded from the filter due to the exceptions list below. // Filter them separately here. - if (matchedGroup == notifyMe || matchedGroup == inFeedSurvey || matchedGroup == expandableMetadata) - { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + if (matchedGroup == notifyMe || matchedGroup == inFeedSurvey || matchedGroup == expandableMetadata) { + return true; } if (exceptions.matches(path)) return false; // Exceptions are not filtered. if (matchedGroup == compactChannelBarInner) { - if (compactChannelBarInnerButton.check(path).isFiltered()) { - // The filter may be broad, but in the context of a compactChannelBarInnerButton, - // it's safe to assume that the button is the only thing that should be hidden. - if (joinMembershipButton.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - } - - return false; + return compactChannelBarInnerButton.check(path).isFiltered() + // The filter may be broad, but in the context of a compactChannelBarInnerButton, + // it's safe to assume that the button is the only thing that should be hidden. + && joinMembershipButton.check(protobufBufferArray).isFiltered(); } if (matchedGroup == horizontalShelves) { - if (contentIndex == 0 && hideShelves()) { - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return contentIndex == 0 && hideShelves(); } - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java index 3b054c6e6..ac88185cf 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java @@ -7,6 +7,7 @@ import java.nio.ByteBuffer; import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.StringTrieSearch; import app.revanced.extension.youtube.settings.Settings; @@ -114,12 +115,29 @@ public final class LithoFilterPatch { if (!group.includeInSearch()) { continue; } + for (String pattern : group.filters) { - pathSearchTree.addPattern(pattern, (textSearched, matchedStartIndex, matchedLength, callbackParameter) -> { + String filterSimpleName = filter.getClass().getSimpleName(); + + pathSearchTree.addPattern(pattern, (textSearched, matchedStartIndex, + matchedLength, callbackParameter) -> { if (!group.isEnabled()) return false; + LithoFilterParameters parameters = (LithoFilterParameters) callbackParameter; - return filter.isFiltered(parameters.identifier, parameters.path, parameters.protoBuffer, - group, type, matchedStartIndex); + final boolean isFiltered = filter.isFiltered(parameters.identifier, + parameters.path, parameters.protoBuffer, group, type, matchedStartIndex); + + if (isFiltered && BaseSettings.DEBUG.get()) { + if (type == Filter.FilterContentType.IDENTIFIER) { + Logger.printDebug(() -> "Filtered " + filterSimpleName + + " identifier: " + parameters.identifier); + } else { + Logger.printDebug(() -> "Filtered " + filterSimpleName + + " path: " + parameters.path); + } + } + + return isFiltered; } ); } 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 d7c8e6caa..e1401f3ae 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 @@ -99,7 +99,7 @@ public class PlayerFlyoutMenuItemsFilter extends Filter { boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { if (matchedGroup == videoQualityMenuFooter) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } if (contentIndex != 0) { @@ -111,11 +111,6 @@ public class PlayerFlyoutMenuItemsFilter extends Filter { return false; } - if (flyoutFilterGroupList.check(protobufBufferArray).isFiltered()) { - // Super class handles logging. - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - - return false; + return flyoutFilterGroupList.check(protobufBufferArray).isFiltered(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index b647d48c4..ef1cd5bb5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -278,27 +278,18 @@ public final class ShortsFilter extends Filter { if (contentType == FilterContentType.PATH) { if (matchedGroup == subscribeButton || matchedGroup == joinButton || matchedGroup == paidPromotionButton) { // Selectively filter to avoid false positive filtering of other subscribe/join buttons. - if (path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH)) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return path.startsWith(REEL_CHANNEL_BAR_PATH) || path.startsWith(REEL_METAPANEL_PATH); } if (matchedGroup == shortsCompactFeedVideoPath) { - if (shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return shouldHideShortsFeedItems() && shortsCompactFeedVideoBuffer.check(protobufBufferArray).isFiltered(); } // Video action buttons (comment, share, remix) have the same path. // Like and dislike are separate path filters and don't require buffer searching. if (matchedGroup == shortsActionBar) { - if (actionButton.check(path).isFiltered() - && videoActionButtonGroupList.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return actionButton.check(path).isFiltered() + && videoActionButtonGroupList.check(protobufBufferArray).isFiltered(); } if (matchedGroup == suggestedAction) { @@ -306,28 +297,23 @@ public final class ShortsFilter extends Filter { // This has a secondary effect of hiding all new un-identified actions // under the assumption that the user wants all suggestions hidden. if (isEverySuggestedActionFilterEnabled()) { - return super.isFiltered(path, identifier, protobufBufferArray, matchedGroup, contentType, contentIndex); + return true; } - if (suggestedActionsGroupList.check(protobufBufferArray).isFiltered()) { - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); - } - return false; + return suggestedActionsGroupList.check(protobufBufferArray).isFiltered(); } - } else { - // Feed/search identifier components. - if (matchedGroup == shelfHeader) { - // Because the header is used in watch history and possibly other places, check for the index, - // which is 0 when the shelf header is used for Shorts. - if (contentIndex != 0) return false; - } - - if (!shouldHideShortsFeedItems()) return false; + return true; } - // Super class handles logging. - return super.isFiltered(identifier, path, protobufBufferArray, matchedGroup, contentType, contentIndex); + // Feed/search identifier components. + if (matchedGroup == shelfHeader) { + // Because the header is used in watch history and possibly other places, check for the index, + // which is 0 when the shelf header is used for Shorts. + if (contentIndex != 0) return false; + } + + return shouldHideShortsFeedItems(); } private static boolean shouldHideShortsFeedItems() {