Merge remote-tracking branch 'upstream/dev' into feat/patcher_instruction_filters

# Conflicts:
#	extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java
This commit is contained in:
LisoUseInAIKyrios 2025-10-03 10:55:41 +04:00
commit 2d207fccbc
158 changed files with 920 additions and 727 deletions

View file

@ -8,7 +8,7 @@ public class ForceOriginalAudioPatch {
/**
* Injection point.
*/
public static void setPreferredLanguage() {
public static void setEnabled() {
app.revanced.extension.shared.patches.ForceOriginalAudioPatch.setEnabled(
Settings.FORCE_ORIGINAL_AUDIO.get(),
Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get()

View file

@ -10,14 +10,12 @@ public class ForceOriginalAudioPatch {
private static final String DEFAULT_AUDIO_TRACKS_SUFFIX = ".4";
private static volatile boolean enabled = false;
private static volatile boolean enabled;
public static void setEnabled(boolean isEnabled, ClientType client) {
enabled = isEnabled;
if (isEnabled
&& SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams()
&& !client.useAuth) {
if (isEnabled && !client.useAuth && !client.supportsMultiAudioTracks) {
// If client spoofing does not use authentication and lacks multi-audio streams,
// then can use any language code for the request and if that requested language is
// not available YT uses the original audio language. Authenticated requests ignore

View file

@ -31,6 +31,7 @@ public enum ClientType {
"132.0.6808.3",
"1.61.48",
false,
false,
"Android VR 1.61"
),
/**
@ -50,6 +51,7 @@ public enum ClientType {
"107.0.5284.2",
"1.43.32",
ANDROID_VR_1_61_48.useAuth,
ANDROID_VR_1_61_48.supportsMultiAudioTracks,
"Android VR 1.43"
),
/**
@ -69,6 +71,7 @@ public enum ClientType {
"132.0.6779.0",
"23.47.101",
true,
false,
"Android Studio"
),
/**
@ -83,6 +86,7 @@ public enum ClientType {
"0.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15",
false,
false,
"visionOS"
),
/**
@ -107,6 +111,7 @@ public enum ClientType {
"19.22.3",
"com.google.ios.youtube/19.22.3 (iPad7,6; U; CPU iPadOS 17_7_10 like Mac OS X; " + Locale.getDefault() + ")",
false,
true,
"iPadOS"
);
@ -180,6 +185,11 @@ public enum ClientType {
*/
public final boolean useAuth;
/**
* If the client supports multiple audio tracks.
*/
public final boolean supportsMultiAudioTracks;
/**
* Friendly name displayed in stats for nerds.
*/
@ -200,6 +210,7 @@ public enum ClientType {
@NonNull String cronetVersion,
String clientVersion,
boolean useAuth,
boolean supportsMultiAudioTracks,
String friendlyName) {
this.id = id;
this.clientName = clientName;
@ -213,6 +224,7 @@ public enum ClientType {
this.cronetVersion = cronetVersion;
this.clientVersion = clientVersion;
this.useAuth = useAuth;
this.supportsMultiAudioTracks = supportsMultiAudioTracks;
this.friendlyName = friendlyName;
Locale defaultLocale = Locale.getDefault();
@ -238,6 +250,7 @@ public enum ClientType {
String clientVersion,
String userAgent,
boolean useAuth,
boolean supportsMultiAudioTracks,
String friendlyName) {
this.id = id;
this.clientName = clientName;
@ -248,6 +261,7 @@ public enum ClientType {
this.clientVersion = clientVersion;
this.userAgent = userAgent;
this.useAuth = useAuth;
this.supportsMultiAudioTracks = supportsMultiAudioTracks;
this.friendlyName = friendlyName;
this.packageName = null;
this.androidSdkVersion = null;

View file

@ -39,7 +39,7 @@ public class SpoofVideoStreamsPatch {
@Nullable
private static volatile AppLanguage languageOverride;
private static volatile ClientType preferredClient = ClientType.ANDROID_VR_1_61_48;
private static volatile ClientType preferredClient = ClientType.ANDROID_VR_1_43_32;
/**
* @return If this patch was included during patching.

View file

@ -8,7 +8,7 @@ public class ForceOriginalAudioPatch {
/**
* Injection point.
*/
public static void setPreferredLanguage() {
public static void setEnabled() {
app.revanced.extension.shared.patches.ForceOriginalAudioPatch.setEnabled(
Settings.FORCE_ORIGINAL_AUDIO.get(),
Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get()

View file

@ -131,11 +131,11 @@ public class ReturnYouTubeDislikePatch {
String conversionContextString = conversionContext.toString();
if (isRollingNumber && !conversionContextString.contains("video_action_bar.eml")) {
if (isRollingNumber && !conversionContextString.contains("video_action_bar.e")) {
return original;
}
if (conversionContextString.contains("segmented_like_dislike_button.eml")) {
if (conversionContextString.contains("segmented_like_dislike_button.e")) {
// Regular video.
ReturnYouTubeDislike videoData = currentVideoData;
if (videoData == null) {
@ -153,12 +153,12 @@ public class ReturnYouTubeDislikePatch {
}
if (Utils.containsAny(conversionContextString,
"|shorts_dislike_button.eml", "|reel_dislike_button.eml")) {
"|shorts_dislike_button.e", "|reel_dislike_button.e")) {
return getShortsSpan(original, true);
}
if (Utils.containsAny(conversionContextString,
"|shorts_like_button.eml", "|reel_like_button.eml")) {
"|shorts_like_button.e", "|reel_like_button.e")) {
if (!Utils.containsNumber(original)) {
Logger.printDebug(() -> "Replacing hidden likes count");
return getShortsSpan(original, false);

View file

@ -105,17 +105,17 @@ public final class AdsFilter extends Filter {
Settings.HIDE_VIEW_PRODUCTS_BANNER,
"product_item",
"products_in_video",
"shopping_overlay.eml" // Video player overlay shopping links.
"shopping_overlay.e" // Video player overlay shopping links.
);
final var shoppingLinks = new StringFilterGroup(
Settings.HIDE_SHOPPING_LINKS,
"shopping_description_shelf.eml"
"shopping_description_shelf.e"
);
playerShoppingShelf = new StringFilterGroup(
Settings.HIDE_CREATOR_STORE_SHELF,
"horizontal_shelf.eml"
"horizontal_shelf.e"
);
playerShoppingShelfBuffer = new ByteArrayFilterGroup(
@ -131,7 +131,7 @@ public final class AdsFilter extends Filter {
final var merchandise = new StringFilterGroup(
Settings.HIDE_MERCHANDISE_BANNERS,
"product_carousel",
"shopping_carousel.eml" // Channel profile shopping shelf.
"shopping_carousel.e" // Channel profile shopping shelf.
);
final var selfSponsor = new StringFilterGroup(

View file

@ -14,7 +14,7 @@ public final class AdvancedVideoQualityMenuFilter extends Filter {
public AdvancedVideoQualityMenuFilter() {
addPathCallbacks(new StringFilterGroup(
Settings.ADVANCED_VIDEO_QUALITY_MENU,
"quick_quality_sheet_content.eml-js"
"quick_quality_sheet_content.e"
));
}

View file

@ -5,13 +5,13 @@ import app.revanced.extension.youtube.settings.Settings;
@SuppressWarnings("unused")
final class ButtonsFilter extends Filter {
private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.eml";
private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.eml";
private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.eml";
private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.e";
private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.e";
private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.e";
/**
* Video bar path when the video information is collapsed. Seems to shown only with 20.14+
*/
private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.eml";
private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.e";
private static final String ANIMATED_VECTOR_TYPE_PATH = "AnimatedVectorType";
private final StringFilterGroup likeSubscribeGlow;
@ -29,12 +29,12 @@ final class ButtonsFilter extends Filter {
likeSubscribeGlow = new StringFilterGroup(
Settings.DISABLE_LIKE_SUBSCRIBE_GLOW,
"animated_button_border.eml"
"animated_button_border.e"
);
bufferFilterPathGroup = new StringFilterGroup(
null,
"|ContainerType|button.eml"
"|ContainerType|button.e"
);
addPathCallbacks(
@ -45,7 +45,7 @@ final class ButtonsFilter extends Filter {
),
new StringFilterGroup(
Settings.HIDE_DOWNLOAD_BUTTON,
"|download_button.eml"
"|download_button.e"
),
new StringFilterGroup(
Settings.HIDE_SAVE_BUTTON,
@ -53,7 +53,7 @@ final class ButtonsFilter extends Filter {
),
new StringFilterGroup(
Settings.HIDE_CLIP_BUTTON,
"|clip_button.eml"
"|clip_button.e"
)
);

View file

@ -6,7 +6,7 @@ import app.revanced.extension.youtube.shared.PlayerType;
@SuppressWarnings("unused")
final class CommentsFilter extends Filter {
private static final String COMMENT_COMPOSER_PATH = "comment_composer.eml";
private static final String COMMENT_COMPOSER_PATH = "comment_composer.e";
private final StringFilterGroup chipBar;
private final ByteArrayFilterGroup aiCommentsSummary;
@ -15,12 +15,12 @@ final class CommentsFilter extends Filter {
public CommentsFilter() {
var chatSummary = new StringFilterGroup(
Settings.HIDE_COMMENTS_AI_CHAT_SUMMARY,
"live_chat_summary_banner.eml"
"live_chat_summary_banner.e"
);
chipBar = new StringFilterGroup(
Settings.HIDE_COMMENTS_AI_SUMMARY,
"chip_bar.eml"
"chip_bar.e"
);
aiCommentsSummary = new ByteArrayFilterGroup(
@ -35,8 +35,8 @@ final class CommentsFilter extends Filter {
var commentsByMembers = new StringFilterGroup(
Settings.HIDE_COMMENTS_BY_MEMBERS_HEADER,
"sponsorships_comments_header.eml",
"sponsorships_comments_footer.eml"
"sponsorships_comments_header.e",
"sponsorships_comments_footer.e"
);
var comments = new StringFilterGroup(
@ -52,7 +52,7 @@ final class CommentsFilter extends Filter {
var createAShort = new StringFilterGroup(
Settings.HIDE_COMMENTS_CREATE_A_SHORT_BUTTON,
"composer_short_creation_button.eml"
"composer_short_creation_button.e"
);
emojiAndTimestampButtons = new StringFilterGroup(
@ -69,7 +69,7 @@ final class CommentsFilter extends Filter {
var thanksButton = new StringFilterGroup(
Settings.HIDE_COMMENTS_THANKS_BUTTON,
"super_thanks_button.eml"
"super_thanks_button.e"
);
addPathCallbacks(

View file

@ -29,12 +29,12 @@ final class DescriptionComponentsFilter extends Filter {
aiGeneratedVideoSummarySection = new StringFilterGroup(
Settings.HIDE_AI_GENERATED_VIDEO_SUMMARY_SECTION,
"cell_expandable_metadata.eml"
"cell_expandable_metadata.e"
);
final StringFilterGroup askSection = new StringFilterGroup(
Settings.HIDE_ASK_SECTION,
"youchat_entrypoint.eml"
"youchat_entrypoint.e"
);
final StringFilterGroup attributesSection = new StringFilterGroup(
@ -65,7 +65,7 @@ final class DescriptionComponentsFilter extends Filter {
macroMarkersCarousel = new StringFilterGroup(
null,
"macro_markers_carousel.eml"
"macro_markers_carousel.e"
);
macroMarkersCarouselGroupList.addAll(
@ -81,7 +81,7 @@ final class DescriptionComponentsFilter extends Filter {
horizontalShelf = new StringFilterGroup(
Settings.HIDE_ATTRIBUTES_SECTION,
"horizontal_shelf.eml"
"horizontal_shelf.e"
);
cellVideoAttribute = new ByteArrayFilterGroup(

View file

@ -9,7 +9,7 @@ public final class HideInfoCardsFilter extends Filter {
addIdentifierCallbacks(
new StringFilterGroup(
Settings.HIDE_INFO_CARDS,
"info_card_teaser_overlay.eml"
"info_card_teaser_overlay.e"
)
);
}

View file

@ -79,10 +79,10 @@ final class KeywordContentFilter extends Filter {
"search_vwc_description_transition_key",
"g-high-recZ",
// Text and litho components found in the buffer that belong to path filters.
"expandable_metadata.eml",
"thumbnail.eml",
"avatar.eml",
"overflow_button.eml",
"expandable_metadata.e",
"thumbnail.e",
"avatar.e",
"overflow_button.e",
"shorts-lockup-image",
"shorts-lockup.overlay-metadata.secondary-text",
"YouTubeSans-SemiBold",
@ -94,16 +94,16 @@ final class KeywordContentFilter extends Filter {
*/
private final StringFilterGroup startsWithFilter = new StringFilterGroup(
null, // Multiple settings are used and must be individually checked if active.
"home_video_with_context.eml",
"search_video_with_context.eml",
"video_with_context.eml", // Subscription tab videos.
"related_video_with_context.eml",
"home_video_with_context.e",
"search_video_with_context.e",
"video_with_context.e", // Subscription tab videos.
"related_video_with_context.e",
// A/B test for subscribed video, and sometimes when tablet layout is enabled.
"video_lockup_with_attachment.eml",
"compact_video.eml",
"video_lockup_with_attachment.e",
"compact_video.e",
"inline_shorts",
"shorts_video_cell",
"shorts_pivot_item.eml"
"shorts_pivot_item.e"
);
/**
@ -112,9 +112,9 @@ final class KeywordContentFilter extends Filter {
@SuppressWarnings("FieldCanBeLocal")
private final StringFilterGroup containsFilter = new StringFilterGroup(
null,
"modern_type_shelf_header_content.eml",
"shorts_lockup_cell.eml", // Part of 'shorts_shelf_carousel.eml'
"video_card.eml" // Shorts that appear in a horizontal shelf.
"modern_type_shelf_header_content.e",
"shorts_lockup_cell.e", // Part of 'shorts_shelf_carousel.e'
"video_card.e" // Shorts that appear in a horizontal shelf.
);
/**
@ -125,10 +125,10 @@ final class KeywordContentFilter extends Filter {
* the buffer of the parent component was already searched and passed.
*/
private final StringTrieSearch exceptions = new StringTrieSearch(
"metadata.eml",
"thumbnail.eml",
"avatar.eml",
"overflow_button.eml"
"metadata.e",
"thumbnail.e",
"avatar.e",
"overflow_button.e"
);
/**

View file

@ -77,18 +77,18 @@ public final class LayoutComponentsFilter extends Filter {
communityPosts = new StringFilterGroup(
Settings.HIDE_COMMUNITY_POSTS,
"post_base_wrapper", // may be obsolete and no longer needed.
"text_post_root.eml",
"images_post_root.eml",
"images_post_slim.eml", // may be obsolete and no longer needed.
"images_post_root_slim.eml",
"text_post_root_slim.eml",
"post_base_wrapper_slim.eml",
"poll_post_root.eml",
"videos_post_root.eml",
"post_shelf_slim.eml",
"videos_post_responsive_root.eml",
"text_post_responsive_root.eml",
"poll_post_responsive_root.eml"
"text_post_root.e",
"images_post_root.e",
"images_post_slim.e", // may be obsolete and no longer needed.
"images_post_root_slim.e",
"text_post_root_slim.e",
"post_base_wrapper_slim.e",
"poll_post_root.e",
"videos_post_root.e",
"post_shelf_slim.e",
"videos_post_responsive_root.e",
"text_post_responsive_root.e",
"poll_post_responsive_root.e"
);
final var subscribersCommunityGuidelines = new StringFilterGroup(
@ -150,7 +150,7 @@ public final class LayoutComponentsFilter extends Filter {
final var channelLinksPreview = new StringFilterGroup(
Settings.HIDE_LINKS_PREVIEW,
"attribution.eml"
"attribution.e"
);
final var emergencyBox = new StringFilterGroup(
@ -191,8 +191,8 @@ public final class LayoutComponentsFilter extends Filter {
final var playables = new StringFilterGroup(
Settings.HIDE_PLAYABLES,
"horizontal_gaming_shelf.eml",
"mini_game_card.eml"
"horizontal_gaming_shelf.e",
"mini_game_card.e"
);
// Playable horizontal shelf header.
@ -229,7 +229,7 @@ public final class LayoutComponentsFilter extends Filter {
compactChannelBarInnerButton = new StringFilterGroup(
null,
"|button.eml"
"|button.e"
);
joinMembershipButton = new ByteArrayFilterGroup(
@ -249,13 +249,13 @@ public final class LayoutComponentsFilter extends Filter {
final var videoRecommendationLabels = new StringFilterGroup(
Settings.HIDE_VIDEO_RECOMMENDATION_LABELS,
"endorsement_header_footer.eml"
"endorsement_header_footer.e"
);
channelProfile = new StringFilterGroup(
null,
"channel_profile.eml",
"page_header.eml"
"channel_profile.e",
"page_header.e"
);
channelProfileBuffer = new ByteArrayFilterGroupList();
channelProfileBuffer.addAll(new ByteArrayFilterGroup(
@ -270,15 +270,15 @@ public final class LayoutComponentsFilter extends Filter {
horizontalShelves = new StringFilterGroup(
Settings.HIDE_HORIZONTAL_SHELVES,
"horizontal_video_shelf.eml",
"horizontal_shelf.eml",
"horizontal_shelf_inline.eml",
"horizontal_tile_shelf.eml"
"horizontal_video_shelf.e",
"horizontal_shelf.e",
"horizontal_shelf_inline.e",
"horizontal_tile_shelf.e"
);
ticketShelf = new ByteArrayFilterGroup(
Settings.HIDE_TICKET_SHELF,
"ticket_item.eml"
"ticket_item.e"
);
addPathCallbacks(

View file

@ -24,13 +24,13 @@ public final class PlaybackSpeedMenuFilter extends Filter {
// 0.05x litho speed menu.
var playbackRateSelectorGroup = new StringFilterGroup(
Settings.CUSTOM_SPEED_MENU,
"playback_rate_selector_menu_sheet.eml-js"
"playback_rate_selector_menu_sheet.e"
);
// Old litho based speed menu.
oldPlaybackMenuGroup = new StringFilterGroup(
Settings.CUSTOM_SPEED_MENU,
"playback_speed_sheet_content.eml-js");
"playback_speed_sheet_content.e");
addPathCallbacks(playbackRateSelectorGroup, oldPlaybackMenuGroup);
}

View file

@ -38,7 +38,7 @@ public class PlayerFlyoutMenuItemsFilter extends Filter {
addPathCallbacks(
videoQualityMenuFooter,
new StringFilterGroup(null, "overflow_menu_item.eml")
new StringFilterGroup(null, "overflow_menu_item.e")
);
flyoutFilterGroupList.addAll(

View file

@ -61,8 +61,8 @@ public final class ReturnYouTubeDislikeFilter extends Filter {
// But if swiping back to a previous video and liking/disliking, then only that single button reloads.
// So must check for both buttons.
addPathCallbacks(
new StringFilterGroup(null, "|shorts_like_button.eml"),
new StringFilterGroup(null, "|shorts_dislike_button.eml")
new StringFilterGroup(null, "|shorts_like_button.e"),
new StringFilterGroup(null, "|shorts_dislike_button.e")
);
// After the button identifiers is binary data and then the video id for that specific short.

View file

@ -19,12 +19,12 @@ import app.revanced.extension.youtube.shared.PlayerType;
@SuppressWarnings("unused")
public final class ShortsFilter extends Filter {
private static final boolean HIDE_SHORTS_NAVIGATION_BAR = Settings.HIDE_SHORTS_NAVIGATION_BAR.get();
private static final String REEL_CHANNEL_BAR_PATH = "reel_channel_bar.eml";
private static final String REEL_CHANNEL_BAR_PATH = "reel_channel_bar.e";
/**
* For paid promotion label and subscribe button that appears in the channel bar.
*/
private static final String REEL_METAPANEL_PATH = "reel_metapanel.eml";
private static final String REEL_METAPANEL_PATH = "reel_metapanel.e";
/**
* Tags that appears when opening the Shorts player.
@ -75,7 +75,7 @@ public final class ShortsFilter extends Filter {
// Use a different filter group for this pattern, as it requires an additional check after matching.
shelfHeader = new StringFilterGroup(
null,
"shelf_header.eml"
"shelf_header.e"
);
addIdentifierCallbacks(shortsIdentifiers, shelfHeader);
@ -86,11 +86,11 @@ public final class ShortsFilter extends Filter {
shortsCompactFeedVideo = new StringFilterGroup(null,
// Shorts that appear in the feed/search when the device is using tablet layout.
"compact_video.eml",
// 'video_lockup_with_attachment.eml' is shown instead of 'compact_video.eml' for some users
"video_lockup_with_attachment.eml",
"compact_video.e",
// 'video_lockup_with_attachment.e' is shown instead of 'compact_video.e' for some users
"video_lockup_with_attachment.e",
// Search results that appear in a horizontal shelf.
"video_card.eml");
"video_card.e");
// Filter out items that use the 'frame0' thumbnail.
// This is a valid thumbnail for both regular videos and Shorts,
@ -135,31 +135,31 @@ public final class ShortsFilter extends Filter {
StringFilterGroup stickers = new StringFilterGroup(
Settings.HIDE_SHORTS_STICKERS,
"stickers_layer.eml"
"stickers_layer.e"
);
StringFilterGroup likeFountain = new StringFilterGroup(
Settings.HIDE_SHORTS_LIKE_FOUNTAIN,
"like_fountain.eml"
"like_fountain.e"
);
StringFilterGroup likeButton = new StringFilterGroup(
Settings.HIDE_SHORTS_LIKE_BUTTON,
"shorts_like_button.eml",
"reel_like_button.eml"
"shorts_like_button.e",
"reel_like_button.e"
);
StringFilterGroup dislikeButton = new StringFilterGroup(
Settings.HIDE_SHORTS_DISLIKE_BUTTON,
"shorts_dislike_button.eml",
"reel_dislike_button.eml"
"shorts_dislike_button.e",
"reel_dislike_button.e"
);
StringFilterGroup previewComment = new StringFilterGroup(
Settings.HIDE_SHORTS_PREVIEW_COMMENT,
// Preview comment that can popup while a Short is playing.
// Uses no bundled icons, and instead the users profile photo is shown.
"participation_bar.eml"
"participation_bar.e"
);
joinButton = new StringFilterGroup(
@ -174,20 +174,20 @@ public final class ShortsFilter extends Filter {
paidPromotionButton = new StringFilterGroup(
Settings.HIDE_PAID_PROMOTION_LABEL,
"reel_player_disclosure.eml"
"reel_player_disclosure.e"
);
shortsActionBar = new StringFilterGroup(
null,
"shorts_action_bar.eml",
"reel_action_bar.eml"
"shorts_action_bar.e",
"reel_action_bar.e"
);
useSoundButton = new StringFilterGroup(
Settings.HIDE_SHORTS_USE_SOUND_BUTTON,
// First filter needed for "Use this sound" that can appear when viewing Shorts
// through the "Short remixing this video" section.
"floating_action_button.eml",
"floating_action_button.e",
// Second filter needed for "Use this sound" that can appear below the video title.
REEL_METAPANEL_PATH
);
@ -215,12 +215,12 @@ public final class ShortsFilter extends Filter {
// shorts_video_action_button.eml
// reel_action_button.eml
// reel_pivot_button.eml
"button.eml"
"button.e"
);
suggestedAction = new StringFilterGroup(
null,
"suggested_action.eml"
"suggested_action.e"
);
addPathCallbacks(

View file

@ -18,28 +18,20 @@ public class SpoofVideoStreamsPatch {
* Injection point.
*/
public static void setClientOrderToUse() {
final boolean forceAVC = Settings.FORCE_AVC_CODEC.get();
// VR 1.61 uses VP9/AV1, and cannot force AVC.
ClientType client = Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
if (forceAVC && client == ANDROID_VR_1_61_48) {
client = ANDROID_VR_1_43_32; // Use VR 1.43 instead.
if (Settings.FORCE_AVC_CODEC.get() && client == ANDROID_VR_1_61_48) {
// VR 1.61 uses VP9/AV1, and cannot force AVC. Use 1.43 instead.
client = ANDROID_VR_1_43_32;
}
List<ClientType> availableClients = forceAVC
? List.of(
List<ClientType> availableClients = List.of(
ANDROID_VR_1_43_32,
VISIONOS,
ANDROID_CREATOR,
ANDROID_VR_1_61_48,
IPADOS)
: List.of(
ANDROID_VR_1_61_48,
VISIONOS,
ANDROID_CREATOR,
ANDROID_VR_1_43_32,
IPADOS
);
IPADOS);
app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse(
availableClients, client);

View file

@ -359,7 +359,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting EXTERNAL_BROWSER = new BooleanSetting("revanced_external_browser", TRUE, true);
public static final BooleanSetting SPOOF_DEVICE_DIMENSIONS = new BooleanSetting("revanced_spoof_device_dimensions", FALSE, true,
"revanced_spoof_device_dimensions_user_dialog_message");
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS));
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_43_32, true, parent(SPOOF_VIDEO_STREAMS));
public static final BooleanSetting DEBUG_PROTOBUFFER = new BooleanSetting("revanced_debug_protobuffer", FALSE, false,
"revanced_debug_protobuffer_user_dialog_message", parent(BaseSettings.DEBUG));

View file

@ -83,12 +83,17 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
String summary = str("revanced_spoof_video_streams_about_no_audio_tracks");
switch (clientType) {
case ANDROID_VR_1_61_48 ->
summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume");
case ANDROID_CREATOR ->
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1")
+ '\n' + str("revanced_spoof_video_streams_about_no_stable_volume")
+ '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio");
summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume")
+ '\n' + str("revanced_spoof_video_streams_about_no_av1")
+ '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio");
case ANDROID_VR_1_43_32 ->
summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume")
+ '\n' + str("revanced_spoof_video_streams_about_no_av1");
case ANDROID_VR_1_61_48 ->
summary = str("revanced_spoof_video_streams_about_dropped_frames")
+ '\n' + summary
+ '\n' + str("revanced_spoof_video_streams_about_no_stable_volume");
case IPADOS ->
summary = str("revanced_spoof_video_streams_about_playback_failure")
+ '\n' + str("revanced_spoof_video_streams_about_no_av1");