diff --git a/app/src/main/java/app/revanced/integrations/patches/SpoofSignatureVerificationPatch.java b/app/src/main/java/app/revanced/integrations/patches/SpoofSignatureVerificationPatch.java index 16270f39..95b948d5 100644 --- a/app/src/main/java/app/revanced/integrations/patches/SpoofSignatureVerificationPatch.java +++ b/app/src/main/java/app/revanced/integrations/patches/SpoofSignatureVerificationPatch.java @@ -31,13 +31,27 @@ public class SpoofSignatureVerificationPatch { "SAFg" // Autoplay in scrim }; - @Nullable - private static String currentVideoId; + /** + * On app first start, the first video played usually contains a single non-default window setting value + * and all other subtitle settings for the video are (incorrect) default shorts window settings. + * For this situation, the shorts settings must be replaced. + * + * But some videos use multiple text positions on screen (such as https://youtu.be/3hW1rMNC89o), + * and by chance many of the subtitles uses window positions that match a default shorts position. + * To handle these videos, selectively allowing the shorts specific window settings to 'pass thru' unchanged, + * but only if the video contains multiple non-default subtitle window positions. + * + * Do not enable 'pass thru mode' until this many non default subtitle settings are observed for a single video. + */ + private static final int NUMBER_OF_NON_DEFAULT_SUBTITLES_BEFORE_ENABLING_PASSTHRU = 2; /** - * If any of the subtitles settings encountered from the current video have been non default values. + * The number of non default subtitle settings encountered for the current video. */ - private static boolean nonDefaultSubtitlesEncountered; + private static int numberOfNonDefaultSettingsObserved; + + @Nullable + private static String currentVideoId; /** * Injection point. @@ -137,15 +151,19 @@ public class SpoofSignatureVerificationPatch { // then this will incorrectly replace the setting. // But, if the video uses multiple subtitles in different screen locations, then detect the non-default values // and do not replace any window settings for the video (regardless if they match a shorts default). - if (signatureSpoofing && !nonDefaultSubtitlesEncountered && !PlayerType.getCurrent().isNoneOrHidden()) { + if (signatureSpoofing && !PlayerType.getCurrent().isNoneOrHidden() + && numberOfNonDefaultSettingsObserved < NUMBER_OF_NON_DEFAULT_SUBTITLES_BEFORE_ENABLING_PASSTHRU) { for (SubtitleWindowReplacementSettings setting : SubtitleWindowReplacementSettings.values()) { if (setting.match(ap, ah, av, vs, sd)) { return setting.replacementSetting(); } } - // Settings appear to be custom subtitles. - nonDefaultSubtitlesEncountered = true; - LogHelper.printDebug(() -> "Non default subtitles found. Using existing settings without replacement."); + + numberOfNonDefaultSettingsObserved++; + LogHelper.printDebug(() -> + numberOfNonDefaultSettingsObserved < NUMBER_OF_NON_DEFAULT_SUBTITLES_BEFORE_ENABLING_PASSTHRU + ? "Non default subtitle found." + : "Multiple non default subtitles found. Allowing all subtitles for this video to pass thru unchanged."); } return new int[]{ap, ah, av}; @@ -160,7 +178,7 @@ public class SpoofSignatureVerificationPatch { return; } currentVideoId = videoId; - nonDefaultSubtitlesEncountered = false; + numberOfNonDefaultSettingsObserved = 0; } catch (Exception ex) { LogHelper.printException(() -> "setCurrentVideoId failure", ex); }