Compare commits

..
Author SHA1 Message Date
qnblackcat 35b6374d8c update submodules 2022-09-08 15:48:48 +07:00
qnblackcat 2191478712 an option to replace Previous & Next button with Fast forward & Rewind button 2022-09-07 21:30:15 +07:00
qnblackcat 39849cac51 update strings 2022-09-07 21:29:12 +07:00
qnblackcat 1f5ad62544 for TrollStore user only: add an option to fix Google Sign in 2022-09-06 08:44:11 +07:00
qnblackcat c04f0b7e43 update strings 2022-09-06 08:43:34 +07:00
Nguyễn Đạt 380ee96a71 Merge pull request #433 from clc0321/main
add KILL_APP to zh_tw
2022-09-05 12:38:55 +07:00
clc0321 15124cf1c9 add KILL_APP to zh_tw 2022-09-05 12:36:46 +08:00
Nguyễn Đạt 9bd1be5024 Merge pull request #422 from Sh1hu/patch-2
Update Localizable.strings
2022-09-03 09:30:25 +07:00
Sh1hu eb0a64bd69 Update Localizable.strings 2022-09-02 17:47:35 +09:00
level3tjg 02bfe1ada3 Fix shorts like button showing more menu 2022-09-01 11:02:26 -04:00
qnblackcat b62746061d v17.34.3-2.1 2022-09-01 20:20:40 +07:00
qnblackcat e2cd37a8b6 formating, remove old code, update IAmYouTube 2022-09-01 11:40:09 +07:00
qnblackcat e5b9ff21cf update submodules 2022-09-01 09:23:13 +07:00
level3tjg 2e7fd253a8 just found out isnan() exists 2022-08-30 10:44:48 -04:00
level3tjg 3aa7c57d82 Fix uYou player bar bug 2022-08-28 02:02:18 -04:00
level3tjg 11ddcd421d Workaround for iOS 15 uYou settings bug (#10) 2022-08-27 02:49:20 -04:00
level3tjg 6418f3daeb Make sure we're modifying uYou shorts button 2022-08-27 02:12:18 -04:00
level3tjg 4b283110a6 Various fixes for shorts (#170, #253, #263) 2022-08-26 18:41:33 -04:00
qnblackcat 2615436031 v17.33.2-2.1 2022-08-26 13:20:22 +07:00
qnblackcat 81088fadd3 update Makefile 2022-08-26 13:20:13 +07:00
BandarHelal 5adaec2c93 Update uYouPlus.xm 2022-08-25 19:39:25 +03:00
BandarHelal 7ac253963e Fix Login issue 2022-08-25 18:31:28 +03:00
Nguyễn Đạt 2d2b469f1f Merge pull request #407 from darkbrow/main
Update Korean localization
2022-08-25 08:20:04 +07:00
Jinbong 9e98ad9482 Update Korean localization 2022-08-25 03:17:53 +09:00
BandarHelal 1d5de3cd4c Update uYouPlus.xm
Improve Julioverne's code by specifying YouTube SSOService because "device_challenge_request" can be used in other thinks with the App like Apple Push Service.
2022-08-21 17:03:47 +03:00
Nguyễn Đạt 1266cb5a38 More specifically... 2022-08-21 11:00:59 +07:00
Nguyễn Đạt 4fee21517e Merge pull request #398 from julioverne/main
Completely fix Google Sign-in by julioverne (#319)
2022-08-21 02:23:44 +07:00
julioverne 2ff0f3fb56 Fix Login
Fixes Login Account from Insecure App
2022-08-20 15:28:51 -03:00
qnblackcat 329fb1681a Skips content warning before playing *some videos - @PoomSmart 2022-08-14 02:02:23 +07:00
Nguyễn Đạt c78e5b9fd9 Merge pull request #374 from darkbrow/main
Add Korean localization
2022-08-13 12:59:43 +07:00
Jinbong 7b9fd7dcfb Add Korean localization 2022-08-13 14:02:24 +09:00
Nguyễn Đạt 922ab4e9b7 Merge pull request #373 from Sh1hu/patch-1
Update Japanese localization
2022-08-13 10:20:34 +07:00
Sh1hu c8a4acfff0 Update Japanese localization
The correct Japanese translation of the "Explore" tab is "探索".
Other translation optimizations were made.
2022-08-13 09:56:20 +09:00
qnblackcat d53b400235 v17.31.4-2.1 2022-08-12 22:00:53 +07:00
qnblackcat 3cabc4405d update uYouPlus.xm 2022-08-12 22:00:36 +07:00
qnblackcat d3a347a914 add Japan localization, credit: @Haerumastu - Twitter 2022-08-10 21:41:59 +07:00
Nguyễn Đạt 17adfaf534 Merge pull request #362 from fefifofum/main
Add Spanish translation
2022-08-10 21:38:09 +07:00
Nguyễn Đạt edc1ac3912 Update Localizable.strings 2022-08-10 21:37:47 +07:00
Nguyễn Đạt 21d3e74f9f Merge pull request #361 from Thunderz2016/main
Add Simplified Chinese (zh_cn) translation
2022-08-10 21:37:14 +07:00
qnblackcat 3bd1914a36 update submodules 2022-08-10 21:30:43 +07:00
fefifofum 7ff88f4106 Add Spanish translation 2022-08-10 10:36:01 +02:00
Thunderz2016 b6304bf20a Added Simplified Chinese translation
Minor grammar improvements.
2022-08-09 23:32:07 -07:00
Thunderz2016 0db3c368a0 Added Simplified Chinese translation
Deleted comments that contain instructions to create translations.
2022-08-09 23:21:20 -07:00
Thunderz2016 9bd31e7189 Added Simplified Chinese translation 2022-08-09 23:16:28 -07:00
Nguyễn Đạt 58488a1d89 Merge pull request #350 from moh-ter/main
Update Ar Translation
2022-08-07 08:34:08 +07:00
moh-ter c9547cae78 Merge branch 'qnblackcat:main' into main 2022-08-06 16:53:16 +03:00
moh-ter f8336d0352 Fix Ar Translation + add "Kill App" translation
Fix Ar Translation .. sorry for the mistake.

+ add translation for the new strings
2022-08-06 16:23:35 +03:00
qnblackcat e549c1e9e9 fixed missing scroll bar in Shorts (#343) 2022-08-06 11:31:20 +07:00
qnblackcat afb5cf1cb6 update submodules 2022-08-06 11:28:53 +07:00
qnblackcat f275f72413 use iOS 15.5 SDK 2022-08-05 23:20:17 +07:00
qnblackcat 46b4ea6a27 update submodules 2022-08-05 23:18:20 +07:00
qnblackcat 23ba60a3ba v17.30.3-2.1 (pre-release) 2022-08-05 23:17:09 +07:00
qnblackcat 93b7aa9258 update Settings.xm 2022-08-04 23:20:29 +07:00
qnblackcat 0db1e09917 update submodules 2022-08-04 20:56:57 +07:00
Nguyễn Đạt 6a8798597b Merge pull request #336 from 5jd/patch-1
Update French translation
2022-08-04 20:54:34 +07:00
5jd ac6fa7b853 Add close Youtube French translation
Adds the Close Youtube French translation
2022-08-04 14:09:35 +02:00
Nguyễn Đạt 49b75626b9 Merge pull request #329 from VictorxD70/main
Add Portuguese Brazilian translation
2022-08-03 16:50:47 +07:00
Victor Alves 8ec1cb8cba Set lang code to 'pt' to stay right with youtube app 2022-08-03 05:15:24 -03:00
Victor Alves 12f80fa7ee Add Portuguese Brazilian translation 2022-08-02 15:42:11 -03:00
qnblackcat 09b765d7d9 update strings 2022-08-02 23:34:38 +07:00
qnblackcat fd8dc7a61d close app button 2022-08-02 23:34:25 +07:00
qnblackcat 1036272ce3 update submodules 2022-08-02 23:33:46 +07:00
qnblackcat 41ae9ef959 update submodules 2022-08-02 22:41:19 +07:00
qnblackcat 2b141cb50f minor improvements 2022-07-30 17:45:58 +07:00
qnblackcat 02addcb00c update submodules 2022-07-30 17:45:13 +07:00
Nguyễn Đạt 53f62444ba Merge pull request #317 from ErSpieltHD/patch-2
Retranslation + Paid Promo Banner (de)
2022-07-29 09:36:45 +07:00
ErSpieltHD 922b86a749 Retranslation + Paid Promo Banner 2022-07-28 21:45:12 +02:00
Nguyễn Đạt 976c103dce Merge pull request #312 from clc0321/main
update zh_tw translation
2022-07-27 21:57:59 +07:00
clc0321 8dc2ed3166 Update Localizable.strings 2022-07-27 22:01:13 +08:00
clc0321 932cae3473 Update zh_tw translation
fix some minor issues
2022-07-27 21:58:43 +08:00
BandarHelal 3d05302b9b Fix typo 2022-07-26 00:07:01 +03:00
Nguyễn Đạt 40af55583f Merge pull request #305 from manhbi18112005/patch-1
Update Vietnamese localization
2022-07-25 20:26:28 +07:00
Nguyễn Đạt e389801893 update Vietnamese localization 2022-07-25 20:25:38 +07:00
๖ۣۜŇŇ_MyTツ ee98ec6237 Update Localizable.strings 2022-07-25 18:10:28 +07:00
Nguyễn Đạt 516749e081 Merge pull request #298 from miraficus/main
Czech Language
2022-07-25 17:23:42 +07:00
Nguyễn Đạt c5935309ca Update bug.md 2022-07-25 17:23:07 +07:00
Miraficus 94fdb176ea Revert "Changed name to YoutubePlus"
This reverts commit 11308d59b5.
2022-07-24 20:18:46 +02:00
Miraficus a2b9a6ac73 Merge branch 'qnblackcat:main' into main 2022-07-24 20:15:44 +02:00
qnblackcat 96b62b5791 update strings 2022-07-23 23:36:08 +07:00
Nguyễn Đạt 49615dd41c Merge pull request #301 from 5jd/patch-1
Add the french translation for HIDE_PAID_PROMOTION_CARDS
2022-07-23 23:22:55 +07:00
5jd 96c528fa72 Add the translation for HIDE_PAID_PROMOTION_CARDS 2022-07-23 18:03:08 +02:00
Nguyễn Đạt d959269a3b Merge pull request #300 from moh-ter/main
Arabic Translation
2022-07-23 21:21:39 +07:00
moh-ter 7045e82565 Ar Translation 2022-07-23 16:39:53 +03:00
Miraficus 11308d59b5 Changed name to YoutubePlus 2022-07-21 20:40:35 +02:00
Miraficus e6622b7e74 Fixed typo 2022-07-21 20:17:28 +02:00
Miraficus f8a02e11d7 Czech translation 2022-07-21 20:15:10 +02:00
qnblackcat 43d593d88d Merge branch 'main' of https://github.com/qnblackcat/uYouPlus 2022-07-20 08:48:23 +07:00
qnblackcat f4bf32bcad Enable Reorder videos from playlist by @PoomSmart 2022-07-20 08:44:23 +07:00
Nguyễn Đạt b16c54cd63 Merge pull request #279 from UnrealThingTriesCode/patch-1
couple spelling corrections, keep up the good work
2022-07-13 11:57:08 +07:00
Sunka f45f1946b4 couple spelling corrections, keep up the good work 2022-07-12 21:04:10 +02:00
qnblackcat f325a31196 v17.26.2-2.1 2022-07-11 20:20:26 +07:00
qnblackcat cab48bbe9e update submodules 2022-07-11 19:57:05 +07:00
qnblackcat 5424e4a9e8 use ARC 2022-07-01 10:06:34 +07:00
qnblackcat d7a7c90cf0 update localization 2022-07-01 10:05:19 +07:00
qnblackcat fe45ebaac1 update Header.h 2022-07-01 10:05:02 +07:00
qnblackcat 4590369aa1 clean up 2022-07-01 10:04:55 +07:00
qnblackcat 36bf21ad2e update localization 2022-06-30 10:28:38 +07:00
qnblackcat c2d1581698 hide Paid promotion card by @PoomSmart 2022-06-30 10:28:19 +07:00
qnblackcat ca0650d73a update submodules 2022-06-30 10:24:49 +07:00
qnblackcat ad29207afd v17.25.1-2.1 2022-06-29 21:06:26 +07:00
qnblackcat 64c7717b38 update submodules 2022-06-29 21:05:59 +07:00
qnblackcat 25f66162c5 update submodule 2022-06-28 15:36:23 +07:00
qnblackcat 5becdf5a85 Merge branch 'main' of https://github.com/qnblackcat/uYouPlus 2022-06-27 09:11:54 +07:00
qnblackcat 9145301cc8 support YT v17.25.1 2022-06-27 09:11:10 +07:00
qnblackcat b2b14305eb update Header.h 2022-06-27 08:50:15 +07:00
Nguyễn Đạt 02ec80256c Merge pull request #245 from ErSpieltHD/patch-1
Update German translation
2022-06-27 01:19:04 +07:00
Nguyễn Đạt b37f1e1a24 update German localization 2022-06-27 01:18:43 +07:00
ErSpieltHD 244e5a3576 German translation 2022-06-26 17:43:15 +02:00
qnblackcat 3a532cfa63 update Header.h 2022-06-26 10:12:50 +07:00
qnblackcat ef153f5d9c clean up 2022-06-26 10:11:19 +07:00
qnblackcat 4258986378 update submodules 2022-06-26 10:06:12 +07:00
qnblackcat dae08da6bf update workflow 2022-06-26 10:00:28 +07:00
qnblackcat 7f0e749030 Merge branch 'main' of https://github.com/qnblackcat/uYouPlus 2022-06-24 10:47:24 +07:00
qnblackcat c6dd02a759 update submodules 2022-06-24 10:47:11 +07:00
Nguyễn Đạt 23d745e869 Merge pull request #240 from level3tjg/main
uYou crash workarounds
2022-06-24 10:45:55 +07:00
level3tjg 2116d96e6a uYouLocal crash workaround 2022-06-23 12:42:28 -04:00
level3tjg f2cb699e3b Notification menu crash workaround 2022-06-23 12:19:22 -04:00
qnblackcat fbafccf1bd v17.24.4-2.1 2022-06-22 09:26:17 +07:00
qnblackcat 029ab22b9f update Header.h 2022-06-22 09:26:06 +07:00
qnblackcat f4215a7b0b code format 2022-06-22 09:25:54 +07:00
qnblackcat 0d1e7bad8e Merge branch 'ErSpieltHD-main' 2022-06-19 21:42:50 +07:00
ErSpieltHD e97ada36c1 Update Localizable.strings 2022-06-19 16:05:39 +02:00
ErSpieltHD 4d1b478606 Create Localizable.strings 2022-06-19 15:31:55 +02:00
Nguyễn Đạt 24c2f5594f Merge pull request #224 from level3tjg/main
iOS 16 OnboardingKit crash fix
2022-06-16 06:26:19 +07:00
level3tjg c1e3976200 Add OnboardingKit shim method for uYou (iOS 16) 2022-06-15 16:11:48 -04:00
Nguyễn Đạt 0fc9032979 Merge pull request #222 from ISnackable/main
Add draft release functionality back
2022-06-15 20:36:49 +07:00
Tommy b4c70ee668 Add draft release functionality back 2022-06-15 21:31:44 +08:00
qnblackcat f966182c15 an actually workaround for issue #54 2022-06-15 18:08:37 +07:00
qnblackcat 1b20c07f03 localization template 2022-06-15 18:05:11 +07:00
Nguyễn Đạt 7ad8f9409b Merge pull request #221 from clc0321/main
Added Chinese_TW translation
2022-06-15 16:13:53 +07:00
clc0321 122d5b8280 Added Chinese_TW translation 2022-06-15 16:10:27 +08:00
clc0321 5744474710 editor_temple_name 2022-06-15 15:39:30 +08:00
Nguyễn Đạt faaecd51cb Update bug.md 2022-06-15 01:36:01 +07:00
Nguyễn Đạt 8250a1462e Merge pull request #215 from Aransh/main
Main
2022-06-14 16:57:59 +07:00
Nguyễn Đạt 9371c72a42 Merge pull request #213 from ShadowRoi/main
Fixes Greek translation(probably)
2022-06-14 16:57:18 +07:00
Aran Shavit 1acf0a4eba Added Hebrew localization 2022-06-14 12:50:52 +03:00
ShadowRoi 1a63491af3 Add files via upload 2022-06-14 10:43:38 +03:00
ShadowRoi e912dc0bda Delete lang/uYouPlus.bundle/gr.lproj directory 2022-06-14 10:43:26 +03:00
qnblackcat fa87084000 v17.23.6-2.1 2022-06-14 11:28:48 +07:00
qnblackcat 0b30adb3f4 update Header.h 2022-06-14 11:07:38 +07:00
qnblackcat 349a49eb93 fix hide next & previous button not working sometimes 2022-06-14 11:06:17 +07:00
qnblackcat 57ed260959 update submodules 2022-06-14 10:31:55 +07:00
Nguyễn Đạt 9b03cac475 Merge pull request #208 from 5jd/patch-1
Extend the French translation
2022-06-13 17:36:57 +07:00
5jd 0a6179a4b7 Extend French translation
Add messages for YTCastConfirm and also improve the existing translation.
2022-06-13 11:57:10 +02:00
Nguyễn Đạt 9e37aaed11 Merge pull request #205 from ShadowRoi/main
Adds Greek Translation
2022-06-13 15:24:02 +07:00
ShadowRoi 691d7d3078 Delete gr.lproj directory 2022-06-12 23:08:27 +03:00
ShadowRoi 915bb7efb3 Add files via upload 2022-06-12 23:08:15 +03:00
ShadowRoi d8151344ae Add files via upload 2022-06-12 22:19:10 +03:00
qnblackcat 163dac3e81 fix compiling, code format 2022-06-12 13:41:29 +07:00
qnblackcat 3383edbb05 update Header.h 2022-06-12 12:07:07 +07:00
qnblackcat c2efac035c update localization 2022-06-12 12:06:53 +07:00
Nguyễn Đạt 0fad665452 Merge pull request #204 from dayanch96/main
Russian localization and (!) YTCastConfirm
2022-06-12 11:37:51 +07:00
dayanch96 1b554d0994 Update uYouPlus.xm 2022-06-12 05:25:11 +03:00
dayanch96 87575119b8 Update Localizable.strings 2022-06-12 05:19:53 +03:00
dayanch96 90468a2b69 YTCastConfirm 2022-06-12 05:19:26 +03:00
dayanch96 29c7f279ae Possibility of localization YTCastConfirm 2022-06-12 05:17:32 +03:00
dayanch96 e870be2f52 Create Localizable.strings 2022-06-12 05:11:27 +03:00
Nguyễn Đạt 772cc2af2e Merge pull request #203 from 5jd/main
Add French translation
2022-06-11 21:08:51 +07:00
5jd 9e3065fac6 Forgot an accent! 2022-06-11 15:37:24 +02:00
5jd 5db4a43777 Add French translation 2022-06-11 15:26:44 +02:00
qnblackcat 7ab7b499d7 added Localization temple. Translations are welcome 2022-06-10 22:50:22 +07:00
qnblackcat c922424d53 who read this tho? 2022-06-10 22:49:40 +07:00
Nguyễn Đạt f1b540af8b Create buildapp_release.yml 2022-06-10 13:19:45 +07:00
Nguyễn Đạt 9afaddb2e0 Merge pull request #200 from ISnackable/ISnackable-patch-1
Update buildapp.yml to upload Artifact
2022-06-10 13:13:05 +07:00
Tommy b7f6c21353 Update buildapp.yml to upload Artifact 2022-06-10 12:37:07 +08:00
Tommy 8e4293f7a1 Update buildapp.yml to upload Artifact 2022-06-10 12:21:41 +08:00
Nguyễn Đạt 573dfa1d67 added buildapp Github action
# Original idea by @ISnackable. Thanks to him for handling the hardest parts!
# https://github.com/ISnackable/CercubePlus/blob/main/.github/workflows/Build.yml
2022-06-09 16:25:07 +07:00
qnblackcat 5d2cc93f56 fix compiling via Github action 2022-06-09 16:08:45 +07:00
qnblackcat 42959eb9fb update .gitignore 2022-06-09 16:08:25 +07:00
qnblackcat aa139dffa8 Guess I'm done with OLED Darkmode 2022-06-09 16:08:11 +07:00
qnblackcat 6520ae2d53 remove unnecessary codes 2022-06-09 07:14:47 +07:00
qnblackcat 4bfb78634f update Header.h 2022-06-09 07:14:24 +07:00
qnblackcat 78fbf1dc6b update submodules 2022-06-09 07:14:13 +07:00
qnblackcat 3dcf4f290f uYouPlus: added Vietnamese 2022-06-08 10:21:39 +07:00
qnblackcat 85ddb15d38 Added Localizations support, improved OLED Darkmode 2022-06-08 10:19:53 +07:00
qnblackcat 5948dac548 Added Localizations support 2022-06-08 10:19:38 +07:00
qnblackcat 070647ecd5 update submodules 2022-06-07 12:52:52 +07:00
qnblackcat b7328028aa typo 2022-06-06 11:04:05 +07:00
qnblackcat 79f058f354 v17.22.3-2.1 2022-06-06 10:44:31 +07:00
qnblackcat 26b5912495 improved OLED Darkmode 2022-06-06 10:42:41 +07:00
qnblackcat f029b9a372 update Header.h 2022-06-06 10:41:44 +07:00
qnblackcat ecf3107846 update submodules 2022-06-06 10:25:12 +07:00
qnblackcat 93397e48d7 Enable Shorts scroll bar - credit level3tjg 2022-06-05 10:27:25 +07:00
qnblackcat b83081fd57 v17.21.3-2.1 2022-06-01 22:26:49 +07:00
qnblackcat c74b5203f7 added IAmYouTube (credit: PoomSmart) 2022-06-01 21:52:06 +07:00
qnblackcat 920b7c4882 update description 2022-05-29 10:12:21 +07:00
qnblackcat d469f31270 fixed #179 2022-05-29 10:09:20 +07:00
qnblackcat f910c416ef v17.20.3-2.1 2022-05-25 13:04:32 +07:00
qnblackcat fb0e5073ae temporary fix for issue #54 2022-05-24 01:13:41 +07:00
qnblackcat f9e05fee77 update submodules 2022-05-24 01:12:42 +07:00
qnblackcat ec7eec660b fix YTCastconfirm, code clean up 2022-05-21 12:51:11 +07:00
qnblackcat 2e6c19c060 update description 2022-05-21 12:50:50 +07:00
qnblackcat bb3b8ed310 v17.19.3-2.1 2022-05-20 21:44:58 +07:00
qnblackcat b94a5cc967 hide Previous/Next button 2022-05-20 21:38:33 +07:00
qnblackcat 8b50a3c1b7 more? 2022-05-20 21:29:30 +07:00
qnblackcat 025dc4d2cb update submodules 2022-05-20 20:58:46 +07:00
qnblackcat 9860fdb4e8 v17.19.2-2.1-F3 2022-05-17 10:07:23 +07:00
qnblackcat 5e9d719882 fix app crash upon launching on some devices 2022-05-17 09:44:54 +07:00
qnblackcat f63cfa8b43 update Makefile 2022-05-17 09:43:12 +07:00
qnblackcat 37b6b1e07e update description 2022-05-17 09:43:01 +07:00
qnblackcat 1827ece773 v17.19.2-2.1 2022-05-16 17:31:50 +07:00
qnblackcat f9e98fa04d update submodules 2022-05-16 16:52:25 +07:00
qnblackcat 2c5d0545d7 added YTMiniPlayerEnabler by level3tjg 2022-05-16 11:56:29 +07:00
qnblackcat 3c33e6fed0 update Header.h 2022-05-16 11:55:33 +07:00
qnblackcat daa004d027 update Makefile 2022-05-16 11:55:24 +07:00
qnblackcat 556f4dd8cf update submodules 2022-05-16 10:21:16 +07:00
qnblackcat 68855e71bf update description 2022-05-10 20:48:40 +07:00
qnblackcat 8fcf17572d colored things that should be colored :/ 2022-05-10 20:38:25 +07:00
qnblackcat 94c58965c7 update Makefile 2022-05-10 20:10:04 +07:00
qnblackcat 5e7b7717ff remove old codes 2022-05-10 20:09:47 +07:00
Nguyễn Đạt 1a99fa819e Merge pull request #149 from BandarHL/main
Update OLED Dark mode: code clean up, better performance.
2022-05-10 19:39:12 +07:00
BandarHelal 0c8376fc60 Update OLED Dark mode feature
well, instead of hooking every view for YouTube to change the color, you can achieve the same results with less code by hooking the Color palette (YTColorPalette).
2022-05-09 23:39:02 +03:00
qnblackcat 5b70271968 v17.18.4-2.1 2022-05-09 15:44:59 +07:00
qnblackcat 968dc841ee improvement 2022-05-09 15:39:34 +07:00
qnblackcat ada2c00338 reorder settings 2022-05-09 15:36:21 +07:00
qnblackcat 0e2ec9a52e Create a new setting category for uYouPlus (by BandarHL), update toggle's description 2022-05-08 11:09:18 +07:00
qnblackcat 274abee25d OLED keyboard (by @ichitaso), code cleanup 2022-05-08 11:08:24 +07:00
Nguyễn Đạt 5b920d7353 Merge pull request #147 from BandarHL/main
Update YouPiP and create new settings category for uYouPlus
2022-05-08 00:31:26 +07:00
BandarHelal 34e34a4fef Move uYouPlus settings to new setting category 2022-05-07 20:04:36 +03:00
BandarHelal 3e4264e3c7 Update YouPiP 2022-05-07 19:53:13 +03:00
qnblackcat e3d779cbf2 code clean up 2022-05-04 11:10:19 +07:00
qnblackcat 314efca54b avoid layoutSubviews 2022-05-04 11:10:06 +07:00
qnblackcat feaeb234cc update .gitignore 2022-05-04 11:09:40 +07:00
Nguyễn Đạt 4502236d64 Merge pull request #138 from PoomSmart/format-cleanup
Code formatting cleanup
2022-05-03 10:52:05 +07:00
PoomSmart 3154b51cf6 Code formatting cleanup 2022-05-03 10:41:26 +07:00
Nguyễn Đạt 4f99b08a63 v17.17.4-2.1 2022-05-02 11:41:57 +07:00
qnblackcat ae1dc1a701 bump version 2022-05-01 03:05:57 +07:00
qnblackcat f1eb708e08 update submodules 2022-04-28 21:52:37 +07:00
qnblackcat 9298cadbf8 clean up 2022-04-28 21:51:30 +07:00
qnblackcat efe8670c51 update description 2022-04-28 21:50:52 +07:00
qnblackcat fb5781865c clean up 2022-04-28 21:47:55 +07:00
qnblackcat afb6bd9842 update buildapp script 2022-04-27 12:45:26 +07:00
qnblackcat 8ee749dad1 add Open in YouTube Extensions 2022-04-27 12:44:27 +07:00
qnblackcat a38e37f6e9 darker? 2022-04-27 12:27:39 +07:00
qnblackcat ff5167af99 v17.16.4-2.1 2022-04-26 00:56:42 +07:00
qnblackcat 62b0168cff update submodules 2022-04-25 17:25:36 +07:00
qnblackcat 5d87e7ee1c update description 2022-04-25 17:03:00 +07:00
qnblackcat 6330c15d2e update submodule 2022-04-25 16:29:01 +07:00
qnblackcat de4f2f7373 clean up code 2022-04-24 22:23:05 +07:00
qnblackcat 67aba1f2ad added YTCastConfirm (JamieBerghmans), hide CC, Autoplay... 2022-04-24 22:22:08 +07:00
qnblackcat d89b146e3d v17.15.2-2.1 2022-04-22 20:21:04 +07:00
qnblackcat 0e2a4049c2 update submodules 2022-04-21 22:10:27 +07:00
qnblackcat 94b62ba4d3 update description 2022-04-21 22:08:08 +07:00
Nguyễn Đạt a3165878aa darker? 2022-04-21 11:08:48 +07:00
qnblackcat 702406f87f fix crash on iPad cz i'm suck 2022-04-19 21:36:21 +07:00
qnblackcat 32bd36c423 bug fix 2022-04-19 17:57:52 +07:00
qnblackcat 82d7c39fdb v17.15.1-2.1 2022-04-19 09:23:50 +07:00
qnblackcat 4119cc4796 darker... 2022-04-19 09:14:32 +07:00
qnblackcat 9763459838 BigYTMiniPlayer (Galactic-dev, YTReExplore (PoomSmart) 2022-04-19 08:52:20 +07:00
qnblackcat ef0c1a8930 update Makefile 2022-04-18 23:23:05 +07:00
qnblackcat ca57262430 YTAutoFullScreen (PoomSmart), hide HUD messages, OLED Dark mode 2022-04-18 23:22:21 +07:00
qnblackcat 83c685c28f v17.14.2-2.1 2022-04-13 12:52:55 +07:00
qnblackcat 766ff8b142 add YTSpeed 2022-04-13 09:57:10 +07:00
qnblackcat c83dd8f5ea don't remove the uYou folder :/ 2022-04-02 15:20:37 +07:00
qnblackcat 5d6d1c0f23 uYou folder 2022-04-02 15:20:08 +07:00
qnblackcat 6e7aa03b55 v17.12.5-2.1 2022-04-02 14:00:13 +07:00
qnblackcat 2aca730640 v17.12.5-2.1 2022-04-01 19:28:39 +07:00
37 changed files with 2271 additions and 198 deletions
+6 -2
View File
@@ -9,11 +9,13 @@ assignees: ''
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️ ## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️
_Make sure you complete the template. Otherwise, it will be closed without further explanation!_
### Device info ### Device info
- iOS/iPadOS version: - iOS/iPadOS version:
- Device model: - Device model:
- Sideload tool (Ex: AltStore, Sideloadly...) - Sideload tool (Ex: AltStore, Sideloadly...)
- Version of uYouPlus: - Version of uYouPlus: _**latest** or **newest** is NOT a version number!!_
### Describe the bug ### Describe the bug
@@ -25,5 +27,7 @@ _(Please attach videos or screenshots if possible)_
### Crash log (if possible) ### Crash log (if possible)
_(The crash log can be found in the Settings app - Privacy - Analytics & Improvements - Analytics Data - Youtube...)_ _(The crash log can be found in the Settings app - Privacy - Analytics & Improvements - Analytics Data - Youtube...)_
### Does the issue happen with the official YouTube from AppStore?
_(Well, YouTube itself is buggy sometimes...)_
### Additional context: ### Additional context:
+143
View File
@@ -0,0 +1,143 @@
# Original idea by @ISnackable. Thanks to him for handling the hardest parts!
# https://github.com/ISnackable/CercubePlus/blob/main/.github/workflows/Build.yml
name: Build and Release uYouPlus
on:
workflow_dispatch:
inputs:
uyou_version:
description: "The version of uYou"
default: "2.1"
required: false
type: string
decrypted_youtube_url:
description: "The direct URL to the decrypted YouTube ipa"
default: ""
required: true
type: string
youtube_version:
description: "The version of YouTube"
default: ""
required: true
type: string
create_release:
description: "Create a draft release"
default: false
required: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build uYouPlus
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout Main
uses: actions/checkout@v3
with:
path: main
submodules: recursive
- name: Install Dependencies
run: brew install ldid dpkg
- name: Setup Theos
uses: actions/checkout@v3
with:
repository: theos/theos
ref: master
path: theos
submodules: recursive
- name: Download iOS 15.5 SDK
run: |
svn checkout -q https://github.com/chrisharper22/sdks/trunk/iPhoneOS15.5.sdk
mv *.sdk $THEOS/sdks
env:
THEOS: ${{ github.workspace }}/theos
- name: Setup Theos Jailed
uses: actions/checkout@v3
with:
repository: kabiroberai/theos-jailed
ref: master
path: theos-jailed
submodules: recursive
- name: Install Theos Jailed
run: |
./theos-jailed/install
env:
THEOS: ${{ github.workspace }}/theos
- name: Download uYou & prepare YouTube iPA
run: |
curl "https://raw.githubusercontent.com/Muirey03/RemoteLog/master/RemoteLog.h" --output "$THEOS/include/RemoteLog.h"
curl "https://miro92.com/repo/debs/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" --output "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb"
wget "$YOUTUBE_URL" --no-verbose -O ./main/YouTube.ipa
dpkg-deb -x "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" ./main/Tweaks/uYou/
unzip -q ./main/YouTube.ipa -d ./main/tmp
rm -rf ./main/tmp/Payload/YouTube.app/PlugIns/*
cp -R ./main/Extensions/*.appex ./main/tmp/Payload/YouTube.app/PlugIns
env:
THEOS: ${{ github.workspace }}/theos
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_URL: ${{ inputs.decrypted_youtube_url }}
- name: Fix compiling && Build Package
id: build_package
run: |
cd ${{ github.workspace }}/main
(cd ${{ github.workspace }}/main/Tweaks/YouPiP && sed -i '' "14s/$/ AVFoundation UIKit/" Makefile)
make package FINALPACKAGE=1
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
echo "::set-output name=package::$(ls -t packages | head -n1)"
env:
THEOS: ${{ github.workspace }}/theos
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
- name: Upload Artifact
uses: actions/upload-artifact@v3
env:
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
if-no-files-found: error
- name: Create Release
if: ${{ inputs.create_release }}
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
release_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
draft: true
prerelease: false
- name: Upload Release Asset
if: ${{ inputs.create_release }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
asset_name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa
asset_content_type: application/vnd.debian.binary-package
+4 -3
View File
@@ -1,6 +1,7 @@
.theos .theos
.DS_Store .DS_Store
packages packages/
obj tmp/
Tweaks/uYou/* Tweaks/uYou/*
!Tweaks/uYou/.gitkeep !Tweaks/uYou/.gitkeep
Resources/
+8
View File
@@ -26,3 +26,11 @@
path = Tweaks/PSHeader path = Tweaks/PSHeader
url = https://github.com/PoomSmart/PSHeader.git url = https://github.com/PoomSmart/PSHeader.git
branch = master 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
Submodule
+1
Submodule Extensions added at a68d70883d
+97
View File
@@ -0,0 +1,97 @@
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define YT_BUNDLE_ID @"com.google.ios.youtube"
#define YT_NAME @"YouTube"
// IAmYouTube
@interface SSOConfiguration : NSObject
@end
// uYouPlus
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
- (void)confirmAlertDidPressConfirm;
@end
@interface YTMainAppControlsOverlayView : UIView
@end
@interface YTTransportControlsButtonView : UIView
@end
@interface _ASCollectionViewCell : UICollectionViewCell
- (id)node;
@end
@interface YTAsyncCollectionView : UICollectionView
- (void)removeShortsAndFeaturesAdsAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface FRPSliderCell : UITableViewCell
@end
@interface boolSettingsVC : UIViewController
@end
@interface PlayerManager : NSObject
- (float)progress;
@end
// iOS16 fix
@interface OBPrivacyLinkButton : UIButton
- (instancetype)initWithCaption:(NSString *)caption
buttonText:(NSString *)buttonText
image:(UIImage *)image
imageSize:(CGSize)imageSize
useLargeIcon:(BOOL)useLargeIcon
displayLanguage:(NSString *)displayLanguage;
@end
// uYouLocal fix
@interface YTLocalPlaybackController : NSObject
- (id)activeVideo;
@end
// BigYTMiniPlayer
@interface YTMainAppVideoPlayerOverlayView : UIView
- (UIViewController *)_viewControllerForAncestor;
@end
@interface YTWatchMiniBarView : UIView
@end
// YTAutoFullScreen
@interface YTPlayerViewController (YTAFS)
- (void)autoFullscreen;
@end
// OLED Darkmode
@interface ASWAppSwitcherCollectionViewCell : UIView
@end
@interface ASScrollView : UIView
@end
@interface UIKeyboardLayoutStar : UIView
@end
@interface UIKeyboardDockView : UIView
@end
@interface _ASDisplayView : UIView
@end
@interface YTCommentDetailHeaderCell : UIView
@end
@interface SponsorBlockSettingsController : UITableViewController
@end
@interface SponsorBlockViewController : UIViewController
@end
@interface UICandidateViewController : UIViewController
@end
@interface UIPredictionViewController : UIViewController
@end
+11 -8
View File
@@ -1,6 +1,6 @@
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 TARGET = iphone:clang:latest:13.0
uYouPlus_USE_FLEX = 0 uYouPlus_USE_FLEX = 0
uYouPlus_USE_FISHHOOK = 0
ARCHS = arm64 ARCHS = arm64
MODULES = jailed MODULES = jailed
FINALPACKAGE = 1 FINALPACKAGE = 1
@@ -10,21 +10,24 @@ TWEAK_NAME = uYouPlus
DISPLAY_NAME = YouTube DISPLAY_NAME = YouTube
BUNDLE_ID = com.google.ios.youtube BUNDLE_ID = com.google.ios.youtube
uYouPlus_FILES = uYouPlus.x 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_IPA = /path/to/decrypted/YouTube/IPA uYouPlus_FILES = uYouPlus.xm Settings.xm
### Important: edit the path to your decrypted YouTube IPA!!! uYouPlus_IPA = ./tmp/Payload/YouTube.app
uYouPlus_FRAMEWORKS = UIKit Security
uYouPlus_CFLAGS = -fobjc-arc
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 SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTSpeed
include $(THEOS_MAKE_PATH)/aggregate.mk include $(THEOS_MAKE_PATH)/aggregate.mk
before-package:: before-package::
@tput setaf 4 && echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m" @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/ \; @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/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/
@cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/ @cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/
@cp -R Tweaks/uYou/Library/Application\ Support/uYouBundle.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" @cp -R lang/uYouPlus.bundle Resources/
@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/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 @codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
+60 -63
View File
@@ -1,6 +1,5 @@
![cydia-1900000830-iphone-0-1628105716 3](https://user-images.githubusercontent.com/52943116/135612614-3d3138cb-2a3d-4ed1-9244-905bab8f5c9f.PNG) ![cydia-1900000830-iphone-0-1628105716 3](https://user-images.githubusercontent.com/52943116/135612614-3d3138cb-2a3d-4ed1-9244-905bab8f5c9f.PNG)
# Table of Contents # Table of Contents
* [Credits](#credits) * [Credits](#credits)
@@ -10,27 +9,31 @@
* [Installation](#installation) * [Installation](#installation)
* [Support the developers!](#support-the-developers) * [Support the developers!](#support-the-developers)
* [FAQ](#faq) * [FAQ](#faq)
* [Building (optional)](#building-optional) * [Building](#building-optional)
# 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).
- [Lillie](https://github.com/LillieWeeb001), [PoomSmart](https://twitter.com/poomsmart?s=21) and [kirb](https://twitter.com/hbkirb?s=21) for [YouTube Dislike Return](https://github.com/PoomSmart/Return-YouTube-Dislikes)
- [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, see [Version info - Download](#download) for more details.
- [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), [YTMiniplayerEnabler](https://github.com/level3tjg/YTMiniplayerEnabler) and many hot patches for uYou.
- [Al4ise](https://github.com/Al4ise) for [Azule](https://github.com/Al4ise/Azule), a tool used to inject jailbreak tweaks into jailed iOS apps. - [BandarHL](https://twitter.com/bandarhl) for a bunch of improvements.
- [Julioverne](https://twitter.com/ijulioverne) for the solution to skip Google's safety warning when logging in.
- [Lyvendia](https://github.com/Lyvendia/) for [YTSpeed](https://github.com/Lyvendia/YTSpeed/)
- [YouTube Extensions](https://github.com/CokePokes/YoutubeExtensions) by [CokePokes](https://github.com/CokePokes/).
- [theos team](https://github.com/theos/theos) for theos & theos-jailed. - [theos team](https://github.com/theos/theos) for theos & theos-jailed.
- Thanks to all the translators who have contributed to uYouPlus. Your contribution is highly appreciated!
# Features # Features
@@ -43,17 +46,24 @@
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. 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.
<details> <details>
<summary>And more...!</summary> <summary>And many more...!</summary>
5. **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. 5. **YTAutoFullScreen:** autoplay videos at full screen.
6. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos. 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.
7. **YTSystemAppearance**: sync the YouTube theme (dark/light) with the system theme. 7. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
8. **YTNoCheckLocalNetwork**: block the Local Network permission popup. 8. **YTNoCheckLocalNetwork**: block the Local Network permission popup.
9. **YouRememberCaption**: make YouTube remember your video caption setting (if not already). 9. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
10. **NoYTPremium**: remove YouTube Premium upshells.
11. **YTSpeed**: add 2.25, 2.5, 2.75, and 3x playback speed
12. **YTMiniplayerEnabler**: enable Miniplayer for all YouTube videos.
</details> </details>
# Known issues # Known issues
@@ -62,36 +72,44 @@
- Issues that related to **uYouPlus** are [here](https://github.com/qnblackcat/uYouPlus/issues/) - Issues that related to **uYouPlus** are [here](https://github.com/qnblackcat/uYouPlus/issues/)
# Download # Download
- **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). - **uYouPlus** (or you can call it uYou+) requires iOS or iPadOS 13.0 or later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases).
- For AltStore user: - For AltStore user:
- My official AtlStore repo: https://qnblackcat.github.io/AltStore/ - My official AltStore repo: https://qnblackcat.github.io/AltStore/
- [Open in AltStore (v17.09.1-2.1)](https://tinyurl.com/5fdk22pk) - It will take a while to install because AltStore needs to download the IPA. - [Open in AltStore (v17.34.3-2.1)](https://tinyurl.com/3vjyvwwe) - It will take a while to install because AltStore needs to download the IPA.
- Version info: _(last update: Mar 08)_ - Version info: _(last update: Sep 01)_
<details> <details>
<summary> Expand</summary> <summary>Expand</summary>
| **Tweaks/App** | **Version** | **Open source** | | **Tweaks/App** | **Developer** | **Version** | **Open source** |
| :------------: | :----------:| :-------------: | | - | - | :-: | :-: |
| **YouTube** | 17.09.1 | ✖︎ | | **YouTube** | Google Inc | 17.34.3 | ✖︎ |
| **uYou** | 2.1 | ✖︎ | | [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
| **Return YouTube Dislike** | 1.6.3 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) | | [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
| **iSponsorBlock** | 1.0-13 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) | | **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
| **Alderis Color Picker** | 1.1.2| [✔︎](https://github.com/hbang/Alderis) | | **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
| **YouRememberCaption** | 1.0.0 | [✔︎](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/) | | **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
| **YTClassicVideoQuality** | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) | | **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
| **YTNoCheckLocalNetwork** | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) | | **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
| **YTNoHoverCards** | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) | | **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
| **YTSystemAppearance** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) | | **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
| **YTUHD** | 1.2.6 | [✔︎](https://github.com/PoomSmart/YTUHD) | | **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.9 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | 1.6.8 | [✔︎](https://github.com/PoomSmart/YouPiP) | | **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.9 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
| **YTReExplore** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
| **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
| **YTNoPaidPromo** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
| **YTAutoFullScreen** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
| **YouRememberCaption** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) |
| **YTClassicVideoQuality** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) |
| **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.6.6 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
| **YTNoCheckLocalNetwork** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
</details> </details>
@@ -99,35 +117,14 @@
See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation) See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation)
# Support the developers # Support the developers
- [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support
<details> - [**Poomsmart**](https://twitter.com/poomsmart): https://poomsmart.github.io
<summary>MiRO92</summary> - [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg
- [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL
- CashApp: https://cash.app/$MiRO92M - [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne
- [**Galactic-dev**](https://twitter.com/dev_galactic):
- Other payment methods are available in uYou's settings. - Paypal: https://www.paypal.com/paypalme/DBrett684
</details> - Venmo: https://venmo.com/u/DavidBrett
<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>
<details>
<summary>Lillie</summary>
- Patreon: https://patreon.com/lillieweeb
</details>
# FAQ # FAQ
+200
View File
@@ -0,0 +1,200 @@
#import "Tweaks/YouTubeHeader/YTSettingsViewController.h"
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
#import "Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
#import "Header.h"
@interface YTSettingsSectionItemManager (YouPiP)
- (void)updateuYouPlusSectionWithEntry:(id)entry;
@end
static const NSInteger uYouPlusSection = 500;
extern NSBundle *uYouPlusBundle();
extern BOOL hideHUD();
extern BOOL oled();
extern BOOL oledKB();
extern BOOL autoFullScreen();
extern BOOL hideHoverCard();
extern BOOL reExplore();
extern BOOL bigYTMiniPlayer();
extern BOOL hideCC();
extern BOOL hideAutoplaySwitch();
extern BOOL castConfirm();
extern BOOL ytMiniPlayer();
extern BOOL hidePreviousAndNextButton();
extern BOOL hidePaidPromotionCard();
// 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"];
NSBundle *tweakBundle = uYouPlusBundle();
YTSettingsSectionItem *killApp = [%c(YTSettingsSectionItem) // https://github.com/PoomSmart/YTABConfig/blob/b74d7f28151c407cffc21cce12908c49e9e65999/Tweak.x#L76
itemWithTitle:LOC(@"KILL_APP")
titleDescription:LOC(@"KILL_APP_DESC")
accessibilityIdentifier:nil
detailTextBlock:nil
selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) {
exit(0);
}];
YTSettingsSectionItem *replacePreviousAndNextButton = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"REPLACE_PREVIOUS_NEXT_BUTTON") titleDescription:LOC(@"REPLACE_PREVIOUS_NEXT_BUTTON_DESC")];
replacePreviousAndNextButton.hasSwitch = YES;
replacePreviousAndNextButton.switchVisible = YES;
replacePreviousAndNextButton.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"replacePreviousAndNextButton_enabled"];
replacePreviousAndNextButton.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"replacePreviousAndNextButton_enabled"];
return YES;
};
YTSettingsSectionItem *fixGoogleSigin = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"FIX_GOOGLE_SIGNIN") titleDescription:LOC(@"FIX_GOOGLE_SIGNIN_DESC")];
fixGoogleSigin.hasSwitch = YES;
fixGoogleSigin.switchVisible = YES;
fixGoogleSigin.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"fixGoogleSigin_enabled"];
fixGoogleSigin.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"fixGoogleSigin_enabled"];
return YES;
};
YTSettingsSectionItem *hidePaidPromotionCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PAID_PROMOTION_CARDS") titleDescription:LOC(@"HIDE_PAID_PROMOTION_CARDS_DESC")];
hidePaidPromotionCard.hasSwitch = YES;
hidePaidPromotionCard.switchVisible = YES;
hidePaidPromotionCard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePaidPromotionCard_enabled"];
hidePaidPromotionCard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePaidPromotionCard_enabled"];
return YES;
};
YTSettingsSectionItem *hidePreviousAndNextButton = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON") titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC")];
hidePreviousAndNextButton.hasSwitch = YES;
hidePreviousAndNextButton.switchVisible = YES;
hidePreviousAndNextButton.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePreviousAndNextButton_enabled"];
hidePreviousAndNextButton.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePreviousAndNextButton_enabled"];
return YES;
};
YTSettingsSectionItem *ytMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"YT_MINIPLAYER") titleDescription:LOC(@"YT_MINIPLAYER_DESC")];
ytMiniPlayer.hasSwitch = YES;
ytMiniPlayer.switchVisible = YES;
ytMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"ytMiniPlayer_enabled"];
ytMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytMiniPlayer_enabled"];
return YES;
};
YTSettingsSectionItem *castConfirm = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"CAST_CONFIRM") titleDescription:LOC(@"CAST_CONFIRM_DESC")];
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 *hideHoverCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_HOVER_CARD") titleDescription:LOC(@"HIDE_HOVER_CARD_DESC")];
hideHoverCard.hasSwitch = YES;
hideHoverCard.switchVisible = YES;
hideHoverCard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHoverCards_enabled"];
hideHoverCard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHoverCards_enabled"];
return YES;
};
YTSettingsSectionItem *bigYTMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"NEW_MINIPLAYER_STYLE") titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC")];
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:LOC(@"YT_RE_EXPLORE") titleDescription:LOC(@"YT_RE_EXPLORE_DESC")];
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:LOC(@"HIDE_SUBTITLES_BUTTON") titleDescription:LOC(@"HIDE_SUBTITLES_BUTTON_DESC")];
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:LOC(@"HIDE_AUTOPLAY_SWITCH") titleDescription:LOC(@"HIDE_AUTOPLAY_SWITCH_DESC")];
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:LOC(@"AUTO_FULLSCREEN") titleDescription:LOC(@"AUTO_FULLSCREEN_DESC")];
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:LOC(@"HIDE_HUD_MESSAGES") titleDescription:LOC(@"HIDE_HUD_MESSAGES_DESC")];
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:LOC(@"OLED_DARKMODE") titleDescription:LOC(@"OLED_DARKMODE_DESC")];
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:LOC(@"OLED_KEYBOARD") titleDescription:LOC(@"OLED_KEYBOARD_DESC")];
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:@[killApp, autoFull, castConfirm, ytMiniPlayer, fixGoogleSigin, hideAutoplaySwitch, hideCC, hideHUD, hidePaidPromotionCard, hidePreviousAndNextButton, hideHoverCard, bigYTMiniPlayer, oledDarkMode, oledKeyBoard, replacePreviousAndNextButton, 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
+1
Submodule Tweaks/YTSpeed added at 3fec2dfcf0
View File
+30 -15
View File
@@ -1,37 +1,52 @@
#!/bin/bash #!/bin/bash
# Thanks Al4ise for his support # Thanks Al4ise for his support
cd "$(dirname "$0")" cd "$(dirname "$0")"
# Check uYou # Check uYou
if [[ ! -f Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb ]] if [ ! -f Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb ]
then then
echo -e "==> \033[1muYou v2.1 is not found. Downloading uYou (v2.1)...\033[0m" 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) (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 else
echo -e "==> \033[1mFounded uYou (v2.1)!\033[0m" echo -e "==> \033[1mFounded uYou (v2.1)!\033[0m"
fi fi
# Extract uYou # Extract uYou
echo -e "==> \033[1mExtracting uYou...\033[0m" 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.*) if (cd Tweaks/uYou && tar -xf com.miro.uyou_2.1_iphoneos-arm.deb && tar -xf data.tar.*)
then then
echo -e "\033[1m> Extracted uYou!\033[0m" echo -e "\033[1m> Extracted uYou!\033[0m"
else else
echo "> \033[1mCouldn't extract uYou\033[0m" echo "> \033[1mCouldn't extract uYou\033[0m"
fi fi
# Makefile # Makefile
read -e -p "==> Path to the decrypted YouTube iPA: " PATHTOIPA if [ -d ./tmp ]
if [[ $PATHTOIPA == *.ipa ]] then
rm -rf ./tmp
fi
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
if [[ $PATHTOYT == *.ipa ]]
then then
sed -i '' "14s#.*#uYouPlus_IPA = $PATHTOIPA#g" ./Makefile 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 make package
open ./packages open ./packages
else else
echo "This is not an iPA" echo "This is not an ipa/app!"
fi fi
# Clean up # Clean up
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m" tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
find Tweaks/uYou -mindepth 1 -name com.miro.uyou_2.1_iphoneos-arm.deb -prune -o -exec rm -rf {} + find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
rm -rf Resources .theos/_/Payload rm -rf tmp/ Resources .theos/_/Payload
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "إغلاق تطبيق يوتيوب";
"KILL_APP_DESC" = "المس هنا لإغلاق تطبيق يوتيوب!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "إخفاء زر السابق والتالي";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "إخفاء زرّي السابق والتالي من أزرار التحكم على الفيديو.";
"YT_MINIPLAYER" = "السماح بالمشغل المصغّر لكل فيديوهات يوتيوب";
"YT_MINIPLAYER_DESC" = "عند تصغير فيديوهات الأطفال مثلاً (قبل إغلاق المقطع).";
"CAST_CONFIRM" = "التأكيد قبل البث (أداة YTCastConfirm)";
"CAST_CONFIRM_DESC" = "إظهار تنبيه للتأكيد قبل البث، من أجل منع البث للتلفاز عن طريق الخطأ.";
"HIDE_HOVER_CARD" = "إخفاء صور المقاطع الأخرى في نهاية المقاطع (أداة YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "إخفاء الصور المصغرة الظاهرة على مشغل الفيديو في نهاية المقطع.";
"NEW_MINIPLAYER_STYLE" = "تغيير شكل المشغّل المصغر (أداة BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "تغيير شكل المشغّل المصغر في الآيفون إلى نفس شكله في الآيباد - تتطلب إغلاق التطبيق وإعادة فتحه.";
"YT_RE_EXPLORE" = "استبدال تبويب Shorts بتبويب Explore (أداة YTReExplore)";
"YT_RE_EXPLORE_DESC" = " تتطلب إغلاق التطبيق وإعادة فتحه.";
"HIDE_SUBTITLES_BUTTON" = "إخفاء زر الترجمة";
"HIDE_SUBTITLES_BUTTON_DESC" = "إخفاء زر الترجمة من أزرار التحكم على الفيديو.";
"HIDE_AUTOPLAY_SWITCH" = "إخفاء زر التشغيل التلقائي";
"HIDE_AUTOPLAY_SWITCH_DESC" = "إخفاء زر التشغيل التلقائي من أزرار التحكم على الفيديو.";
"AUTO_FULLSCREEN" = "كامل الشاشة تلقائياً (أداة YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "تشغيل الفيديوهات تلقائياً بكامل الشاشة.";
"HIDE_HUD_MESSAGES" = "إخفاء رسائل المعلومات";
"HIDE_HUD_MESSAGES_DESC" = "مثلاً: تم إيقاف الترجمة...";
"OLED_DARKMODE" = "وضغ داكن OLED (ميزة تجريبية)";
"OLED_DARKMODE_DESC" = "قد لا تعمل في كل الحالات. يجب إعادة تشغيل التطبيق عند تشغيل أو إيقاف هذه الخاصية.";
"OLED_KEYBOARD" = "لوحة مفاتيح داكنة OLED (ميزة تجريبية)";
"OLED_KEYBOARD_DESC" = "قد لا تعمل في كل الحالات. يجب إعادة تشغيل التطبيق عند تشغيل أو إيقاف هذه الخاصية.";
"HIDE_PAID_PROMOTION_CARDS" = "إخفاء شريط الترويج المدفوع";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "إخفاء عبارة يتضمن ترويجاً مدفوعاً الظاهرة على بعض الفيديوهات.";
// YTCastConfirm
"CASTING" = "البث";
"MSG_ARE_YOU_SURE" = "هل أنت متأكد أنك تريد بدء البث؟";
"MSG_YES" = "نعم";
"MSG_CANCEL" = "إلغاء";
@@ -0,0 +1,58 @@
// How to translate uYouPlus to your languate:
//
// 1. Fork uYouPlus repo
// 2. Duplicate the template.lproj folder, and edit the duplicated folder's name to your <lang_code>.lproj id.
// For example: <ru.lproj> for Russia. For more details, visit: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
// 3. Translate each line below after each =
// 4. Open a Pull Request
//
// If your language already exists then feel free to check it and/or improve it!
// You can also add your localiztion to YouPiP here, the process is the same
// https://github.com/PoomSmart/YouPiP/tree/main/layout/Library/Application%20Support/YouPiP.bundle
//
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Skrýt tlačítka předchozí a následující";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Skryje tlačítka předchozí a následující v překrytí ovládání videa.";
"YT_MINIPLAYER" = "Povolit Minipřehrávač pro všechna videa";
"YT_MINIPLAYER_DESC" = "Například u videa pro děti";
"CAST_CONFIRM" = "Zobrazit potvrzení před začátkem sdílení obrazu (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Zobrazí potvrzení aby se zamezilo nechtěnému sdílení do televize.";
"HIDE_HOVER_CARD" = "Skrýt karty na konci videa (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Skryje náhledy jiných videjí na konci videa.";
"NEW_MINIPLAYER_STYLE" = "Nový styl minipřehrávače (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Je potřeba restart aplikace.";
"YT_RE_EXPLORE" = "Nahradit záložku Shorts tab záložkou Explore (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Je potřeba restart aplikace.";
"HIDE_SUBTITLES_BUTTON" = "Skrýt tlačítko titulky";
"HIDE_SUBTITLES_BUTTON_DESC" = "Skryje tlačítko titulky v překrytí ovládání videa.";
"HIDE_AUTOPLAY_SWITCH" = "Skrýt přepínač automatického přehrávání";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Skryje přepínač automatického přehrávání v překrytí ovládání videa.";
"AUTO_FULLSCREEN" = "Přes celou obrazovku (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Automaticky spouští videa přes celou obrazovku.";
"HIDE_HUD_MESSAGES" = "Skrýt vyskakující zprávy";
"HIDE_HUD_MESSAGES_DESC" = "Příklad: Titulky zapnuty/vypnuty, Smyčka videa zapnuta,...";
"OLED_DARKMODE" = "Tmavý OLED režim (Experimentální)";
"OLED_DARKMODE_DESC" = "Mohou se vyskytnout chyby. Je potřeba restart aplikace.";
"OLED_KEYBOARD" = "OLED Klávesnice (Experimentální)";
"OLED_KEYBOARD_DESC" = "Mohou se vyskytnout chyby. Je potřeba restart aplikace.";
"HIDE_PAID_PROMOTION_CARDS" = "Skrýt kartu placené propagace";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Skryje 'Obsahuje placenou propagaci' u některých videjí.";
// YTCastConfirm
"CASTING" = "Sdílení obrazu";
"MSG_ARE_YOU_SURE" = "Opravdu chcete začít sdílet obraz?";
"MSG_YES" = "Ano";
"MSG_CANCEL" = "Zrušit";
@@ -0,0 +1,46 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Vor- und Zurücktasten ausblenden";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Vor- und Zurückspultasten vom Videoplayer ausblenden.";
"YT_MINIPLAYER" = "Miniplayer für alle YT Videos aktivieren";
"YT_MINIPLAYER_DESC" = "z.B. bei Videos für Kinder";
"CAST_CONFIRM" = "Warnung vor TV-Übertragungen (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Zeigt eine Warnung an, um eine ausversehene TV-Übertragung zu verhindern.";
"HIDE_HOVER_CARD" = "Endkarten ausblenden (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Endkarten (Thumbnails) am Ende des Videos ausblenden.";
"NEW_MINIPLAYER_STYLE" = "Neuer Miniplayer Style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App-Neustart erforderlich!";
"YT_RE_EXPLORE" = "Shorts-Tab durch Entdecken-Tab ersetzen (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "App-Neustart erforderlich!";
"HIDE_SUBTITLES_BUTTON" = "Untertitel-Button ausblenden";
"HIDE_SUBTITLES_BUTTON_DESC" = "Untertitel-Button vom Videoplayer ausblenden.";
"HIDE_AUTOPLAY_SWITCH" = "Autoplay-Schalter ausblenden";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Autoplay-Schalter vom Videoplayer ausblenden.";
"AUTO_FULLSCREEN" = "Automatisches Vollbild (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Automatisch Videos im Vollbild starten.";
"HIDE_HUD_MESSAGES" = "HUD-Nachrichten ausblenden";
"HIDE_HUD_MESSAGES_DESC" = "z.B.: Untertitel sind akti-/deaktiviert, Videoschleife ist an, ...";
"OLED_DARKMODE" = "OLED-Dunkelmodus (Experimental)";
"OLED_DARKMODE_DESC" = "Könnte in manchen Fällen nicht richtig funktionieren. App-Neustart ist erforderlich, wenn diese Option akti-/deaktiviert wird!";
"OLED_KEYBOARD" = "OLED-Tastatur (Experimental)";
"OLED_KEYBOARD_DESC" = "Könnte in manchen Fällen nicht richtig funktionieren. App-Neustart erforderlich1";
"HIDE_PAID_PROMOTION_CARDS" = "Enthält bezahlte Werbung Info ausblenden";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Enthält bezahlte Werbung Infobanner bei manchen Videos ausblenden.";
// YTCastConfirm
"CASTING" = "TV-Übertragung";
"MSG_ARE_YOU_SURE" = "Sind Sie sicher, dass Sie mit der Videoübertragung beginnen wollen?";
"MSG_YES" = "Ja";
"MSG_CANCEL" = "Abbrechen";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί κατά την αναπαραγωγή βίντεο.";
"YT_MINIPLAYER" = "Ενεργοποιήστε το miniplayer για όλα τα βίντεο του YouTube";
"YT_MINIPLAYER_DESC" = "Τα παιδικά βίντεο για παράδειγμα.";
"CAST_CONFIRM" = "Επιβεβαιωτικό μήνυμα πριν γίνει Cast(YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Να φανεί ένα επιβεβαιωτικό μήνυμα πριν γίνει cast για να αποτρεπτεί η καταλάθως σύνδεση στην τηλεόραση.";
"HIDE_HOVER_CARD" = "Κρύψτε τις τελικές καρτέλες (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Κρύψτε τις τελικές καρτέλες από τους δημιουργούς (thumbnails) στο τέλος των βίντεο.";
"NEW_MINIPLAYER_STYLE" = "Καινούργιο miniplayer θέμα στην μπάρα (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";
"YT_RE_EXPLORE" = "Αντικατάσταση της καρτέλας Shorts με την καρτέλα Explore (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";
"HIDE_SUBTITLES_BUTTON" = "Κρύψτε το κουμπί των Υπότιτλων";
"HIDE_SUBTITLES_BUTTON_DESC" = "Κρύψτε το κουμπί των Υπότιτλων κατά την αναπαραγωγή βίντεο.";
"HIDE_AUTOPLAY_SWITCH" = "Κρύψτε τον διακόπτη της αυτόματης αναπαραγωγής";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Κρύψτε τον διακόπτη της αυτόματης αναπαραγωγής κατά την αναπαραγωγή βίντεο";
"AUTO_FULLSCREEN" = "Αυτόματη αναπαραγωγή σε πλήρη οθόνη (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Αυτόματη αναπαραγωγή των βίντεο σε πλήρη οθόνη.";
"HIDE_HUD_MESSAGES" = "Κρύψτε τα μηνύματα του HUD";
"HIDE_HUD_MESSAGES_DESC" = "Παράδειγμα: Οι Υπότιτλοι απενεργοποιήθηκαν/ενεργοποιήθηκαν...";
"OLED_DARKMODE" = "OLED Μαύρο θέμα (Experimental)";
"OLED_DARKMODE_DESC" = "Μπορεί να μην δουλέψει σε κάποιες περιπτώσεις. Απαιτείται επανεκκίνηση της εφαρμογής αφού το ενεργοποιήσετε/απενεργοποιήσετε.";
"OLED_KEYBOARD" = "OLED πληκτρολόγιο (Experimental)";
"OLED_KEYBOARD_DESC" = "Μπορεί να μην δουλέψει σε κάποιες περιπτώσεις. Απαιτείται επανεκκίνηση της εφαρμογής.";
// YTCastConfirm
"CASTING" = "Μετάδοση";
"MSG_ARE_YOU_SURE" = "Είστε σίγουροι ότι θέλενε να ξεκινήσετε την μετάδοση;";
"MSG_YES" = "Ναι";
"MSG_CANCEL" = "Ακύρωση";
@@ -0,0 +1,55 @@
// Settings
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Replace Previous and Next Button";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Replace Previous and Next Button with Fast forward and Rewind button. App restart is required.";
"FIX_GOOGLE_SIGNIN" = "Fix Google Sign in (for TrollStore user only)";
"FIX_GOOGLE_SIGNIN_DESC" = "Only works when the app was installed via TrollStore: Turn on this option so you can sign in with your Google account. App restart is required.";
"KILL_APP" = "Close YouTube";
"KILL_APP_DESC" = "Tap here to close YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Hide Previous and Next button";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide Previous and Next button in video controls overlay.";
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
"YT_MINIPLAYER_DESC" = "Kid videos for example.";
"CAST_CONFIRM" = "Confirm alert before casting (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Show a confirm alert before casting to prevent accidentally hijacking TV.";
"HIDE_HOVER_CARD" = "Hide End screens hover cards (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Hide creator End screens (thumbnails) at the end of videos.";
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "App restart is required.";
"HIDE_SUBTITLES_BUTTON" = "Hide Subtitles button";
"HIDE_SUBTITLES_BUTTON_DESC" = "Hide the Subtitles button in video controls overlay.";
"HIDE_AUTOPLAY_SWITCH" = "Hide Autoplay switch";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Hide the Autoplay switch in video controls overlay.";
"AUTO_FULLSCREEN" = "Auto Full Screen (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Autoplay videos at full screen.";
"HIDE_HUD_MESSAGES" = "Hide HUD Messages";
"HIDE_HUD_MESSAGES_DESC" = "Example: CC is turned on/off, Video loop is on,...";
"OLED_DARKMODE" = "OLED Dark mode (Experimental)";
"OLED_DARKMODE_DESC" = "Might not working correctly in some cases. App restart is required after you enable/disable this option.";
"OLED_KEYBOARD" = "OLED Keyboard (Experimental)";
"OLED_KEYBOARD_DESC" = "Might not working correctly in some cases. App restart is required.";
"HIDE_PAID_PROMOTION_CARDS" = "Hide Paid Promotion banner";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Hide the 'Includes Paid Promotions' banner in some videos.";
// YTCastConfirm
"CASTING" = "Castings";
"MSG_ARE_YOU_SURE" = "Are you sure you want to start casting?";
"MSG_YES" = "Yes";
"MSG_CANCEL" = "Cancel";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "Cerrar YouTube";
"KILL_APP_DESC" = "Toca aquí para cerrar YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ocultar el botón de Anterior y Siguiente";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ocultar el botón de Anterior y Siguiente en los botones superpuestos.";
"YT_MINIPLAYER" = "Activar el minirreproductor para todos los vídeos de YouTube";
"YT_MINIPLAYER_DESC" = "Vídeos infantiles por ejemplo.";
"CAST_CONFIRM" = "Alerta de confirmación antes de Enviar contenido (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Mostrar una alerta de confirmación antes de Enviar contenido para prevenir el secuestro accidental del TV.";
"HIDE_HOVER_CARD" = "Ocultar tarjetas flotantes en las pantallas finales (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Ocultar tarjetas flotantes del creador (miniaturas) al final de los vídeos.";
"NEW_MINIPLAYER_STYLE" = "Nuevo estilo de barra del minirreproductor (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Requiere reiniciar la app.";
"YT_RE_EXPLORE" = "Reemplazar pestaña de Cortos con pestaña de Explorar (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Requiere reiniciar la app.";
"HIDE_SUBTITLES_BUTTON" = "Ocultar botón de Subtítulos";
"HIDE_SUBTITLES_BUTTON_DESC" = "Ocultar el botón de Subtítulos en los botones superpuestos.";
"HIDE_AUTOPLAY_SWITCH" = "Ocultar interruptor de Reproducir automáticamente";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ocultar el interruptor de Reproducir automáticamente en los botones superpuestos.";
"AUTO_FULLSCREEN" = "Pantalla completa automática (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Reproducir vídeos en pantalla completa automáticamente.";
"HIDE_HUD_MESSAGES" = "Ocultar mensajes HUD";
"HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, Vídeo en bucle está activado,...";
"OLED_DARKMODE" = "Modo oscuro OLED (Experimental)";
"OLED_DARKMODE_DESC" = "Puede no funcionar correctamente en algunos casos. Requiere reiniciar la app después de activar/desactivar esta opción.";
"OLED_KEYBOARD" = "Teclado OLED (Experimental)";
"OLED_KEYBOARD_DESC" = "Puede no funcionar correctamente en algunos casos. Requiere reiniciar la app.";
"HIDE_PAID_PROMOTION_CARDS" = "Ocultar banner de contenido promocional";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Ocultar el banner de 'Incluye contenido promocional' en algunos vídeos.";
// YTCastConfirm
"CASTING" = "Enviar contenido";
"MSG_ARE_YOU_SURE" = "¿Estás seguro de que deseas Enviar contenido?";
"MSG_YES" = "Sí";
"MSG_CANCEL" = "Cancelar";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "Fermer YouTube";
"KILL_APP_DESC" = "Appuyez ici pour fermer YouTube !";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Masquer les boutons Précédent et Suivant";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Masquer les boutons Précédent et Suivant dans la superposition des contrôles vidéo";
"YT_MINIPLAYER" = "Activer le mini-lecteur pour toutes les vidéos YouTube";
"YT_MINIPLAYER_DESC" = "Vidéos pour enfants par exemple";
"CAST_CONFIRM" = "Confirmer l'alerte avant le casting (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Afficher une alerte de confirmation avant le casting pour éviter de déclancher accidentellement la télévision";
"HIDE_HOVER_CARD" = "Masquer les cartes de survol des écrans de fin (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Masquer les écrans de fin (vignettes) des créateurs à la fin des vidéos";
"NEW_MINIPLAYER_STYLE" = "Nouveau style de barre de mini-lecteur (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Un redémarrage de l'application est nécessaire";
"YT_RE_EXPLORE" = "Remplacer l'onglet Shorts par l'onglet Explorer (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Un redémarrage de l'application est nécessaire";
"HIDE_SUBTITLES_BUTTON" = "Bouton de masquage des sous-titres";
"HIDE_SUBTITLES_BUTTON_DESC" = "Masquer le bouton des sous-titres dans la superposition des contrôles vidéo";
"HIDE_AUTOPLAY_SWITCH" = "Masquer l'interrupteur de lecture automatique";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Masquer le bouton de lecture automatique dans la superposition des contrôles vidéo";
"AUTO_FULLSCREEN" = "Plein écran automatique (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Lecture automatique des vidéos en plein écran";
"HIDE_HUD_MESSAGES" = "Masquer les messages de l'ATH";
"HIDE_HUD_MESSAGES_DESC" = "Exemple : Les sous-titres sont activés/désactivés, la boucle vidéo est activée,...";
"OLED_DARKMODE" = "Mode sombre OLED (Expérimental)";
"OLED_DARKMODE_DESC" = "Peut ne pas fonctionner correctement dans certains cas. Un redémarrage de l'application est nécessaire après avoir activé/désactivé cette option.";
"OLED_KEYBOARD" = "Clavier OLED (Expérimental)";
"OLED_KEYBOARD_DESC" = "Peut ne pas fonctionner correctement dans certains cas. Un redémarrage de l'application est nécessaire.";
"HIDE_PAID_PROMOTION_CARDS" = "Masquer la bannière des communications commerciales";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Masque la bannière 'Inclut une communication commerciale' dans certaines vidéos.";
// YTCastConfirm
"CASTING" = "Castings";
"MSG_ARE_YOU_SURE" = "Êtes-vous sûr de vouloir commencer le casting ?";
"MSG_YES" = "Oui";
"MSG_CANCEL" = "Annuler";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "הסתר את הקודם והבא";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "הסתר את כפתורי הקודם והבא בתצוגת השליטה בסרטון.";
"YT_MINIPLAYER" = "אפשר את הנגן הקטן עבור כל הסרטונים ב-YouTube";
"YT_MINIPLAYER_DESC" = "סרטוני ילדים לדוגמה.";
"CAST_CONFIRM" = "התראת אישור לפני שידור לטלוויזיה (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "הצג התראת אישור לפני שידור לטלוויזיה כדי למנוע לחיצה בטעות.";
"HIDE_HOVER_CARD" = "הסתר כרטיסיות סיום סרטון (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "הסתר את מסכי הסיום של סרטונים המציגים את הערוץ וסרטונים נוספים.";
"NEW_MINIPLAYER_STYLE" = "עיצוב נגן קטן חדש (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "נדרש לפתוח מחדש את היישום.";
"YT_RE_EXPLORE" = "החלף את לשונית ה-Shorts בלשונית Explore (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "נדרש לפתוח מחדש את היישום.";
"HIDE_SUBTITLES_BUTTON" = "הסתר את כפתור הכתוביות";
"HIDE_SUBTITLES_BUTTON_DESC" = "הסתר את כפתור הכתוביות בתצוגת השליטה בסרטון.";
"HIDE_AUTOPLAY_SWITCH" = "הסתר את כפתור ההפעלה האוטומטית";
"HIDE_AUTOPLAY_SWITCH_DESC" = "הסתר את כפתור ההפעלה האוטומטית בתצוגת השליטה בסרטון.";
"AUTO_FULLSCREEN" = "מסך מלא אוטומטי (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "נגן סרטונים במסך מלא אוטומטית.";
"HIDE_HUD_MESSAGES" = "הסתר הודעות קופצות";
"HIDE_HUD_MESSAGES_DESC" = "לדוגמה: כתוביות מופעלות/מושבתות, הופעל סרטון בלופ,...";
"OLED_DARKMODE" = "תצוגה כהה OLED (נסיוני)";
"OLED_DARKMODE_DESC" = "עלול לא לעבוד נכון בחלק מהמקרים, נדרש לפתוח מחדש את היישום.";
"OLED_KEYBOARD" = "מקלדת כהה OLED (נסיוני)";
"OLED_DARKMODE_DESC" = "עלול לא לעבוד נכון בחלק מהמקרים, נדרש לפתוח מחדש את היישום.";
// YTCastConfirm
"CASTING" = "משדר";
"MSG_ARE_YOU_SURE" = "האם להתחיל לשדר?";
"MSG_YES" = "כן";
"MSG_CANCEL" = "ביטול";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "YouTubeを閉じる";
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "前後の動画のボタンを非表示";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "動画コントロールのオーバーレイで前後の動画のボタンを非表示にします。";
"YT_MINIPLAYER" = "すべての動画でミニプレーヤーを有効にする";
"YT_MINIPLAYER_DESC" = "例: 子ども向けの動画";
"CAST_CONFIRM" = "キャストする前に確認をする (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "誤ってテレビにキャストしないように、確認の警告を表示します。";
"HIDE_HOVER_CARD" = "動画終わりのホバーカードを非表示 (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "動画の最後のホバーカード(サムネイル)を非表示にします。";
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "アプリの再起動が必要です。";
"YT_RE_EXPLORE" = "ショートタブを探索タブに置き換える (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "アプリの再起動が必要です。";
"HIDE_SUBTITLES_BUTTON" = "字幕ボタンを非表示";
"HIDE_SUBTITLES_BUTTON_DESC" = "動画コントロールのオーバーレイから字幕ボタンを非表示にします。";
"HIDE_AUTOPLAY_SWITCH" = "自動再生ボタンを非表示";
"HIDE_AUTOPLAY_SWITCH_DESC" = "動画コントロールのオーバーレイから自動再生ボタンを非表示にします。";
"AUTO_FULLSCREEN" = "自動でフルスクリーンにする (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "動画を自動でフルスクリーンにします。";
"HIDE_HUD_MESSAGES" = "HUDのメッセージを非表示";
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がオン/オフになりました、ループ再生はオンになっています、等";
"OLED_DARKMODE" = "有機ELダークモード (実験的機能)";
"OLED_DARKMODE_DESC" = "正しく動作しない可能性があります。この設定を変更した場合、アプリの再起動が必要です。";
"OLED_KEYBOARD" = "有機ELキーボード (実験的機能)";
"OLED_KEYBOARD_DESC" = "正しく動作しない可能性があります。この設定を変更した場合、アプリの再起動が必要です。";
"HIDE_PAID_PROMOTION_CARDS" = "プロモーションバナーを非表示";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画で表示される「プロモーションを含みます」のバナーを非表示にします。";
// YTCastConfirm
"CASTING" = "キャスト";
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
"MSG_YES" = "はい";
"MSG_CANCEL" = "キャンセル";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "YouTube 닫기";
"KILL_APP_DESC" = "YouTube 앱을 닫으려면 여기를 탭하세요!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "이전, 다음 재생 버튼 숨기기";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "비디오 재생 오버레이에서 이전 재생, 다음 재생 버튼을 숨깁니다.";
"YT_MINIPLAYER" = "모든 YouTube 영상에서 미니 플레이어 활성화";
"YT_MINIPLAYER_DESC" = "아동용 영상일 경우.";
"CAST_CONFIRM" = "TV 전송 알림 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "의도치 않게 TV로 영상을 전송하지 않도록 보내기 전에 확인 메시지를 표시합니다.";
"HIDE_HOVER_CARD" = "영상 끝 부분의 호버카드 숨기기 (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "영상의 끝 부분에서 게시자가 표시한 영상 썸네일을 숨깁니다.";
"NEW_MINIPLAYER_STYLE" = "새로운 스타일의 미니 플레이어 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "앱을 다시 시작해야 합니다.";
"YT_RE_EXPLORE" = "Shorts 탭 대신 탐색 탭 보이기 (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "앱을 다시 시작해야 합니다.";
"HIDE_SUBTITLES_BUTTON" = "자막 버튼 숨기기";
"HIDE_SUBTITLES_BUTTON_DESC" = "비디오 재생 오버레이에서 자막 버튼을 숨깁니다.";
"HIDE_AUTOPLAY_SWITCH" = "자동재생 스위치 숨기기";
"HIDE_AUTOPLAY_SWITCH_DESC" = "비디오 재생 오버레이에서 자동재생 스위치를 숨깁니다.";
"AUTO_FULLSCREEN" = "자동 전체화면 재생 (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "자동으로 전체화면에서 재생합니다.";
"HIDE_HUD_MESSAGES" = "화면 메시지 숨기기";
"HIDE_HUD_MESSAGES_DESC" = "예: 자막 사용 설정됨/중지됨, 반복재생 설정됨,...";
"OLED_DARKMODE" = "OLED 다크모드 (실험실)";
"OLED_DARKMODE_DESC" = "몇몇 경우 제대로 동작하지 않을 수도 있습니다. 이 기능을 켜거나 끄는 경우 앱을 다시 시작해야 합니다.";
"OLED_KEYBOARD" = "OLED 키보드 (실험실)";
"OLED_KEYBOARD_DESC" = "몇몇 경우 제대로 동작하지 않을 수도 있습니다. 앱을 다시 시작해야 합니다.";
"HIDE_PAID_PROMOTION_CARDS" = "유료 광고 배너 숨기기";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "'유료 광고 포함' 배너를 숨깁니다.";
// YTCastConfirm
"CASTING" = "TV로 전송";
"MSG_ARE_YOU_SURE" = "TV로 영상 전송을 시작하겠습니까?";
"MSG_YES" = "예";
"MSG_CANCEL" = "취소";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "Fechar o YouTube";
"KILL_APP_DESC" = "Toque aqui para fechar o YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ocultar botão Anterior e Próximo";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Oculta o botão Anterior e Próximo na sobreposição de controles de vídeo.";
"YT_MINIPLAYER" = "Ative o Miniplayer para todos os vídeos do YouTube";
"YT_MINIPLAYER_DESC" = "Vídeos infantis, por exemplo.";
"CAST_CONFIRM" = "Alerta de confirmação antes de transmitir (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Mostra um alerta de confirmação antes da transmissão para evitar o sequestro acidental da TV.";
"HIDE_HOVER_CARD" = "Ocultar Cartões flutuantes de telas finais (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Oculta telas finais do criador (miniaturas) no final dos vídeos.";
"NEW_MINIPLAYER_STYLE" = "Novo estilo de barra de miniplayer (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "A reinicialização do app é necessária.";
"YT_RE_EXPLORE" = "Substituir a guia Shorts pela guia Explorar (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "A reinicialização do app é necessária.";
"HIDE_SUBTITLES_BUTTON" = "Ocultar botão de Legendas";
"HIDE_SUBTITLES_BUTTON_DESC" = "Oculta o botão de Legendas na sobreposição de controles de vídeo.";
"HIDE_AUTOPLAY_SWITCH" = "Ocultar interruptor de Reprodução automática";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Oculta o interruptor de Reprodução automática na sobreposição de controles de vídeo.";
"AUTO_FULLSCREEN" = "Tela cheia automática (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Reproduz videos em tela cheia automaticamente.";
"HIDE_HUD_MESSAGES" = "Ocultar Mensagens do HUD";
"HIDE_HUD_MESSAGES_DESC" = "Exemplo: Legendas/CC ativadas/desativadas, A repetição do vídeo está ativada,...";
"OLED_DARKMODE" = "Modo escuro OLED (Experimental)";
"OLED_DARKMODE_DESC" = "Pode não funcionar corretamente em alguns casos. A reinicialização do app é necessária após você ativar/desativar essa opção.";
"OLED_KEYBOARD" = "Teclado OLED (Experimental)";
"OLED_KEYBOARD_DESC" = "Pode não funcionar corretamente em alguns casos. A reinicialização do app é necessária.";
"HIDE_PAID_PROMOTION_CARDS" = "Ocultar Banner de promoção paga";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Oculta o banner 'Contém promoção paga' em alguns vídeos.";
// YTCastConfirm
"CASTING" = "Transmissão";
"MSG_ARE_YOU_SURE" = "Tem certeza de que deseja começar a transmitir?";
"MSG_YES" = "Sim";
"MSG_CANCEL" = "Cancelar";
@@ -0,0 +1,43 @@
/* uYouPlusSettings */
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Скрыть «Пред.» и «След.»";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Убирает кнопки переключения видео «Следующий» и «Предыдущий» с плеера.";
"YT_MINIPLAYER" = "Мини-плеер для всех видео";
"YT_MINIPLAYER_DESC" = "Принудительно активирует мини-плеер для всех видео, включая видео, предназначенное для детей.";
"CAST_CONFIRM" = "Подтверждение «Трансляции» (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Спрашивать подтверждение перед началом трансляции во избежание случайных подключений к ТВ.";
"HIDE_HOVER_CARD" = "Скрыть рекомендации (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Скрывает эскизы, отображаемые по окончанию видеоролика.";
"NEW_MINIPLAYER_STYLE" = "Мини-плеер в стиле iPad (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Потребуется перезагрузка.";
"YT_RE_EXPLORE" = "Вкладка «Навигация» вместо «Shorts»";
"YT_RE_EXPLORE_DESC" = "Потребуется перезагрузка.";
"HIDE_SUBTITLES_BUTTON" = "Скрыть «Субтитры»";
"HIDE_SUBTITLES_BUTTON_DESC" = "Скрывает кнопку субтитров с оверлея плеера.";
"HIDE_AUTOPLAY_SWITCH" = "Скрыть «Автовоспроизведение»";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Убирает тумблер «Автовоспроизведение» с оверлея плеера.";
"AUTO_FULLSCREEN" = "Полноэкранный режим (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Автоматически открывает ролики в полноэкранном режиме.";
"HIDE_HUD_MESSAGES" = "Скрыть сообщения плеера";
"HIDE_HUD_MESSAGES_DESC" = "Скрывает надписи YouTube, появляющиеся поверх видео.";
"OLED_DARKMODE" = "Темный режим для OLED (Бета)";
"OLED_DARKMODE_DESC" = "Понадобится перезагрузка при смене цветовой темы приложения. Если OLED-тема не включится, попробуйте переключиться не светлый режим и обратно, а затем перезагрузить приложение.";
"OLED_KEYBOARD" = "OLED-клавиатура (Бета)";
"OLED_KEYBOARD_DESC" = "Возможно, на некоторых устройствах будет работать криво. Потребуется перезагрузка.";
/* YTCastConfirm */
"CASTING" = "Трансляция";
"MSG_ARE_YOU_SURE" = "Начать трансляцию экрана?";
"MSG_YES" = "Да";
"MSG_CANCEL" = "Отмена";
@@ -0,0 +1,67 @@
// How to translate uYouPlus to your language:
//
// 1. Fork uYouPlus repo
// 2. Duplicate the template.lproj folder, and edit the duplicated folder's name to your <lang_code>.lproj id.
// For example: <ru.lproj> for Russia. For more details, visit: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
// 3. Translate each line below after each =
// 4. Open a Pull Request
//
// If your language already exists then feel free to check it and/or improve it!
// You can also add your localization to YouPiP here, the process is the same
// https://github.com/PoomSmart/YouPiP/tree/main/layout/Library/Application%20Support/YouPiP.bundle
//
// Settings
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Replace Previous and Next Button";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Replace Previous and Next Button with Fast forward and Rewind button. App restart is required.";
"FIX_GOOGLE_SIGNIN" = "Fix Google Sign in (for TrollStore user only)";
"FIX_GOOGLE_SIGNIN_DESC" = "Only works when the app was installed via TrollStore: Turn on this option so you can sign in with your Google account. App restart is required.";
"KILL_APP" = "Close YouTube";
"KILL_APP_DESC" = "Tap here to close YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Hide Previous and Next button";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide Previous and Next button in video controls overlay.";
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
"YT_MINIPLAYER_DESC" = "Kid videos for example.";
"CAST_CONFIRM" = "Confirm alert before casting (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Show a confirm alert before casting to prevent accidentally hijacking TV.";
"HIDE_HOVER_CARD" = "Hide End screens hover cards (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Hide creator End screens (thumbnails) at the end of videos.";
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "App restart is required.";
"HIDE_SUBTITLES_BUTTON" = "Hide Subtitles button";
"HIDE_SUBTITLES_BUTTON_DESC" = "Hide the Subtitles button in video controls overlay.";
"HIDE_AUTOPLAY_SWITCH" = "Hide Autoplay switch";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Hide the Autoplay switch in video controls overlay.";
"AUTO_FULLSCREEN" = "Auto Full Screen (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Autoplay videos at full screen.";
"HIDE_HUD_MESSAGES" = "Hide HUD Messages";
"HIDE_HUD_MESSAGES_DESC" = "Example: CC is turned on/off, Video loop is on,...";
"OLED_DARKMODE" = "OLED Dark mode (Experimental)";
"OLED_DARKMODE_DESC" = "Might not working correctly in some cases. App restart is required after you enable/disable this option.";
"OLED_KEYBOARD" = "OLED Keyboard (Experimental)";
"OLED_KEYBOARD_DESC" = "Might not working correctly in some cases. App restart is required.";
"HIDE_PAID_PROMOTION_CARDS" = "Hide Paid Promotion banner";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Hide the 'Includes Paid Promotions' banner in some videos.";
// YTCastConfirm
"CASTING" = "Castings";
"MSG_ARE_YOU_SURE" = "Are you sure you want to start casting?";
"MSG_YES" = "Yes";
"MSG_CANCEL" = "Cancel";
@@ -0,0 +1,55 @@
// Settings
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Thay thế nút chuyển video";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Thay thế nút chuyển video bằng nút tua nhanh. Cần khởi động lại ứng dụng.";
"FIX_GOOGLE_SIGNIN" = "Sửa lỗi không thể đăng nhập tài khoản Google";
"FIX_GOOGLE_SIGNIN_DESC" = "Lưu ý rằng tính năng này chỉ hoạt động khi ứng dụng được cài đặt bằng TrollStore: Bật tính năng này để sửa lỗi không thể đăng nhập bằng tài khoản Google. Cần khởi động lại ứng dụng.";
"KILL_APP" = "Đóng ứng dụng";
"KILL_APP_DESC" = "Chạm để đóng YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ẩn nút Next và nút Previous";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ẩn nút Next và nút Previous trong trình phát video.";
"YT_MINIPLAYER" = "Cho phép sử dụng trình phát thu nhỏ với mọi video";
"YT_MINIPLAYER_DESC" = "Ví dụ: Video cho trẻ em.";
"CAST_CONFIRM" = "Xác nhận trước khi cast video (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Hiện hộp thoại xác nhận trước khi cast video sang TV để tránh vô tình chiếm quyền điều khiển TV.";
"HIDE_HOVER_CARD" = "Ẩn video dạng thumbnails (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Ẩn thumbnail của các video đề xuất xuất hiện ở cuối video.";
"NEW_MINIPLAYER_STYLE" = "Giao diện trình phát thu nhỏ kiểu mới (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Cần khởi động lại ứng dụng.";
"YT_RE_EXPLORE" = "Thay thế tab Shorts bằng tab Khám phá (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Cần khởi động lại ứng dụng.";
"HIDE_SUBTITLES_BUTTON" = "Ẩn nút bật Phụ đề";
"HIDE_SUBTITLES_BUTTON_DESC" = "Ẩn nút bật phụ đề trong trình phát video.";
"HIDE_AUTOPLAY_SWITCH" = "Ẩn nút Tự động phát";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ẩn nút Tự động phát trong trình phát video.";
"AUTO_FULLSCREEN" = "Tự động toàn màn hình (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Tự động phát video ở chế độ toàn màn hình.";
"HIDE_HUD_MESSAGES" = "Ẩn thông báo HUD";
"HIDE_HUD_MESSAGES_DESC" = "Ví dụ: Đã bật/tắt phụ đề, Tính năng phát video lặp lại đang bật,...";
"OLED_DARKMODE" = "Chế độ tối cho màn OLED (Thử nghiệm)";
"OLED_DARKMODE_DESC" = "Có thể không hoạt động tốt trong một số trường hợp. Cần khởi động lại ứng dụng nếu bạn bật/tắt tính năng này, nhưng không cần khởi động lại ứng dụng nếu chuyển giữa chế độ Sáng và chế độ Tối.";
"OLED_KEYBOARD" = "Bàn phím tối cho màn OLED (Thử nghiệm)";
"OLED_KEYBOARD_DESC" = "Có thể không hoạt động tốt trong một vài trường hợp. Cần khởi động lại ứng dụng.";
"HIDE_PAID_PROMOTION_CARDS" = "Ẩn banner quảng cáo được trả tiền";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Ẩn banner 'Chứa nội dung được trả tiền để quảng cáo' trong một số video.";
// YTCastConfirm
"CASTING" = "Truyền video";
"MSG_ARE_YOU_SURE" = "Bạn có muốn bắt đầu truyền video không?";
"MSG_YES" = "Có";
"MSG_CANCEL" = "Không";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "关闭YouTube";
"KILL_APP_DESC" = "点击此处关闭YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隐藏上一个/下一个按钮";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "隐藏视频播放器控制界面上的上一个/下一个按钮。";
"YT_MINIPLAYER" = "为所有YouTube视频启用迷你播放器";
"YT_MINIPLAYER_DESC" = "例如:面向儿童的视频。";
"CAST_CONFIRM" = "投屏前确认 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "在投屏前显示确认对话框以防意外劫屏。";
"HIDE_HOVER_CARD" = "隐藏片尾画面悬浮卡片 (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "隐藏视频结尾处的创作者片尾画面元素(缩略图)。";
"NEW_MINIPLAYER_STYLE" = "新迷你播放器风格 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "更改本设置后需要重启App。";
"YT_RE_EXPLORE" = "将Shorts选项卡替换成探索选项卡 (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "更改本设置后需要重启App。";
"HIDE_SUBTITLES_BUTTON" = "隐藏字幕按钮";
"HIDE_SUBTITLES_BUTTON_DESC" = "隐藏视频播放器控制界面上的字幕按钮。";
"HIDE_AUTOPLAY_SWITCH" = "隐藏自动播放模式开关";
"HIDE_AUTOPLAY_SWITCH_DESC" = "隐藏视频播放器控制界面上的自动播放开关。";
"AUTO_FULLSCREEN" = "自动全屏 (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "自动全屏播放视频。";
"HIDE_HUD_MESSAGES" = "隐藏系统提醒";
"HIDE_HUD_MESSAGES_DESC" = "例如:\"已启用/停用字幕\"、\"已开启/关闭视频循环播放\"等。";
"OLED_DARKMODE" = "OLED 深色模式(实验性功能)";
"OLED_DARKMODE_DESC" = "在某些情况下可能不会正常工作。更改本设置后需要重启App。";
"OLED_KEYBOARD" = "OLED 键盘(实验性功能)";
"OLED_KEYBOARD_DESC" = "在某些情况下可能不会正常工作。更改本设置后需要重启App。";
"HIDE_PAID_PROMOTION_CARDS" = "隐藏付费宣传内容提醒横幅";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "隐藏出现在部分视频中的\"包含付费宣传内容\"横幅。";
// YTCastConfirm
"CASTING" = "正在投屏";
"MSG_ARE_YOU_SURE" = "您确定要开始投屏吗?";
"MSG_YES" = "确定";
"MSG_CANCEL" = "取消";
@@ -0,0 +1,49 @@
// Settings
"KILL_APP" = "關閉YouTube";
"KILL_APP_DESC" = "按這裡關閉YouTube!";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
"YT_MINIPLAYER" = "為所有YouTube影片啟用迷你播放器";
"YT_MINIPLAYER_DESC" = "例如兒童影片";
"CAST_CONFIRM" = "投放前確認 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止意外攔劫電視。";
"HIDE_HOVER_CARD" = "隱藏片尾畫面懸浮卡片 (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面(縮略圖)。";
"NEW_MINIPLAYER_STYLE" = "新的迷你播放器控制列風格 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";
"YT_RE_EXPLORE" = "用探索選項卡替換Shorts選項卡 (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "需要重新啟動應用程式。";
"HIDE_SUBTITLES_BUTTON" = "隱藏字幕按鈕";
"HIDE_SUBTITLES_BUTTON_DESC" = "隱藏影片控制層中的字幕按鈕。";
"HIDE_AUTOPLAY_SWITCH" = "隱藏自動播放開關";
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制層中隱藏自動播放開關。";
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
"HIDE_HUD_MESSAGES" = "隱藏 HUD 訊息";
"HIDE_HUD_MESSAGES_DESC" = "舉例來說:CC字幕 開啟/關閉,影片循環開啟,...";
"OLED_DARKMODE" = "OLED 深色模式(實驗性)";
"OLED_DARKMODE_DESC" = "在某些情況下可能無法正常工作。啟用/禁用此選項後,需要重新啟動應用程式。";
"OLED_KEYBOARD" = "OLED 鍵盤(實驗性)";
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常工作。需要重新啟動應用程式。";
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費促銷橫幅";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏“包括付費促銷”橫幅。";
// YTCastConfirm
"CASTING" = "投放中";
"MSG_ARE_YOU_SURE" = "確定要開始投放嗎?";
"MSG_YES" = "確定";
"MSG_CANCEL" = "取消";
-100
View File
@@ -1,100 +0,0 @@
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
%hook YTAdsInnerTubeContextDecorator
- (void)decorateContext:(id)arg1 {
%orig(nil);
}
%end
// 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
+901
View File
@@ -0,0 +1,901 @@
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <dlfcn.h>
#import "Header.h"
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.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"
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
NSBundle *uYouPlusBundle() {
static NSBundle *bundle = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"uYouPlus" ofType:@"bundle"];
bundle = [NSBundle bundleWithPath:tweakBundlePath];
});
return bundle;
}
NSBundle *tweakBundle = uYouPlusBundle();
// Keychain patching
static NSString *accessGroupID() {
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
(__bridge NSString *)kSecClassGenericPassword, (__bridge NSString *)kSecClass,
@"bundleSeedID", kSecAttrAccount,
@"", kSecAttrService,
(id)kCFBooleanTrue, kSecReturnAttributes,
nil];
CFDictionaryRef result = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
if (status == errSecItemNotFound)
status = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef *)&result);
if (status != errSecSuccess)
return nil;
NSString *accessGroup = [(__bridge NSDictionary *)result objectForKey:(__bridge NSString *)kSecAttrAccessGroup];
return accessGroup;
}
BOOL hideHUD() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
}
BOOL oled() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
}
BOOL oledKB() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
}
BOOL isDarkMode() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
}
BOOL autoFullScreen() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"autoFull_enabled"];
}
BOOL hideHoverCard() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHoverCards_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 hidePreviousAndNextButton() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePreviousAndNextButton_enabled"];
}
BOOL castConfirm() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
}
BOOL ytMiniPlayer() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ytMiniPlayer_enabled"];
}
BOOL hidePaidPromotionCard() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePaidPromotionCard_enabled"];
}
BOOL fixGoogleSigin() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"fixGoogleSigin_enabled"];
}
BOOL replacePreviousAndNextButton() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"replacePreviousAndNextButton_enabled"];
}
# pragma mark - Tweaks
// Enable Reorder videos from playlist while on the Watch page - @PoomSmart
%hook YTIPlaylistPanelVideoRenderer
%new
- (BOOL)canReorder { return YES; }
%end
// Skips content warning before playing *some videos - @PoomSmart
%hook YTPlayabilityResolutionUserActionUIController
- (void)showConfirmAlert { [self confirmAlertDidPressConfirm]; }
%end
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
%hook YTWatchMiniBarViewController
- (void)updateMiniBarPlayerStateFromRenderer {
if (ytMiniPlayer()) {}
else { return %orig; }
}
%end
// Hide CC / Autoplay switch
%hook YTMainAppControlsOverlayView
- (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { // hide CC button
if (hideCC()) { return %orig(NO); }
else { return %orig; }
}
- (void)setAutoplaySwitchButtonRenderer:(id)arg1 { // hide Autoplay
if (hideAutoplaySwitch()) {}
else { return %orig; }
}
%end
// Hide Next & Previous button
%group gHidePreviousAndNextButton
%hook YTColdConfig
- (BOOL)removeNextPaddleForSingletonVideos { return YES; }
- (BOOL)removePreviousPaddleForSingletonVideos { return YES; }
%end
%end
// Replace Next & Previous button with Fast forward & Rewind button
%group gReplacePreviousAndNextButton
%hook YTColdConfig
- (BOOL)replaceNextPaddleWithFastForwardButtonForSingletonVods { return YES; }
- (BOOL)replacePreviousPaddleWithRewindButtonForSingletonVods { return YES; }
%end
%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 (hideHoverCard())
hidden = YES;
%orig;
}
%end
//YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm
%hook MDXPlaybackRouteButtonController
- (void)didPressButton:(id)arg1 {
if (castConfirm()) {
UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:LOC(@"CASTING")
message:LOC(@"MSG_ARE_YOU_SURE")
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:LOC(@"MSG_YES") style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
%orig;
}];
UIAlertAction* noButton = [%c(UIAlertAction)
actionWithTitle:LOC(@"MSG_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];
} else { return %orig; }
}
%end
// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263
%hook YTDataUtils
+ (NSMutableDictionary *)spamSignalsDictionary {
return nil;
}
%end
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
%hook UIResponder
%new
- (id)entry {
return nil;
}
%end
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/140
%hook YTLocalPlaybackController
%new
- (id)activeVideoController {
return [self activeVideo];
}
%end
// Workaround for qnblackcat/uYouPlus#10
%hook boolSettingsVC
- (instancetype)initWithTitle:(NSString *)title sections:(NSArray *)sections footer:(NSString *)footer {
if (@available(iOS 15, *))
if (![self valueForKey:@"_lastNotifiedTraitCollection"])
[self setValue:[UITraitCollection currentTraitCollection] forKey:@"_lastNotifiedTraitCollection"];
return %orig;
}
%end
// 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
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
%hook YTColdConfig
- (BOOL)respectDeviceCaptionSetting { return NO; }
- (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { 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
// Enable Shorts scroll bar - @PoomSmart
%hook YTReelPlayerViewController
- (BOOL)shouldAlwaysEnablePlayerBar { return YES; }
%end
%hook YTInlinePlayerBarContainerView
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
%end
// Workaround for issue #54
%hook YTMainAppVideoPlayerOverlayViewController
- (void)updateRelatedVideos {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
else { return %orig; }
}
%end
// Workaround for qnblackcat/uYouPlus#253, qnblackcat/uYouPlus#170
%hook YTReelWatchPlaybackOverlayView
- (YTQTMButton *)overflowButton {
if ([self respondsToSelector:@selector(orderedRightSideButtons)] &&
[self orderedRightSideButtons].count != 0)
return [self orderedRightSideButtons][0];
return %orig;
}
%end
%hook YTReelContentView
- (void)didTapOverflowButton:(id)sender {
}
%end
%hook NSLayoutConstraint
+ (instancetype)constraintWithItem:(UIView *)view1
attribute:(NSLayoutAttribute)attr1
relatedBy:(NSLayoutRelation)relation
toItem:(UIView *)view2
attribute:(NSLayoutAttribute)attr2
multiplier:(CGFloat)multiplier
constant:(CGFloat)c {
if (![view1 isKindOfClass:%c(YTReelPlayerBottomButton)] &&
![view1.accessibilityIdentifier isEqualToString:@"com.miro.uyou"])
return %orig;
if (!view2) {
view1.hidden = YES;
return [NSLayoutConstraint alloc];
}
YTReelPlayerBottomButton *uYouButton = (YTReelPlayerBottomButton *)view1;
YTReelPlayerBottomButton *topButton = (YTReelPlayerBottomButton *)view2;
NSString *uYouButtonTitle =
[view2.accessibilityIdentifier isEqualToString:@"com.miro.uyou"]
? @"uYou"
: @"uYouLocal";
uYouButton.accessibilityLabel = uYouButtonTitle;
uYouButton.uppercaseTitle = NO;
[uYouButton setTitle:uYouButtonTitle forState:UIControlStateNormal];
[uYouButton
setTitleTypeKind:MSHookIvar<NSInteger>(topButton, "_typeKind")
typeVariant:MSHookIvar<NSInteger>(topButton, "_typeVariant")];
uYouButton.applyRightSideLayoutImageSize = topButton.applyRightSideLayoutImageSize;
uYouButton.buttonImageTitlePadding = topButton.buttonImageTitlePadding;
uYouButton.buttonLayoutStyle = topButton.buttonLayoutStyle;
uYouButton.sizeWithPaddingAndInsets = topButton.sizeWithPaddingAndInsets;
uYouButton.verticalContentPadding = topButton.verticalContentPadding;
return %orig;
}
%end
// Prevent uYou player bar from showing when not playing downloaded media
%hook PlayerManager
- (void)pause {
if (isnan([self progress]))
return;
%orig;
}
%end
// Hide YouTube Shorts banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts
%hook YTAsyncCollectionView
- (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = %orig;
if ([cell isKindOfClass:NSClassFromString(@"_ASCollectionViewCell")]) {
_ASCollectionViewCell *cell = %orig;
if ([cell respondsToSelector:@selector(node)]) {
if ([[[cell node] accessibilityIdentifier] isEqualToString:@"statement_banner.view"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; }
if ([[[cell node] accessibilityIdentifier] isEqualToString:@"compact.view"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; }
}
}
return %orig;
}
%new
- (void)removeShortsAndFeaturesAdsAtIndexPath:(NSIndexPath *)indexPath {
[self deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
}
%end
// uYou's slide settings?
%hook FRPSliderCell
- (void)didMoveToWindow {
%orig;
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
MSHookIvar<UILabel *>(self, "_lLabel").textColor = [UIColor whiteColor];
MSHookIvar<UILabel *>(self, "_rLabel").textColor = [UIColor whiteColor];
MSHookIvar<UILabel *>(self, "_cLabel").textColor = [UIColor whiteColor];
}
}
%end
// YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo
%hook YTMainAppVideoPlayerOverlayViewController
- (void)setPaidContentWithPlayerData:(id)data {
if (hidePaidPromotionCard()) {}
else { return %orig; }
}
- (void)playerOverlayProvider:(YTPlayerOverlayProvider *)provider didInsertPlayerOverlay:(YTPlayerOverlay *)overlay {
if ([[overlay overlayIdentifier] isEqualToString:@"player_overlay_paid_content"] && hidePaidPromotionCard()) return;
%orig;
}
%end
%hook YTInlineMutedPlaybackPlayerOverlayViewController
- (void)setPaidContentWithPlayerData:(id)data {
if (hidePaidPromotionCard()) {}
else { return %orig; }
}
%end
# pragma mark - IAmYouTube - https://github.com/PoomSmart/IAmYouTube/
%hook YTVersionUtils
+ (NSString *)appName { return YT_NAME; }
+ (NSString *)appID { return YT_BUNDLE_ID; }
%end
%hook GCKBUtils
+ (NSString *)appIdentifier { return YT_BUNDLE_ID; }
%end
%hook GPCDeviceInfo
+ (NSString *)bundleId { return YT_BUNDLE_ID; }
%end
%hook OGLBundle
+ (NSString *)shortAppName { return YT_NAME; }
%end
%hook GVROverlayView
+ (NSString *)appName { return YT_NAME; }
%end
%hook OGLPhenotypeFlagServiceImpl
- (NSString *)bundleId { return YT_BUNDLE_ID; }
%end
%hook APMAEU
+ (BOOL)isFAS { return YES; }
%end
%hook GULAppEnvironmentUtil
+ (BOOL)isFromAppStore { return YES; }
%end
%hook SSOConfiguration
- (id)initWithClientID:(id)clientID supportedAccountServices:(id)supportedAccountServices {
self = %orig;
[self setValue:YT_NAME forKey:@"_shortAppName"];
[self setValue:YT_BUNDLE_ID forKey:@"_applicationIdentifier"];
return self;
}
%end
%hook NSBundle
- (NSString *)bundleIdentifier {
NSArray *address = [NSThread callStackReturnAddresses];
Dl_info info = {0};
if (dladdr((void *)[address[2] longLongValue], &info) == 0)
return %orig;
NSString *path = [NSString stringWithUTF8String:info.dli_fname];
if ([path hasPrefix:NSBundle.mainBundle.bundlePath])
return YT_BUNDLE_ID;
return %orig;
}
- (id)objectForInfoDictionaryKey:(NSString *)key {
if ([key isEqualToString:@"CFBundleIdentifier"])
return YT_BUNDLE_ID;
if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"])
return YT_NAME;
return %orig;
}
%end
// Fix "You can't sign in to this app because Google can't confirm that it's safe" warning when signing in. by julioverne & PoomSmart
// https://gist.github.com/PoomSmart/ef5b172fd4c5371764e027bea2613f93
// https://github.com/qnblackcat/uYouPlus/pull/398
%group gDevice_challenge_request_hack
%hook SSOService
+ (id)fetcherWithRequest:(NSMutableURLRequest *)request configuration:(id)configuration {
if ([request isKindOfClass:[NSMutableURLRequest class]] && request.HTTPBody) {
NSError *error = nil;
NSMutableDictionary *body = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:NSJSONReadingMutableContainers error:&error];
if (!error && [body isKindOfClass:[NSMutableDictionary class]]) {
[body removeObjectForKey:@"device_challenge_request"];
request.HTTPBody = [NSJSONSerialization dataWithJSONObject:body options:kNilOptions error:&error];
}
}
return %orig;
}
%end
%end
// Fix login for YouTube 17.33.2 and higher
%hook SSOKeychainCore
+ (NSString *)accessGroup {
return accessGroupID();
}
+ (NSString *)sharedAccessGroup {
return accessGroupID();
}
%end
// Fix App Group Directory by move it to document directory
%hook NSFileManager
- (NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier {
if (groupIdentifier != nil) {
NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *documentsURL = [paths lastObject];
return [documentsURL URLByAppendingPathComponent:@"AppGroup"];
}
return %orig(groupIdentifier);
}
%end
# pragma mark - OLED dark mode by BandarHL
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
%group gOLED
%hook YTCommonColorPalette
- (UIColor *)brandBackgroundSolid {
if (self.pageStyle == 1) {
return [UIColor blackColor];
}
return %orig;
}
- (UIColor *)brandBackgroundPrimary {
if (self.pageStyle == 1) {
return [UIColor blackColor];
}
return %orig;
}
- (UIColor *)brandBackgroundSecondary {
if (self.pageStyle == 1) {
return [[UIColor blackColor] colorWithAlphaComponent:0.9];
}
return %orig;
}
- (UIColor *)raisedBackground {
if (self.pageStyle == 1) {
return [UIColor blackColor];
}
return %orig;
}
- (UIColor *)staticBrandBlack {
if (self.pageStyle == 1) {
return [UIColor blackColor];
}
return %orig;
}
- (UIColor *)generalBackgroundA {
if (self.pageStyle == 1) {
return [UIColor blackColor];
}
return %orig;
}
%end
// Account view controller
%hook YTAccountPanelBodyViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
if (pageStyle == 1) {
return [UIColor blackColor];
}
return %orig;
}
%end
// Explore
%hook ASScrollView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.backgroundColor = [UIColor clearColor];
}
}
%end
// Your videos
%hook ASCollectionView
- (void)didMoveToWindow {
%orig;
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
self.superview.backgroundColor = [UIColor blackColor];
}
}
%end
// iSponsorBlock
%hook SponsorBlockSettingsController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.tableView.backgroundColor = [UIColor blackColor];
} else { return %orig; }
}
%end
%hook SponsorBlockViewController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.view.backgroundColor = [UIColor blackColor];
} else { return %orig; }
}
%end
// Search View
%hook YTSearchBarView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
// History Search view
%hook YTSearchBoxView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
// Comment view
%hook YTCommentView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
%hook YTCreateCommentAccessoryView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
%hook YTCreateCommentTextView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
if (isDarkMode()) {
return %orig([UIColor whiteColor]);
}
return %orig;
}
%end
%hook YTCommentDetailHeaderCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[2].backgroundColor = [UIColor blackColor];
}
}
%end
%hook YTFormattedStringLabel // YT is werid...
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor clearColor]);
}
return %orig;
}
%end
// Live chat comment
%hook YCHLiveChatActionPanelView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
%hook YTEmojiTextView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
// Others
%hook _ASDisplayView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; }
}
}
%end
// Open link with...
%hook ASWAppSwitchingSheetHeaderView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig(raisedColor);
}
return %orig;
}
%end
%hook ASWAppSwitchingSheetFooterView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig(raisedColor);
}
return %orig;
}
%end
%hook ASWAppSwitcherCollectionViewCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[1].backgroundColor = raisedColor;
self.superview.backgroundColor = raisedColor;
}
}
%end
%end
# pragma mark - OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
%group gOLEDKB
%hook UIPredictionViewController
- (void)loadView {
%orig;
[self.view setBackgroundColor:[UIColor blackColor]];
}
%end
%hook UICandidateViewController
- (void)loadView {
%orig;
[self.view setBackgroundColor:[UIColor blackColor]];
}
%end
%hook UIKeyboardDockView
- (void)didMoveToWindow {
%orig;
self.backgroundColor = [UIColor blackColor];
}
%end
%hook UIKeyboardLayoutStar
- (void)didMoveToWindow {
%orig;
self.backgroundColor = [UIColor blackColor];
}
%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
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
%group iOS16
%hook OBPrivacyLinkButton
%new
- (instancetype)initWithCaption:(NSString *)caption
buttonText:(NSString *)buttonText
image:(UIImage *)image
imageSize:(CGSize)imageSize
useLargeIcon:(BOOL)useLargeIcon {
return [self initWithCaption:caption
buttonText:buttonText
image:image
imageSize:imageSize
useLargeIcon:useLargeIcon
displayLanguage:[NSLocale currentLocale].languageCode];
}
%end
%end
# pragma mark - ctor
%ctor {
%init;
if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"relatedVideosAtTheEndOfYTVideos"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"];
}
if (oled()) {
%init(gOLED);
}
if (oledKB()) {
%init(gOLEDKB);
}
if (reExplore()) {
%init(gReExplore);
}
if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
%init(Main);
}
if (hidePreviousAndNextButton()) {
%init(gHidePreviousAndNextButton);
}
if (replacePreviousAndNextButton()) {
%init(gReplacePreviousAndNextButton);
}
if (@available(iOS 16, *)) {
%init(iOS16);
}
if (!fixGoogleSigin()) {
%init(gDevice_challenge_request_hack);
}
}