Compare commits
86
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c85d928952 | ||
|
|
9ce39051ef | ||
|
|
cb2c7ff951 | ||
|
|
223a0b094b | ||
|
|
36a1f12671 | ||
|
|
6b799b5c01 | ||
|
|
fc392e1742 | ||
|
|
87813f8acb | ||
|
|
5f659617e9 | ||
|
|
645036d28e | ||
|
|
f00e66bded | ||
|
|
f91287b737 | ||
|
|
58abfbaffd | ||
|
|
dad5377435 | ||
|
|
a902d90449 | ||
|
|
2657f8ca7c | ||
|
|
dcb41ab74d | ||
|
|
0147865c53 | ||
|
|
b56461a439 | ||
|
|
9d27a3b9c0 | ||
|
|
ea309fd094 | ||
|
|
1bed1db404 | ||
|
|
c864966f11 | ||
|
|
409537eba3 | ||
|
|
6604f5e497 | ||
|
|
0b64741d50 | ||
|
|
34a66bec01 | ||
|
|
dcb1a2aba1 | ||
|
|
db1318b576 | ||
|
|
ad2c426fe6 | ||
|
|
e6835b9e33 | ||
|
|
5741ae5584 | ||
|
|
aa338eab73 | ||
|
|
799a98951a | ||
|
|
8b95b82492 | ||
|
|
4a5f1dae69 | ||
|
|
e896843357 | ||
|
|
4c5a201831 | ||
|
|
cce821741d | ||
|
|
c4fd520a3d | ||
|
|
80c36940f6 | ||
|
|
2d17a16aad | ||
|
|
72a6f1caac | ||
|
|
975cb6005c | ||
|
|
6180fe7512 | ||
|
|
aed82d4f12 | ||
|
|
44a128d16f | ||
|
|
b1ea29dc6c | ||
|
|
85ca0ea633 | ||
|
|
377ebec525 | ||
|
|
35b6374d8c | ||
|
|
99299cc5bf | ||
|
|
bb5c02272f | ||
|
|
7a128ab908 | ||
|
|
2191478712 | ||
|
|
39849cac51 | ||
|
|
1f5ad62544 | ||
|
|
c04f0b7e43 | ||
|
|
380ee96a71 | ||
|
|
15124cf1c9 | ||
|
|
9bd1be5024 | ||
|
|
eb0a64bd69 | ||
|
|
02bfe1ada3 | ||
|
|
b62746061d | ||
|
|
e2cd37a8b6 | ||
|
|
e5b9ff21cf | ||
|
|
2e7fd253a8 | ||
|
|
3aa7c57d82 | ||
|
|
11ddcd421d | ||
|
|
6418f3daeb | ||
|
|
4b283110a6 | ||
|
|
2615436031 | ||
|
|
81088fadd3 | ||
|
|
5adaec2c93 | ||
|
|
7ac253963e | ||
|
|
2d2b469f1f | ||
|
|
9e98ad9482 | ||
|
|
1d5de3cd4c | ||
|
|
1266cb5a38 | ||
|
|
4fee21517e | ||
|
|
2ff0f3fb56 | ||
|
|
329fb1681a | ||
|
|
c78e5b9fd9 | ||
|
|
7b9fd7dcfb | ||
|
|
922ab4e9b7 | ||
|
|
c8a4acfff0 |
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Bug
|
name: Bug
|
||||||
about: Create a report to help us improve
|
about: Make sure you complete the template. Otherwise, it will be closed without further explanation!
|
||||||
title: "[Bug]"
|
title: "[Bug]"
|
||||||
labels: bug
|
labels: bug
|
||||||
assignees: ''
|
assignees: ''
|
||||||
@@ -14,8 +14,8 @@ _Make sure you complete the template. Otherwise, it will be closed without furth
|
|||||||
### Device info
|
### Device info
|
||||||
- iOS/iPadOS version:
|
- iOS/iPadOS version:
|
||||||
- Device model:
|
- Device model:
|
||||||
- Sideload tool (Ex: AltStore, Sideloadly...)
|
- Sideload tool (Ex: AltStore, Sideloadly, TrollStore,...)
|
||||||
- Version of uYouPlus:
|
- The specific version of uYouPlus: _**latest** or **newest** is NOT a version number!!_
|
||||||
|
|
||||||
### Describe the bug
|
### Describe the bug
|
||||||
|
|
||||||
@@ -23,9 +23,11 @@ _Make sure you complete the template. Otherwise, it will be closed without furth
|
|||||||
### How to reproduce the bug
|
### How to reproduce the bug
|
||||||
_(Please attach videos or screenshots if possible)_
|
_(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...)_
|
||||||
|
|
||||||
|
### Are you using the newest version of uYouPlus? If not, why?
|
||||||
|
_(Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the latest version before reporting about an issue???)_
|
||||||
|
|
||||||
### Does the issue happen with the official YouTube from AppStore?
|
### Does the issue happen with the official YouTube from AppStore?
|
||||||
_(Well, YouTube itself is buggy sometimes...)_
|
_(Well, YouTube itself is buggy sometimes...)_
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ on:
|
|||||||
uyou_version:
|
uyou_version:
|
||||||
description: "The version of uYou"
|
description: "The version of uYou"
|
||||||
default: "2.1"
|
default: "2.1"
|
||||||
required: false
|
required: true
|
||||||
type: string
|
type: string
|
||||||
decrypted_youtube_url:
|
decrypted_youtube_url:
|
||||||
description: "The direct URL to the decrypted YouTube ipa"
|
description: "The direct URL to the decrypted YouTube ipa"
|
||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
- name: Setup Theos Jailed
|
- name: Setup Theos Jailed
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
repository: kabiroberai/theos-jailed
|
repository: qnblackcat/theos-jailed
|
||||||
ref: master
|
ref: master
|
||||||
path: theos-jailed
|
path: theos-jailed
|
||||||
submodules: recursive
|
submodules: recursive
|
||||||
|
|||||||
@@ -3,12 +3,18 @@
|
|||||||
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
||||||
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
||||||
#define YT_NAME @"YouTube"
|
#define YT_NAME @"YouTube"
|
||||||
|
#define UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
|
||||||
|
#define THRESHOLD 1.99 // DontEatMycontent
|
||||||
|
|
||||||
// IAmYouTube
|
// IAmYouTube
|
||||||
@interface SSOConfiguration : NSObject
|
@interface SSOConfiguration : NSObject
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// uYouPlus
|
// uYouPlus
|
||||||
|
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
|
||||||
|
- (void)confirmAlertDidPressConfirm;
|
||||||
|
@end
|
||||||
|
|
||||||
@interface YTMainAppControlsOverlayView : UIView
|
@interface YTMainAppControlsOverlayView : UIView
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -26,6 +32,35 @@
|
|||||||
@interface FRPSliderCell : UITableViewCell
|
@interface FRPSliderCell : UITableViewCell
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface boolSettingsVC : UIViewController
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface PlayerManager : NSObject
|
||||||
|
- (float)progress;
|
||||||
|
@end
|
||||||
|
|
||||||
|
// DontEatMyContent
|
||||||
|
NSString* deviceName();
|
||||||
|
BOOL isDeviceSupported();
|
||||||
|
void activate();
|
||||||
|
void deactivate();
|
||||||
|
void center();
|
||||||
|
|
||||||
|
@interface YTPlayerView : UIView
|
||||||
|
- (BOOL)zoomToFill;
|
||||||
|
- (id)renderingView;
|
||||||
|
- (id)playerView;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLHAMSBDLSampleBufferRenderingView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
||||||
|
- (BOOL)isFullscreen;
|
||||||
|
- (id)videoPlayerOverlayView;
|
||||||
|
- (id)activeVideoPlayerOverlay;
|
||||||
|
@end
|
||||||
|
|
||||||
// iOS16 fix
|
// iOS16 fix
|
||||||
@interface OBPrivacyLinkButton : UIButton
|
@interface OBPrivacyLinkButton : UIButton
|
||||||
- (instancetype)initWithCaption:(NSString *)caption
|
- (instancetype)initWithCaption:(NSString *)caption
|
||||||
@@ -52,6 +87,8 @@
|
|||||||
// YTAutoFullScreen
|
// YTAutoFullScreen
|
||||||
@interface YTPlayerViewController (YTAFS)
|
@interface YTPlayerViewController (YTAFS)
|
||||||
- (void)autoFullscreen;
|
- (void)autoFullscreen;
|
||||||
|
- (id)activeVideoPlayerOverlay; // DontEatMycontent
|
||||||
|
- (id)playerView; // DontEatMycontent
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// OLED Darkmode
|
// OLED Darkmode
|
||||||
@@ -83,4 +120,4 @@
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
@interface UIPredictionViewController : UIViewController
|
@interface UIPredictionViewController : UIViewController
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ BUNDLE_ID = com.google.ios.youtube
|
|||||||
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YoutubeSpeed.dylib
|
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YoutubeSpeed.dylib
|
||||||
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
||||||
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
||||||
uYouPlus_FRAMEWORKS = UIKit
|
uYouPlus_FRAMEWORKS = UIKit Security
|
||||||
uYouPlus_CFLAGS = -fobjc-arc
|
uYouPlus_CFLAGS = -fobjc-arc
|
||||||
|
|
||||||
include $(THEOS)/makefiles/common.mk
|
include $(THEOS)/makefiles/common.mk
|
||||||
@@ -25,6 +25,8 @@ before-package::
|
|||||||
@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/YTUHD/layout/Library/Application\ Support/YTUHD.bundle Resources/
|
||||||
|
@cp -R Tweaks/Return-YouTube-Dislikes/layout/Library/Application\ Support/RYD.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/
|
||||||
@cp -R lang/uYouPlus.bundle Resources/
|
@cp -R lang/uYouPlus.bundle Resources/
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||

|

|
||||||
|
|
||||||
# Table of Contents
|
# Table of Contents
|
||||||
|
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
- [BandarHL](https://twitter.com/bandarhl) for a bunch of improvements.
|
- [BandarHL](https://twitter.com/bandarhl) for a bunch of improvements.
|
||||||
|
|
||||||
|
- [Julioverne](https://twitter.com/ijulioverne) for the solution to skip Google's safety warning when logging in.
|
||||||
|
|
||||||
- [Lyvendia](https://github.com/Lyvendia/) for [YTSpeed](https://github.com/Lyvendia/YTSpeed/)
|
- [Lyvendia](https://github.com/Lyvendia/) for [YTSpeed](https://github.com/Lyvendia/YTSpeed/)
|
||||||
|
|
||||||
- [YouTube Extensions](https://github.com/CokePokes/YoutubeExtensions) by [CokePokes](https://github.com/CokePokes/).
|
- [YouTube Extensions](https://github.com/CokePokes/YoutubeExtensions) by [CokePokes](https://github.com/CokePokes/).
|
||||||
@@ -72,22 +74,22 @@
|
|||||||
|
|
||||||
# Download
|
# Download
|
||||||
|
|
||||||
- **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).
|
- **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 AltStore repo: https://qnblackcat.github.io/AltStore/
|
- My official AltStore repo: https://qnblackcat.github.io/AltStore/
|
||||||
|
|
||||||
- [Open in AltStore (v17.31.4-2.1)](https://tinyurl.com/2p99amjz) - It will take a while to install because AltStore needs to download the IPA.
|
- [Open in AltStore (v17.37.3-2.1)](https://tinyurl.com/2p8pd9n7) - It will take a while to install because AltStore needs to download the IPA.
|
||||||
|
|
||||||
- Version info: _(last update: Aug 12)_
|
- Version info: _(last update: Sep 24)_
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Expand</summary>
|
<summary>Expand</summary>
|
||||||
|
|
||||||
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
||||||
| - | - | :-: | :-: |
|
| - | - | :-: | :-: |
|
||||||
| **YouTube** | Google Inc | 17.31.4 | ✖︎ |
|
| **YouTube** | Google Inc | 17.37.3 | ✖︎ |
|
||||||
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
|
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
|
||||||
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
|
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
|
||||||
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||||
@@ -97,8 +99,8 @@
|
|||||||
| **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
|
| **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
|
||||||
| **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
|
| **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
|
||||||
| **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
|
| **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
|
||||||
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.9 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.10 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||||
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.7 | [✔︎](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) |
|
| **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) |
|
| **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) |
|
| **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
|
||||||
@@ -106,7 +108,7 @@
|
|||||||
| **YTAutoFullScreen** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
|
| **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) |
|
| **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) |
|
| **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) |
|
| **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.6.8 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||||
| **YTNoCheckLocalNetwork** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
| **YTNoCheckLocalNetwork** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
@@ -115,36 +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>Bandar Alruwaili (BandarHL)</summary>
|
|
||||||
|
|
||||||
- Paypal: https://www.paypal.com/paypalme/BandarHL
|
|
||||||
</details>
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Galactic-dev</summary>
|
|
||||||
|
|
||||||
- Paypal: https://www.paypal.com/paypalme/DBrett684
|
|
||||||
|
|
||||||
- Venmo: https://venmo.com/u/DavidBrett
|
|
||||||
</details>
|
|
||||||
|
|
||||||
|
|
||||||
# FAQ
|
# FAQ
|
||||||
|
|
||||||
|
|||||||
+32
-2
@@ -23,6 +23,9 @@ extern BOOL castConfirm();
|
|||||||
extern BOOL ytMiniPlayer();
|
extern BOOL ytMiniPlayer();
|
||||||
extern BOOL hidePreviousAndNextButton();
|
extern BOOL hidePreviousAndNextButton();
|
||||||
extern BOOL hidePaidPromotionCard();
|
extern BOOL hidePaidPromotionCard();
|
||||||
|
extern BOOL fixGoogleSignIn();
|
||||||
|
extern BOOL replacePreviousAndNextButton();
|
||||||
|
extern BOOL dontEatMyContent();
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
%hook YTAppSettingsPresentationData
|
%hook YTAppSettingsPresentationData
|
||||||
@@ -51,6 +54,33 @@ extern BOOL hidePaidPromotionCard();
|
|||||||
exit(0);
|
exit(0);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
YTSettingsSectionItem *dontEatMyContent = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"DONT_EAT_MY_CONTENT") titleDescription:LOC(@"DONT_EAT_MY_CONTENT_DESC")];
|
||||||
|
dontEatMyContent.hasSwitch = YES;
|
||||||
|
dontEatMyContent.switchVisible = YES;
|
||||||
|
dontEatMyContent.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"dontEatMyContent_enabled"];
|
||||||
|
dontEatMyContent.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"dontEatMyContent_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
|
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 *fixGoogleSignIn = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"FIX_GOOGLE_SIGNIN") titleDescription:LOC(@"FIX_GOOGLE_SIGNIN_DESC")];
|
||||||
|
fixGoogleSignIn.hasSwitch = YES;
|
||||||
|
fixGoogleSignIn.switchVisible = YES;
|
||||||
|
fixGoogleSignIn.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"fixGoogleSignIn_enabled"];
|
||||||
|
fixGoogleSignIn.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"fixGoogleSignIn_enabled"];
|
||||||
|
return YES;
|
||||||
|
};
|
||||||
|
|
||||||
YTSettingsSectionItem *hidePaidPromotionCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PAID_PROMOTION_CARDS") titleDescription:LOC(@"HIDE_PAID_PROMOTION_CARDS_DESC")];
|
YTSettingsSectionItem *hidePaidPromotionCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PAID_PROMOTION_CARDS") titleDescription:LOC(@"HIDE_PAID_PROMOTION_CARDS_DESC")];
|
||||||
hidePaidPromotionCard.hasSwitch = YES;
|
hidePaidPromotionCard.hasSwitch = YES;
|
||||||
hidePaidPromotionCard.switchVisible = YES;
|
hidePaidPromotionCard.switchVisible = YES;
|
||||||
@@ -168,7 +198,7 @@ extern BOOL hidePaidPromotionCard();
|
|||||||
return YES;
|
return YES;
|
||||||
};
|
};
|
||||||
|
|
||||||
NSMutableArray <YTSettingsSectionItem *> *sectionItems = [NSMutableArray arrayWithArray:@[killApp, autoFull, castConfirm, ytMiniPlayer, hideAutoplaySwitch, hideCC, hideHUD, hidePaidPromotionCard, hidePreviousAndNextButton, hideHoverCard, bigYTMiniPlayer, oledDarkMode, oledKeyBoard, reExplore]];
|
NSMutableArray <YTSettingsSectionItem *> *sectionItems = [NSMutableArray arrayWithArray:@[killApp, autoFull, castConfirm, ytMiniPlayer, fixGoogleSignIn, hideAutoplaySwitch, hideCC, hideHUD, hidePaidPromotionCard, hidePreviousAndNextButton, hideHoverCard, bigYTMiniPlayer, oledDarkMode, oledKeyBoard, dontEatMyContent, replacePreviousAndNextButton, reExplore]];
|
||||||
[delegate setSectionItems:sectionItems forCategory:uYouPlusSection title:@"uYouPlus" titleDescription:nil headerHidden:NO];
|
[delegate setSectionItems:sectionItems forCategory:uYouPlusSection title:@"uYouPlus" titleDescription:nil headerHidden:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,4 +209,4 @@ extern BOOL hidePaidPromotionCard();
|
|||||||
}
|
}
|
||||||
%orig;
|
%orig;
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|||||||
Submodule Tweaks/Return-YouTube-Dislikes updated: deae67afea...80074def6c
+1
-1
Submodule Tweaks/YTUHD updated: b0d24c0859...5f556078cf
+1
-1
Submodule Tweaks/YouPiP updated: a8c4224f7d...b73ce464dc
+1
-1
Submodule Tweaks/YouTubeHeader updated: 08eeeb7a9c...d6bc59b8f9
+1
-1
Submodule Tweaks/iSponsorBlock updated: 82d717878f...997d792317
@@ -1,10 +1,19 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
"DONT_EAT_MY_CONTENT" = "منع النوتش/الجزيرة التفاعلية على مقاطع 2:1 (أداة DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "منع النوتش/الجزيرة التفاعلية من قص المقاطع التي تكون نسبة العرض إلى الارتفاع فيها تساوي 2:1. يتطلب إعادة تشغيل التطبيق.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "تقدم وتراجع بدلاً من السابق والتالي";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "استبدال زرّي المقطع السابق والمقطع التالي بزرّي تقدم وتراجع. يتطلب إعادة تشغيل التطبيق.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "إصلاح تسجيل الدخول بحساب جوجل (لمستخدمي TrollStore فقط)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "هذا الخيار لا يعمل إلا إذا كان التطبيق مثبت بواسطة TrollStore: فعل هذا الخيار لتتمكن من تسجيل الدخول بحساب جوجل. يتطلب إعادة تشغيل التطبيق.";
|
||||||
|
|
||||||
"KILL_APP" = "إغلاق تطبيق يوتيوب";
|
"KILL_APP" = "إغلاق تطبيق يوتيوب";
|
||||||
"KILL_APP_DESC" = "المس هنا لإغلاق تطبيق يوتيوب!";
|
"KILL_APP_DESC" = "المس هنا لإغلاق تطبيق يوتيوب!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "إخفاء زر السابق والتالي";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "إخفاء زرّي السابق والتالي";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "إخفاء زرّي السابق والتالي من أزرار التحكم على الفيديو.";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "إخفاء زرّي المقطع السابق والمقطع التالي من أزرار التحكم على الفيديو.";
|
||||||
|
|
||||||
"YT_MINIPLAYER" = "السماح بالمشغل المصغّر لكل فيديوهات يوتيوب";
|
"YT_MINIPLAYER" = "السماح بالمشغل المصغّر لكل فيديوهات يوتيوب";
|
||||||
"YT_MINIPLAYER_DESC" = "عند تصغير فيديوهات الأطفال مثلاً (قبل إغلاق المقطع).";
|
"YT_MINIPLAYER_DESC" = "عند تصغير فيديوهات الأطفال مثلاً (قبل إغلاق المقطع).";
|
||||||
@@ -46,4 +55,4 @@
|
|||||||
"CASTING" = "البث";
|
"CASTING" = "البث";
|
||||||
"MSG_ARE_YOU_SURE" = "هل أنت متأكد أنك تريد بدء البث؟";
|
"MSG_ARE_YOU_SURE" = "هل أنت متأكد أنك تريد بدء البث؟";
|
||||||
"MSG_YES" = "نعم";
|
"MSG_YES" = "نعم";
|
||||||
"MSG_CANCEL" = "إلغاء";
|
"MSG_CANCEL" = "إلغاء";
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
// 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
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Zabránit zářezu/ostrovu na videoobsahu 2:1 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Zabraňte tomu, aby zářez/Dynamic Island žvýkal video obsah 2:1 na YouTube. Je vyžadován restart aplikace.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Nahradit předchozí a další tlačítko";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Nahradit předchozí a následující tlačítko tlačítkem Přetočit vpřed a vzad. Je vyžadován restart aplikace.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Opravit přihlášení přes Google (pouze pro uživatele TrollStore)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Tuto možnost zapněte pouze v případě, že se nemůžete přihlásit pomocí svého účtu Google a aplikace byla nainstalována prostřednictvím TrollStore. Pokud se můžete normálně přihlásit, ponechte ji deaktivovanou. Je vyžadován restart aplikace.";
|
||||||
|
|
||||||
|
"KILL_APP" = "Zavřít YouTube";
|
||||||
|
"KILL_APP_DESC" = "Klepnutím sem zavřete YouTube!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Skrýt tlačítka předchozí a následující";
|
"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.";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Skryje tlačítka předchozí a následující v překrytí ovládání videa.";
|
||||||
|
|||||||
@@ -1,16 +1,36 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Kerbe/Insel bei 2:1-Videoinhalten verhindern (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Verhindert, dass die Notch/Dynamic Island 2:1-Videoinhalte auf YouTube kaut. Neustart der App erforderlich.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Zurück- und Weiter-Schaltfläche ersetzen";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Ersetzen Sie die Schaltflächen „Zurück“ und „Weiter“ durch die Schaltflächen „Schnellvorlauf“ und „Rücklauf“. App-Neustart ist erforderlich.“;
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Google-Anmeldung reparieren (nur für TrollStore-Benutzer)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Aktivieren Sie diese Option nur, wenn Sie sich nicht mit Ihrem Google-Konto anmelden können und die App über den TrollStore installiert wurde. Wenn Sie sich normal anmelden können, lassen Sie sie deaktiviert. Ein Neustart der App ist erforderlich.";
|
||||||
|
|
||||||
|
"KILL_APP" = "YouTube schließen";
|
||||||
|
"KILL_APP_DESC" = "Hier tippen, um YouTube zu schließen!";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Vor- und Zurücktasten ersetzen";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Vor- und Zurücktasten mit Vor- und Zurückspultasten ersetzen. App restart is required.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Google-Anmeldung beheben (nur für TrollStore Benutzer!)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Aktiviere diese Option nur, wenn Sie sich nicht mit Ihrem Google-Account anmelden können und die App über TrollStore installiert wurde. Wenn Sie sich normal anmelden können, halte diese Option deaktiviert! App-Neustart erforderlich!";
|
||||||
|
|
||||||
|
"KILL_APP" = "YouTube crashen";
|
||||||
|
"KILL_APP_DESC" = "Tippe hier, um YouTube zum Abstürzen zu bringen!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Vor- und Zurücktasten ausblenden";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Vor- und Zurücktasten ausblenden";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Vor- und Zurückspultasten vom Videoplayer ausblenden.";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Vor- und Zurücktasten vom Videoplayer ausblenden.";
|
||||||
|
|
||||||
"YT_MINIPLAYER" = "Miniplayer für alle YT Videos aktivieren";
|
"YT_MINIPLAYER" = "Miniplayer für alle YouTube-Videos aktivieren";
|
||||||
"YT_MINIPLAYER_DESC" = "z.B. bei Videos für Kinder";
|
"YT_MINIPLAYER_DESC" = "z.B. bei Videos für Kinder.";
|
||||||
|
|
||||||
"CAST_CONFIRM" = "Warnung vor TV-Übertragungen (YTCastConfirm)";
|
"CAST_CONFIRM" = "Warnung vor TV-Übertragungen (YTCastConfirm)";
|
||||||
"CAST_CONFIRM_DESC" = "Zeigt eine Warnung an, um eine ausversehene TV-Übertragung zu verhindern.";
|
"CAST_CONFIRM_DESC" = "Zeigt eine Warnung an, um eine ausversehene TV-Übertragung zu verhindern.";
|
||||||
|
|
||||||
"HIDE_HOVER_CARD" = "Endkarten ausblenden (YTNoHoverCards)";
|
"HIDE_HOVER_CARD" = "Endkarten ausblenden (YTNoHoverCards)";
|
||||||
"HIDE_HOVER_CARD_DESC" = "Endkarten (Thumbnails) am Ende des Videos ausblenden.";
|
"HIDE_HOVER_CARD_DESC" = "Creator-Endkarten (Thumbnails) am Ende des Videos ausblenden.";
|
||||||
|
|
||||||
"NEW_MINIPLAYER_STYLE" = "Neuer Miniplayer Style (BigYTMiniPlayer)";
|
"NEW_MINIPLAYER_STYLE" = "Neuer Miniplayer Style (BigYTMiniPlayer)";
|
||||||
"NEW_MINIPLAYER_STYLE_DESC" = "App-Neustart erforderlich!";
|
"NEW_MINIPLAYER_STYLE_DESC" = "App-Neustart erforderlich!";
|
||||||
@@ -34,7 +54,7 @@
|
|||||||
"OLED_DARKMODE_DESC" = "Könnte in manchen Fällen nicht richtig funktionieren. App-Neustart ist erforderlich, wenn diese Option akti-/deaktiviert wird!";
|
"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" = "OLED-Tastatur (Experimental)";
|
||||||
"OLED_KEYBOARD_DESC" = "Könnte in manchen Fällen nicht richtig funktionieren. App-Neustart erforderlich1";
|
"OLED_KEYBOARD_DESC" = "Könnte in manchen Fällen nicht richtig funktionieren. App-Neustart erforderlich!";
|
||||||
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS" = "Enthält bezahlte Werbung Info ausblenden";
|
"HIDE_PAID_PROMOTION_CARDS" = "Enthält bezahlte Werbung Info ausblenden";
|
||||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Enthält bezahlte Werbung Infobanner bei manchen Videos ausblenden.";
|
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Enthält bezahlte Werbung Infobanner bei manchen Videos ausblenden.";
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Αποτροπή Notch/Island σε περιεχόμενο βίντεο 2:1 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Αποτρέψτε το notch/Dynamic Island από το να μασουλάει περιεχόμενο βίντεο 2:1 στο YouTube. Απαιτείται επανεκκίνηση της εφαρμογής.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Αντικατάσταση του Προηγούμενου και του Επόμενου Κουμπιού";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Αντικατάσταση του Προηγούμενου και του Επόμενου κουμπιού με το κουμπί Γρήγορη κίνηση προς τα εμπρός και προς τα πίσω. Απαιτείται επανεκκίνηση της εφαρμογής.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Διόρθωση σύνδεσης Google (μόνο για χρήστες του TrollStore)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Ενεργοποιήστε αυτήν την επιλογή μόνο όταν δεν μπορείτε να συνδεθείτε με τον λογαριασμό σας Google και η εφαρμογή έχει εγκατασταθεί μέσω του TrollStore. Εάν μπορείτε να συνδεθείτε κανονικά, διατηρήστε την απενεργοποιημένη. Απαιτείται επανεκκίνηση της εφαρμογής.";
|
||||||
|
|
||||||
|
"KILL_APP" = "Κλείσιμο YouTube";
|
||||||
|
"KILL_APP_DESC" = "Πατήστε εδώ για να κλείσετε το YouTube!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί κατά την αναπαραγωγή βίντεο.";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί κατά την αναπαραγωγή βίντεο.";
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Prevent Notch/Island on 2:1 Video Content (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube. App restart is required.";
|
||||||
|
|
||||||
|
"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" = "Turn on this option only when you can't sign in with your Google account and the app was installed via TrollStore. If you can log in normally, keep it disabled. App restart is required.";
|
||||||
|
|
||||||
"KILL_APP" = "Close YouTube";
|
"KILL_APP" = "Close YouTube";
|
||||||
"KILL_APP_DESC" = "Tap here to close YouTube!";
|
"KILL_APP_DESC" = "Tap here to close YouTube!";
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Evitar Notch/Island en contenido de video 2:1 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Evite que la muesca/Dynamic Island se trague contenido de video 2:1 en YouTube. Es necesario reiniciar la aplicación.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Reemplazar botón anterior y siguiente";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Reemplace el botón Anterior y Siguiente con el botón Avance rápido y Rebobinado. Es necesario reiniciar la aplicación.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Reparar el inicio de sesión de Google (solo para usuarios de TrollStore)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Active esta opción solo cuando no pueda iniciar sesión con su cuenta de Google y la aplicación se instaló a través de TrollStore. Si puede iniciar sesión normalmente, manténgala desactivada. Es necesario reiniciar la aplicación.";
|
||||||
|
|
||||||
"KILL_APP" = "Cerrar YouTube";
|
"KILL_APP" = "Cerrar YouTube";
|
||||||
"KILL_APP_DESC" = "Toca aquí para cerrar YouTube!";
|
"KILL_APP_DESC" = "Toca aquí para cerrar YouTube!";
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Evitar Notch/Island en contenido de video 2:1 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Evite que la muesca/Dynamic Island se trague contenido de video 2:1 en YouTube. Es necesario reiniciar la aplicación.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Reemplazar botón anterior y siguiente";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Reemplace el botón Anterior y Siguiente con el botón Avance rápido y Rebobinado. Es necesario reiniciar la aplicación.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Reparar el inicio de sesión de Google (solo para usuarios de TrollStore)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Active esta opción solo cuando no pueda iniciar sesión con su cuenta de Google y la aplicación se instaló a través de TrollStore. Si puede iniciar sesión normalmente, manténgala desactivada. Es necesario reiniciar la aplicación.";
|
||||||
|
|
||||||
"KILL_APP" = "Fermer YouTube";
|
"KILL_APP" = "Fermer YouTube";
|
||||||
"KILL_APP_DESC" = "Appuyez ici pour fermer YouTube !";
|
"KILL_APP_DESC" = "Appuyez ici pour fermer YouTube !";
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "מנע חריץ/אי בתוכן וידאו 2:1 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "מנע מהחריץ/האי הדינמי ללעוס תוכן וידאו 2:1 ב-YouTube. נדרשת הפעלה מחדש של האפליקציה.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "החלף את הלחצן הקודם והבא";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "החלף את הלחצן הקודם והבא בלחצן הרצה קדימה והאחורה. נדרשת הפעלה מחדש של האפליקציה.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "תקן כניסה של Google (עבור משתמש TrollStore בלבד)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "הפעל אפשרות זו רק כאשר אינך יכול להיכנס עם חשבון Google שלך והאפליקציה הותקנה דרך TrollStore. אם אתה יכול להתחבר כרגיל, השאר אותה מושבתת. נדרשת הפעלה מחדש של האפליקציה.";
|
||||||
|
|
||||||
|
"KILL_APP" = "סגור את YouTube";
|
||||||
|
"KILL_APP_DESC" = "הקש כאן כדי לסגור את YouTube!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "הסתר את הקודם והבא";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "הסתר את הקודם והבא";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "הסתר את כפתורי הקודם והבא בתצוגת השליטה בסרטון.";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "הסתר את כפתורי הקודם והבא בתצוגת השליטה בסרטון.";
|
||||||
|
|||||||
@@ -1,25 +1,31 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "前後の動画のボタンを置き換える";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "前後の動画を再生するボタンを早送り、巻き戻しボタンに置き換えます。アプリの再起動が必要です。";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Googleのサインイン (TrollStoreユーザーのみ)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "アプリがTrollStoreでインストールされた場合のみ機能します。このオプションを有効にしてGoogleアカウントでサインインできるようにします。アプリの再起動が必要です。";
|
||||||
|
|
||||||
"KILL_APP" = "YouTubeを閉じる";
|
"KILL_APP" = "YouTubeを閉じる";
|
||||||
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
|
"KILL_APP_DESC" = "ここをタップしてYouTubeを終了できます!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "前後の動画のボタンを非表示";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "前後の動画のボタンを非表示";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "コントロールのオーバーレイで前後の動画のボタンを非表示にします。";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "動画コントロールのオーバーレイで前後の動画のボタンを非表示にします。";
|
||||||
|
|
||||||
"YT_MINIPLAYER" = "すべての動画でミニプレーヤーを有効にする";
|
"YT_MINIPLAYER" = "すべての動画でミニプレーヤーを有効にする";
|
||||||
"YT_MINIPLAYER_DESC" = "例: 子供向けの動画";
|
"YT_MINIPLAYER_DESC" = "例: 子ども向けの動画";
|
||||||
|
|
||||||
"CAST_CONFIRM" = "キャストする前に確認画面を表示する (YTCastConfirm)";
|
"CAST_CONFIRM" = "キャストする前に確認をする (YTCastConfirm)";
|
||||||
"CAST_CONFIRM_DESC" = "誤ってテレビにキャストしないよう、前に確認画面を表示します。";
|
"CAST_CONFIRM_DESC" = "誤ってテレビにキャストしないように、確認の警告を表示します。";
|
||||||
|
|
||||||
"HIDE_HOVER_CARD" = "動画終わりのホバーカードを非表示 (YTNoHoverCards)";
|
"HIDE_HOVER_CARD" = "動画終わりのホバーカードを非表示 (YTNoHoverCards)";
|
||||||
"HIDE_HOVER_CARD_DESC" = "動画終わりのホバーカード(サムネ)を非表示にします。";
|
"HIDE_HOVER_CARD_DESC" = "動画の最後のホバーカード(サムネイル)を非表示にします。";
|
||||||
|
|
||||||
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
|
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
|
||||||
"NEW_MINIPLAYER_STYLE_DESC" = "アプリを再起動してください。";
|
"NEW_MINIPLAYER_STYLE_DESC" = "アプリの再起動が必要です。";
|
||||||
|
|
||||||
"YT_RE_EXPLORE" = "ショートのタブを「見つける」タブに置き換える (YTReExplore)";
|
"YT_RE_EXPLORE" = "ショートタブを探索タブに置き換える (YTReExplore)";
|
||||||
"YT_RE_EXPLORE_DESC" = "アプリを再起動してください。";
|
"YT_RE_EXPLORE_DESC" = "アプリの再起動が必要です。";
|
||||||
|
|
||||||
"HIDE_SUBTITLES_BUTTON" = "字幕ボタンを非表示";
|
"HIDE_SUBTITLES_BUTTON" = "字幕ボタンを非表示";
|
||||||
"HIDE_SUBTITLES_BUTTON_DESC" = "動画コントロールのオーバーレイから字幕ボタンを非表示にします。";
|
"HIDE_SUBTITLES_BUTTON_DESC" = "動画コントロールのオーバーレイから字幕ボタンを非表示にします。";
|
||||||
@@ -31,19 +37,19 @@
|
|||||||
"AUTO_FULLSCREEN_DESC" = "動画を自動でフルスクリーンにします。";
|
"AUTO_FULLSCREEN_DESC" = "動画を自動でフルスクリーンにします。";
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "HUDのメッセージを非表示";
|
"HIDE_HUD_MESSAGES" = "HUDのメッセージを非表示";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がon/offです、ループ再生は有効です 等";
|
"HIDE_HUD_MESSAGES_DESC" = "例: 字幕がオン/オフになりました、ループ再生はオンになっています、等";
|
||||||
|
|
||||||
"OLED_DARKMODE" = "有機ELダークモード (実験的機能)";
|
"OLED_DARKMODE" = "有機ELダークモード (実験的機能)";
|
||||||
"OLED_DARKMODE_DESC" = "一部では正しく動作しない可能性があります。 この設定を変更したあとはアプリを再起動してください。";
|
"OLED_DARKMODE_DESC" = "正しく動作しない可能性があります。この設定を変更した場合、アプリの再起動が必要です。";
|
||||||
|
|
||||||
"OLED_KEYBOARD" = "有機ELキーボード (実験的機能)";
|
"OLED_KEYBOARD" = "有機ELキーボード (実験的機能)";
|
||||||
"OLED_KEYBOARD_DESC" = "一部では正しく動作しない可能性があります。 この設定を変更したあとはアプリを再起動してください。";
|
"OLED_KEYBOARD_DESC" = "正しく動作しない可能性があります。この設定を変更した場合、アプリの再起動が必要です。";
|
||||||
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS" = "「プロモーションを含む」 のバナーを非表示";
|
"HIDE_PAID_PROMOTION_CARDS" = "プロモーションバナーを非表示";
|
||||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画にある「プロモーションを含む」 のバナーを非表示にします。";
|
"HIDE_PAID_PROMOTION_CARDS_DESC" = "一部の動画で表示される「プロモーションを含みます」のバナーを非表示にします。";
|
||||||
|
|
||||||
// YTCastConfirm
|
// YTCastConfirm
|
||||||
"CASTING" = "キャスト";
|
"CASTING" = "キャスト";
|
||||||
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
|
"MSG_ARE_YOU_SURE" = "本当にキャストを開始しますか?";
|
||||||
"MSG_YES" = "はい";
|
"MSG_YES" = "はい";
|
||||||
"MSG_CANCEL" = "キャンセル";
|
"MSG_CANCEL" = "キャンセル";
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "노치/아일랜드 영역이 2:1 비율 비디오를 가리지 않게 함 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "노치/다이내믹 아일랜드 영역이 유튜브의 2:1 비율 영상 일부를 가리는 것을 막아줍니다. 앱을 다시 시작해야 합니다.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "이전, 다음 재생 버튼 교체";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "이전 재생, 다음 재생 버튼을 빨리 감기, 되감기 버튼으로 교체합니다. 앱을 다시 시작해야 합니다.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "구글 로그인 문제 수정 (TrollStore 사용자만 해당)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "TrollStore를 통해 설치된 앱에서만 동작합니다: 구글 계정으로 로그인하려면 이 옵션을 켜 주세요. 앱을 다시 시작해야 합니다.";
|
||||||
|
|
||||||
|
"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" = "취소";
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Substituir o botão Anterior e Próximo";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Substitui o botão Anterior e Próximo pelo botão Avançar e Retroceder. A reinicialização do app é necessária.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Corrigir o login do Google (somente para usuários da TrollStore)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Ative esta opção somente quando você não conseguir fazer login com sua conta do Google e o aplicativo foi instalado via TrollStore. Se você conseguir fazer login normalmente, mantenha-o desativado. A reinicialização do app é necessária.";
|
||||||
|
|
||||||
"KILL_APP" = "Fechar o YouTube";
|
"KILL_APP" = "Fechar o YouTube";
|
||||||
"KILL_APP_DESC" = "Toque aqui para fechar o YouTube!";
|
"KILL_APP_DESC" = "Toque aqui para fechar o YouTube!";
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,15 @@
|
|||||||
/* uYouPlusSettings */
|
/* uYouPlusSettings */
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Предотвратить выемку/остров на видеоконтенте 2:1 (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Не позволяйте вырезу/Dynamic Island поглощать видеоконтент 2:1 на YouTube. Требуется перезапуск приложения.";
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Заменить кнопку "Назад" и "Далее";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Замените кнопки «Назад» и «Далее» на кнопки «Перемотка вперед» и «Назад». Требуется перезапуск приложения.";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "Исправить вход через Google (только для пользователя TrollStore)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "Включайте эту опцию, только если вы не можете войти в свою учетную запись Google и приложение было установлено через TrollStore. Если вы можете нормально войти в систему, оставьте ее отключенной. Требуется перезапуск приложения.";
|
||||||
|
|
||||||
|
"KILL_APP" = "Закрыть YouTube";
|
||||||
|
"KILL_APP_DESC" = "Нажмите здесь, чтобы закрыть YouTube!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Скрыть «Пред.» и «След.»";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Скрыть «Пред.» и «След.»";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Убирает кнопки переключения видео «Следующий» и «Предыдущий» с плеера.";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Убирает кнопки переключения видео «Следующий» и «Предыдущий» с плеера.";
|
||||||
|
|||||||
@@ -1,16 +1,26 @@
|
|||||||
// How to translate uYouPlus to your language:
|
/* Read me:
|
||||||
//
|
- How to translate uYouPlus (if your language already exists then feel free to check it and/or improve it):
|
||||||
// 1. Fork uYouPlus repo
|
1. Fork uYouPlus repo
|
||||||
// 2. Duplicate the template.lproj folder, and edit the duplicated folder's name to your <lang_code>.lproj id.
|
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
|
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 =
|
3. Translate each line below after each =
|
||||||
// 4. Open a Pull Request
|
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, YTUHD and Return YouTube Dislike. The process is the same:
|
||||||
// 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
|
||||||
// https://github.com/PoomSmart/YouPiP/tree/main/layout/Library/Application%20Support/YouPiP.bundle
|
https://github.com/PoomSmart/YTUHD/tree/master/layout/Library/Application%20Support/YTUHD.bundle
|
||||||
//
|
https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Application%20Support/RYD.bundle
|
||||||
|
*/
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Prevent Notch/Island on 2:1 Video Content (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube. App restart is required.";
|
||||||
|
|
||||||
|
"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" = "Turn on this option only when you can't sign in with your Google account and the app was installed via TrollStore. If you can log in normally, keep it disabled. App restart is required.";
|
||||||
|
|
||||||
"KILL_APP" = "Close YouTube";
|
"KILL_APP" = "Close YouTube";
|
||||||
"KILL_APP_DESC" = "Tap here to close YouTube!";
|
"KILL_APP_DESC" = "Tap here to close YouTube!";
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
"DONT_EAT_MY_CONTENT" = "Ẩn tai thỏ/Dynamic Island (DontEatMyContent)";
|
||||||
|
"DONT_EAT_MY_CONTENT_DESC" = "Ẩn tai thỏ/Dynamic Island chèn vào các video có tỷ lệ 2:1. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
|
"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" = "Chỉ bật tính năng này khi bạn không thể đăng nhập tài khoản Google và ứng dụng được cài qua TrollStore. Nếu bạn có thể đăng nhập bình thường thì hãy tắt tính năng này. Cần khởi động lại ứng dụng.";
|
||||||
|
|
||||||
"KILL_APP" = "Đóng ứng dụng";
|
"KILL_APP" = "Đóng ứng dụng";
|
||||||
"KILL_APP_DESC" = "Chạm để đóng YouTube!";
|
"KILL_APP_DESC" = "Chạm để đóng YouTube!";
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "替换上一个/下一个按钮";
|
||||||
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "将播放器控制界面上的上一个/下一个按钮替换成快进/快退按钮。更改本设置后需要重启App。";
|
||||||
|
|
||||||
|
"FIX_GOOGLE_SIGNIN" = "修复Google账号登录问题(仅针对TrollStore用户)";
|
||||||
|
"FIX_GOOGLE_SIGNIN_DESC" = "仅在使用TrollStore安装本App的情况下生效:启用本选项后可正常登录您的Google账号。更改本设置后需要重启App。";
|
||||||
|
|
||||||
"KILL_APP" = "关闭YouTube";
|
"KILL_APP" = "关闭YouTube";
|
||||||
"KILL_APP_DESC" = "点击此处关闭YouTube!";
|
"KILL_APP_DESC" = "点击此处关闭YouTube!";
|
||||||
|
|
||||||
@@ -31,7 +37,7 @@
|
|||||||
"AUTO_FULLSCREEN_DESC" = "自动全屏播放视频。";
|
"AUTO_FULLSCREEN_DESC" = "自动全屏播放视频。";
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "隐藏系统提醒";
|
"HIDE_HUD_MESSAGES" = "隐藏系统提醒";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "例如:\"已启用/停用字幕\"、\"已开启/关闭视频循环播放\"等。";
|
"HIDE_HUD_MESSAGES_DESC" = "例如:“已启用/停用字幕”、“已开启/关闭视频循环播放”等。";
|
||||||
|
|
||||||
"OLED_DARKMODE" = "OLED 深色模式(实验性功能)";
|
"OLED_DARKMODE" = "OLED 深色模式(实验性功能)";
|
||||||
"OLED_DARKMODE_DESC" = "在某些情况下可能不会正常工作。更改本设置后需要重启App。";
|
"OLED_DARKMODE_DESC" = "在某些情况下可能不会正常工作。更改本设置后需要重启App。";
|
||||||
@@ -40,10 +46,10 @@
|
|||||||
"OLED_KEYBOARD_DESC" = "在某些情况下可能不会正常工作。更改本设置后需要重启App。";
|
"OLED_KEYBOARD_DESC" = "在某些情况下可能不会正常工作。更改本设置后需要重启App。";
|
||||||
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS" = "隐藏付费宣传内容提醒横幅";
|
"HIDE_PAID_PROMOTION_CARDS" = "隐藏付费宣传内容提醒横幅";
|
||||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "隐藏出现在部分视频中的\"包含付费宣传内容\"横幅。";
|
"HIDE_PAID_PROMOTION_CARDS_DESC" = "隐藏出现在部分视频中的“包含付费宣传内容”横幅。";
|
||||||
|
|
||||||
// YTCastConfirm
|
// YTCastConfirm
|
||||||
"CASTING" = "正在投屏";
|
"CASTING" = "准备投屏";
|
||||||
"MSG_ARE_YOU_SURE" = "您确定要开始投屏吗?";
|
"MSG_ARE_YOU_SURE" = "您确定要开始投屏吗?";
|
||||||
"MSG_YES" = "确定";
|
"MSG_YES" = "确定";
|
||||||
"MSG_CANCEL" = "取消";
|
"MSG_CANCEL" = "取消";
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
"KILL_APP" = "關閉YouTube";
|
||||||
|
"KILL_APP_DESC" = "按這裡關閉YouTube!";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
|
||||||
|
|
||||||
|
|||||||
+379
-66
@@ -2,6 +2,8 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import <objc/runtime.h>
|
#import <objc/runtime.h>
|
||||||
#import <dlfcn.h>
|
#import <dlfcn.h>
|
||||||
|
#import <sys/utsname.h>
|
||||||
|
#import <substrate.h>
|
||||||
#import "Header.h"
|
#import "Header.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
|
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
|
||||||
@@ -12,10 +14,11 @@
|
|||||||
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
|
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTColorPalette.h"
|
|
||||||
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
|
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
|
||||||
|
|
||||||
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
||||||
NSBundle *uYouPlusBundle() {
|
NSBundle *uYouPlusBundle() {
|
||||||
@@ -29,6 +32,25 @@ NSBundle *uYouPlusBundle() {
|
|||||||
}
|
}
|
||||||
NSBundle *tweakBundle = uYouPlusBundle();
|
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() {
|
BOOL hideHUD() {
|
||||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||||
@@ -72,12 +94,20 @@ BOOL ytMiniPlayer() {
|
|||||||
BOOL hidePaidPromotionCard() {
|
BOOL hidePaidPromotionCard() {
|
||||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePaidPromotionCard_enabled"];
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePaidPromotionCard_enabled"];
|
||||||
}
|
}
|
||||||
|
BOOL fixGoogleSignIn() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"fixGoogleSignIn_enabled"];
|
||||||
|
}
|
||||||
|
BOOL replacePreviousAndNextButton() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"replacePreviousAndNextButton_enabled"];
|
||||||
|
}
|
||||||
|
BOOL dontEatMyContent() {
|
||||||
|
return [[NSUserDefaults standardUserDefaults] boolForKey:@"dontEatMyContent_enabled"];
|
||||||
|
}
|
||||||
|
|
||||||
# pragma mark - Tweaks
|
# pragma mark - Tweaks
|
||||||
// Enable Reorder videos from playlist while on the Watch page - @PoomSmart
|
// Skips content warning before playing *some videos - @PoomSmart
|
||||||
%hook YTIPlaylistPanelVideoRenderer
|
%hook YTPlayabilityResolutionUserActionUIController
|
||||||
%new
|
- (void)showConfirmAlert { [self confirmAlertDidPressConfirm]; }
|
||||||
- (BOOL)canReorder { return YES; }
|
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
|
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
|
||||||
@@ -88,7 +118,7 @@ BOOL hidePaidPromotionCard() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Hide CC / Autoplay switch / Next & Previous button
|
// Hide CC / Autoplay switch
|
||||||
%hook YTMainAppControlsOverlayView
|
%hook YTMainAppControlsOverlayView
|
||||||
- (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { // hide CC button
|
- (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { // hide CC button
|
||||||
if (hideCC()) { return %orig(NO); }
|
if (hideCC()) { return %orig(NO); }
|
||||||
@@ -98,15 +128,22 @@ BOOL hidePaidPromotionCard() {
|
|||||||
if (hideAutoplaySwitch()) {}
|
if (hideAutoplaySwitch()) {}
|
||||||
else { return %orig; }
|
else { return %orig; }
|
||||||
}
|
}
|
||||||
- (void)layoutSubviews { // hide Next & Previous button
|
%end
|
||||||
%orig;
|
|
||||||
if (hidePreviousAndNextButton()) {
|
// Hide Next & Previous button
|
||||||
MSHookIvar<YTMainAppControlsOverlayView *>(self, "_nextButton").hidden = YES;
|
%group gHidePreviousAndNextButton
|
||||||
MSHookIvar<YTMainAppControlsOverlayView *>(self, "_previousButton").hidden = YES;
|
%hook YTColdConfig
|
||||||
MSHookIvar<YTTransportControlsButtonView *>(self, "_nextButtonView").hidden = YES;
|
- (BOOL)removeNextPaddleForSingletonVideos { return YES; }
|
||||||
MSHookIvar<YTTransportControlsButtonView *>(self, "_previousButtonView").hidden = 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
|
%end
|
||||||
|
|
||||||
// Hide HUD Messages
|
// Hide HUD Messages
|
||||||
@@ -175,16 +212,18 @@ BOOL hidePaidPromotionCard() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
|
// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263
|
||||||
%hook YTAdsInnerTubeContextDecorator
|
%hook YTDataUtils
|
||||||
- (void)decorateContext:(id)arg1 { %orig(nil); }
|
+ (NSMutableDictionary *)spamSignalsDictionary {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
||||||
%hook YTELMView
|
%hook UIResponder
|
||||||
%new
|
%new
|
||||||
- (id)entry {
|
- (id)entry {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
@@ -192,7 +231,17 @@ BOOL hidePaidPromotionCard() {
|
|||||||
%hook YTLocalPlaybackController
|
%hook YTLocalPlaybackController
|
||||||
%new
|
%new
|
||||||
- (id)activeVideoController {
|
- (id)activeVideoController {
|
||||||
return [self activeVideo];
|
return [self activeVideo];
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Workaround for qnblackcat/uYouPlus#10
|
||||||
|
%hook boolSettingsVC
|
||||||
|
- (instancetype)initWithTitle:(NSString *)title sections:(NSArray *)sections footer:(NSString *)footer {
|
||||||
|
if (@available(iOS 15, *))
|
||||||
|
if (![self valueForKey:@"_lastNotifiedTraitCollection"])
|
||||||
|
[self setValue:[UITraitCollection currentTraitCollection] forKey:@"_lastNotifiedTraitCollection"];
|
||||||
|
return %orig;
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
@@ -212,7 +261,7 @@ BOOL hidePaidPromotionCard() {
|
|||||||
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||||
%hook YTColdConfig
|
%hook YTColdConfig
|
||||||
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
||||||
- (BOOL)shouldUseAppThemeSetting { return YES; } // v16.xx
|
- (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; }
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
||||||
@@ -251,17 +300,73 @@ BOOL hidePaidPromotionCard() {
|
|||||||
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
|
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
|
||||||
%end
|
%end
|
||||||
|
|
||||||
%hook YTReelPlayerViewControllerSub // v16.42.3 - @level3tjg: https://reddit.com/r/jailbreak/comments/v29yvk/_/iasl1l0/
|
|
||||||
- (BOOL)shouldEnablePlayerBar { return YES; }
|
|
||||||
%end
|
|
||||||
|
|
||||||
// Workaround for issue #54
|
// Workaround for issue #54
|
||||||
%hook YTMainAppVideoPlayerOverlayViewController
|
%hook YTMainAppVideoPlayerOverlayViewController
|
||||||
- (void)updateRelatedVideos {
|
- (void)updateRelatedVideos {
|
||||||
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
|
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
|
||||||
else { return %orig; }
|
else { return %orig; }
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// Workaround for qnblackcat/uYouPlus#253, qnblackcat/uYouPlus#170
|
||||||
|
%hook YTReelWatchPlaybackOverlayView
|
||||||
|
- (YTQTMButton *)overflowButton {
|
||||||
|
if ([self respondsToSelector:@selector(orderedRightSideButtons)] &&
|
||||||
|
[self orderedRightSideButtons].count != 0)
|
||||||
|
return [self orderedRightSideButtons][0];
|
||||||
|
return %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook 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
|
// Hide YouTube Shorts banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts
|
||||||
%hook YTAsyncCollectionView
|
%hook YTAsyncCollectionView
|
||||||
@@ -340,6 +445,14 @@ BOOL hidePaidPromotionCard() {
|
|||||||
- (NSString *)bundleId { return YT_BUNDLE_ID; }
|
- (NSString *)bundleId { return YT_BUNDLE_ID; }
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
%hook APMAEU
|
||||||
|
+ (BOOL)isFAS { return YES; }
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook GULAppEnvironmentUtil
|
||||||
|
+ (BOOL)isFromAppStore { return YES; }
|
||||||
|
%end
|
||||||
|
|
||||||
%hook SSOConfiguration
|
%hook SSOConfiguration
|
||||||
- (id)initWithClientID:(id)clientID supportedAccountServices:(id)supportedAccountServices {
|
- (id)initWithClientID:(id)clientID supportedAccountServices:(id)supportedAccountServices {
|
||||||
self = %orig;
|
self = %orig;
|
||||||
@@ -369,6 +482,73 @@ BOOL hidePaidPromotionCard() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// Fix "Google couldn't confirm this attempt to sign in is safe. If you think this is a mistake, you can close and try again to sign in" - qnblackcat/uYouPlus#420
|
||||||
|
// Thanks to @AhmedBafkir and @kkirby - https://github.com/qnblackcat/uYouPlus/discussions/447#discussioncomment-3672881
|
||||||
|
%group gFixGoogleSignIn
|
||||||
|
%hook SSORPCService
|
||||||
|
+ (id)URLFromURL:(id)arg1 withAdditionalFragmentParameters:(NSDictionary *)arg2 {
|
||||||
|
NSURL *orig = %orig;
|
||||||
|
NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithURL:orig resolvingAgainstBaseURL:NO];
|
||||||
|
NSMutableArray *newQueryItems = [urlComponents.queryItems mutableCopy];
|
||||||
|
for (NSURLQueryItem *queryItem in urlComponents.queryItems) {
|
||||||
|
if ([queryItem.name isEqualToString:@"system_version"]
|
||||||
|
|| [queryItem.name isEqualToString:@"app_version"]
|
||||||
|
|| [queryItem.name isEqualToString:@"kdlc"]
|
||||||
|
|| [queryItem.name isEqualToString:@"kss"]
|
||||||
|
|| [queryItem.name isEqualToString:@"lib_ver"]
|
||||||
|
|| [queryItem.name isEqualToString:@"device_model"]) {
|
||||||
|
[newQueryItems removeObject:queryItem];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
urlComponents.queryItems = [newQueryItems copy];
|
||||||
|
return urlComponents.URL;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
// Fix "You can't sign in to this app because Google can't confirm that it's safe" warning when signing in. by julioverne & PoomSmart
|
||||||
|
// https://gist.github.com/PoomSmart/ef5b172fd4c5371764e027bea2613f93
|
||||||
|
// https://github.com/qnblackcat/uYouPlus/pull/398
|
||||||
|
/*
|
||||||
|
%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
|
# pragma mark - OLED dark mode by BandarHL
|
||||||
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
||||||
%group gOLED
|
%group gOLED
|
||||||
@@ -411,39 +591,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
%hook YTColorPalette // v16.42.3
|
|
||||||
- (UIColor *)brandBackgroundSolid {
|
|
||||||
if (self.pageStyle == 1) {
|
|
||||||
return [UIColor blackColor];
|
|
||||||
}
|
|
||||||
return %orig;
|
|
||||||
}
|
|
||||||
- (UIColor *)brandBackgroundPrimary {
|
|
||||||
if (self.pageStyle == 1) {
|
|
||||||
return [UIColor blackColor];
|
|
||||||
}
|
|
||||||
return %orig;
|
|
||||||
}
|
|
||||||
- (UIColor *)brandBackgroundSecondary {
|
|
||||||
if (self.pageStyle == 1) {
|
|
||||||
return [[UIColor blackColor] colorWithAlphaComponent:0.9];
|
|
||||||
}
|
|
||||||
return %orig;
|
|
||||||
}
|
|
||||||
- (UIColor *)staticBrandBlack {
|
|
||||||
if (self.pageStyle == 1) {
|
|
||||||
return [UIColor blackColor];
|
|
||||||
}
|
|
||||||
return %orig;
|
|
||||||
}
|
|
||||||
- (UIColor *)generalBackgroundA {
|
|
||||||
if (self.pageStyle == 1) {
|
|
||||||
return [UIColor blackColor];
|
|
||||||
}
|
|
||||||
return %orig;
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
// Account view controller
|
// Account view controller
|
||||||
%hook YTAccountPanelBodyViewController
|
%hook YTAccountPanelBodyViewController
|
||||||
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||||
@@ -469,7 +616,7 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
- (void)didMoveToWindow {
|
- (void)didMoveToWindow {
|
||||||
%orig;
|
%orig;
|
||||||
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
||||||
self.superview.backgroundColor = [UIColor clearColor];
|
self.superview.backgroundColor = [UIColor blackColor];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
@@ -594,7 +741,6 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
|
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
|
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
|
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.backgroundColor = [UIColor blackColor]; }
|
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
|
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
|
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||||
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
|
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
|
||||||
@@ -627,6 +773,7 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
- (void)didMoveToWindow {
|
- (void)didMoveToWindow {
|
||||||
%orig;
|
%orig;
|
||||||
if (isDarkMode()) {
|
if (isDarkMode()) {
|
||||||
|
self.backgroundColor = raisedColor;
|
||||||
self.subviews[1].backgroundColor = raisedColor;
|
self.subviews[1].backgroundColor = raisedColor;
|
||||||
self.superview.backgroundColor = raisedColor;
|
self.superview.backgroundColor = raisedColor;
|
||||||
}
|
}
|
||||||
@@ -728,6 +875,142 @@ static void replaceTab(YTIGuideResponse *response) {
|
|||||||
%end
|
%end
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// DontEatMyContent - @therealFoxster: https://github.com/therealFoxster/DontEatMyContent
|
||||||
|
double aspectRatio = 16/9;
|
||||||
|
bool zoomedToFill = false;
|
||||||
|
|
||||||
|
MLHAMSBDLSampleBufferRenderingView *renderingView;
|
||||||
|
NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
|
||||||
|
|
||||||
|
%group gDontEatMyContent
|
||||||
|
%hook YTPlayerViewController
|
||||||
|
- (void)viewDidAppear:(BOOL)animated {
|
||||||
|
YTPlayerView *playerView = [self playerView];
|
||||||
|
UIView *renderingViewContainer = MSHookIvar<UIView *>(playerView, "_renderingViewContainer");
|
||||||
|
renderingView = [playerView renderingView];
|
||||||
|
|
||||||
|
CGFloat constant = 23; // Make renderingView a bit larger since safe area has sizeable margins from the notch and side borders; tested on iPhone 13 mini
|
||||||
|
|
||||||
|
widthConstraint = [renderingView.widthAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.widthAnchor constant:constant];
|
||||||
|
heightConstraint = [renderingView.heightAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.heightAnchor constant:constant];
|
||||||
|
centerXConstraint = [renderingView.centerXAnchor constraintEqualToAnchor:renderingViewContainer.centerXAnchor];
|
||||||
|
centerYConstraint = [renderingView.centerYAnchor constraintEqualToAnchor:renderingViewContainer.centerYAnchor];
|
||||||
|
|
||||||
|
// playerView.backgroundColor = [UIColor greenColor];
|
||||||
|
// renderingViewContainer.backgroundColor = [UIColor redColor];
|
||||||
|
// renderingView.backgroundColor = [UIColor blueColor];
|
||||||
|
|
||||||
|
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
||||||
|
|
||||||
|
// Must check class since YTInlineMutedPlaybackPlayerOverlayViewController doesn't have -(BOOL)isFullscreen
|
||||||
|
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] && [activeVideoPlayerOverlay isFullscreen]) {
|
||||||
|
activate();
|
||||||
|
} else {
|
||||||
|
center();
|
||||||
|
}
|
||||||
|
|
||||||
|
%orig(animated);
|
||||||
|
}
|
||||||
|
- (void)didPressToggleFullscreen {
|
||||||
|
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
||||||
|
|
||||||
|
if (![activeVideoPlayerOverlay isFullscreen]) // Entering fullscreen
|
||||||
|
activate();
|
||||||
|
else // Exiting fullscreen
|
||||||
|
deactivate();
|
||||||
|
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
- (void)didSwipeToEnterFullscreen {
|
||||||
|
%orig; activate();
|
||||||
|
}
|
||||||
|
- (void)didSwipeToExitFullscreen {
|
||||||
|
%orig; deactivate();
|
||||||
|
}
|
||||||
|
- (void)singleVideo:(id)arg1 aspectRatioDidChange:(CGFloat)arg2 {
|
||||||
|
aspectRatio = arg2;
|
||||||
|
if (aspectRatio == 0.0) {
|
||||||
|
// App backgrounded
|
||||||
|
} else if (aspectRatio < THRESHOLD) {
|
||||||
|
deactivate();
|
||||||
|
} else {
|
||||||
|
activate();
|
||||||
|
}
|
||||||
|
%orig(arg1, arg2);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTVideoZoomOverlayView
|
||||||
|
- (void)didRecognizePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer {
|
||||||
|
// %log((CGFloat) [pinchGestureRecognizer scale], (CGFloat) [pinchGestureRecognizer velocity]);
|
||||||
|
if ([pinchGestureRecognizer velocity] <= 0.0) { // >>Zoom out<<
|
||||||
|
zoomedToFill = false;
|
||||||
|
activate();
|
||||||
|
} else if ([pinchGestureRecognizer velocity] > 0.0) { // <<Zoom in>>
|
||||||
|
zoomedToFill = true;
|
||||||
|
deactivate();
|
||||||
|
}
|
||||||
|
%orig(pinchGestureRecognizer);
|
||||||
|
}
|
||||||
|
- (void)flashAndHideSnapIndicator {}
|
||||||
|
// https://github.com/lgariv/UniZoom/blob/master/Tweak.xm
|
||||||
|
- (void)setSnapIndicatorVisible:(bool)arg1 {
|
||||||
|
%orig(NO);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end // gDontEatMyContent
|
||||||
|
|
||||||
|
// DontEatMycontent - detecting device model
|
||||||
|
// https://stackoverflow.com/a/11197770/19227228
|
||||||
|
NSString* deviceName() {
|
||||||
|
struct utsname systemInfo;
|
||||||
|
uname(&systemInfo);
|
||||||
|
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL isDeviceSupported() {
|
||||||
|
NSString *identifier = deviceName();
|
||||||
|
NSArray *unsupportedDevices = UNSUPPORTED_DEVICES;
|
||||||
|
|
||||||
|
for (NSString *device in unsupportedDevices) {
|
||||||
|
if ([device isEqualToString:identifier]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([identifier containsString:@"iPhone"]) {
|
||||||
|
NSString *model = [identifier stringByReplacingOccurrencesOfString:@"iPhone" withString:@""];
|
||||||
|
model = [model stringByReplacingOccurrencesOfString:@"," withString:@"."];
|
||||||
|
if ([identifier isEqualToString:@"iPhone13,1"]) { // iPhone 12 mini
|
||||||
|
return YES;
|
||||||
|
} else if ([model floatValue] >= 14.0) { // iPhone 13 series and newer
|
||||||
|
return YES;
|
||||||
|
} else return NO;
|
||||||
|
} else return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
void activate() {
|
||||||
|
if (aspectRatio < THRESHOLD || zoomedToFill) return;
|
||||||
|
// NSLog(@"activate");
|
||||||
|
center();
|
||||||
|
renderingView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
|
widthConstraint.active = YES;
|
||||||
|
heightConstraint.active = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
void deactivate() {
|
||||||
|
// NSLog(@"deactivate");
|
||||||
|
center();
|
||||||
|
renderingView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||||
|
widthConstraint.active = NO;
|
||||||
|
heightConstraint.active = NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
void center() {
|
||||||
|
centerXConstraint.active = YES;
|
||||||
|
centerYConstraint.active = YES;
|
||||||
|
}
|
||||||
|
|
||||||
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
|
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
|
||||||
%group iOS16
|
%group iOS16
|
||||||
%hook OBPrivacyLinkButton
|
%hook OBPrivacyLinkButton
|
||||||
@@ -750,9 +1033,6 @@ static void replaceTab(YTIGuideResponse *response) {
|
|||||||
# pragma mark - ctor
|
# pragma mark - ctor
|
||||||
%ctor {
|
%ctor {
|
||||||
%init;
|
%init;
|
||||||
if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"relatedVideosAtTheEndOfYTVideos"]) {
|
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"];
|
|
||||||
}
|
|
||||||
if (oled()) {
|
if (oled()) {
|
||||||
%init(gOLED);
|
%init(gOLED);
|
||||||
}
|
}
|
||||||
@@ -765,7 +1045,40 @@ static void replaceTab(YTIGuideResponse *response) {
|
|||||||
if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
|
if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
|
||||||
%init(Main);
|
%init(Main);
|
||||||
}
|
}
|
||||||
|
if (hidePreviousAndNextButton()) {
|
||||||
|
%init(gHidePreviousAndNextButton);
|
||||||
|
}
|
||||||
|
if (replacePreviousAndNextButton()) {
|
||||||
|
%init(gReplacePreviousAndNextButton);
|
||||||
|
}
|
||||||
|
if (dontEatMyContent() && isDeviceSupported()) {
|
||||||
|
%init(gDontEatMyContent);
|
||||||
|
}
|
||||||
if (@available(iOS 16, *)) {
|
if (@available(iOS 16, *)) {
|
||||||
%init(iOS16);
|
%init(iOS16);
|
||||||
}
|
}
|
||||||
}
|
if (!fixGoogleSignIn()) {
|
||||||
|
%init(gFixGoogleSignIn);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable broken options of uYou
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"removeYouTubeAds"];
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"disableAgeRestriction"];
|
||||||
|
|
||||||
|
// Change the default value of some uYou's options
|
||||||
|
if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"relatedVideosAtTheEndOfYTVideos"]) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"];
|
||||||
|
}
|
||||||
|
if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"uYouButtonVideoControlsOverlay"]) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"uYouButtonVideoControlsOverlay"];
|
||||||
|
}
|
||||||
|
if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"uYouPiPButtonVideoControlsOverlay"]) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"uYouPiPButtonVideoControlsOverlay"];
|
||||||
|
}
|
||||||
|
// if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"uYouRepeatButtonVideoControlsOverlay"]) {
|
||||||
|
// [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"uYouRepeatButtonVideoControlsOverlay"];
|
||||||
|
// }
|
||||||
|
// if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"uYouRightRotateButtonVideoControlsOverlay"]) {
|
||||||
|
// [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"uYouRightRotateButtonVideoControlsOverlay"];
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user