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:
|
- iOS/iPadOS version:
|
||||||
- Device model:
|
- Device model:
|
||||||
- Sideload tool (Ex: AltStore, Sideloadly...)
|
- Sideload tool (Ex: AltStore, Sideloadly...)
|
||||||
- Version of uYouPlus:
|
- Version of uYouPlus: _**latest** or **newest** is NOT a version number!!_
|
||||||
|
|
||||||
### Describe the bug
|
### Describe the bug
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
// uYouPlus
|
// uYouPlus
|
||||||
|
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
|
||||||
|
- (void)confirmAlertDidPressConfirm;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface YTMainAppControlsOverlayView : UIView
|
@interface YTMainAppControlsOverlayView : UIView
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -26,6 +30,13 @@
|
|||||||
@interface FRPSliderCell : UITableViewCell
|
@interface FRPSliderCell : UITableViewCell
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface boolSettingsVC : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface PlayerManager : NSObject
|
||||||
|
- (float)progress;
|
||||||
|
@end
|
||||||
|
|
||||||
// iOS16 fix
|
// iOS16 fix
|
||||||
@interface OBPrivacyLinkButton : UIButton
|
@interface OBPrivacyLinkButton : UIButton
|
||||||
- (instancetype)initWithCaption:(NSString *)caption
|
- (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_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_FILES = uYouPlus.xm Settings.xm
|
||||||
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
||||||
uYouPlus_FRAMEWORKS = UIKit
|
uYouPlus_FRAMEWORKS = UIKit Security
|
||||||
uYouPlus_CFLAGS = -fobjc-arc
|
uYouPlus_CFLAGS = -fobjc-arc
|
||||||
|
|
||||||
include $(THEOS)/makefiles/common.mk
|
include $(THEOS)/makefiles/common.mk
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
- [BandarHL](https://twitter.com/bandarhl) for a bunch of improvements.
|
- [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/)
|
- [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/).
|
- [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/
|
- 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>
|
<details>
|
||||||
<summary>Expand</summary>
|
<summary>Expand</summary>
|
||||||
|
|
||||||
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
| **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 | ✖︎ |
|
| [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 | ✖︎ |
|
| [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) |
|
| **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>
|
<details>
|
||||||
<summary>MiRO92</summary>
|
<summary>MiRO92</summary>
|
||||||
|
|
||||||
- CashApp: https://cash.app/$MiRO92M
|
- https://github.com/MiRO92/uYou-for-YouTube#support
|
||||||
|
|
||||||
- Other payment methods are available in uYou's settings.
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|||||||
+1
-1
Submodule Tweaks/YouPiP updated: a8c4224f7d...77bed4f3fb
+1
-1
Submodule Tweaks/YouTubeHeader updated: 08eeeb7a9c...fa1fb5a993
@@ -1,25 +1,25 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
"KILL_APP" = "YouTubeを閉じる";
|
"KILL_APP" = "YouTubeを閉じる";
|
||||||
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
|
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "前後の動画のボタンを非表示";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "前後の動画のボタンを非表示";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "コントロールのオーバーレイで前後の動画のボタンを非表示にします。";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "コントロールのオーバーレイで前後の動画のボタンを非表示にします。";
|
||||||
|
|
||||||
"YT_MINIPLAYER" = "すべての動画でミニプレーヤーを有効にする";
|
"YT_MINIPLAYER" = "すべての動画でミニプレーヤーを有効にする";
|
||||||
"YT_MINIPLAYER_DESC" = "例: 子供向けの動画";
|
"YT_MINIPLAYER_DESC" = "例: 子ども向けの動画";
|
||||||
|
|
||||||
"CAST_CONFIRM" = "キャストする前に確認画面を表示する (YTCastConfirm)";
|
"CAST_CONFIRM" = "キャストする前に確認画面を表示する (YTCastConfirm)";
|
||||||
"CAST_CONFIRM_DESC" = "誤ってテレビにキャストしないよう、前に確認画面を表示します。";
|
"CAST_CONFIRM_DESC" = "誤ってテレビにキャストしないよう、前に確認画面を表示します。";
|
||||||
|
|
||||||
"HIDE_HOVER_CARD" = "動画終わりのホバーカードを非表示 (YTNoHoverCards)";
|
"HIDE_HOVER_CARD" = "動画終わりのホバーカードを非表示 (YTNoHoverCards)";
|
||||||
"HIDE_HOVER_CARD_DESC" = "動画終わりのホバーカード(サムネ)を非表示にします。";
|
"HIDE_HOVER_CARD_DESC" = "動画の最後のホバーカード(サムネイル)を非表示にします。";
|
||||||
|
|
||||||
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
|
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
|
||||||
"NEW_MINIPLAYER_STYLE_DESC" = "アプリを再起動してください。";
|
"NEW_MINIPLAYER_STYLE_DESC" = "アプリの再起動が必要です。";
|
||||||
|
|
||||||
"YT_RE_EXPLORE" = "ショートのタブを「見つける」タブに置き換える (YTReExplore)";
|
"YT_RE_EXPLORE" = "ショートタブを探索タブに置き換える (YTReExplore)";
|
||||||
"YT_RE_EXPLORE_DESC" = "アプリを再起動してください。";
|
"YT_RE_EXPLORE_DESC" = "アプリの再起動が必要です。";
|
||||||
|
|
||||||
"HIDE_SUBTITLES_BUTTON" = "字幕ボタンを非表示";
|
"HIDE_SUBTITLES_BUTTON" = "字幕ボタンを非表示";
|
||||||
"HIDE_SUBTITLES_BUTTON_DESC" = "動画コントロールのオーバーレイから字幕ボタンを非表示にします。";
|
"HIDE_SUBTITLES_BUTTON_DESC" = "動画コントロールのオーバーレイから字幕ボタンを非表示にします。";
|
||||||
@@ -31,19 +31,19 @@
|
|||||||
"AUTO_FULLSCREEN_DESC" = "動画を自動でフルスクリーンにします。";
|
"AUTO_FULLSCREEN_DESC" = "動画を自動でフルスクリーンにします。";
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "HUDのメッセージを非表示";
|
"HIDE_HUD_MESSAGES" = "HUDのメッセージを非表示";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がon/offです、ループ再生は有効です 等";
|
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がオン/オフになりました、ループ再生はオンになっています 等";
|
||||||
|
|
||||||
"OLED_DARKMODE" = "有機ELダークモード (実験的機能)";
|
"OLED_DARKMODE" = "有機ELダークモード (実験的機能)";
|
||||||
"OLED_DARKMODE_DESC" = "一部では正しく動作しない可能性があります。 この設定を変更したあとはアプリを再起動してください。";
|
"OLED_DARKMODE_DESC" = "一部では正しく動作しない可能性があります。この設定を変更したあとはアプリの再起動が必要です。";
|
||||||
|
|
||||||
"OLED_KEYBOARD" = "有機ELキーボード (実験的機能)";
|
"OLED_KEYBOARD" = "有機ELキーボード (実験的機能)";
|
||||||
"OLED_KEYBOARD_DESC" = "一部では正しく動作しない可能性があります。 この設定を変更したあとはアプリを再起動してください。";
|
"OLED_KEYBOARD_DESC" = "一部では正しく動作しない可能性があります。この設定を変更したあとはアプリの再起動が必要です。";
|
||||||
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS" = "「プロモーションを含む」 のバナーを非表示";
|
"HIDE_PAID_PROMOTION_CARDS" = "プロモーションバナーを非表示";
|
||||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画にある「プロモーションを含む」 のバナーを非表示にします。";
|
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画にある「プロモーションを含みます」のバナーを非表示にします。";
|
||||||
|
|
||||||
// YTCastConfirm
|
// YTCastConfirm
|
||||||
"CASTING" = "キャスト";
|
"CASTING" = "キャスト";
|
||||||
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
|
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
|
||||||
"MSG_YES" = "はい";
|
"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/YTIPivotBarRenderer.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTColorPalette.h"
|
|
||||||
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.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
|
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
||||||
NSBundle *uYouPlusBundle() {
|
NSBundle *uYouPlusBundle() {
|
||||||
@@ -29,7 +30,24 @@ NSBundle *uYouPlusBundle() {
|
|||||||
}
|
}
|
||||||
NSBundle *tweakBundle = 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() {
|
BOOL hideHUD() {
|
||||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||||
}
|
}
|
||||||
@@ -80,6 +98,11 @@ BOOL hidePaidPromotionCard() {
|
|||||||
- (BOOL)canReorder { return YES; }
|
- (BOOL)canReorder { return YES; }
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// Skips content warning before playing *some videos - @PoomSmart
|
||||||
|
%hook YTPlayabilityResolutionUserActionUIController
|
||||||
|
- (void)showConfirmAlert { [self confirmAlertDidPressConfirm]; }
|
||||||
|
%end
|
||||||
|
|
||||||
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
|
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
|
||||||
%hook YTWatchMiniBarViewController
|
%hook YTWatchMiniBarViewController
|
||||||
- (void)updateMiniBarPlayerStateFromRenderer {
|
- (void)updateMiniBarPlayerStateFromRenderer {
|
||||||
@@ -175,16 +198,18 @@ BOOL hidePaidPromotionCard() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
|
// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263
|
||||||
%hook YTAdsInnerTubeContextDecorator
|
%hook YTDataUtils
|
||||||
- (void)decorateContext:(id)arg1 { %orig(nil); }
|
+ (NSMutableDictionary *)spamSignalsDictionary {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
||||||
%hook YTELMView
|
%hook UIResponder
|
||||||
%new
|
%new
|
||||||
- (id)entry {
|
- (id)entry {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
@@ -192,7 +217,17 @@ BOOL hidePaidPromotionCard() {
|
|||||||
%hook YTLocalPlaybackController
|
%hook YTLocalPlaybackController
|
||||||
%new
|
%new
|
||||||
- (id)activeVideoController {
|
- (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
|
%end
|
||||||
|
|
||||||
@@ -212,7 +247,6 @@ BOOL hidePaidPromotionCard() {
|
|||||||
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||||
%hook YTColdConfig
|
%hook YTColdConfig
|
||||||
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
||||||
- (BOOL)shouldUseAppThemeSetting { return YES; } // v16.xx
|
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
||||||
@@ -251,17 +285,68 @@ BOOL hidePaidPromotionCard() {
|
|||||||
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
|
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
|
||||||
%end
|
%end
|
||||||
|
|
||||||
%hook YTReelPlayerViewControllerSub // v16.42.3 - @level3tjg: https://reddit.com/r/jailbreak/comments/v29yvk/_/iasl1l0/
|
|
||||||
- (BOOL)shouldEnablePlayerBar { return YES; }
|
|
||||||
%end
|
|
||||||
|
|
||||||
// Workaround for issue #54
|
// Workaround for issue #54
|
||||||
%hook YTMainAppVideoPlayerOverlayViewController
|
%hook YTMainAppVideoPlayerOverlayViewController
|
||||||
- (void)updateRelatedVideos {
|
- (void)updateRelatedVideos {
|
||||||
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
|
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
|
||||||
else { return %orig; }
|
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
|
// Hide YouTube Shorts banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts
|
||||||
%hook YTAsyncCollectionView
|
%hook YTAsyncCollectionView
|
||||||
@@ -349,6 +434,14 @@ BOOL hidePaidPromotionCard() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
%hook APMAEU
|
||||||
|
+ (BOOL)isFAS { return YES; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook GULAppEnvironmentUtil
|
||||||
|
+ (BOOL)isFromAppStore { return YES; }
|
||||||
|
%end
|
||||||
|
|
||||||
%hook NSBundle
|
%hook NSBundle
|
||||||
- (NSString *)bundleIdentifier {
|
- (NSString *)bundleIdentifier {
|
||||||
NSArray *address = [NSThread callStackReturnAddresses];
|
NSArray *address = [NSThread callStackReturnAddresses];
|
||||||
@@ -369,6 +462,46 @@ BOOL hidePaidPromotionCard() {
|
|||||||
}
|
}
|
||||||
%end
|
%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
|
# pragma mark - OLED dark mode by BandarHL
|
||||||
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
||||||
%group gOLED
|
%group gOLED
|
||||||
@@ -411,39 +544,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
}
|
}
|
||||||
%end
|
%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
|
// Account view controller
|
||||||
%hook YTAccountPanelBodyViewController
|
%hook YTAccountPanelBodyViewController
|
||||||
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
@@ -469,7 +569,7 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
- (void)didMoveToWindow {
|
- (void)didMoveToWindow {
|
||||||
%orig;
|
%orig;
|
||||||
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
||||||
self.superview.backgroundColor = [UIColor clearColor];
|
self.superview.backgroundColor = [UIColor blackColor];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
%end
|
%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:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { 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.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.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.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.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, *)) {
|
if (@available(iOS 16, *)) {
|
||||||
%init(iOS16);
|
%init(iOS16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user