From 870e7ba5b4b62d5ffa946fada25120c51813c03d Mon Sep 17 00:00:00 2001 From: dayanch96 <38832025+dayanch96@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:00:29 +0300 Subject: [PATCH] 2.5 --- Makefile | 2 +- Settings.x | 96 ++-- Sideloading.x | 40 +- YTLite.h | 116 +++- YTLite.x | 537 ++++++++++++------ .../en.lproj/Localizable.strings | 38 +- .../es.lproj/Localizable.strings | 28 + .../fr.lproj/Localizable.strings | 30 +- .../ja.lproj/Localizable.strings | 28 + .../ru.lproj/Localizable.strings | 30 +- .../zh-Hans.lproj/Localizable.strings | 28 + .../zh-Hant.lproj/Localizable.strings | 28 + .../com.dvntm.ytlite_2.5_iphoneos-arm.deb | Bin 0 -> 59570 bytes .../com.dvntm.ytlite_2.5_iphoneos-arm64.deb | Bin 0 -> 59600 bytes 14 files changed, 750 insertions(+), 251 deletions(-) create mode 100644 packages/com.dvntm.ytlite_2.5_iphoneos-arm.deb create mode 100644 packages/com.dvntm.ytlite_2.5_iphoneos-arm64.deb diff --git a/Makefile b/Makefile index 4dd81b4..eaf7f29 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ endif DEBUG=0 FINALPACKAGE=1 ARCHS = arm64 -PACKAGE_VERSION = 2.4.1 +PACKAGE_VERSION = 2.5 TARGET := iphone:clang:latest:11.0 include $(THEOS)/makefiles/common.mk diff --git a/Settings.x b/Settings.x index 8a9dbb9..c52f204 100644 --- a/Settings.x +++ b/Settings.x @@ -6,19 +6,6 @@ static const NSInteger YTLiteSection = 789; -NSBundle *YTLiteBundle() { - static NSBundle *bundle = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"]; - if (tweakBundlePath) - bundle = [NSBundle bundleWithPath:tweakBundlePath]; - else - bundle = [NSBundle bundleWithPath:ROOT_PATH_NS("/Library/Application Support/YTLite.bundle")]; - }); - return bundle; -} - // Settings %hook YTAppSettingsPresentationData + (NSArray *)settingsCategoryOrder { @@ -66,12 +53,30 @@ NSBundle *YTLiteBundle() { static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleDescription, NSString *key, BOOL *value, id selfObject) { Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem); + Class YTAlertViewClass = %c(YTAlertView); YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:title titleDescription:titleDescription accessibilityIdentifier:nil switchOn:*value switchBlock:^BOOL(YTSettingsCell *cell, BOOL enabled) { - [selfObject updatePrefsForKey:key enabled:enabled]; + if ([key isEqualToString:@"shortsOnlyMode"]) { + YTAlertView *alertView = [YTAlertViewClass confirmationDialogWithAction:^{ + [selfObject updatePrefsForKey:@"shortsOnlyMode" enabled:enabled]; + } + actionTitle:LOC(@"Yes") + cancelAction:^{ + [cell setSwitchOn:!enabled animated:YES]; + } + cancelTitle:LOC(@"No")]; + alertView.title = LOC(@"Warning"); + alertView.subtitle = LOC(@"ShortsOnlyWarning"); + [alertView show]; + } + + else { + [selfObject updatePrefsForKey:key enabled:enabled]; + } + return YES; } settingItemId:0]; @@ -150,6 +155,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject), createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"endScreenCards", &kEndScreenCards, selfObject), createSwitchItem(LOC(@"NoFullscreenActions"), LOC(@"NoFullscreenActionsDesc"), @"noFullscreenActions", &kNoFullscreenActions, selfObject), + createSwitchItem(LOC(@"PersistentProgressBar"), LOC(@"PersistentProgressBarDesc"), @"persistentProgressBar", &kPersistentProgressBar, selfObject), createSwitchItem(LOC(@"NoRelatedVids"), LOC(@"NoRelatedVidsDesc"), @"noRelatedVids", &kNoRelatedVids, selfObject), createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject), createSwitchItem(LOC(@"NoWatermarks"), LOC(@"NoWatermarksDesc"), @"noWatermarks", &kNoWatermarks, selfObject) @@ -172,6 +178,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD createSwitchItem(LOC(@"PortraitFullscreen"), LOC(@"PortraitFullscreenDesc"), @"portraitFullscreen", &kPortraitFullscreen, selfObject), createSwitchItem(LOC(@"CopyWithTimestamp"), LOC(@"CopyWithTimestampDesc"), @"copyWithTimestamp", &kCopyWithTimestamp, selfObject), createSwitchItem(LOC(@"DisableAutoplay"), LOC(@"DisableAutoplayDesc"), @"disableAutoplay", &kDisableAutoplay, selfObject), + createSwitchItem(LOC(@"DisableAutoCaptions"), LOC(@"DisableAutoCaptionsDesc"), @"disableAutoCaptions", &kDisableAutoCaptions, selfObject), createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject), createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject), createSwitchItem(LOC(@"ExtraSpeedOptions"), LOC(@"ExtraSpeedOptionsDesc"), @"extraSpeedOptions", &kExtraSpeedOptions, selfObject), @@ -197,8 +204,11 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ + createSwitchItem(LOC(@"ShortsOnlyMode"), LOC(@"ShortsOnlyModeDesc"), @"shortsOnlyMode", &kShortsOnlyMode, selfObject), createSwitchItem(LOC(@"HideShorts"), LOC(@"HideShortsDesc"), @"hideShorts", &kHideShorts, selfObject), createSwitchItem(LOC(@"ShortsProgress"), LOC(@"ShortsProgressDesc"), @"shortsProgress", &kShortsProgress, selfObject), + createSwitchItem(LOC(@"PinchToFullscreenShorts"), LOC(@"PinchToFullscreenShortsDesc"), @"pinchToFullscreenShorts", &kPinchToFullscreenShorts, selfObject), + createSwitchItem(LOC(@"ShortsToRegular"), LOC(@"ShortsToRegularDesc"), @"shortsToRegular", &kShortsToRegular, selfObject), createSwitchItem(LOC(@"ResumeShorts"), LOC(@"ResumeShortsDesc"), @"resumeShorts", &kResumeShorts, selfObject), createSwitchItem(LOC(@"HideShortsLogo"), LOC(@"HideShortsLogoDesc"), @"hideShortsLogo", &kHideShortsLogo, selfObject), createSwitchItem(LOC(@"HideShortsSearch"), LOC(@"HideShortsSearchDesc"), @"hideShortsSearch", &kHideShortsSearch, selfObject), @@ -212,6 +222,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD createSwitchItem(LOC(@"HideShortsShare"), LOC(@"HideShortsShareDesc"), @"hideShortsShare", &kHideShortsShare, selfObject), createSwitchItem(LOC(@"HideShortsAvatars"), LOC(@"HideShortsAvatarsDesc"), @"hideShortsAvatars", &kHideShortsAvatars, selfObject), createSwitchItem(LOC(@"HideShortsThanks"), LOC(@"HideShortsThanksDesc"), @"hideShortsThanks", &kHideShortsThanks, selfObject), + createSwitchItem(LOC(@"HideShortsSource"), LOC(@"HideShortsSourceDesc"), @"hideShortsSource", &kHideShortsSource, selfObject), createSwitchItem(LOC(@"HideShortsChannelName"), LOC(@"HideShortsChannelNameDesc"), @"hideShortsChannelName", &kHideShortsChannelName, selfObject), createSwitchItem(LOC(@"HideShortsDescription"), LOC(@"HideShortsDescriptionDesc"), @"hideShortsDescription", &kHideShortsDescription, selfObject), createSwitchItem(LOC(@"HideShortsAudioTrack"), LOC(@"HideShortsAudioTrackDesc"), @"hideShortsAudioTrack", &kHideShortsAudioTrack, selfObject), @@ -234,6 +245,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD createSwitchItem(LOC(@"RemoveLabels"), LOC(@"RemoveLabelsDesc"), @"removeLabels", &kRemoveLabels, selfObject), createSwitchItem(LOC(@"RemoveIndicators"), LOC(@"RemoveIndicatorsDesc"), @"removeIndicators", &kRemoveIndicators, selfObject), createSwitchItem(LOC(@"ReExplore"), LOC(@"ReExploreDesc"), @"reExplore", &kReExplore, selfObject), + createSwitchItem(LOC(@"AddExplore"), LOC(@"AddExploreDesc"), @"addExplore", &kAddExplore, selfObject), createSwitchItem(LOC(@"HideShortsTab"), LOC(@"HideShortsTabDesc"), @"removeShorts", &kRemoveShorts, selfObject), createSwitchItem(LOC(@"HideSubscriptionsTab"), LOC(@"HideSubscriptionsTabDesc"), @"removeSubscriptions", &kRemoveSubscriptions, selfObject), createSwitchItem(LOC(@"HideUploadButton"), LOC(@"HideUploadButtonDesc"), @"removeUploads", &kRemoveUploads, selfObject), @@ -254,6 +266,10 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ + createSwitchItem(LOC(@"CopyPostText"), LOC(@"CopyPostTextDesc"), @"copyPostText", &kCopyPostText, selfObject), + createSwitchItem(LOC(@"SavePostImage"), LOC(@"SavePostImageDesc"), @"savePostImage", &kSavePostImage, selfObject), + createSwitchItem(LOC(@"SaveProfilePhoto"), LOC(@"SaveProfilePhotoDesc"), @"saveProfilePhoto", &kSaveProfilePhoto, selfObject), + createSwitchItem(LOC(@"FixAlbums"), LOC(@"FixAlbumsDesc"), @"fixAlbums", &kFixAlbums, selfObject), createSwitchItem(LOC(@"RemovePlayNext"), LOC(@"RemovePlayNextDesc"), @"removePlayNext", &kRemovePlayNext, selfObject), createSwitchItem(LOC(@"NoContinueWatching"), LOC(@"NoContinueWatchingDesc"), @"noContinueWatching", &kNoContinueWatching, selfObject), createSwitchItem(LOC(@"NoSearchHistory"), LOC(@"NoSearchHistoryDesc"), @"noSearchHistory", &kNoSearchHistory, selfObject), @@ -277,10 +293,12 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD detailTextBlock:^NSString *() { switch (kPivotIndex) { case 1: - return LOC(@"ShortsTab"); + return LOC(@"Explore"); case 2: - return LOC(@"Subscriptions"); + return LOC(@"ShortsTab"); case 3: + return LOC(@"Subscriptions"); + case 4: return LOC(@"Library"); case 0: default: @@ -295,6 +313,20 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; return YES; }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Explore") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *library, NSUInteger arg1) { + if (!kReExplore && !kAddExplore) { + YTAlertView *alertView = [%c(YTAlertView) infoDialog]; + alertView.title = LOC(@"Warning"); + alertView.subtitle = LOC(@"TabIsHidden"); + [alertView show]; + return NO; + } else { + kPivotIndex = 1; + [settingsViewController reloadData]; + [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; + return YES; + } + }], [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ShortsTab") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *shorts, NSUInteger arg1) { if (kRemoveShorts) { YTAlertView *alertView = [%c(YTAlertView) infoDialog]; @@ -303,7 +335,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD [alertView show]; return NO; } else { - kPivotIndex = 1; + kPivotIndex = 2; [settingsViewController reloadData]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; return YES; @@ -317,7 +349,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD [alertView show]; return NO; } else { - kPivotIndex = 2; + kPivotIndex = 3; [settingsViewController reloadData]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; return YES; @@ -331,7 +363,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD [alertView show]; return NO; } else { - kPivotIndex = 3; + kPivotIndex = 4; [settingsViewController reloadData]; [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; return YES; @@ -414,11 +446,9 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD }]; [sectionItems addObject:version]; - NSString *title = @"YTLite"; - if ([settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)]) - [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:title icon:nil titleDescription:nil headerHidden:NO]; - else - [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:title titleDescription:nil headerHidden:NO]; + BOOL isNew = [settingsViewController respondsToSelector:@selector(setSectionItems:forCategory:title:icon:titleDescription:headerHidden:)]; + isNew ? [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:@"YTLite" icon:nil titleDescription:nil headerHidden:NO] + : [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:@"YTLite" titleDescription:nil headerHidden:NO]; } @@ -440,15 +470,15 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{ - [prefs setObject:@(YES) forKey:@"advancedMode"]; - [prefs writeToFile:prefsPath atomically:NO]; - CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); - } - actionTitle:LOC(@"Yes") - cancelTitle:LOC(@"No")]; - alertView.title = @"YTLite"; - alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")]; - [alertView show]; + [prefs setObject:@(YES) forKey:@"advancedMode"]; + [prefs writeToFile:prefsPath atomically:NO]; + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); + } + actionTitle:LOC(@"Yes") + cancelTitle:LOC(@"No")]; + alertView.title = @"YTLite"; + alertView.subtitle = [NSString stringWithFormat:LOC(@"AdvancedModeReminder"), @"YTLite", LOC(@"Version"), LOC(@"Advanced")]; + [alertView show]; }); } } \ No newline at end of file diff --git a/Sideloading.x b/Sideloading.x index 5779075..739a6cc 100644 --- a/Sideloading.x +++ b/Sideloading.x @@ -71,31 +71,39 @@ static NSString *accessGroupID() { } %end -%hook NSBundle -- (NSString *)bundleIdentifier { +BOOL isSelf() { NSArray *address = [NSThread callStackReturnAddresses]; Dl_info info = {0}; - if (dladdr((void *)[address[2] longLongValue], &info) == 0) - return %orig; + if (dladdr((void *)[address[2] longLongValue], &info) == 0) return NO; NSString *path = [NSString stringWithUTF8String:info.dli_fname]; - if ([path hasPrefix:NSBundle.mainBundle.bundlePath]) - return YT_BUNDLE_ID; - return %orig; + return [path hasPrefix:NSBundle.mainBundle.bundlePath]; } + +%hook NSBundle +- (NSString *)bundleIdentifier { + return isSelf() ? YT_BUNDLE_ID : %orig; +} + +- (NSDictionary *)infoDictionary { + NSDictionary *dict = %orig; + if (!isSelf()) + return %orig; + NSMutableDictionary *info = [dict mutableCopy]; + if (info[@"CFBundleIdentifier"]) info[@"CFBundleIdentifier"] = YT_BUNDLE_ID; + if (info[@"CFBundleDisplayName"]) info[@"CFBundleDisplayName"] = YT_NAME; + if (info[@"CFBundleName"]) info[@"CFBundleName"] = YT_NAME; + return info; +} + - (id)objectForInfoDictionaryKey:(NSString *)key { + if (!isSelf()) + return %orig; if ([key isEqualToString:@"CFBundleIdentifier"]) return YT_BUNDLE_ID; if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"]) return YT_NAME; return %orig; } -// Fix Google Sign in by @PoomSmart and @level3tjg (qnblackcat/uYouPlus#684) -- (NSDictionary *)infoDictionary { - NSMutableDictionary *info = %orig.mutableCopy; - NSString *altBundleIdentifier = info[@"ALTBundleIdentifier"]; - if (altBundleIdentifier) info[@"CFBundleIdentifier"] = altBundleIdentifier; - return info; -} %end // Fix login for YouTube 18.13.2 and higher @@ -133,6 +141,6 @@ static NSString *accessGroupID() { %end %ctor { - if ([[NSFileManager defaultManager] fileExistsAtPath:[[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]]) - %init(gSideloading); + BOOL isAppStoreApp = [[NSFileManager defaultManager] fileExistsAtPath:[[NSBundle mainBundle] appStoreReceiptURL].path]; + if (!isAppStoreApp) %init(gSideloading); } diff --git a/YTLite.h b/YTLite.h index 8230fac..c75b430 100644 --- a/YTLite.h +++ b/YTLite.h @@ -1,6 +1,8 @@ #import #import #import +#import +#import "../YouTubeHeader/YTAlertView.h" #import "../YouTubeHeader/YTIGuideResponse.h" #import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h" #import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h" @@ -8,6 +10,7 @@ #import "../YouTubeHeader/YTIBrowseRequest.h" #import "../YouTubeHeader/YTISectionListRenderer.h" #import "../YouTubeHeader/YTQTMButton.h" +#import "../YouTubeHeader/YTIButtonRenderer.h" #import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h" #import "../YouTubeHeader/YTPlayerViewController.h" #import "../YouTubeHeader/YTWatchController.h" @@ -19,12 +22,25 @@ #import "../YouTubeHeader/YTSettingsPickerViewController.h" #import "../YouTubeHeader/YTUIUtils.h" #import "../YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h" +#import "../YouTubeHeader/YTToastResponderEvent.h" +#import "../YouTubeHeader/YTPageStyleController.h" -extern NSBundle *YTLiteBundle(); +static inline NSBundle *YTLiteBundle() { + static NSBundle *bundle = nil; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"]; + NSString *rootlessBundlePath = ROOT_PATH_NS("/Library/Application Support/YTLite.bundle"); + + bundle = [NSBundle bundleWithPath:tweakBundlePath ?: rootlessBundlePath]; + }); + + return bundle; +} static inline NSString *LOC(NSString *key) { - NSBundle *tweakBundle = YTLiteBundle(); - return [tweakBundle localizedStringForKey:key value:nil table:nil]; + return [YTLiteBundle() localizedStringForKey:key value:nil table:nil]; } BOOL kNoAds; @@ -44,6 +60,7 @@ BOOL kReplacePrevNext; BOOL kNoDarkBg; BOOL kEndScreenCards; BOOL kNoFullscreenActions; +BOOL kPersistentProgressBar; BOOL kNoRelatedVids; BOOL kNoPromotionCards; BOOL kNoWatermarks; @@ -51,6 +68,7 @@ BOOL kMiniplayer; BOOL kPortraitFullscreen; BOOL kCopyWithTimestamp; BOOL kDisableAutoplay; +BOOL kDisableAutoCaptions; BOOL kNoContentWarning; BOOL kClassicQuality; BOOL kExtraSpeedOptions; @@ -61,8 +79,11 @@ BOOL kNoFreeZoom; BOOL kAutoFullscreen; BOOL kExitFullscreen; BOOL kNoDoubleTapToSeek; +BOOL kShortsOnlyMode; BOOL kHideShorts; BOOL kShortsProgress; +BOOL kPinchToFullscreenShorts; +BOOL kShortsToRegular; BOOL kResumeShorts; BOOL kHideShortsLogo; BOOL kHideShortsSearch; @@ -76,6 +97,7 @@ BOOL kHideShortsRemix; BOOL kHideShortsShare; BOOL kHideShortsAvatars; BOOL kHideShortsThanks; +BOOL kHideShortsSource; BOOL kHideShortsChannelName; BOOL kHideShortsDescription; BOOL kHideShortsAudioTrack; @@ -83,10 +105,16 @@ BOOL kHideShortsPromoCards; BOOL kRemoveLabels; BOOL kRemoveIndicators; BOOL kReExplore; +BOOL kAddExplore; BOOL kRemoveShorts; BOOL kRemoveSubscriptions; BOOL kRemoveUploads; BOOL kRemoveLibrary; +BOOL kCopyPostText; +BOOL kSavePostImage; +BOOL kSaveProfilePhoto; +BOOL kSavePost; +BOOL kFixAlbums; BOOL kRemovePlayNext; BOOL kNoContinueWatching; BOOL kNoSearchHistory; @@ -109,11 +137,13 @@ int kPivotIndex; @interface YTPivotBarView : UIView @end -@interface YTPivotBarItemView : UIView +@interface YTQTMButton () +@property (nonatomic, strong, readwrite) YTIButtonRenderer *buttonRenderer; +- (void)setSizeWithPaddingAndInsets:(BOOL)sizeWithPaddingAndInsets; @end -@interface YTPivotBarViewController : UIViewController -- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier; +@interface YTPivotBarItemView : UIView +@property (nonatomic, strong, readwrite) YTQTMButton *navigationButton; @end @interface YTRightNavigationButtons : UIView @@ -121,10 +151,7 @@ int kPivotIndex; @property (nonatomic, strong) YTQTMButton *searchButton; @end -@interface YTSearchView : UIView -@end - -@interface YTSearchBarView : UIView +@interface YTSearchViewController : UIViewController @end @interface YTNavigationBarTitleView : UIView @@ -133,8 +160,51 @@ int kPivotIndex; @interface YTChipCloudCell : UICollectionViewCell @end +@interface YTAppViewController : UIViewController +- (void)hidePivotBar; +- (void)showPivotBar; +@end + +@interface YTPivotBarViewController : UIViewController +@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController; +- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier; +@end + +@interface YTScrollableNavigationController : UINavigationController +@property (nonatomic, weak, readwrite) YTAppViewController *parentViewController; +@end + +@interface YTReelWatchRootViewController : UIViewController +@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController; +@end + +@interface YTTabsViewController : UIViewController +@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController; +@end + +@interface YTReelWatchPlaybackOverlayView : UIView +@end + +@interface YTReelContentView : UIView +@property (nonatomic, assign, readonly) YTReelWatchPlaybackOverlayView *playbackOverlay; +@end + +@interface YTShortsPlayerViewController : UIViewController +@property (nonatomic, weak, readwrite) YTScrollableNavigationController *navigationController; +@end + @interface YTPlayerViewController (YTAFS) +@property (nonatomic, weak, readwrite) UIViewController *parentViewController; +@property (readonly, nonatomic) NSString *contentVideoID; +- (void)setActiveCaptionTrack:(id)arg1; +- (void)shortsToRegular; - (void)autoFullscreen; +- (void)turnOffCaptions; +@end + +@interface YTPlayerView : UIView +@property (nonatomic, weak, readwrite) YTPlayerViewController *playerViewDelegate; +- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture; @end @interface YTSegmentableInlinePlayerBarView @@ -159,19 +229,27 @@ int kPivotIndex; - (void)removeCellsAtIndexPath:(NSIndexPath *)indexPath; @end -@interface YTReelWatchPlaybackOverlayView : UIView -@end +// @interface YTReelWatchPlaybackOverlayView : UIView +// @end -@interface YTReelTransparentStackView : UIView -@end +// @interface YTReelWatchHeaderView : UIView +// @end -@interface YTReelWatchHeaderView : UIView +@interface YTReelTransparentStackView : UIStackView @end @interface YTELMView : UIView @end +@interface ASNetworkImageNode : NSObject +@property (atomic, copy, readwrite) NSURL *URL; +@end + @interface _ASDisplayView : UIView +@property (nonatomic, strong, readwrite) ASNetworkImageNode *keepalive_node; +- (void)copyText:(UILongPressGestureRecognizer *)sender; +- (void)saveImage:(UILongPressGestureRecognizer *)sender; +- (void)savePFP:(UILongPressGestureRecognizer *)sender; @end @interface MLHAMQueuePlayer : NSObject @@ -191,14 +269,6 @@ int kPivotIndex; - (void)broadcastRateChange:(float)rate; @end -@interface YTAlertView : UIView -@property (nonatomic, copy, readwrite) NSString *title; -@property (nonatomic, copy, readwrite) NSString *subtitle; -+ (instancetype)infoDialog; -+ (instancetype)confirmationDialogWithAction:(void (^)(void))action actionTitle:(NSString *)actionTitle cancelTitle:(NSString *)cancelTitle; -- (void)show; -@end - @interface YTMainAppVideoPlayerOverlayViewController : UIViewController @property (readonly, nonatomic) CGFloat mediaTime; @property (readonly, nonatomic) NSString *videoID; diff --git a/YTLite.x b/YTLite.x index b674b5b..f774081 100644 --- a/YTLite.x +++ b/YTLite.x @@ -32,11 +32,21 @@ - (NSData *)elementData { if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData && kNoAds) return nil; - 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"]; NSString *description = [self description]; - if (([adDescriptions containsObject:description] && kNoAds) || ([description containsString:@"inline_shorts"] && kHideShorts)) { + + NSArray *ads = @[@"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"]; + if (kNoAds && [ads containsObject:description]) { return [NSData data]; - } return %orig; + } + + NSArray *shortsToRemove = @[@"shorts_shelf.eml", @"shorts_video_cell.eml", @"6Shorts"]; + for (NSString *shorts in shortsToRemove) { + if (kHideShorts && [description containsString:shorts] && ![description containsString:@"history*"]) { + return nil; + } + } + + return %orig; } %end @@ -105,42 +115,29 @@ %hook YTRightNavigationButtons - (void)layoutSubviews { %orig; - if (kNoCast && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) self.subviews[1].hidden = YES; // Hide icon immediately + if (kNoNotifsButton) self.notificationButton.hidden = YES; if (kNoSearchButton) self.searchButton.hidden = YES; - NSInteger moreButtonIndex = -1; - for (NSInteger i = 0; i < self.subviews.count; i++) { - UIView *subview = self.subviews[i]; - if ([subview.accessibilityIdentifier isEqualToString:@"id.settings.overflow.button"]) { - moreButtonIndex = i; - break; - } - } - - if (moreButtonIndex != -1 && moreButtonIndex < self.subviews.count - 1 && kNoVoiceSearchButton) { - UIView *voiceButton = self.subviews[moreButtonIndex + 1]; - voiceButton.hidden = YES; + for (UIView *subview in self.subviews) { + if (kNoVoiceSearchButton && [subview.accessibilityLabel isEqualToString:NSLocalizedString(@"search.voice.access", nil)]) subview.hidden = YES; + if (kNoCast && [subview.accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) subview.hidden = YES; } } %end -%hook YTSearchView -- (void)layoutSubviews { +%hook YTSearchViewController +- (void)viewDidLoad { %orig; - // Hide Search History - if (kNoSearchHistory && self.subviews.count > 1) self.subviews[1].hidden = YES; - // Hide Voice Search Button - if (kNoVoiceSearchButton && self.subviews.count > 0) { - UIView *firstSubview = self.subviews.firstObject; - for (UIView *subview in firstSubview.subviews) { - if ([NSStringFromClass([subview class]) isEqualToString:@"UIView"]) { - [subview setValue:@(1) forKey:@"hidden"]; - break; - } - } - } + + if (kNoVoiceSearchButton) [self setValue:@(NO) forKey:@"_isVoiceSearchAllowed"]; } + +- (void)setSuggestions:(id)arg1 { if (!kNoSearchHistory) %orig; } +%end + +%hook YTPersonalizedSuggestionsCacheProvider +- (id)activeCache { return kNoSearchHistory ? nil : %orig; } %end // Remove Videos Section Under Player @@ -151,14 +148,13 @@ } %end -// Hide YouTube Logo -%hook YTNavigationBarTitleView -- (void)layoutSubviews { %orig; if (kNoYTLogo && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.yoodle.logo"]) self.subviews[1].hidden = YES; } -%end - -// Stick Navigation bar %hook YTHeaderView -- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : NO; } +// Stick Navigation bar +- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : %orig; } + +// Hide YouTube Logo +- (void)setCustomTitleView:(UIView *)customTitleView { if (!kNoYTLogo) %orig; } +- (void)setTitle:(NSString *)title { kNoYTLogo ? %orig(@"") : %orig; } %end // Remove Subbar @@ -190,7 +186,6 @@ - (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { return kNoHUDMsgs ? nil : %orig; } %end - %hook YTColdConfig // Hide Next & Previous buttons - (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : %orig; } @@ -248,11 +243,19 @@ - (void)setPaidContentWithPlayerData:(id)data { if (!kNoPromotionCards) %orig; } %end +%hook YTInlinePlayerBarContainerView +- (void)setPlayerBarAlpha:(CGFloat)alpha { kPersistentProgressBar ? %orig(1.0) : %orig; } +%end + // Remove Watermarks %hook YTAnnotationsViewController - (void)loadFeaturedChannelWatermark { if (!kNoWatermarks) %orig; } %end +%hook YTMainAppVideoPlayerOverlayView +- (BOOL)isWatermarkEnabled { return kNoWatermarks ? NO : %orig; } +%end + // Forcibly Enable Miniplayer %hook YTWatchMiniBarViewController - (void)updateMiniBarPlayerStateFromRenderer { if (!kMiniplayer) %orig; } @@ -270,7 +273,7 @@ // Skip Content Warning (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L452-L454) %hook YTPlayabilityResolutionUserActionUIController -- (void)showConfirmAlert { if (kNoContentWarning) [self confirmAlertDidPressConfirm]; } +- (void)showConfirmAlert { kNoContentWarning ? [self confirmAlertDidPressConfirm] : %orig; } %end // Classic Video Quality (https://github.com/PoomSmart/YTClassicVideoQuality) @@ -374,7 +377,10 @@ %hook YTPlayerViewController - (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 { %orig; + if (kAutoFullscreen) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO]; + if (kShortsToRegular) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(shortsToRegular) userInfo:nil repeats:NO]; + if (kDisableAutoCaptions) [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(turnOffCaptions) userInfo:nil repeats:NO]; } %new @@ -382,6 +388,21 @@ YTWatchController *watchController = [self valueForKey:@"_UIDelegate"]; [watchController showFullScreen]; } + +%new +- (void)shortsToRegular { + if (self.contentVideoID != nil && [self.parentViewController isKindOfClass:NSClassFromString(@"YTShortsPlayerViewController")]) { + NSString *vidLink = [NSString stringWithFormat:@"vnd.youtube://%@", self.contentVideoID]; + if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:vidLink]]) { + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:vidLink] options:@{} completionHandler:nil]; + } + } +} + +%new +- (void)turnOffCaptions { + [self setActiveCaptionTrack:nil]; +} %end // Exit Fullscreen on Finish @@ -458,7 +479,7 @@ if ([cell respondsToSelector:@selector(node)]) { NSString *idToRemove = [[cell node] accessibilityIdentifier]; if ([idToRemove isEqualToString:@"statement_banner.view"] || - (([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"] || [idToRemove isEqualToString:@"eml.inline_shorts"]) && kHideShorts)) { + (([idToRemove isEqualToString:@"eml.shorts-grid"] || [idToRemove isEqualToString:@"eml.shorts-shelf"]) && kHideShorts)) { [self removeCellsAtIndexPath:indexPath]; } } @@ -487,6 +508,11 @@ - (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; } %end +%hook YTShortsPlayerViewController +- (BOOL)shouldAlwaysEnablePlayerBar { return kShortsProgress ? YES : NO; } +- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; } +%end + %hook YTColdConfig - (BOOL)iosEnableVideoPlayerScrubber { return kShortsProgress ? YES : NO; } - (BOOL)mobileShortsTabInlined { return kShortsProgress ? YES : NO; } @@ -512,16 +538,7 @@ - (void)setViewCommentButton:(id)arg1 { if (!kHideShortsComments) %orig; } - (void)setRemixButton:(id)arg1 { if (!kHideShortsRemix) %orig; } - (void)setShareButton:(id)arg1 { if (!kHideShortsShare) %orig; } -- (void)layoutSubviews { - %orig; - - for (UIView *subview in self.subviews) { - if (kHideShortsAvatars && [NSStringFromClass([subview class]) isEqualToString:@"YTELMView"]) { - subview.hidden = YES; - break; - } - } -} +- (void)setNativePivotButton:(id)arg1 { if (!kHideShortsAvatars) %orig; } %end %hook YTReelHeaderView @@ -531,31 +548,200 @@ %hook YTReelTransparentStackView - (void)layoutSubviews { %orig; - if (kHideShortsSearch && self.subviews.count >= 3 && [self.subviews[0].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[0].hidden = YES; - if (kHideShortsCamera && self.subviews.count >= 3 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[1].hidden = YES; - if (kHideShortsMore && self.subviews.count >= 3 && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[2].hidden = YES; + + for (YTQTMButton *button in self.subviews) { + if ([button respondsToSelector:@selector(buttonRenderer)]) { + if (kHideShortsSearch && button.buttonRenderer.icon.iconType == 1045) button.hidden = YES; + if (kHideShortsCamera && button.buttonRenderer.icon.iconType == 1046) button.hidden = YES; + if (kHideShortsMore && button.buttonRenderer.icon.iconType == 1047) button.hidden = YES; + } + } } %end %hook YTReelWatchHeaderView -- (void)layoutSubviews { +- (void)setChannelBarElementRenderer:(id)renderer { if (!kHideShortsChannelName) %orig; } +- (void)setHeaderRenderer:(id)renderer { if (!kHideShortsDescription) %orig; } +- (void)setSoundMetadataElementRenderer:(id)renderer { if (!kHideShortsAudioTrack) %orig; } +- (void)setActionElement:(id)renderer { if (!kHideShortsPromoCards) %orig; } +- (void)setBadgeRenderer:(id)renderer { if (!kHideShortsThanks) %orig; } +- (void)setMultiFormatLinkElementRenderer:(id)renderer { if (!kHideShortsSource) %orig; } +%end + +static BOOL isOverlayShown = YES; + +%hook YTPlayerView +- (void)didPinch:(UIPinchGestureRecognizer *)gesture { %orig; - if (kHideShortsDescription && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.reels_smv_player_title_label"]) self.subviews[2].hidden = YES; - if (kHideShortsChannelName) self.subviews[self.subviews.count - 2].hidden = YES; - if (kHideShortsAudioTrack) self.subviews.lastObject.hidden = YES; - for (UIView *subview in self.subviews) { - if (kHideShortsPromoCards && [NSStringFromClass([subview class]) isEqualToString:@"YTBadge"]) { - subview.hidden = YES; + + if (kPinchToFullscreenShorts && [self.playerViewDelegate.parentViewController isKindOfClass:NSClassFromString(@"YTShortsPlayerViewController")]) { + YTShortsPlayerViewController *shortsPlayerVC = (YTShortsPlayerViewController *)self.playerViewDelegate.parentViewController; + YTReelContentView *contentView = (YTReelContentView *)shortsPlayerVC.view; + + if (gesture.scale > 1) { + if (!kShortsOnlyMode) [shortsPlayerVC.navigationController.parentViewController hidePivotBar]; + + [UIView animateWithDuration:0.3 animations:^{ + contentView.playbackOverlay.alpha = 0; + isOverlayShown = contentView.playbackOverlay.alpha; + }]; + } else { + if (!kShortsOnlyMode) [shortsPlayerVC.navigationController.parentViewController showPivotBar]; + + [UIView animateWithDuration:0.3 animations:^{ + contentView.playbackOverlay.alpha = 1; + isOverlayShown = contentView.playbackOverlay.alpha; + }]; } } } + +- (void)layoutSubviews { + %orig; + + if (kShortsOnlyMode && [self.playerViewDelegate.parentViewController isKindOfClass:NSClassFromString(@"YTShortsPlayerViewController")]) { + UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(turnShortsOnlyModeOff:)]; + longPressGesture.numberOfTouchesRequired = 2; + longPressGesture.minimumPressDuration = 0.5; + + [self addGestureRecognizer:longPressGesture]; + } +} + +%new +- (void)turnShortsOnlyModeOff:(UILongPressGestureRecognizer *)gesture { + if (gesture.state == UIGestureRecognizerStateBegan) { + NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"]; + NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:path]; + + [prefs setObject:@NO forKey:@"shortsOnlyMode"]; + [prefs writeToFile:path atomically:NO]; + + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); + + UIResponder *responder = self.nextResponder; + while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; + if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"ShortsModeTurnedOff") firstResponder:responder] send]; + + YTShortsPlayerViewController *shortsPlayerVC = (YTShortsPlayerViewController *)self.playerViewDelegate.parentViewController; + [shortsPlayerVC.navigationController.parentViewController performSelector:@selector(showPivotBar) withObject:nil afterDelay:1.0]; + + } +} %end +%hook YTReelWatchPlaybackOverlayView +- (void)layoutSubviews { + %orig; + + self.alpha = isOverlayShown; +} +%end %hook _ASDisplayView -- (void)layoutSubviews { +- (void)setKeepalive_node:(id)arg1 { %orig; - if (kHideShortsThanks && [self.accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.hidden = YES; + + NSString *description = [self description]; + if (kCopyPostText && [description containsString:@"ELMExpandableTextNode-View"]) { + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(copyText:)]; + longPress.minimumPressDuration = 0.3; + [self addGestureRecognizer:longPress]; + } + + if (kSavePostImage && [description containsString:@"YTImageZoomNode-View"]) { + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(saveImage:)]; + longPress.minimumPressDuration = 0.3; + [self addGestureRecognizer:longPress]; + } + + if (kSaveProfilePhoto && [description containsString:@"ELMImageNode-View"] && [description containsString:@"eml.avatar"]) { + UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(savePFP:)]; + longPress.minimumPressDuration = 0.3; + [self addGestureRecognizer:longPress]; + } +} + +%new +- (void)savePFP:(UILongPressGestureRecognizer *)sender { + if (sender.state == UIGestureRecognizerStateBegan) { + + NSString *URLString = self.keepalive_node.URL.absoluteString; + if (URLString) { + NSRange sizeRange = [URLString rangeOfString:@"=s"]; + if (sizeRange.location != NSNotFound) { + NSRange dashRange = [URLString rangeOfString:@"-" options:0 range:NSMakeRange(sizeRange.location, URLString.length - sizeRange.location)]; + if (dashRange.location != NSNotFound) { + NSString *newURLString = [URLString stringByReplacingCharactersInRange:NSMakeRange(sizeRange.location + 2, dashRange.location - sizeRange.location - 2) withString:@"1024"]; + NSURL *PFPURL = [NSURL URLWithString:newURLString]; + + UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:PFPURL]]; + if (image) { + UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); + + UIResponder *responder = self.nextResponder; + while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; + if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Saved") firstResponder:responder] send]; + } + } + } + } + } +} + +%new +- (void)copyText:(UILongPressGestureRecognizer *)sender { + if (sender.state == UIGestureRecognizerStateBegan) { + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; + pasteboard.string = self.accessibilityLabel; + + UIResponder *responder = self.nextResponder; + while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; + if (responder) [[%c(YTToastResponderEvent) eventWithMessage:LOC(@"Copied") firstResponder:responder] send]; + } +} + +%new +- (void)saveImage:(UILongPressGestureRecognizer *)sender { + if (sender.state == UIGestureRecognizerStateBegan) { + + NSURL *imageURL = self.keepalive_node.URL; + if (imageURL) { + NSString *URLString = imageURL.absoluteString; + + if (kFixAlbums && [URLString hasPrefix:@"https://yt3."]) { + URLString = [URLString stringByReplacingOccurrencesOfString:@"https://yt3." withString:@"https://yt4."]; + } + + NSURL *downloadURL = nil; + if ([URLString containsString:@"c-fcrop"]) { + NSRange croppedURL = [URLString rangeOfString:@"c-fcrop"]; + if (croppedURL.location != NSNotFound) { + NSString *newURL = [URLString stringByReplacingOccurrencesOfString:[URLString substringFromIndex:croppedURL.location] withString:@"nd-v1"]; + downloadURL = [NSURL URLWithString:newURL]; + } + } else { + downloadURL = imageURL; + } + + UIResponder *responder = self.nextResponder; + while (responder && ![responder isKindOfClass:[UIViewController class]]) responder = responder.nextResponder; + + NSURLSession *session = [NSURLSession sharedSession]; + [[session dataTaskWithURL:downloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (data) { + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ + PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset]; + [request addResourceWithType:PHAssetResourceTypePhoto data:data options:nil]; + } completionHandler:^(BOOL success, NSError *error) { + if (responder) [[%c(YTToastResponderEvent) eventWithMessage:success ? LOC(@"Saved") : [NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send]; + }]; + } else { + if (responder) [[%c(YTToastResponderEvent) eventWithMessage:[NSString stringWithFormat:LOC(@"%@: %@"), LOC(@"Error"), error.localizedDescription] firstResponder:responder] send]; + } + }] resume]; + } + } } %end @@ -565,59 +751,39 @@ NSMutableArray *items = [renderer itemsArray]; NSDictionary *identifiersToRemove = @{ - @"FEshorts": @(kRemoveShorts), - @"FEsubscriptions": @(kRemoveSubscriptions), - @"FEuploads": @(kRemoveUploads), - @"FElibrary": @(kRemoveLibrary) + @"FEshorts": @[@(kRemoveShorts), @(kReExplore)], + @"FEsubscriptions": @[@(kRemoveSubscriptions)], + @"FEuploads": @[@(kRemoveUploads)], + @"FElibrary": @[@(kRemoveLibrary)] }; for (NSString *identifier in identifiersToRemove) { - BOOL shouldRemoveItem = [identifiersToRemove[identifier] boolValue]; - NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + NSArray *removeValues = identifiersToRemove[identifier]; + BOOL shouldRemoveItem = [removeValues containsObject:@(YES)]; + + NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderer, NSUInteger idx, BOOL *stop) { if ([identifier isEqualToString:@"FEuploads"]) { - return shouldRemoveItem && [[[renderers pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier]; + return shouldRemoveItem && [[[renderer pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier]; } else { - return shouldRemoveItem && [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier]; + return shouldRemoveItem && [[[renderer pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier]; } }]; if (index != NSNotFound) { [items removeObjectAtIndex:index]; } - } %orig; -} -%end + } + + NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]]; + }]; -// Replace Shorts with Explore tab (https://github.com/PoomSmart/YTReExplore) -static void replaceTab(YTIGuideResponse *response) { - NSMutableArray *renderers = [response itemsArray]; - for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) { - YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer]; - NSMutableArray *items = [pivotBarRenderer itemsArray]; - NSUInteger shortIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { - return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:@"FEshorts"]; - }]; - if (shortIndex != NSNotFound) { - [items removeObjectAtIndex:shortIndex]; - NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { - return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]]; - }]; - if (exploreIndex == NSNotFound) { - YTIPivotBarSupportedRenderers *exploreTab = [%c(YTIPivotBarRenderer) pivotSupportedRenderersWithBrowseId:[%c(YTIBrowseRequest) browseIDForExploreTab] title:LOC(@"Explore") iconType:292]; - [items insertObject:exploreTab atIndex:1]; - } - } + if (exploreIndex == NSNotFound && (kReExplore || kAddExplore)) { + YTIPivotBarSupportedRenderers *exploreTab = [%c(YTIPivotBarRenderer) pivotSupportedRenderersWithBrowseId:[%c(YTIBrowseRequest) browseIDForExploreTab] title:LOC(@"Explore") iconType:292]; + [items insertObject:exploreTab atIndex:1]; } -} -%hook YTGuideServiceCoordinator -- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion { - if (kReExplore) replaceTab(response); - %orig(response, completion); -} -- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion { - if (kReExplore) replaceTab(response); - %orig(response, error, completion); + %orig; } %end @@ -628,76 +794,13 @@ static void replaceTab(YTIGuideResponse *response) { %end // Hide Tab Labels -BOOL hasHomeBar = NO; -CGFloat pivotBarViewHeight; - -%hook YTPivotBarView -- (void)layoutSubviews { - %orig; - pivotBarViewHeight = self.frame.size.height; -} -%end - %hook YTPivotBarItemView -- (void)layoutSubviews { +- (void)setRenderer:(YTIPivotBarRenderer *)renderer { %orig; - CGFloat pivotBarAccessibilityControlWidth; - if (kRemoveLabels) { - for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:objc_lookUpClass("YTPivotBarItemViewAccessibilityControl")]) { - pivotBarAccessibilityControlWidth = CGRectGetWidth(subview.frame); - break; - } - } - - for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:objc_lookUpClass("YTQTMButton")]) { - for (UIView *buttonSubview in subview.subviews) { - if ([buttonSubview isKindOfClass:[UILabel class]]) { - [buttonSubview removeFromSuperview]; - break; - } - } - - UIImageView *imageView = nil; - for (UIView *buttonSubview in subview.subviews) { - if ([buttonSubview isKindOfClass:[UIImageView class]]) { - imageView = (UIImageView *)buttonSubview; - break; - } - } - - if (imageView) { - CGFloat imageViewHeight = imageView.image.size.height; - CGFloat imageViewWidth = imageView.image.size.width; - CGRect buttonFrame = subview.frame; - - if (@available(iOS 13.0, *)) { - UIWindowScene *mainWindowScene = (UIWindowScene *)[[[UIApplication sharedApplication] connectedScenes] anyObject]; - if (mainWindowScene) { - UIEdgeInsets safeAreaInsets = mainWindowScene.windows.firstObject.safeAreaInsets; - if (safeAreaInsets.bottom > 0) { - hasHomeBar = YES; - } - } - } - - CGFloat yOffset = hasHomeBar ? 15.0 : 0.0; - CGFloat xOffset = (pivotBarAccessibilityControlWidth - imageViewWidth) / 2.0; - - buttonFrame.origin.y = (pivotBarViewHeight - imageViewHeight - yOffset) / 2.0; - buttonFrame.origin.x = xOffset; - - buttonFrame.size.height = imageViewHeight; - buttonFrame.size.width = imageViewWidth; - - subview.frame = buttonFrame; - subview.bounds = CGRectMake(0, 0, imageViewWidth, imageViewHeight); - } - } - } + [self.navigationButton setTitle:@"" forState:UIControlStateNormal]; + [self.navigationButton setSizeWithPaddingAndInsets:NO]; } } %end @@ -706,21 +809,24 @@ CGFloat pivotBarViewHeight; BOOL isTabSelected = NO; %hook YTPivotBarViewController - (void)viewDidAppear:(BOOL)animated { - %orig(); + %orig; - if (!isTabSelected) { + if (!isTabSelected && !kShortsOnlyMode) { NSString *pivotIdentifier; switch (kPivotIndex) { case 0: pivotIdentifier = @"FEwhat_to_watch"; break; case 1: - pivotIdentifier = @"FEshorts"; + pivotIdentifier = @"FEexplore"; break; case 2: - pivotIdentifier = @"FEsubscriptions"; + pivotIdentifier = @"FEshorts"; break; case 3: + pivotIdentifier = @"FEsubscriptions"; + break; + case 4: pivotIdentifier = @"FElibrary"; break; default: @@ -729,6 +835,35 @@ BOOL isTabSelected = NO; [self selectItemWithPivotIdentifier:pivotIdentifier]; isTabSelected = YES; } + + if (kShortsOnlyMode) { + [self selectItemWithPivotIdentifier:@"FEshorts"]; + [self.parentViewController hidePivotBar]; + } +} +%end + +%hook YTTabsViewController +- (void)viewDidAppear:(BOOL)animated { + %orig; + + if (kShortsOnlyMode) { + [self.navigationController.parentViewController hidePivotBar]; + } +} +%end + +%hook YTAppViewController +- (void)showPivotBar { if (!kShortsOnlyMode) %orig;} ; +%end + +%hook YTReelWatchRootViewController +- (void)viewDidAppear:(BOOL)animated { + %orig; + + if (kShortsOnlyMode) { + [self.navigationController.parentViewController hidePivotBar]; + } } %end @@ -738,6 +873,35 @@ BOOL isTabSelected = NO; + (NSWritingDirection)_defaultWritingDirection { return kDisableRTL ? NSWritingDirectionLeftToRight : %orig; } %end +// Fix Albums For Russian Users +static NSURL *newCoverURL(NSURL *originalURL) { + NSDictionary *hostsToReplace = @{ + @"yt3.ggpht.com": @"yt4.ggpht.com", + @"yt3.googleusercontent.com": @"yt4.googleusercontent.com", + }; + + NSString *const replacement = hostsToReplace[originalURL.host]; + if (kFixAlbums && replacement) { + NSURLComponents *components = [NSURLComponents componentsWithURL:originalURL resolvingAgainstBaseURL:NO]; + components.host = replacement; + return components.URL; + } + return originalURL; +} + +%hook ELMImageDownloader +- (id)downloadImageWithURL:(id)arg1 targetSize:(CGSize)arg2 callbackQueue:(id)arg3 downloadProgress:(id)arg4 completion:(id)arg5 { + return %orig(newCoverURL(arg1), arg2, arg3, arg4, arg5); +} +%end + +// Not necessary but preferred +%hook ASBasicImageDownloader +- (id)downloadImageWithURL:(id)arg1 shouldRetry:(BOOL)arg2 callbackQueue:(id)arg3 downloadProgress:(id)arg4 completion:(id)arg5 { + return %orig(newCoverURL(arg1), arg2, arg3, arg4, arg5); +} +%end + static void reloadPrefs() { NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"]; NSDictionary *prefs = [NSDictionary dictionaryWithContentsOfFile:path]; @@ -759,6 +923,7 @@ static void reloadPrefs() { kNoDarkBg = [prefs[@"noDarkBg"] boolValue] ?: NO; kEndScreenCards = [prefs[@"endScreenCards"] boolValue] ?: NO; kNoFullscreenActions = [prefs[@"noFullscreenActions"] boolValue] ?: NO; + kPersistentProgressBar = [prefs[@"persistentProgressBar"] boolValue] ?: NO; kNoRelatedVids = [prefs[@"noRelatedVids"] boolValue] ?: NO; kNoPromotionCards = [prefs[@"noPromotionCards"] boolValue] ?: NO; kNoWatermarks = [prefs[@"noWatermarks"] boolValue] ?: NO; @@ -766,6 +931,7 @@ static void reloadPrefs() { kPortraitFullscreen = [prefs[@"portraitFullscreen"] boolValue] ?: NO; kCopyWithTimestamp = [prefs[@"copyWithTimestamp"] boolValue] ?: NO; kDisableAutoplay = [prefs[@"disableAutoplay"] boolValue] ?: NO; + kDisableAutoCaptions = [prefs[@"disableAutoCaptions"] boolValue] ?: NO; kNoContentWarning = [prefs[@"noContentWarning"] boolValue] ?: NO; kClassicQuality = [prefs[@"classicQuality"] boolValue] ?: NO; kExtraSpeedOptions = [prefs[@"extraSpeedOptions"] boolValue] ?: NO; @@ -776,8 +942,11 @@ static void reloadPrefs() { kAutoFullscreen = [prefs[@"autoFullscreen"] boolValue] ?: NO; kExitFullscreen = [prefs[@"exitFullscreen"] boolValue] ?: NO; kNoDoubleTapToSeek = [prefs[@"noDoubleTapToSeek"] boolValue] ?: NO; + kShortsOnlyMode = [prefs[@"shortsOnlyMode"] boolValue] ?: NO; kHideShorts = [prefs[@"hideShorts"] boolValue] ?: NO; kShortsProgress = [prefs[@"shortsProgress"] boolValue] ?: NO; + kPinchToFullscreenShorts = [prefs[@"pinchToFullscreenShorts"] boolValue] ?: NO; + kShortsToRegular = [prefs[@"shortsToRegular"] boolValue] ?: NO; kResumeShorts = [prefs[@"resumeShorts"] boolValue] ?: NO; kHideShortsLogo = [prefs[@"hideShortsLogo"] boolValue] ?: NO; kHideShortsSearch = [prefs[@"hideShortsSearch"] boolValue] ?: NO; @@ -791,6 +960,7 @@ static void reloadPrefs() { kHideShortsShare = [prefs[@"hideShortsShare"] boolValue] ?: NO; kHideShortsAvatars = [prefs[@"hideShortsAvatars"] boolValue] ?: NO; kHideShortsThanks = [prefs[@"hideShortsThanks"] boolValue] ?: NO; + kHideShortsSource = [prefs[@"hideShortsSource"] boolValue] ?: NO; kHideShortsChannelName = [prefs[@"hideShortsChannelName"] boolValue] ?: NO; kHideShortsDescription = [prefs[@"hideShortsDescription"] boolValue] ?: NO; kHideShortsAudioTrack = [prefs[@"hideShortsAudioTrack"] boolValue] ?: NO; @@ -798,10 +968,15 @@ static void reloadPrefs() { kRemoveLabels = [prefs[@"removeLabels"] boolValue] ?: NO; kRemoveIndicators = [prefs[@"removeIndicators"] boolValue] ?: NO; kReExplore = [prefs[@"reExplore"] boolValue] ?: NO; + kAddExplore = [prefs[@"addExplore"] boolValue] ?: NO; kRemoveShorts = [prefs[@"removeShorts"] boolValue] ?: NO; kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO; kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES; kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO; + kCopyPostText = [prefs[@"copyPostText"] boolValue] ?: NO; + kSavePostImage = [prefs[@"savePostImage"] boolValue] ?: NO; + kSaveProfilePhoto = [prefs[@"savePostImage"] boolValue] ?: NO; + kFixAlbums = [prefs[@"fixAlbums"] boolValue] ?: NO; kRemovePlayNext = [prefs[@"removePlayNext"] boolValue] ?: NO; kNoContinueWatching = [prefs[@"noContinueWatching"] boolValue] ?: NO; kNoSearchHistory = [prefs[@"noSearchHistory"] boolValue] ?: NO; @@ -832,6 +1007,7 @@ static void reloadPrefs() { @"noDarkBg" : @(kNoDarkBg), @"endScreenCards" : @(kEndScreenCards), @"noFullscreenActions" : @(kNoFullscreenActions), + @"persistentProgressBar" : @(kPersistentProgressBar), @"noRelatedVids" : @(kNoRelatedVids), @"noPromotionCards" : @(kNoPromotionCards), @"noWatermarks" : @(kNoWatermarks), @@ -839,6 +1015,7 @@ static void reloadPrefs() { @"portraitFullscreen" : @(kPortraitFullscreen), @"copyWithTimestamp" : @(kCopyWithTimestamp), @"disableAutoplay" : @(kDisableAutoplay), + @"disableAutoCaptions" : @(kDisableAutoCaptions), @"noContentWarning" : @(kNoContentWarning), @"classicQuality" : @(kClassicQuality), @"extraSpeedOptions" : @(kExtraSpeedOptions), @@ -849,8 +1026,11 @@ static void reloadPrefs() { @"autoFullscreen" : @(kAutoFullscreen), @"exitFullscreen" : @(kExitFullscreen), @"noDoubleTapToSeek" : @(kNoDoubleTapToSeek), + @"shortsOnlyMode" : @(kShortsOnlyMode), @"hideShorts" : @(kHideShorts), @"shortsProgress" : @(kShortsProgress), + @"pinchToFullscreenShorts" : @(kPinchToFullscreenShorts), + @"shortsToRegular" : @(kShortsToRegular), @"resumeShorts" : @(kResumeShorts), @"hideShortsLogo" : @(kHideShortsLogo), @"hideShortsSearch" : @(kHideShortsSearch), @@ -864,6 +1044,7 @@ static void reloadPrefs() { @"hideShortsShare" : @(kHideShortsShare), @"hideShortsAvatars" : @(kHideShortsAvatars), @"hideShortsThanks" : @(kHideShortsThanks), + @"hideShortsSource" : @(kHideShortsSource), @"hideShortsChannelName" : @(kHideShortsChannelName), @"hideShortsDescription" : @(kHideShortsDescription), @"hideShortsAudioTrack" : @(kHideShortsAudioTrack), @@ -871,10 +1052,15 @@ static void reloadPrefs() { @"removeLabels" : @(kRemoveLabels), @"removeIndicators" : @(kRemoveIndicators), @"reExplore" : @(kReExplore), + @"addExplore" : @(kAddExplore), @"removeShorts" : @(kRemoveShorts), @"removeSubscriptions" : @(kRemoveSubscriptions), @"removeUploads" : @(kRemoveUploads), @"removeLibrary" : @(kRemoveLibrary), + @"copyPostText" : @(kCopyPostText), + @"savePostImage" : @(kSavePostImage), + @"saveProfilePhoto" : @(kSaveProfilePhoto), + @"fixAlbums" : @(kFixAlbums), @"removePlayNext" : @(kRemovePlayNext), @"noContinueWatching" : @(kNoContinueWatching), @"noSearchHistory" : @(kNoSearchHistory), @@ -896,6 +1082,15 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin } %ctor { + NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"]; + NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:path]; + + if ([prefs[@"shortsOnlyMode"] boolValue] && ([prefs[@"removeShorts"] boolValue] || [prefs[@"reExplore"] boolValue])) { + [prefs setObject:@NO forKey:@"removeShorts"]; + [prefs setObject:@NO forKey:@"reExplore"]; + [prefs writeToFile:path atomically:NO]; + } + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.dvntm.ytlite.prefschanged"), NULL, CFNotificationSuspensionBehaviorCoalesce); reloadPrefs(); } diff --git a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings index 855642f..1eb5e6a 100644 --- a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos."; "NoFullscreenActions" = "Disable fullscreen actions"; "NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode."; +"PersistentProgressBar" = "Persistent progress bar"; +"PersistentProgressBarDesc" = "Always shows progress bar in the player."; "NoRelatedVids" = "No related videos in overlay"; "NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up."; "NoPromotionCards" = "Hide Paid Promotion cards"; @@ -53,6 +55,8 @@ "CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button."; "DisableAutoplay" = "Disable Autoplay videos"; "DisableAutoplayDesc" = "Prevents video playback after opening."; +"DisableAutoCaptions" = "Disable auto captions"; +"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions."; "NoContentWarning" = "Skip content warning"; "NoContentWarningDesc" = "Skips sensitive content warning message."; "ClassicQuality" = "Classic video quality"; @@ -81,20 +85,28 @@ "RemoveIndicatorsDesc" = "Removes tab indicators."; "ReExplore" = "Replace Shorts tab with Explore tab"; "ReExploreDesc" = "Shows Explore tab instead of Shorts tab as on old YouTube versions."; +"AddExplore" = "Add Explore tab"; +"AddExploreDesc" = "Adds Explore tab to the Tab bar."; "HideShortsTab" = "Hide Shorts tab"; -"HideShortsTabDesc" = "Hides Shorts tab from the Tab bar"; +"HideShortsTabDesc" = "Hides Shorts tab from the Tab bar."; "HideSubscriptionsTab" = "Hide Subscriptions tab"; -"HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar"; +"HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar."; "HideUploadButton" = "Hide Upload button"; -"HideUploadButtonDesc" = "Hides Upload button from the Tab bar"; +"HideUploadButtonDesc" = "Hides Upload button from the Tab bar."; "HideLibraryTab" = "Hide Library tab"; -"HideLibraryTabDesc" = "Hides Library tab from the Tab bar"; +"HideLibraryTabDesc" = "Hides Library tab from the Tab bar."; "Shorts" = "Shorts"; +"ShortsOnlyMode" = "Shorts Only Mode"; +"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only."; "HideShorts" = "Hide Shorts videos"; "HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)"; "ShortsProgress" = "Enable progress bar"; "ShortsProgressDesc" = "Displays progress bar in the Shorts overlay."; +"PinchToFullscreenShorts" = "Pinch to Fullscreen"; +"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode."; +"ShortsToRegular" = "Shorts to regular videos"; +"ShortsToRegularDesc" = "Opens Shorts videos as regular videos."; "ResumeShorts" = "Don't start from Shorts tab"; "ResumeShortsDesc" = "Prevents starting from Shorts videos at the opening app, which happens if YouTube was closed while watching Shorts."; "HideShortsLogo" = "Hide Shorts logo"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner."; "HideShortsThanks" = "Hide Superthanks button"; "HideShortsThanksDesc" = "Hides Superthanks (Donate) button from the Shorts overlay."; +"HideShortsSource" = "Hide Shorts Source"; +"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name."; "HideShortsChannelName" = "Hide Channel name"; "HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay."; "HideShortsDescription" = "Hide Description"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description."; "Other" = "Other"; +"CopyPostText" = "Copy community posts text"; +"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"SavePostImage" = "Save image from community posts"; +"SavePostImageDesc" = "Saves community post image to the Photos app by long tap."; +"SaveProfilePhoto" = "Save profile picture"; +"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap."; +"FixAlbums" = "Fix covers"; +"FixAlbumsDesc" = "Fixes the display of covers for users from Russia."; "RemovePlayNext" = "Remove \"Play next in queue\""; "RemovePlayNextDesc" = "Removes \"Play next in queue\" option from menu."; "NoContinueWatching" = "Remove \"Continue watching\""; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "Would you like to activate Advanced mode for YTLite?\n\nThis mode provides more than 50 additional options to customize and optimize your YouTube experience. You can enable/disable it later from Settings → %@ → %@ → %@."; "ResetSettings" = "Reset YTLite settings"; "ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?"; +"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player."; +"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off"; "Yes" = "Yes"; -"No" = "No"; \ No newline at end of file +"No" = "No"; + +"Copied" = "Copied to clipboard"; +"Saved" = "Saved to Photos"; +"Error" = "Error"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings index 3f70775..d28cf21 100644 --- a/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/es.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "Oculta las tarjetas emergentes de fin de pantalla (miniaturas) al final de los vídeos."; "NoFullscreenActions" = "Desactivar acciones en pantalla completa"; "NoFullscreenActionsDesc" = "Desactiva el panel de acciones en el modo de pantalla completa."; +"PersistentProgressBar" = "Persistent progress bar"; +"PersistentProgressBarDesc" = "Always shows progress bar in the player."; "NoRelatedVids" = "Sin vídeos relacionados en la superposición"; "NoRelatedVidsDesc" = "Elimina los vídeos relacionados que se muestran en la superposición al deslizar hacia arriba."; "NoPromotionCards" = "Ocultar tarjetas de promoción pagada"; @@ -53,6 +55,8 @@ "CopyWithTimestampDesc" = "Permite copiar el enlace con marca de tiempo en el portapapeles pulsando el botón de pausa."; "DisableAutoplay" = "Desactivar reproducción automática"; "DisableAutoplayDesc" = "Evita la reproducción automática de vídeos después de abrirlos."; +"DisableAutoCaptions" = "Disable auto captions"; +"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions."; "NoContentWarning" = "Omitir advertencia de contenido"; "NoContentWarningDesc" = "Omite el mensaje de advertencia de contenido sensible."; "ClassicQuality" = "Calidad de vídeo clásica"; @@ -81,6 +85,8 @@ "RemoveIndicatorsDesc" = "Elimina los indicadores de pestaña."; "ReExplore" = "Reemplazar pestaña Shorts con pestaña Explorar"; "ReExploreDesc" = "Muestra la pestaña Explorar en lugar de la pestaña Shorts como en versiones antiguas de YouTube."; +"AddExplore" = "Add Explore tab"; +"AddExploreDesc" = "Adds Explore tab to the Tab bar."; "HideShortsTab" = "Ocultar pestaña Shorts"; "HideShortsTabDesc" = "Oculta la pestaña Shorts de la barra de pestañas."; "HideSubscriptionsTab" = "Ocultar pestaña Suscripciones"; @@ -91,10 +97,16 @@ "HideLibraryTabDesc" = "Oculta la pestaña Biblioteca de la barra de pestañas."; "Shorts" = "Shorts"; +"ShortsOnlyMode" = "Shorts Only Mode"; +"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only."; "HideShorts" = "Ocultar vídeos Shorts"; "HideShortsDesc" = "Oculta los vídeos Shorts de la página de inicio, Recomendados, etc. (No se aplica al historial de reproducciones)"; "ShortsProgress" = "Activar barra de progreso"; "ShortsProgressDesc" = "Muestra una barra de progreso en la superposición de Shorts."; +"PinchToFullscreenShorts" = "Pinch to Fullscreen"; +"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode."; +"ShortsToRegular" = "Shorts to regular videos"; +"ShortsToRegularDesc" = "Opens Shorts videos as regular videos."; "ResumeShorts" = "No empezar desde la pestaña Shorts"; "ResumeShortsDesc" = "Evita empezar desde los vídeos Shorts al abrir la aplicación, lo cual ocurre si YouTube se cerró mientras se veían Shorts."; "HideShortsLogo" = "Ocultar el logo de Shorts"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "Oculta la imagen de perfil en la esquina inferior derecha."; "HideShortsThanks" = "Ocultar botón de Supergracias"; "HideShortsThanksDesc" = "Oculta el botón de Supergracias (Donar) en la superposición de Shorts."; +"HideShortsSource" = "Hide Shorts Source"; +"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name."; "HideShortsChannelName" = "Ocultar nombre del canal"; "HideShortsChannelNameDesc" = "Oculta el nombre del canal y el botón de Suscribirse en la superposición de Shorts."; "HideShortsDescription" = "Ocultar descripción"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "Oculta la pista de audio debajo de la descripción de Shorts."; "Other" = "Otro"; +"CopyPostText" = "Copy community posts text"; +"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"SavePostImage" = "Save community posts image"; +"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap."; +"SaveProfilePhoto" = "Save profile picture"; +"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap."; +"FixAlbums" = "Fix covers"; +"FixAlbumsDesc" = "Fixes the display of covers for users from Russia."; "RemovePlayNext" = "Eliminar \"Reproducir siguiente en cola\""; "RemovePlayNextDesc" = "Elimina la opción \"Reproducir siguiente en cola\" del menú."; "NoContinueWatching" = "Eliminar \"Continuar viendo\""; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "¿Desea activar el modo Avanzado para YTLite?\n\nEste modo ofrece más de 50 opciones adicionales para personalizar y optimizar tu experiencia en YouTube. Puedes activarlo/desactivarlo más tarde desde Ajustes → %@ → %@ → %@."; "ResetSettings" = "Restablecer configuración de YTLite"; "ResetMessage" = "Esta opción restablecerá la configuración de YTLite a los valores predeterminados y cerrará YouTube.\n\n¿Estás seguro de que deseas continuar?"; +"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player."; +"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off"; "Yes" = "Sí"; "No" = "No"; + +"Copied" = "Copied to clipboard"; +"Saved" = "Saved to Photos"; +"Error" = "Error"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings index d30e1a2..88b5d0a 100644 --- a/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/fr.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "Masque les cartes de fin d'écran (vignettes) à la fin des vidéos."; "NoFullscreenActions" = "Désactiver les actions en plein écran"; "NoFullscreenActionsDesc" = "Désactive le panneau d'actions en mode plein écran."; +"PersistentProgressBar" = "Persistent progress bar"; +"PersistentProgressBarDesc" = "Always shows progress bar in the player."; "NoRelatedVids" = "Pas de vidéos associées dans l'overlay"; "NoRelatedVidsDesc" = "Supprime les vidéos associées affichées dans l'overlay en faisant glisser vers le haut."; "NoPromotionCards" = "Masquer les cartes de promotion payante"; @@ -53,6 +55,8 @@ "CopyWithTimestampDesc" = "Allows to copy timestamped link to the clipboard by pressing pause button."; "DisableAutoplay" = "Désactiver la lecture automatique des vidéos"; "DisableAutoplayDesc" = "Empêche la lecture des vidéos après ouverture."; +"DisableAutoCaptions" = "Disable auto captions"; +"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions."; "NoContentWarning" = "Passer l'avertissement de contenu"; "NoContentWarningDesc" = "Ignore le message d'avertissement de contenu sensible."; "ClassicQuality" = "Qualité vidéo classique"; @@ -81,6 +85,8 @@ "RemoveIndicatorsDesc" = "Removes tab indicators."; "ReExplore" = "Remplacer l'onglet Shorts par l'onglet Explorer"; "ReExploreDesc" = "Affiche l'onglet Explorer à la place de l'onglet Shorts comme dans les anciennes versions de YouTube."; +"AddExplore" = "Add Explore tab"; +"AddExploreDesc" = "Adds Explore tab to the Tab bar."; "HideShortsTab" = "Masquer l'onglet Shorts"; "HideShortsTabDesc" = "Masque l'onglet Shorts de la barre d'onglets"; "HideSubscriptionsTab" = "Masquer l'onglet Abonnements"; @@ -91,10 +97,16 @@ "HideLibraryTabDesc" = "Masque l'onglet Bibliothèque de la barre d'onglets"; "Shorts" = "Shorts"; +"ShortsOnlyMode" = "Shorts Only Mode"; +"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only."; "HideShorts" = "Masquer les vidéos Shorts"; "HideShortsDesc" = "Masque les vidéos Shorts de la page d'accueil, des recommandations, etc. (Non appliqué à l'historique de visionnage)"; "ShortsProgress" = "Activer la barre de progression"; "ShortsProgressDesc" = "Affiche la barre de progression dans l'overlay Shorts."; +"PinchToFullscreenShorts" = "Pinch to Fullscreen"; +"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode."; +"ShortsToRegular" = "Shorts to regular videos"; +"ShortsToRegularDesc" = "Opens Shorts videos as regular videos."; "ResumeShorts" = "Ne pas démarrer depuis l'onglet Shorts"; "ResumeShortsDesc" = "Empêche de démarrer depuis les vidéos Shorts lors de l'ouverture de l'application, ce qui se produit si YouTube était fermé pendant la lecture des Shorts."; "HideShortsLogo" = "Masquer le logo Shorts"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "Masque la photo de profil dans le coin inférieur droit."; "HideShortsThanks" = "Masquer le bouton Superthanks"; "HideShortsThanksDesc" = "Masque le bouton Superthanks (Don) de l'overlay Shorts."; +"HideShortsSource" = "Hide Shorts Source"; +"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name."; "HideShortsChannelName" = "Masquer le nom de la chaîne"; "HideShortsChannelNameDesc" = "Masque le nom de la chaîne et le bouton S'abonner de l'overlay Shorts."; "HideShortsDescription" = "Masquer la description"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "Masque la piste audio sous la description des Shorts."; "Other" = "Autre"; +"CopyPostText" = "Copy community posts text"; +"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"SavePostImage" = "Save community posts image"; +"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap."; +"SaveProfilePhoto" = "Save profile picture"; +"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap."; +"FixAlbums" = "Fix covers"; +"FixAlbumsDesc" = "Fixes the display of covers for users from Russia."; "RemovePlayNext" = "Supprimer \"Placer en première position dans la file d'attente\""; "RemovePlayNextDesc" = "Supprime l'option \"Placer en première position dans la file d'attente\" du menu."; "NoContinueWatching" = "Supprimer \"Continuer à regarder\""; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "Voulez-vous activer le mode avancé pour YTLite ?\n\nCe mode offre plus de 50 options supplémentaires pour personnaliser et optimiser votre expérience YouTube. Vous pouvez l'activer/désactiver ultérieurement depuis Paramètres → %@ → %@ → %@."; "ResetSettings" = "Réinitialiser les paramètres YTLite"; "ResetMessage" = "Cette option réinitialisera les paramètres YTLite par défaut et fermera YouTube.\n\nÊtes-vous sûr de vouloir continuer ?"; +"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player."; +"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off"; "Yes" = "Oui"; -"No" = "Non"; \ No newline at end of file +"No" = "Non"; + +"Copied" = "Copied to clipboard"; +"Saved" = "Saved to Photos"; +"Error" = "Error"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings index b20e9dd..367341f 100644 --- a/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/ja.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "動画の終わりに表示されるエンドスクリーン(サムネイル)を非表示にします"; "NoFullscreenActions" = "フルスクリーンアクションを無効化"; "NoFullscreenActionsDesc" = "フルスクリーンモードでのアクションパネルを無効にします"; +"PersistentProgressBar" = "Persistent progress bar"; +"PersistentProgressBarDesc" = "Always shows progress bar in the player."; "NoRelatedVids" = "オーバーレイの関連動画を非表示"; "NoRelatedVidsDesc" = "スワイプアップでオーバーレイに表示される関連動画を非表示にします"; "NoPromotionCards" = "有料プロモーションカードを非表示"; @@ -53,6 +55,8 @@ "CopyWithTimestampDesc" = "一時停止ボタンを押すことで、タイムスタンプ付きリンクをクリップボードにコピーできます"; "DisableAutoplay" = "自動再生を無効化"; "DisableAutoplayDesc" = "アプリを開いた後に動画の自動再生を防止します"; +"DisableAutoCaptions" = "Disable auto captions"; +"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions."; "NoContentWarning" = "コンテンツ警告をスキップ"; "NoContentWarningDesc" = "不適切なコンテンツの警告メッセージをスキップします"; "ClassicQuality" = "クラシックなビデオ品質"; @@ -81,6 +85,8 @@ "RemoveIndicatorsDesc" = "タブインジケーターを削除します"; "ReExplore" = "ショートタブを探索タブに置き換え"; "ReExploreDesc" = "古いYouTubeバージョンのように、ショートタブの代わりに探索タブを表示します"; +"AddExplore" = "Add Explore tab"; +"AddExploreDesc" = "Adds Explore tab to the Tab bar."; "HideShortsTab" = "ショートタブを非表示"; "HideShortsTabDesc" = "タブバーからショートタブを非表示にします"; "HideSubscriptionsTab" = "登録チャンネルタブを非表示"; @@ -91,10 +97,16 @@ "HideLibraryTabDesc" = "タブバーからライブラリタブを非表示にします"; "Shorts" = "ショート"; +"ShortsOnlyMode" = "Shorts Only Mode"; +"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only."; "HideShorts" = "ショート動画を非表示"; "HideShortsDesc" = "ホーム, おすすめなどからショート動画を非表示にします(視聴履歴には適用されません)"; "ShortsProgress" = "プログレスバーを有効化"; "ShortsProgressDesc" = "ショートオーバーレイにプログレスバーを表示します"; +"PinchToFullscreenShorts" = "Pinch to Fullscreen"; +"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode."; +"ShortsToRegular" = "Shorts to regular videos"; +"ShortsToRegularDesc" = "Opens Shorts videos as regular videos."; "ResumeShorts" = "ショートタブからの再開を防止"; "ResumeShortsDesc" = "ショートを視聴中にアプリを閉じた場合でも、ショートからの再開を防止します"; "HideShortsLogo" = "ショートロゴを非表示"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "右下隅のプロフィール画像を非表示にします"; "HideShortsThanks" = "スーパーサンクスボタンを非表示"; "HideShortsThanksDesc" = "ショートオーバーレイからスーパーサンクス(寄付)ボタンを非表示にします"; +"HideShortsSource" = "Hide Shorts Source"; +"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name."; "HideShortsChannelName" = "チャンネル名を非表示"; "HideShortsChannelNameDesc" = "ショートオーバーレイからチャンネル名とチャンネル登録ボタンを非表示にします"; "HideShortsDescription" = "説明を非表示"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "ショートの説明の下に表示されるオーディオトラックを非表示にします"; "Other" = "その他"; +"CopyPostText" = "Copy community posts text"; +"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"SavePostImage" = "Save community posts image"; +"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap."; +"SaveProfilePhoto" = "Save profile picture"; +"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap."; +"FixAlbums" = "Fix covers"; +"FixAlbumsDesc" = "Fixes the display of covers for users from Russia."; "RemovePlayNext" = "\"次に再生\"を削除"; "RemovePlayNextDesc" = "メニューから\"次に再生\"オプションを削除します"; "NoContinueWatching" = "\"続きを見る\"を削除"; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "YTLiteでアドバンスモードを有効にしますか?\n\nこのモードでは50以上の追加オプションを使用してYouTubeのカスタマイズと最適化が可能です。後で、設定 → %@ → %@ → %@から変更できます"; "ResetSettings" = "YTLiteの設定をリセット"; "ResetMessage" = "このオプションを選択するとYTLiteの設定がデフォルトにリセットされ、アプリが終了します。\n\n続行してもよろしいですか?"; +"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player."; +"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off"; "Yes" = "はい"; "No" = "いいえ"; + +"Copied" = "Copied to clipboard"; +"Saved" = "Saved to Photos"; +"Error" = "Error"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings index 43927ad..0ca8ef3 100644 --- a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "Скрывает эскизы, отображаемые по окончанию видеоролика."; "NoFullscreenActions" = "Отключить панель действий"; "NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера."; +"PersistentProgressBar" = "Всегда отображать прогресс-бар"; +"PersistentProgressBarDesc" = "Всегда отображает прогресс-бар внутри плеера."; "NoRelatedVids" = "Скрыть рекомендации в оверлее"; "NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере."; "NoPromotionCards" = "Скрыть сообщение «Есть реклама»"; @@ -49,10 +51,12 @@ "MiniplayerDesc" = "Принудительно активирует миниплеер для видео, в которых изначально не был предназначен (например, видеоролики для детей)."; "PortraitFullscreen" = "Портретный полноэкранный режим"; "PortraitFullscreenDesc" = "Активирует поддержку портретного полноэкранного режима."; -"CopyWithTimestamp" = "Ссылки с временной отметкой"; +"CopyWithTimestamp" = "Ссылки с временными отметками"; "CopyWithTimestampDesc" = "Позволяет скопировать ссылку на видео с временной отметкой в буфер обмена нажатием на кнопку паузы."; "DisableAutoplay" = "Запретить автовоспроизведение"; "DisableAutoplayDesc" = "Принудительно запрещает автовоспроизведение видео при его открытии."; +"DisableAutoCaptions" = "Запретить автоматические субтитры"; +"DisableAutoCaptionsDesc" = "Отключает включенные по умолчанию субтитры"; "NoContentWarning" = "Пропускать предупреждения"; "NoContentWarningDesc" = "Пропускает предупреждения, всплывающие перед воспроизведением некоторого контента."; "ClassicQuality" = "Классический выбор качества"; @@ -81,6 +85,8 @@ "RemoveIndicatorsDesc" = "Скрывает индикаторы вкладок."; "ReExplore" = "Вкладка «Навигация» вместо «Shorts»"; "ReExploreDesc" = "Заменяет вкладку «Shorts» на привычную нам «Навигацию»."; +"AddExplore" = "Добавить вкладку «Навигация»"; +"AddExploreDesc" = "Добавляет вкладку «Навигация» в панель вкладок."; "HideShortsTab" = "Скрыть «Shorts»"; "HideShortsTabDesc" = "Скрывает вкладку «Shorts» с панели вкладок."; "HideSubscriptionsTab" = "Скрыть «Подписки»"; @@ -91,10 +97,16 @@ "HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок."; "Shorts" = "Настройки Shorts"; +"ShortsOnlyMode" = "Режим Shorts"; +"ShortsOnlyModeDesc" = "Ограничивает функциональность YouTube до отображения видеороликов Shorts"; "HideShorts" = "Скрыть видеоролики Shorts"; "HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)"; "ShortsProgress" = "Показывать прогресс-бар"; "ShortsProgressDesc" = "Отображает прогресс-бар в плеере Shorts."; +"PinchToFullscreenShorts" = "Полноэкранный режим щипком"; +"PinchToFullscreenShortsDesc" = "Скрывает панель вкладок, тем самым отображает Shorts на весь экран."; +"ShortsToRegular" = "Shorts как обычные видео"; +"ShortsToRegularDesc" = "Воспроизводит видеоролики Shorts в обычном проигрывателе."; "ResumeShorts" = "Всегда запускать с Главной страницы"; "ResumeShortsDesc" = "Предотвращает запуск видеороликов Shorts при открытии YouTube. Это происходит, если закрыть YouTube при просмотре Shorts."; "HideShortsLogo" = "Скрыть логотип Shorts"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "Скрывает аватарку пользователя в правом нижнем углу."; "HideShortsThanks" = "Скрыть «Суперспасибо»"; "HideShortsThanksDesc" = "Скрывает кнопку отправки доната (суперспасибо) с плеера Shorts."; +"HideShortsSource" = "Скрыть источник Shorts"; +"HideShortsSourceDesc" = "Скрывает источники Shorts под названием канала."; "HideShortsChannelName" = "Скрыть название канала"; "HideShortsChannelNameDesc" = "Скрывает название канала и кнопку «Подписаться» с плеера Shorts."; "HideShortsDescription" = "Скрыть описание ролика"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера."; "Other" = "Другие настройки"; +"CopyPostText" = "Копировать текст постов"; +"CopyPostTextDesc" = "Копирует текст постов в буфер обмена долгим нажатием."; +"SavePostImage" = "Сохранять изображения постов"; +"SavePostImageDesc" = "Сохраняет изображения постов в «Фото» долгим нажатием по ним."; +"SaveProfilePhoto" = "Сохранять фото профиля"; +"SaveProfilePhotoDesc" = "Сохраняет фото профиля в «Фото» долгим нажатием по нему."; +"FixAlbums" = "Исправить отображение обложек"; +"FixAlbumsDesc" = "Исправляет отображение обложек в том случае, если вы из России."; "RemovePlayNext" = "Убрать «Добавить в начало очереди»"; "RemovePlayNextDesc" = "Убирает опцию «Добавить в начало очереди» из меню видео."; "NoContinueWatching" = "Отключить «Продолжить просмотр»"; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "Хотите ли вы активировать расширенный режим настроек YTLite?\n\nДанный режим добавляет более 50 опций для тонкой настройки YouTube. Вы всегда сможете включить/отключить расширенный режим перейдя в Настройки → %@ → %@ → %@."; "ResetSettings" = "Сбросить настройки твика"; "ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?"; +"ShortsOnlyWarning" = "Вы уверены, что хотите активировать данный режим?\n\nВ данном режиме вы не сможете ничего делать, кроме как смотреть видеоролики Shorts.\n\nРежим Shorts можно будет отключить зажав в плеере двумя пальцами."; +"ShortsModeTurnedOff" = "Режим Shorts был отключен"; "Yes" = "Да"; "No" = "Нет"; + +"Copied" = "Скопировано в буфер обмена"; +"Saved" = "Сохранено в Фото"; +"Error" = "Ошибка"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings index 546ee82..39d0039 100644 --- a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "隐藏视频结尾处的片尾屏幕(缩略图)。"; "NoFullscreenActions" = "禁用全屏操作"; "NoFullscreenActionsDesc" = "在全屏模式下禁用操作面板。"; +"PersistentProgressBar" = "Persistent progress bar"; +"PersistentProgressBarDesc" = "Always shows progress bar in the player."; "NoRelatedVids" = "没有相关视频"; "NoRelatedVidsDesc" = "通过向上滑动删除播放界面中显示的相关视频。"; "NoPromotionCards" = "隐藏付费"; @@ -53,6 +55,8 @@ "CopyWithTimestampDesc" = "允许通过按下暂停按钮将带有时间戳的链接复制到剪贴板。"; "DisableAutoplay" = "禁用自动播放视频"; "DisableAutoplayDesc" = "打开后防止视频自动播放。"; +"DisableAutoCaptions" = "Disable auto captions"; +"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions."; "NoContentWarning" = "跳过内容警告"; "NoContentWarningDesc" = "跳过敏感内容警告消息。"; "ClassicQuality" = "经典视频质量"; @@ -81,6 +85,8 @@ "RemoveIndicatorsDesc" = "删除选项卡“红点”指示。"; "ReExplore" = "“短视频”替换为“探索”"; "ReExploreDesc" = "在旧版本 YouTube 中将“短视频”选项卡替换为“探索”。"; +"AddExplore" = "Add Explore tab"; +"AddExploreDesc" = "Adds Explore tab to the Tab bar."; "HideShortsTab" = "隐藏短视频"; "HideShortsTabDesc" = "从选项卡栏中隐藏短视频。"; "HideSubscriptionsTab" = "隐藏订阅内容"; @@ -91,10 +97,16 @@ "HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库。"; "Shorts" = "短视频"; +"ShortsOnlyMode" = "Shorts Only Mode"; +"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only."; "HideShorts" = "隐藏短视频"; "HideShortsDesc" = "从首页、推荐等隐藏短视频(不适用于观看历史记录)。"; "ShortsProgress" = "启用进度条"; "ShortsProgressDesc" = "在短视频播放器中显示进度条。"; +"PinchToFullscreenShorts" = "Pinch to Fullscreen"; +"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode."; +"ShortsToRegular" = "Shorts to regular videos"; +"ShortsToRegularDesc" = "Opens Shorts videos as regular videos."; "ResumeShorts" = "不要从短视频开始"; "ResumeShortsDesc" = "防止在打开应用程序时首先启动短视频,如果在观看短视频时关闭,就会发生这种情况。"; "HideShortsLogo" = "隐藏短视频Logo"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "隐藏右下角的发布者个人资料头像。"; "HideShortsThanks" = "隐藏捐赠按钮"; "HideShortsThanksDesc" = "从短视频播放器中隐藏捐赠按钮。"; +"HideShortsSource" = "Hide Shorts Source"; +"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name."; "HideShortsChannelName" = "隐藏发布者名称"; "HideShortsChannelNameDesc" = "从短视频播放器中隐藏发布者名称和订阅按钮。"; "HideShortsDescription" = "隐藏文案"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "隐藏短视频文案下方的音轨。"; "Other" = "其他"; +"CopyPostText" = "Copy community posts text"; +"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"SavePostImage" = "Save community posts image"; +"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap."; +"SaveProfilePhoto" = "Save profile picture"; +"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap."; +"FixAlbums" = "Fix covers"; +"FixAlbumsDesc" = "Fixes the display of covers for users from Russia."; "RemovePlayNext" = "删除“播放队列中的下一个”"; "RemovePlayNextDesc" = "从菜单中删除“播放队列中的下一个”选项。"; "NoContinueWatching" = "删除“继续观看”"; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "想为YTLite激活高级模式吗?\n\n此模式提供了50多个额外的选项来自定义和优化您的YouTube体验。\n可以稍后从设置中启用/禁用它 → %@ → %@ → %@。"; "ResetSettings" = "重置YTLite设置"; "ResetMessage" = "此选项会将YTLite设置重置为默认值并关闭YouTube。\n\n确定要继续吗?"; +"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player."; +"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off"; "Yes" = "是"; "No" = "不"; + +"Copied" = "Copied to clipboard"; +"Saved" = "Saved to Photos"; +"Error" = "Error"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings index f89e039..a40910c 100644 --- a/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hant.lproj/Localizable.strings @@ -37,6 +37,8 @@ "NoEndScreenCardsDesc" = "隱藏當影片結束時的懸停影片(縮圖)"; "NoFullscreenActions" = "停用全螢幕操作"; "NoFullscreenActionsDesc" = "在全螢幕模式下停用操作面板"; +"PersistentProgressBar" = "Persistent progress bar"; +"PersistentProgressBarDesc" = "Always shows progress bar in the player."; "NoRelatedVids" = "隱藏相關影片"; "NoRelatedVidsDesc" = "移除全螢幕模式向上滑動時所出現的相關影片"; "NoPromotionCards" = "隱藏付費推廣"; @@ -53,6 +55,8 @@ "CopyWithTimestampDesc" = "透過按下暫停按鈕,將帶有時間標記的連結複製到剪貼簿"; "DisableAutoplay" = "停用自動播放"; "DisableAutoplayDesc" = "在打開應用程式後防止自動播放影片"; +"DisableAutoCaptions" = "Disable auto captions"; +"DisableAutoCaptionsDesc" = "Prevents automatic activation of captions."; "NoContentWarning" = "略過內容警告"; "NoContentWarningDesc" = "略過敏感內容警告訊息"; "ClassicQuality" = "舊版本影片畫質"; @@ -81,6 +85,8 @@ "RemoveIndicatorsDesc" = "刪除標籤通知標記"; "ReExplore" = "用探索取代Shorts分頁"; "ReExploreDesc" = "如同舊版YouTube一樣顯示「探索」而非「Shorts」"; +"AddExplore" = "Add Explore tab"; +"AddExploreDesc" = "Adds Explore tab to the Tab bar."; "HideShortsTab" = "隱藏Shorts"; "HideShortsTabDesc" = "從標籤欄中隱藏Shorts標籤"; "HideSubscriptionsTab" = "隱藏訂閱內容"; @@ -91,10 +97,16 @@ "HideLibraryTabDesc" = "從標籤欄中隱藏媒體庫標籤"; "Shorts" = "Shorts"; +"ShortsOnlyMode" = "Shorts Only Mode"; +"ShortsOnlyModeDesc" = "Limits YouTube functionality to viewing Shorts only."; "HideShorts" = "隱藏Shorts影片"; "HideShortsDesc" = "從首頁、推薦...等,隱藏Shorts影片(不適用於觀看紀錄)"; "ShortsProgress" = "啟用時間進度條"; "ShortsProgressDesc" = "在Shorts底部顯示進度條"; +"PinchToFullscreenShorts" = "Pinch to Fullscreen"; +"PinchToFullscreenShortsDesc" = "Manages visibility of the overlay with pinch in and pinch out gestures, displaying Shorts in fullscreen mode."; +"ShortsToRegular" = "Shorts to regular videos"; +"ShortsToRegularDesc" = "Opens Shorts videos as regular videos."; "ResumeShorts" = "不要從Shorts開始"; "ResumeShortsDesc" = "防止重新開啟應用程式時從Shorts開始播放,如果在觀看Shorts時關閉,就會發生這種情況"; "HideShortsLogo" = "隱藏Shorts圖示"; @@ -121,6 +133,8 @@ "HideShortsAvatarsDesc" = "隱藏右下角的頻道圖片"; "HideShortsThanks" = "隱藏超級感謝按鈕"; "HideShortsThanksDesc" = "從Shorts中隱藏超級感謝 (贊助) 按鈕"; +"HideShortsSource" = "Hide Shorts Source"; +"HideShortsSourceDesc" = "Hides the Shorts sources under the channel name."; "HideShortsChannelName" = "隱藏頻道名稱"; "HideShortsChannelNameDesc" = "從Shorts中隱藏頻道名稱和訂閱按鈕"; "HideShortsDescription" = "隱藏描述"; @@ -129,6 +143,14 @@ "HideShortsAudioTrackDesc" = "隱藏Shorts描述下的原始音效"; "Other" = "其它"; +"CopyPostText" = "Copy community posts text"; +"CopyPostTextDesc" = "Copies community posts text to the clipboard by long tap."; +"SavePostImage" = "Save community posts image"; +"SavePostImageDesc" = "Saves community posts image to the Photos app by long tap."; +"SaveProfilePhoto" = "Save profile picture"; +"SaveProfilePhotoDesc" = "Saves profile picture to the Photos app by long tap."; +"FixAlbums" = "Fix covers"; +"FixAlbumsDesc" = "Fixes the display of covers for users from Russia."; "RemovePlayNext" = "移除「播放下一個」"; "RemovePlayNextDesc" = "從選單移除「播放下一個」"; "NoContinueWatching" = "移除「繼續觀看」"; @@ -168,5 +190,11 @@ "AdvancedModeReminder" = "您是否想啟用YTLite的進階模式?\n\n這個模式提供了50多個額外的選項,可以自訂義和優化您的YouTube使用體驗。您稍後可以在「設定」中 → %@ → %@ → %@ 啟用或停用它。"; "ResetSettings" = "重置YTLite設定"; "ResetMessage" = "這個選項會將YTLite重置為預設值,並關閉Youtube\n\n您確定要繼續嗎?"; +"ShortsOnlyWarning" = "Are you sure you want to activate this mode?\n\nIn this mode, you will only be able to watch Shorts videos and won't be able to do anything else.\n\nYou can disable Shorts Only Mode by long pressing with two fingers in the Shorts player."; +"ShortsModeTurnedOff" = "Shorts Only Mode has been turned off"; "Yes" = "是"; "No" = "否"; + +"Copied" = "Copied to clipboard"; +"Saved" = "Saved to Photos"; +"Error" = "Error"; \ No newline at end of file diff --git a/packages/com.dvntm.ytlite_2.5_iphoneos-arm.deb b/packages/com.dvntm.ytlite_2.5_iphoneos-arm.deb new file mode 100644 index 0000000000000000000000000000000000000000..c82681de83c50bad0c1f15fca36683f69b24e935 GIT binary patch literal 59570 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 literal 0 HcmV?d00001