|
32 | 32 | - (NSData *)elementData { |
33 | 33 | if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) return nil; |
34 | 34 |
|
35 | | - NSArray *adDescriptions = @[@"brand_promo", @"product_carousel", @"product_engagement_panel", @"product_item", @"text_search_ad", @"text_image_button_layout", @"carousel_headered_layout", @"square_image_layout", @"feed_ad_metadata"]; |
| 35 | + NSArray *adDescriptions = @[@"brand_promo", @"product_carousel", @"product_engagement_panel", @"product_item", @"text_search_ad", @"text_image_button_layout", @"carousel_headered_layout", @"carousel_footered_layout", @"square_image_layout", @"landscape_image_wide_button_layout", @"feed_ad_metadata"]; |
36 | 36 | NSString *description = [self description]; |
37 | 37 | if (([adDescriptions containsObject:description] && kNoAds) || ([description containsString:@"inline_shorts"] && kHideShorts)) { |
38 | 38 | return [NSData data]; |
|
389 | 389 | - (BOOL)shouldExitFullScreenOnFinish { return kExitFullscreen ? YES : NO; } |
390 | 390 | %end |
391 | 391 |
|
392 | | -// Disable Double Tap To Seek |
393 | 392 | %hook YTMainAppVideoPlayerOverlayViewController |
| 393 | +// Disable Double Tap To Seek |
394 | 394 | - (BOOL)allowDoubleTapToSeekGestureRecognizer { return kNoDoubleTapToSeek ? NO : %orig; } |
| 395 | + |
| 396 | +// Copy Timestamped Link by Pressing On Pause |
| 397 | +- (void)didPressPause:(id)arg1 { |
| 398 | + %orig; |
| 399 | + |
| 400 | + if (kCopyWithTimestamp) { |
| 401 | + NSInteger mediaTimeInteger = (NSInteger)self.mediaTime; |
| 402 | + NSString *currentTimeLink = [NSString stringWithFormat:@"https://www.youtube.com/watch?v=%@&t=%lds", self.videoID, mediaTimeInteger]; |
| 403 | + |
| 404 | + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; |
| 405 | + pasteboard.string = currentTimeLink; |
| 406 | + } |
| 407 | +} |
395 | 408 | %end |
396 | 409 |
|
397 | 410 | // Fit 'Play All' Buttons Text For Localizations |
|
528 | 541 | - (void)layoutSubviews { |
529 | 542 | %orig; |
530 | 543 | if (kHideShortsDescription && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.reels_smv_player_title_label"]) self.subviews[2].hidden = YES; |
531 | | - if (kHideShortsThanks && [self.subviews[self.subviews.count - 3].accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.subviews[self.subviews.count - 3].hidden = YES; // Might be useful for older versions |
532 | 544 | if (kHideShortsChannelName) self.subviews[self.subviews.count - 2].hidden = YES; |
533 | 545 | if (kHideShortsAudioTrack) self.subviews.lastObject.hidden = YES; |
534 | 546 | for (UIView *subview in self.subviews) { |
|
539 | 551 | } |
540 | 552 | %end |
541 | 553 |
|
542 | | -%hook YTELMView |
| 554 | + |
| 555 | +%hook _ASDisplayView |
543 | 556 | - (void)layoutSubviews { |
544 | 557 | %orig; |
545 | | - if (kHideShortsThanks && [self.subviews.firstObject.accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.subviews.firstObject.hidden = YES; |
| 558 | + if (kHideShortsThanks && [self.accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.hidden = YES; |
546 | 559 | } |
547 | 560 | %end |
548 | 561 |
|
@@ -608,6 +621,12 @@ static void replaceTab(YTIGuideResponse *response) { |
608 | 621 | } |
609 | 622 | %end |
610 | 623 |
|
| 624 | +// Hide Tab Bar Indicators |
| 625 | +%hook YTPivotBarIndicatorView |
| 626 | +- (void)setFillColor:(id)arg1 { %orig(kRemoveIndicators ? [UIColor clearColor] : arg1); } |
| 627 | +- (void)setBorderColor:(id)arg1 { %orig(kRemoveIndicators ? [UIColor clearColor] : arg1); } |
| 628 | +%end |
| 629 | + |
611 | 630 | // Hide Tab Labels |
612 | 631 | BOOL hasHomeBar = NO; |
613 | 632 | CGFloat pivotBarViewHeight; |
@@ -745,6 +764,7 @@ static void reloadPrefs() { |
745 | 764 | kNoWatermarks = [prefs[@"noWatermarks"] boolValue] ?: NO; |
746 | 765 | kMiniplayer = [prefs[@"miniplayer"] boolValue] ?: NO; |
747 | 766 | kPortraitFullscreen = [prefs[@"portraitFullscreen"] boolValue] ?: NO; |
| 767 | + kCopyWithTimestamp = [prefs[@"copyWithTimestamp"] boolValue] ?: NO; |
748 | 768 | kDisableAutoplay = [prefs[@"disableAutoplay"] boolValue] ?: NO; |
749 | 769 | kNoContentWarning = [prefs[@"noContentWarning"] boolValue] ?: NO; |
750 | 770 | kClassicQuality = [prefs[@"classicQuality"] boolValue] ?: NO; |
@@ -776,6 +796,7 @@ static void reloadPrefs() { |
776 | 796 | kHideShortsAudioTrack = [prefs[@"hideShortsAudioTrack"] boolValue] ?: NO; |
777 | 797 | kHideShortsPromoCards = [prefs[@"hideShortsPromoCards"] boolValue] ?: NO; |
778 | 798 | kRemoveLabels = [prefs[@"removeLabels"] boolValue] ?: NO; |
| 799 | + kRemoveIndicators = [prefs[@"removeIndicators"] boolValue] ?: NO; |
779 | 800 | kReExplore = [prefs[@"reExplore"] boolValue] ?: NO; |
780 | 801 | kRemoveShorts = [prefs[@"removeShorts"] boolValue] ?: NO; |
781 | 802 | kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO; |
@@ -816,6 +837,7 @@ static void reloadPrefs() { |
816 | 837 | @"noWatermarks" : @(kNoWatermarks), |
817 | 838 | @"miniplayer" : @(kMiniplayer), |
818 | 839 | @"portraitFullscreen" : @(kPortraitFullscreen), |
| 840 | + @"copyWithTimestamp" : @(kCopyWithTimestamp), |
819 | 841 | @"disableAutoplay" : @(kDisableAutoplay), |
820 | 842 | @"noContentWarning" : @(kNoContentWarning), |
821 | 843 | @"classicQuality" : @(kClassicQuality), |
@@ -847,6 +869,7 @@ static void reloadPrefs() { |
847 | 869 | @"hideShortsAudioTrack" : @(kHideShortsAudioTrack), |
848 | 870 | @"hideShortsPromoCards" : @(kHideShortsPromoCards), |
849 | 871 | @"removeLabels" : @(kRemoveLabels), |
| 872 | + @"removeIndicators" : @(kRemoveIndicators), |
850 | 873 | @"reExplore" : @(kReExplore), |
851 | 874 | @"removeShorts" : @(kRemoveShorts), |
852 | 875 | @"removeSubscriptions" : @(kRemoveSubscriptions), |
|
0 commit comments