Compare commits
93
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82de8d62ac | ||
|
|
881d6292aa | ||
|
|
1150659ea1 | ||
|
|
a61882280e | ||
|
|
5aec68985f | ||
|
|
37bbbbf369 | ||
|
|
33deba766a | ||
|
|
1f3707a3f2 | ||
|
|
396515d600 | ||
|
|
a61405c3fb | ||
|
|
76837d0ce7 | ||
|
|
5475c77d52 | ||
|
|
e81e6ff159 | ||
|
|
d6694e4e14 | ||
|
|
90cd7cd3dd | ||
|
|
dc53dd2578 | ||
|
|
bd37e43070 | ||
|
|
544f6b57c4 | ||
|
|
43984cc2a6 | ||
|
|
5bfc931a02 | ||
|
|
2e2c364b44 | ||
|
|
3e63708ac8 | ||
|
|
fd603e902c | ||
|
|
f9de2d7b8d | ||
|
|
49ace6eb4d | ||
|
|
c42d2b85c9 | ||
|
|
880f92f2f6 | ||
|
|
4387a27214 | ||
|
|
aed43dc389 | ||
|
|
9edcd82315 | ||
|
|
acc86a1bf6 | ||
|
|
635b0673b4 | ||
|
|
6b60f22eaf | ||
|
|
65fd05f5db | ||
|
|
908caaf047 | ||
|
|
276ce261a5 | ||
|
|
da03ae08a6 | ||
|
|
2f9b656acd | ||
|
|
9c8486d017 | ||
|
|
e71069e678 | ||
|
|
0e1e6d4396 | ||
|
|
6b3026159c | ||
|
|
8aff0035ac | ||
|
|
b846e6e45e | ||
|
|
679ea7046c | ||
|
|
53b5fde3b7 | ||
|
|
2bd2174ffe | ||
|
|
79d9f0920c | ||
|
|
3c252a79d1 | ||
|
|
e3326f9adf | ||
|
|
64bab9b6d5 | ||
|
|
9ebbda2671 | ||
|
|
6b62aca494 | ||
|
|
f4d400d059 | ||
|
|
6efdf519f4 | ||
|
|
684f542aca | ||
|
|
d38993709e | ||
|
|
c5cdafd96f | ||
|
|
0635b3cfcf | ||
|
|
50baafebce | ||
|
|
4332070996 | ||
|
|
bc286ef74f | ||
|
|
fc6132d261 | ||
|
|
f560be0b66 | ||
|
|
2d7f2b7d2a | ||
|
|
df01ad4d48 | ||
|
|
5a76a9336b | ||
|
|
9a1c8c218d | ||
|
|
a1cf67d8fe | ||
|
|
c5fc18b755 | ||
|
|
42e3977f36 | ||
|
|
e50c308ec4 | ||
|
|
c7e24c47e2 | ||
|
|
9aa506b264 | ||
|
|
bd4fd45cf3 | ||
|
|
6b0b2133bd | ||
|
|
db1f9b6bc6 | ||
|
|
0c62646af2 | ||
|
|
96517062e1 | ||
|
|
a2441bfbc5 | ||
|
|
e15f540ab0 | ||
|
|
a3877ab91c | ||
|
|
d3c7347d31 | ||
|
|
6f4e2a3623 | ||
|
|
6981ae9a18 | ||
|
|
70e17b3ce0 | ||
|
|
46163626ed | ||
|
|
6b3ddf2915 | ||
|
|
eefb554631 | ||
|
|
12a3290350 | ||
|
|
b5b1e44d46 | ||
|
|
4362a638fe | ||
|
|
b4094e0c07 |
@@ -1,13 +1,13 @@
|
||||
---
|
||||
name: Bug
|
||||
about: Make sure you complete the template. Otherwise, it will be closed without further explanation!
|
||||
title: "[Bug]"
|
||||
title: "[Bug] (Replace this with your title)"
|
||||
labels: bug
|
||||
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](https://github.com/qnblackcat/uYouPlus/wiki/FAQ) page first!!! ⚠️
|
||||
|
||||
_Make sure you complete the template. Otherwise, it will be closed without further explanation!_
|
||||
|
||||
@@ -24,7 +24,7 @@ _Make sure you complete the template. Otherwise, it will be closed without furth
|
||||
_(Please attach videos or screenshots if possible)_
|
||||
|
||||
### Crash log (if possible)
|
||||
_(The crash log can be found in the Settings app > Privacy > Analytics & Improvements > Analytics Data > Youtube...)_
|
||||
_(The crash log can be found in your device's Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips)_
|
||||
|
||||
### 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???)_
|
||||
|
||||
@@ -7,7 +7,8 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Have you read the FAQ? Make sure you visit the FAQ page before asking any question!!!
|
||||
## Have you read the FAQ? Any questions that have been answered on the FAQ page will be closed without any explanation!
|
||||
|
||||
https://github.com/qnblackcat/uYouPlus/wiki/FAQ
|
||||
|
||||
###
|
||||
|
||||
@@ -21,9 +21,19 @@ on:
|
||||
default: ""
|
||||
required: true
|
||||
type: string
|
||||
bundle_id:
|
||||
description: "Modify the bundle ID. Not recommended"
|
||||
default: "com.google.ios.youtube"
|
||||
required: true
|
||||
type: string
|
||||
app_name:
|
||||
description: "Modify the name of the app on the Home Screen. Not recommended"
|
||||
default: "YouTube"
|
||||
required: true
|
||||
type: string
|
||||
create_release:
|
||||
description: "Create a draft release"
|
||||
default: false
|
||||
default: true
|
||||
required: false
|
||||
type: boolean
|
||||
|
||||
@@ -34,7 +44,7 @@ concurrency:
|
||||
jobs:
|
||||
build:
|
||||
name: Build uYouPlus
|
||||
runs-on: macos-latest
|
||||
runs-on: macos-11
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
@@ -55,8 +65,18 @@ jobs:
|
||||
ref: master
|
||||
path: theos
|
||||
submodules: recursive
|
||||
|
||||
|
||||
- name: Caching
|
||||
id: SDK
|
||||
uses: actions/cache@v3.0.11
|
||||
env:
|
||||
cache-name: iOS-15.5-SDK
|
||||
with:
|
||||
path: theos/sdks/
|
||||
key: ${{ env.cache-name }}
|
||||
|
||||
- name: Download iOS 15.5 SDK
|
||||
if: steps.SDK.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
svn checkout -q https://github.com/chrisharper22/sdks/trunk/iPhoneOS15.5.sdk
|
||||
mv *.sdk $THEOS/sdks
|
||||
@@ -77,34 +97,40 @@ jobs:
|
||||
env:
|
||||
THEOS: ${{ github.workspace }}/theos
|
||||
|
||||
- name: Download uYou & prepare YouTube iPA
|
||||
- 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
|
||||
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
|
||||
- name: Fix compiling & Build Package
|
||||
id: build_package
|
||||
run: |
|
||||
(echo 'THEOS_IGNORE_PARALLEL_BUILDING_NOTICE = yes' >> ~/.theosrc)
|
||||
cd ${{ github.workspace }}/main
|
||||
(cd ${{ github.workspace }}/main/Tweaks/YouPiP && sed -i '' "14s/$/ AVFoundation UIKit/" Makefile)
|
||||
(cd ${{ github.workspace }}/main/Tweaks/YTABConfig && sed -i '' "12s#.*#YTABConfig_FRAMEWORKS = UIKit#g" Makefile)
|
||||
sed -i '' "12s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
|
||||
sed -i '' "11s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
|
||||
make package FINALPACKAGE=1
|
||||
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
|
||||
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
|
||||
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"
|
||||
echo -e "==> \033[1mBundle ID: ${{ env.BUNDLE_ID }}\033[0m"
|
||||
|
||||
env:
|
||||
THEOS: ${{ github.workspace }}/theos
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||
BUNDLE_ID: ${{ inputs.bundle_id }}
|
||||
APP_NAME: ${{ inputs.app_name }}
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
@@ -112,13 +138,13 @@ jobs:
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||
with:
|
||||
name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}
|
||||
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
|
||||
id: create_release
|
||||
uses: softprops/action-gh-release@v0.1.14
|
||||
uses: softprops/action-gh-release@v0.1.15
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
@@ -127,5 +153,5 @@ jobs:
|
||||
with:
|
||||
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
||||
name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
||||
files: ./main/packages/*.ipa
|
||||
draft: ${{ env.DRAFT }}
|
||||
files: main/packages/*.ipa
|
||||
draft: ${{ env.DRAFT }}
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
#import "Tweaks/YouTubeHeader/YTAppDelegate.h"
|
||||
#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"
|
||||
#define UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
|
||||
#define THRESHOLD 1.99 // DontEatMycontent
|
||||
#define DEMC_UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
|
||||
#define DEMC_THRESHOLD 1.99 // DontEatMycontent
|
||||
#define DEFAULT_RATE 2.0f // YTSpeed
|
||||
|
||||
// IAmYouTube
|
||||
@@ -41,25 +42,33 @@
|
||||
@end
|
||||
|
||||
// DontEatMyContent
|
||||
NSString* deviceName();
|
||||
BOOL isDeviceSupported();
|
||||
void activate();
|
||||
void deactivate();
|
||||
void center();
|
||||
BOOL DEMC_deviceIsSupported();
|
||||
void DEMC_activate();
|
||||
void DEMC_deactivate();
|
||||
void DEMC_centerRenderingView();
|
||||
|
||||
@interface YTPlayerView : UIView
|
||||
- (BOOL)zoomToFill;
|
||||
- (id)renderingView;
|
||||
- (id)playerView;
|
||||
@end
|
||||
|
||||
@interface MLHAMSBDLSampleBufferRenderingView : UIView
|
||||
@end
|
||||
|
||||
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
||||
- (BOOL)isFullscreen;
|
||||
- (id)videoPlayerOverlayView;
|
||||
- (id)activeVideoPlayerOverlay;
|
||||
@end
|
||||
|
||||
@interface HAMSBDLSampleBufferRenderingView : UIView
|
||||
@end
|
||||
|
||||
@interface MLHAMSBDLSampleBufferRenderingView : HAMSBDLSampleBufferRenderingView
|
||||
@end
|
||||
|
||||
@interface YTMainAppEngagementPanelViewController : UIViewController
|
||||
- (BOOL)isLandscapeEngagementPanel;
|
||||
- (BOOL)isPeekingSupported;
|
||||
@end
|
||||
|
||||
@interface YTEngagementPanelContainerViewController : UIViewController
|
||||
- (BOOL)isLandscapeEngagementPanel;
|
||||
- (BOOL)isPeekingSupported;
|
||||
@end
|
||||
|
||||
// YTSpeed
|
||||
@@ -101,6 +110,12 @@ void center();
|
||||
- (id)activeVideo;
|
||||
@end
|
||||
|
||||
// uYou theme fix
|
||||
@interface YTAppDelegate ()
|
||||
@property(nonatomic, strong) id downloadsVC;
|
||||
@end
|
||||
|
||||
|
||||
// BigYTMiniPlayer
|
||||
@interface YTMainAppVideoPlayerOverlayView : UIView
|
||||
- (UIViewController *)_viewControllerForAncestor;
|
||||
@@ -122,6 +137,9 @@ void center();
|
||||
@end
|
||||
|
||||
// OLED Darkmode
|
||||
@interface ELMView : UIView
|
||||
@end
|
||||
|
||||
@interface ASWAppSwitcherCollectionViewCell : UIView
|
||||
@end
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
TARGET = iphone:clang:latest:13.0
|
||||
TARGET = iphone:clang:15.5:14.0
|
||||
uYouPlus_USE_FLEX = 0
|
||||
uYouPlus_USE_FISHHOOK = 0
|
||||
ARCHS = arm64
|
||||
MODULES = jailed
|
||||
FINALPACKAGE = 1
|
||||
CODESIGN_IPA = 0
|
||||
PACKAGE_VERSION = 17.40.5_2.1
|
||||
PACKAGE_VERSION = 17.48.2_2.1
|
||||
|
||||
TWEAK_NAME = uYouPlus
|
||||
DISPLAY_NAME = YouTube
|
||||
@@ -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/YTABConfig.dylib
|
||||
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
||||
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
||||
uYouPlus_IPA = tmp/Payload/YouTube.app
|
||||
uYouPlus_FRAMEWORKS = UIKit Security
|
||||
uYouPlus_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION)
|
||||
|
||||
|
||||
@@ -1,4 +1,28 @@
|
||||

|
||||
***
|
||||
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
|
||||
<a href="https://github.com/qnblackcat/uYouPlus/wiki/FAQ"><img src="https://img.shields.io/badge/Question%3F-FAQ-yellow" alt="Badge"></img></a>
|
||||
<a href="https://github.com/qnblackcat/uYouPlus/wiki/FAQ"><img src="https://custom-icon-badges.demolab.com/badge/translate-blue.svg?logo=translate&logoColor=white" alt="Badge"></img></a>
|
||||
|
||||
|
||||
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/qnblackcat/uYouPlus/release/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/qnblackcat/uYouPlus?color=brightgreen&label=Latest%20release" alt="Badge"></img></a>
|
||||
<a href="https://github.com/qnblackcat/uYouPlus/releases/latest"><img src="https://img.shields.io/github/downloads/qnblackcat/uYouPlus/total?label=Download" alt="Badge"></img></a>
|
||||
<a href="https://github.com/qnblackcat/uYouPlus/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/qnblackcat/uYouPlus?logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
|
||||
<a href="https://github.com/qnblackcat/uYouPlus/issues"><img src="https://custom-icon-badges.demolab.com/github/issues-raw/qnblackcat/uYouPlus?logo=issue-opened&label=Issues" alt="Badge"></img></a>
|
||||
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/github/stars/qnblackcat/uYouPlus?style=social" alt="Badge"/>
|
||||
<img src="https://img.shields.io/github/forks/qnblackcat/uYouPlus?style=social" alt="Badge"/>
|
||||
<a href="https://github.com/qnblackcat/uYouPlus#support-the-developers"><img src="https://img.shields.io/badge/-Support-lightgrey?style=social&logo=paypal" alt="Badge"></img></a>
|
||||
</p>
|
||||
|
||||
# Table of Contents
|
||||
|
||||
@@ -12,30 +36,102 @@
|
||||
* [Building](#building-optional)
|
||||
|
||||
# Credits
|
||||
- Special thanks to all the developers who have contributed to uYouPlus!
|
||||
|
||||
- [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) and [BigYTMiniPlayer](https://github.com/Galactic-Dev/BigYTMiniPlayer).
|
||||
|
||||
- [HASHBANG Productions](https://github.com/hbang) for [Alderis Color Picker](https://github.com/hbang/Alderis) - a dependency of iSponsorBlock.
|
||||
|
||||
- [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) for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards), [YTMiniplayerEnabler](https://github.com/level3tjg/YTMiniplayerEnabler) and many hot patches for uYou.
|
||||
|
||||
- [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/)
|
||||
|
||||
- [therealFoxster](https://github.com/therealFoxster) for [DontEatMyContent](https://github.com/therealFoxster/DontEatMyContent).
|
||||
|
||||
- [YouTube Extensions](https://github.com/CokePokes/YoutubeExtensions) by [CokePokes](https://github.com/CokePokes/).
|
||||
|
||||
- [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!
|
||||
<table id='credit'>
|
||||
<tr>
|
||||
<td id='miro92'>
|
||||
<a href='https://github.com/MiRO92'>
|
||||
<img src='https://github.com/MiRO92.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/miro92'>MiRO92</a></h4>
|
||||
</td>
|
||||
<td id='poomsmart'>
|
||||
<a href='https://github.com/PoomSmart'>
|
||||
<img src='https://github.com/PoomSmart.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/poomsmart'>PoomSmart</a></h4>
|
||||
</td>
|
||||
<td id='level3tjg'>
|
||||
<a href='https://github.com/level3tjg'>
|
||||
<img src='https://github.com/level3tjg.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/level3tjg'>level3tjg</a></h4>
|
||||
</td>
|
||||
<td id='bandarHL'>
|
||||
<a href='https://github.com/BandarHL'>
|
||||
<img src='https://github.com/BandarHL.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/bandarhl'>BandarHelal</a></h4>
|
||||
</td>
|
||||
<td id='galactic-dev'>
|
||||
<a href='https://github.com/Galactic-Dev'>
|
||||
<img src='https://github.com/Galactic-Dev.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/dev_galactic'>galactic</a></h4>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td id='julioverne'>
|
||||
<a href='https://github.com/julioverne'>
|
||||
<img src='https://github.com/julioverne.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/ijulioverne'>julioverne</a></h4>
|
||||
</td>
|
||||
<td id='hbang'>
|
||||
<a href='https://github.com/hbang'>
|
||||
<img src='https://github.com/hbang.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/hashbang'>HASHBANG</a></h4>
|
||||
</td>
|
||||
<td id='lyvendia'>
|
||||
<a href='https://github.com/Lyvendia'>
|
||||
<img src='https://github.com/Lyvendia.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://github.com/Lyvendia'>Lyvendia</a></h4>
|
||||
</td>
|
||||
<td id='foxster'>
|
||||
<a href='https://github.com/therealFoxster'>
|
||||
<img src='https://github.com/therealFoxster.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/therealFoxster'>Foxster</a></h4>
|
||||
</td>
|
||||
<td id='ichitaso'>
|
||||
<a href='https://github.com/ichitaso'>
|
||||
<img src='https://github.com/ichitaso.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/ichitaso'>ichitaso</a></h4>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td id='ahmed-bafkir'>
|
||||
<a href='https://github.com/AhmedBafkir'>
|
||||
<img src='https://github.com/AhmedBafkir.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/Peaceful_0'>Ahmed Bafkir</a></h4>
|
||||
</td>
|
||||
<td id='cokepokes'>
|
||||
<a href='https://github.com/CokePokes'>
|
||||
<img src='https://github.com/CokePokes.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://twitter.com/cokepokes'>CokePokes</a></h4>
|
||||
</td>
|
||||
<td id='isnackable'>
|
||||
<a href='https://github.com/ISnackable'>
|
||||
<img src='https://github.com/ISnackable.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://isnackable.me/'>Tommy Teo</a></h4>
|
||||
</td>
|
||||
<td id='theos-team'>
|
||||
<a href='https://github.com/theos/theos'>
|
||||
<img src='https://github.com/theos.png' width='140px;'>
|
||||
</a>
|
||||
<h4 align='center'><a href='https://theos.dev'>theos</a></h4>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
# Features
|
||||
|
||||
@@ -60,15 +156,17 @@
|
||||
|
||||
9. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
|
||||
|
||||
10. **NoYTPremium**: remove YouTube Premium upshells.
|
||||
10. **NoYTPremium**: remove YouTube Premium upsells.
|
||||
|
||||
11. **YTSpeed**: add 2.25, 2.5, 2.75, and 3x playback speed
|
||||
|
||||
12. **YTMiniplayerEnabler**: enable Miniplayer for all YouTube videos.
|
||||
|
||||
13. **DontEatMyContent**: Prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube.
|
||||
13. **DontEatMyContent**: prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube.
|
||||
|
||||
14. **YTShortsProgress**: Always enable progress bar and scrubbing in YouTube Shorts (iPhone only).
|
||||
14. **YTShortsProgress**: always enable progress bar and scrubbing in YouTube Shorts (iPhone only).
|
||||
|
||||
15. **YTABConfig**: allow user to control over YouTube A/B testing flags.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -80,49 +178,49 @@
|
||||
|
||||
# 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 14.0 or later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases/latest).
|
||||
|
||||
- For AltStore user:
|
||||
|
||||
- My official AltStore repo: https://qnblackcat.github.io/AltStore/
|
||||
|
||||
- [Open in AltStore (v17.40.5-2.1)](https://tinyurl.com/mr6r7z7r) - It will take a while to install because AltStore needs to download the IPA.
|
||||
- [Open in AltStore (v17.48.2-2.1)](https://tinyurl.com/59kjzeth) - It will take a while to install because AltStore needs to download the IPA first.
|
||||
|
||||
- Version info: _(last update: Oct 16)_
|
||||
- Version info: _(last update: Dec 12)_
|
||||
|
||||
<details>
|
||||
<summary>Expand</summary>
|
||||
<summary>Expand ℹ️</summary>
|
||||
|
||||
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
||||
| - | - | :-: | :-: |
|
||||
| **YouTube** | Google Inc | 17.40.5 | ✖︎ |
|
||||
| **YouTube** | Google Inc | 17.48.2 | ✖︎ |
|
||||
| [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 | ✖︎ |
|
||||
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||
| **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
|
||||
| **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
|
||||
| **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
|
||||
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.2 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
|
||||
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.5 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
|
||||
| **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) |
|
||||
| **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
|
||||
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.2 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.12 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.4-2 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.15-2 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
|
||||
| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.4.6 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
|
||||
| **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) |
|
||||
| **YTShortsProgress** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
|
||||
| **YTShortsProgress** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
|
||||
| **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.7.1 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||
| **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.9.0 | [✔︎](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>
|
||||
|
||||
# Installation
|
||||
See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation)
|
||||
See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation).
|
||||
|
||||
# Support the developers
|
||||
- [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support
|
||||
|
||||
+21
@@ -1,4 +1,5 @@
|
||||
#import "Tweaks/YouTubeHeader/YTSettingsViewController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTSearchableSettingsViewController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
|
||||
#import "Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
|
||||
#import "Tweaks/YouTubeHeader/YTUIUtils.h"
|
||||
@@ -40,6 +41,26 @@ extern BOOL dontEatMyContent();
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTSettingsViewController
|
||||
|
||||
- (void)loadWithModel:(id)model fromView:(UIView *)view {
|
||||
%orig;
|
||||
if ([[self valueForKey:@"_detailsCategoryID"] integerValue] == uYouPlusSection)
|
||||
MSHookIvar<BOOL>(self, "_shouldShowSearchBar") = YES;
|
||||
}
|
||||
|
||||
- (void)setSectionControllers {
|
||||
%orig;
|
||||
if (MSHookIvar<BOOL>(self, "_shouldShowSearchBar")) {
|
||||
YTSettingsSectionController *settingsSectionController = [self settingsSectionControllers][[self valueForKey:@"_detailsCategoryID"]];
|
||||
YTSearchableSettingsViewController *searchableVC = [self valueForKey:@"_searchableSettingsViewController"];
|
||||
if (settingsSectionController)
|
||||
[searchableVC storeCollectionViewSections:@[settingsSectionController]];
|
||||
}
|
||||
}
|
||||
|
||||
%end
|
||||
|
||||
%hook YTSettingsSectionItemManager
|
||||
%new
|
||||
- (void)updateuYouPlusSectionWithEntry:(id)entry {
|
||||
|
||||
+1
-1
Submodule Tweaks/Alderis updated: c5b3ed5761...7992b3b57e
Submodule Tweaks/Return-YouTube-Dislikes updated: 7ab4e0aac7...a8d6722271
+1
-1
Submodule Tweaks/YTABConfig updated: 9cacdfcf79...24ad4214b4
+1
-1
Submodule Tweaks/YTUHD updated: ec2af81752...ba1b89d24a
+1
-1
Submodule Tweaks/YouPiP updated: a664766449...abe97aa0cc
+1
-1
Submodule Tweaks/YouTubeHeader updated: b252585100...99f98ccbc1
+1
-1
Submodule Tweaks/iSponsorBlock updated: 997d792317...92007946c2
+15
-12
@@ -22,31 +22,34 @@ else
|
||||
fi
|
||||
|
||||
# Makefile
|
||||
if [ -d ./tmp ]
|
||||
if [ -d tmp ]
|
||||
then
|
||||
rm -rf ./tmp
|
||||
rm -rf tmp
|
||||
fi
|
||||
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
|
||||
if [[ $PATHTOYT == *.ipa ]]
|
||||
then
|
||||
unzip -q "$PATHTOYT" -d ./tmp
|
||||
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||
unzip -q "$PATHTOYT" -d tmp
|
||||
rm -rf tmp/Payload/YouTube.app/_CodeSignature/CodeResources
|
||||
rm -rf tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
||||
make package
|
||||
open ./packages
|
||||
make package FINALPACKAGE=1
|
||||
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
|
||||
mkdir -p tmp/Payload/
|
||||
cp -R "$PATHTOYT" tmp/Payload 2>/dev/null
|
||||
rm -rf tmp/Payload/YouTube.app/_CodeSignature/CodeResources
|
||||
rm -rf tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
||||
make package
|
||||
open ./packages
|
||||
make package FINALPACKAGE=1
|
||||
open packages
|
||||
else
|
||||
echo "This is not an ipa/app!"
|
||||
fi
|
||||
# Clean up
|
||||
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
|
||||
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
|
||||
rm -rf tmp/ Resources .theos/_/Payload
|
||||
rm -rf tmp/ Resources .theos/_/Payload
|
||||
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa)\033[0m"
|
||||
@@ -1,8 +1,8 @@
|
||||
// Settings
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION" = "uYouPlus-Version: %@";
|
||||
"VERSION_CHECK" = "Tippen, um nach Updates zu suchen!";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "Kerbe/Insel bei 2:1-Videoinhalten berücksichtigen (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT" = "Kerbe/dynamische Insel bei 2:1-Videoinhalten berücksichtigen (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "Verhindert, dass die Notch/Dynamic Island 2:1-Videoinhalte überdeckt. App-Neustart erforderlich!";
|
||||
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Vor- und Zurücktasten ersetzen";
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
// Settings
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION_CHECK" = "Tap to check for updates!";
|
||||
|
||||
"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.";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Replace Previous and Next button";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Replace the Previous and Next button with the 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.";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Only turn on this option 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.";
|
||||
|
||||
"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.";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide the Previous and Next button in video controls overlay.";
|
||||
|
||||
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
|
||||
"YT_MINIPLAYER" = "Enable the mini player 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.";
|
||||
"HIDE_HOVER_CARD_DESC" = "Hide the creator End screens (thumbnails) at the end of videos.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE" = "New mini player bar style (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
|
||||
@@ -42,10 +42,10 @@
|
||||
"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_DARKMODE_DESC" = "Might not work 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.";
|
||||
"OLED_KEYBOARD_DESC" = "Might not work 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.";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Settings
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION" = "Version de uYouPlus : %@";
|
||||
"VERSION_CHECK" = "Appuyez pour vérifier les mises à jour !";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "Empêcher l'encoche/Dynamic Island de grignoter le contenu vidéo 2:1 (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "Empêche l'encoche/Dynamic Island de grignoter du contenu vidéo 2:1 dans YouTube. Le redémarrage de l'application est nécessaire.";
|
||||
@@ -8,7 +8,7 @@
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Remplacer le bouton précédent et suivant";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Remplace les boutons Précédent et Suivant par les boutons Avance rapide et Retour rapide. Le redémarrage de l'application est nécessaire";
|
||||
|
||||
"FIX_GOOGLE_SIGNIN" = "Réparer l'identification Google (pour les utilisateurs de TrollStore uniquement)" ;
|
||||
"FIX_GOOGLE_SIGNIN" = "Réparer l'identification Google (pour les utilisateurs de TrollStore uniquement)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Activez cette option uniquement si vous ne pouvez pas vous connecter avec votre compte Google et que l'application a été installée via TrollStore. Si vous pouvez vous connecter normalement, laissez-la désactivée. Le redémarrage de l'application est nécessaire.";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Masquer les boutons Précédent et Suivant";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// Settings
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION" = "uYouPlus 버전: %@";
|
||||
"VERSION_CHECK" = "업데이트하려면 탭하세요!";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "노치/아일랜드 영역이 2:1 비율 비디오를 가리지 않게 함 (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "노치/다이내믹 아일랜드 영역이 유튜브의 2:1 비율 영상 일부를 가리는 것을 막아줍니다. 앱을 다시 시작해야 합니다.";
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
// Settings
|
||||
"VERSION" = "Versiune uYouPlus: %@";
|
||||
"VERSION_CHECK" = "Căutare actualizări";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "Previne apariția Notch/Island pe content video 2:1 (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "Previne tăierea conținutului video 2:1 de către Notch/Dynamic Island . Este necesară repornirea aplicației.";
|
||||
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Înlocuire butoane Înainte/Înapoi";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Înlocuiește butoanele Înainte/Înapoi cu butoanele derulare Înainte/Înapoi. Este necesară repornirea aplicației.";
|
||||
|
||||
"FIX_GOOGLE_SIGNIN" = "Rezolvare problemă autentificare cont Google (doar pentru utilizatorii TrollStore)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Activează această opțiune doar în cazul în care nu te poți autentifica în contul tău Google și apariția a fost instalată via TrollStore. Dacă te poți autentifica fără probleme, țineți setarea dezactivată. Este necesară repornirea aplicației.";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ascunde butoanele Înainte/Înapoi";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ascunde butoanele Înainte/Înapoi din controalele video.";
|
||||
|
||||
"YT_MINIPLAYER" = "Activare Miniplayer pentru toate videoclipurile YouTube";
|
||||
"YT_MINIPLAYER_DESC" = "De exemplu, videoclipurile destinate pentri copii";
|
||||
|
||||
"CAST_CONFIRM" = "Alertă de confirmare înainte de proiectare (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "Afișează o alertă de confirmare înainte de a proiecta, pentru a preveni deturnarea accidentală a TV-ului.";
|
||||
|
||||
"HIDE_HOVER_CARD" = "Ascunde ecranele de final (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "Ascunde ecranele de final de la sfârșitul videoclipurilor.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "Stil nou bară Miniplayer (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "Este necesară repornirea aplicației.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Înlocuire fila Shorts cu fila Explore (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "Este necesară repornirea aplicației.";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "Ascunde butonul Subtitrări";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "Ascunde butonul Subtitrări din controalele video.";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "Ascunde comutatorul Redare automată";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ascunde comutatorul Redare automată din controalele video.";
|
||||
|
||||
"AUTO_FULLSCREEN" = "Auto Ecran Întreg (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "Redare automată video pe ecran complet.";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "Ascundere Mesaje HUD";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "Exemplu: Subtitrările sunt activate/dezactivate, Redarea în buclă este activată,...";
|
||||
|
||||
"OLED_DARKMODE" = "Mod Întunecat OLED (Experimental)";
|
||||
"OLED_DARKMODE_DESC" = "Este posibil să nu funcționeze corect în anumite cazuri. Este necesară repornirea aplicației după ce această opțiune este activată/dezactivată.";
|
||||
|
||||
"OLED_KEYBOARD" = "Tastatură OLED (Experimental)";
|
||||
"OLED_KEYBOARD_DESC" = "Este posibil să nu funcționeze corect în anumite cazuri. Este necesară repornirea aplicației.";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "Ascunde banner-ul Promovare Plătită";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Ascunde banner-ul 'Include Promovare Plătită' în unele videoclipuri.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Proiectare";
|
||||
"MSG_ARE_YOU_SURE" = "Sunteți sigur că doriți să proiectați?";
|
||||
"MSG_YES" = "Da";
|
||||
"MSG_CANCEL" = "Anulare";
|
||||
@@ -1,17 +1,17 @@
|
||||
/* uYouPlusSettings */
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION" = "Версия uYouPlus: %@";
|
||||
"VERSION_CHECK" = "Нажмите, чтобы проверить доступные обновления.";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "Предотвратить выемку/остров на видеоконтенте 2:1 (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "Не позволяйте вырезу/Dynamic Island поглощать видеоконтент 2:1 на YouTube. Требуется перезапуск приложения.";
|
||||
"DONT_EAT_MY_CONTENT" = "Запретить обрезку контента (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "Запрещает обрезать контент с соотношением сторон 2:1 на устройствах с вырезом. Потребуется перезагрузка.";
|
||||
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Заменить кнопку "Назад" и "Далее";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Замените кнопки «Назад» и «Далее» на кнопки «Перемотка вперед» и «Назад». Требуется перезапуск приложения.";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Кнопки перемотки вместо «Пред.» и «След.»";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Заменяет переключатели «Следующий» и «Предыдущий» на кнопки перемотки на 10 сек. Потребуется перезагрузка.";
|
||||
|
||||
"FIX_GOOGLE_SIGNIN" = "Исправить вход через Google (только для пользователя TrollStore)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Включайте эту опцию, только если вы не можете войти в свою учетную запись Google и приложение было установлено через TrollStore. Если вы можете нормально войти в систему, оставьте ее отключенной. Требуется перезапуск приложения.";
|
||||
"FIX_GOOGLE_SIGNIN" = "Исправить авторизацию (TrollStore)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Включите данную опцию только не можете войти в учетную запись Google, а приложение установлено через TrollStore. Если удается авторизоваться как обычно, оставьте данную опцию отключенной. Потребуется перезагрузка.";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Скрыть «Пред.» и «След.»";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Скрыть «След.» и «Пред.»";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Убирает кнопки переключения видео «Следующий» и «Предыдущий» с плеера.";
|
||||
|
||||
"YT_MINIPLAYER" = "Мини-плеер для всех видео";
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/* 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 this 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 =
|
||||
3. Translate each line below after each =
|
||||
4. Open a Pull Request
|
||||
|
||||
- You can also add your localization to YTABConfig, YouPiP, YTUHD, Return YouTube Dislike. The process is the same:
|
||||
- You can also add your localization to YTABConfig, YouPiP, YTUHD, and Return YouTube Dislike. The process is the same:
|
||||
https://github.com/PoomSmart/YTABConfig/tree/main/layout/Library/Application%20Support/YTABC.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
|
||||
@@ -15,30 +15,30 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
|
||||
|
||||
// Settings
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION_CHECK" = "Tap to check for updates!";
|
||||
|
||||
"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.";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Replace Previous and Next button";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Replace the Previous and Next button with the 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.";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Only turn on this option 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.";
|
||||
|
||||
"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.";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide the Previous and Next button in video controls overlay.";
|
||||
|
||||
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
|
||||
"YT_MINIPLAYER" = "Enable the mini player 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.";
|
||||
"HIDE_HOVER_CARD_DESC" = "Hide the creator End screens (thumbnails) at the end of videos.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE" = "New mini player bar style (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
|
||||
@@ -57,10 +57,10 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
|
||||
"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_DARKMODE_DESC" = "Might not work 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.";
|
||||
"OLED_KEYBOARD_DESC" = "Might not work 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.";
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
/* 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
|
||||
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
|
||||
|
||||
- You can also add your localization to YTABConfig, YouPiP, YTUHD, Return YouTube Dislike. The process is the same:
|
||||
https://github.com/PoomSmart/YTABConfig/tree/main/layout/Library/Application%20Support/YTABC.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
|
||||
"VERSION" = "uYouPlus'ın sürümü: %@";
|
||||
"VERSION_CHECK" = "Güncellemeyi kontrol etmek için dokunun!";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "2:1 Video İçeriğinde Çentik/Ada Önleme (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "Çentik/Dinamik Ada'nın YouTube'daki 2:1 video içeriğini yemesini önleyin. Uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Önceki ve Sonraki Düğmelerini Değiştir";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Önceki ve Sonraki Düğmelerini Hızlı ileri ve Geri Sar düğmeleriyle değiştirin. Uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"FIX_GOOGLE_SIGNIN" = "Google Oturumu Açma'yı düzeltin (yalnızca TrollStore kullanıcıları için)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "Bu seçeneği yalnızca Google hesabınızla oturum açamadığınızda ve uygulama TrollStore aracılığıyla yüklendiyse açın. Normal olarak giriş yapabiliyorsanız, devre dışı bırakın. Uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Önceki ve Sonraki düğmelerini gizle";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Video kontrolleri katmanında Önceki ve Sonraki düğmelerini gizler.";
|
||||
|
||||
"YT_MINIPLAYER" = "Tüm YouTube videoları için Mini Oynatıcıyı etkinleştirin";
|
||||
"YT_MINIPLAYER_DESC" = "Örneğin çocuk videoları.";
|
||||
|
||||
"CAST_CONFIRM" = "Yayınlamadan önce uyarıyı onaylayın (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "TV'nin yanlışlıkla ele geçirilmesini önlemek için yayınlamadan önce bir onay uyarısı gösterir.";
|
||||
|
||||
"HIDE_HOVER_CARD" = "Bitiş ekranlarının üzerine gelen kartları gizle.(YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "Videoların sonundaki içerik oluşturucu bitiş ekranlarını (küçük resimler) gizler.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "Yeni mini oynatıcı bar stili. (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "Uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Shorts sekmesini Keşfet sekmesiyle değiştirin (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "Uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "Altyazıları düğmesini gizle";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "Video kontrolleri katmanındaki Altyazılar düğmesini gizler.";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "Otomatik oynatma anahtarını gizle";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "Otomatik oynat anahtarını video kontrolleri katmanından gizler.";
|
||||
|
||||
"AUTO_FULLSCREEN" = "Otomatik Tam Ekran (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "Videoları otomatik olarak tam ekranda oynatır.";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "Gösterge Paneli Mesajlarını gizle";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "Örnek: Altyazılar açıldı/kapandı, Video döngüsü açık,...";
|
||||
|
||||
"OLED_DARKMODE" = "OLED Karanlık modu (Deneysel)";
|
||||
"OLED_DARKMODE_DESC" = "Bazı durumlarda düzgün çalışmayabilir. Bu seçeneği etkinleştirdikten/devre dışı bıraktıktan sonra uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"OLED_KEYBOARD" = "OLED Klavye (Deneysel)";
|
||||
"OLED_KEYBOARD_DESC" = "Bazı durumlarda düzgün çalışmayabilir. Uygulamanın yeniden başlatılması gerekir.";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "Ücretli Promosyon afişini gizle";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Bazı videolarda 'Ücretli Promosyonları İçerir' afişini gizler.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Yayınlar";
|
||||
"MSG_ARE_YOU_SURE" = "Yayınlamaya başlamak istediğinizden emin misiniz?";
|
||||
"MSG_YES" = "Evet";
|
||||
"MSG_CANCEL" = "İptal";
|
||||
@@ -1,15 +1,15 @@
|
||||
// Settings
|
||||
"VERSION" = "uYouPlus's version: %@";
|
||||
"VERSION_CHECK" = "Tap to check for update!";
|
||||
"VERSION" = "uYouPlus 版本為: %@";
|
||||
"VERSION_CHECK" = "查看最新版本";
|
||||
|
||||
"DONT_EAT_MY_CONTENT" = "2:1影片瀏海/動態島優化 (DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "改進部分機型的瀏海區域或動態島在2:1比例影片中引發的遮擋問題。需要重新啟動應用程式。";
|
||||
"DONT_EAT_MY_CONTENT" = "2:1 影片瀏海/動態島優化(DontEatMyContent)";
|
||||
"DONT_EAT_MY_CONTENT_DESC" = "改進部分機型的瀏海區域/動態島在 2:1 影片中的遮擋問題,需要重新啟動應用程式。";
|
||||
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "替換上一個/下一個按鈕";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "將影片播放器控制介面上的上一個/下一個按鈕替換成快進/快退按鈕。需要重新啟動應用程式。";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "更換上一個/下一個按鈕";
|
||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "將影片播放器控制介面上的上一個/下一個按鈕替換成快轉/倒轉按鈕,需要重新啟動應用程式。";
|
||||
|
||||
"FIX_GOOGLE_SIGNIN" = "修復Google帳號登入問題(僅TrollStore用戶有效)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "僅在使用TrollStore安裝本App的情況下生效:啟用本設置後即可正常登錄您的Google帳號。需要重新啟動應用程式。";
|
||||
"FIX_GOOGLE_SIGNIN" = "修復 Google 帳號登入問題(僅TrollStore 使用者有效)";
|
||||
"FIX_GOOGLE_SIGNIN_DESC" = "僅在使用 TrollStore 安裝此應用程式時有效:啟用本設定後即可正常登入 Google 帳號,需要重新啟動應用程式。";
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
|
||||
@@ -18,40 +18,40 @@
|
||||
"YT_MINIPLAYER_DESC" = "例如兒童影片";
|
||||
|
||||
"CAST_CONFIRM" = "投放前確認 (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止意外攔劫電視。";
|
||||
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止家人幹樵。";
|
||||
|
||||
"HIDE_HOVER_CARD" = "隱藏片尾畫面懸浮卡片 (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面(縮略圖)。";
|
||||
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面。";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "新的迷你播放器控制列風格 (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE" = "迷你播放器 (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";
|
||||
|
||||
"YT_RE_EXPLORE" = "用探索選項卡替換Shorts選項卡 (YTReExplore)";
|
||||
"YT_RE_EXPLORE" = "用探索選項卡代替 Shorts 選項卡 (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "需要重新啟動應用程式。";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "隱藏字幕按鈕";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "隱藏影片控制層中的字幕按鈕。";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "隱藏自動播放開關";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制層中隱藏自動播放開關。";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制中隱藏自動播放開關。";
|
||||
|
||||
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "隱藏 HUD 訊息";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "舉例來說:CC字幕 開啟/關閉,影片循環開啟,...";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "例如:CC字幕、開啟/關閉、影片循環開啟等...";
|
||||
|
||||
"OLED_DARKMODE" = "OLED 深色模式(實驗性)";
|
||||
"OLED_DARKMODE_DESC" = "在某些情況下可能無法正常工作。啟用/禁用此選項後,需要重新啟動應用程式。";
|
||||
"OLED_DARKMODE_DESC" = "在某些情況下無法正常運作。更動此選項後,需要重新啟動應用程式。";
|
||||
|
||||
"OLED_KEYBOARD" = "OLED 鍵盤(實驗性)";
|
||||
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常工作。需要重新啟動應用程式。";
|
||||
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常運作。需要重新啟動應用程式。";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費促銷橫幅";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏“包括付費促銷”橫幅。";
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費橫幅(YTNoPaidPromo)";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏「包括付費促銷」橫幅。";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "投放中";
|
||||
"MSG_ARE_YOU_SURE" = "確定要開始投放嗎?";
|
||||
"MSG_ARE_YOU_SURE" = "是否開始投放嗎?";
|
||||
"MSG_YES" = "確定";
|
||||
"MSG_CANCEL" = "取消";
|
||||
|
||||
+223
-125
@@ -20,6 +20,8 @@
|
||||
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
|
||||
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
|
||||
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTAlertView.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIElementRenderer.h"
|
||||
|
||||
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
||||
NSBundle *uYouPlusBundle() {
|
||||
@@ -29,8 +31,11 @@ NSBundle *uYouPlusBundle() {
|
||||
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"uYouPlus" ofType:@"bundle"];
|
||||
if (tweakBundlePath)
|
||||
bundle = [NSBundle bundleWithPath:tweakBundlePath];
|
||||
else
|
||||
else {
|
||||
bundle = [NSBundle bundleWithPath:@"/Library/Application Support/uYouPlus.bundle"];
|
||||
if (!bundle)
|
||||
bundle = [NSBundle bundleWithPath:@"/var/jb/Library/Application Support/uYouPlus.bundle"];
|
||||
}
|
||||
});
|
||||
return bundle;
|
||||
}
|
||||
@@ -184,35 +189,16 @@ BOOL dontEatMyContent() {
|
||||
%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) {
|
||||
NSBundle *tweakBundle = uYouPlusBundle();
|
||||
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
||||
%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; }
|
||||
} actionTitle:LOC(@"MSG_YES")];
|
||||
alertView.title = LOC(@"CASTING");
|
||||
alertView.subtitle = LOC(@"MSG_ARE_YOU_SURE");
|
||||
[alertView show];
|
||||
} else {
|
||||
return %orig;
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
@@ -223,6 +209,29 @@ BOOL dontEatMyContent() {
|
||||
}
|
||||
%end
|
||||
|
||||
// Hide search ads by @PoomSmart - https://github.com/PoomSmart/YouTube-X
|
||||
BOOL didLateHook = NO;
|
||||
|
||||
%group LateHook
|
||||
%hook YTIElementRenderer
|
||||
- (NSData *)elementData {
|
||||
if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData)
|
||||
return nil;
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
%end
|
||||
|
||||
%hook YTSectionListViewController
|
||||
- (void)loadWithModel:(id)model {
|
||||
if (!didLateHook) {
|
||||
%init(LateHook);
|
||||
didLateHook = YES;
|
||||
}
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
||||
%hook UIResponder
|
||||
%new
|
||||
@@ -258,16 +267,16 @@ BOOL dontEatMyContent() {
|
||||
%end
|
||||
|
||||
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
||||
%hook YTHotConfig
|
||||
- (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
|
||||
%end
|
||||
// %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; }
|
||||
// Fix uYou's label glitching - qnblackcat/uYouPlus#552
|
||||
- (BOOL)mainAppCoreClientIosTransientVisualGlitchInPivotBarFix { return NO; }
|
||||
// A/B flags
|
||||
%hook YTColdConfig
|
||||
- (BOOL)respectDeviceCaptionSetting { return NO; } // YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||
- (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; } // Swipe right to dismiss the right panel in fullscreen mode
|
||||
- (BOOL)mainAppCoreClientIosTransientVisualGlitchInPivotBarFix { return NO; } // Fix uYou's label glitching - qnblackcat/uYouPlus#552
|
||||
- (BOOL)enableSwipeToRemoveInPlaylistWatchEp { return YES; } // Enable swipe right to remove video in Playlist.
|
||||
%end
|
||||
|
||||
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
||||
@@ -310,12 +319,9 @@ BOOL dontEatMyContent() {
|
||||
- (BOOL)shouldEnablePlayerBarOnlyOnPause { return NO; }
|
||||
%end
|
||||
|
||||
%hook YTInlinePlayerBarContainerView
|
||||
- (void)setUserInteractionEnabled:(BOOL)enabled { %orig(YES); }
|
||||
%end
|
||||
|
||||
%hook YTColdConfig
|
||||
- (BOOL)iosEnableVideoPlayerScrubber { return YES; }
|
||||
- (BOOL)mobileShortsTabInlined { return YES; }
|
||||
%end
|
||||
|
||||
%hook YTHotConfig
|
||||
@@ -643,6 +649,16 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
||||
}
|
||||
%end
|
||||
|
||||
// Sub menu?
|
||||
%hook ELMView
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode()) {
|
||||
self.subviews[0].backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// iSponsorBlock
|
||||
%hook SponsorBlockSettingsController
|
||||
- (void)viewDidLoad {
|
||||
@@ -753,6 +769,16 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
||||
}
|
||||
%end
|
||||
|
||||
//
|
||||
%hook YTBackstageCreateRepostDetailView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Others
|
||||
%hook _ASDisplayView
|
||||
- (void)didMoveToWindow {
|
||||
@@ -801,6 +827,11 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// Incompatibility with the new YT Dark theme
|
||||
%hook YTColdConfig
|
||||
- (BOOL)uiSystemsClientGlobalConfigUseDarkerPaletteBgColorForNative { return NO; }
|
||||
%end
|
||||
%end
|
||||
|
||||
# pragma mark - OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
|
||||
@@ -898,153 +929,202 @@ static void replaceTab(YTIGuideResponse *response) {
|
||||
%end
|
||||
|
||||
// DontEatMyContent - @therealFoxster: https://github.com/therealFoxster/DontEatMyContent
|
||||
double aspectRatio = 16/9;
|
||||
bool zoomedToFill = false;
|
||||
static double videoAspectRatio = 16/9;
|
||||
static bool zoomedToFill = false;
|
||||
static bool engagementPanelIsVisible = false, removeEngagementPanelViewControllerWithIdentifierCalled = false;
|
||||
|
||||
MLHAMSBDLSampleBufferRenderingView *renderingView;
|
||||
NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
|
||||
static MLHAMSBDLSampleBufferRenderingView *renderingView;
|
||||
static NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
|
||||
|
||||
%group gDontEatMyContent
|
||||
|
||||
// Retrieve video aspect ratio
|
||||
%hook YTPlayerView
|
||||
- (void)setAspectRatio:(CGFloat)aspectRatio {
|
||||
%orig(aspectRatio);
|
||||
videoAspectRatio = aspectRatio;
|
||||
}
|
||||
%end
|
||||
|
||||
%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
|
||||
// Making renderingView a bit larger since constraining to safe area leaves a gap between the notch and video
|
||||
CGFloat constant = 24.5; // 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];
|
||||
// playerView.backgroundColor = [UIColor blueColor];
|
||||
// renderingViewContainer.backgroundColor = [UIColor greenColor];
|
||||
// renderingView.backgroundColor = [UIColor redColor];
|
||||
|
||||
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
||||
|
||||
// Must check class since YTInlineMutedPlaybackPlayerOverlayViewController doesn't have -(BOOL)isFullscreen
|
||||
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] && [activeVideoPlayerOverlay isFullscreen]) {
|
||||
activate();
|
||||
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] // isKindOfClass doesn't work for some reason
|
||||
&& [activeVideoPlayerOverlay isFullscreen]) {
|
||||
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
|
||||
} else {
|
||||
center();
|
||||
DEMC_centerRenderingView();
|
||||
}
|
||||
|
||||
%orig(animated);
|
||||
}
|
||||
- (void)didPressToggleFullscreen {
|
||||
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
||||
|
||||
if (![activeVideoPlayerOverlay isFullscreen]) // Entering fullscreen
|
||||
activate();
|
||||
else // Exiting fullscreen
|
||||
deactivate();
|
||||
- (void)didPressToggleFullscreen {
|
||||
%orig;
|
||||
if (![[self activeVideoPlayerOverlay] isFullscreen]) { // Entering full screen
|
||||
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
|
||||
} else { // Exiting full screen
|
||||
DEMC_deactivate();
|
||||
}
|
||||
|
||||
%orig;
|
||||
}
|
||||
- (void)didSwipeToEnterFullscreen {
|
||||
%orig; activate();
|
||||
- (void)didSwipeToEnterFullscreen {
|
||||
%orig;
|
||||
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
|
||||
}
|
||||
- (void)didSwipeToExitFullscreen {
|
||||
%orig; deactivate();
|
||||
%orig;
|
||||
DEMC_deactivate();
|
||||
}
|
||||
// Get video aspect ratio; doesn't work for some users; see -(void)resetForVideoWithAspectRatio:(double)
|
||||
- (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);
|
||||
// New video played
|
||||
-(void)playbackController:(id)playbackController didActivateVideo:(id)video withPlaybackData:(id)playbackData {
|
||||
%orig(playbackController, video, playbackData);
|
||||
if ([[self activeVideoPlayerOverlay] isFullscreen]) // New video played while in full screen (landscape)
|
||||
// Activate since new videos played in full screen aren't zoomed-to-fill by default
|
||||
// (i.e. the notch/Dynamic Island will cut into content when playing a new video in full screen)
|
||||
DEMC_activate();
|
||||
engagementPanelIsVisible = false;
|
||||
removeEngagementPanelViewControllerWithIdentifierCalled = false;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTVideoZoomOverlayView
|
||||
// Pinch to zoom
|
||||
%hook YTVideoFreeZoomOverlayView
|
||||
- (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();
|
||||
}
|
||||
DEMC_deactivate();
|
||||
%orig(pinchGestureRecognizer);
|
||||
}
|
||||
- (void)flashAndHideSnapIndicator {}
|
||||
// https://github.com/lgariv/UniZoom/blob/master/Tweak.xm
|
||||
- (void)setSnapIndicatorVisible:(bool)arg1 {
|
||||
%orig(NO);
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTVideoZoomOverlayController
|
||||
// Get video aspect ratio; fallback for -(void)singleVideo:(id)aspectRatioDidChange:(CGFloat)
|
||||
- (void)resetForVideoWithAspectRatio:(double)arg1 {
|
||||
aspectRatio = arg1;
|
||||
%log;
|
||||
if (aspectRatio == 0.0) {}
|
||||
else if (aspectRatio < THRESHOLD) {
|
||||
deactivate();
|
||||
} else {
|
||||
activate();
|
||||
// Detect zoom to fill
|
||||
- (void)showLabelForSnapState:(NSInteger)snapState {
|
||||
if (snapState == 0) { // Original
|
||||
zoomedToFill = false;
|
||||
DEMC_activate();
|
||||
} else if (snapState == 1) { // Zoomed to fill
|
||||
zoomedToFill = true;
|
||||
// No need to deactivate constraints as it's already done in -(void)didRecognizePinch:(UIPinchGestureRecognizer *)
|
||||
}
|
||||
%orig(arg1);
|
||||
%orig(snapState);
|
||||
}
|
||||
%end
|
||||
%end // gDontEatMyContent
|
||||
|
||||
// DontEatMycontent - detecting device model
|
||||
// https://stackoverflow.com/a/11197770/19227228
|
||||
NSString* deviceName() {
|
||||
// Mini bar dismiss
|
||||
%hook YTWatchMiniBarViewController
|
||||
- (void)dismissMiniBarWithVelocity:(CGFloat)velocity gestureType:(int)gestureType {
|
||||
%orig(velocity, gestureType);
|
||||
zoomedToFill = false; // Setting to false since YouTube undoes zoom-to-fill when mini bar is dismissed
|
||||
}
|
||||
- (void)dismissMiniBarWithVelocity:(CGFloat)velocity gestureType:(int)gestureType skipShouldDismissCheck:(BOOL)skipShouldDismissCheck {
|
||||
%orig(velocity, gestureType, skipShouldDismissCheck);
|
||||
zoomedToFill = false;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTMainAppEngagementPanelViewController
|
||||
// Engagement panel (comment, description, etc.) about to show up
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
if ([self isPeekingSupported]) {
|
||||
// Shorts (only Shorts support peeking, I think)
|
||||
} else {
|
||||
// Everything else
|
||||
engagementPanelIsVisible = true;
|
||||
if ([self isLandscapeEngagementPanel]) {
|
||||
DEMC_deactivate();
|
||||
}
|
||||
}
|
||||
%orig(animated);
|
||||
}
|
||||
// Engagement panel about to dismiss
|
||||
// - (void)viewDidDisappear:(BOOL)animated { %orig; %log; } // Called too late & isn't reliable so sometimes constraints aren't activated even when engagement panel is closed
|
||||
%end
|
||||
|
||||
%hook YTEngagementPanelContainerViewController
|
||||
// Engagement panel about to dismiss
|
||||
- (void)notifyEngagementPanelContainerControllerWillHideFinalPanel { // Called in time but crashes if plays new video while in full screen causing engagement panel dismissal
|
||||
// Must check if engagement panel was dismissed because new video played
|
||||
// (i.e. if -(void)removeEngagementPanelViewControllerWithIdentifier:(id) was called prior)
|
||||
if (![self isPeekingSupported] && !removeEngagementPanelViewControllerWithIdentifierCalled) {
|
||||
engagementPanelIsVisible = false;
|
||||
if ([self isLandscapeEngagementPanel] && !zoomedToFill) {
|
||||
DEMC_activate();
|
||||
}
|
||||
}
|
||||
%orig;
|
||||
}
|
||||
- (void)removeEngagementPanelViewControllerWithIdentifier:(id)identifier {
|
||||
// Usually called when engagement panel is open & new video is played or mini bar is dismissed
|
||||
removeEngagementPanelViewControllerWithIdentifierCalled = true;
|
||||
%orig(identifier);
|
||||
}
|
||||
%end
|
||||
|
||||
%end// group gDontEatMyContent
|
||||
|
||||
BOOL DEMC_deviceIsSupported() {
|
||||
// Get device model identifier (e.g. iPhone14,4)
|
||||
// https://stackoverflow.com/a/11197770/19227228
|
||||
struct utsname systemInfo;
|
||||
uname(&systemInfo);
|
||||
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
BOOL isDeviceSupported() {
|
||||
NSString *identifier = deviceName();
|
||||
NSArray *unsupportedDevices = UNSUPPORTED_DEVICES;
|
||||
NSString *deviceModelID = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
||||
|
||||
for (NSString *device in unsupportedDevices) {
|
||||
if ([device isEqualToString:identifier]) {
|
||||
NSArray *unsupportedModelIDs = DEMC_UNSUPPORTED_DEVICES;
|
||||
for (NSString *identifier in unsupportedModelIDs) {
|
||||
if ([deviceModelID 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
|
||||
if ([deviceModelID containsString:@"iPhone"]) {
|
||||
if ([deviceModelID isEqualToString:@"iPhone13,1"]) {
|
||||
// iPhone 12 mini
|
||||
return YES;
|
||||
} else if ([model floatValue] >= 14.0) { // iPhone 13 series and newer
|
||||
}
|
||||
NSString *modelNumber = [[deviceModelID stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] stringByReplacingOccurrencesOfString:@"," withString:@"."];
|
||||
if ([modelNumber floatValue] >= 14.0) {
|
||||
// iPhone 13 series and newer
|
||||
return YES;
|
||||
} else return NO;
|
||||
} else return NO;
|
||||
}
|
||||
|
||||
void activate() {
|
||||
if (aspectRatio < THRESHOLD || zoomedToFill) return;
|
||||
void DEMC_activate() {
|
||||
if (videoAspectRatio < DEMC_THRESHOLD) {
|
||||
DEMC_deactivate();
|
||||
return;
|
||||
}
|
||||
// NSLog(@"activate");
|
||||
center();
|
||||
DEMC_centerRenderingView();
|
||||
renderingView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
widthConstraint.active = YES;
|
||||
heightConstraint.active = YES;
|
||||
}
|
||||
|
||||
void deactivate() {
|
||||
void DEMC_deactivate() {
|
||||
// NSLog(@"deactivate");
|
||||
center();
|
||||
DEMC_centerRenderingView();
|
||||
renderingView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||
widthConstraint.active = NO;
|
||||
heightConstraint.active = NO;
|
||||
}
|
||||
|
||||
void center() {
|
||||
void DEMC_centerRenderingView() {
|
||||
centerXConstraint.active = YES;
|
||||
centerYConstraint.active = YES;
|
||||
}
|
||||
@@ -1096,6 +1176,24 @@ void center() {
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for qnblackcat/uYouPlus#617
|
||||
static BOOL didFinishLaunching;
|
||||
|
||||
%hook YTAppDelegate
|
||||
- (BOOL)application:(UIApplication *)application
|
||||
didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions {
|
||||
didFinishLaunching = %orig;
|
||||
self.downloadsVC = [self.downloadsVC init];
|
||||
return didFinishLaunching;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook DownloadsPagerVC
|
||||
- (instancetype)init {
|
||||
return didFinishLaunching ? %orig : self;
|
||||
}
|
||||
%end
|
||||
|
||||
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
|
||||
%group iOS16
|
||||
%hook OBPrivacyLinkButton
|
||||
@@ -1136,7 +1234,7 @@ void center() {
|
||||
if (replacePreviousAndNextButton()) {
|
||||
%init(gReplacePreviousAndNextButton);
|
||||
}
|
||||
if (dontEatMyContent() && isDeviceSupported()) {
|
||||
if (dontEatMyContent() && DEMC_deviceIsSupported()) {
|
||||
%init(gDontEatMyContent);
|
||||
}
|
||||
if (@available(iOS 16, *)) {
|
||||
|
||||
Reference in New Issue
Block a user