Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b70271968 | ||
|
|
968dc841ee | ||
|
|
ada2c00338 | ||
|
|
0e2ec9a52e | ||
|
|
274abee25d | ||
|
|
5b920d7353 | ||
|
|
34e34a4fef | ||
|
|
3e4264e3c7 | ||
|
|
e3d779cbf2 | ||
|
|
314efca54b | ||
|
|
feaeb234cc | ||
|
|
4502236d64 | ||
|
|
3154b51cf6 | ||
|
|
4f99b08a63 | ||
|
|
ae1dc1a701 | ||
|
|
f1eb708e08 | ||
|
|
9298cadbf8 | ||
|
|
efe8670c51 | ||
|
|
fb5781865c | ||
|
|
afb6bd9842 | ||
|
|
8ee749dad1 | ||
|
|
a38e37f6e9 | ||
|
|
ff5167af99 | ||
|
|
62b0168cff | ||
|
|
5d87e7ee1c | ||
|
|
6330c15d2e | ||
|
|
de4f2f7373 | ||
|
|
67aba1f2ad | ||
|
|
d89b146e3d | ||
|
|
0e2a4049c2 | ||
|
|
94b62ba4d3 | ||
|
|
a3165878aa | ||
|
|
702406f87f | ||
|
|
32bd36c423 | ||
|
|
82d7c39fdb | ||
|
|
4119cc4796 | ||
|
|
9763459838 | ||
|
|
ef0c1a8930 | ||
|
|
ca57262430 | ||
|
|
83c685c28f | ||
|
|
766ff8b142 | ||
|
|
c83dd8f5ea | ||
|
|
5d6d1c0f23 | ||
|
|
6e7aa03b55 | ||
|
|
2aca730640 | ||
|
|
e3cc3cb62a | ||
|
|
539143ca86 | ||
|
|
f1903fe989 | ||
|
|
9a590b903c | ||
|
|
abad6888e1 | ||
|
|
691ae41732 | ||
|
|
2dfaf37125 | ||
|
|
d0e315f864 | ||
|
|
98aba40ba2 | ||
|
|
c7cf984f1b | ||
|
|
689fe3af35 | ||
|
|
800b8be778 | ||
|
|
77161f4830 | ||
|
|
03b5b0ec6c | ||
|
|
0972479b62 | ||
|
|
4ea961589e | ||
|
|
aeb941ac0e | ||
|
|
ce26a834b3 | ||
|
|
ef2834ae3e | ||
|
|
d632b426eb | ||
|
|
aed7144c0c | ||
|
|
985d14ced1 | ||
|
|
bd8b505462 | ||
|
|
3b6cc1b9f5 | ||
|
|
82310ebb25 | ||
|
|
499eb532f9 | ||
|
|
7376bce524 | ||
|
|
24de17b928 | ||
|
|
415bc0f9fe | ||
|
|
212a6ca0fe | ||
|
|
af0c2ce092 | ||
|
|
bc5e1178ac | ||
|
|
0035e0d4c5 | ||
|
|
b13180ff39 | ||
|
|
7eb0a89bf0 | ||
|
|
6c011f1b02 | ||
|
|
5c26c66ff0 | ||
|
|
6b600236dd | ||
|
|
07a4acc1a3 | ||
|
|
6e0b1097c8 | ||
|
|
57b9241a29 | ||
|
|
2c884cae02 | ||
|
|
1b695d297e | ||
|
|
dd10e4eb0f | ||
|
|
b54fe11d95 | ||
|
|
7affb169fd | ||
|
|
b1a8c6a75a | ||
|
|
a52162f1f8 | ||
|
|
1c8928dcc6 | ||
|
|
a8fbb54670 | ||
|
|
6c1464e60d | ||
|
|
110b4696b3 | ||
|
|
7e57a09e0e | ||
|
|
e48b90804c | ||
|
|
eb3d5e7136 | ||
|
|
92654477d4 | ||
|
|
5c1932e667 | ||
|
|
ff254acefd | ||
|
|
02c765532f | ||
|
|
33eac27884 |
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
name: Bug
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: "[Bug]"
|
||||||
|
labels: bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️
|
||||||
|
|
||||||
|
### Device info
|
||||||
|
- iOS/iPadOS version:
|
||||||
|
- Device model:
|
||||||
|
- Sideload tool (Ex: AltStore, Sideloadly...)
|
||||||
|
- Version of uYouPlus:
|
||||||
|
|
||||||
|
### Describe the bug
|
||||||
|
|
||||||
|
|
||||||
|
### How to reproduce the bug
|
||||||
|
_(Please attach videos or screenshots if possible)_
|
||||||
|
|
||||||
|
|
||||||
|
### Crash log (if possible)
|
||||||
|
_(The crash log can be found in the Settings app - Privacy - Analytics & Improvements - Analytics Data - Youtube...)_
|
||||||
|
|
||||||
|
|
||||||
|
### Additional context:
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
name: Question/Help
|
||||||
|
about: Have questions? Need help?
|
||||||
|
title: "[Questions]"
|
||||||
|
labels: question
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Have you read the FAQ? Make sure you visit the FAQ page before asking any question!!!
|
||||||
|
https://github.com/qnblackcat/uYouPlus/wiki/FAQ
|
||||||
|
|
||||||
|
###
|
||||||
@@ -2,3 +2,6 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
packages
|
packages
|
||||||
obj
|
obj
|
||||||
|
tmp
|
||||||
|
Tweaks/uYou/*
|
||||||
|
!Tweaks/uYou/.gitkeep
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
[submodule "Tweaks/iSponsorBlock"]
|
||||||
|
path = Tweaks/iSponsorBlock
|
||||||
|
url = https://github.com/qnblackcat/iSponsorBlock.git
|
||||||
|
branch = master
|
||||||
|
[submodule "Tweaks/YTUHD"]
|
||||||
|
path = Tweaks/YTUHD
|
||||||
|
url = https://github.com/PoomSmart/YTUHD.git
|
||||||
|
branch = master
|
||||||
|
[submodule "Tweaks/YouPiP"]
|
||||||
|
path = Tweaks/YouPiP
|
||||||
|
url = https://github.com/PoomSmart/YouPiP.git
|
||||||
|
branch = main
|
||||||
|
[submodule "Tweaks/Return-YouTube-Dislikes"]
|
||||||
|
path = Tweaks/Return-YouTube-Dislikes
|
||||||
|
url = https://github.com/PoomSmart/Return-YouTube-Dislikes.git
|
||||||
|
branch = main
|
||||||
|
[submodule "Tweaks/YouTubeHeader"]
|
||||||
|
path = Tweaks/YouTubeHeader
|
||||||
|
url = https://github.com/PoomSmart/YouTubeHeader.git
|
||||||
|
branch = main
|
||||||
|
[submodule "Tweaks/Alderis"]
|
||||||
|
path = Tweaks/Alderis
|
||||||
|
url = https://github.com/qnblackcat/Alderis.git
|
||||||
|
branch = master
|
||||||
|
[submodule "Tweaks/PSHeader"]
|
||||||
|
path = Tweaks/PSHeader
|
||||||
|
url = https://github.com/PoomSmart/PSHeader.git
|
||||||
|
branch = master
|
||||||
|
[submodule "Tweaks/YTSpeed"]
|
||||||
|
path = Tweaks/YTSpeed
|
||||||
|
url = https://github.com/qnblackcat/YTSpeed.git
|
||||||
|
branch = main
|
||||||
|
[submodule "Extensions"]
|
||||||
|
path = Extensions
|
||||||
|
url = https://github.com/CokePokes/YoutubeExtensions.git
|
||||||
|
branch = main
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
|
||||||
|
|
||||||
|
@interface YTMainAppVideoPlayerOverlayView : UIView
|
||||||
|
- (UIViewController *)_viewControllerForAncestor;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTWatchMiniBarView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTAsyncCollectionView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTPlayerViewController (YTAFS)
|
||||||
|
- (void)autoFullscreen;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTTopAlignedView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTLightweightQTMButton : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface NIAttributedLabel : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTShareMainView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ASScrollView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface ASCollectionView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UIKeyboardLayoutStar : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UIKeyboardDockView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UICandidateViewController : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface UIPredictionViewController : UIViewController
|
||||||
|
@end
|
||||||
@@ -1,22 +1,30 @@
|
|||||||
uYouPlus_INJECT_DYLIBS = Tweaks/uYou.dylib Tweaks/libcolorpicker.dylib Tweaks/iSponsorBlock.dylib Tweaks/YTUHD.dylib Tweaks/YouPiP.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_USE_FLEX = 0
|
||||||
ARCHS = arm64
|
ARCHS = arm64
|
||||||
MODULES = jailed
|
MODULES = jailed
|
||||||
FINALPACKAGE = 1
|
FINALPACKAGE = 1
|
||||||
CODESIGN_IPA = 0
|
CODESIGN_IPA = 0
|
||||||
|
|
||||||
|
|
||||||
TWEAK_NAME = uYouPlus
|
TWEAK_NAME = uYouPlus
|
||||||
DISPLAY_NAME = YouTube
|
DISPLAY_NAME = YouTube
|
||||||
BUNDLE_ID = com.google.ios.youtube
|
BUNDLE_ID = com.google.ios.youtube
|
||||||
|
|
||||||
|
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
||||||
uYouPlus_FILES = uYouPlus.x
|
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
||||||
uYouPlus_FRAMEWORKS = Alderis
|
|
||||||
uYouPlus_IPA = /Volumes/Data_Macintosh/Sideloads/IPAs/YouTube_16.41.2.ipa
|
|
||||||
### Important: edit the path to your decrypted YouTube IPA!!!
|
### Important: edit the path to your decrypted YouTube IPA!!!
|
||||||
|
|
||||||
|
|
||||||
include $(THEOS)/makefiles/common.mk
|
include $(THEOS)/makefiles/common.mk
|
||||||
include $(THEOS_MAKE_PATH)/tweak.mk
|
include $(THEOS_MAKE_PATH)/tweak.mk
|
||||||
|
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTSpeed
|
||||||
|
include $(THEOS_MAKE_PATH)/aggregate.mk
|
||||||
|
|
||||||
|
before-package::
|
||||||
|
@tput setaf 4 && echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m"
|
||||||
|
@mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \;
|
||||||
|
@cp -R Tweaks/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/
|
||||||
|
@cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/
|
||||||
|
@cp -R Tweaks/uYou/Library/Application\ Support/uYouBundle.bundle Resources/
|
||||||
|
@tput setaf 5 && echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m"
|
||||||
|
@codesign --remove-signature .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib
|
||||||
|
@codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
|
||||||
|
|||||||
@@ -6,21 +6,28 @@
|
|||||||
* [Credits](#credits)
|
* [Credits](#credits)
|
||||||
* [Features](#features)
|
* [Features](#features)
|
||||||
* [Known issues](#known-issues)
|
* [Known issues](#known-issues)
|
||||||
* [Download (IPA)](#download-ipa)
|
* [Download](#download)
|
||||||
|
* [Installation](#installation)
|
||||||
|
* [Support the developers!](#support-the-developers)
|
||||||
|
* [FAQ](#faq)
|
||||||
* [Building (optional)](#building-optional)
|
* [Building (optional)](#building-optional)
|
||||||
* [FAQ](#FAQ)
|
|
||||||
|
|
||||||
# Credits
|
# Credits
|
||||||
|
|
||||||
- [MiRO92](https://twitter.com/miro92?s=21) for [uYou](https://github.com/MiRO92/uYou-for-YouTube).
|
- [MiRO92](https://twitter.com/miro92) for [uYou](https://github.com/MiRO92/uYou-for-YouTube).
|
||||||
|
|
||||||
- [Galactic-Dev](https://github.com/Galactic-Dev) and [Luewii](https://github.com/Luewii) for [iSponsorBlock](https://github.com/Galactic-Dev/iSponsorBlock).
|
- [Galactic-Dev](https://github.com/Galactic-Dev) and [Luewii](https://github.com/Luewii) for [iSponsorBlock](https://github.com/Galactic-Dev/iSponsorBlock) and [BigYTMiniPlayer](https://github.com/Galactic-Dev/BigYTMiniPlayer).
|
||||||
|
|
||||||
- [HASHBANG Productions](https://github.com/hbang) for [Alderis Color Picker](https://github.com/hbang/Alderis) - a dependency of iSponsorBlock.
|
- [HASHBANG Productions](https://github.com/hbang) for [Alderis Color Picker](https://github.com/hbang/Alderis) - a dependency of iSponsorBlock.
|
||||||
|
|
||||||
- [PoomSmart](https://twitter.com/poomsmart?s=21) - the developer of many tweaks used by uYouPlus, include: [YouRememberCaption](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/), [YTClassicVideoQuality](https://poomsmart.github.io/repo/depictions/ytclassicvideoquality.html), [YTNoCheckLocalNetwork](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html), [YTSystemAppearance](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html), [YTUHD](https://poomsmart.github.io/repo/depictions/ytuhd.html) and [YouPiP](https://poomsmart.github.io/repo/depictions/youpip.html).
|
- [PoomSmart](https://twitter.com/poomsmart) - the developer of many tweaks used by uYouPlus, include: [NoYTPremium](https://github.com/PoomSmart/NoYTPremium/), [YouRememberCaption](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/), [YTClassicVideoQuality](https://poomsmart.github.io/repo/depictions/ytclassicvideoquality.html), [YTNoCheckLocalNetwork](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html), [YTSystemAppearance](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html), [YTAutoFullScreen](https://github.com/PoomSmart/YTAutoFullScreen/), [YTReExplore](https://github.com/PoomSmart/YTReExplore/), [YTUHD](https://poomsmart.github.io/repo/depictions/ytuhd.html), [YouPiP](https://poomsmart.github.io/repo/depictions/youpip.html), and [Return YouTube Dislike](https://github.com/PoomSmart/Return-YouTube-Dislikes)
|
||||||
|
|
||||||
- [level3tjg](https://twitter.com/level3tjg?s=21) - for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards).
|
- [level3tjg](https://twitter.com/level3tjg) - for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards).
|
||||||
|
|
||||||
|
- [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/).
|
||||||
|
|
||||||
- [Al4ise](https://github.com/Al4ise) for [Azule](https://github.com/Al4ise/Azule), a tool used to inject jailbreak tweaks into jailed iOS apps.
|
- [Al4ise](https://github.com/Al4ise) for [Azule](https://github.com/Al4ise/Azule), a tool used to inject jailbreak tweaks into jailed iOS apps.
|
||||||
|
|
||||||
@@ -29,69 +36,114 @@
|
|||||||
|
|
||||||
# Features
|
# Features
|
||||||
|
|
||||||
1. **uYou:** uYou has a ton of features that I can't list them all. Visit his [here](https://miro92.com/repo/depictions/?p=com.miro.uyou) for more info!
|
1. **uYou:** uYou has a ton of features that I can't list them all. Visit [here](https://miro92.com/repo/depictions/?p=com.miro.uyou) for more info!
|
||||||
|
|
||||||
2. **iSponsorBlock:** Skips annoying sponsor ads inside videos. iSponsorBlock is based on [SponsorBlock engine](https://sponsor.ajay.app/). This is the iOS version of the SponsorBlock extension.
|
2. **iSponsorBlock:** Skips annoying sponsor ads inside videos. iSponsorBlock is based on [SponsorBlock engine](https://sponsor.ajay.app/). Basically, this is the iOS version of the SponsorBlock extension.
|
||||||
|
|
||||||
3. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
|
3. **YouPiP:** enable YouTube's **native PiP**. More options are in YouTube Settings - General.
|
||||||
|
|
||||||
4. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
|
4. **YTUHD:** unlock VP9 codec and in effect, enables video quality of 2K and 4K. You can enable/disable YTUHD in YouTube Settings - Video quality preferences.
|
||||||
|
|
||||||
5. **YTNoCheckLocalNetwork**: block the Local Network permission popup.
|
<details>
|
||||||
|
<summary>And many more...!</summary>
|
||||||
|
|
||||||
6. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
|
5. **YTAutoFullScreen:** autoplay videos at full screen.
|
||||||
|
|
||||||
7. **YTSystemAppearance**: sync the YouTube theme (dark/light) with the system theme.
|
6. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
|
||||||
|
|
||||||
8. **YTUHD:** unlock VP9 codec and in effect, enables video quality of 2K and 4K. You can enable/disable YTUHD in YouTube Settings => Video quality preferences.
|
7. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
|
||||||
|
|
||||||
9. **YouPiP:** enable YouTube's **native PiP**. More options are in YouTube Settings => General.
|
8. **YTSystemAppearance**: sync the YouTube theme (dark/light) with the system theme.
|
||||||
|
|
||||||
|
9. **YTNoCheckLocalNetwork**: block the Local Network permission popup.
|
||||||
|
|
||||||
|
10. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
|
||||||
|
|
||||||
|
11. **NoYTPremium**: remove YouTube Premium upshells.
|
||||||
|
|
||||||
|
12. **YTSpeed**: add 2.25, 2.5, 2.75, and 3x playback speed
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
# Known issues
|
# Known issues
|
||||||
|
|
||||||
1. **uYou**: all known-issues of uYou are listed [here](https://github.com/MiRO92/uYou-for-YouTube/issues). Make sure you take a look at it before reporting any bugs! ***Also, keep in mind that uYou+ is a modified version of uYou, DO NOT bother MiRO92 with problems unrelated to uYou!!!***
|
- **uYou**: all known-issues of uYou are listed [here](https://github.com/MiRO92/uYou-for-YouTube/issues). Make sure you take a look at it before reporting any bugs! ***Also, keep in mind that uYou+ is a modified version of uYou, DO NOT bother MiRO92 with problems unrelated to uYou!!!***
|
||||||
|
|
||||||
3. **iSponsorBlock**: the modified time doesn't show up in the seek bar.
|
- Issues that related to **uYouPlus** are [here](https://github.com/qnblackcat/uYouPlus/issues/)
|
||||||
|
|
||||||
3. **YTUHD**: Stuttering on 4K videos (sometimes).
|
|
||||||
|
|
||||||
4. **YouPiP** (iOS 14.0 - 14.4.2): due to Apple's fault, you may encounter the *speedup-bug* as described [here](https://drive.google.com/file/d/1NKdv1fr_KRWgD8nhkMDfG2eLBnbdeVtX/view?usp=sharing). The bug also happens when you try to play multi-sources of sound at the same time. Enable **Legacy PiP** is a workaround. Note that Legacy PiP removes UHD quality and breaks the default video quality feature of uYou. Use it at your own risk.
|
|
||||||
|
|
||||||
5. **Not a bug**:
|
|
||||||
|
|
||||||
> - The app won't be able to receive push notifications if you use a free developer account to sideload it.
|
|
||||||
>
|
|
||||||
> - appdb PRO users: follow [**this guide**](https://www.reddit.com/r/sideloaded/comments/pub39h/guide_how_to_fix_uyouuyou_download_not_working/) to fix uYou download not working.
|
|
||||||
>
|
|
||||||
> - It's impossible to fix deep-link (a.k.a Open in the YouTube app). However, you can use this [Shortcuts](https://shortcutsgallery.com/shortcuts/open-in-youtube/) as a workaround (tested on iOS 14). **Credit:** RandomAccessMemories#5025
|
|
||||||
|
|
||||||
|
|
||||||
# Download (IPA) & Install
|
# Download
|
||||||
|
|
||||||
- **uYouPlus** (or you can call it uYou+) requires iOS & iPadOS 13.0 and later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases).
|
- **uYouPlus** (or you can call it uYou+) requires iOS & iPadOS 13.0 or later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases).
|
||||||
|
|
||||||
- Version info: _(last update: Oct 28)_
|
- For AltStore user:
|
||||||
|
|
||||||
|
- My official AtlStore repo: https://qnblackcat.github.io/AltStore/
|
||||||
|
|
||||||
|
- [Open in AltStore (v17.18.4-2.1)](https://tinyurl.com/bdzxtdrx) - It will take a while to install because AltStore needs to download the IPA.
|
||||||
|
|
||||||
|
- Version info: _(last update: May 09)_
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary> ▶︎ Expand</summary>
|
||||||
|
|
||||||
| **Tweaks/App** | **Version** | **Open source** |
|
| **Tweaks/App** | **Version** | **Open source** |
|
||||||
| :------------: | :----------:| :-------------: |
|
| :------------: | :----------:| :-------------: |
|
||||||
| **YouTube** | 16.42.3 | ✖︎ |
|
| **YouTube** | 17.18.4 | ✖︎ |
|
||||||
| **uYou** | 2.1 | ✖︎ |
|
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | 2.1 | ✖︎ |
|
||||||
| **iSponsorBlock** | 1.0-10 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions/) | 1.2 | ✖︎ |
|
||||||
|
| **Return YouTube Dislike** | 1.6.4 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||||
|
| **iSponsorBlock** | 1.0-14 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||||
| **Alderis Color Picker** | 1.1.2| [✔︎](https://github.com/hbang/Alderis) |
|
| **Alderis Color Picker** | 1.1.2| [✔︎](https://github.com/hbang/Alderis) |
|
||||||
| **YouRememberCaption** | 1.0.0 | [✔︎](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/) |
|
| **NoYTPremium** | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium/) |
|
||||||
|
| **YouRememberCaption** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) |
|
||||||
| **YTClassicVideoQuality** | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) |
|
| **YTClassicVideoQuality** | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) |
|
||||||
| **YTNoCheckLocalNetwork** | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
| **YTNoCheckLocalNetwork** | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
||||||
| **YTNoHoverCards** | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
|
| **YTNoHoverCards** | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
|
||||||
| **YTSystemAppearance** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) |
|
| **YTSystemAppearance** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) |
|
||||||
| **YTUHD** | 1.2.5 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
| **YTUHD** | 1.2.7 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||||
| **YouPiP** | 1.5.14 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
| **YouPiP** | 1.7.0 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||||
|
| **YTSpeed** | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
|
||||||
|
| **YTAutoFullScreen** | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen/) |
|
||||||
|
| **YTReExplore** | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
|
||||||
|
| **BigYTMiniPlayer** | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
|
||||||
|
| **YTCastConfirm** | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
# Building (optional)
|
# Installation
|
||||||
|
See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation)
|
||||||
|
|
||||||
|
# Support the developers
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>MiRO92</summary>
|
||||||
|
|
||||||
|
- CashApp: https://cash.app/$MiRO92M
|
||||||
|
|
||||||
|
- Other payment methods are available in uYou's settings.
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Poomsmart</summary>
|
||||||
|
|
||||||
|
- Paypal: https://poomsmart.github.io/
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Galactic-dev</summary>
|
||||||
|
|
||||||
|
- Paypal: https://www.paypal.com/paypalme/DBrett684
|
||||||
|
|
||||||
|
- Venmo: https://venmo.com/u/DavidBrett
|
||||||
|
</details>
|
||||||
|
|
||||||
See [Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building).
|
|
||||||
|
|
||||||
# FAQ
|
# FAQ
|
||||||
|
|
||||||
See [FAQ - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/FAQ).
|
See [FAQ - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/FAQ).
|
||||||
|
|
||||||
|
# Building (optional)
|
||||||
|
|
||||||
|
See [Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building).
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 397 B |
|
Before Width: | Height: | Size: 506 B |
|
Before Width: | Height: | Size: 621 B |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1 +0,0 @@
|
|||||||
{"v":"5.7.1","fr":25,"ip":0,"op":26,"w":24,"h":24,"nm":"folder_download","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.69,"y":0},"t":0,"s":[16.41,15.3,0],"to":[0,0.617,0],"ti":[0,-0.617,0]},{"t":25,"s":[16.41,19,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.47,0.47,0.47],"y":[1,1,1]},"o":{"x":[0.53,0.53,0.53],"y":[0,0,0]},"t":12,"s":[6,6,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"ip":0,"op":324,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.614,-145.97,0],"ix":2},"a":{"a":0,"k":[102.114,-19.97,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.47,0.47,0.47],"y":[1,1,1]},"o":{"x":[0.53,0.53,0.53],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":12,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[250,268.441],[305.322,268.441],[305.322,194.678],[342.203,194.678],[342.203,268.441],[397.525,268.441],[323.762,342.203]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-221.648,-214.648],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":324,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"folder_download Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12,12,0],"ix":2},"a":{"a":0,"k":[12,12,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-1.1],[0,0],[0,0],[1.1,0],[0,0],[0,0],[0,1.1],[0,0],[0,0],[-1.1,0],[0,0]],"o":[[0,0],[0,0],[1.1,0],[0,0],[0,0],[0,1.1],[0,0],[0,0],[-1.1,0],[0,0],[0,0],[0,-1.1],[0,0],[0,0]],"v":[[-2,-8],[0,-6],[8,-6],[10,-4],[10,-4],[10,6],[8,8],[8,8],[-8,8],[-10,6],[-10,6],[-9.99,-6],[-8,-8],[-8,-8]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[12,12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9215686274509803,0.2823529411764706,0.3254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":324,"st":0,"bm":0}],"markers":[]}
|
|
||||||
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,140 @@
|
|||||||
|
#import "Tweaks/YouTubeHeader/YTSettingsViewController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
|
||||||
|
|
||||||
|
@interface YTSettingsSectionItemManager (YouPiP)
|
||||||
|
- (void)updateuYouPlusSectionWithEntry:(id)entry;
|
||||||
|
@end
|
||||||
|
|
||||||
|
static const NSInteger uYouPlusSection = 500;
|
||||||
|
|
||||||
|
extern BOOL hideHUD();
|
||||||
|
extern BOOL oled();
|
||||||
|
extern BOOL oledKB();
|
||||||
|
extern BOOL autoFullScreen();
|
||||||
|
extern BOOL noHoverCard();
|
||||||
|
extern BOOL ReExplore();
|
||||||
|
extern BOOL bigYTMiniPlayer();
|
||||||
|
extern BOOL hideCC();
|
||||||
|
extern BOOL hideAutoplaySwitch();
|
||||||
|
extern BOOL castConfirm();
|
||||||
|
|
||||||
|
// Settings
|
||||||
|
%hook YTAppSettingsPresentationData
|
||||||
|
+ (NSArray *)settingsCategoryOrder {
|
||||||
|
NSArray *order = %orig;
|
||||||
|
NSMutableArray *mutableOrder = [order mutableCopy];
|
||||||
|
NSUInteger insertIndex = [order indexOfObject:@(1)];
|
||||||
|
if (insertIndex != NSNotFound)
|
||||||
|
[mutableOrder insertObject:@(uYouPlusSection) atIndex:insertIndex + 1];
|
||||||
|
return mutableOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSettingsSectionItemManager
|
||||||
|
%new - (void)updateuYouPlusSectionWithEntry:(id)entry {
|
||||||
|
YTSettingsViewController *delegate = [self valueForKey:@"_dataDelegate"];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *castConfirm = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Confirm alert before casting (YTCastConfirm)" titleDescription:@"Show a confirm alert before casting to prevent accidentally hijacking TV."];
|
||||||
|
castConfirm.hasSwitch = YES;
|
||||||
|
castConfirm.switchVisible = YES;
|
||||||
|
castConfirm.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
|
||||||
|
castConfirm.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"castConfirm_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *hoverCardItem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide End screens hover cards (YTNoHoverCards)" titleDescription:@"Hide creator End screens (thumbnails) at the end of videos."];
|
||||||
|
hoverCardItem.hasSwitch = YES;
|
||||||
|
hoverCardItem.switchVisible = YES;
|
||||||
|
hoverCardItem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"];
|
||||||
|
hoverCardItem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hover_cards_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *bigYTMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"New miniplayer bar style (BigYTMiniPlayer)" titleDescription:@"App restart is required."];
|
||||||
|
bigYTMiniPlayer.hasSwitch = YES;
|
||||||
|
bigYTMiniPlayer.switchVisible = YES;
|
||||||
|
bigYTMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"bigYTMiniPlayer_enabled"];
|
||||||
|
bigYTMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"bigYTMiniPlayer_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *reExplore = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Replace Shorts tab with Explore tab (YTReExplore)" titleDescription:@"App restart is required."];
|
||||||
|
reExplore.hasSwitch = YES;
|
||||||
|
reExplore.switchVisible = YES;
|
||||||
|
reExplore.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"];
|
||||||
|
reExplore.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"reExplore_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *hideCC = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide Subtitles button" titleDescription:@"Hide the Subtitles button in video controls overlay. "];
|
||||||
|
hideCC.hasSwitch = YES;
|
||||||
|
hideCC.switchVisible = YES;
|
||||||
|
hideCC.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideCC_enabled"];
|
||||||
|
hideCC.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCC_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *hideAutoplaySwitch = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide Autoplay switch" titleDescription:@"Hide the Autoplay switch button in video controls overlay."];
|
||||||
|
hideAutoplaySwitch.hasSwitch = YES;
|
||||||
|
hideAutoplaySwitch.switchVisible = YES;
|
||||||
|
hideAutoplaySwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
|
||||||
|
hideAutoplaySwitch.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideAutoplaySwitch_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *autoFull = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Auto Full Screen (YTAutoFullScreen)" titleDescription:@"Autoplay videos at full screen."];
|
||||||
|
autoFull.hasSwitch = YES;
|
||||||
|
autoFull.switchVisible = YES;
|
||||||
|
autoFull.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"autofull_enabled"];
|
||||||
|
autoFull.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autofull_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *hideHUD = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide HUD Messages" titleDescription:@"Example: CC is turned on/off, Video loop is on,..."];
|
||||||
|
hideHUD.hasSwitch = YES;
|
||||||
|
hideHUD.switchVisible = YES;
|
||||||
|
hideHUD.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||||
|
hideHUD.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *oledDarkMode = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"OLED Dark mode (Experimental)" titleDescription:@"WARNING: OLED Dark mode only works when YouTube is in Dark theme. App restart is required (In case OLED dark mode doesn't work: just switch between Light/Dark theme, then restart the app)."];
|
||||||
|
oledDarkMode.hasSwitch = YES;
|
||||||
|
oledDarkMode.switchVisible = YES;
|
||||||
|
oledDarkMode.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
|
||||||
|
oledDarkMode.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oled_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
YTSettingsSectionItem *oledKeyBoard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"OLED Keyboard" titleDescription:@"Might not working properly in some cases . App restart is required."];
|
||||||
|
oledKeyBoard.hasSwitch = YES;
|
||||||
|
oledKeyBoard.switchVisible = YES;
|
||||||
|
oledKeyBoard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
|
||||||
|
oledKeyBoard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
NSMutableArray <YTSettingsSectionItem *> *sectionItems = [NSMutableArray arrayWithArray:@[autoFull, castConfirm, hideAutoplaySwitch, hideCC, hideHUD, hoverCardItem, bigYTMiniPlayer, oledKeyBoard, oledDarkMode,reExplore]];
|
||||||
|
[delegate setSectionItems:sectionItems forCategory:uYouPlusSection title:@"uYouPlus" titleDescription:nil headerHidden:NO];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry {
|
||||||
|
if (category == uYouPlusSection) {
|
||||||
|
[self updateuYouPlusSectionWithEntry:entry];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Thanks Al4ise for his support
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
# Check uYou
|
||||||
|
if [ ! -f Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb ]
|
||||||
|
then
|
||||||
|
echo -e "==> \033[1muYou v2.1 is not found. Downloading uYou (v2.1)...\033[0m"
|
||||||
|
(set -x ; curl https://miro92.com/repo/debs/com.miro.uyou_2.1_iphoneos-arm.deb --output Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb)
|
||||||
|
else
|
||||||
|
echo -e "==> \033[1mFounded uYou (v2.1)!\033[0m"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract uYou
|
||||||
|
echo -e "==> \033[1mExtracting uYou...\033[0m"
|
||||||
|
if (cd Tweaks/uYou && tar -xf com.miro.uyou_2.1_iphoneos-arm.deb && tar -xf data.tar.*)
|
||||||
|
then
|
||||||
|
echo -e "\033[1m> Extracted uYou!\033[0m"
|
||||||
|
else
|
||||||
|
echo "> \033[1mCouldn't extract uYou\033[0m"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Makefile
|
||||||
|
if [ -d ./tmp ]
|
||||||
|
then
|
||||||
|
rm -rf ./tmp
|
||||||
|
fi
|
||||||
|
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
|
||||||
|
if [[ $PATHTOYT == *.ipa ]]
|
||||||
|
then
|
||||||
|
unzip -q "$PATHTOYT" -d ./tmp
|
||||||
|
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||||
|
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
||||||
|
make package
|
||||||
|
open ./packages
|
||||||
|
|
||||||
|
elif [[ $PATHTOYT == *.app ]]
|
||||||
|
then
|
||||||
|
mkdir -p ./tmp/Payload/
|
||||||
|
cp -R "$PATHTOYT" ./tmp/Payload 2>/dev/null
|
||||||
|
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||||
|
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
||||||
|
make package
|
||||||
|
open ./packages
|
||||||
|
else
|
||||||
|
echo "This is not an ipa/app!"
|
||||||
|
fi
|
||||||
|
# Clean up
|
||||||
|
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
|
||||||
|
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
|
||||||
|
rm -rf tmp/ Resources .theos/_/Payload
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
#import <Foundation/Foundation.h>
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
|
|
||||||
// YouRememberCaption: https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/
|
|
||||||
|
|
||||||
%hook YTColdConfig
|
|
||||||
- (BOOL)respectDeviceCaptionSetting {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
|
|
||||||
// YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality
|
|
||||||
|
|
||||||
@interface YTVideoQualitySwitchOriginalController : NSObject
|
|
||||||
- (instancetype)initWithParentResponder:(id)responder;
|
|
||||||
@end
|
|
||||||
|
|
||||||
%hook YTVideoQualitySwitchControllerFactory
|
|
||||||
|
|
||||||
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
|
||||||
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
|
||||||
return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
|
|
||||||
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
|
||||||
|
|
||||||
%hook YTHotConfig
|
|
||||||
|
|
||||||
- (BOOL)isPromptForLocalNetworkPermissionsEnabled {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards
|
|
||||||
|
|
||||||
@interface YTCollectionViewCell : UICollectionViewCell
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface YTSettingsCell : YTCollectionViewCell
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface YTSettingsSectionItem : NSObject
|
|
||||||
@property BOOL hasSwitch;
|
|
||||||
@property BOOL switchVisible;
|
|
||||||
@property BOOL on;
|
|
||||||
@property BOOL (^switchBlock)(YTSettingsCell *, BOOL);
|
|
||||||
@property int settingItemId;
|
|
||||||
- (instancetype)initWithTitle:(NSString *)title titleDescription:(NSString *)titleDescription;
|
|
||||||
@end
|
|
||||||
|
|
||||||
%hook YTSettingsViewController
|
|
||||||
- (void)setSectionItems:(NSMutableArray <YTSettingsSectionItem *>*)sectionItems forCategory:(NSInteger)category title:(NSString *)title titleDescription:(NSString *)titleDescription headerHidden:(BOOL)headerHidden {
|
|
||||||
if (category == 1) {
|
|
||||||
NSInteger appropriateIdx = [sectionItems indexOfObjectPassingTest:^BOOL(YTSettingsSectionItem *item, NSUInteger idx, BOOL *stop) {
|
|
||||||
return item.settingItemId == 294;
|
|
||||||
}];
|
|
||||||
if (appropriateIdx != NSNotFound) {
|
|
||||||
YTSettingsSectionItem *hoverCardItem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Show End screens hover cards" titleDescription:@"Allows creator End screens (thumbnails) to appear at the end of videos"];
|
|
||||||
hoverCardItem.hasSwitch = YES;
|
|
||||||
hoverCardItem.switchVisible = YES;
|
|
||||||
hoverCardItem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"];
|
|
||||||
hoverCardItem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hover_cards_enabled"];
|
|
||||||
return YES;
|
|
||||||
};
|
|
||||||
[sectionItems insertObject:hoverCardItem atIndex:appropriateIdx + 1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
%orig;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
%hook YTCreatorEndscreenView
|
|
||||||
- (void)setHidden:(BOOL)hidden {
|
|
||||||
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"])
|
|
||||||
hidden = YES;
|
|
||||||
%orig;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
|
|
||||||
// YTSystemAppearance: https://poomsmart.github.io/repo/depictions/ytsystemappearance.html
|
|
||||||
|
|
||||||
%hook YTColdConfig
|
|
||||||
- (BOOL)shouldUseAppThemeSetting {
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
@@ -0,0 +1,615 @@
|
|||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
#import "Header.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTWatchController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIGuideResponse.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
||||||
|
|
||||||
|
BOOL hideHUD() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||||
|
}
|
||||||
|
BOOL oled() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
|
||||||
|
}
|
||||||
|
BOOL oledKB() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
|
||||||
|
}
|
||||||
|
BOOL autoFullScreen() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"autofull_enabled"];
|
||||||
|
}
|
||||||
|
BOOL noHoverCard() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"];
|
||||||
|
}
|
||||||
|
BOOL ReExplore() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"];
|
||||||
|
}
|
||||||
|
BOOL bigYTMiniPlayer() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"bigYTMiniPlayer_enabled"];
|
||||||
|
}
|
||||||
|
BOOL hideCC() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideCC_enabled"];
|
||||||
|
}
|
||||||
|
BOOL hideAutoplaySwitch() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
|
||||||
|
}
|
||||||
|
BOOL castConfirm() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
|
||||||
|
}
|
||||||
|
|
||||||
|
UIColor* oledColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
|
||||||
|
|
||||||
|
// Hide CC / Autoplay switch
|
||||||
|
%hook YTMainAppControlsOverlayView
|
||||||
|
- (void)layoutSubviews {
|
||||||
|
%orig;
|
||||||
|
if (hideAutoplaySwitch())
|
||||||
|
MSHookIvar<UIView *>(self, "_autonavSwitch").hidden = YES;
|
||||||
|
if (hideCC())
|
||||||
|
MSHookIvar<UIView *>(self, "_closedCaptionsOrSubtitlesButton").hidden = YES;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Hide HUD Messages
|
||||||
|
%hook YTHUDMessageView
|
||||||
|
- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 {
|
||||||
|
return hideHUD() ? nil : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// YTAutoFullScreen: https://github.com/PoomSmart/YTAutoFullScreen/
|
||||||
|
%hook YTPlayerViewController
|
||||||
|
- (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 {
|
||||||
|
%orig;
|
||||||
|
if (autoFullScreen())
|
||||||
|
[NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO];
|
||||||
|
}
|
||||||
|
%new
|
||||||
|
- (void)autoFullscreen {
|
||||||
|
YTWatchController *watchController = [self valueForKey:@"_UIDelegate"];
|
||||||
|
[watchController showFullScreen];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards
|
||||||
|
%hook YTCreatorEndscreenView
|
||||||
|
- (void)setHidden:(BOOL)hidden {
|
||||||
|
if (noHoverCard())
|
||||||
|
hidden = YES;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
//YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm
|
||||||
|
%hook MDXPlaybackRouteButtonController
|
||||||
|
- (void)didPressButton:(id)arg1 {
|
||||||
|
if (castConfirm()) {
|
||||||
|
UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:@"Casting"
|
||||||
|
message:@"Are you sure you want to start casting?"
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
|
||||||
|
%orig;
|
||||||
|
}];
|
||||||
|
|
||||||
|
UIAlertAction* noButton = [%c(UIAlertAction)
|
||||||
|
actionWithTitle:@"Cancel"
|
||||||
|
style:UIAlertActionStyleDefault
|
||||||
|
handler: ^(UIAlertAction * action) {
|
||||||
|
return;
|
||||||
|
}];
|
||||||
|
|
||||||
|
[alertController addAction:defaultAction];
|
||||||
|
[alertController addAction:noButton];
|
||||||
|
|
||||||
|
id rootViewController = [%c(UIApplication) sharedApplication].delegate.window.rootViewController;
|
||||||
|
if ([rootViewController isKindOfClass:[%c(UINavigationController) class]]) {
|
||||||
|
rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
|
||||||
|
}
|
||||||
|
if ([rootViewController isKindOfClass:[%c(UITabBarController) class]]) {
|
||||||
|
rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
|
||||||
|
}
|
||||||
|
if ([rootViewController presentedViewController] != nil) {
|
||||||
|
rootViewController = [rootViewController presentedViewController];
|
||||||
|
}
|
||||||
|
[rootViewController presentViewController:alertController animated:YES completion:nil];
|
||||||
|
}
|
||||||
|
return %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
|
||||||
|
%hook YTAdsInnerTubeContextDecorator
|
||||||
|
- (void)decorateContext:(id)arg1 { %orig(nil); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
// YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality
|
||||||
|
%hook YTVideoQualitySwitchControllerFactory
|
||||||
|
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
||||||
|
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
||||||
|
return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
||||||
|
%hook YTHotConfig
|
||||||
|
- (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
// YTSystemAppearance: https://poomsmart.github.io/repo/depictions/ytsystemappearance.html
|
||||||
|
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||||
|
%hook YTColdConfig
|
||||||
|
- (BOOL)shouldUseAppThemeSetting { return YES; }
|
||||||
|
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
||||||
|
- (BOOL)isEnhancedSearchBarEnabled { return YES; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
||||||
|
%hook YTCommerceEventGroupHandler
|
||||||
|
- (void)addEventHandlers {}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTInterstitialPromoEventGroupHandler
|
||||||
|
- (void)addEventHandlers {}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPromosheetEventGroupHandler
|
||||||
|
- (void)addEventHandlers {}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPromoThrottleController
|
||||||
|
- (BOOL)canShowThrottledPromo { return NO; }
|
||||||
|
- (BOOL)canShowThrottledPromoWithFrequencyCap:(id)arg1 { return NO; }
|
||||||
|
- (BOOL)canShowThrottledPromoWithFrequencyCaps:(id)arg1 { return NO; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTIShowFullscreenInterstitialCommand
|
||||||
|
- (BOOL)shouldThrottleInterstitial { return YES; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSurveyController
|
||||||
|
- (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// OLED
|
||||||
|
// Thanks u/DGh0st for his very well explained comment - https://www.reddit.com/r/jailbreakdevelopers/comments/9uape7/comment/e94sq80/
|
||||||
|
// Thanks sinfool for his flex patch which brings OLED Dark mode for YouTube - "Color Customizer (YouTube) OLED"
|
||||||
|
%group gOLED
|
||||||
|
%hook UIView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTLinkCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTCommentsHeaderView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTSearchView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTSearchBoxView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTEngagementPanelHeaderView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTEngagementPanelView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTPivotBarView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTHUDMessageView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTChipCloudCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YCHLiveChatTextCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YCHLiveChatView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YCHLiveChatViewerEngagementCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTSlideForActionsView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTPlaylistHeaderView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTAsyncCollectionView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTFeedHeaderView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTMessageCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTPlaylistPanelProminentThumbnailVideoCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(ASWAppSwitcherCollectionViewCell)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTEditSheetControllerHeader)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTDialogContainerScrollView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTLightweightQTMButton
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTShareMainView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
- (void)setCustomTitleColor:(id)arg1 { %orig([UIColor whiteColor]); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook NIAttributedLabel
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(UIScrollView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIControl // this sucks I know :/
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(YTShareMainView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTAsyncCollectionView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
if([self.nextResponder isKindOfClass:%c(YTRelatedVideosCollectionViewController)]) {
|
||||||
|
arg1 = [oledColor colorWithAlphaComponent:0.0];
|
||||||
|
} else if([self.nextResponder isKindOfClass:%c(YTFullscreenMetadataHighlightsCollectionViewController)]) {
|
||||||
|
arg1 = [oledColor colorWithAlphaComponent:0.0];
|
||||||
|
} else {
|
||||||
|
arg1 = oledColor;
|
||||||
|
}
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTWatchMiniBarView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPlaylistMiniBarView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook _LNPopupBarContentView // uYou player
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTTopAlignedView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
- (void)didMoveToWindow { // Dune - https://github.com/Skittyblock/Dune/blob/9b1df9790230115b7553cc9dbadf36889018d7f9/Tweak.xm#L70
|
||||||
|
MSHookIvar<UIView *>(self, "_contentView").backgroundColor = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook DownloadedVC
|
||||||
|
- (id)ytBackgroundColor { return oledColor; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook DownloadsPagerVC
|
||||||
|
- (id)ytBackgroundColor { return oledColor; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook DownloadingVC
|
||||||
|
- (id)ytBackgroundColor { return oledColor; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook PlayerVC
|
||||||
|
- (id)ytBackgroundColor { return oledColor; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASScrollView // Explore
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
self.backgroundColor = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASCollectionView // your videos
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
self.backgroundColor = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTDialogContainerScrollView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook MDXQueueView // Cast queue
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelProfileEditorView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelSubMenuView //
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelListSubMenuView // sub -
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCommentView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCreateCommentAccessoryView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCreateCommentTextView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
- (void)setTextColor:(id)arg1 { %orig([UIColor whiteColor]); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YCHLiveChatActionPanelView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTEmojiTextView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTShareTitleView // Share sheet
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTNavigationBar
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
- (void)setBarTintColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPrivacyTosFooterView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTEngagementPanelHeaderView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelMobileHeaderView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTInlineSignInView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTHeaderView //Stt bar
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTTabTitlesView // Tab bar - mychannel
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSettingsCell // Settings
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTHorizontalCardListView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTShortsGalleryHeaderView // upload videos heaer (gallery)
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook GOODialogView // 3 dots menu
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCollectionView //sharesheet
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASWAppSwitchingSheetHeaderView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook ASWAppSwitchingSheetFooterView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTCollectionSeparatorView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
- (void)didMoveToWindow {}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTShareBusyView // sharesheet load
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTPageView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTWatchView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSearchBarView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSearchBoxView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSearchSuggestionCollectionViewCell
|
||||||
|
- (void)updateColors {}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UISearchBarBackground
|
||||||
|
- (void)setBarTintColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTMealBarPromoView // Offline
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
////
|
||||||
|
/*
|
||||||
|
%hook UICollectionView
|
||||||
|
- (void)setBackgroundColor:(id)arg1 {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(UICollectionViewControllerWrapperView)])
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook _ASDisplayView // edit your videos
|
||||||
|
- (void)layoutSubviews {
|
||||||
|
if ([self.nextResponder isKindOfClass:%c(ELMView)])
|
||||||
|
self.backgroundColor = oledColor;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelProfileDescriptionEditorView // edit profile Description
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTChannelProfileNameEditorView // edit profile Name
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { %orig(oledColor); }
|
||||||
|
%end
|
||||||
|
|
||||||
|
hook GOOTextField
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { // edit profile Description
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook GOOMultilineTextField//
|
||||||
|
- (void)setBackgroundColor:(id)arg1 { // edit profile Name
|
||||||
|
arg1 = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
*/
|
||||||
|
%end
|
||||||
|
|
||||||
|
%group gOLEDKB // OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
|
||||||
|
%hook UIPredictionViewController
|
||||||
|
- (void)loadView {
|
||||||
|
%orig;
|
||||||
|
[self.view setBackgroundColor:oledColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UICandidateViewController
|
||||||
|
- (void)loadView {
|
||||||
|
%orig;
|
||||||
|
[self.view setBackgroundColor:oledColor];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIKeyboardDockView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
self.backgroundColor = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIKeyboardLayoutStar
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
self.backgroundColor = oledColor;
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook UIKBRenderConfig // Prediction text color
|
||||||
|
- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); }
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
// YTReExplore: https://github.com/PoomSmart/YTReExplore/
|
||||||
|
%group gReExplore
|
||||||
|
static void replaceTab(YTIGuideResponse *response) {
|
||||||
|
NSMutableArray <YTIGuideResponseSupportedRenderers *> *renderers = [response itemsArray];
|
||||||
|
for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) {
|
||||||
|
YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer];
|
||||||
|
NSMutableArray <YTIPivotBarSupportedRenderers *> *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:@"Explore" iconType:292];
|
||||||
|
[items insertObject:exploreTab atIndex:1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%hook YTGuideServiceCoordinator
|
||||||
|
- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion {
|
||||||
|
replaceTab(response);
|
||||||
|
%orig(response, completion);
|
||||||
|
}
|
||||||
|
- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion {
|
||||||
|
replaceTab(response);
|
||||||
|
%orig(response, error, completion);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
// BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer
|
||||||
|
%group Main
|
||||||
|
%hook YTWatchMiniBarView
|
||||||
|
- (void)setWatchMiniPlayerLayout:(int)arg1 {
|
||||||
|
%orig(1);
|
||||||
|
}
|
||||||
|
- (int)watchMiniPlayerLayout {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- (void)layoutSubviews {
|
||||||
|
%orig;
|
||||||
|
self.frame = CGRectMake(([UIScreen mainScreen].bounds.size.width - self.frame.size.width), self.frame.origin.y, self.frame.size.width, self.frame.size.height);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTMainAppVideoPlayerOverlayView
|
||||||
|
- (BOOL)isUserInteractionEnabled {
|
||||||
|
if([[self _viewControllerForAncestor].parentViewController.parentViewController isKindOfClass:%c(YTWatchMiniBarViewController)]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
return %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
%ctor {
|
||||||
|
%init;
|
||||||
|
if (oled() && ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1)) {
|
||||||
|
%init(gOLED);
|
||||||
|
}
|
||||||
|
if (oledKB()) {
|
||||||
|
%init(gOLEDKB);
|
||||||
|
}
|
||||||
|
if (ReExplore()) {
|
||||||
|
%init(gReExplore);
|
||||||
|
}
|
||||||
|
if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
|
||||||
|
%init(Main);
|
||||||
|
}
|
||||||
|
}
|
||||||