From b1d164b4466f7225fae6ade4685560c4b1d6a504 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 31 Jul 2025 06:33:12 -0400 Subject: [PATCH] fix(YouTube - Litho filter): Correctly filter identifier of older YouTube targets --- .../youtube/patches/components/Filter.java | 2 -- .../patches/components/LithoFilterPatch.java | 31 ++++++++++--------- 2 files changed, 16 insertions(+), 17 deletions(-) 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 c478e9c19..454c03338 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 @@ -41,8 +41,6 @@ abstract class Filter { * Adds callbacks to {@link #isFiltered(String, String, byte[], StringFilterGroup, FilterContentType, int)} * if any of the groups are found. *

- * Note: This callback is done only during the initial component creation, - * and the path will always be an empty string. */ protected final void addIdentifierCallbacks(StringFilterGroup... groups) { identifierCallbacks.addAll(Arrays.asList(groups)); 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 b1dc866bf..e2ed04e63 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 @@ -127,14 +127,14 @@ public final class LithoFilterPatch { private static void filterUsingCallbacks(StringTrieSearch pathSearchTree, Filter filter, List groups, Filter.FilterContentType type) { + String filterSimpleName = filter.getClass().getSimpleName(); + for (StringFilterGroup group : groups) { if (!group.includeInSearch()) { continue; } for (String pattern : group.filters) { - String filterSimpleName = filter.getClass().getSimpleName(); - pathSearchTree.addPattern(pattern, (textSearched, matchedStartIndex, matchedLength, callbackParameter) -> { if (!group.isEnabled()) return false; @@ -162,6 +162,7 @@ public final class LithoFilterPatch { /** * Injection point. Called off the main thread. + * Targets 20.22+ */ public static void setProtoBuffer(byte[] buffer) { // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. @@ -194,6 +195,10 @@ public final class LithoFilterPatch { */ public static boolean isFiltered(String lithoIdentifier, StringBuilder pathBuilder) { try { + if (lithoIdentifier.isEmpty() && pathBuilder.length() == 0) { + return false; + } + byte[] buffer = bufferThreadLocal.get(); // Potentially the buffer may have been null or never set up until now. // Use an empty buffer so the litho id/path filters still work correctly. @@ -201,23 +206,19 @@ public final class LithoFilterPatch { buffer = EMPTY_BYTE_ARRAY; } - String path = pathBuilder.toString(); - LithoFilterParameters parameter = new LithoFilterParameters(lithoIdentifier, path, buffer); + LithoFilterParameters parameter = new LithoFilterParameters( + lithoIdentifier, pathBuilder.toString(), buffer); Logger.printDebug(() -> "Searching " + parameter); - if (path.isEmpty()) { - // Identifier is filtered only if there is no path, - // meaning no component or sub components have been created yet. - if (identifierSearchTree.matches(parameter.identifier, parameter)) { - return true; - } - } else { - if (pathSearchTree.matches(parameter.path, parameter)) { - return true; - } + if (identifierSearchTree.matches(parameter.identifier, parameter)) { + return true; + } + + if (pathSearchTree.matches(parameter.path, parameter)) { + return true; } } catch (Exception ex) { - Logger.printException(() -> "Litho filter failure", ex); + Logger.printException(() -> "isFiltered failure", ex); } return false;