diff --git a/Source/Patches.xm b/Source/Patches.xm new file mode 100644 index 0000000..f4710f3 --- /dev/null +++ b/Source/Patches.xm @@ -0,0 +1,144 @@ +#import "../uYouPlus.h" + +# pragma mark - YouTube patches + +// Fix Google Sign in by @PoomSmart and @level3tjg (qnblackcat/uYouPlus#684) +%hook NSBundle +- (NSDictionary *)infoDictionary { + NSMutableDictionary *info = %orig.mutableCopy; + NSString *altBundleIdentifier = info[@"ALTBundleIdentifier"]; + if (altBundleIdentifier) info[@"CFBundleIdentifier"] = altBundleIdentifier; + return info; +} +%end + +// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263 +%hook YTDataUtils ++ (NSMutableDictionary *)spamSignalsDictionary { + return nil; +} ++ (NSMutableDictionary *)spamSignalsDictionaryWithoutIDFA { + return nil; +} +%end + +%hook YTHotConfig +- (BOOL)disableAfmaIdfaCollection { return NO; } +%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 +*/ + +// https://github.com/PoomSmart/YouTube-X/blob/1e62b68e9027fcb849a75f54a402a530385f2a51/Tweak.x#L27 +// %hook YTAdsInnerTubeContextDecorator +// - (void)decorateContext:(id)context {} +// %end + +# pragma mark - uYou patches +// Crash fix for uYou >= 18.43.4 (https://github.com/iCrazeiOS/uYouCrashFix) +%hook YTPlayerViewController +%new +-(float)currentPlaybackRateForVarispeedSwitchController:(id)arg1 { + return [[self activeVideo] playbackRate]; +} +%new +-(void)varispeedSwitchController:(id)arg1 didSelectRate:(float)arg2 { + [[self activeVideo] setPlaybackRate:arg2]; +} +%end + +// Workaround for qnblackcat/uYouPlus#10 +%hook UIViewController +- (UITraitCollection *)traitCollection { + @try { + return %orig; + } @catch(NSException *e) { + return [UITraitCollection currentTraitCollection]; + } +} +%end + +// Prevent uYou player bar from showing when not playing downloaded media +%hook PlayerManager +- (void)pause { + if (isnan([self progress])) + return; + %orig; +} +%end + +// Workaround for issue #54 +%hook YTMainAppVideoPlayerOverlayViewController +- (void)updateRelatedVideos { + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {} + else { return %orig; } +} +%end + +// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224 +%group iOS16 +%hook OBPrivacyLinkButton +%new +- (instancetype)initWithCaption:(NSString *)caption + buttonText:(NSString *)buttonText + image:(UIImage *)image + imageSize:(CGSize)imageSize + useLargeIcon:(BOOL)useLargeIcon { + return [self initWithCaption:caption + buttonText:buttonText + image:image + imageSize:imageSize + useLargeIcon:useLargeIcon + displayLanguage:[NSLocale currentLocale].languageCode]; +} +%end +%end + +// Fix streched artwork in uYou's player view - https://github.com/MiRO92/uYou-for-YouTube/issues/287 +%hook ArtworkImageView +- (id)imageView { + UIImageView * imageView = %orig; + imageView.contentMode = UIViewContentModeScaleAspectFit; + // Make artwork a bit bigger + UIView *artworkImageView = imageView.superview; + if (artworkImageView != nil && !artworkImageView.translatesAutoresizingMaskIntoConstraints) { + [artworkImageView.leftAnchor constraintEqualToAnchor:artworkImageView.superview.leftAnchor constant:16].active = YES; + [artworkImageView.rightAnchor constraintEqualToAnchor:artworkImageView.superview.rightAnchor constant:-16].active = YES; + } + return imageView; +} +%end + +%ctor { + %init; + if (@available(iOS 16, *)) { + %init(iOS16); + } +}