Compare commits

...

173 commits

Author SHA1 Message Date
arichornlover
9f726e09be
Update update-submodules-template.txt 2024-07-18 12:30:47 -05:00
arichornlover
19d32e6fd5
Update uYouPlus.h 2024-07-08 23:27:53 -05:00
arichornlover
5ad86b9af8
Fix uYouPlus.h (hopefully?)
I went on my other account and did some testing, hopefully I resolved the compiling problems.
2024-07-08 23:25:27 -05:00
arichornlover
83cc6b12d2
Use new implementation. (YouTube Native Share 0.2.0-Preview) 2024-07-08 19:49:59 -05:00
arichornlover
9c5992b075
Update uYouPlusPatches.h 2024-07-08 19:47:42 -05:00
arichornlover
d7c3bb86ec
Update uYouPlus.h 2024-07-08 04:23:42 -05:00
arichornlover
9596faad77
Fix ASCollectionView 2024-07-06 07:14:49 -05:00
arichornlover
86677c720c
Update uYouPlus.xm 2024-07-05 13:30:43 -05:00
arichornlover
5caf4a3206
Update uYouPlus.xm 2024-07-05 09:53:32 -05:00
arichornlover
b6897d50bc
Fix “YTShareRequestViewController” 2024-07-03 15:49:35 -05:00
arichornlover
5476d72761
Remove unnecessary property 2024-06-27 03:02:47 -05:00
arichornlover
959c71033c
Update uYouPlus.xm 2024-06-26 11:15:26 -05:00
arichornlover
dc0c71c74c
Update uYouPlusSettings.h 2024-06-26 10:56:36 -05:00
arichornlover
0fe0d748e1
Update uYouPlus.h 2024-06-26 10:56:06 -05:00
GitHub Actions
d06fab0703 updated submodules 2024-06-26 15:35:55 +00:00
arichornlover
ad6db4f972
Update uYouPlus.xm 2024-06-26 00:12:27 -05:00
arichornlover
dd258d092e
Update uYouPlus.xm 2024-06-26 00:01:18 -05:00
arichornlover
93c73d6c73
Update uYouPlus.xm 2024-06-25 23:51:04 -05:00
arichornlover
3f06713815
Update uYouPlus.xm 2024-06-25 23:39:25 -05:00
arichornlover
cc0651b9d5
Update uYouPlus.h 2024-06-25 23:20:05 -05:00
arichornlover
450df5d505
Update uYouPlusSettings.h 2024-06-25 23:19:13 -05:00
arichornlover
36bcad3950
Update uYouPlus.xm 2024-06-25 23:18:02 -05:00
arichornlover
f60bc5f283
Update uYouPlus.xm 2024-06-25 22:51:43 -05:00
arichornlover
654bce5531
Update buildapp.yml 2024-06-25 22:18:08 -05:00
arichornlover
07c2b22a29
Update uYouPlus.xm 2024-06-25 22:17:20 -05:00
arichornlover
36f762136d
Update Makefile 2024-06-25 22:16:49 -05:00
arichornlover
a09362d70e
Update uYouPlus.xm 2024-06-25 21:24:00 -05:00
arichornlover
ca7e5e40fc
Use <YTResponder> as a way to call settings 2024-06-25 21:11:05 -05:00
arichornlover
498f5bd3b7
Update uYouPlus.xm 2024-06-25 19:32:43 -05:00
arichornlover
f535c919ca
Exclude YTShareRequestViewController (uYouPlusPatches.xm) 2024-06-25 19:06:53 -05:00
arichornlover
70d73a31e4
Update uYouPlus.xm 2024-06-25 19:04:34 -05:00
arichornlover
5bf8355b39
Update uYouPlus.xm 2024-06-25 13:16:44 -05:00
arichornlover
19e2bb2d73
Mimic the actual settings button 2024-06-25 12:40:11 -05:00
arichornlover
513a486523
Add App UI Icons for testing 2024-06-25 12:24:59 -05:00
arichornlover
536364a88f
Update uYouPlus.xm 2024-06-24 23:00:52 -05:00
arichornlover
e900e85a73
Update uYouPlus.xm 2024-06-24 22:41:39 -05:00
arichornlover
7a4edbec64
Updated iPad version of ytns (experimental) 2024-06-24 05:50:10 -05:00
arichornlover
03591936d0
Update uYouPlus.xm 2024-06-22 20:55:21 -05:00
arichornlover
55a8a11c75
Update uYouPlus.xm 2024-06-22 20:12:30 -05:00
arichornlover
9e6d753199
Update uYouPlus.h 2024-06-22 19:58:15 -05:00
arichornlover
b6ec2f5f1a
Update uYouPlus.xm 2024-06-22 19:46:28 -05:00
arichornlover
d9eba087fc
Update uYouPlus.xm 2024-06-22 19:30:44 -05:00
arichornlover
c20b8cf0d0
Newer README.md file 2024-06-22 19:18:09 -05:00
arichornlover
bc7233df02
Update uYouPlus.xm 2024-06-22 19:07:39 -05:00
arichornlover
d7333d4595
Update uYouPlus.xm 2024-06-22 18:51:39 -05:00
arichornlover
641a1afbd7
Update uYouPlus.xm 2024-06-22 18:38:55 -05:00
arichornlover
286ae41019
Update uYouPlus.h 2024-06-22 18:20:10 -05:00
arichornlover
0a81e45d51
Update uYouPlus.xm 2024-06-22 18:19:22 -05:00
arichornlover
e27e5f206a
Update uYouPlus.xm 2024-06-22 18:04:47 -05:00
arichornlover
c8e76e0efe
Restore Settings Button
Note: this will likely cause duplicated settings button in the Settings Tab. It’s a recreation of the exact button.
2024-06-22 18:01:54 -05:00
arichornlover
f710ea4745
Rewrite ASCollectionView implementation
Old code from previous main-nightly branch.
2024-06-22 17:36:18 -05:00
GitHub Actions
3822138bc0 updated submodules 2024-06-22 22:34:53 +00:00
arichornlover
09829f0d70
Merge changes from main branch 2024-06-22 17:33:50 -05:00
arichornlover
7970ffb29d
Update AppIconOptionsController.m 2024-06-22 17:31:10 -05:00
arichornlover
9d4ef4fb32
Update AppIconOptionsController.h 2024-06-22 17:30:28 -05:00
arichornlover
d5a2f77cca
Delete Sources/AppIconTableViewCell.m 2024-06-22 17:29:52 -05:00
arichornlover
c06a938b9b
Delete Sources/AppIconTableViewCell.h 2024-06-22 17:29:44 -05:00
arichornlover
7e0a087a40
Delete Sources/AppIconManager.m 2024-06-22 17:29:37 -05:00
arichornlover
6595de8a60
Delete Sources/AppIconManager.h 2024-06-22 17:29:32 -05:00
GitHub Actions
e0c0949251 updated submodules 2024-06-21 21:03:53 +00:00
GitHub Actions
2fb8d70b48 updated submodules 2024-06-21 20:40:50 +00:00
GitHub Actions
6e6e6592e6 updated submodules 2024-06-18 07:48:12 +00:00
GitHub Actions
218fe12328 updated submodules 2024-06-18 03:29:22 +00:00
arichornlover
d63ee3a9f3
Update AppIconTableViewCell.m 2024-06-16 21:47:00 -05:00
arichornlover
18ee4e871f
Create AppIconTableViewCell.h 2024-06-16 21:43:59 -05:00
arichornlover
43a9491dce
Create AppIconTableViewCell.m 2024-06-16 21:38:47 -05:00
arichornlover
57b1ac17a9
Create AppIconManager.m 2024-06-16 21:30:55 -05:00
arichornlover
9501445c19
Create AppIconManager.h 2024-06-16 21:30:14 -05:00
arichornlover
8e417b7cde
Update AppIconOptionsController.m 2024-06-16 21:29:31 -05:00
arichornlover
581f15d32d
Update AppIconOptionsController.h 2024-06-16 21:25:59 -05:00
arichornlover
644db69a3f
Update uYouPlusPatches.xm 2024-06-16 03:23:04 -05:00
arichornlover
ced6e2c7bb
Update uYouPlusPatches.h 2024-06-16 03:20:01 -05:00
arichornlover
81dcce8555
Update uYouPlus.xm 2024-06-15 04:12:28 -05:00
arichornlover
69c9399f9f
Update uYouPlusSettings.xm 2024-06-14 20:43:22 -05:00
arichornlover
4d8e9f70b7
Update uYouPlusSettings.xm 2024-06-14 20:07:13 -05:00
arichornlover
7db477d9a9
Add more headers 2024-06-14 17:51:10 -05:00
arichornlover
6057279454
Update uYouPlus.xm 2024-06-14 15:18:50 -05:00
arichornlover
0a74391fba
Update uYouPlusSettings.xm 2024-06-14 01:52:14 -05:00
arichornlover
9de3ac645e
Update AppIconOptionsController.m 2024-06-13 19:15:40 -05:00
arichornlover
26b8ca0a95
Simplified AppIconOptionsController.m
I simplified everything.
2024-06-13 18:32:10 -05:00
arichornlover
addc8cc914
Update uYouPlus.xm 2024-06-12 23:24:40 -05:00
arichornlover
1fe2b9f684
Experimental Option 2024-06-12 23:12:32 -05:00
arichornlover
22a56d3450
Experimental Option 2024-06-12 22:50:48 -05:00
arichornlover
c66e5247e1
Update uYouPlus.h 2024-06-12 22:46:55 -05:00
arichornlover
95ae61fd0a
Update AppIconOptionsController.m 2024-06-12 18:04:11 -05:00
arichornlover
c258c339fe
Update AppIconOptionsController.m 2024-06-12 17:31:24 -05:00
arichornlover
53eb25f260
Delete Localizations/uYouPlus.bundle/AppIcons/Gold.png 2024-06-12 17:23:23 -05:00
arichornlover
6987753f93
Delete Localizations/uYouPlus.bundle/AppIcons/2017_Gold.png 2024-06-12 17:23:06 -05:00
arichornlover
06e014dff7
Delete Localizations/uYouPlus.bundle/AppIcons/2013.png 2024-06-12 17:22:51 -05:00
arichornlover
e44fbcf16c
Different AppIcon sizes 2024-06-12 17:21:12 -05:00
arichornlover
11d28bc4f5
Delete Localizations/uYouPlus.bundle/AppIcons/Shorts.png 2024-06-12 17:15:05 -05:00
arichornlover
e1bce2c0eb
Delete Localizations/uYouPlus.bundle/AppIcons/Shorts@3x.png 2024-06-12 17:14:47 -05:00
arichornlover
baea7e8cd7
Delete Localizations/uYouPlus.bundle/AppIcons/Shorts@2x.png 2024-06-12 17:14:40 -05:00
arichornlover
e437e8cecc
add folder for that specific icon 2024-06-12 17:14:18 -05:00
arichornlover
3830d87b77
Fix document picker not appearing 2024-06-12 17:12:27 -05:00
arichornlover
77153f0bfb
Update uYouPlus.xm 2024-06-10 17:18:44 -05:00
arichornlover
a857168423
Update uYouPlusSettings.xm 2024-06-10 16:48:52 -05:00
arichornlover
5d2ea47fd6
Update uYouPlusSettings.xm 2024-06-09 21:36:49 -05:00
arichornlover
6e95fc554f
Update uYouPlusSettings.xm 2024-06-09 21:05:17 -05:00
arichornlover
de59708a3c
Update uYouPlusSettings.xm 2024-06-09 20:52:57 -05:00
arichornlover
c9c7952ae3
Update uYouPlusSettings.xm 2024-06-09 20:01:38 -05:00
arichornlover
ddf5070386
Update uYouPlusSettings.xm 2024-06-09 19:50:56 -05:00
arichornlover
57e299f708
Update uYouPlusSettings.xm 2024-06-09 18:58:44 -05:00
arichornlover
1e1c4b4dae
Update uYouPlusSettings.xm 2024-06-09 18:58:08 -05:00
arichornlover
e389ecb6d6
Utilize Bundle 2024-06-09 18:49:20 -05:00
arichornlover
8d8a2b2135
Update uYouPlusSettings.xm 2024-06-09 15:55:17 -05:00
arichornlover
0b4b55c2cb
Update Info.plist 2024-06-09 04:15:42 -05:00
arichornlover
760895a50f
AppIcons (Experiment) 2024-06-09 04:05:17 -05:00
arichornlover
2c59ef4231
Add files via upload 2024-06-09 03:22:49 -05:00
arichornlover
3715faeac8
Update uYouPlusSettings.xm 2024-06-09 02:22:38 -05:00
arichornlover
338701eac0
Update uYouPlus.h 2024-06-09 02:10:07 -05:00
arichornlover
3b9fee4d93
Update AppIconOptionsController.m 2024-06-09 01:06:42 -05:00
arichornlover
5fc2d7c204
Update AppIconOptionsController.m 2024-06-09 00:54:19 -05:00
arichornlover
3c94b4ba98
Update AppIconOptionsController.m 2024-06-09 00:42:45 -05:00
arichornlover
81d1ddaea1
Update uYouPlus.h 2024-06-09 00:29:19 -05:00
arichornlover
20f447027d
Update uYouPlus.h 2024-06-09 00:21:41 -05:00
arichornlover
0d2d10334a
Update uYouPlus.h 2024-06-09 00:03:27 -05:00
arichornlover
7024fed57d
Update uYouPlus.xm 2024-06-08 22:25:46 -05:00
GitHub Actions
4ff78dc8f7 updated submodules 2024-06-09 02:20:11 +00:00
arichornlover
67d16973f3
Update uYouPlus.xm 2024-06-08 21:15:38 -05:00
arichornlover
c22e4c4714
Update uYouPlus.xm 2024-06-08 21:15:23 -05:00
GitHub Actions
747aa5414d updated submodules 2024-06-09 00:18:58 +00:00
arichornlover
e7280ef787
Update uYouPlus.h 2024-06-08 19:17:55 -05:00
GitHub Actions
ebc95d8de2 updated submodules 2024-06-08 23:50:04 +00:00
arichornlover
f0d0797eca
Update uYouPlus.xm 2024-06-08 18:49:15 -05:00
arichornlover
0d11f24c44
Update uYouPlusSettings.xm 2024-06-08 18:38:44 -05:00
arichornlover
ed6e421da9
Update uYouPlus.xm 2024-06-08 17:56:41 -05:00
GitHub Actions
d93cfe2713 updated submodules 2024-06-08 22:50:59 +00:00
arichornlover
8bb96cd365
Update .gitmodules 2024-06-08 17:49:50 -05:00
GitHub Actions
8129de961f updated submodules 2024-06-08 19:28:14 +00:00
arichornlover
f310fd4680
Update LowContrastMode.xm 2024-06-07 13:52:20 -05:00
GitHub Actions
6b0c1424ea updated submodules 2024-06-07 18:27:56 +00:00
GitHub Actions
9c61a8868a updated submodules 2024-06-07 18:26:56 +00:00
GitHub Actions
a7dbb42a44 updated submodules 2024-06-07 18:14:47 +00:00
GitHub Actions
9df9b15975 updated submodules 2024-06-07 17:58:54 +00:00
GitHub Actions
425935de27 updated submodules 2024-06-05 21:01:27 +00:00
GitHub Actions
40a15fdf3f updated submodules 2024-06-05 20:47:39 +00:00
GitHub Actions
c568291586 updated submodules 2024-06-05 20:30:34 +00:00
arichornlover
9b82c82851
Update .gitmodules 2024-06-05 15:29:31 -05:00
arichornlover
9b3f01bcd0
Update control 2024-06-05 15:28:23 -05:00
arichornlover
752ca2f693
Update uYouPlusPatches.xm 2024-06-05 15:27:11 -05:00
arichornlover
7f240104cd
Update uYouPlusSettings.xm 2024-06-05 15:25:18 -05:00
arichornlover
237ad26bdb
Update uYouPlusSettings.xm 2024-06-05 14:05:02 -05:00
arichornlover
39b6f34782
Update uYouPlusSettings.xm 2024-06-05 13:55:28 -05:00
arichornlover
6243f61d46
Update uYouPlusSettings.xm 2024-06-05 13:44:25 -05:00
arichornlover
a85478572b
Update Copy Settings keys 2024-06-05 13:29:23 -05:00
arichornlover
98f021ffb3
iSponsorBlock Support Copy Settings 2024-06-05 13:28:19 -05:00
GitHub Actions
f1269e7ef3 updated submodules 2024-06-05 08:55:55 +00:00
arichornlover
09438f7fc6
Update uYouPlusPatches.h 2024-06-05 03:55:02 -05:00
GitHub Actions
2f01bb36c7 updated submodules 2024-06-05 08:45:57 +00:00
GitHub Actions
f8ea01e32c updated submodules 2024-06-05 07:37:54 +00:00
arichornlover
0851ba0b04
Update uYouPlusPatches.h 2024-06-05 02:12:53 -05:00
GitHub Actions
c99d7620af updated submodules 2024-06-05 06:58:20 +00:00
arichornlover
cfc2ac4497
Update uYouPlus.h 2024-06-05 01:57:31 -05:00
GitHub Actions
f3a927869a updated submodules 2024-06-05 06:40:08 +00:00
arichornlover
696f144a43
Update uYouPlus.h 2024-06-05 01:37:05 -05:00
GitHub Actions
4d9927ea7e updated submodules 2024-06-05 05:16:03 +00:00
arichornlover
35e14f7dbe
Update BigYTMiniPlayer.h 2024-06-05 00:14:31 -05:00
GitHub Actions
a0c1890012 updated submodules 2024-06-05 05:05:48 +00:00
arichornlover
4ef8b6e000
Update uYouPlusPatches.xm
Also includes a new option.
2024-06-04 23:44:30 -05:00
arichornlover
a59b0264d0
Add headers 2024-06-04 23:30:44 -05:00
arichornlover
14dcb8831f
Update update-submodules.yml 2024-06-04 23:21:21 -05:00
GitHub Actions
b261bef5ef added uYouEnhanced submodules 2024-06-05 04:20:33 +00:00
arichornlover
a51084e4be
Update update-submodules.yml 2024-06-04 23:19:55 -05:00
arichornlover
cdcbb475fc
Update uYouPlusPatches.h (Nightly Patch) 2024-06-04 20:57:09 -05:00
arichornlover
9187e9132a
Update uYouPlus.xm 2024-06-04 20:54:41 -05:00
GitHub Actions
46007fd0f8 updated submodules 2024-06-04 04:59:53 +00:00
GitHub Actions
1e421b9447 updated submodules 2024-06-03 23:08:54 +00:00
GitHub Actions
860e554898 updated submodules 2024-06-03 23:06:04 +00:00
arichornlover
ef26c08644
Fix Experimental Button (Localization Fix) 2024-06-03 16:00:33 -05:00
arichornlover
66bea70288
YouTimeStamp v1.1.0 (WIP)
YouTimeStamp will include customization features soon for v1.1.0 release.
2024-06-03 12:32:07 -05:00
arichornlover
a28dd2dcec
Update uYouPlusSettings.xm (Experimental)
Settings.xm but includes the experimental Copy Settings and Paste Settings buttons.
2024-06-03 12:30:12 -05:00
arichornlover
813603b214
Update AppIconOptionsController.m (Experimental)
Experimental
2024-06-03 12:27:34 -05:00
49 changed files with 595 additions and 303 deletions

View file

@ -8,7 +8,7 @@ on:
inputs:
sdk_version:
description: "iOS SDK Version"
default: "16.4"
default: "16.5"
required: true
type: string
uyou_version:
@ -38,12 +38,12 @@ on:
type: string
upload_artifact:
description: "Upload IPA as artifact"
default: true
default: false
required: false
type: boolean
create_release:
description: "Create a draft release"
default: false
default: true
required: false
type: boolean
@ -137,7 +137,7 @@ jobs:
cd ${{ github.workspace }}/main
sed -i '' "27s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile # Modify the bundle ID
sed -i '' "26s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile # Modify the app name
sed -i '' "1s#.*#export TARGET = iphone:clang:${{ inputs.sdk_version }}:14.0#g" Makefile # Modify the SDK version
sed -i '' "1s#.*#export TARGET = iphone:clang:${{ inputs.sdk_version }}:15.0#g" Makefile # Modify the SDK version
make package THEOS_PACKAGE_SCHEME=rootless IPA=Payload/YouTube.app FINALPACKAGE=1
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"

View file

@ -9,7 +9,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4.1.4
uses: actions/checkout@v4.1.6
- name: Set up Git
run: |

4
.gitmodules vendored
View file

@ -78,3 +78,7 @@
[submodule "Tweaks/YouTimeStamp"]
path = Tweaks/YouTimeStamp
url = https://github.com/arichornlover/YouTimeStamp.git
branch = wip
[submodule "Tweaks/protobuf"]
path = Tweaks/protobuf
url = https://github.com/protocolbuffers/protobuf.git

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View file

@ -26,7 +26,7 @@
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>AppIcon</string>
<string>logo_youtube_color</string>
</array>
</dict>
<key>CFBundleAlternateIcons</key>
@ -59,6 +59,13 @@
<string>Outline</string>
</array>
</dict>
<key>Shorts</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>Shorts</string>
</array>
</dict>
<key>2012</key>
<dict>
<key>CFBundleIconFiles</key>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,4 +1,4 @@
export TARGET = iphone:clang:16.4:14.0
export TARGET = iphone:clang:16.5:14.0
export ARCHS = arm64
export libcolorpicker_ARCHS = arm64

View file

@ -40,8 +40,6 @@
[![Wiki](https://img.shields.io/badge/Wiki-blue?style=flat)](#wiki)<br>
# Credits
- Special thanks to all the developers who have worked on uYouPlus/uYouEnhanced!
<table id='credit'>
<tr>
@ -204,13 +202,13 @@
<a href='https://github.com/balackburn'>balackburn</a>
</td>
<theos>
<dodieboy>
<td align="center">
<a href='https://github.com/theos/theos'>
<img src='https://user-images.githubusercontent.com/78001398/271813393-56a63730-a56d-41ba-b473-4d37761526c9.png' width='110px'>
<a href='https://github.com/dodieboy'>
<img src='https://github.com/arichornlover/YouTubeRebornPlus/assets/78001398/0d43912b-e561-4865-8312-5e241d34bf72' width='110px;'>
</a>
<br>
<a href='https://theos.dev'>theos</a>
<a href='https://github.com/dodieboy'>dodieboy</a>
</td>
</tr>
@ -224,6 +222,15 @@
<br>
<a href='https://github.com/bhackel'>bhackel</a>
</td>
<theos>
<td align="center">
<a href='https://github.com/theos/theos'>
<img src='https://user-images.githubusercontent.com/78001398/271813393-56a63730-a56d-41ba-b473-4d37761526c9.png' width='110px'>
</a>
<br>
<a href='https://theos.dev'>theos</a>
</td>
</tr>
</table>
@ -337,14 +344,29 @@ or [qnblackcat/Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Buil
See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation).
# Support the developers
- [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support
- [**PoomSmart**](https://github.com/PoomSmart): https://poomsmart.github.io
- [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg
- [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL
- [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne
- [**Galactic-dev**](https://twitter.com/dev_galactic):
- Paypal: https://www.paypal.com/paypalme/DBrett684
- Venmo: https://venmo.com/u/DavidBrett
<a href="https://buymeacoffee.com/dayanch96"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Dayanch96(buymeacoffee).png" width="200"></a>
&nbsp;
<a href="https://github.com/sponsors/dayanch96"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Dayanch96(Github).png" width="200"></a>
<a href="https://ko-fi.com/dayanch966"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Dayanch96(ko-fi).png" width="200"></a>
&nbsp;
<a href="https://www.paypal.com/paypalme/poomsmart"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Poomsmart.png" width="200"></a>
<a href="https://www.paypal.com/paypalme/DBrett684"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Galactic-dev(Paypal).png" width="200"></a>
&nbsp;
<a href="https://venmo.com/u/DavidBrett"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Galactic-dev(Venmo).png?raw=true" width="200"></a>
<a href="https://github.com/MiRO92/uYou-for-YouTube#support"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/Donations/MIRO92.png" width="200"></a>
&nbsp;
<a href="https://www.paypal.com/paypalme/BandarHL"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/BandarHL.png" width="200"></a>
&nbsp;
<a href="https://ko-fi.com/level3tjg"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/level3tjg.png?raw=true" width="200"></a>
&nbsp;
<a href="https://www.patreon.com/julioverne"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/julioverne.png?raw=true" width="200"></a>
# Wiki
@ -371,9 +393,9 @@ https://github.com/Balackburn/YTLitePlus/releases
- YTLitePlus does not cause your device to overheat, unlike uYouEnhanced.
**Cons**
- YTLitePlus provides faster video & audio downloading than uYouPlus/uYouEnhanced.
- No custom video downloading feature in YTLitePlus.
**Cons**
- Video quality on WiFi option is not available in YTLitePlus.

View file

@ -1,8 +1,4 @@
#import "uYouPlus.h"
@interface YTMainAppVideoPlayerOverlayView : UIView
- (UIViewController *)_viewControllerForAncestor;
@end
@interface YTWatchMiniBarView : UIView
@end

View file

@ -13,7 +13,7 @@ static BOOL customContrastMode() {
UIColor *lcmHexColor;
%group gLowContrastMode // Low Contrast Mode v1.5.2 (Compatible with only YouTube v17.33.2-v17.38.10)
%group gLowContrastMode // Low Contrast Mode v1.6.0 BETA (Compatible with only YouTube v17.33.2-v17.38.10)
%hook UIColor
+ (UIColor *)whiteColor { // Dark Theme Color
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
@ -246,12 +246,21 @@ UIColor *lcmHexColor;
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state);
}
- (void)setCustomTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *customAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[customAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(customAttributes, state);
}
%end
%hook UIButton
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
color = [UIColor whiteColor];
%orig(color, state);
}
- (void)setCustomTitleColor:(UIColor *)color forState:(UIControlState)state {
color = [UIColor whiteColor];
%orig(color, state);
}
%end
%hook UIBarButtonItem
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
@ -259,6 +268,11 @@ UIColor *lcmHexColor;
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state);
}
- (void)setCustomTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *customAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[customAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(customAttributes, state);
}
%end
%hook NSAttributedString
- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSAttributedStringKey, id> *)attrs {

View file

@ -1,50 +1,49 @@
#import <UIKit/UIKit.h>
#import <LocalAuthentication/LocalAuthentication.h>
#import <CaptainHook/CaptainHook.h>
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <CaptainHook/CaptainHook.h>
#import <dlfcn.h>
#import <sys/utsname.h>
#import <substrate.h>
#import <LocalAuthentication/LocalAuthentication.h>
#import <objc/runtime.h>
#import <rootless.h>
#import "uYouPlusThemes.h" // Hide "Buy Super Thanks" banner (_ASDisplayView)
#import <YouTubeHeader/YTAppDelegate.h> // Activate FLEX
#import <YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h>
#import <YouTubeHeader/YTIPlayerBarDecorationModel.h>
#import <YouTubeHeader/YTPlayerBarRectangleDecorationView.h>
#import <YouTubeHeader/YTVideoQualitySwitchOriginalController.h>
#import <YouTubeHeader/YTIGuideResponse.h>
#import <YouTubeHeader/YTIGuideResponseSupportedRenderers.h>
#import <YouTubeHeader/YTIPivotBarSupportedRenderers.h>
#import <YouTubeHeader/YTIPivotBarItemRenderer.h>
#import <substrate.h>
#import <sys/utsname.h>
#import <YouTubeHeader/ASCollectionElement.h>
#import <YouTubeHeader/ASCollectionView.h>
#import <YouTubeHeader/ELMCellNode.h>
#import <YouTubeHeader/ELMNodeController.h>
#import <YouTubeHeader/GPBMessage.h>
#import <YouTubeHeader/YTAppDelegate.h>
#import <YouTubeHeader/YTCollectionViewCell.h>
#import <YouTubeHeader/YTIBrowseRequest.h>
#import <YouTubeHeader/YTIButtonRenderer.h>
#import <YouTubeHeader/YTIElementRenderer.h>
#import <YouTubeHeader/YTISectionListRenderer.h>
#import <YouTubeHeader/YTWatchNextResultsViewController.h>
#import <YouTubeHeader/YTPlayerOverlay.h>
#import <YouTubeHeader/YTPlayerOverlayProvider.h>
#import <YouTubeHeader/YTReelWatchPlaybackOverlayView.h>
#import <YouTubeHeader/YTInlinePlayerBarContainerView.h>
#import <YouTubeHeader/YTInnerTubeCollectionViewController.h>
#import <YouTubeHeader/YTPivotBarItemView.h>
#import <YouTubeHeader/YTCollectionViewCell.h>
#import <YouTubeHeader/YTIFormattedString.h>
#import <YouTubeHeader/GPBMessage.h>
#import <YouTubeHeader/YTIStringRun.h>
#import <YouTubeHeader/YTWatchViewController.h>
#import <YouTubeHeader/YTIGuideResponse.h>
#import <YouTubeHeader/YTIGuideResponseSupportedRenderers.h>
#import <YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h>
#import <YouTubeHeader/YTInnerTubeCollectionViewController.h>
#import <YouTubeHeader/YTInlinePlayerBarContainerView.h>
#import <YouTubeHeader/YTIPivotBarItemRenderer.h>
#import <YouTubeHeader/YTIPivotBarRenderer.h>
// Hide buttons under the video player by @PoomSmart
#import <YouTubeHeader/ASCollectionElement.h>
#import <YouTubeHeader/ASCollectionView.h>
#import <YouTubeHeader/ELMNodeController.h>
// YouTube-X
#import <YouTubeHeader/YTIPivotBarSupportedRenderers.h>
#import <YouTubeHeader/YTIPlayerBarDecorationModel.h>
#import <YouTubeHeader/YTISectionListRenderer.h>
#import <YouTubeHeader/YTIStringRun.h>
#import <YouTubeHeader/YTMainAppVideoPlayerOverlayViewController.h>
#import <YouTubeHeader/YTMainAppVideoPlayerOverlayView.h>
#import <YouTubeHeader/YTPlayerBarController.h>
#import <YouTubeHeader/YTPlayerBarRectangleDecorationView.h>
#import <YouTubeHeader/YTPlayerOverlay.h>
#import <YouTubeHeader/YTPlayerOverlayManager.h>
#import <YouTubeHeader/YTReelModel.h>
#import <YouTubeHeader/YTReelWatchPlaybackOverlayView.h>
#import <YouTubeHeader/YTResponder.h>
#import <YouTubeHeader/YTVideoQualitySwitchOriginalController.h>
#import <YouTubeHeader/YTVideoWithContextNode.h>
#import <YouTubeHeader/ELMCellNode.h>
#import <YouTubeHeader/YTWatchNextResultsViewController.h>
#import <YouTubeHeader/YTWatchPullToFullController.h>
#import <YouTubeHeader/YTWatchViewController.h>
#import "uYouPlusThemes.h" // uYouPlus Themes
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define IS_ENABLED(k) [[NSUserDefaults standardUserDefaults] boolForKey:k]
@ -55,12 +54,8 @@
#define LOWCONTRASTMODE_CUTOFF_VERSION @"17.38.10" // LowContrastMode (v17.33.2-17.38.10)
// Always show remaining time in video player - @bhackel
@interface YTPlayerBarController : NSObject
@property(nonatomic, strong) YTInlinePlayerBarContainerView *playerBar;
@end
@interface YTInlinePlayerBarContainerView (uYouEnhanced)
@property(nonatomic, assign) BOOL shouldDisplayTimeRemaining;
@end
// Header has been moved to https://github.com/PoomSmart/YouTubeHeader/blob/main/YTPlayerBarController.h
// Header has been moved to https://github.com/PoomSmart/YouTubeHeader/blob/main/YTInlinePlayerBarContainerView.h
// IAmYouTube
@interface SSOConfiguration : NSObject
@ -82,14 +77,10 @@
// Hide Home Tab - @bhackel
@interface YTPivotBarItemViewAccessibilityControl : UIControl
@end
@interface YTPivotBarItemView (uYouEnhanced)
@property (nonatomic, strong) YTPivotBarItemViewAccessibilityControl *hitTarget;
@end
// YTPivotBarItemView Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTPivotBarItemView.h
// YTTapToSeek - https://github.com/bhackel/YTTapToSeek
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
- (CGFloat)totalTime;
@end
// YTMainAppVideoPlayerOverlayViewController Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTMainAppVideoPlayerOverlayViewController.h
// Enable Premium logo - @bhackel
@interface YTITopbarLogoRenderer : NSObject
@ -121,12 +112,7 @@
- (BOOL)hasIcon;
- (BOOL)hasThumbnail;
@end
@interface YTIItemSectionSupportedRenderers (uYouEnhanced)
@property(readonly, nonatomic) YTICompactLinkRenderer *compactLinkRenderer;
@property(readonly, nonatomic) YTICompactListItemRenderer *compactListItemRenderer;
- (BOOL)hasCompactLinkRenderer;
- (BOOL)hasCompactListItemRenderer;
@end
// YTIItemSectionSupportedRenderers Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTIItemSectionSupportedRenderers.h
@interface YTAppCollectionViewController : YTInnerTubeCollectionViewController
- (void)uYouEnhancedFakePremiumModel:(YTISectionListRenderer *)model;
@end
@ -135,12 +121,13 @@
@end
// Disable Pull to Full for landscape videos - @bhackel
@interface YTWatchPullToFullController : NSObject
@property(nonatomic, strong) YTWatchViewController *playerViewSource;
@end
// YTWatchPullToFullController Header has been moved to https://github.com/PoomSmart/YouTubeHeader/blob/main/YTWatchPullToFullController.h
// Fullscreen to the Right (uYouEnhanced Version) - @arichornlover
@interface YTWatchViewController (uYouEnhanced)
@property(nonatomic, strong) YTWatchPullToFullController *pullToFullController;
- (NSUInteger)allowedFullScreenOrientations;
- (UIInterfaceOrientationMask) supportedInterfaceOrientations;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;
- (void)forceRightFullscreenOrientation;
@end
// uYouPlus
@ -161,10 +148,6 @@
- (void)confirmAlertDidPressConfirm;
@end
@interface YTMainAppControlsOverlayView : UIView
@property(readonly, nonatomic) YTQTMButton *watchCollapseButton;
@end
@interface YTTransportControlsButtonView : UIView
@end
@ -194,17 +177,16 @@
// Buttons
@interface YTRightNavigationButtons : UIView
- (id)_viewControllerForAncestor;
@property(readonly, nonatomic) YTQTMButton *searchButton;
@property(readonly, nonatomic) YTQTMButton *notificationButton;
@property(strong, nonatomic) YTQTMButton *sponsorBlockButton;
@property(strong, nonatomic) YTQTMButton *uYouPlusButton;
@property (readonly, nonatomic) NSArray *dynamicButtons;
@property (readonly, nonatomic) NSArray *visibleButtons;
@property (readonly, nonatomic) NSArray *buttons;
@property (readonly, nonatomic) YTQTMButton *searchButton;
@property (readonly, nonatomic) YTQTMButton *notificationButton;
@property (strong, nonatomic) YTQTMButton *sponsorBlockButton;
@property (strong, nonatomic) YTQTMButton *settingsButton;
- (void)setDynamicButtons:(NSArray *)buttons;
- (void)setLeadingPadding:(CGFloat)arg1;
- (void)uYouPlusRootOptionsAction;
@end
@interface YTISlimMetadataButtonSupportedRenderers : NSObject
- (id)slimButton_buttonRenderer;
- (id)slimMetadataButtonRenderer;
- (void)settingsAction;
@end
// YTSpeed

View file

@ -14,19 +14,6 @@ NSBundle *uYouPlusBundle() {
return bundle;
}
NSBundle *tweakBundle = uYouPlusBundle();
// uYouPlusSettings.xm
static int contrastMode() {
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSComparisonResult result1 = [appVersion compare:@"17.33.2" options:NSNumericSearch];
NSComparisonResult result2 = [appVersion compare:@"17.38.10" options:NSNumericSearch];
if (result1 != NSOrderedAscending && result2 != NSOrderedDescending) {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"];
} else {
return 0;
}
}
//
# pragma mark - Other hooks
@ -51,19 +38,7 @@ static int contrastMode() {
}
%end
// Fixes uYou crash when trying to play video (#1422)
@interface YTVarispeedSwitchController : NSObject
@end
@interface YTPlayerOverlayManager : NSObject
@property (nonatomic, assign) float currentPlaybackRate;
@property (nonatomic, strong, readonly) YTVarispeedSwitchController *varispeedController;
- (void)varispeedSwitchController:(YTVarispeedSwitchController *)varispeed didSelectRate:(float)rate;
- (void)setCurrentPlaybackRate:(float)rate;
- (void)setPlaybackRate:(float)rate;
@end
// Fixes uYou crash when trying to play video (qnblackcat/#1422) - @Dayanch96
%hook YTPlayerOverlayManager
%property (nonatomic, assign) float currentPlaybackRate;
@ -95,6 +70,11 @@ static int contrastMode() {
- (BOOL)isMonetized { return NO; }
%end
%hook YTAdShieldUtils
+ (id)spamSignalsDictionary { return @{}; }
+ (id)spamSignalsDictionaryWithoutIDFA { return @{}; }
%end
%hook YTDataUtils
+ (id)spamSignalsDictionary { return @{}; }
+ (id)spamSignalsDictionaryWithoutIDFA { return @{}; }
@ -127,6 +107,10 @@ static int contrastMode() {
%hook YTIPlayerResponse
- (BOOL)isMonetized { return NO; }
%end
%hook YTAdShieldUtils
+ (id)spamSignalsDictionary { return @{}; }
+ (id)spamSignalsDictionaryWithoutIDFA { return @{}; }
%end
%hook YTDataUtils
+ (id)spamSignalsDictionary { return @{}; }
+ (id)spamSignalsDictionaryWithoutIDFA { return @{}; }
@ -145,28 +129,44 @@ static int contrastMode() {
%orig;
}
%end
BOOL isAdString(NSString *description) {
if ([description containsString:@"brand_promo"]
|| [description containsString:@"carousel_footered_layout"]
|| [description containsString:@"carousel_headered_layout"]
|| [description containsString:@"feed_ad_metadata"]
|| [description containsString:@"full_width_portrait_image_layout"]
|| [description containsString:@"full_width_square_image_layout"]
|| [description containsString:@"home_video_with_context"]
|| [description containsString:@"landscape_image_wide_button_layout"]
|| [description containsString:@"product_engagement_panel"]
|| [description containsString:@"product_item"]
|| [description containsString:@"shelf_header"]
|| [description containsString:@"square_image_layout"]
|| [description containsString:@"text_image_button_layout"]
|| [description containsString:@"text_search_ad"]
|| [description containsString:@"expandable_list"]
|| [description containsString:@"expandable_metadata"]
|| [description containsString:@"video_display_full_buttoned_layout"])
return YES;
return NO;
NSString *getAdString(NSString *description) {
if ([description containsString:@"brand_promo"])
return @"brand_promo";
if ([description containsString:@"carousel_footered_layout"])
return @"carousel_footered_layout";
if ([description containsString:@"carousel_headered_layout"])
return @"carousel_headered_layout";
if ([description containsString:@"feed_ad_metadata"])
return @"feed_ad_metadata";
if ([description containsString:@"full_width_portrait_image_layout"])
return @"full_width_portrait_image_layout";
if ([description containsString:@"full_width_square_image_layout"])
return @"full_width_square_image_layout";
if ([description containsString:@"landscape_image_wide_button_layout"])
return @"landscape_image_wide_button_layout";
if ([description containsString:@"post_shelf"])
return @"post_shelf";
if ([description containsString:@"product_carousel"])
return @"product_carousel";
if ([description containsString:@"product_engagement_panel"])
return @"product_engagement_panel";
if ([description containsString:@"product_item"])
return @"product_item";
if ([description containsString:@"statement_banner"])
return @"statement_banner";
if ([description containsString:@"square_image_layout"])
return @"square_image_layout";
if ([description containsString:@"text_image_button_layout"])
return @"text_image_button_layout";
if ([description containsString:@"text_search_ad"])
return @"text_search_ad";
if ([description containsString:@"video_display_full_layout"])
return @"video_display_full_layout";
if ([description containsString:@"video_display_full_buttoned_layout"])
return @"video_display_full_buttoned_layout";
return nil;
}
NSData *cellDividerData;
static __strong NSData *cellDividerData;
%hook YTIElementRenderer
- (NSData *)elementData {
NSString *description = [self description];
@ -174,7 +174,16 @@ NSData *cellDividerData;
if (!cellDividerData) cellDividerData = %orig;
return cellDividerData;
}
if ([self respondsToSelector:@selector(hasCompatibilityOptions)] && self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) return cellDividerData;
if (!cellDividerData) return %orig;
if ([self respondsToSelector:@selector(hasCompatibilityOptions)] && self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) {
// HBLogInfo(@"YTX adLogging 1 %@", cellDividerData);
return cellDividerData;
}
NSString *adString = getAdString(description);
if (adString) {
// HBLogInfo(@"YTX getAdString 1 %@ %@", adString, cellDividerData);
return cellDividerData;
}
return %orig;
}
%end
@ -188,41 +197,23 @@ NSData *cellDividerData;
YTIItemSectionRenderer *sectionRenderer = renderers.itemSectionRenderer;
YTIItemSectionSupportedRenderers *firstObject = [sectionRenderer.contentsArray firstObject];
YTIElementRenderer *elementRenderer = firstObject.elementRenderer;
if ([elementRenderer respondsToSelector:@selector(hasCompatibilityOptions)] && elementRenderer.hasCompatibilityOptions && elementRenderer.compatibilityOptions.hasAdLoggingData) {
// HBLogInfo(@"YTX adLogging 2 %@", elementRenderer);
return YES;
}
NSString *description = [elementRenderer description];
return isAdString(description)
|| [description containsString:@"post_shelf"]
|| [description containsString:@"product_carousel"]
|| [description containsString:@"statement_banner"];
NSString *adString = getAdString(description);
if (adString) {
// HBLogInfo(@"YTX getAdString 2 %@ %@", adString, elementRenderer);
return YES;
}
return NO;
}];
[contentsArray removeObjectsAtIndexes:removeIndexes];
}
%orig;
}
%end
%hook YTWatchNextResultsViewController
- (void)loadWithModel:(YTISectionListRenderer *)watchNextResults {
if ([watchNextResults isKindOfClass:%c(YTISectionListRenderer)]) {
NSMutableArray <YTISectionListSupportedRenderers *> *contentsArray = watchNextResults.contentsArray;
NSIndexSet *removeIndexes = [contentsArray indexesOfObjectsPassingTest:^BOOL(YTISectionListSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
if (![renderers isKindOfClass:%c(YTISectionListSupportedRenderers)])
return NO;
YTIItemSectionRenderer *sectionRenderer = renderers.itemSectionRenderer;
YTIItemSectionSupportedRenderers *firstObject = [sectionRenderer.contentsArray firstObject];
YTIElementRenderer *elementRenderer = firstObject.elementRenderer;
NSString *description = [elementRenderer description];
return isAdString(description);
}];
[contentsArray removeObjectsAtIndexes:removeIndexes];
}
%orig;
}
%end
%hook _ASDisplayView
- (void)didMoveToWindow {
%orig();
if ([self.accessibilityIdentifier isEqualToString:@"id.products_in_video_with_preview_overlay_badge.view"]) self.hidden = YES;
}
%end
%end
// Hide YouTube Logo - @dayanch96
@ -255,7 +246,6 @@ NSData *cellDividerData;
%end
%end
// Fix App Group Directory by move it to document directory
%hook NSFileManager
- (NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier {
@ -310,6 +300,9 @@ NSData *cellDividerData;
- (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; } // Swipe right to dismiss the right panel in fullscreen mode
- (BOOL)enableModularPlayerBarController { return NO; } // fixes some of the iSponorBlock problems
- (BOOL)mainAppCoreClientEnableCairoSettings { return IS_ENABLED(@"newSettingsUI_enabled"); } // New grouped settings UI
- (BOOL)enableIosFloatingMiniplayer { return IS_ENABLED(@"floatingMiniplayer_enabled"); } // Floating Miniplayer
- (BOOL)enableIosFloatingMiniplayerSwipeUpToExpand { return IS_ENABLED(@"floatingMiniplayer_enabled"); } // Floating Miniplayer
- (BOOL)enableIosFloatingMiniplayerRepositioning { return IS_ENABLED(@"floatingMiniplayer2_enabled"); } // Floating Miniplayer (Repositioning Support, Removes Swiping Up Gesture)
%end
// Fix Casting: https://github.com/arichornlover/uYouEnhanced/issues/606#issuecomment-2098289942
@ -358,6 +351,21 @@ NSData *cellDividerData;
- (BOOL)savedSettingShouldExpire { return NO; }
%end
// Restore Settings Button in Navigaton Bar - @arichornlover & @bhackel - https://github.com/arichornlover/uYouEnhanced/issues/178
/* WILL RESULT IN LOSING THE SETTINGS BUTTON!
%hook YTRightNavigationButtons
- (id)visibleButtons {
Class YTVersionUtilsClass = %c(YTVersionUtils);
NSString *appVersion = [YTVersionUtilsClass performSelector:@selector(appVersion)];
NSComparisonResult result = [appVersion compare:@"18.35.4" options:NSNumericSearch];
if (result == NSOrderedAscending) {
return %orig;
}
return [self dynamicButtons];
}
%end
*/
// Hide "Get Youtube Premium" in "You" tab - @bhackel
%group gHidePremiumPromos
%hook YTAppCollectionViewController
@ -551,27 +559,6 @@ NSData *cellDividerData;
- (BOOL)enablePlayerBarForVerticalVideoWhenControlsHiddenInFullscreen { return YES; }
%end
// YTNoTracking - @arichornlover - https://github.com/arichornlover/YTNoTracking/
%hook UIPasteboard
- (void)setString:(NSString *)string {
// Check if the shared string is a YouTube URL
if ([string containsString:@"youtu"]) {
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"youtu\\.be\\/(\\w+)" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
for (NSTextCheckingResult *match in matches) {
NSRange videoIDRange = [match rangeAtIndex:1];
NSString *videoID = [string substringWithRange:videoIDRange];
NSRange timeRange = [string rangeOfString:@"t=" options:NSBackwardsSearch];
NSString *sanitizedURL = [NSString stringWithFormat:@"https://youtu.be/%@%@", videoID, [string substringFromIndex:timeRange.location]];
%orig(sanitizedURL);
return;
}
}
%orig(string);
}
%end
// YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo
%hook YTMainAppVideoPlayerOverlayViewController
- (void)setPaidContentWithPlayerData:(id)data {
@ -591,7 +578,31 @@ NSData *cellDividerData;
}
%end
// Classic Video Player (Restores the v16.xx.x Video Player Functionality) - @arichornlover
// To-do: disabling "Precise Video Scrubbing" https://9to5google.com/2022/06/29/youtube-precise-video-scrubbing/
%group gClassicVideoPlayer
%hook YTColdConfig
- (BOOL)isPinchToEnterFullscreenEnabled { return YES; } // Restore Pinch-to-fullscreen
- (BOOL)deprecateTabletPinchFullscreenGestures { return NO; } // Restore Pinch-to-fullscreen
%end
%hook YTHotConfig
- (BOOL)isTabletFullscreenSwipeGesturesEnabled { return NO; } // Disable Swipe-to-fullscreen (iPad)
%end
%end
// Fix LowContrastMode - @arichornlover
static int contrastMode() {
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSComparisonResult result1 = [appVersion compare:@"17.33.2" options:NSNumericSearch];
NSComparisonResult result2 = [appVersion compare:@"17.38.10" options:NSNumericSearch];
if (result1 != NSOrderedAscending && result2 != NSOrderedDescending) {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"];
} else {
return 0;
}
}
%group gFixLowContrastMode
%hook NSUserDefaults
- (NSInteger)integerForKey:(NSString *)defaultName {
@ -631,7 +642,7 @@ NSData *cellDividerData;
*/
%end
// Disable Modern/Rounded Buttons (_ASDisplayView Version's not included) - @arichornlover
// Disable Modern/Rounded Buttons (_ASDisplayView Version's not supported) - @arichornlover
%group gDisableModernButtons
%hook YTQTMButton // Disable Modern/Rounded Buttons
+ (BOOL)buttonModernizationEnabled { return NO; }
@ -653,15 +664,29 @@ NSData *cellDividerData;
- (BOOL)cxClientEnableModernizedActionSheet { return NO; }
- (BOOL)enableClientShortsSheetsModernization { return NO; }
- (BOOL)enableTimestampModernizationForNative { return NO; }
- (BOOL)modernizeElementsTextColor { return NO; }
- (BOOL)modernizeElementsBgColor { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaFeedStretchBottom { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaFrostedBottomBar { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaFrostedPivotBar { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaFrostedPivotBarUpdatedBackdrop { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaFrostedTopBar { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaOpacityPivotBar { return NO; }
- (BOOL)mainAppCoreClientEnableModernIaTopAndBottomBarIconRefresh { return NO; }
- (BOOL)mainAppCoreClientEnableModernizedBedtimeReminderU18DefaultSettings { return NO; }
- (BOOL)modernizeCameoNavbar { return NO; }
- (BOOL)modernizeCollectionLockups { return NO; }
- (BOOL)modernizeCollectionLockupsShowVideoCount { return NO; }
- (BOOL)modernizeElementsBgColor { return NO; }
- (BOOL)modernizeElementsTextColor { return NO; }
- (BOOL)postsCreatorClientEnableModernButtonsUi { return NO; }
- (BOOL)pullToFullModernEdu { return NO; }
- (BOOL)showModernMiniplayerRedesign { return NO; }
- (BOOL)uiSystemsClientGlobalConfigEnableModernButtonsForNative { return NO; }
- (BOOL)uiSystemsClientGlobalConfigIosEnableModernTabsForNative { return NO; }
- (BOOL)uiSystemsClientGlobalConfigIosEnableEpUxUpdates { return NO; }
- (BOOL)uiSystemsClientGlobalConfigIosEnableSheetsUxUpdates { return NO; }
- (BOOL)uiSystemsClientGlobalConfigIosEnableSnackbarModernization { return NO; }
- (BOOL)uiSystemsClientGlobalConfigModernizeNativeBgColor { return NO; }
- (BOOL)uiSystemsClientGlobalConfigModernizeNativeTextColor { return NO; }
// Disable Rounded Content
- (BOOL)enableIosFloatingMiniplayerRoundedCornerRadius { return YES; }
- (BOOL)iosDownloadsPageRoundedThumbs { return NO; }
- (BOOL)iosRoundedSearchBarSuggestZeroPadding { return NO; }
- (BOOL)uiSystemsClientGlobalConfigEnableRoundedDialogForNative { return NO; }
@ -713,11 +738,21 @@ NSData *cellDividerData;
%end
%end
// Hide YouTube Heatwaves in Video Player (YouTube v17.19.2-latest) - @level3tjg - https://www.reddit.com/r/jailbreak/comments/v29yvk/
// Hide YouTube Heatwaves in Video Player - v17.33.2+ - @arichornlover
%group gHideHeatwaves
%hook YTInlinePlayerBarContainerView
- (BOOL)canShowHeatwave { return NO; }
%end
%hook YTPlayerBarHeatwaveView
- (id)initWithFrame:(CGRect)frame heatmap:(id)heat {
return NULL;
}
%end
%hook YTPlayerBarController
- (void)setHeatmap:(id)arg1 {
%orig(NULL);
}
%end
%end
// YTNoSuggestedVideo - https://github.com/bhackel/YTNoSuggestedVideo
@ -816,6 +851,31 @@ NSData *cellDividerData;
%end
%end
// Fullscreen to the Right - @arichornlover
%group gFullscreenToTheRight
%hook YTWatchViewController
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
if ([self fullscreen] && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
return UIInterfaceOrientationLandscapeRight;
}
return %orig;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if ([self fullscreen] && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
return UIInterfaceOrientationMaskLandscape;
}
return %orig;
}
%new
- (void)forceRightFullscreenOrientation {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}
}
%end
%end
// Disable Double tap to skip chapter - @bhackel
%hook YTDoubleTapToSeekController
- (void)didTwoFingerDoubleTap:(id)arg1 {
@ -826,7 +886,6 @@ NSData *cellDividerData;
}
%end
// Disable snap to chapter
%hook YTSegmentableInlinePlayerBarView
- (void)didMoveToWindow {
@ -837,7 +896,6 @@ NSData *cellDividerData;
}
%end
// Disable Pinch to zoom
%hook YTColdConfig
- (BOOL)videoZoomFreeZoomEnabledGlobalConfig {
@ -1006,7 +1064,9 @@ NSData *cellDividerData;
}
%end
// Hide Fullscreen Button - @arichornlover - PoomSmart's Newer Version of the *YouQuality* tweak breaks when enabling this
/*
// LEGACY VERSION ⚠️
// Hide Fullscreen Button - @arichornlover - PoomSmart's 1.2.0+ Versions of the *YouQuality* tweak makes the button invisible when enabling this
%hook YTInlinePlayerBarContainerView
- (void)layoutSubviews {
%orig;
@ -1023,6 +1083,18 @@ NSData *cellDividerData;
}
}
%end
*/
// NEW VERSION
// Hide Fullscreen Button - @arichornlover
%group gHideFullscreenButton
%hook YTInlinePlayerBarContainerView
- (BOOL)fullscreenButtonDisabled { return YES; }
- (BOOL)canShowFullscreenButton { return NO; }
- (BOOL)canShowFullscreenButtonExperimental { return NO; }
// - (void)setFullscreenButtonDisabled:(BOOL) // Uncomment and might implement this if needed - @arichornlover
%end
%end
// Hide HUD Messages
%hook YTHUDMessageView
@ -1037,7 +1109,7 @@ NSData *cellDividerData;
return IS_ENABLED(@"hideChannelWatermark_enabled") ? NO : %orig;
}
%end
// Hide Channel Watermark (for Old YouTube Versions / Backwards Compatibility)
// Hide Channel Watermark (for Backwards Compatibility)
%hook YTAnnotationsViewController
- (void)loadFeaturedChannelWatermark {
if (IS_ENABLED(@"hideChannelWatermark_enabled")) {}
@ -1219,31 +1291,17 @@ NSData *cellDividerData;
}
%end
/*
// Hide Shorts Cells - @PoomSmart, @iCrazeiOS & @Dayanch96
/* DISABLED DUE TO CONFLICTS
// Hide Community Posts - @michael-winay, @arichornlover, @iCrazeiOS @PoomSmart & @Dayanch96
%hook YTIElementRenderer
- (NSData *)elementData {
NSString *description = [self description];
if ([NSUserDefaults.standardUserDefaults boolForKey:@"removeShortsCell"]) { // uYou (Hide Shorts Cells)
if ([description containsString:@"shorts_shelf.eml"] || [description containsString:@"#shorts"] || [description containsString:@"shorts_video_cell.eml"] || [description containsString:@"6Shorts"]) {
if (![description containsString:@"history*"]) {
if (!cellDividerData) cellDividerData = %orig;
return cellDividerData;
}
}
}
// Hide Community Posts @michael-winay & @arichornlover
if (IS_ENABLED(@"hideCommunityPosts_enabled")) {
if ([description containsString:@"post_base_wrapper.eml"]) {
if (!cellDividerData) cellDividerData = %orig;
if (!cellDividerData) cellDividerData = [NSData dataWithBytes:cellDividerDataBytes length:cellDividerDataBytesLength];
return cellDividerData;
}
}
// etc. - @Dayanch96
BOOL hasShorts = ([description containsString:@"shorts_shelf.eml"] || [description containsString:@"shorts_video_cell.eml"] || [description containsString:@"6Shorts"]) && ![description containsString:@"history*"];
BOOL hasShortsInHistory = [description containsString:@"compact_video.eml"] && [description containsString:@"youtube_shorts_"];
if (hasShorts || hasShortsInHistory) return cellDividerData;
return %orig;
}
%end
@ -1258,21 +1316,22 @@ NSData *cellDividerData;
color = [UIColor redColor];
}
}
// Hide the Button Containers under the Video Player - 17.33.2 and up - @arichornlover
// Hide the Button Containers under the Video Player - 17.33.2 and up - @arichornlover
if (IS_ENABLED(@"hideButtonContainers_enabled")) {
if ([description containsString:@"id.video.like.button"] ||
[description containsString:@"id.video.dislike.button"] ||
[description containsString:@"id.video.share.button"] ||
[description containsString:@"id.video.remix.button"] ||
[description containsString:@"id.ui.add_to.offline.button"]) {
color = [UIColor clearColor];
// self.hidden = YES;
}
}
%orig(color);
}
%end
// Hide the (Connect / Thanks / Save / Report) Buttons under the Video Player - 17.33.2 and up - @arichornlover (inspired by @PoomSmart's version) LEGACY METHOD ⚠️
// LEGACY VERSION ⚠️
// Hide the (Connect / Thanks / Save / Report) Buttons under the Video Player - 17.33.2 and up - @arichornlover (inspired by @PoomSmart's version)
%hook _ASDisplayView
- (void)layoutSubviews {
%orig;
@ -1295,11 +1354,12 @@ NSData *cellDividerData;
}
%end
// UPDATED VERSION
// Hide the (Connect / Share / Remix / Thanks / Download / Clip / Save / Report) Buttons under the Video Player - 17.33.2 and up - @PoomSmart (inspired by @arichornlover) - METHOD BROKE Server-Side on May 14th 2024
static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *identifiers) {
for (id child in [nodeController children]) {
if ([child isKindOfClass:%c(ELMNodeController)]) {
NSArray <ELMComponent *> *elmChildren = [(ELMNodeController *)child children];
NSArray <ELMComponent *> *elmChildren = [(ELMNodeController * _Nullable)child children];
for (ELMComponent *elmChild in elmChildren) {
for (NSString *identifier in identifiers) {
if ([[elmChild description] containsString:identifier])
@ -1309,8 +1369,8 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
}
if ([child isKindOfClass:%c(ASNodeController)]) {
ASDisplayNode *childNode = ((ASNodeController *)child).node; // ELMContainerNode
NSArray *yogaChildren = childNode.yogaChildren;
ASDisplayNode *childNode = ((ASNodeController * _Nullable)child).node; // ELMContainerNode
NSArray<id> *yogaChildren = childNode.yogaChildren;
for (ASDisplayNode *displayNode in yogaChildren) {
if ([identifiers containsObject:displayNode.accessibilityIdentifier])
return YES;
@ -1326,7 +1386,7 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
%hook ASCollectionView // This stopped working on May 14th 2024 due to a Server-Side Change from YouTube.
- (CGSize)sizeForElement:(ASCollectionElement *)element {
- (CGSize)sizeForElement:(ASCollectionElement * _Nullable)element {
if ([self.accessibilityIdentifier isEqualToString:@"id.video.scrollable_action_bar"]) {
ASCellNode *node = [element node];
ASNodeController *nodeController = [node controller];
@ -1463,19 +1523,6 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
}
%end
// %hook YTSectionListViewController
// - (void)loadWithModel:(YTISectionListRenderer *)model {
// NSMutableArray <YTISectionListSupportedRenderers *> *contentsArray = model.contentsArray;
// NSIndexSet *removeIndexes = [contentsArray indexesOfObjectsPassingTest:^BOOL(YTISectionListSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
// YTIItemSectionRenderer *sectionRenderer = renderers.itemSectionRenderer;
// YTIItemSectionSupportedRenderers *firstObject = [sectionRenderer.contentsArray firstObject];
// return firstObject.hasPromotedVideoRenderer || firstObject.hasCompactPromotedVideoRenderer || firstObject.hasPromotedVideoInlineMutedRenderer;
// }];
// [contentsArray removeObjectsAtIndexes:removeIndexes];
// %orig;
// }
// %end
// Disable hints - https://github.com/LillieH001/YouTube-Reborn/blob/v4/
%group gDisableHints
%hook YTSettings
@ -1518,7 +1565,7 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
%end
// Hide the chip bar under the video player?
// %hook YTChipCloudCell //
// %hook YTChipCloudCell
// - (void)didMoveToWindow {
// %orig;
// self.hidden = YES;
@ -1583,7 +1630,7 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
%end
%hook UIKBTree
- (long long)nativeIdiom {
return NO;
return YES;
}
%end
%hook UIKBRenderer
@ -1654,6 +1701,9 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
if (IS_ENABLED(@"portraitFullscreen_enabled")) {
%init(gPortraitFullscreen);
}
if (IS_ENABLED(@"fullscreenToTheRight_enabled")) {
%init(gFullscreenToTheRight);
}
if (IS_ENABLED(@"hideFullscreenActions_enabled")) {
%init(hideFullscreenActions);
}
@ -1672,6 +1722,9 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
if (IS_ENABLED(@"noVideosInFullscreen_enabled")) {
%init(gNoVideosInFullscreen);
}
if (IS_ENABLED(@"classicVideoPlayer_enabled")) {
%init(gClassicVideoPlayer);
}
if (IS_ENABLED(@"fixLowContrastMode_enabled")) {
%init(gFixLowContrastMode);
}
@ -1790,6 +1843,7 @@ static BOOL findCell(ASNodeController *nodeController, NSArray <NSString *> *ide
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"removeYouTubeAds"];
}
if (![allKeys containsObject:@"uYouAdBlockingWorkaround_enabled"]) {
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"uYouAdBlockingWorkaroundLite_enabled"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"uYouAdBlockingWorkaround_enabled"];
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"removeYouTubeAds"];
}

View file

@ -1,5 +1,10 @@
#import <UIKit/UIActivityViewController.h>
#import <YouTubeHeader/YTUIUtils.h>
#import <YouTubeHeader/YTColorPalette.h>
#import <YouTubeHeader/YTCommonColorPalette.h>
#import "Tweaks/protobuf/objectivec/GPBDescriptor.h"
#import "Tweaks/protobuf/objectivec/GPBUnknownField.h"
#import "Tweaks/protobuf/objectivec/GPBUnknownFieldSet.h"
#import "uYouPlus.h"
@interface PlayerManager : NSObject
@ -53,3 +58,39 @@
@interface UILabel (uYou)
+ (id)_defaultColor;
@end
// YouTube Native Share Headers - https://github.com/jkhsjdhjs/youtube-native-share - @jkhsjdhjs
@interface CustomGPBMessage : GPBMessage
+ (instancetype)deserializeFromString:(NSString*)string;
@end
// @interface YTICommand : GPBMessage
// @end
@interface ELMPBCommand : GPBMessage
@end
@interface ELMPBShowActionSheetCommand : GPBMessage
@property (nonatomic, strong, readwrite) ELMPBCommand *onAppear;
@property (nonatomic, assign, readwrite) BOOL hasOnAppear;
@end
@interface YTIUpdateShareSheetCommand
@property (nonatomic, assign, readwrite) BOOL hasSerializedShareEntity;
@property (nonatomic, copy, readwrite) NSString *serializedShareEntity;
+ (GPBExtensionDescriptor*)updateShareSheetCommand;
@end
@interface YTIInnertubeCommandExtensionRoot
+ (GPBExtensionDescriptor*)innertubeCommand;
@end
@interface YTAccountScopedCommandResponderEvent
@property (nonatomic, strong, readwrite) YTICommand *command;
@end
@interface YTIShareEntityEndpoint
@property (nonatomic, assign, readwrite) BOOL hasSerializedShareEntity;
@property (nonatomic, copy, readwrite) NSString *serializedShareEntity;
+ (GPBExtensionDescriptor*)shareEntityEndpoint;
@end

View file

@ -91,6 +91,140 @@ static void repositionCreateTab(YTIGuideResponse *response) {
}
%end
// YouTube Native Share - https://github.com/jkhsjdhjs/youtube-native-share - @jkhsjdhjs
typedef NS_ENUM(NSInteger, ShareEntityType) {
ShareEntityFieldVideo = 1,
ShareEntityFieldPlaylist = 2,
ShareEntityFieldChannel = 3,
ShareEntityFieldClip = 8
};
static inline NSString* extractIdWithFormat(GPBUnknownFieldSet *fields, NSInteger fieldNumber, NSString *format) {
if (![fields hasField:fieldNumber])
return nil;
GPBUnknownField *idField = [fields getField:fieldNumber];
if ([idField.lengthDelimitedList count] != 1)
return nil;
NSString *id = [[NSString alloc] initWithData:[idField.lengthDelimitedList firstObject] encoding:NSUTF8StringEncoding];
return [NSString stringWithFormat:format, id];
}
static BOOL showNativeShareSheet(NSString *serializedShareEntity) {
GPBMessage *shareEntity = [%c(GPBMessage) deserializeFromString:serializedShareEntity];
GPBUnknownFieldSet *fields = shareEntity.unknownFields;
NSString *shareUrl;
if ([fields hasField:ShareEntityFieldClip]) {
GPBUnknownField *shareEntityClip = [fields getField:ShareEntityFieldClip];
if ([shareEntityClip.lengthDelimitedList count] != 1)
return FALSE;
GPBMessage *clipMessage = [%c(GPBMessage) parseFromData:[shareEntityClip.lengthDelimitedList firstObject] error:nil];
shareUrl = extractIdWithFormat(clipMessage.unknownFields, 1, @"https://youtube.com/clip/%@");
}
if (!shareUrl)
shareUrl = extractIdWithFormat(fields, ShareEntityFieldChannel, @"https://youtube.com/channel/%@");
if (!shareUrl) {
shareUrl = extractIdWithFormat(fields, ShareEntityFieldPlaylist, @"%@");
if (shareUrl) {
if (![shareUrl hasPrefix:@"PL"] && ![shareUrl hasPrefix:@"FL"])
shareUrl = [shareUrl stringByAppendingString:@"&playnext=1"];
shareUrl = [@"https://youtube.com/playlist?list=" stringByAppendingString:shareUrl];
}
}
if (!shareUrl)
shareUrl = extractIdWithFormat(fields, ShareEntityFieldVideo, @"https://youtube.com/watch?v=%@");
if (!shareUrl)
return FALSE;
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]initWithActivityItems:@[shareUrl] applicationActivities:nil];
[[%c(YTUIUtils) topViewControllerForPresenting] presentViewController:activityViewController animated:YES completion:^{}];
return TRUE;
}
/* -------------------- iPad Layout -------------------- */
%hook YTAccountScopedCommandResponderEvent
- (void)send {
GPBExtensionDescriptor *shareEntityEndpointDescriptor = [%c(YTIShareEntityEndpoint) shareEntityEndpoint];
if (![self.command hasExtension:shareEntityEndpointDescriptor])
return %orig;
YTIShareEntityEndpoint *shareEntityEndpoint = [self.command getExtension:shareEntityEndpointDescriptor];
if (!showNativeShareSheet(shareEntityEndpoint.serializedShareEntity))
return %orig;
}
%end
/* OLD
%hook YTShareRequestViewController
- (id)initWithService:(id)_service parentResponder:(id)_parentResponder {
id result = %orig;
// disable the default share sheet behavior and force the app to call [YTAccountScopedCommandRouter handleCommand] if available
if ([_parentResponder respondsToSelector:@selector(handleCommand:entry:fromView:sender:completionBlock:)]) {
[_parentResponder handleCommand:nil entry:nil fromView:nil sender:nil completionBlock:nil];
}
return result;
}
%end
%hook YTAccountScopedCommandRouter
- (BOOL)handleCommand:(id)command entry:(id)_entry fromView:(id)_fromView sender:(id)_sender completionBlock:(id)_completionBlock {
GPBExtensionDescriptor *shareEntityEndpointDescriptor = [%c(YTIShareEntityEndpoint) shareEntityEndpoint];
if (![command hasExtension:shareEntityEndpointDescriptor])
return %orig;
YTIShareEntityEndpoint *shareEntityEndpoint = [command getExtension:shareEntityEndpointDescriptor];
if(!shareEntityEndpoint.hasSerializedShareEntity)
return %orig;
if (!showNativeShareSheet(shareEntityEndpoint.serializedShareEntity))
return %orig;
return TRUE;
}
%end
*/
/* EXPERIMENTAL
%hook YTAccountScopedCommandRouter
- (BOOL)handleCommand:(id)command entry:(id)_entry fromView:(id)_fromView sender:(id)_sender completionBlock:(id)_completionBlock {
GPBExtensionDescriptor *shareEntityEndpointDescriptor = [%c(YTIShareEntityEndpoint) shareEntityEndpoint];
if (![command hasExtension:shareEntityEndpointDescriptor])
return %orig;
YTIShareEntityEndpoint *shareEntityEndpoint = [command getExtension:shareEntityEndpointDescriptor];
if(!shareEntityEndpoint || !shareEntityEndpoint.hasSerializedShareEntity || !shareEntityEndpoint.serializedShareEntity) {
return %orig;
}
if (!showNativeShareSheet(shareEntityEndpoint.serializedShareEntity)) {
return %orig;
}
return TRUE;
}
%end
*/
/* ------------------- iPhone Layout ------------------- */
%hook ELMPBShowActionSheetCommand
- (void)executeWithCommandContext:(id)_context handler:(id)_handler {
if (!self.hasOnAppear)
return %orig;
GPBExtensionDescriptor *innertubeCommandDescriptor = [%c(YTIInnertubeCommandExtensionRoot) innertubeCommand];
if (![self.onAppear hasExtension:innertubeCommandDescriptor])
return %orig;
YTICommand *innertubeCommand = [self.onAppear getExtension:innertubeCommandDescriptor];
GPBExtensionDescriptor *updateShareSheetCommandDescriptor = [%c(YTIUpdateShareSheetCommand) updateShareSheetCommand];
if(![innertubeCommand hasExtension:updateShareSheetCommandDescriptor])
return %orig;
YTIUpdateShareSheetCommand *updateShareSheetCommand = [innertubeCommand getExtension:updateShareSheetCommandDescriptor];
if (!updateShareSheetCommand.hasSerializedShareEntity)
return %orig;
if (!showNativeShareSheet(updateShareSheetCommand.serializedShareEntity))
return %orig;
}
%end
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
// %group iOS16
// %hook OBPrivacyLinkButton

View file

@ -71,6 +71,20 @@ SWITCH_ITEM3(
);
*/
// Copy Settings KEYS
NSArray *copyKeys = @[
/* MAIN Player Keys */ @"portraitFullscreen_enabled", @"slideToSeek_enabled", @"YTTapToSeek_enabled", @"doubleTapToSeek_disabled", @"snapToChapter_enabled", @"pinchToZoom_enabled", @"ytMiniPlayer_enabled", @"stockVolumeHUD_enabled", @"disablePullToFull_enabled", @"disableChapterSkip_enabled", @"alwaysShowRemainingTime_enabled", @"disableRemainingTime_enabled",
/* MAIN Button Keys */ @"enableShareButton_enabled", @"enableSaveToButton_enabled", @"hideYTMusicButton_enabled", @"hideAutoplaySwitch_enabled", @"hideCC_enabled", @"hideVideoTitle_enabled", @"disableCollapseButton_enabled", @"disableFullscreenButton_enabled", @"hideHUD_enabled", @"hidePaidPromotionCard_enabled", @"hideChannelWatermark_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled", @"hidePreviousAndNextButton_enabled", @"redProgressBar_enabled", @"hideHoverCards_enabled", @"hideRightPanel_enabled", @"hideFullscreenActions_enabled", @"noSuggestedVideo_enabled", @"hideHeatwaves_enabled", @"hideDoubleTapToSeekOverlay_enabled", @"hideOverlayDarkBackground_enabled", @"disableAmbientMode_enabled", @"noVideosInFullscreen_enabled", @"noRelatedWatchNexts_enabled",
/* MAIN Shorts Keys */ @"hideBuySuperThanks_enabled", @"hideSubcriptions_enabled", @"disableResumeToShorts_enabled", @"shortsQualityPicker_enabled",
/* MAIN Player UI Keys */ @"redSubscribeButton_enabled", @"hideButtonContainers_enabled", @"hideConnectButton_enabled", @"hideShareButton_enabled", @"hideRemixButton_enabled", @"hideThanksButton_enabled", @"hideDownloadButton_enabled", @"hideClipButton_enabled", @"hideSaveToPlaylistButton_enabled", @"hideReportButton_enabled", @"hidePreviewCommentSection_enabled", @"hideCommentSection_enabled",
/* MAIN Overlay Keys */ @"disableAccountSection_enabled", @"disableAutoplaySection_enabled", @"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled", @"disableNotificationsSection_enabled", @"disableManageAllHistorySection_enabled", @"disableYourDataInYouTubeSection_enabled", @"disablePrivacySection_enabled", @"disableLiveChatSection_enabled", @"hidePremiumPromos_enabled",
/* MAIN App UI Keys */ @"hideHomeTab_enabled", @"lowContrastMode_enabled", @"classicVideoPlayer_enabled", @"fixLowContrastMode_enabled", @"disableModernButtons_enabled", @"disableRoundedHints_enabled", @"disableModernFlags_enabled", @"ytNoModernUI_enabled", @"enableVersionSpoofer_enabled",
/* MAIN Misc Keys */ @"uYouAdBlockingWorkaroundLite_enabled", @"uYouAdBlockingWorkaround_enabled", @"disableAnimatedYouTubeLogo_enabled", @"centerYouTubeLogo_enabled", @"hideYouTubeLogo_enabled", @"ytStartupAnimation_enabled", @"disableHints_enabled", @"stickNavigationBar_enabled", @"hideSponsorBlockButton_enabled", @"hideChipBar_enabled", @"hidePlayNextInQueue_enabled", @"hideCommunityPosts_enabled", @"hideChannelHeaderLinks_enabled", @"iPhoneLayout_enabled", @"bigYTMiniPlayer_enabled", @"reExplore_enabled", @"autoHideHomeBar_enabled", @"hideSubscriptionsNotificationBadge_enabled", @"fixCasting_enabled", @"newSettingsUI_enabled", @"flex_enabled",
/* TWEAK uYou Keys */ @"showedWelcomeVC", @"hideShortsTab", @"hideCreateTab", @"hideCastButton", @"relatedVideosAtTheEndOfYTVideos", @"removeYouTubeAds", @"backgroundPlayback", @"disableAgeRestriction", @"iPadLayout", @"noSuggestedVideoAtEnd", @"shortsProgressBar", @"hideShortsCells", @"removeShortsCell", @"startupPage",
/* TWEAK iSB Keys */ @"userID", @"apiInstance", @"minimumDuration", @"skipNoticeDuration", @"kShowModifiedTime", @"showSkipNotice", @"showButtonsInPlayer", @"hideStartEndButtonInPlayer", @"showModifiedTime", @"skipAudioNotification", @"enableSkipCountTracking",
/* TWEAK YTUHD Keys */ @"EnableVP9", @"AllVP9"
];
static int contrastMode() {
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSComparisonResult result1 = [appVersion compare:@"17.33.2" options:NSNumericSearch];
@ -181,49 +195,29 @@ extern NSBundle *uYouPlusBundle();
YTSettingsSectionItem *copySettings = [%c(YTSettingsSectionItem)
itemWithTitle:IS_ENABLED(@"replaceCopyandPasteButtons_enabled") ? LOC(@"EXPORT_SETTINGS") : LOC(@"COPY_SETTINGS")
titleDescription:IS_ENABLED(@"replaceCopyandPasteButtons_enabled") ? LOC(@"EXPORT_SETTINGS_DESC") : LOC(@"COPY_SETTINGS_DESC")
titleDescription:IS_ENABLED(@"replaceCopyandPasteButtons_enabled") ? LOC(@"EXPORT_SETTINGS_DESC") : LOC(@"COPY_SETTINGS_DESC")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
if (IS_ENABLED(@"replaceCopyandPasteButtons_enabled")) {
// Export Settings functionality
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSURL *tempFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:@"exported_settings.txt"]];
NSMutableString *settingsString = [NSMutableString string];
NSArray *copyKeys = @[
/* MAIN Player Keys */ @"portraitFullscreen_enabled", @"slideToSeek_enabled", @"YTTapToSeek_enabled", @"doubleTapToSeek_disabled", @"snapToChapter_enabled", @"pinchToZoom_enabled", @"ytMiniPlayer_enabled", @"stockVolumeHUD_enabled", @"disablePullToFull_enabled", @"disableChapterSkip_enabled", @"alwaysShowRemainingTime_enabled", @"disableRemainingTime_enabled",
/* MAIN Button Keys */ @"enableShareButton_enabled", @"enableSaveToButton_enabled", @"hideYTMusicButton_enabled", @"hideAutoplaySwitch_enabled", @"hideCC_enabled", @"hideVideoTitle_enabled", @"disableCollapseButton_enabled", @"disableFullscreenButton_enabled", @"hideHUD_enabled", @"hidePaidPromotionCard_enabled", @"hideChannelWatermark_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled", @"hidePreviousAndNextButton_enabled", @"redProgressBar_enabled", @"hideHoverCards_enabled", @"hideRightPanel_enabled", @"hideFullscreenActions_enabled", @"noSuggestedVideo_enabled", @"hideHeatwaves_enabled", @"hideDoubleTapToSeekOverlay_enabled", @"hideOverlayDarkBackground_enabled", @"disableAmbientMode_enabled", @"noVideosInFullscreen_enabled", @"noRelatedWatchNexts_enabled",
/* MAIN Shorts Keys */ @"hideBuySuperThanks_enabled", @"hideSubcriptions_enabled", @"disableResumeToShorts_enabled", @"shortsQualityPicker_enabled",
/* MAIN Player UI Keys */ @"redSubscribeButton_enabled", @"hideButtonContainers_enabled", @"hideConnectButton_enabled", @"hideShareButton_enabled", @"hideRemixButton_enabled", @"hideThanksButton_enabled", @"hideDownloadButton_enabled", @"hideClipButton_enabled", @"hideSaveToPlaylistButton_enabled", @"hideReportButton_enabled", @"hidePreviewCommentSection_enabled", @"hideCommentSection_enabled",
/* MAIN Overlay Keys */ @"disableAccountSection_enabled", @"disableAutoplaySection_enabled", @"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled", @"disableNotificationsSection_enabled", @"disableManageAllHistorySection_enabled", @"disableYourDataInYouTubeSection_enabled", @"disablePrivacySection_enabled", @"disableLiveChatSection_enabled", @"hidePremiumPromos_enabled",
/* MAIN App UI Keys */ @"hideHomeTab_enabled", @"lowContrastMode_enabled", @"fixLowContrastMode_enabled", @"disableModernButtons_enabled", @"disableRoundedHints_enabled", @"disableModernFlags_enabled", @"ytNoModernUI_enabled", @"enableVersionSpoofer_enabled",
/* MAIN Misc Keys */ @"uYouAdBlockingWorkaroundLite_enabled", @"uYouAdBlockingWorkaround_enabled", @"disableAnimatedYouTubeLogo_enabled", @"centerYouTubeLogo_enabled", @"hideYouTubeLogo_enabled", @"ytStartupAnimation_enabled", @"disableHints_enabled", @"stickNavigationBar_enabled", @"hideSponsorBlockButton_enabled", @"hideChipBar_enabled", @"hidePlayNextInQueue_enabled", @"hideCommunityPosts_enabled", @"hideChannelHeaderLinks_enabled", @"iPhoneLayout_enabled", @"bigYTMiniPlayer_enabled", @"reExplore_enabled", @"autoHideHomeBar_enabled", @"hideSubscriptionsNotificationBadge_enabled", @"fixCasting_enabled", @"newSettingsUI_enabled", @"flex_enabled",
/* TWEAK uYou Keys */ @"hideShortsTab", @"hideCreateTab", @"hideCastButton", @"relatedVideosAtTheEndOfYTVideos", @"disableAgeRestriction", @"removeYouTubeAds", @"noSuggestedVideoAtEnd", @"showedWelcomeVC", @"shortsProgressBar", @"hideShortsCells", @"removeShortsCell", @"startupPage",
/* TWEAK YTUHD Keys */ @"EnableVP9", @"AllVP9"];
for (NSString *key in copyKeys) {
if ([userDefaults objectForKey:key]) {
NSString *value = [userDefaults objectForKey:key];
id value = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if (value) {
[settingsString appendFormat:@"%@: %@\n", key, value];
}
}
NSString *fileName = @"uyouenhanced_settings.txt";
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:fileName];
if (![settingsString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil]) {
NSLog(@"Failed to export settings to file.");
}
[settingsString writeToURL:tempFileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithURL:tempFileURL inMode:UIDocumentPickerModeExportToService];
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
documentPicker.allowsMultipleSelection = NO;
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
} else {
// Copy Settings functionality (default behavior)
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableString *settingsString = [NSMutableString string];
NSArray *copyKeys = @[
/* MAIN Player Keys */ @"portraitFullscreen_enabled", @"slideToSeek_enabled", @"YTTapToSeek_enabled", @"doubleTapToSeek_disabled", @"snapToChapter_enabled", @"pinchToZoom_enabled", @"ytMiniPlayer_enabled", @"stockVolumeHUD_enabled", @"disablePullToFull_enabled", @"disableChapterSkip_enabled", @"alwaysShowRemainingTime_enabled", @"disableRemainingTime_enabled",
/* MAIN Button Keys */ @"enableShareButton_enabled", @"enableSaveToButton_enabled", @"hideYTMusicButton_enabled", @"hideAutoplaySwitch_enabled", @"hideCC_enabled", @"hideVideoTitle_enabled", @"disableCollapseButton_enabled", @"disableFullscreenButton_enabled", @"hideHUD_enabled", @"hidePaidPromotionCard_enabled", @"hideChannelWatermark_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled", @"hidePreviousAndNextButton_enabled", @"redProgressBar_enabled", @"hideHoverCards_enabled", @"hideRightPanel_enabled", @"hideFullscreenActions_enabled", @"noSuggestedVideo_enabled", @"hideHeatwaves_enabled", @"hideDoubleTapToSeekOverlay_enabled", @"hideOverlayDarkBackground_enabled", @"disableAmbientMode_enabled", @"noVideosInFullscreen_enabled", @"noRelatedWatchNexts_enabled",
/* MAIN Shorts Keys */ @"hideBuySuperThanks_enabled", @"hideSubcriptions_enabled", @"disableResumeToShorts_enabled", @"shortsQualityPicker_enabled",
/* MAIN Player UI Keys */ @"redSubscribeButton_enabled", @"hideButtonContainers_enabled", @"hideConnectButton_enabled", @"hideShareButton_enabled", @"hideRemixButton_enabled", @"hideThanksButton_enabled", @"hideDownloadButton_enabled", @"hideClipButton_enabled", @"hideSaveToPlaylistButton_enabled", @"hideReportButton_enabled", @"hidePreviewCommentSection_enabled", @"hideCommentSection_enabled",
/* MAIN Overlay Keys */ @"disableAccountSection_enabled", @"disableAutoplaySection_enabled", @"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled", @"disableNotificationsSection_enabled", @"disableManageAllHistorySection_enabled", @"disableYourDataInYouTubeSection_enabled", @"disablePrivacySection_enabled", @"disableLiveChatSection_enabled", @"hidePremiumPromos_enabled",
/* MAIN App UI Keys */ @"hideHomeTab_enabled", @"lowContrastMode_enabled", @"fixLowContrastMode_enabled", @"disableModernButtons_enabled", @"disableRoundedHints_enabled", @"disableModernFlags_enabled", @"ytNoModernUI_enabled", @"enableVersionSpoofer_enabled",
/* MAIN Misc Keys */ @"uYouAdBlockingWorkaroundLite_enabled", @"uYouAdBlockingWorkaround_enabled", @"disableAnimatedYouTubeLogo_enabled", @"centerYouTubeLogo_enabled", @"hideYouTubeLogo_enabled", @"ytStartupAnimation_enabled", @"disableHints_enabled", @"stickNavigationBar_enabled", @"hideSponsorBlockButton_enabled", @"hideChipBar_enabled", @"hidePlayNextInQueue_enabled", @"hideCommunityPosts_enabled", @"hideChannelHeaderLinks_enabled", @"iPhoneLayout_enabled", @"bigYTMiniPlayer_enabled", @"reExplore_enabled", @"autoHideHomeBar_enabled", @"hideSubscriptionsNotificationBadge_enabled", @"fixCasting_enabled", @"newSettingsUI_enabled", @"flex_enabled",
/* TWEAK uYou Keys */ @"hideShortsTab", @"hideCreateTab", @"hideCastButton", @"relatedVideosAtTheEndOfYTVideos", @"disableAgeRestriction", @"removeYouTubeAds", @"noSuggestedVideoAtEnd", @"showedWelcomeVC", @"shortsProgressBar", @"hideShortsCells", @"removeShortsCell", @"startupPage",
/* TWEAK YTUHD Keys */ @"EnableVP9", @"AllVP9"];
for (NSString *key in copyKeys) {
if ([userDefaults objectForKey:key]) {
NSString *value = [userDefaults objectForKey:key];
@ -250,6 +244,7 @@ extern NSBundle *uYouPlusBundle();
documentPicker.delegate = (id<UIDocumentPickerDelegate>)self;
documentPicker.allowsMultipleSelection = NO;
[settingsViewController presentViewController:documentPicker animated:YES completion:nil];
return YES;
} else {
// Paste Settings functionality (default behavior)
UIAlertController *confirmPasteAlert = [UIAlertController alertControllerWithTitle:LOC(@"Are you sure you want to paste the settings?") message:nil preferredStyle:UIAlertControllerStyleAlert];
@ -265,7 +260,7 @@ extern NSBundle *uYouPlusBundle();
NSString *value = components[1];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
}
}
}
[settingsViewController reloadData];
SHOW_RELAUNCH_YT_SNACKBAR;
}
@ -277,7 +272,7 @@ extern NSBundle *uYouPlusBundle();
];
[sectionItems addObject:pasteSettings];
// SWITCH_ITEM(LOC(@"REPLACE_COPY_AND_PASTE_BUTTONS"), LOC(@"REPLACE_COPY_AND_PASTE_BUTTONS"), @"replaceCopyandPasteButtons_enabled");
SWITCH_ITEM(LOC(@"REPLACE_COPY_AND_PASTE_BUTTONS"), LOC(@"REPLACE_COPY_AND_PASTE_BUTTONS_DESC"), @"replaceCopyandPasteButtons_enabled");
YTSettingsSectionItem *exitYT = [%c(YTSettingsSectionItem)
itemWithTitle:LOC(@"QUIT_YOUTUBE")
@ -297,7 +292,7 @@ extern NSBundle *uYouPlusBundle();
# pragma mark - uYouEnhanced Essential Menu
YTSettingsSectionItem *customAppMenu = [%c(YTSettingsSectionItem)
itemWithTitle:LOC(@"UYOUENHANCED_ESSENTIAL_MENU")
titleDescription:LOC(@"This menu includes App Color Customization & Ability to Clear the Cache 🗑️")
titleDescription:LOC(@"This menu includes App Color Customization 🎨 & Ability to Clear the Cache 🗑️")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
@ -439,6 +434,24 @@ extern NSBundle *uYouPlusBundle();
}
});
);
SWITCH_ITEM3(
LOC(@"FULLSCREEN_TO_THE_RIGHT"),
LOC(@"FULLSCREEN_TO_THE_RIGHT_DESC"),
@"fullscreenToTheRight_enabled",
({
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[[NSUserDefaults standardUserDefaults] setBool:enable forKey:@"fullscreenToTheRight_enabled"];
SHOW_RELAUNCH_YT_SNACKBAR;
return YES;
} else {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Incompatibile" message:@"This Option is Incompatible on an iPad Device." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:okAction];
[settingsViewController presentViewController:alert animated:YES completion:nil];
return NO;
}
});
);
SWITCH_ITEM2(LOC(@"SLIDE_TO_SEEK"), LOC(@"SLIDE_TO_SEEK_DESC"), @"slideToSeek_enabled");
SWITCH_ITEM2(LOC(@"ENABLE_TAP_TO_SEEK"), LOC(@"ENABLE_TAP_TO_SEEK_DESC"), @"YTTapToSeek_enabled");
SWITCH_ITEM(LOC(@"DISABLE_DOUBLE_TAP_TO_SEEK"), LOC(@"DISABLE_DOUBLE_TAP_TO_SEEK_DESC"), @"doubleTapToSeek_disabled");
@ -475,16 +488,19 @@ extern NSBundle *uYouPlusBundle();
LOC(@"HIDE_FULLSCREEN_ACTION_BUTTONS_DESC"),
@"hideFullscreenActions_enabled",
({
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[[NSUserDefaults standardUserDefaults] setBool:enable forKey:@"hideFullscreenActions_enabled"];
SHOW_RELAUNCH_YT_SNACKBAR;
return YES;
} else {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Incompatibile" message:@"This Option is Incompatible on an iPad Device." preferredStyle:UIAlertControllerStyleAlert];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// Show alert if the option is not compatible with iPad
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"iPad Compatibility Issue" message:@"This option is only compatible with iPhone devices." preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:okAction];
[settingsViewController presentViewController:alert animated:YES completion:nil];
return NO;
} else {
// Normal Behavior (iPhone)
[[NSUserDefaults standardUserDefaults] setBool:enable forKey:@"hideFullscreenActions_enabled"];
[settingsViewController reloadData];
SHOW_RELAUNCH_YT_SNACKBAR;
return YES;
}
});
);
@ -529,7 +545,7 @@ extern NSBundle *uYouPlusBundle();
# pragma mark - Video player button options
SECTION_HEADER(LOC(@"VIDEO_PLAYER_BUTTON_OPTIONS"));
// (the options "Red Subscribe Button" and "Hide Button Containers under player" are currently not working)
// (the options "Red Subscribe Button" and "Hide Button Containers under player" are currently not working, would most likely result in effecting the whole entire app.)
//
// SWITCH_ITEM(LOC(@"RED_SUBSCRIBE_BUTTON"), LOC(@"RED_SUBSCRIBE_BUTTON_DESC"), @"redSubscribeButton_enabled");
// SWITCH_ITEM2(LOC(@"HIDE_BUTTON_CONTAINERS_UNDER_PLAYER"), LOC(@"HIDE_BUTTON_CONTAINERS_UNDER_PLAYER_DESC"), @"hideButtonContainers_enabled");
@ -639,6 +655,7 @@ extern NSBundle *uYouPlusBundle();
}
];
[sectionItems addObject:lowContrastModeButton];
SWITCH_ITEM2(LOC(@"CLASSIC_VIDEO_PLAYER"), LOC(@"CLASSIC_VIDEO_PLAYER_DESC"), @"classicVideoPlayer_enabled");
SWITCH_ITEM2(LOC(@"FIX_LOWCONTRASTMODE"), LOC(@"FIX_LOWCONTRASTMODE_DESC"), @"fixLowContrastMode_enabled");
SWITCH_ITEM2(LOC(@"DISABLE_MODERN_BUTTONS"), LOC(@"DISABLE_MODERN_BUTTONS_DESC"), @"disableModernButtons_enabled");
SWITCH_ITEM2(LOC(@"DISABLE_ROUNDED_CORNERS_ON_HINTS"), LOC(@"DISABLE_ROUNDED_CORNERS_ON_HINTS_DESC"), @"disableRoundedHints_enabled");
@ -1331,7 +1348,7 @@ extern NSBundle *uYouPlusBundle();
return YES;
}]
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VERSION_SPOOFER_TITLE") pickerSectionTitle:nil rows:rows selectedItemIndex:appVersionSpoofer() parentResponder:[self parentResponder]];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VERSION_SPOOFER_SELECTOR") pickerSectionTitle:nil rows:rows selectedItemIndex:appVersionSpoofer() parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];
return YES;
}
@ -1394,6 +1411,28 @@ extern NSBundle *uYouPlusBundle();
[settingsViewController setSectionItems:sectionItems forCategory:uYouPlusSection title:@"uYouEnhanced" titleDescription:LOC(@"TITLE DESCRIPTION") headerHidden:YES];
}
// File Manager (Import Settings .txt)
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls {
if (urls.count > 0) {
NSURL *fileURL = urls.firstObject;
NSString *fileContents = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
if (fileContents.length > 0) {
NSArray *lines = [fileContents componentsSeparatedByString:@"\n"];
for (NSString *line in lines) {
NSArray *components = [line componentsSeparatedByString:@": "];
if (components.count == 2) {
NSString *key = components[0];
NSString *value = components[1];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
}
}
YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"];
[settingsViewController reloadData];
}
}
}
//
- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry {
if (category == uYouPlusSection) {
[self updateTweakSectionWithEntry:entry];

View file

@ -11,7 +11,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4.1.4
uses: actions/checkout@v4.1.7
- name: Set up Git
run: |
@ -20,11 +20,11 @@ jobs:
- name: Add uYouEnhanced submodules
run: |
# git submodule add https://github.com/PoomSmart/FLEXing.git Tweaks/FLEXing
git submodule add https://github.com/dayanch96/uYouLocalization.git Tweaks/uYouLocalization
git submodule add https://github.com/arichornlover/YTHoldForSpeed.git Tweaks/YTHoldForSpeed
git submodule add https://github.com/arichornlover/YouGroupSettings.git Tweaks/YouGroupSettings
git submodule add https://github.com/arichornlover/YouTimeStamp.git Tweaks/YouTimeStamp
git submodule add https://github.com/arichornloverALT/YTHoldForSpeed.git Tweaks/YTHoldForSpeed
git submodule add https://github.com/arichornloverALT/YouGroupSettings.git Tweaks/YouGroupSettings
git submodule add https://github.com/arichornloverALT/YouTimeStamp.git Tweaks/YouTimeStamp
git submodule add https://github.com/protocolbuffers/protobuf.git Tweaks/protobuf
git add .
git commit -m "added uYouEnhanced submodules"
git push origin
@ -84,7 +84,6 @@ jobs:
- name: Make .bundle files
run: |
cd Bundles
ln -s ../Tweaks/MrBeastify/layout/Library/Application\ Support/MrBeastify.bundle MrBeastify.bundle
ln -s ../Tweaks/uYouLocalization/layout/Library/Application\ Support/uYouLocalization.bundle uYouLocalization.bundle
ln -s ../Tweaks/YTHoldForSpeed/layout/Library/Application\ Support/YTHoldForSpeed.bundle YTHoldForSpeed.bundle
ln -s ../Tweaks/YouGroupSettings/layout/Library/Application\ Support/YouGroupSettings.bundle YouGroupSettings.bundle
@ -98,7 +97,6 @@ jobs:
# - name: Delete .bundle files
# run: |
# cd Bundles
# rm -f MrBeastify.bundle
# rm -f uYouLocalization.bundle
# rm -f YTHoldForSpeed.bundle
# rm -f YouGroupSettings.bundle

@ -1 +1 @@
Subproject commit 4e938e351e96e5c62f6099c00b24abd179143aef
Subproject commit edf35a14fe99a53dc6d51a8aa2292bc8529316af

@ -1 +1 @@
Subproject commit 9bf17bfdede78a236f5d67f780cf77709a9e5fdf
Subproject commit 12b4991ade6d3edd1e4fb28fe19bb32b6dc93206

@ -1 +1 @@
Subproject commit 3b43f12a23aee37dcf21a26685f134c7afb224de
Subproject commit 6691e4c307e7e6366ee7b715f558e91904f86d95

@ -1 +1 @@
Subproject commit 38a2b7032200f700c661b6f6e9d22b4a7eb47e85
Subproject commit 93ff6610f856a70917adcf7fb9af2c9a94dfeb63

@ -1 +1 @@
Subproject commit 35b7fc5251ee3feddee4b003f2f76bf1cdd80ed0
Subproject commit 2def430a6e70ddd6e0937f03d6ebd95a0c9382e6

@ -1 +1 @@
Subproject commit fb2cc71e91bdbfd7a612b1d1bd2b1e875900564f
Subproject commit 58951f248bfe90298ca65007603d465f58369876

1
Tweaks/protobuf Submodule

@ -0,0 +1 @@
Subproject commit 532f0c2ed52b60bc33492a2ee4cbf9c4ca960450

View file

@ -1,8 +1,8 @@
Package: com.arichorn.uyouenhanced
Package: com.arichornlover.uyouenhanced
Name: uYouEnhanced
Architecture: iphoneos-arm
Description: An expanded version of uYouPlus
Maintainer: arichorn
Maintainer: arichornlover
Author: qnblackcat
Section: Tweaks
Depends: mobilesubstrate (>= 0.9.5000), com.miro.uyou