Compare commits
22
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2cd37a8b6 | ||
|
|
e5b9ff21cf | ||
|
|
2e7fd253a8 | ||
|
|
3aa7c57d82 | ||
|
|
11ddcd421d | ||
|
|
6418f3daeb | ||
|
|
4b283110a6 | ||
|
|
2615436031 | ||
|
|
81088fadd3 | ||
|
|
5adaec2c93 | ||
|
|
7ac253963e | ||
|
|
2d2b469f1f | ||
|
|
9e98ad9482 | ||
|
|
1d5de3cd4c | ||
|
|
1266cb5a38 | ||
|
|
4fee21517e | ||
|
|
2ff0f3fb56 | ||
|
|
329fb1681a | ||
|
|
c78e5b9fd9 | ||
|
|
7b9fd7dcfb | ||
|
|
922ab4e9b7 | ||
|
|
c8a4acfff0 |
@@ -15,7 +15,7 @@ _Make sure you complete the template. Otherwise, it will be closed without furth
|
||||
- iOS/iPadOS version:
|
||||
- Device model:
|
||||
- Sideload tool (Ex: AltStore, Sideloadly...)
|
||||
- Version of uYouPlus:
|
||||
- Version of uYouPlus: _**latest** or **newest** is NOT a version number!!_
|
||||
|
||||
### Describe the bug
|
||||
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
@end
|
||||
|
||||
// uYouPlus
|
||||
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
|
||||
- (void)confirmAlertDidPressConfirm;
|
||||
@end
|
||||
|
||||
@interface YTMainAppControlsOverlayView : UIView
|
||||
@end
|
||||
|
||||
@@ -26,6 +30,13 @@
|
||||
@interface FRPSliderCell : UITableViewCell
|
||||
@end
|
||||
|
||||
@interface boolSettingsVC : UIViewController
|
||||
@end
|
||||
|
||||
@interface PlayerManager : NSObject
|
||||
- (float)progress;
|
||||
@end
|
||||
|
||||
// iOS16 fix
|
||||
@interface OBPrivacyLinkButton : UIButton
|
||||
- (instancetype)initWithCaption:(NSString *)caption
|
||||
|
||||
@@ -13,7 +13,7 @@ BUNDLE_ID = com.google.ios.youtube
|
||||
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YoutubeSpeed.dylib
|
||||
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
||||
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
||||
uYouPlus_FRAMEWORKS = UIKit
|
||||
uYouPlus_FRAMEWORKS = UIKit Security
|
||||
uYouPlus_CFLAGS = -fobjc-arc
|
||||
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
- [BandarHL](https://twitter.com/bandarhl) for a bunch of improvements.
|
||||
|
||||
- [Julioverne](https://twitter.com/ijulioverne) for the solution to skip Google's safety warning when logging in.
|
||||
|
||||
- [Lyvendia](https://github.com/Lyvendia/) for [YTSpeed](https://github.com/Lyvendia/YTSpeed/)
|
||||
|
||||
- [YouTube Extensions](https://github.com/CokePokes/YoutubeExtensions) by [CokePokes](https://github.com/CokePokes/).
|
||||
@@ -78,16 +80,16 @@
|
||||
|
||||
- My official AltStore repo: https://qnblackcat.github.io/AltStore/
|
||||
|
||||
- [Open in AltStore (v17.31.4-2.1)](https://tinyurl.com/2p99amjz) - It will take a while to install because AltStore needs to download the IPA.
|
||||
- [Open in AltStore (v17.33.2-2.1)](https://tinyurl.com/33mv77u6) - It will take a while to install because AltStore needs to download the IPA.
|
||||
|
||||
- Version info: _(last update: Aug 12)_
|
||||
- Version info: _(last update: Aug 26)_
|
||||
|
||||
<details>
|
||||
<summary>Expand</summary>
|
||||
|
||||
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
||||
| - | - | :-: | :-: |
|
||||
| **YouTube** | Google Inc | 17.31.4 | ✖︎ |
|
||||
| **YouTube** | Google Inc | 17.33.2 | ✖︎ |
|
||||
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
|
||||
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
|
||||
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||
@@ -119,9 +121,7 @@ See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installati
|
||||
<details>
|
||||
<summary>MiRO92</summary>
|
||||
|
||||
- CashApp: https://cash.app/$MiRO92M
|
||||
|
||||
- Other payment methods are available in uYou's settings.
|
||||
- https://github.com/MiRO92/uYou-for-YouTube#support
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
+1
-1
Submodule Tweaks/YouPiP updated: a8c4224f7d...77bed4f3fb
+1
-1
Submodule Tweaks/YouTubeHeader updated: 08eeeb7a9c...fa1fb5a993
@@ -1,25 +1,25 @@
|
||||
// Settings
|
||||
|
||||
"KILL_APP" = "YouTubeを閉じる";
|
||||
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
|
||||
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "前後の動画のボタンを非表示";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "コントロールのオーバーレイで前後の動画のボタンを非表示にします。";
|
||||
|
||||
"YT_MINIPLAYER" = "すべての動画でミニプレーヤーを有効にする";
|
||||
"YT_MINIPLAYER_DESC" = "例: 子供向けの動画";
|
||||
"YT_MINIPLAYER_DESC" = "例: 子ども向けの動画";
|
||||
|
||||
"CAST_CONFIRM" = "キャストする前に確認画面を表示する (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "誤ってテレビにキャストしないよう、前に確認画面を表示します。";
|
||||
|
||||
"HIDE_HOVER_CARD" = "動画終わりのホバーカードを非表示 (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "動画終わりのホバーカード(サムネ)を非表示にします。";
|
||||
"HIDE_HOVER_CARD_DESC" = "動画の最後のホバーカード(サムネイル)を非表示にします。";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "アプリを再起動してください。";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "アプリの再起動が必要です。";
|
||||
|
||||
"YT_RE_EXPLORE" = "ショートのタブを「見つける」タブに置き換える (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "アプリを再起動してください。";
|
||||
"YT_RE_EXPLORE" = "ショートタブを探索タブに置き換える (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "アプリの再起動が必要です。";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "字幕ボタンを非表示";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "動画コントロールのオーバーレイから字幕ボタンを非表示にします。";
|
||||
@@ -31,19 +31,19 @@
|
||||
"AUTO_FULLSCREEN_DESC" = "動画を自動でフルスクリーンにします。";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "HUDのメッセージを非表示";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がon/offです、ループ再生は有効です 等";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がオン/オフになりました、ループ再生はオンになっています 等";
|
||||
|
||||
"OLED_DARKMODE" = "有機ELダークモード (実験的機能)";
|
||||
"OLED_DARKMODE_DESC" = "一部では正しく動作しない可能性があります。 この設定を変更したあとはアプリを再起動してください。";
|
||||
"OLED_DARKMODE_DESC" = "一部では正しく動作しない可能性があります。この設定を変更したあとはアプリの再起動が必要です。";
|
||||
|
||||
"OLED_KEYBOARD" = "有機ELキーボード (実験的機能)";
|
||||
"OLED_KEYBOARD_DESC" = "一部では正しく動作しない可能性があります。 この設定を変更したあとはアプリを再起動してください。";
|
||||
"OLED_KEYBOARD_DESC" = "一部では正しく動作しない可能性があります。この設定を変更したあとはアプリの再起動が必要です。";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "「プロモーションを含む」 のバナーを非表示";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画にある「プロモーションを含む」 のバナーを非表示にします。";
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "プロモーションバナーを非表示";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画にある「プロモーションを含みます」のバナーを非表示にします。";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "キャスト";
|
||||
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
|
||||
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
|
||||
"MSG_YES" = "はい";
|
||||
"MSG_CANCEL" = "キャンセル";
|
||||
"MSG_CANCEL" = "キャンセル";
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
// Settings
|
||||
|
||||
"KILL_APP" = "YouTube 닫기";
|
||||
"KILL_APP_DESC" = "YouTube 앱을 닫으려면 여기를 탭하세요!";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "이전, 다음 재생 버튼 숨기기";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "비디오 재생 오버레이에서 이전 재생, 다음 재생 버튼을 숨깁니다.";
|
||||
|
||||
"YT_MINIPLAYER" = "모든 YouTube 영상에서 미니 플레이어 활성화";
|
||||
"YT_MINIPLAYER_DESC" = "아동용 영상일 경우.";
|
||||
|
||||
"CAST_CONFIRM" = "TV 전송 알림 (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "의도치 않게 TV로 영상을 전송하지 않도록 보내기 전에 확인 메시지를 표시합니다.";
|
||||
|
||||
"HIDE_HOVER_CARD" = "영상 끝 부분의 호버카드 숨기기 (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "영상의 끝 부분에서 게시자가 표시한 영상 썸네일을 숨깁니다.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "새로운 스타일의 미니 플레이어 (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "앱을 다시 시작해야 합니다.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Shorts 탭 대신 탐색 탭 보이기 (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "앱을 다시 시작해야 합니다.";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "자막 버튼 숨기기";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "비디오 재생 오버레이에서 자막 버튼을 숨깁니다.";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "자동재생 스위치 숨기기";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "비디오 재생 오버레이에서 자동재생 스위치를 숨깁니다.";
|
||||
|
||||
"AUTO_FULLSCREEN" = "자동 전체화면 재생 (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "자동으로 전체화면에서 재생합니다.";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "화면 메시지 숨기기";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "예: 자막 사용 설정됨/중지됨, 반복재생 설정됨,...";
|
||||
|
||||
"OLED_DARKMODE" = "OLED 다크모드 (실험실)";
|
||||
"OLED_DARKMODE_DESC" = "몇몇 경우 제대로 동작하지 않을 수도 있습니다. 이 기능을 켜거나 끄는 경우 앱을 다시 시작해야 합니다.";
|
||||
|
||||
"OLED_KEYBOARD" = "OLED 키보드 (실험실)";
|
||||
"OLED_KEYBOARD_DESC" = "몇몇 경우 제대로 동작하지 않을 수도 있습니다. 앱을 다시 시작해야 합니다.";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "유료 광고 배너 숨기기";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "'유료 광고 포함' 배너를 숨깁니다.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "TV로 전송";
|
||||
"MSG_ARE_YOU_SURE" = "TV로 영상 전송을 시작하겠습니까?";
|
||||
"MSG_YES" = "예";
|
||||
"MSG_CANCEL" = "취소";
|
||||
+149
-50
@@ -12,10 +12,11 @@
|
||||
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
||||
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
||||
#import "Tweaks/YouTubeHeader/YTColorPalette.h"
|
||||
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
|
||||
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
|
||||
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
|
||||
|
||||
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
||||
NSBundle *uYouPlusBundle() {
|
||||
@@ -29,7 +30,24 @@ NSBundle *uYouPlusBundle() {
|
||||
}
|
||||
NSBundle *tweakBundle = uYouPlusBundle();
|
||||
|
||||
//
|
||||
static NSString *accessGroupID() {
|
||||
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
(__bridge NSString *)kSecClassGenericPassword, (__bridge NSString *)kSecClass,
|
||||
@"bundleSeedID", kSecAttrAccount,
|
||||
@"", kSecAttrService,
|
||||
(id)kCFBooleanTrue, kSecReturnAttributes,
|
||||
nil];
|
||||
CFDictionaryRef result = nil;
|
||||
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
|
||||
if (status == errSecItemNotFound)
|
||||
status = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
|
||||
if (status != errSecSuccess)
|
||||
return nil;
|
||||
NSString *accessGroup = [(__bridge NSDictionary *)result objectForKey:(__bridge NSString *)kSecAttrAccessGroup];
|
||||
|
||||
return accessGroup;
|
||||
}
|
||||
|
||||
BOOL hideHUD() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||
}
|
||||
@@ -80,6 +98,11 @@ BOOL hidePaidPromotionCard() {
|
||||
- (BOOL)canReorder { return YES; }
|
||||
%end
|
||||
|
||||
// Skips content warning before playing *some videos - @PoomSmart
|
||||
%hook YTPlayabilityResolutionUserActionUIController
|
||||
- (void)showConfirmAlert { [self confirmAlertDidPressConfirm]; }
|
||||
%end
|
||||
|
||||
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
|
||||
%hook YTWatchMiniBarViewController
|
||||
- (void)updateMiniBarPlayerStateFromRenderer {
|
||||
@@ -175,16 +198,18 @@ BOOL hidePaidPromotionCard() {
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
|
||||
%hook YTAdsInnerTubeContextDecorator
|
||||
- (void)decorateContext:(id)arg1 { %orig(nil); }
|
||||
// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263
|
||||
%hook YTDataUtils
|
||||
+ (NSMutableDictionary *)spamSignalsDictionary {
|
||||
return nil;
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
||||
%hook YTELMView
|
||||
%hook UIResponder
|
||||
%new
|
||||
- (id)entry {
|
||||
return nil;
|
||||
return nil;
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -192,7 +217,17 @@ BOOL hidePaidPromotionCard() {
|
||||
%hook YTLocalPlaybackController
|
||||
%new
|
||||
- (id)activeVideoController {
|
||||
return [self activeVideo];
|
||||
return [self activeVideo];
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for qnblackcat/uYouPlus#10
|
||||
%hook boolSettingsVC
|
||||
- (instancetype)initWithTitle:(NSString *)title sections:(NSArray *)sections footer:(NSString *)footer {
|
||||
if (@available(iOS 15, *))
|
||||
if (![self valueForKey:@"_lastNotifiedTraitCollection"])
|
||||
[self setValue:[UITraitCollection currentTraitCollection] forKey:@"_lastNotifiedTraitCollection"];
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -212,7 +247,6 @@ BOOL hidePaidPromotionCard() {
|
||||
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||
%hook YTColdConfig
|
||||
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
||||
- (BOOL)shouldUseAppThemeSetting { return YES; } // v16.xx
|
||||
%end
|
||||
|
||||
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
||||
@@ -251,17 +285,68 @@ BOOL hidePaidPromotionCard() {
|
||||
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
|
||||
%end
|
||||
|
||||
%hook YTReelPlayerViewControllerSub // v16.42.3 - @level3tjg: https://reddit.com/r/jailbreak/comments/v29yvk/_/iasl1l0/
|
||||
- (BOOL)shouldEnablePlayerBar { return YES; }
|
||||
%end
|
||||
|
||||
// Workaround for issue #54
|
||||
%hook YTMainAppVideoPlayerOverlayViewController
|
||||
- (void)updateRelatedVideos {
|
||||
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
|
||||
else { return %orig; }
|
||||
}
|
||||
%end
|
||||
%end
|
||||
|
||||
// Workaround for qnblackcat/uYouPlus#253, qnblackcat/uYouPlus#170
|
||||
%hook YTReelWatchPlaybackOverlayView
|
||||
- (YTQTMButton *)overflowButton {
|
||||
if ([self respondsToSelector:@selector(orderedRightSideButtons)] &&
|
||||
[self orderedRightSideButtons].count != 0)
|
||||
return [self orderedRightSideButtons][0];
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook NSLayoutConstraint
|
||||
+ (instancetype)constraintWithItem:(UIView *)view1
|
||||
attribute:(NSLayoutAttribute)attr1
|
||||
relatedBy:(NSLayoutRelation)relation
|
||||
toItem:(UIView *)view2
|
||||
attribute:(NSLayoutAttribute)attr2
|
||||
multiplier:(CGFloat)multiplier
|
||||
constant:(CGFloat)c {
|
||||
if (![view1 isKindOfClass:%c(YTReelPlayerBottomButton)] &&
|
||||
![view1.accessibilityIdentifier isEqualToString:@"com.miro.uyou"])
|
||||
return %orig;
|
||||
if (!view2) {
|
||||
view1.hidden = YES;
|
||||
return [NSLayoutConstraint alloc];
|
||||
}
|
||||
YTReelPlayerBottomButton *uYouButton = (YTReelPlayerBottomButton *)view1;
|
||||
YTReelPlayerBottomButton *topButton = (YTReelPlayerBottomButton *)view2;
|
||||
NSString *uYouButtonTitle =
|
||||
[view2.accessibilityIdentifier isEqualToString:@"com.miro.uyou"]
|
||||
? @"uYou"
|
||||
: @"uYouLocal";
|
||||
uYouButton.accessibilityLabel = uYouButtonTitle;
|
||||
uYouButton.uppercaseTitle = NO;
|
||||
[uYouButton setTitle:uYouButtonTitle forState:UIControlStateNormal];
|
||||
[uYouButton
|
||||
setTitleTypeKind:MSHookIvar<NSInteger>(topButton, "_typeKind")
|
||||
typeVariant:MSHookIvar<NSInteger>(topButton, "_typeVariant")];
|
||||
uYouButton.applyRightSideLayoutImageSize = topButton.applyRightSideLayoutImageSize;
|
||||
uYouButton.buttonImageTitlePadding = topButton.buttonImageTitlePadding;
|
||||
uYouButton.buttonLayoutStyle = topButton.buttonLayoutStyle;
|
||||
uYouButton.sizeWithPaddingAndInsets = topButton.sizeWithPaddingAndInsets;
|
||||
uYouButton.verticalContentPadding = topButton.verticalContentPadding;
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Prevent uYou player bar from showing when not playing downloaded media
|
||||
%hook PlayerManager
|
||||
- (void)pause {
|
||||
if (isnan([self progress]))
|
||||
return;
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Hide YouTube Shorts banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts
|
||||
%hook YTAsyncCollectionView
|
||||
@@ -349,6 +434,14 @@ BOOL hidePaidPromotionCard() {
|
||||
}
|
||||
%end
|
||||
|
||||
%hook APMAEU
|
||||
+ (BOOL)isFAS { return YES; }
|
||||
%end
|
||||
|
||||
%hook GULAppEnvironmentUtil
|
||||
+ (BOOL)isFromAppStore { return YES; }
|
||||
%end
|
||||
|
||||
%hook NSBundle
|
||||
- (NSString *)bundleIdentifier {
|
||||
NSArray *address = [NSThread callStackReturnAddresses];
|
||||
@@ -369,6 +462,46 @@ BOOL hidePaidPromotionCard() {
|
||||
}
|
||||
%end
|
||||
|
||||
// Fix "You can't sign in to this app because Google can't confirm that it's safe" warning when signing in. by julioverne & PoomSmart
|
||||
// https://gist.github.com/PoomSmart/ef5b172fd4c5371764e027bea2613f93
|
||||
// https://github.com/qnblackcat/uYouPlus/pull/398
|
||||
%hook SSOService
|
||||
+ (id)fetcherWithRequest:(NSMutableURLRequest *)request configuration:(id)configuration {
|
||||
if ([request isKindOfClass:[NSMutableURLRequest class]] && request.HTTPBody) {
|
||||
NSError *error = nil;
|
||||
NSMutableDictionary *body = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:NSJSONReadingMutableContainers error:&error];
|
||||
if (!error && [body isKindOfClass:[NSMutableDictionary class]]) {
|
||||
[body removeObjectForKey:@"device_challenge_request"];
|
||||
request.HTTPBody = [NSJSONSerialization dataWithJSONObject:body options:kNilOptions error:&error];
|
||||
}
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Fix login for YouTube 17.33.2 and higher
|
||||
%hook SSOKeychainCore
|
||||
+ (NSString *)accessGroup {
|
||||
return accessGroupID();
|
||||
}
|
||||
|
||||
+ (NSString *)sharedAccessGroup {
|
||||
return accessGroupID();
|
||||
}
|
||||
%end
|
||||
|
||||
// Fix App Group Directory by move it to document directory
|
||||
%hook NSFileManager
|
||||
- (NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier {
|
||||
if (groupIdentifier != nil) {
|
||||
NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
|
||||
NSURL *documentsURL = [paths lastObject];
|
||||
return [documentsURL URLByAppendingPathComponent:@"AppGroup"];
|
||||
}
|
||||
return %orig(groupIdentifier);
|
||||
}
|
||||
%end
|
||||
|
||||
# pragma mark - OLED dark mode by BandarHL
|
||||
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
||||
%group gOLED
|
||||
@@ -411,39 +544,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTColorPalette // v16.42.3
|
||||
- (UIColor *)brandBackgroundSolid {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)brandBackgroundPrimary {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)brandBackgroundSecondary {
|
||||
if (self.pageStyle == 1) {
|
||||
return [[UIColor blackColor] colorWithAlphaComponent:0.9];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)staticBrandBlack {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)generalBackgroundA {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Account view controller
|
||||
%hook YTAccountPanelBodyViewController
|
||||
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||
@@ -469,7 +569,7 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
||||
self.superview.backgroundColor = [UIColor clearColor];
|
||||
self.superview.backgroundColor = [UIColor blackColor];
|
||||
}
|
||||
}
|
||||
%end
|
||||
@@ -594,7 +694,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
|
||||
@@ -768,4 +867,4 @@ static void replaceTab(YTIGuideResponse *response) {
|
||||
if (@available(iOS 16, *)) {
|
||||
%init(iOS16);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user