From bd10c43bfbfccae1672e34cf67c33ce166abac1c Mon Sep 17 00:00:00 2001 From: arichorn <78001398+arichorn@users.noreply.github.com> Date: Mon, 10 Jul 2023 00:10:13 -0500 Subject: [PATCH] Refreshed Branch the reason for the branch refresh was to completely add new submodules/tweaks that were made by PoomSmart. --- Bundles/YouMute.bundle | 1 + Header.h | 20 +- SECURITY.md | 18 + Settings.xm | 1151 ++++++++++++++++++++++++- Source/LowContrastMode.swift | 43 + Source/LowContrastMode.xm | 1097 ++++++++++++++++++++++++ Source/VersionSpoofer.xm | 1526 ++++++++++++++++++++++++++++++++++ control | 4 +- uYouPlus.xm | 613 ++++++++++++-- 9 files changed, 4376 insertions(+), 97 deletions(-) create mode 100644 Bundles/YouMute.bundle create mode 100644 SECURITY.md create mode 100644 Source/LowContrastMode.swift create mode 100644 Source/LowContrastMode.xm create mode 100644 Source/VersionSpoofer.xm diff --git a/Bundles/YouMute.bundle b/Bundles/YouMute.bundle new file mode 100644 index 0000000..00a309f --- /dev/null +++ b/Bundles/YouMute.bundle @@ -0,0 +1 @@ +../Tweaks/YTUHD/layout/Library/Application Support/YouMute.bundle \ No newline at end of file diff --git a/Header.h b/Header.h index e17c08a..ba466dd 100644 --- a/Header.h +++ b/Header.h @@ -1,5 +1,6 @@ #import "Tweaks/YouTubeHeader/YTAppDelegate.h" #import "Tweaks/YouTubeHeader/YTPlayerViewController.h" +#import "Tweaks/YouTubeHeader/YTQTMButton.h" #import #import #import @@ -15,6 +16,7 @@ #import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h" #import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h" #import "Tweaks/YouTubeHeader/YTIBrowseRequest.h" +#import "Tweaks/YouTubeHeader/YTColorPalette.h" #import "Tweaks/YouTubeHeader/YTCommonColorPalette.h" #import "Tweaks/YouTubeHeader/ASCollectionView.h" #import "Tweaks/YouTubeHeader/YTPlayerOverlay.h" @@ -24,6 +26,11 @@ #import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h" #import "Tweaks/YouTubeHeader/YTAlertView.h" #import "Tweaks/YouTubeHeader/YTISectionListRenderer.h" +#import "Tweaks/YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h" +#import "Tweaks/YouTubeHeader/YTPivotBarItemView.h" +#import "Tweaks/YouTubeHeader/YTVideoWithContextNode.h" // YouTube-X +#import "Tweaks/YouTubeHeader/ELMCellNode.h" // YouTube-X +#import "Tweaks/YouTubeHeader/ELMNodeController.h" // YouTube-X #define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil] #define YT_BUNDLE_ID @"com.google.ios.youtube" @@ -62,6 +69,9 @@ @interface boolSettingsVC : UIViewController @end +@interface YTPlaybackButton : UIControl +@end + @interface PlayerManager : NSObject - (float)progress; @end @@ -74,6 +84,12 @@ @property UIButton *downloadsButton; @end +// Buttons +@interface YTRightNavigationButtons : UIView +@property YTQTMButton *notificationButton; +@property YTQTMButton *sponsorBlockButton; +@end + // YTSpeed @interface YTVarispeedSwitchControllerOption : NSObject - (id)initWithTitle:(id)title rate:(float)rate; @@ -118,7 +134,6 @@ @property(nonatomic, strong) id downloadsVC; @end - // BigYTMiniPlayer @interface YTMainAppVideoPlayerOverlayView : UIView - (UIViewController *)_viewControllerForAncestor; @@ -130,9 +145,6 @@ // YTAutoFullScreen @interface YTPlayerViewController (YTAFS) - (void)autoFullscreen; -// DontEatMycontent -- (id)activeVideoPlayerOverlay; -- (id)playerView; // YTSpeed @property id activeVideo; @property float playbackRate; diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..7aed3fd --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,18 @@ +# Policy +If I verify a reported security vulnerability, my policy is: + +- I will patch the current release branch, as well as the immediate prior minor release branch. + +- After patching the release branches, I will immediately issue new security fix releases for each patched release branch along with LTS release branches. + +## Supported Versions + +these versions of the project are +currently being supported with security/feature updates. + +| Version | Supported | +| ------- | ------------------ | +| [latest](https://github.com/arichorn/uYouPlusExtra/releases/latest) | :white_check_mark: | +| [18.14.1-3.0 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v18.14.1-3.0-F2) | ✅ | +| [17.49.6-2.3.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v17.49.6-2.3.1-F4) | ✅ | +| [16.42.3-2.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v16.42.3-2.1-F18) | ❌ | diff --git a/Settings.xm b/Settings.xm index 7ff5dd9..865e4e3 100644 --- a/Settings.xm +++ b/Settings.xm @@ -12,6 +12,12 @@ static BOOL IsEnabled(NSString *key) { static int GetSelection(NSString *key) { return [[NSUserDefaults standardUserDefaults] integerForKey:key]; } +static int colorContrastMode() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcmColor"]; +} +static int appVersionSpoofer() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"]; +} static const NSInteger uYouPlusSection = 500; @interface YTSettingsSectionItemManager (uYouPlus) @@ -52,19 +58,19 @@ extern NSBundle *uYouPlusBundle(); accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { - return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/qnblackcat/uYouPlus/releases/latest"]]; + return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/arichorn/uYouPlusExtra/releases/latest"]]; }]; [sectionItems addObject:version]; # pragma mark - VideoPlayer YTSettingsSectionItem *videoPlayerGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"VIDEO_PLAYER_OPTIONS") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ - [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_DOUBLE_TAP_TO_SEEK") - titleDescription:LOC(@"DISABLE_DOUBLE_TAP_TO_SEEK_DESC") + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Disable tap to skip") + titleDescription:LOC(@"Disable tap to skip functions in the video player. App restart is required.") accessibilityIdentifier:nil - switchOn:IsEnabled(@"doubleTapToSeek_disabled") + switchOn:IsEnabled(@"tapToSkip_enabled") switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { - [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"doubleTapToSeek_disabled"]; + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"tapToSkip_enabled"]; return YES; } settingItemId:0], @@ -108,8 +114,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - - ]; + ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_PLAYER_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; @@ -168,6 +173,16 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Shadow Overlay Buttons") + titleDescription:LOC(@"Hide the Shadow Overlay on the Play/Pause, Previous, Next, Forward & Rewind Buttons.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideVideoPlayerShadowOverlayButtons_enabled"]; + return YES; + } + settingItemId:0], [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON") titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC") @@ -218,7 +233,37 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - ]; + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DONT_EAT_MY_CONTENT") + titleDescription:LOC(@"DONT_EAT_MY_CONTENT_DESC") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"dontEatMyContent_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"dontEatMyContent_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Heatwaves") + titleDescription:LOC(@"Should hide the Heatwaves in the video player. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideHeatwaves_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHeatwaves_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide Dark Overlay Background") + titleDescription:LOC(@"Hide video player's dark overlay background.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideOverlayDarkBackground_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideOverlayDarkBackground_enabled"]; + return YES; + } + settingItemId:0] + ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VIDEO_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; @@ -247,7 +292,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"DISABLE_RESUME_TO_SHORTS") titleDescription:LOC(@"DISABLE_RESUME_TO_SHORTS_DESC") accessibilityIdentifier:nil @@ -256,13 +301,990 @@ extern NSBundle *uYouPlusBundle(); [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableResumeToShorts"]; return YES; } - settingItemId:0], - ]; + settingItemId:0] + ]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"SHORTS_CONTROLS_OVERLAY_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; }]; [sectionItems addObject:shortsControlOverlayGroup]; + + # pragma mark - LowContrastMode + YTSettingsSectionItem *lowContrastModeSection = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Low contrast text color") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + switch (colorContrastMode()) { + case 1: + return LOC(@"Red UI"); + case 2: + return LOC(@"Blue UI"); + case 3: + return LOC(@"Green UI"); + case 4: + return LOC(@"Yellow UI"); + case 5: + return LOC(@"Orange UI"); + case 6: + return LOC(@"Purple UI"); + case 7: + return LOC(@"Violet UI"); + case 8: + return LOC(@"Pink UI"); + case 0: + default: + return LOC(@"Default UI"); + } + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Default UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Red UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Blue UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Green UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Yellow UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Orange UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Purple UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:6 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Violet UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:7 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Pink UI") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:8 forKey:@"lcmColor"]; + [settingsViewController reloadData]; + return YES; + }] + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Low contrast text color") pickerSectionTitle:nil rows:rows selectedItemIndex:colorContrastMode() parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + +# pragma mark - VersionSpoofer + YTSettingsSectionItem *versionSpooferSection = [YTSettingsSectionItemClass itemWithTitle:@"Version Spoofer Picker" + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + switch (appVersionSpoofer()) { + case 1: + return @"v18.22.9"; + case 2: + return @"v18.21.3"; + case 3: + return @"v18.20.3"; + case 4: + return @"v18.19.1"; + case 5: + return @"v18.18.2"; + case 6: + return @"v18.17.2"; + case 7: + return @"v18.16.2"; + case 8: + return @"v18.15.1"; + case 9: + return @"v18.14.1"; + case 10: + return @"v18.13.4"; + case 11: + return @"v18.12.2"; + case 12: + return @"v18.11.2"; + case 13: + return @"v18.10.1"; + case 14: + return @"v18.09.4"; + case 15: + return @"v18.08.1"; + case 16: + return @"v18.07.5"; + case 17: + return @"v18.05.2"; + case 18: + return @"v18.04.3"; + case 19: + return @"v18.03.3"; + case 20: + return @"v18.02.03"; + case 21: + return @"v18.01.6"; + case 22: + return @"v18.01.4"; + case 23: + return @"v18.01.2"; + case 24: + return @"v17.49.6"; + case 25: + return @"v17.49.4"; + case 26: + return @"v17.46.4"; + case 27: + return @"v17.45.1"; + case 28: + return @"v17.44.4"; + case 29: + return @"v17.43.1"; + case 30: + return @"v17.42.7"; + case 31: + return @"v17.42.6"; + case 32: + return @"v17.41.2"; + case 33: + return @"v17.40.5"; + case 34: + return @"v17.39.4"; + case 35: + return @"v17.38.10"; + case 36: + return @"v17.37.2"; + case 37: + return @"v17.36.4"; + case 38: + return @"v17.36.3"; + case 39: + return @"v17.35.3"; + case 40: + return @"v17.34.3"; + case 41: + return @"v17.33.2"; + case 42: + return @"v17.32.2"; + case 43: + return @"v17.31.4"; + case 44: + return @"v17.30.3"; + case 45: + return @"v17.30.1"; + case 46: + return @"v17.29.3"; + case 47: + return @"v17.29.2"; + case 48: + return @"v17.28.2"; + case 49: + return @"v17.26.2"; + case 50: + return @"v17.25.1"; + case 51: + return @"v17.24.4"; + case 52: + return @"v17.23.6"; + case 53: + return @"v17.22.3"; + case 54: + return @"v17.21.3"; + case 55: + return @"v17.20.3"; + case 56: + return @"v17.19.3"; + case 57: + return @"v17.19.2"; + case 58: + return @"v17.18.4"; + case 59: + return @"v17.17.4"; + case 60: + return @"v17.16.4"; + case 61: + return @"v17.15.2"; + case 62: + return @"v17.15.1"; + case 63: + return @"v17.14.2"; + case 64: + return @"v17.13.3"; + case 65: + return @"v17.12.5"; + case 66: + return @"v17.12.4"; + case 67: + return @"v17.11.2"; + case 68: + return @"v17.10.2"; + case 69: + return @"v17.09.1"; + case 70: + return @"v17.08.2"; + case 71: + return @"v17.07.2"; + case 72: + return @"v17.06.3"; + case 73: + return @"v17.05.2"; + case 74: + return @"v17.04.3"; + case 75: + return @"v17.03.3"; + case 76: + return @"v17.03.2"; + case 77: + return @"v17.01.4"; + case 78: + return @"v16.46.5"; + case 79: + return @"v16.46.4"; + case 80: + return @"v16.45.4"; + case 81: + return @"v16.44.5"; + case 82: + return @"v16.44.4"; + case 83: + return @"v16.43.2"; + case 84: + return @"v16.42.3"; + case 85: + return @"v16.41.2"; + case 86: + return @"v16.40.3"; + case 87: + return @"v16.39.6"; + case 88: + return @"v16.38.2"; + case 89: + return @"v16.37.3"; + case 90: + return @"v16.36.4"; + case 91: + return @"v16.35.5"; + case 92: + return @"v16.35.4"; + case 93: + return @"v16.34.7"; + case 94: + return @"v16.34.3"; + case 95: + return @"v16.33.3"; + case 96: + return @"v16.32.6"; + case 97: + return @"v16.31.4"; + case 98: + return @"v16.30.2"; + case 99: + return @"v16.29.4"; + case 100: + return @"v16.28.2"; + case 101: + return @"v16.27.3"; + case 102: + return @"v16.26.6"; + case 103: + return @"v16.25.2"; + case 104: + return @"v16.24.2"; + case 105: + return @"v16.23.3"; + case 106: + return @"v16.23.2"; + case 107: + return @"v16.22.5"; + case 108: + return @"v16.20.5"; + case 109: + return @"v16.19.6"; + case 110: + return @"v16.18.5"; + case 111: + return @"v16.17.4"; + case 112: + return @"v16.16.4"; + case 113: + return @"v16.16.3"; + case 114: + return @"v16.15.4"; + case 115: + return @"v16.14.2"; + case 116: + return @"v16.13.1"; + case 117: + return @"v16.12.3"; + case 118: + return @"v16.11.3"; + case 119: + return @"v16.10.3"; + case 120: + return @"v16.09.3"; + case 121: + return @"v16.09.2"; + case 122: + return @"v16.08.2"; + case 123: + return @"v16.05.9"; + case 124: + return @"v16.05.8"; + case 125: + return @"v16.05.7"; + case 0: + default: + return @"v18.23.3"; + } + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.23.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.22.9" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.21.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:2 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.20.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:3 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.19.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:4 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.18.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:5 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.17.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:6 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.16.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:7 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.15.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:8 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.14.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:9 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.13.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:10 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.12.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:11 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.11.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:12 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.10.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:13 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.09.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:14 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.08.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:15 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.07.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:16 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.05.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:17 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.04.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:18 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.03.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:19 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.02.03" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:20 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.01.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:21 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.01.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:22 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v18.01.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:23 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.49.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:24 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.49.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:25 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.46.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:26 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.45.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:27 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.44.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:28 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.43.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:29 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.42.7" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:30 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.42.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:31 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.41.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:32 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.40.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:33 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.39.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:34 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.38.10" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:35 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.37.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:36 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.36.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:37 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.36.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:38 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.35.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:39 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.34.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:40 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.33.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:41 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.32.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:42 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.31.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:43 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.30.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:44 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.30.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:45 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.29.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:46 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.29.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:47 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.28.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:48 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.26.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:49 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.25.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:50 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.24.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:51 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.23.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:52 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.22.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:53 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.21.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:54 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.20.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:55 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.19.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:56 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.19.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:57 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.18.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:58 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.17.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:59 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.16.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:60 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.15.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:61 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.15.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:62 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.14.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:63 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.13.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:64 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.12.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:65 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.12.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:66 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.11.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:67 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.10.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:68 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.09.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:69 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.08.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:70 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.07.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:71 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.06.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:72 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.05.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:73 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.04.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:74 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.03.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:75 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.03.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:76 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v17.01.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:77 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.46.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:78 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.46.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:79 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.45.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:80 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.44.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:81 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.44.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:82 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.43.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:83 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.42.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:84 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.41.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:85 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.40.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:86 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.39.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:87 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.38.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:88 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.37.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:89 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.36.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:90 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.35.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:91 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.35.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:92 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.34.7" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:93 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.34.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:94 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.33.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:95 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.32.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:96 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.31.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:97 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.30.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:98 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.29.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:99 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.28.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:100 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.27.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:101 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.26.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:102 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.25.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:103 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.24.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:104 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.23.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:105 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.23.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:106 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.22.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:107 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.20.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:108 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.19.6" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:109 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.18.5" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:110 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.17.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:111 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.16.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:112 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.16.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:113 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.15.4" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:114 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.14.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:115 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.13.1" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:116 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.12.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:117 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.11.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:118 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.10.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:119 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.09.3" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:120 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.09.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:121 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.08.2" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:122 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.05.9" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:123 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.05.8" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:124 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:@"v16.05.7" titleDescription:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + [[NSUserDefaults standardUserDefaults] setInteger:125 forKey:@"versionSpoofer"]; + [settingsViewController reloadData]; + return YES; + }] + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Version Spoofer Picker") pickerSectionTitle:nil rows:rows selectedItemIndex:appVersionSpoofer() parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; # pragma mark - Theme YTSettingsSectionItem *themeGroup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"THEME_OPTIONS") @@ -304,8 +1326,17 @@ extern NSBundle *uYouPlusBundle(); [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"]; return YES; } - settingItemId:0] - ]; + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Low Contrast Mode") + titleDescription:LOC(@"this will Low Contrast texts and buttons just like how the old YouTube Interface did. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"lowContrastMode_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"lowContrastMode_enabled"]; + return YES; + } + settingItemId:0], lowContrastModeSection]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"THEME_OPTIONS") pickerSectionTitle:nil rows:rows selectedItemIndex:GetSelection(@"appTheme") parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; @@ -335,16 +1366,6 @@ extern NSBundle *uYouPlusBundle(); } settingItemId:0], - [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_FLEX") - titleDescription:LOC(@"ENABLE_FLEX_DESC") - accessibilityIdentifier:nil - switchOn:IsEnabled(@"flex_enabled") - switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { - [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"flex_enabled"]; - return YES; - } - settingItemId:0], - [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_YT_STARTUP_ANIMATION") titleDescription:LOC(@"ENABLE_YT_STARTUP_ANIMATION_DESC") accessibilityIdentifier:nil @@ -355,6 +1376,36 @@ extern NSBundle *uYouPlusBundle(); } settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Remove Modern Interface (YTNoModernUI)") + titleDescription:LOC(@"Toggle this on to remove any Modern Element added to YouTube. Removes Ambient Mode, Rounded Design & More. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"ytNoModernUI_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytNoModernUI_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide YouTube Logo") + titleDescription:LOC(@"Toggle this to hide the YouTube Logo in the YouTube App.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideYouTubeLogo_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideYouTubeLogo_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Stick Navigation Bar") + titleDescription:LOC(@"Enable to make the Navigation Bar stay on the App when scrolling.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"stickNavigationBar_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"stickNavigationBar_enabled"]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HIDE_CHIP_BAR") titleDescription:LOC(@"HIDE_CHIP_BAR_DESC") accessibilityIdentifier:nil @@ -365,6 +1416,16 @@ extern NSBundle *uYouPlusBundle(); } settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Hide iSponsorBlock button in the Navigation bar") + titleDescription:LOC(@"") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"hideSponsorBlockButton_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideSponsorBlockButton_enabled"]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"IPHONE_LAYOUT") titleDescription:LOC(@"IPHONE_LAYOUT_DESC") accessibilityIdentifier:nil @@ -374,7 +1435,7 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"NEW_MINIPLAYER_STYLE") titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC") accessibilityIdentifier:nil @@ -384,6 +1445,16 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Disable Wifi Related Settings ") + titleDescription:LOC(@"This will disable the following sections which will be Autoplay, Purchases and memberships, Notifications, Connected apps, Manage all history, Privacy & Live chat.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"disableWifiRelatedSettings_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"disableWifiRelatedSettings_enabled"]; + return YES; + } + settingItemId:0], [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"YT_RE_EXPLORE") titleDescription:LOC(@"YT_RE_EXPLORE_DESC") @@ -394,8 +1465,36 @@ extern NSBundle *uYouPlusBundle(); return YES; } settingItemId:0], - ]; - + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable YTSpeed") + titleDescription:LOC(@"Enable YTSpeed to have more Playback Speed Options. App restart is required.") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"ytSpeed_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytSpeed_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"ENABLE_FLEX") + titleDescription:LOC(@"ENABLE_FLEX_DESC") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"flex_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"flex_enabled"]; + return YES; + } + settingItemId:0], + + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"Enable App Version Spoofer") + titleDescription:LOC(@"APP_VERSION_SPOOFER_DESC") + accessibilityIdentifier:nil + switchOn:IsEnabled(@"enableVersionSpoofer_enabled") + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"enableVersionSpoofer_enabled"]; + return YES; + } + settingItemId:0], versionSpooferSection]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"MISCELLANEOUS") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; diff --git a/Source/LowContrastMode.swift b/Source/LowContrastMode.swift new file mode 100644 index 0000000..aea9a72 --- /dev/null +++ b/Source/LowContrastMode.swift @@ -0,0 +1,43 @@ +import UIKit + +class ViewController: UIViewController { + + @IBOutlet weak var textField: UITextField! + @IBOutlet weak var colorButton: UIButton! + + var textColor: UIColor = (red: 0.56, green: 0.56, blue: 0.56, alpha: 1.00) + + override func viewDidLoad() { + super.viewDidLoad() + + // Configure Text Field + textField.placeholder = "YouTube" + + // Configure Color Button + colorButton.setTitleColor(textColor, for: .normal) + } + + @IBAction func onColorButtonTap(_ sender: Any) { + let colorPicker = UIColorPickerViewController() + colorPicker.delegate = self + present(colorPicker, animated: true, completion: nil) + } +} + +extension ViewController: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } +} + +extension ViewController: UIColorPickerViewControllerDelegate { + + func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) { + textColor = viewController.selectedColor + colorButton.setTitleColor(textColor, for: .normal) + } + + func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) { + dismiss diff --git a/Source/LowContrastMode.xm b/Source/LowContrastMode.xm new file mode 100644 index 0000000..4a529ee --- /dev/null +++ b/Source/LowContrastMode.xm @@ -0,0 +1,1097 @@ +#import "../Header.h" + +// +static BOOL IsEnabled(NSString *key) { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} +static BOOL isDarkMode() { + return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1); +} +static int colorContrastMode() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcmColor"]; +} +static BOOL defaultContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 0; +} +static BOOL redContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 1; +} +static BOOL blueContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 2; +} +static BOOL greenContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 3; +} +static BOOL yellowContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 4; +} +static BOOL orangeContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 5; +} +static BOOL purpleContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 6; +} +static BOOL violetContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 7; +} +static BOOL pinkContrastMode() { + return IsEnabled(@"lowContrastMode_enabled") && colorContrastMode() == 8; +} + +%group gLowContrastMode // Low Contrast Mode v1.3.0 (Compatible with only v15.02.1-present) +%hook UIColor ++ (UIColor *)whiteColor { // Dark Theme Color + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.38 green: 0.38 blue: 0.38 alpha: 1.00]; // Light Theme +} +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.38 green: 0.38 blue: 0.38 alpha: 1.00]; // Light Theme +} +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gRedContrastMode // Red Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 1.00 green: 0.31 blue: 0.27 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.84 green: 0.25 blue: 0.23 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gBlueContrastMode // Blue Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.04 green: 0.47 blue: 0.72 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.04 green: 0.41 blue: 0.62 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gGreenContrastMode // Green Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.01 green: 0.66 blue: 0.18 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.00 green: 0.50 blue: 0.13 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gYellowContrastMode // Yellow Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.89 green: 0.82 blue: 0.20 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.77 green: 0.71 blue: 0.14 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gOrangeContrastMode // Orange Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.73 green: 0.45 blue: 0.05 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.80 green: 0.49 blue: 0.05 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gPurpleContrastMode // Purple Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.42 green: 0.18 blue: 0.68 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.42 green: 0.05 blue: 0.68 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gVioletContrastMode // Violet Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.50 green: 0.00 blue: 1.00 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.29 green: 0.00 blue: 0.51 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +%group gPinkContrastMode // Pink Contrast Mode +%hook UIColor ++ (UIColor *)whiteColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} ++ (UIColor *)textColor { + return [UIColor colorWithRed: 0.74 green: 0.02 blue: 0.46 alpha: 1.00]; +} +%end + +%hook UILabel ++ (void)load { + @autoreleasepool { + [[UILabel appearance] setTextColor:[UIColor whiteColor]]; + } +} +%end + +%hook YTCommonColorPalette +- (UIColor *)textPrimary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Light Theme + } +- (UIColor *)textSecondary { + if (self.pageStyle == 1) { + return [UIColor whiteColor]; // Dark Theme + } + return [UIColor colorWithRed: 0.81 green: 0.56 blue: 0.71 alpha: 1.00]; // Light Theme + } +%end + +%hook YTCollectionView + - (void)setTintColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook ASTextNode +- (NSAttributedString *)attributedString { + NSAttributedString *originalAttributedString = %orig; + + NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy]; + [newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)]; + + return newAttributedString; +} +%end + +%hook ASTextFieldNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASTextView +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook ASButtonNode +- (void)setTextColor:(UIColor *)textColor { + %orig([UIColor whiteColor]); +} +%end + +%hook UIButton +- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { + %log; + color = [UIColor whiteColor]; + %orig(color, state); +} +%end + +%hook UILabel +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextField +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook UITextView +- (void)setTextColor:(UIColor *)textColor { + %log; + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook VideoTitleLabel +- (void)setTextColor:(UIColor *)textColor { + textColor = [UIColor whiteColor]; + %orig(textColor); +} +%end + +%hook _ASDisplayView +- (UIColor *)textColor { + return [UIColor whiteColor]; +} +%end +%end + +# pragma mark - ctor +%ctor { + %init; + if (defaultContrastMode()) { + %init(gLowContrastMode); + } + if (redContrastMode()) { + %init(gRedContrastMode); + } + if (blueContrastMode()) { + %init(gBlueContrastMode); + } + if (greenContrastMode()) { + %init(gGreenContrastMode); + } + if (yellowContrastMode()) { + %init(gYellowContrastMode); + } + if (orangeContrastMode()) { + %init(gOrangeContrastMode); + } + if (purpleContrastMode()) { + %init(gPurpleContrastMode); + } + if (violetContrastMode()) { + %init(gVioletContrastMode); + } + if (pinkContrastMode()) { + %init(gPinkContrastMode); + } +} diff --git a/Source/VersionSpoofer.xm b/Source/VersionSpoofer.xm new file mode 100644 index 0000000..0951f7e --- /dev/null +++ b/Source/VersionSpoofer.xm @@ -0,0 +1,1526 @@ +#import "../Header.h" + +// +static BOOL IsEnabled(NSString *key) { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} +static int appVersionSpoofer() { + return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"]; +} +static BOOL version0() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 0; +} +static BOOL version1() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 1; +} +static BOOL version2() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 2; +} +static BOOL version3() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 3; +} +static BOOL version4() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 4; +} +static BOOL version5() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 5; +} +static BOOL version6() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 6; +} +static BOOL version7() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 7; +} +static BOOL version8() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 8; +} +static BOOL version9() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 9; +} +static BOOL version10() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 10; +} +static BOOL version11() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 11; +} +static BOOL version12() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 12; +} +static BOOL version13() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 13; +} +static BOOL version14() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 14; +} +static BOOL version15() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 15; +} +static BOOL version16() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 16; +} +static BOOL version17() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 17; +} +static BOOL version18() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 18; +} +static BOOL version19() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 19; +} +static BOOL version20() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 20; +} +static BOOL version21() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 21; +} +static BOOL version22() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 22; +} +static BOOL version23() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 23; +} +static BOOL version24() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 24; +} +static BOOL version25() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 25; +} +static BOOL version26() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 26; +} +static BOOL version27() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 27; +} +static BOOL version28() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 28; +} +static BOOL version29() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 29; +} +static BOOL version30() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 30; +} +static BOOL version31() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 31; +} +static BOOL version32() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 32; +} +static BOOL version33() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 33; +} +static BOOL version34() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 34; +} +static BOOL version35() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 35; +} +static BOOL version36() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 36; +} +static BOOL version37() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 37; +} +static BOOL version38() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 38; +} +static BOOL version39() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 39; +} +static BOOL version40() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 40; +} +static BOOL version41() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 41; +} +static BOOL version42() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 42; +} +static BOOL version43() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 43; +} +static BOOL version44() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 44; +} +static BOOL version45() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 45; +} +static BOOL version46() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 46; +} +static BOOL version47() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 47; +} +static BOOL version48() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 48; +} +static BOOL version49() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 49; +} +static BOOL version50() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 50; +} +static BOOL version51() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 51; +} +static BOOL version52() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 52; +} +static BOOL version53() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 53; +} +static BOOL version54() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 54; +} +static BOOL version55() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 55; +} +static BOOL version56() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 56; +} +static BOOL version57() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 57; +} +static BOOL version58() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 58; +} +static BOOL version59() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 59; +} +static BOOL version60() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 60; +} +static BOOL version61() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 61; +} +static BOOL version62() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 62; +} +static BOOL version63() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 63; +} +static BOOL version64() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 64; +} +static BOOL version65() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 65; +} +static BOOL version66() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 66; +} +static BOOL version67() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 67; +} +static BOOL version68() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 68; +} +static BOOL version69() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 69; +} +static BOOL version70() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 70; +} +static BOOL version71() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 71; +} +static BOOL version72() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 72; +} +static BOOL version73() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 73; +} +static BOOL version74() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 74; +} +static BOOL version75() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 75; +} +static BOOL version76() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 76; +} +static BOOL version77() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 77; +} +static BOOL version78() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 78; +} +static BOOL version79() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 79; +} +static BOOL version80() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 80; +} +static BOOL version81() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 81; +} +static BOOL version82() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 82; +} +static BOOL version83() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 83; +} +static BOOL version84() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 84; +} +static BOOL version85() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 85; +} +static BOOL version86() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 86; +} +static BOOL version87() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 87; +} +static BOOL version88() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 88; +} +static BOOL version89() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 89; +} +static BOOL version90() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 90; +} +static BOOL version91() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 91; +} +static BOOL version92() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 92; +} +static BOOL version93() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 93; +} +static BOOL version94() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 94; +} +static BOOL version95() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 95; +} +static BOOL version96() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 96; +} +static BOOL version97() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 97; +} +static BOOL version98() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 98; +} +static BOOL version99() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 99; +} +static BOOL version100() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 100; +} +static BOOL version101() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 101; +} +static BOOL version102() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 102; +} +static BOOL version103() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 103; +} +static BOOL version104() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 104; +} +static BOOL version105() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 105; +} +static BOOL version106() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 106; +} +static BOOL version107() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 107; +} +static BOOL version108() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 108; +} +static BOOL version109() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 109; +} +static BOOL version110() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 110; +} +static BOOL version111() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 111; +} +static BOOL version112() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 112; +} +static BOOL version113() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 113; +} +static BOOL version114() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 114; +} +static BOOL version115() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 115; +} +static BOOL version116() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 116; +} +static BOOL version117() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 117; +} +static BOOL version118() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 118; +} +static BOOL version119() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 119; +} +static BOOL version120() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 120; +} +static BOOL version121() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 121; +} +static BOOL version122() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 122; +} +static BOOL version123() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 123; +} +static BOOL version124() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 124; +} +static BOOL version125() { + return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 125; +} + +%group gDefault +%hook YTVersionUtils // 0 ++ (NSString *)appVersion { return @"18.23.3"; } +%end +%end + +%group gVersion1 +%hook YTVersionUtils // 1 ++ (NSString *)appVersion { return @"18.22.9"; } +%end +%end + +%group gVersion2 +%hook YTVersionUtils // 2 ++ (NSString *)appVersion { return @"18.21.3"; } +%end +%end + +%group gVersion3 +%hook YTVersionUtils // 3 ++ (NSString *)appVersion { return @"18.20.3"; } +%end +%end + +%group gVersion4 +%hook YTVersionUtils // 4 ++ (NSString *)appVersion { return @"18.19.1"; } +%end +%end + +%group gVersion5 +%hook YTVersionUtils // 5 ++ (NSString *)appVersion { return @"18.18.2"; } +%end +%end + +%group gVersion6 +%hook YTVersionUtils // 6 ++ (NSString *)appVersion { return @"18.17.2"; } +%end +%end + +%group gVersion7 +%hook YTVersionUtils // 7 ++ (NSString *)appVersion { return @"18.16.2"; } +%end +%end + +%group gVersion8 +%hook YTVersionUtils // 8 ++ (NSString *)appVersion { return @"18.15.1"; } +%end +%end + +%group gVersion9 +%hook YTVersionUtils // 9 ++ (NSString *)appVersion { return @"18.14.1"; } +%end +%end + +%group gVersion10 +%hook YTVersionUtils // 10 ++ (NSString *)appVersion { return @"18.13.4"; } +%end +%end + +%group gVersion11 +%hook YTVersionUtils // 11 ++ (NSString *)appVersion { return @"18.12.2"; } +%end +%end + +%group gVersion12 +%hook YTVersionUtils // 12 ++ (NSString *)appVersion { return @"18.11.2"; } +%end +%end + +%group gVersion13 +%hook YTVersionUtils // 13 ++ (NSString *)appVersion { return @"18.10.1"; } +%end +%end + +%group gVersion14 +%hook YTVersionUtils // 14 ++ (NSString *)appVersion { return @"18.09.4"; } +%end +%end + +%group gVersion15 +%hook YTVersionUtils // 15 ++ (NSString *)appVersion { return @"18.08.1"; } +%end +%end + +%group gVersion16 +%hook YTVersionUtils // 16 ++ (NSString *)appVersion { return @"18.07.5"; } +%end +%end + +%group gVersion17 +%hook YTVersionUtils // 17 ++ (NSString *)appVersion { return @"18.05.2"; } +%end +%end + +%group gVersion18 +%hook YTVersionUtils // 18 ++ (NSString *)appVersion { return @"18.04.3"; } +%end +%end + +%group gVersion19 +%hook YTVersionUtils // 19 ++ (NSString *)appVersion { return @"18.03.3"; } +%end +%end + +%group gVersion20 +%hook YTVersionUtils // 20 ++ (NSString *)appVersion { return @"18.02.03"; } +%end +%end + +%group gVersion21 +%hook YTVersionUtils // 21 ++ (NSString *)appVersion { return @"18.01.6"; } +%end +%end + +%group gVersion22 +%hook YTVersionUtils // 22 ++ (NSString *)appVersion { return @"18.01.4"; } +%end +%end + +%group gVersion23 +%hook YTVersionUtils // 23 ++ (NSString *)appVersion { return @"18.01.2"; } +%end +%end + +%group gVersion24 +%hook YTVersionUtils // 24 ++ (NSString *)appVersion { return @"17.49.6"; } +%end +%end + +%group gVersion25 +%hook YTVersionUtils // 25 ++ (NSString *)appVersion { return @"17.49.4"; } +%end +%end + +%group gVersion26 +%hook YTVersionUtils // 26 ++ (NSString *)appVersion { return @"17.46.4"; } +%end +%end + +%group gVersion27 +%hook YTVersionUtils // 27 ++ (NSString *)appVersion { return @"17.45.1"; } +%end +%end + +%group gVersion28 +%hook YTVersionUtils // 28 ++ (NSString *)appVersion { return @"17.44.4"; } +%end +%end + +%group gVersion29 +%hook YTVersionUtils // 29 ++ (NSString *)appVersion { return @"17.43.1"; } +%end +%end + +%group gVersion30 +%hook YTVersionUtils // 30 ++ (NSString *)appVersion { return @"17.42.7"; } +%end +%end + +%group gVersion31 +%hook YTVersionUtils // 31 ++ (NSString *)appVersion { return @"17.42.6"; } +%end +%end + +%group gVersion32 +%hook YTVersionUtils // 32 ++ (NSString *)appVersion { return @"17.41.2"; } +%end +%end + +%group gVersion33 +%hook YTVersionUtils // 33 ++ (NSString *)appVersion { return @"17.40.5"; } +%end +%end + +%group gVersion34 +%hook YTVersionUtils // 34 ++ (NSString *)appVersion { return @"17.39.4"; } +%end +%end + +%group gVersion35 +%hook YTVersionUtils // 35 ++ (NSString *)appVersion { return @"17.38.10"; } +%end +%end + +%group gVersion36 +%hook YTVersionUtils // 36 ++ (NSString *)appVersion { return @"17.37.3"; } +%end +%end + +%group gVersion37 +%hook YTVersionUtils // 37 ++ (NSString *)appVersion { return @"17.36.4"; } +%end +%end + +%group gVersion38 +%hook YTVersionUtils // 38 ++ (NSString *)appVersion { return @"17.36.3"; } +%end +%end + +%group gVersion39 +%hook YTVersionUtils // 39 ++ (NSString *)appVersion { return @"17.35.3"; } +%end +%end + +%group gVersion40 +%hook YTVersionUtils // 40 ++ (NSString *)appVersion { return @"17.34.3"; } +%end +%end + +%group gVersion41 +%hook YTVersionUtils // 41 ++ (NSString *)appVersion { return @"17.33.2"; } +%end +%end + +%group gVersion42 +%hook YTVersionUtils // 42 ++ (NSString *)appVersion { return @"17.32.2"; } +%end +%end + +%group gVersion43 +%hook YTVersionUtils // 43 ++ (NSString *)appVersion { return @"17.31.4"; } +%end +%end + +%group gVersion44 +%hook YTVersionUtils // 44 ++ (NSString *)appVersion { return @"17.30.3"; } +%end +%end + +%group gVersion45 +%hook YTVersionUtils // 45 ++ (NSString *)appVersion { return @"17.30.1"; } +%end +%end + +%group gVersion46 +%hook YTVersionUtils // 46 ++ (NSString *)appVersion { return @"17.29.3"; } +%end +%end + +%group gVersion47 +%hook YTVersionUtils // 47 ++ (NSString *)appVersion { return @"17.29.2"; } +%end +%end + +%group gVersion48 +%hook YTVersionUtils // 48 ++ (NSString *)appVersion { return @"17.28.2"; } +%end +%end + +%group gVersion49 +%hook YTVersionUtils // 49 ++ (NSString *)appVersion { return @"17.26.2"; } +%end +%end + +%group gVersion50 +%hook YTVersionUtils // 50 ++ (NSString *)appVersion { return @"17.25.1"; } +%end +%end + +%group gVersion51 +%hook YTVersionUtils // 51 ++ (NSString *)appVersion { return @"17.24.4"; } +%end +%end + +%group gVersion52 +%hook YTVersionUtils // 52 ++ (NSString *)appVersion { return @"17.23.6"; } +%end +%end + +%group gVersion53 +%hook YTVersionUtils // 53 ++ (NSString *)appVersion { return @"17.22.3"; } +%end +%end + +%group gVersion54 +%hook YTVersionUtils // 54 ++ (NSString *)appVersion { return @"17.21.3"; } +%end +%end + +%group gVersion55 +%hook YTVersionUtils // 55 ++ (NSString *)appVersion { return @"17.20.3"; } +%end +%end + +%group gVersion56 +%hook YTVersionUtils // 56 ++ (NSString *)appVersion { return @"17.19.3"; } +%end +%end + +%group gVersion57 +%hook YTVersionUtils // 57 ++ (NSString *)appVersion { return @"17.19.2"; } +%end +%end + +%group gVersion58 +%hook YTVersionUtils // 58 ++ (NSString *)appVersion { return @"17.18.4"; } +%end +%end + +%group gVersion59 +%hook YTVersionUtils // 59 ++ (NSString *)appVersion { return @"17.17.4"; } +%end +%end + +%group gVersion60 +%hook YTVersionUtils // 60 ++ (NSString *)appVersion { return @"17.16.4"; } +%end +%end + +%group gVersion61 +%hook YTVersionUtils // 61 ++ (NSString *)appVersion { return @"17.15.2"; } +%end +%end + +%group gVersion62 +%hook YTVersionUtils // 62 ++ (NSString *)appVersion { return @"17.15.1"; } +%end +%end + +%group gVersion63 +%hook YTVersionUtils // 63 ++ (NSString *)appVersion { return @"17.14.2"; } +%end +%end + +%group gVersion64 +%hook YTVersionUtils // 64 ++ (NSString *)appVersion { return @"17.13.3"; } +%end +%end + +%group gVersion65 +%hook YTVersionUtils // 65 ++ (NSString *)appVersion { return @"17.12.5"; } +%end +%end + +%group gVersion66 +%hook YTVersionUtils // 66 ++ (NSString *)appVersion { return @"17.12.4"; } +%end +%end + +%group gVersion67 +%hook YTVersionUtils // 67 ++ (NSString *)appVersion { return @"17.11.2"; } +%end +%end + +%group gVersion68 +%hook YTVersionUtils // 68 ++ (NSString *)appVersion { return @"17.10.2"; } +%end +%end + +%group gVersion69 +%hook YTVersionUtils // 69 ++ (NSString *)appVersion { return @"17.09.1"; } +%end +%end + +%group gVersion70 +%hook YTVersionUtils // 70 ++ (NSString *)appVersion { return @"17.08.2"; } +%end +%end + +%group gVersion71 +%hook YTVersionUtils // 71 ++ (NSString *)appVersion { return @"17.07.2"; } +%end +%end + +%group gVersion72 +%hook YTVersionUtils // 72 ++ (NSString *)appVersion { return @"17.06.3"; } +%end +%end + +%group gVersion73 +%hook YTVersionUtils // 73 ++ (NSString *)appVersion { return @"17.05.2"; } +%end +%end + +%group gVersion74 +%hook YTVersionUtils // 74 ++ (NSString *)appVersion { return @"17.04.3"; } +%end +%end + +%group gVersion75 +%hook YTVersionUtils // 75 ++ (NSString *)appVersion { return @"17.03.3"; } +%end +%end + +%group gVersion76 +%hook YTVersionUtils // 76 ++ (NSString *)appVersion { return @"17.03.2"; } +%end +%end + +%group gVersion77 +%hook YTVersionUtils // 77 ++ (NSString *)appVersion { return @"17.01.4"; } +%end +%end + +%group gVersion78 +%hook YTVersionUtils // 78 ++ (NSString *)appVersion { return @"16.46.5"; } +%end +%end + +%group gVersion79 +%hook YTVersionUtils // 79 ++ (NSString *)appVersion { return @"16.46.4"; } +%end +%end + +%group gVersion80 +%hook YTVersionUtils // 80 ++ (NSString *)appVersion { return @"16.45.4"; } +%end +%end + +%group gVersion81 +%hook YTVersionUtils // 81 ++ (NSString *)appVersion { return @"16.44.5"; } +%end +%end + +%group gVersion82 +%hook YTVersionUtils // 82 ++ (NSString *)appVersion { return @"16.44.4"; } +%end +%end + +%group gVersion83 +%hook YTVersionUtils // 83 ++ (NSString *)appVersion { return @"16.43.2"; } +%end +%end + +%group gVersion84 +%hook YTVersionUtils // 84 ++ (NSString *)appVersion { return @"16.42.3"; } +%end +%end + +%group gVersion85 +%hook YTVersionUtils // 85 ++ (NSString *)appVersion { return @"16.41.2"; } +%end +%end + +%group gVersion86 +%hook YTVersionUtils // 86 ++ (NSString *)appVersion { return @"16.40.3"; } +%end +%end + +%group gVersion87 +%hook YTVersionUtils // 87 ++ (NSString *)appVersion { return @"16.39.6"; } +%end +%end + +%group gVersion88 +%hook YTVersionUtils // 88 ++ (NSString *)appVersion { return @"16.38.2"; } +%end +%end + +%group gVersion89 +%hook YTVersionUtils // 89 ++ (NSString *)appVersion { return @"16.37.3"; } +%end +%end + +%group gVersion90 +%hook YTVersionUtils // 90 ++ (NSString *)appVersion { return @"16.36.4"; } +%end +%end + +%group gVersion91 +%hook YTVersionUtils // 91 ++ (NSString *)appVersion { return @"16.35.5"; } +%end +%end + +%group gVersion92 +%hook YTVersionUtils // 92 ++ (NSString *)appVersion { return @"16.35.4"; } +%end +%end + +%group gVersion93 +%hook YTVersionUtils // 93 ++ (NSString *)appVersion { return @"16.34.7"; } +%end +%end + +%group gVersion94 +%hook YTVersionUtils // 94 ++ (NSString *)appVersion { return @"16.34.3"; } +%end +%end + +%group gVersion95 +%hook YTVersionUtils // 95 ++ (NSString *)appVersion { return @"16.33.3"; } +%end +%end + +%group gVersion96 +%hook YTVersionUtils // 96 ++ (NSString *)appVersion { return @"16.32.6"; } +%end +%end + +%group gVersion97 +%hook YTVersionUtils // 97 ++ (NSString *)appVersion { return @"16.31.4"; } +%end +%end + +%group gVersion98 +%hook YTVersionUtils // 98 ++ (NSString *)appVersion { return @"16.30.2"; } +%end +%end + +%group gVersion99 +%hook YTVersionUtils // 99 ++ (NSString *)appVersion { return @"16.29.4"; } +%end +%end + +%group gVersion100 +%hook YTVersionUtils // 100 ++ (NSString *)appVersion { return @"16.28.2"; } +%end +%end + +%group gVersion101 +%hook YTVersionUtils // 101 ++ (NSString *)appVersion { return @"16.27.3"; } +%end +%end + +%group gVersion102 +%hook YTVersionUtils // 102 ++ (NSString *)appVersion { return @"16.26.6"; } +%end +%end + +%group gVersion103 +%hook YTVersionUtils // 103 ++ (NSString *)appVersion { return @"16.25.2"; } +%end +%end + +%group gVersion104 +%hook YTVersionUtils // 104 ++ (NSString *)appVersion { return @"16.24.2"; } +%end +%end + +%group gVersion105 +%hook YTVersionUtils // 105 ++ (NSString *)appVersion { return @"16.23.3"; } +%end +%end + +%group gVersion106 +%hook YTVersionUtils // 106 ++ (NSString *)appVersion { return @"16.23.2"; } +%end +%end + +%group gVersion107 +%hook YTVersionUtils // 107 ++ (NSString *)appVersion { return @"16.22.5"; } +%end +%end + +%group gVersion108 +%hook YTVersionUtils // 108 ++ (NSString *)appVersion { return @"16.20.5"; } +%end +%end + +%group gVersion109 +%hook YTVersionUtils // 109 ++ (NSString *)appVersion { return @"16.19.6"; } +%end +%end + +%group gVersion110 +%hook YTVersionUtils // 110 ++ (NSString *)appVersion { return @"16.18.5"; } +%end +%end + +%group gVersion111 +%hook YTVersionUtils // 111 ++ (NSString *)appVersion { return @"16.17.4"; } +%end +%end + +%group gVersion112 +%hook YTVersionUtils // 112 ++ (NSString *)appVersion { return @"16.16.4"; } +%end +%end + +%group gVersion113 +%hook YTVersionUtils // 113 ++ (NSString *)appVersion { return @"16.16.3"; } +%end +%end + +%group gVersion114 +%hook YTVersionUtils // 114 ++ (NSString *)appVersion { return @"16.15.4"; } +%end +%end + +%group gVersion115 +%hook YTVersionUtils // 115 ++ (NSString *)appVersion { return @"16.14.2"; } +%end +%end + +%group gVersion116 +%hook YTVersionUtils // 116 ++ (NSString *)appVersion { return @"16.13.1"; } +%end +%end + +%group gVersion117 +%hook YTVersionUtils // 117 ++ (NSString *)appVersion { return @"16.12.3"; } +%end +%end + +%group gVersion118 +%hook YTVersionUtils // 118 ++ (NSString *)appVersion { return @"16.11.3"; } +%end +%end + +%group gVersion119 +%hook YTVersionUtils // 119 ++ (NSString *)appVersion { return @"16.10.3"; } +%end +%end + +%group gVersion120 +%hook YTVersionUtils // 120 ++ (NSString *)appVersion { return @"16.09.3"; } +%end +%end + +%group gVersion121 +%hook YTVersionUtils // 121 ++ (NSString *)appVersion { return @"16.09.2"; } +%end +%end + +%group gVersion122 +%hook YTVersionUtils // 122 ++ (NSString *)appVersion { return @"16.08.2"; } +%end +%end + +%group gVersion123 +%hook YTVersionUtils // 123 ++ (NSString *)appVersion { return @"16.05.9"; } +%end +%end + +%group gVersion124 +%hook YTVersionUtils // 124 ++ (NSString *)appVersion { return @"16.05.8"; } +%end +%end + +%group gVersion125 +%hook YTVersionUtils // 125 ++ (NSString *)appVersion { return @"16.05.7"; } +%end +%end + +# pragma mark - ctor +%ctor { + %init; + if (version0()) { // 0 + %init(gDefault); + } + if (version1()) { // 1 + %init(gVersion1); + } + if (version2()) { // 2 + %init(gVersion2); + } + if (version3()) { // 3 + %init(gVersion3); + } + if (version4()) { // 4 + %init(gVersion4); + } + if (version5()) { // 5 + %init(gVersion5); + } + if (version6()) { // 6 + %init(gVersion6); + } + if (version7()) { // 7 + %init(gVersion7); + } + if (version8()) { // 8 + %init(gVersion8); + } + if (version9()) { // 9 + %init(gVersion9); + } + if (version10()) { // 10 + %init(gVersion10); + } + if (version11()) { // 11 + %init(gVersion11); + } + if (version12()) { // 12 + %init(gVersion12); + } + if (version13()) { // 13 + %init(gVersion13); + } + if (version14()) { // 14 + %init(gVersion14); + } + if (version15()) { // 15 + %init(gVersion15); + } + if (version16()) { // 16 + %init(gVersion16); + } + if (version17()) { // 17 + %init(gVersion17); + } + if (version18()) { // 18 + %init(gVersion18); + } + if (version19()) { // 19 + %init(gVersion19); + } + if (version20()) { // 20 + %init(gVersion20); + } + if (version21()) { // 21 + %init(gVersion21); + } + if (version22()) { // 22 + %init(gVersion22); + } + if (version23()) { // 23 + %init(gVersion23); + } + if (version24()) { // 24 + %init(gVersion24); + } + if (version25()) { // 25 + %init(gVersion25); + } + if (version26()) { // 26 + %init(gVersion26); + } + if (version27()) { // 27 + %init(gVersion27); + } + if (version28()) { // 28 + %init(gVersion28); + } + if (version29()) { // 29 + %init(gVersion29); + } + if (version30()) { // 30 + %init(gVersion30); + } + if (version31()) { // 31 + %init(gVersion31); + } + if (version32()) { // 32 + %init(gVersion32); + } + if (version33()) { // 33 + %init(gVersion33); + } + if (version34()) { // 34 + %init(gVersion34); + } + if (version35()) { // 35 + %init(gVersion35); + } + if (version36()) { // 36 + %init(gVersion36); + } + if (version37()) { // 37 + %init(gVersion37); + } + if (version38()) { // 38 + %init(gVersion38); + } + if (version39()) { // 39 + %init(gVersion39); + } + if (version40()) { // 40 + %init(gVersion40); + } + if (version41()) { // 41 + %init(gVersion41); + } + if (version42()) { // 42 + %init(gVersion42); + } + if (version43()) { // 43 + %init(gVersion43); + } + if (version44()) { // 44 + %init(gVersion44); + } + if (version45()) { // 45 + %init(gVersion45); + } + if (version46()) { // 46 + %init(gVersion46); + } + if (version47()) { // 47 + %init(gVersion47); + } + if (version48()) { // 48 + %init(gVersion48); + } + if (version49()) { // 49 + %init(gVersion49); + } + if (version50()) { // 50 + %init(gVersion50); + } + if (version51()) { // 51 + %init(gVersion51); + } + if (version52()) { // 52 + %init(gVersion52); + } + if (version53()) { // 53 + %init(gVersion53); + } + if (version54()) { // 54 + %init(gVersion54); + } + if (version55()) { // 55 + %init(gVersion55); + } + if (version56()) { // 56 + %init(gVersion56); + } + if (version57()) { // 57 + %init(gVersion57); + } + if (version58()) { // 58 + %init(gVersion58); + } + if (version59()) { // 59 + %init(gVersion59); + } + if (version60()) { // 60 + %init(gVersion60); + } + if (version61()) { // 61 + %init(gVersion61); + } + if (version62()) { // 62 + %init(gVersion62); + } + if (version63()) { // 63 + %init(gVersion63); + } + if (version64()) { // 64 + %init(gVersion64); + } + if (version65()) { // 65 + %init(gVersion65); + } + if (version66()) { // 66 + %init(gVersion66); + } + if (version67()) { // 67 + %init(gVersion67); + } + if (version68()) { // 68 + %init(gVersion68); + } + if (version69()) { // 69 + %init(gVersion69); + } + if (version70()) { // 70 + %init(gVersion70); + } + if (version71()) { // 71 + %init(gVersion71); + } + if (version72()) { // 72 + %init(gVersion72); + } + if (version73()) { // 73 + %init(gVersion73); + } + if (version74()) { // 74 + %init(gVersion74); + } + if (version75()) { // 75 + %init(gVersion75); + } + if (version76()) { // 76 + %init(gVersion76); + } + if (version77()) { // 77 + %init(gVersion77); + } + if (version78()) { // 78 + %init(gVersion78); + } + if (version79()) { // 79 + %init(gVersion79); + } + if (version80()) { // 80 + %init(gVersion80); + } + if (version81()) { // 81 + %init(gVersion81); + } + if (version82()) { // 82 + %init(gVersion82); + } + if (version83()) { // 83 + %init(gVersion83); + } + if (version84()) { // 84 + %init(gVersion84); + } + if (version85()) { // 85 + %init(gVersion85); + } + if (version86()) { // 86 + %init(gVersion86); + } + if (version87()) { // 87 + %init(gVersion87); + } + if (version88()) { // 88 + %init(gVersion88); + } + if (version89()) { // 89 + %init(gVersion89); + } + if (version90()) { // 90 + %init(gVersion90); + } + if (version91()) { // 91 + %init(gVersion91); + } + if (version92()) { // 92 + %init(gVersion92); + } + if (version93()) { // 93 + %init(gVersion93); + } + if (version94()) { // 94 + %init(gVersion94); + } + if (version95()) { // 95 + %init(gVersion95); + } + if (version96()) { // 96 + %init(gVersion96); + } + if (version97()) { // 97 + %init(gVersion97); + } + if (version98()) { // 98 + %init(gVersion98); + } + if (version99()) { // 99 + %init(gVersion99); + } + if (version100()) { // 100 + %init(gVersion100); + } + if (version101()) { // 101 + %init(gVersion101); + } + if (version102()) { // 102 + %init(gVersion102); + } + if (version103()) { // 103 + %init(gVersion103); + } + if (version104()) { // 104 + %init(gVersion104); + } + if (version105()) { // 105 + %init(gVersion105); + } + if (version106()) { // 106 + %init(gVersion106); + } + if (version107()) { // 107 + %init(gVersion107); + } + if (version108()) { // 108 + %init(gVersion108); + } + if (version109()) { // 109 + %init(gVersion109); + } + if (version110()) { // 110 + %init(gVersion110); + } + if (version111()) { // 111 + %init(gVersion111); + } + if (version112()) { // 112 + %init(gVersion112); + } + if (version113()) { // 113 + %init(gVersion113); + } + if (version114()) { // 114 + %init(gVersion114); + } + if (version115()) { // 115 + %init(gVersion115); + } + if (version116()) { // 116 + %init(gVersion116); + } + if (version117()) { // 117 + %init(gVersion117); + } + if (version118()) { // 118 + %init(gVersion118); + } + if (version119()) { // 119 + %init(gVersion119); + } + if (version120()) { // 120 + %init(gVersion120); + } + if (version121()) { // 121 + %init(gVersion121); + } + if (version122()) { // 122 + %init(gVersion122); + } + if (version123()) { // 123 + %init(gVersion123); + } + if (version124()) { // 124 + %init(gVersion124); + } + if (version125()) { // 125 + %init(gVersion125); + } +} diff --git a/control b/control index 653318e..9ec3c8a 100644 --- a/control +++ b/control @@ -5,6 +5,4 @@ Description: Modified version of uYou Maintainer: qnblackcat Author: qnblackcat Section: Tweaks -Depends: mobilesubstrate (>= 0.9.5000), com.miro.uyou -Conflicts: com.level3tjg.ytminiplayerenabler, com.level3tjg.ytnohovercards, com.devvix.ytcastconfirm, com.ps.ytclassicvideoquality, com.ps.noytpremium, com.ps.ytnopaidpromo, com.ps.ytreexplore, com.galacticdev.bigytminiplayer, me.foxster.donteatmycontent, com.lyvendia.ytspeed, com.lilacvibes.ytstockvolumehud, net.sarahh12099.youtubereborn, com.twickd.sarahh12099.youtube-reborn, h.ryan.youtubereborn, weeb.lillie.enhancerforyoutubepremium, com.ps.uyoucompat, com.ichitaso.uyouplus -Recommends: com.ps.youpip, com.ps.ytabconfig, libflex, weeb.lillie.youtubedislikesreturn +Depends: mobilesubstrate (>= 0.9.5000), com.galacticdev.isponsorblock, com.miro.uyou, com.ps.youpip, com.ps.ytabconfig, com.ps.ytuhd, libflex, weeb.lillie.youtubedislikesreturn diff --git a/uYouPlus.xm b/uYouPlus.xm index f1130ad..5bcd4ef 100644 --- a/uYouPlus.xm +++ b/uYouPlus.xm @@ -91,7 +91,7 @@ static BOOL oldDarkTheme() { } - (void)appWillResignActive:(id)arg1 { %orig; - if (IsEnabled(@"flex_enabled")) { + if (IsEnabled(@"flex_enabled")) { [[%c(FLEXManager) performSelector:@selector(sharedManager)] performSelector:@selector(showExplorer)]; } } @@ -112,11 +112,6 @@ static BOOL oldDarkTheme() { - (BOOL)disableAfmaIdfaCollection { return NO; } %end -// https://github.com/PoomSmart/YouTube-X/blob/1e62b68e9027fcb849a75f54a402a530385f2a51/Tweak.x#L27 -// %hook YTAdsInnerTubeContextDecorator -// - (void)decorateContext:(id)context {} -// %end - // Hide YouTube annoying banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts %hook YTAsyncCollectionView - (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath { @@ -152,6 +147,41 @@ static BOOL oldDarkTheme() { } %end +// Remove “Play next in queue” from the menu (@PoomSmart) - qnblackcat/uYouPlus#1138 +%hook YTMenuItemVisibilityHandler +- (BOOL)shouldShowServiceItemRenderer:(YTIMenuConditionalServiceItemRenderer *)renderer { + return renderer.icon.iconType == 251 ? NO : %orig; +} +%end + +// Reposition "Create" Tab to the Center in the Pivot Bar - qnblackcat/uYouPlus#107 +static void repositionCreateTab(YTIGuideResponse *response) { + NSMutableArray *renderers = [response itemsArray]; + for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) { + YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer]; + NSMutableArray *items = [pivotBarRenderer itemsArray]; + NSUInteger createIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:@"FEuploads"]; + }]; + if (createIndex != NSNotFound) { + YTIPivotBarSupportedRenderers *createTab = [items objectAtIndex:createIndex]; + [items removeObjectAtIndex:createIndex]; + NSUInteger centerIndex = items.count / 2; + [items insertObject:createTab atIndex:centerIndex]; // Reposition the "Create" tab at the center + } + } +} +%hook YTGuideServiceCoordinator +- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion { + repositionCreateTab(response); + %orig(response, completion); +} +- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion { + repositionCreateTab(response); + %orig(response, error, completion); +} +%end + # pragma mark - Tweaks // IAmYouTube - https://github.com/PoomSmart/IAmYouTube/ %hook YTVersionUtils @@ -257,14 +287,28 @@ static BOOL oldDarkTheme() { } %end -// Hide search ads by @PoomSmart - https://github.com/PoomSmart/YouTube-X -// %hook YTIElementRenderer -// - (NSData *)elementData { -// if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) -// return nil; -// return %orig; -// } -// %end +// Hide app advertisments by @PoomSmart - https://github.com/PoomSmart/YouTube-X +BOOL isAd(id node) { + if ([node isKindOfClass:NSClassFromString(@"YTVideoWithContextNode")] + && [node respondsToSelector:@selector(parentResponder)] + && [[(YTVideoWithContextNode *)node parentResponder] isKindOfClass:NSClassFromString(@"YTAdVideoElementsCellController")]) + return YES; + if ([node isKindOfClass:NSClassFromString(@"ELMCellNode")]) { + NSString *description = [[[node controller] owningComponent] description]; + if ([description containsString:@"brand_promo"] + || [description containsString:@"statement_banner"] + || [description containsString:@"product_carousel"] + || [description containsString:@"product_engagement_panel"] + || [description containsString:@"product_item"] + || [description containsString:@"text_search_ad"] + || [description containsString:@"text_image_button_layout"] + || [description containsString:@"carousel_headered_layout"] + || [description containsString:@"square_image_layout"] // install app ad + || [description containsString:@"feed_ad_metadata"]) + return YES; + } + return NO; +} // %hook YTSectionListViewController // - (void)loadWithModel:(YTISectionListRenderer *)model { @@ -280,13 +324,19 @@ static BOOL oldDarkTheme() { // %end // YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality -%hook YTVideoQualitySwitchControllerFactory -- (id)videoQualitySwitchControllerWithParentResponder:(id)responder { - Class originalClass = %c(YTVideoQualitySwitchOriginalController); - return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; -} +%hook YTIMediaQualitySettingsHotConfig // (works for YouTube 18.19.1-latest) + +%new(B@:) - (BOOL)enableQuickMenuVideoQualitySettings { return NO; } + %end +// %hook YTVideoQualitySwitchControllerFactory +// - (id)videoQualitySwitchControllerWithParentResponder:(id)responder { +// Class originalClass = %c(YTVideoQualitySwitchOriginalController); +// return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; +// } +// %end + // A/B flags %hook YTColdConfig - (BOOL)respectDeviceCaptionSetting { return NO; } // YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html @@ -320,6 +370,13 @@ static BOOL oldDarkTheme() { - (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {} %end +%hook YTIOfflineabilityFormat +%new +- (int)availabilityType { return 1; } +%new +- (BOOL)savedSettingShouldExpire { return NO; } +%end + // YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo %hook YTMainAppVideoPlayerOverlayViewController - (void)setPaidContentWithPlayerData:(id)data { @@ -339,6 +396,133 @@ static BOOL oldDarkTheme() { } %end +// Disable Wifi Related Settings - @arichorn +%group gDisableWifiRelatedSettings +%hook YTSettingsSectionItemManager +- (void)updatePremiumEarlyAccessSectionWithEntry:(id)arg1 {} // Try New Features +- (void)updateAutoplaySectionWithEntry:(id)arg1 {} // Autoplay +- (void)updateNotificationSectionWithEntry:(id)arg1 {} // Notifications +- (void)updateHistorySectionWithEntry:(id)arg1 {} // History +- (void)updatePrivacySectionWithEntry:(id)arg1 {} // Privacy +- (void)updateHistoryAndPrivacySectionWithEntry:(id)arg1 {} // History & Privacy +- (void)updateLiveChatSectionWithEntry:(id)arg1 {} // Live chat +%end +%end + +// YTNoModernUI - @arichorn +%group gYTNoModernUI +%hook YTVersionUtils // YTNoModernUI Version ++ (NSString *)appVersion { return @"16.42.3"; } +%end + +%hook YTInlinePlayerBarContainerView // Red Progress Bar - YTNoModernUI +- (id)quietProgressBarColor { + return [UIColor redColor]; +} +%end + +%hook YTSegmentableInlinePlayerBarView // Old Buffer Bar - YTNoModernUI +- (void)setBufferedProgressBarColor:(id)arg1 { + [UIColor colorWithRed:0.65 green:0.65 blue:0.65 alpha:0.60]; +} +%end + +%hook YTQTMButton +- (BOOL)buttonModernizationEnabled { return NO; } +%end + +%hook YTSearchBarView +- (BOOL)_roundedSearchBarEnabled { return NO; } +%end + +%hook YTColdConfig +// Disable Modern Content - YTNoModernUI +- (BOOL)creatorClientConfigEnableStudioModernizedMdeThumbnailPickerForClient { return NO; } +- (BOOL)cxClientEnableModernizedActionSheet { return NO; } +- (BOOL)enableClientShortsSheetsModernization { return NO; } +- (BOOL)enableTimestampModernizationForNative { return NO; } +- (BOOL)mainAppCoreClientIosEnableModernOssPage { return NO; } +- (BOOL)modernizeElementsTextColor { return NO; } +- (BOOL)modernizeElementsBgColor { return NO; } +- (BOOL)modernizeCollectionLockups { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableEpUxUpdates { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableModernButtonsForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableModernButtonsForNativeLongTail { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableModernTabsForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigIosEnableSnackbarModernization { return NO; } +// Disable Rounded Content - YTNoModernUI +- (BOOL)iosEnableRoundedSearchBar { return NO; } +- (BOOL)enableIosRoundedSearchBar { return NO; } +- (BOOL)enableIosSearchBar { return NO; } +- (BOOL)iosDownloadsPageRoundedThumbs { return NO; } +- (BOOL)iosRoundedSearchBarSuggestZeroPadding { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedThumbnailsForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedThumbnailsForNativeLongTail { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedTimestampForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableRoundedDialogForNative { return NO; } +// Disable Darker Dark Mode - YTNoModernUI +- (BOOL)enableDarkerDarkMode { return NO; } +- (BOOL)useDarkerPaletteBgColorForElements { return NO; } +- (BOOL)useDarkerPaletteTextColorForElements { return NO; } +- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteTextColorForNative { return NO; } +- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; } +// Disable Ambient Mode - YTNoModernUI +- (BOOL)disableCinematicForLowPowerMode { return NO; } +- (BOOL)enableCinematicContainer { return NO; } +- (BOOL)enableCinematicContainerOnClient { return NO; } +- (BOOL)enableCinematicContainerOnTablet { return NO; } +- (BOOL)iosCinematicContainerClientImprovement { return NO; } +- (BOOL)iosEnableGhostCardInlineTitleCinematicContainerFix { return NO; } +- (BOOL)iosUseFineScrubberMosaicStoreForCinematic { return NO; } +- (BOOL)mainAppCoreClientEnableClientCinematicPlaylists { return NO; } +- (BOOL)mainAppCoreClientEnableClientCinematicPlaylistsPostMvp { return NO; } +- (BOOL)mainAppCoreClientEnableClientCinematicTablets { return NO; } +// 16.42.3 Styled YouTube Channel Page Interface - YTNoModernUI +- (BOOL)channelsClientConfigIosChannelNavRestructuring { return NO; } +- (BOOL)channelsClientConfigIosMultiPartChannelHeader { return NO; } +// Disable Optional Content - YTNoModernUI +- (BOOL)elementsClientIosElementsEnableLayoutUpdateForIob { return NO; } +- (BOOL)supportElementsInMenuItemSupportedRenderers { return NO; } +- (BOOL)isNewRadioButtonStyleEnabled { return NO; } +- (BOOL)uiSystemsClientGlobalConfigEnableButtonSentenceCasingForNative { return NO; } +%end + +%hook YTHotConfig +- (BOOL)liveChatIosUseModernRotationDetectiom { return NO; } // Disable Modern Content (YTHotConfig) +- (BOOL)iosShouldRepositionChannelBar { return NO; } +- (BOOL)enableElementRendererOnChannelCreation { return NO; } +%end +%end + +// Hide YouTube Logo +%group gHideYouTubeLogo +%hook YTHeaderLogoController +- (YTHeaderLogoController *)init { + return NULL; +} +%end +%end + +// Hide YouTube Heatwaves in Video Player (YouTube v17.19.2-latest) - @level3tjg - https://www.reddit.com/r/jailbreak/comments/v29yvk/ +%group gHideHeatwaves +%hook YTInlinePlayerBarContainerView +- (BOOL)canShowHeatwave { return NO; } +%end +%end + +# pragma mark - Hide Notification Button && SponsorBlock Button +%hook YTRightNavigationButtons +- (void)layoutSubviews { + %orig; + if (IsEnabled(@"hideNotificationButton_enabled")) { + self.notificationButton.hidden = YES; + } + if (IsEnabled(@"hideSponsorBlockButton_enabled")) { + self.sponsorBlockButton.hidden = YES; + } +} +%end + // YTReExplore: https://github.com/PoomSmart/YTReExplore/ %group gReExplore static void replaceTab(YTIGuideResponse *response) { @@ -400,12 +584,13 @@ static void replaceTab(YTIGuideResponse *response) { %end // YTSpeed - https://github.com/Lyvendia/YTSpeed +%group gYTSpeed %hook YTVarispeedSwitchController - (id)init { id result = %orig; - const int size = 12; - float speeds[] = {0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0}; + const int size = 17; + float speeds[] = {0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 5.0}; id varispeedSwitchControllerOptions[size]; for (int i = 0; i < size; ++i) { @@ -445,6 +630,7 @@ static void replaceTab(YTIGuideResponse *response) { %orig; } %end +%end # pragma mark - uYouPlus // Video Player Options @@ -474,20 +660,20 @@ static void replaceTab(YTIGuideResponse *response) { %group gStockVolumeHUD %hook YTVolumeBarView - (void)volumeChanged:(id)arg1 { - %orig(nil); + %orig(nil); } %end %hook UIApplication - (void)setSystemVolumeHUDEnabled:(BOOL)arg1 forAudioCategory:(id)arg2 { - %orig(true, arg2); + %orig(true, arg2); } %end %end -%hook YTDoubleTapToSeekController -- (void)enableDoubleTapToSeek:(BOOL)arg1 { - return IsEnabled(@"doubleTapToSeek_disabled") ? %orig(NO) : %orig; +%hook YTMainAppVideoPlayerOverlayViewController +- (BOOL)allowDoubleTapToSeekGestureRecognizer { + return IsEnabled(@"disableDoubleTapToSkip_enabled") ? NO : %orig; } %end @@ -524,6 +710,27 @@ static void replaceTab(YTIGuideResponse *response) { - (BOOL)removeNextPaddleForSingletonVideos { return YES; } - (BOOL)removePreviousPaddleForSingletonVideos { return YES; } %end + +// %hook YTMainAppControlsOverlayView // this is only used for v16.42.3 (incompatible with YouTube v17.xx.x-newer) +// - (void)layoutSubviews { // hide Next & Previous legacy buttons +// %orig; +// if (IsEnabled(@"hidePreviousAndNextButton_enabled")) { +// MSHookIvar(self, "_nextButton").hidden = YES; +// MSHookIvar(self, "_previousButton").hidden = YES; +// MSHookIvar(self, "_nextButtonView").hidden = YES; +// MSHookIvar(self, "_previousButtonView").hidden = YES; +// } +// } +// %end +%end + +// Hide Overlay Dark Background +%group gHideOverlayDarkBackground +%hook YTMainAppVideoPlayerOverlayView +- (void)setBackgroundVisible:(BOOL)arg1 { + %orig(NO); +} +%end %end // Replace Next & Previous button with Fast forward & Rewind button @@ -534,13 +741,34 @@ static void replaceTab(YTIGuideResponse *response) { %end %end -// Bring back the red progress bar - Broken?! +%group gHideVideoPlayerShadowOverlayButtons +%hook YTMainAppControlsOverlayView +- (void)layoutSubviews { + %orig(); + MSHookIvar(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 YTInlinePlayerBarContainerView - (id)quietProgressBarColor { - return IsEnabled(@"redProgressBar_enabled") ? [UIColor redColor] : %orig; + return [UIColor redColor]; } %end +%hook YTSegmentableInlinePlayerBarView +- (void)setBufferedProgressBarColor:(id)arg1 { + [UIColor colorWithRed:1.00 green:1.00 blue:1.00 alpha:0.90]; +} +%end +%end + // Disable the right panel in fullscreen mode %hook YTColdConfig - (BOOL)isLandscapeEngagementPanelEnabled { @@ -574,44 +802,239 @@ static void replaceTab(YTIGuideResponse *response) { // Theme Options // Old dark theme (gray) %group gOldDarkTheme -%hook YTColdConfig -- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; } -- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteTextColorForNative { return NO; } -- (BOOL)enableCinematicContainerOnClient { return NO; } -%end - -%hook _ASDisplayView -- (void)didMoveToWindow { - %orig; - if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor clearColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor clearColor]; } +UIColor *customColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]; +%hook YTCommonColorPalette +- (UIColor *)brandBackgroundSolid { + return self.pageStyle == 1 ? customColor : %orig; +} +- (UIColor *)brandBackgroundPrimary { + return self.pageStyle == 1 ? customColor : %orig; +} +- (UIColor *)brandBackgroundSecondary { + return self.pageStyle == 1 ? [customColor colorWithAlphaComponent:0.9] : %orig; +} +- (UIColor *)raisedBackground { + return self.pageStyle == 1 ? customColor : %orig; +} +- (UIColor *)staticBrandBlack { + return self.pageStyle == 1 ? customColor : %orig; +} +- (UIColor *)generalBackgroundA { + return self.pageStyle == 1 ? customColor : %orig; } %end +%hook YTInnerTubeCollectionViewController +- (UIColor *)backgroundColor:(NSInteger)pageStyle { + return pageStyle == 1 ? customColor : %orig; +} +%end + +BOOL areColorsEqual(UIColor *color1, UIColor *color2, CGFloat tolerance) { + CGFloat r1, g1, b1, a1, r2, g2, b2, a2; + [color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1]; + [color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2]; + + return (fabs(r1 - r2) <= tolerance) && + (fabs(g1 - g2) <= tolerance) && + (fabs(b1 - b2) <= tolerance) && + (fabs(a1 - a2) <= tolerance); +} + +// %hook UIView +// - (void)setBackgroundColor:(UIColor *)color { +// UIColor *targetColor = [UIColor colorWithRed:0.0588235 green:0.0588235 blue:0.0588235 alpha:1]; +// CGFloat tolerance = 0.01; // Adjust this value as needed +// +// if (areColorsEqual(color, targetColor, tolerance)) { +// color = customColor; +// } +// %orig(color); +// } +// %end + +%hook UIDeviceWhiteColor +- (UIColor *)backgroundColor:(NSInteger)pageStyle { + return pageStyle == 1 ? customColor : %orig; +} +%end + +// Explore +%hook ASScrollView +- (void)didMoveToWindow { + %orig; + if (isDarkMode()) { + self.backgroundColor = [UIColor clearColor]; + } +} +%end + +// Your videos %hook ASCollectionView - (void)didMoveToWindow { %orig; - self.superview.backgroundColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0]; + if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) { + self.superview.backgroundColor = customColor; + } } %end -%hook YTFullscreenEngagementOverlayView +// Sub? +%hook ELMView - (void)didMoveToWindow { %orig; - self.subviews[0].backgroundColor = [UIColor clearColor]; + if (isDarkMode()) { + self.subviews[0].backgroundColor = customColor; + } } %end -%hook YTRelatedVideosView +// iSponsorBlock +%hook SponsorBlockSettingsController +- (void)viewDidLoad { + if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { + %orig; + self.tableView.backgroundColor = customColor; + } else { return %orig; } +} +%end + +%hook SponsorBlockViewController +- (void)viewDidLoad { + if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) { + %orig; + self.view.backgroundColor = customColor; + } else { return %orig; } +} +%end + +// Search View +%hook YTSearchBarView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +// History Search view +%hook YTSearchBoxView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +// Comment view +%hook YTCommentView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +%hook YTCreateCommentAccessoryView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +%hook YTCreateCommentTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment + return isDarkMode() ? %orig([UIColor whiteColor]) : %orig; +} +%end + +%hook YTCommentDetailHeaderCell - (void)didMoveToWindow { %orig; - self.subviews[0].backgroundColor = [UIColor clearColor]; + if (isDarkMode()) { + self.subviews[2].backgroundColor = customColor; + } +} +%end + +%hook YTFormattedStringLabel // YT is werid... +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig([UIColor clearColor]) : %orig; +} +%end + +// Live chat comment +%hook YCHLiveChatActionPanelView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +%hook YTEmojiTextView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +%hook YCHLiveChatView +- (void)didMoveToWindow { + %orig; + if (isDarkMode()) { + self.subviews[1].backgroundColor = customColor; + } +} +%end + +// +%hook YTBackstageCreateRepostDetailView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +// Others +%hook _ASDisplayView +- (void)didMoveToWindow { + %orig; + if (isDarkMode()) { + if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = customColor; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; } + } +} +%end + +// Open link with... +%hook ASWAppSwitchingSheetHeaderView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +%hook ASWAppSwitchingSheetFooterView +- (void)setBackgroundColor:(UIColor *)color { + return isDarkMode() ? %orig(customColor) : %orig; +} +%end + +%hook ASWAppSwitcherCollectionViewCell +- (void)didMoveToWindow { + %orig; + if (isDarkMode()) { + self.backgroundColor = customColor; + self.subviews[1].backgroundColor = customColor; + self.superview.backgroundColor = customColor; + } } %end %end // OLED dark mode by BandarHL -UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0]; +UIColor* raisedColor = [UIColor blackColor]; %group gOLED %hook YTCommonColorPalette - (UIColor *)brandBackgroundSolid { @@ -640,6 +1063,34 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: } %end +// %hook UIView +// - (void)setBackgroundColor:(UIColor *)color { +// UIColor *targetColor = [UIColor colorWithRed:0.0588235 green:0.0588235 blue:0.0588235 alpha:1]; +// CGFloat tolerance = 0.01; // Adjust this value as needed +// +// if (areColorsEqual(color, targetColor, tolerance)) { +// color = [UIColor blackColor]; +// } +// %orig(color); +// } +// %end + +%hook UIDeviceWhiteColor +- (UIColor *)backgroundColor:(NSInteger)pageStyle { + return pageStyle == 1 ? [UIColor blackColor] : %orig; +} +%end + +// Hide separators +%hook YTCollectionSeparatorView +%property (nonatomic, assign, setter=setHidden:) BOOL hidden; + +- (void)setHidden:(BOOL)hidden { + %orig(hidden); +} + +%end + // Explore %hook ASScrollView - (void)didMoveToWindow { @@ -660,12 +1111,12 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: } %end -// Sub menu? +// Sub? %hook ELMView - (void)didMoveToWindow { %orig; if (isDarkMode()) { - self.subviews[0].backgroundColor = [UIColor clearColor]; + self.subviews[0].backgroundColor = [UIColor blackColor]; } } %end @@ -700,7 +1151,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %hook YTSearchBoxView - (void)setBackgroundColor:(UIColor *)color { return isDarkMode() ? %orig([UIColor blackColor]) : %orig; - } %end @@ -763,12 +1213,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: } %end -%hook YTCollectionView -- (void)setBackgroundColor:(UIColor *)color { - return isDarkMode() ? %orig([UIColor blackColor]) : %orig; -} -%end - // %hook YTBackstageCreateRepostDetailView - (void)setBackgroundColor:(UIColor *)color { @@ -783,7 +1227,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: if (isDarkMode()) { if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; } if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"eml.live_chat_text_message"]) { self.backgroundColor = [UIColor blackColor]; } if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; } if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; } if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; } @@ -792,7 +1235,7 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; } if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; } if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; } - if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; } + if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; } } } %end @@ -883,6 +1326,13 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %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 @@ -896,6 +1346,14 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %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 %group giPhoneLayout @@ -911,12 +1369,12 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: %end %hook UIKBTree - (long long)nativeIdiom { - return YES; + return NO; } %end %hook UIKBRenderer - (long long)assetIdiom { - return YES; + return NO; } %end %end @@ -949,36 +1407,63 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: if (IsEnabled(@"replacePreviousAndNextButton_enabled")) { %init(gReplacePreviousAndNextButton); } - if (oledDarkTheme()) { - %init(gOLED); + if (IsEnabled(@"hideOverlayDarkBackground_enabled")) { + %init(gHideOverlayDarkBackground); + } + if (IsEnabled(@"hideVideoPlayerShadowOverlayButtons_enabled")) { + %init(gHideVideoPlayerShadowOverlayButtons); + } + if (IsEnabled(@"disableWifiRelatedSettings_enabled")) { + %init(gDisableWifiRelatedSettings); } if (oldDarkTheme()) { %init(gOldDarkTheme) } + if (oledDarkTheme()) { + %init(gOLED) + } if (IsEnabled(@"oledKeyBoard_enabled")) { %init(gOLEDKB); } if (IsEnabled(@"disableHints_enabled")) { %init(gDisableHints); } + if (IsEnabled(@"redProgressBar_enabled")) { + %init(gRedProgressBar); + } + if (IsEnabled(@"stickNavigationBar_enabled")) { + %init(gStickNavigationBar); + } if (IsEnabled(@"hideChipBar_enabled")) { %init(gHideChipBar); } + if (IsEnabled(@"ytSpeed_enabled")) { + %init(gYTSpeed); + } if (IsEnabled(@"iPhoneLayout_enabled") && (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)) { %init(giPhoneLayout); - } + } if (IsEnabled(@"stockVolumeHUD_enabled")) { %init(gStockVolumeHUD); } + if (IsEnabled(@"hideYouTubeLogo_enabled")) { + %init(gHideYouTubeLogo); + } + if (IsEnabled(@"hideHeatwaves_enabled")) { + %init(gHideHeatwaves); + } + if (IsEnabled(@"ytNoModernUI_enabled")) { + %init(gYTNoModernUI); + } // Disable updates [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"automaticallyCheckForUpdates"]; // Don't show uYou's welcome screen cuz it's currently broken (fix #1147) [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"showedWelcomeVC"]; - + // Disable broken options of uYou - [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"disableAgeRestriction"]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"disableAgeRestriction"]; // Disable Age Restriction Disabled - Reason is the same as above. // Change the default value of some options NSArray *allKeys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys]; @@ -986,7 +1471,7 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha: [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"]; } if (![allKeys containsObject:@"shortsProgressBar"]) { - [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"shortsProgressBar"]; + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"shortsProgressBar"]; } if (![allKeys containsObject:@"RYD-ENABLED"]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"RYD-ENABLED"];