From 09072bb0908a44b45588d7571a47413dcddb7fba Mon Sep 17 00:00:00 2001 From: aricloverEXTRA <157071384+aricloverEXTRA@users.noreply.github.com> Date: Wed, 1 Jul 2026 13:20:41 -0500 Subject: [PATCH] Update uYouPlus.xm Reinstate other changes, previous commit was not by me, it was automated --- Sources/uYouPlus.xm | 1059 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1059 insertions(+) diff --git a/Sources/uYouPlus.xm b/Sources/uYouPlus.xm index aed1d4e..1fc80a3 100644 --- a/Sources/uYouPlus.xm +++ b/Sources/uYouPlus.xm @@ -995,4 +995,1063 @@ static NSMutableArray *filteredArray(NSArray (self, "_previousButtonView").backgroundColor = nil; + MSHookIvar(self, "_nextButtonView").backgroundColor = nil; + MSHookIvar(self, "_seekBackwardAccessibilityButtonView").backgroundColor = nil; + MSHookIvar(self, "_seekForwardAccessibilityButtonView").backgroundColor = nil; + MSHookIvar(self, "_playPauseButton").backgroundColor = nil; +} +%end +%end + +// Bring back the Red Progress Bar and Gray Buffer Progress +%group gRedProgressBar +%hook YTSegmentableInlinePlayerBarView +- (void)setBufferedProgressBarColor:(id)arg1 { + [UIColor colorWithRed:1.00 green:1.00 blue:1.00 alpha:0.50]; +} +%end + +%hook YTInlinePlayerBarContainerView // Red Progress Bar - Old (Compatible for v17.33.2-v19.10.7) - Planned for removal ⚠️ +- (id)quietProgressBarColor { + return [UIColor redColor]; +} +%end + +%hook YTPlayerBarRectangleDecorationView // Red Progress Bar - New (Compatible for v19.10.7-latest) +- (void)drawRectangleDecorationWithSideMasks:(CGRect)rect { + if (IS_ENABLED(kRedProgressBar)) { + YTIPlayerBarDecorationModel *model = [self valueForKey:@"_model"]; + int overlayMode = model.playingState.overlayMode; + model.playingState.overlayMode = 1; + %orig; + model.playingState.overlayMode = overlayMode; + } else + %orig; +} +%end +%end + +// Disable the right panel in fullscreen mode +%hook YTColdConfig +- (BOOL)isLandscapeEngagementPanelEnabled { + return IS_ENABLED(kHideRightPanel) ? NO : %orig; +} +%end + +// Shorts Quality Picker - @arichornlover +%group gShortsQualityPicker +%hook YTHotConfig +- (BOOL)enableOmitAdvancedMenuInShortsVideoQualityPicker { return YES; } +- (BOOL)enableShortsVideoQualityPicker { return YES; } +- (BOOL)iosEnableImmersiveLivePlayerVideoQuality { return YES; } +- (BOOL)iosEnableShortsPlayerVideoQuality { return YES; } +- (BOOL)iosEnableShortsPlayerVideoQualityRestartVideo { return YES; } +- (BOOL)iosEnableSimplerTitleInShortsVideoQualityPicker { return YES; } +%end +%end + +// YTShortsProgress - https://github.com/PoomSmart/YTShortsProgress/ +%hook YTShortsPlayerViewController +- (BOOL)shouldAlwaysEnablePlayerBar { return YES; } +- (BOOL)shouldEnablePlayerBarOnlyOnPause { return NO; } +%end + +%hook YTReelPlayerViewController +- (BOOL)shouldAlwaysEnablePlayerBar { return YES; } +- (BOOL)shouldEnablePlayerBarOnlyOnPause { return NO; } +%end + +%hook YTReelPlayerViewControllerSub +- (BOOL)shouldAlwaysEnablePlayerBar { return YES; } +- (BOOL)shouldEnablePlayerBarOnlyOnPause { return NO; } +%end + +%hook YTColdConfig +- (BOOL)iosEnableVideoPlayerScrubber { return YES; } +- (BOOL)mobileShortsTablnlinedExpandWatchOnDismiss { return YES; } +%end + +%hook YTHotConfig +- (BOOL)enablePlayerBarForVerticalVideoWhenControlsHiddenInFullscreen { return YES; } +%end + +// Hide Shorts Cells - LEGACY v1.2.3 - for uYou 3.0.4+ (PoomSmart/YTUnShorts) +%hook YTIElementRenderer +- (NSData *)elementData { + // Check if hideShortsCells is enabled + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"hideShortsCells"]) { + NSString *description = [self description]; + + BOOL hasShorts = ([description containsString:@"shorts_shelf"] || [description containsString:@"shorts_video_cell"] || [description containsString:@"shorts_grid_shelf_footer"] || [description containsString:@"youtube_shorts_24"]); + BOOL hasShortsInHistory = [description containsString:@"compact_video.eml"] && [description containsString:@"youtube_shorts_"]; + + if (hasShorts || hasShortsInHistory) { + return [NSData data]; + } + } + return %orig; +} +%end + +// Shorts Controls Overlay Options +%hook _ASDisplayView +- (void)didMoveToWindow { + %orig; + if ((IS_ENABLED(kHideBuySuperThanks)) && ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"])) { + self.hidden = YES; + } + +// Hide Header Links under Channel Profile - @arichornlover + if ((IS_ENABLED(kHideChannelHeaderLinks)) && ([self.accessibilityIdentifier isEqualToString:@"eml.channel_header_links"])) { + self.hidden = YES; + self.opaque = YES; + self.userInteractionEnabled = NO; + [self sizeToFit]; + [self.superview layoutIfNeeded]; + [self setNeedsLayout]; + [self removeFromSuperview]; + } + +// Completely Remove the Comment Section under the Video Player - @arichornlover + if ((IS_ENABLED(kHideCommentSection)) && ([self.accessibilityIdentifier isEqualToString:@"id.ui.comments_entry_point_teaser"] + || [self.accessibilityIdentifier isEqualToString:@"id.ui.comments_entry_point_simplebox"] + || [self.accessibilityIdentifier isEqualToString:@"id.ui.video_metadata_carousel"] + || [self.accessibilityIdentifier isEqualToString:@"id.ui.carousel_header"])) { + self.hidden = YES; + self.opaque = YES; + self.userInteractionEnabled = NO; + CGRect bounds = self.frame; + bounds.size.height = 0; + self.frame = bounds; + [self.superview layoutIfNeeded]; + [self setNeedsLayout]; + [self removeFromSuperview]; + } + +// Hide the Comment Section Previews under the Video Player - @arichornlover + if ((IS_ENABLED(kHidePreviewCommentSection)) && ([self.accessibilityIdentifier isEqualToString:@"id.ui.comments_entry_point_teaser"])) { + self.hidden = YES; + self.opaque = YES; + self.userInteractionEnabled = NO; + CGRect bounds = self.frame; + bounds.size.height = 0; + self.frame = bounds; + [self.superview layoutIfNeeded]; + [self setNeedsLayout]; + [self removeFromSuperview]; + } +} +%end + +%hook YTReelWatchRootViewController +- (void)setPausedStateCarouselView { + if (IS_ENABLED(kHideSubscriptions)) {} + else { return %orig; } +} +%end + +/* DISABLED DUE TO CONFLICTS +// Hide Community Posts - @michael-winay, @arichornlover, @iCrazeiOS @PoomSmart & @Dayanch96 +%hook YTIElementRenderer +- (NSData *)elementData { + NSString *description = [self description]; + if (IS_ENABLED(kHideCommunityPosts)) { + if ([description containsString:@"post_base_wrapper.eml"]) { + if (!cellDividerData) cellDividerData = [NSData dataWithBytes:cellDividerDataBytes length:cellDividerDataBytesLength]; + return cellDividerData; + } + } + return %orig; +} +%end +*/ + +// Red Subscribe Button + Hide the Button Containers under the Video Player - @arichornlover +// Hide the Button Containers under the Video Player - v20.02.3+ - @arichornlover +%hook ELMContainerNode +- (void)layoutSubviews { + %orig; + + NSString *desc = [self description]; + +// Red Subscribe Button - v20.02.3+ - @arichornlover + if ([desc containsString:@"eml.compact_subscribe_button"] && IS_ENABLED(kRedSubscribeButton)) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self applyRedColorToSubscribeButton:self]; + }); + } +// Hide the Button Containers under the Video Player - v20.02.3+ - @arichornlover + if (IS_ENABLED(kHideButtonContainers)) { + if ([desc containsString:@"id.video.like.button"] || + [desc containsString:@"id.video.dislike.button"] || + [desc containsString:@"id.video.share.button"] || + [desc containsString:@"id.video.remix.button"] || + [desc containsString:@"id.ui.add_to.offline.button"]) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self hideMatchingSubviews:self]; + }); + } + } +} +- (void)applyRedColorToSubscribeButton:(id)view { + if (!view) return; + + NSString *desc = [view description]; + if ([desc containsString:@"eml.compact_subscribe_button"]) { + if ([view respondsToSelector:@selector(setBackgroundColor:)]) { + [view setBackgroundColor:[UIColor redColor]]; + } + } + if ([view respondsToSelector:@selector(subviews)]) { + for (id subview in [view subviews]) { + [self applyRedColorToSubscribeButton:subview]; + } + } +} +- (void)hideMatchingSubviews:(id)view { + if (!view) return; + + if ([view respondsToSelector:@selector(subviews)]) { + for (id subview in [view subviews]) { + NSString *desc = [subview description]; + + if ([desc containsString:@"id.video.like.button"] || + [desc containsString:@"id.video.dislike.button"] || + [desc containsString:@"id.video.share.button"] || + [desc containsString:@"id.video.remix.button"] || + [desc containsString:@"id.ui.add_to.offline.button"]) { + if ([subview respondsToSelector:@selector(setHidden:)]) { + [subview setHidden:YES]; + } + } else { + [self hideMatchingSubviews:subview]; + } + } + } +} +%end + +// App Settings Overlay Options +%group gDisableAccountSection +%hook YTSettingsSectionItemManager +- (void)updateAccountSwitcherSectionWithEntry:(id)arg1 {} // Account +%end +%end + +%group gDisableAutoplaySection +%hook YTSettingsSectionItemManager +- (void)updateAutoplaySectionWithEntry:(id)arg1 {} // Autoplay +%end +%end + +%group gDisableTryNewFeaturesSection +%hook YTSettingsSectionItemManager +- (void)updatePremiumEarlyAccessSectionWithEntry:(id)arg1 {} // Try new features +%end +%end + +%group gDisableVideoQualityPreferencesSection +%hook YTSettingsSectionItemManager +- (void)updateVideoQualitySectionWithEntry:(id)arg1 {} // Video quality preferences +%end +%end + +%group gDisableNotificationsSection +%hook YTSettingsSectionItemManager +- (void)updateNotificationSectionWithEntry:(id)arg1 {} // Notifications +%end +%end + +%group gDisableManageAllHistorySection +%hook YTSettingsSectionItemManager +- (void)updateHistorySectionWithEntry:(id)arg1 {} // Manage all history +%end +%end + +%group gDisableYourDataInYouTubeSection +%hook YTSettingsSectionItemManager +- (void)updateYourDataSectionWithEntry:(id)arg1 {} // Your data in YouTube +%end +%end + +%group gDisablePrivacySection +%hook YTSettingsSectionItemManager +- (void)updatePrivacySectionWithEntry:(id)arg1 {} // Privacy +%end +%end + +%group gDisableLiveChatSection +%hook YTSettingsSectionItemManager +- (void)updateLiveChatSectionWithEntry:(id)arg1 {} // Live chat +%end +%end + +// Miscellaneous + +// Hide Home Tab - @bhackel +%group gHideHomeTab +%hook YTPivotBarView +- (void)setRenderer:(YTIPivotBarRenderer *)renderer { + // Iterate over each renderer item + NSLog(@"bhackel: setting renderer"); + NSUInteger indexToRemove = -1; + NSMutableArray *itemsArray = renderer.itemsArray; + NSLog(@"bhackel: starting loop"); + for (NSUInteger i = 0; i < itemsArray.count; i++) { + NSLog(@"bhackel: iterating index %lu", (unsigned long)i); + YTIPivotBarSupportedRenderers *item = itemsArray[i]; + // Check if this is the home tab button + NSLog(@"bhackel: checking identifier"); + YTIPivotBarItemRenderer *pivotBarItemRenderer = item.pivotBarItemRenderer; + NSString *pivotIdentifier = pivotBarItemRenderer.pivotIdentifier; + if ([pivotIdentifier isEqualToString:@"FEwhat_to_watch"]) { + NSLog(@"bhackel: removing home tab button"); + // Remove the home tab button + indexToRemove = i; + break; + } + } + if (indexToRemove != -1) { + [itemsArray removeObjectAtIndex:indexToRemove]; + } + %orig; +} +%end +%end + +// Auto-Hide Home Bar +%group gAutoHideHomeBar +%hook UIViewController +- (BOOL)prefersHomeIndicatorAutoHidden { + return YES; +} +%end +%end + +// YT startup animation +%hook YTColdConfig +- (BOOL)mainAppCoreClientIosEnableStartupAnimation { + return IS_ENABLED(kYTStartupAnimation) ? YES : NO; +} +%end + +// Disable hints +%group gDisableHints +%hook YTSettings +- (BOOL)areHintsDisabled { + return YES; +} +- (void)setHintsDisabled:(BOOL)arg1 { + %orig(YES); +} +%end +%hook YTUserDefaults +- (BOOL)areHintsDisabled { + return YES; +} +- (void)setHintsDisabled:(BOOL)arg1 { + %orig(YES); +} +%end +%end + +// Stick Navigation bar +%group gStickNavigationBar +%hook YTHeaderView +- (BOOL)stickyNavHeaderEnabled { return YES; } +%end +%end + +// Hide the Chip Bar (Upper Bar) in Home feed +%group gHideChipBar +%hook YTMySubsFilterHeaderView +- (void)setChipFilterView:(id)arg1 {} +%end + +%hook YTHeaderContentComboView +- (void)enableSubheaderBarWithView:(id)arg1 {} +%end + +%hook YTHeaderContentComboView +- (void)setFeedHeaderScrollMode:(int)arg1 { + %orig(0); +} +%end + +// Hide the chip bar under the video player? +// %hook YTChipCloudCell +// - (void)didMoveToWindow { +// %orig; +// self.hidden = YES; +// } +// %end +%end + +// Hide "Play next in queue" - qnblackcat/uYouPlus#1138 +%hook YTMenuItemVisibilityHandler +- (BOOL)shouldShowServiceItemRenderer:(YTIMenuConditionalServiceItemRenderer *)renderer { + if (IS_ENABLED(kHidePlayNextInQueue) && renderer.icon.iconType == YT_QUEUE_PLAY_NEXT) { + return NO; + } + return %orig; +} +%end + +%hook YTMenuItemVisibilityHandlerImpl +- (BOOL)shouldShowServiceItemRenderer:(YTIMenuConditionalServiceItemRenderer *)renderer { + if (IS_ENABLED(kHidePlayNextInQueue) && renderer.icon.iconType == YT_QUEUE_PLAY_NEXT) { + return NO; + } + return %orig; +} +%end + +// Hide the Videos under the Video Player - @Dayanch96 & @arichornlover +%group gNoRelatedWatchNexts +%hook YTWatchNextResultsViewController +- (void)setVisibleSections:(NSInteger)arg1 { + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { + // doesn't hide Videos under the Video Player if iPad is in Landscape mode to prevent conflicts + return; + } else { + arg1 = 1; + %orig(arg1); + } +} +%end +%end + +// Hide Videos when in Fullscreen - @arichornlover +%group gNoVideosInFullscreen +%hook YTFullScreenEngagementOverlayView +- (void)setRelatedVideosView:(id)view { +} +- (void)updateRelatedVideosViewSafeAreaInsets { +} +- (id)relatedVideosView { + return nil; +} +%end + +%hook YTFullScreenEngagementOverlayController +- (void)setRelatedVideosVisible:(BOOL)visible { +} +- (BOOL)relatedVideosPeekingEnabled { + return NO; +} +%end +%end + +// iPhone Layout - @arichornlover +%group giPhoneLayout +%hook UIDevice +- (UIUserInterfaceIdiom)userInterfaceIdiom { + return UIUserInterfaceIdiomPhone; +} +%end +%hook UIStatusBarStyleAttributes +- (long long)idiom { + return YES; +} +%end +%hook UIKBTree +- (long long)nativeIdiom { + if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) { + return NO; + } else { + return YES; + } +} +%end +%hook UIKBRenderer +- (long long)assetIdiom { + if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) { + return NO; + } else { + return YES; + } +} +%end +%end + +// Hide Indicators - @Dayanch96 & @arichornlover +%group gHideSubscriptionsNotificationBadge +%hook YTPivotBarIndicatorView +- (void)didMoveToWindow { + [self setHidden:YES]; + %orig(); +} +- (void)setFillColor:(id)arg1 { + %orig([UIColor clearColor]); +} +- (void)setBorderColor:(id)arg1 { + %orig([UIColor clearColor]); +} +%end +%hook YTCountView +- (void)layoutSubviews { + %orig; + self.hidden = YES; +} +%end +%end + +# pragma mark - ctor +%ctor { + // Load uYou first so its functions are available for hooks. + // dlopen([[NSString stringWithFormat:@"%@/Frameworks/uYou.dylib", [[NSBundle mainBundle] bundlePath]] UTF8String], RTLD_LAZY); + + %init; +/* + if (IS_ENABLED(kSettingsStyle_enabled)) { + %init(gSettingsStyle); + } +*/ + if (IS_ENABLED(kHideYouTubeLogo)) { + %init(gHideYouTubeLogo); + } + if (IS_ENABLED(kCenterYouTubeLogo)) { + %init(gCenterYouTubeLogo); + } + if (IS_ENABLED(kHideSubscriptionsNotificationBadge)) { + %init(gHideSubscriptionsNotificationBadge); + } + if (IS_ENABLED(kHidePreviousAndNextButton)) { + %init(gHidePreviousAndNextButton); + } + if (IS_ENABLED(kHideOverlayDarkBackground)) { + %init(gHideOverlayDarkBackground); + } + if (IS_ENABLED(kHideVideoPlayerShadowOverlayButtons)) { + %init(gHideVideoPlayerShadowOverlayButtons); + } + if (IS_ENABLED(kDisableHints)) { + %init(gDisableHints); + } + if (IS_ENABLED(kRedProgressBar)) { + %init(gRedProgressBar); + } + if (IS_ENABLED(kStickNavigationBar)) { + %init(gStickNavigationBar); + } + if (IS_ENABLED(kHideChipBar)) { + %init(gHideChipBar); + } + if (IS_ENABLED(kShowNotificationsTab)) { + %init(gShowNotificationsTab); + } + if (IS_ENABLED(kPortraitFullscreen)) { + %init(gPortraitFullscreen); + } + if (IS_ENABLED(kFullscreenToTheRight)) { + %init(gFullscreenToTheRight); + } + if (IS_ENABLED(kDisableFullscreenButton)) { + %init(gHideFullscreenButton); + } + if (IS_ENABLED(kHideFullscreenActions)) { + %init(hideFullscreenActions); + } + if (IS_ENABLED(kiPhoneLayout) && (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)) { + %init(giPhoneLayout); + } + if (IS_ENABLED(kStockVolumeHUD)) { + %init(gStockVolumeHUD); + } + if (IS_ENABLED(kHideHeatwaves)) { + %init(gHideHeatwaves); + } + if (IS_ENABLED(kHideRelatedWatchNexts)) { + %init(gNoRelatedWatchNexts); + } + if (IS_ENABLED(kHideVideosInFullscreen)) { + %init(gNoVideosInFullscreen); + } + if (IS_ENABLED(kClassicVideoPlayer)) { + %init(gClassicVideoPlayer); + } + if (IS_ENABLED(kDisableAmbientMode)) { + %init(gDisableAmbientMode); + } + if (IS_ENABLED(kDisableAccountSection)) { + %init(gDisableAccountSection); + } + if (IS_ENABLED(kDisableAutoplaySection)) { + %init(gDisableAutoplaySection); + } + if (IS_ENABLED(kDisableTryNewFeaturesSection)) { + %init(gDisableTryNewFeaturesSection); + } + if (IS_ENABLED(kDisableVideoQualityPreferencesSection)) { + %init(gDisableVideoQualityPreferencesSection); + } + if (IS_ENABLED(kDisableNotificationsSection)) { + %init(gDisableNotificationsSection); + } + if (IS_ENABLED(kDisableManageAllHistorySection)) { + %init(gDisableManageAllHistorySection); + } + if (IS_ENABLED(kDisableYourDataInYouTubeSection)) { + %init(gDisableYourDataInYouTubeSection); + } + if (IS_ENABLED(kDisablePrivacySection)) { + %init(gDisablePrivacySection); + } + if (IS_ENABLED(kDisableLiveChatSection)) { + %init(gDisableLiveChatSection); + } + if (IS_ENABLED(kYTTapToSeek)) { + %init(gYTTapToSeek); + } + if (IS_ENABLED(kHidePremiumPromos)) { + %init(gHidePremiumPromos); + } + if (IS_ENABLED(kDisablePullToFull)) { + %init(gDisablePullToFull); + } + if (IS_ENABLED(kAdBlockWorkaroundLite)) { + %init(uYouAdBlockingWorkaroundLite); + } + if (IS_ENABLED(kAdBlockWorkaround)) { + %init(uYouAdBlockingWorkaround); + } + if (IS_ENABLED(kHideHomeTab)) { + %init(gHideHomeTab); + } + if (IS_ENABLED(kAutoHideHomeBar)) { + %init(gAutoHideHomeBar); + } + if (IS_ENABLED(kShortsQualityPicker)) { + %init(gShortsQualityPicker); + } + if (IS_ENABLED(kFixCasting)) { + %init(gFixCasting); + } + + // Change the default value of some options + NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; + if (![allKeys containsObject:kHidePlayNextInQueue]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kHidePlayNextInQueue]; + } + if (![allKeys containsObject:@"relatedVideosAtTheEndOfYTVideos"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"]; + } + if (![allKeys containsObject:@"shortsProgressBar"]) { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"shortsProgressBar"]; + } + if (![allKeys containsObject:@"RYD-ENABLED"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"]; + } + if (![allKeys containsObject:@"YouPiPEnabled"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"YouPiPEnabled"]; + } + if (![allKeys containsObject:kReplaceYTDownloadWithuYou]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kReplaceYTDownloadWithuYou]; + } + if (![allKeys containsObject:kAdBlockWorkaroundLite]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kAdBlockWorkaroundLite]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kAdBlockWorkaround]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"removeYouTubeAds"]; + } + if (![allKeys containsObject:kAdBlockWorkaround]) { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:kAdBlockWorkaroundLite]; + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kAdBlockWorkaround]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"removeYouTubeAds"]; + } + // Broken uYou 3.0.3 setting: No Suggested Videos at The Video End + // Set default to allow autoplay, user can disable later + if (![allKeys containsObject:@"noSuggestedVideoAtEnd"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"noSuggestedVideoAtEnd"]; + } + // Broken uYou 3.0.2 setting: Playback Speed Controls + // Set default to disabled on iPads + if (![allKeys containsObject:@"showPlaybackRate"]) { + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"showPlaybackRate"]; + } else { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"showPlaybackRate"]; + } + } + // Set video casting fix default to enabled + if (![allKeys containsObject:@"fixCasting_enabled"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kFixCasting]; + } + // Set new grouped settings UI to default enabled + if (![allKeys containsObject:@"newSettingsUI_enabled"]) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kNewSettingsUI]; + } +}