diff --git a/Sources/uYouPlus.xm b/Sources/uYouPlus.xm index bd9f160..5bd4753 100644 --- a/Sources/uYouPlus.xm +++ b/Sources/uYouPlus.xm @@ -105,6 +105,14 @@ NSBundle *tweakBundle = uYouPlusBundle(); - (void)decorateContext:(id)context { %orig(nil); } %end +%hook YTLocalPlaybackController +- (id)createAdsPlaybackCoordinator { return nil; } +%end + +%hook MDXSession +- (void)adPlaying:(id)ad {} +%end + %hook YTReelInfinitePlaybackDataSource - (void)setReels:(NSMutableOrderedSet *)reels { [reels removeObjectsAtIndexes:[reels indexesOfObjectsPassingTest:^BOOL(YTReelModel *obj, NSUInteger idx, BOOL *stop) { @@ -138,6 +146,12 @@ NSBundle *tweakBundle = uYouPlusBundle(); %hook YTAccountScopedAdsInnerTubeContextDecorator - (void)decorateContext:(id)context { %orig(nil); } %end +%hook YTLocalPlaybackController +- (id)createAdsPlaybackCoordinator { return nil; } +%end +%hook MDXSession +- (void)adPlaying:(id)ad {} +%end %hook YTReelInfinitePlaybackDataSource - (void)setReels:(NSMutableOrderedSet *)reels { [reels removeObjectsAtIndexes:[reels indexesOfObjectsPassingTest:^BOOL(YTReelModel *obj, NSUInteger idx, BOOL *stop) { @@ -147,8 +161,6 @@ NSBundle *tweakBundle = uYouPlusBundle(); } %end NSString *getAdString(NSString *description) { - if ([description containsString:@"ad_layout"]) - return @"ad_layout"; if ([description containsString:@"brand_promo"]) return @"brand_promo"; if ([description containsString:@"carousel_footered_layout"]) @@ -185,53 +197,48 @@ NSString *getAdString(NSString *description) { return @"video_display_full_buttoned_layout"; return nil; } -static __strong NSData *cellDividerData; -%hook YTIElementRenderer -- (NSData *)elementData { - NSString *description = [self description]; - if ([description containsString:@"cell_divider"]) { - if (!cellDividerData) cellDividerData = %orig; - return cellDividerData; - } - if (!cellDividerData) return %orig; - if ([self respondsToSelector:@selector(hasCompatibilityOptions)] && self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) { - HBLogDebug(@"YTX adLogging 1 %@", cellDividerData); - return cellDividerData; +static BOOL isAdRenderer(YTIElementRenderer *elementRenderer, int kind) { + if ([elementRenderer respondsToSelector:@selector(hasCompatibilityOptions)] && elementRenderer.hasCompatibilityOptions && elementRenderer.compatibilityOptions.hasAdLoggingData) { + HBLogDebug(@"YTX adLogging %d %@", kind, elementRenderer); + return YES; } + NSString *description = [elementRenderer description]; NSString *adString = getAdString(description); if (adString) { - HBLogDebug(@"YTX getAdString 1 %@ %@", adString, cellDividerData); - return cellDividerData; + HBLogDebug(@"YTX getAdString %d %@ %@", kind, adString, elementRenderer); + return YES; } - return %orig; + return NO; } -%end -%hook YTInnerTubeCollectionViewController -- (void)loadWithModel:(YTISectionListRenderer *)model { - if ([model isKindOfClass:%c(YTISectionListRenderer)]) { - NSMutableArray *contentsArray = model.contentsArray; - NSIndexSet *removeIndexes = [contentsArray indexesOfObjectsPassingTest:^BOOL(YTISectionListSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { - if (![renderers isKindOfClass:%c(YTISectionListSupportedRenderers)]) - return NO; - YTIItemSectionRenderer *sectionRenderer = renderers.itemSectionRenderer; - YTIItemSectionSupportedRenderers *firstObject = [sectionRenderer.contentsArray firstObject]; - YTIElementRenderer *elementRenderer = firstObject.elementRenderer; - if ([elementRenderer respondsToSelector:@selector(hasCompatibilityOptions)] && elementRenderer.hasCompatibilityOptions && elementRenderer.compatibilityOptions.hasAdLoggingData) { - HBLogDebug(@"YTX adLogging 2 %@", elementRenderer); - return YES; - } - NSString *description = [elementRenderer description]; - NSString *adString = getAdString(description); - if (adString) { - HBLogDebug(@"YTX getAdString 2 %@ %@", adString, elementRenderer); - return YES; - } +static NSMutableArray *filteredArray(NSArray *array) { + NSMutableArray *newArray = [array mutableCopy]; + NSIndexSet *removeIndexes = [newArray indexesOfObjectsPassingTest:^BOOL(YTIItemSectionRenderer *sectionRenderer, NSUInteger idx, BOOL *stop) { + if (![sectionRenderer isKindOfClass:%c(YTIItemSectionRenderer)]) return NO; - }]; - [contentsArray removeObjectsAtIndexes:removeIndexes]; - } + NSMutableArray *contentsArray = sectionRenderer.contentsArray; + if (contentsArray.count > 1) { + NSIndexSet *removeContentsArrayIndexes = [contentsArray indexesOfObjectsPassingTest:^BOOL(YTIItemSectionSupportedRenderers *sectionSupportedRenderers, NSUInteger idx2, BOOL *stop2) { + YTIElementRenderer *elementRenderer = sectionSupportedRenderers.elementRenderer; + return isAdRenderer(elementRenderer, 3); + }]; + [contentsArray removeObjectsAtIndexes:removeContentsArrayIndexes]; + } + YTIItemSectionSupportedRenderers *firstObject = [contentsArray firstObject]; + YTIElementRenderer *elementRenderer = firstObject.elementRenderer; + return isAdRenderer(elementRenderer, 2); + }]; + [newArray removeObjectsAtIndexes:removeIndexes]; + return newArray; +} +%hook YTInnerTubeCollectionViewController +- (void)displaySectionsWithReloadingSectionControllerByRenderer:(id)renderer { + NSMutableArray *sectionRenderers = [self valueForKey:@"_sectionRenderers"]; + [self setValue:filteredArray(sectionRenderers) forKey:@"_sectionRenderers"]; %orig; } +- (void)addSectionsFromArray:(NSArray *)array { + %orig(filteredArray(array)); +} %end %end