Compare commits

...
Author SHA1 Message Date
Nguyễn Đạt 24c2f5594f Merge pull request #224 from level3tjg/main
iOS 16 OnboardingKit crash fix
2022-06-16 06:26:19 +07:00
level3tjg c1e3976200 Add OnboardingKit shim method for uYou (iOS 16) 2022-06-15 16:11:48 -04:00
Nguyễn Đạt 0fc9032979 Merge pull request #222 from ISnackable/main
Add draft release functionality back
2022-06-15 20:36:49 +07:00
Tommy b4c70ee668 Add draft release functionality back 2022-06-15 21:31:44 +08:00
qnblackcat f966182c15 an actually workaround for issue #54 2022-06-15 18:08:37 +07:00
qnblackcat 1b20c07f03 localization template 2022-06-15 18:05:11 +07:00
Nguyễn Đạt 7ad8f9409b Merge pull request #221 from clc0321/main
Added Chinese_TW translation
2022-06-15 16:13:53 +07:00
clc0321 122d5b8280 Added Chinese_TW translation 2022-06-15 16:10:27 +08:00
clc0321 5744474710 editor_temple_name 2022-06-15 15:39:30 +08:00
Nguyễn Đạt faaecd51cb Update bug.md 2022-06-15 01:36:01 +07:00
Nguyễn Đạt 8250a1462e Merge pull request #215 from Aransh/main
Main
2022-06-14 16:57:59 +07:00
Nguyễn Đạt 9371c72a42 Merge pull request #213 from ShadowRoi/main
Fixes Greek translation(probably)
2022-06-14 16:57:18 +07:00
Aran Shavit 1acf0a4eba Added Hebrew localization 2022-06-14 12:50:52 +03:00
ShadowRoi 1a63491af3 Add files via upload 2022-06-14 10:43:38 +03:00
ShadowRoi e912dc0bda Delete lang/uYouPlus.bundle/gr.lproj directory 2022-06-14 10:43:26 +03:00
qnblackcat fa87084000 v17.23.6-2.1 2022-06-14 11:28:48 +07:00
qnblackcat 0b30adb3f4 update Header.h 2022-06-14 11:07:38 +07:00
qnblackcat 349a49eb93 fix hide next & previous button not working sometimes 2022-06-14 11:06:17 +07:00
qnblackcat 57ed260959 update submodules 2022-06-14 10:31:55 +07:00
Nguyễn Đạt 9b03cac475 Merge pull request #208 from 5jd/patch-1
Extend the French translation
2022-06-13 17:36:57 +07:00
5jd 0a6179a4b7 Extend French translation
Add messages for YTCastConfirm and also improve the existing translation.
2022-06-13 11:57:10 +02:00
Nguyễn Đạt 9e37aaed11 Merge pull request #205 from ShadowRoi/main
Adds Greek Translation
2022-06-13 15:24:02 +07:00
ShadowRoi 691d7d3078 Delete gr.lproj directory 2022-06-12 23:08:27 +03:00
ShadowRoi 915bb7efb3 Add files via upload 2022-06-12 23:08:15 +03:00
ShadowRoi d8151344ae Add files via upload 2022-06-12 22:19:10 +03:00
qnblackcat 163dac3e81 fix compiling, code format 2022-06-12 13:41:29 +07:00
qnblackcat 3383edbb05 update Header.h 2022-06-12 12:07:07 +07:00
qnblackcat c2efac035c update localization 2022-06-12 12:06:53 +07:00
Nguyễn Đạt 0fad665452 Merge pull request #204 from dayanch96/main
Russian localization and (!) YTCastConfirm
2022-06-12 11:37:51 +07:00
dayanch96 1b554d0994 Update uYouPlus.xm 2022-06-12 05:25:11 +03:00
dayanch96 87575119b8 Update Localizable.strings 2022-06-12 05:19:53 +03:00
dayanch96 90468a2b69 YTCastConfirm 2022-06-12 05:19:26 +03:00
dayanch96 29c7f279ae Possibility of localization YTCastConfirm 2022-06-12 05:17:32 +03:00
dayanch96 e870be2f52 Create Localizable.strings 2022-06-12 05:11:27 +03:00
Nguyễn Đạt 772cc2af2e Merge pull request #203 from 5jd/main
Add French translation
2022-06-11 21:08:51 +07:00
5jd 9e3065fac6 Forgot an accent! 2022-06-11 15:37:24 +02:00
5jd 5db4a43777 Add French translation 2022-06-11 15:26:44 +02:00
qnblackcat 7ab7b499d7 added Localization temple. Translations are welcome 2022-06-10 22:50:22 +07:00
qnblackcat c922424d53 who read this tho? 2022-06-10 22:49:40 +07:00
Nguyễn Đạt f1b540af8b Create buildapp_release.yml 2022-06-10 13:19:45 +07:00
Nguyễn Đạt 9afaddb2e0 Merge pull request #200 from ISnackable/ISnackable-patch-1
Update buildapp.yml to upload Artifact
2022-06-10 13:13:05 +07:00
Tommy b7f6c21353 Update buildapp.yml to upload Artifact 2022-06-10 12:37:07 +08:00
Tommy 8e4293f7a1 Update buildapp.yml to upload Artifact 2022-06-10 12:21:41 +08:00
Nguyễn Đạt 573dfa1d67 added buildapp Github action
# Original idea by @ISnackable. Thanks to him for handling the hardest parts!
# https://github.com/ISnackable/CercubePlus/blob/main/.github/workflows/Build.yml
2022-06-09 16:25:07 +07:00
qnblackcat 5d2cc93f56 fix compiling via Github action 2022-06-09 16:08:45 +07:00
qnblackcat 42959eb9fb update .gitignore 2022-06-09 16:08:25 +07:00
qnblackcat aa139dffa8 Guess I'm done with OLED Darkmode 2022-06-09 16:08:11 +07:00
qnblackcat 6520ae2d53 remove unnecessary codes 2022-06-09 07:14:47 +07:00
qnblackcat 4bfb78634f update Header.h 2022-06-09 07:14:24 +07:00
qnblackcat 78fbf1dc6b update submodules 2022-06-09 07:14:13 +07:00
qnblackcat 3dcf4f290f uYouPlus: added Vietnamese 2022-06-08 10:21:39 +07:00
qnblackcat 85ddb15d38 Added Localizations support, improved OLED Darkmode 2022-06-08 10:19:53 +07:00
qnblackcat 5948dac548 Added Localizations support 2022-06-08 10:19:38 +07:00
qnblackcat 070647ecd5 update submodules 2022-06-07 12:52:52 +07:00
qnblackcat b7328028aa typo 2022-06-06 11:04:05 +07:00
qnblackcat 79f058f354 v17.22.3-2.1 2022-06-06 10:44:31 +07:00
qnblackcat 26b5912495 improved OLED Darkmode 2022-06-06 10:42:41 +07:00
qnblackcat f029b9a372 update Header.h 2022-06-06 10:41:44 +07:00
qnblackcat ecf3107846 update submodules 2022-06-06 10:25:12 +07:00
qnblackcat 93397e48d7 Enable Shorts scroll bar - credit level3tjg 2022-06-05 10:27:25 +07:00
qnblackcat b83081fd57 v17.21.3-2.1 2022-06-01 22:26:49 +07:00
qnblackcat c74b5203f7 added IAmYouTube (credit: PoomSmart) 2022-06-01 21:52:06 +07:00
qnblackcat 920b7c4882 update description 2022-05-29 10:12:21 +07:00
qnblackcat d469f31270 fixed #179 2022-05-29 10:09:20 +07:00
qnblackcat f910c416ef v17.20.3-2.1 2022-05-25 13:04:32 +07:00
qnblackcat fb0e5073ae temporary fix for issue #54 2022-05-24 01:13:41 +07:00
qnblackcat f9e05fee77 update submodules 2022-05-24 01:12:42 +07:00
qnblackcat ec7eec660b fix YTCastconfirm, code clean up 2022-05-21 12:51:11 +07:00
qnblackcat 2e6c19c060 update description 2022-05-21 12:50:50 +07:00
qnblackcat bb3b8ed310 v17.19.3-2.1 2022-05-20 21:44:58 +07:00
qnblackcat b94a5cc967 hide Previous/Next button 2022-05-20 21:38:33 +07:00
qnblackcat 8b50a3c1b7 more? 2022-05-20 21:29:30 +07:00
qnblackcat 025dc4d2cb update submodules 2022-05-20 20:58:46 +07:00
qnblackcat 9860fdb4e8 v17.19.2-2.1-F3 2022-05-17 10:07:23 +07:00
qnblackcat 5e9d719882 fix app crash upon launching on some devices 2022-05-17 09:44:54 +07:00
qnblackcat f63cfa8b43 update Makefile 2022-05-17 09:43:12 +07:00
qnblackcat 37b6b1e07e update description 2022-05-17 09:43:01 +07:00
qnblackcat 1827ece773 v17.19.2-2.1 2022-05-16 17:31:50 +07:00
qnblackcat f9e98fa04d update submodules 2022-05-16 16:52:25 +07:00
qnblackcat 2c5d0545d7 added YTMiniPlayerEnabler by level3tjg 2022-05-16 11:56:29 +07:00
qnblackcat 3c33e6fed0 update Header.h 2022-05-16 11:55:33 +07:00
qnblackcat daa004d027 update Makefile 2022-05-16 11:55:24 +07:00
qnblackcat 556f4dd8cf update submodules 2022-05-16 10:21:16 +07:00
qnblackcat 68855e71bf update description 2022-05-10 20:48:40 +07:00
qnblackcat 8fcf17572d colored things that should be colored :/ 2022-05-10 20:38:25 +07:00
qnblackcat 94c58965c7 update Makefile 2022-05-10 20:10:04 +07:00
qnblackcat 5e7b7717ff remove old codes 2022-05-10 20:09:47 +07:00
Nguyễn Đạt 1a99fa819e Merge pull request #149 from BandarHL/main
Update OLED Dark mode: code clean up, better performance.
2022-05-10 19:39:12 +07:00
BandarHelal 0c8376fc60 Update OLED Dark mode feature
well, instead of hooking every view for YouTube to change the color, you can achieve the same results with less code by hooking the Color palette (YTColorPalette).
2022-05-09 23:39:02 +03:00
qnblackcat 5b70271968 v17.18.4-2.1 2022-05-09 15:44:59 +07:00
qnblackcat 968dc841ee improvement 2022-05-09 15:39:34 +07:00
qnblackcat ada2c00338 reorder settings 2022-05-09 15:36:21 +07:00
qnblackcat 0e2ec9a52e Create a new setting category for uYouPlus (by BandarHL), update toggle's description 2022-05-08 11:09:18 +07:00
qnblackcat 274abee25d OLED keyboard (by @ichitaso), code cleanup 2022-05-08 11:08:24 +07:00
Nguyễn Đạt 5b920d7353 Merge pull request #147 from BandarHL/main
Update YouPiP and create new settings category for uYouPlus
2022-05-08 00:31:26 +07:00
BandarHelal 34e34a4fef Move uYouPlus settings to new setting category 2022-05-07 20:04:36 +03:00
BandarHelal 3e4264e3c7 Update YouPiP 2022-05-07 19:53:13 +03:00
qnblackcat e3d779cbf2 code clean up 2022-05-04 11:10:19 +07:00
qnblackcat 314efca54b avoid layoutSubviews 2022-05-04 11:10:06 +07:00
qnblackcat feaeb234cc update .gitignore 2022-05-04 11:09:40 +07:00
Nguyễn Đạt 4502236d64 Merge pull request #138 from PoomSmart/format-cleanup
Code formatting cleanup
2022-05-03 10:52:05 +07:00
PoomSmart 3154b51cf6 Code formatting cleanup 2022-05-03 10:41:26 +07:00
Nguyễn Đạt 4f99b08a63 v17.17.4-2.1 2022-05-02 11:41:57 +07:00
qnblackcat ae1dc1a701 bump version 2022-05-01 03:05:57 +07:00
qnblackcat f1eb708e08 update submodules 2022-04-28 21:52:37 +07:00
qnblackcat 9298cadbf8 clean up 2022-04-28 21:51:30 +07:00
qnblackcat efe8670c51 update description 2022-04-28 21:50:52 +07:00
qnblackcat fb5781865c clean up 2022-04-28 21:47:55 +07:00
qnblackcat afb6bd9842 update buildapp script 2022-04-27 12:45:26 +07:00
qnblackcat 8ee749dad1 add Open in YouTube Extensions 2022-04-27 12:44:27 +07:00
qnblackcat a38e37f6e9 darker? 2022-04-27 12:27:39 +07:00
26 changed files with 1220 additions and 529 deletions
+3
View File
@@ -9,6 +9,8 @@ assignees: ''
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️ ## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️
_Make sure you complete the template. Otherwise, it will be closed without further explanation!_
### Device info ### Device info
- iOS/iPadOS version: - iOS/iPadOS version:
- Device model: - Device model:
@@ -27,3 +29,4 @@ _(The crash log can be found in the Settings app - Privacy - Analytics & Improv
### Additional context: ### Additional context:
+146
View File
@@ -0,0 +1,146 @@
# Original idea by @ISnackable. Thanks to him for handling the hardest parts!
# https://github.com/ISnackable/CercubePlus/blob/main/.github/workflows/Build.yml
name: Build and Release uYouPlus
on:
workflow_dispatch:
inputs:
uyou_version:
description: "The version of uYou"
default: "2.1"
required: false
type: string
decrypted_youtube_url:
description: "The direct URL to the decrypted YouTube ipa"
default: ""
required: true
type: string
youtube_version:
description: "The version of YouTube"
default: ""
required: true
type: string
create_release:
description: "Create a draft release"
default: false
required: false
type: boolean
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build uYouPlus
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout Main
uses: actions/checkout@v3
with:
path: main
submodules: recursive
- name: Install Dependencies
run: brew install ldid dpkg
- name: Setup Theos
uses: actions/checkout@v3
with:
repository: theos/theos
ref: master
path: theos
submodules: recursive
- name: Download iOS 15 SDK
run: |
curl -LO https://github.com/chrisharper22/sdks/archive/main.zip
TMP=$(mktemp -d)
unzip -qq main.zip -d $TMP
mv $TMP/sdks-main/*.sdk $THEOS/sdks
rm -r main.zip $TMP
env:
THEOS: ${{ github.workspace }}/theos
- name: Setup Theos Jailed
uses: actions/checkout@v3
with:
repository: kabiroberai/theos-jailed
ref: master
path: theos-jailed
submodules: recursive
- name: Install Theos Jailed
run: |
./theos-jailed/install
env:
THEOS: ${{ github.workspace }}/theos
- name: Download Dylibs
run: |
curl "https://raw.githubusercontent.com/Muirey03/RemoteLog/master/RemoteLog.h" --output "$THEOS/include/RemoteLog.h"
curl "https://miro92.com/repo/debs/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" --output "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb"
wget "$YOUTUBE_URL" --no-verbose -O ./main/YouTube.ipa
dpkg-deb -x "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" ./main/Tweaks/uYou/
unzip -q ./main/YouTube.ipa -d ./main/tmp
rm -rf ./main/tmp/Payload/YouTube.app/PlugIns/*
cp -R ./main/Extensions/*.appex ./main/tmp/Payload/YouTube.app/PlugIns
env:
THEOS: ${{ github.workspace }}/theos
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_URL: ${{ inputs.decrypted_youtube_url }}
- name: Fix compiling && Build Package
id: build_package
run: |
cd ${{ github.workspace }}/main
(cd ${{ github.workspace }}/main/Tweaks/YouPiP && sed -i '' "14s#.*#YouPiP_FRAMEWORKS = AVKit AVFoundation UIKit#g" ./Makefile)
make package FINALPACKAGE=1
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
echo "::set-output name=package::$(ls -t packages | head -n1)"
env:
THEOS: ${{ github.workspace }}/theos
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
- name: Upload Artifact
uses: actions/upload-artifact@v3
env:
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
if-no-files-found: error
- name: Create Release
if: ${{ inputs.create_release }}
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
release_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
draft: true
prerelease: false
- name: Upload Release Asset
if: ${{ inputs.create_release }}
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
asset_name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa
asset_content_type: application/vnd.debian.binary-package
+3 -2
View File
@@ -1,6 +1,7 @@
.theos .theos
.DS_Store .DS_Store
packages packages/
obj tmp/
Tweaks/uYou/* Tweaks/uYou/*
!Tweaks/uYou/.gitkeep !Tweaks/uYou/.gitkeep
Resources/
+4
View File
@@ -30,3 +30,7 @@
path = Tweaks/YTSpeed path = Tweaks/YTSpeed
url = https://github.com/qnblackcat/YTSpeed.git url = https://github.com/qnblackcat/YTSpeed.git
branch = main branch = main
[submodule "Extensions"]
path = Extensions
url = https://github.com/CokePokes/YoutubeExtensions.git
branch = main
Submodule
+1
Submodule Extensions added at a68d70883d
+53 -10
View File
@@ -1,27 +1,70 @@
#import "Tweaks/YouTubeHeader/YTPlayerViewController.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"
// IAmYouTube
@interface SSOConfiguration : NSObject
@end
// uYouPlus
@interface YTMainAppControlsOverlayView : UIView
@end
@interface YTTransportControlsButtonView : UIView
@end
// @interface YTPlaylistHeaderViewController : UIViewController
// @property (nonatomic, strong, readwrite) UIView *downloadsButton;
// @end
@interface OBPrivacyLinkButton : UIButton
- (instancetype)initWithCaption:(NSString *)caption
buttonText:(NSString *)buttonText
image:(UIImage *)image
imageSize:(CGSize)imageSize
useLargeIcon:(BOOL)useLargeIcon
displayLanguage:(NSString *)displayLanguage;
@end
// BigYTMiniPlayer
@interface YTMainAppVideoPlayerOverlayView : UIView @interface YTMainAppVideoPlayerOverlayView : UIView
-(UIViewController *)_viewControllerForAncestor; - (UIViewController *)_viewControllerForAncestor;
@end @end
@interface YTWatchMiniBarView : UIView @interface YTWatchMiniBarView : UIView
@end @end
@interface YTAsyncCollectionView : UIView // YTAutoFullScreen
@end
@interface YTPlayerViewController (YTAFS) @interface YTPlayerViewController (YTAFS)
- (void)autoFullscreen; - (void)autoFullscreen;
@end @end
//@interface ASCollectionView : UIView // OLED Darkmode
//@end @interface ASWAppSwitcherCollectionViewCell : UIView
@interface YTLightweightQTMButton : UIView
@end @end
@interface YTELMView : UIView @interface ASScrollView : UIView
@end @end
@interface NIAttributedLabel : UIView @interface UIKeyboardLayoutStar : UIView
@end
@interface UIKeyboardDockView : UIView
@end
@interface _ASDisplayView : UIView
@end
@interface SponsorBlockSettingsController : UITableViewController
@end
@interface SponsorBlockViewController : UIViewController
@end
@interface UICandidateViewController : UIViewController
@end
@interface UIPredictionViewController : UIViewController
@end @end
+8 -6
View File
@@ -1,6 +1,6 @@
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YoutubeSpeed.dylib TARGET = iphone:clang:latest:13.0
uYouPlus_USE_FLEX = 0 uYouPlus_USE_FLEX = 0
uYouPlus_USE_FISHHOOK = 0
ARCHS = arm64 ARCHS = arm64
MODULES = jailed MODULES = jailed
FINALPACKAGE = 1 FINALPACKAGE = 1
@@ -10,9 +10,10 @@ TWEAK_NAME = uYouPlus
DISPLAY_NAME = YouTube DISPLAY_NAME = YouTube
BUNDLE_ID = com.google.ios.youtube 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_FILES = uYouPlus.xm Settings.xm uYouPlus_FILES = uYouPlus.xm Settings.xm
uYouPlus_IPA = /path/to/your/decrypted/YouTube/IPA uYouPlus_IPA = ./tmp/Payload/YouTube.app
### Important: edit the path to your decrypted YouTube IPA!!! uYouPlus_FRAMEWORKS = UIKit
include $(THEOS)/makefiles/common.mk include $(THEOS)/makefiles/common.mk
include $(THEOS_MAKE_PATH)/tweak.mk include $(THEOS_MAKE_PATH)/tweak.mk
@@ -20,11 +21,12 @@ SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tw
include $(THEOS_MAKE_PATH)/aggregate.mk include $(THEOS_MAKE_PATH)/aggregate.mk
before-package:: before-package::
@tput setaf 4 && echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m" @echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m"
@mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \; @mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \;
@cp -R Tweaks/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/ @cp -R Tweaks/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/
@cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/ @cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/
@cp -R Tweaks/uYou/Library/Application\ Support/uYouBundle.bundle Resources/ @cp -R Tweaks/uYou/Library/Application\ Support/uYouBundle.bundle Resources/
@tput setaf 5 && echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m" @cp -R lang/uYouPlus.bundle Resources/
@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m"
@codesign --remove-signature .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib @codesign --remove-signature .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib
@codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib @codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
+22 -16
View File
@@ -1,6 +1,5 @@
![cydia-1900000830-iphone-0-1628105716 3](https://user-images.githubusercontent.com/52943116/135612614-3d3138cb-2a3d-4ed1-9244-905bab8f5c9f.PNG) ![cydia-1900000830-iphone-0-1628105716 3](https://user-images.githubusercontent.com/52943116/135612614-3d3138cb-2a3d-4ed1-9244-905bab8f5c9f.PNG)
# Table of Contents # Table of Contents
* [Credits](#credits) * [Credits](#credits)
@@ -10,8 +9,7 @@
* [Installation](#installation) * [Installation](#installation)
* [Support the developers!](#support-the-developers) * [Support the developers!](#support-the-developers)
* [FAQ](#faq) * [FAQ](#faq)
* [Building (optional)](#building-optional) * [Building](#building-optional)
# Credits # Credits
@@ -21,17 +19,18 @@
- [HASHBANG Productions](https://github.com/hbang) for [Alderis Color Picker](https://github.com/hbang/Alderis) - a dependency of iSponsorBlock. - [HASHBANG Productions](https://github.com/hbang) for [Alderis Color Picker](https://github.com/hbang/Alderis) - a dependency of iSponsorBlock.
- [PoomSmart](https://twitter.com/poomsmart) - the developer of many tweaks used by uYouPlus, include: [YouRememberCaption](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/), [YTClassicVideoQuality](https://poomsmart.github.io/repo/depictions/ytclassicvideoquality.html), [YTNoCheckLocalNetwork](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html), [YTSystemAppearance](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html), [YTAutoFullScreen](https://github.com/PoomSmart/YTAutoFullScreen/), [YTReExplore](https://github.com/PoomSmart/YTReExplore/), [YTUHD](https://poomsmart.github.io/repo/depictions/ytuhd.html), [YouPiP](https://poomsmart.github.io/repo/depictions/youpip.html), and [Return YouTube Dislike](https://github.com/PoomSmart/Return-YouTube-Dislikes) - [PoomSmart](https://twitter.com/poomsmart) - the developer of many tweaks used by uYouPlus, include: [NoYTPremium](https://github.com/PoomSmart/NoYTPremium/), [YouRememberCaption](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/), [YTClassicVideoQuality](https://poomsmart.github.io/repo/depictions/ytclassicvideoquality.html), [YTNoCheckLocalNetwork](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html), [YTSystemAppearance](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html), [YTAutoFullScreen](https://github.com/PoomSmart/YTAutoFullScreen/), [YTReExplore](https://github.com/PoomSmart/YTReExplore/), [IAmYouTube](https://github.com/PoomSmart/IAmYouTube), [YTUHD](https://poomsmart.github.io/repo/depictions/ytuhd.html), [YouPiP](https://poomsmart.github.io/repo/depictions/youpip.html), and [Return YouTube Dislike](https://github.com/PoomSmart/Return-YouTube-Dislikes)
- [level3tjg](https://twitter.com/level3tjg) - for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards). - [level3tjg](https://twitter.com/level3tjg) - for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards) and [YTMiniplayerEnabler](https://github.com/level3tjg/YTMiniplayerEnabler).
- [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/).
- [Al4ise](https://github.com/Al4ise) for [Azule](https://github.com/Al4ise/Azule), a tool used to inject jailbreak tweaks into jailed iOS apps. - [Al4ise](https://github.com/Al4ise) for [Azule](https://github.com/Al4ise/Azule), a tool used to inject jailbreak tweaks into jailed iOS apps.
- [theos team](https://github.com/theos/theos) for theos & theos-jailed. - [theos team](https://github.com/theos/theos) for theos & theos-jailed.
# Features # Features
1. **uYou:** uYou has a ton of features that I can't list them all. Visit [here](https://miro92.com/repo/depictions/?p=com.miro.uyou) for more info! 1. **uYou:** uYou has a ton of features that I can't list them all. Visit [here](https://miro92.com/repo/depictions/?p=com.miro.uyou) for more info!
@@ -57,7 +56,11 @@
10. **YouRememberCaption**: make YouTube remember your video caption setting (if not already). 10. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
11. **YTSpeed**: add 2.25, 2.5, 2.75, and 3x playback speed 11. **NoYTPremium**: remove YouTube Premium upshells.
12. **YTSpeed**: add 2.25, 2.5, 2.75, and 3x playback speed
13. **YTMiniplayerEnabler**: enable Miniplayer for all YouTube videos.
</details> </details>
@@ -67,7 +70,6 @@
- Issues that related to **uYouPlus** are [here](https://github.com/qnblackcat/uYouPlus/issues/) - Issues that related to **uYouPlus** are [here](https://github.com/qnblackcat/uYouPlus/issues/)
# Download # Download
- **uYouPlus** (or you can call it uYou+) requires iOS & iPadOS 13.0 or later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases). - **uYouPlus** (or you can call it uYou+) requires iOS & iPadOS 13.0 or later. The latest version of **uYouPlus** can be found in the [Release tab](https://github.com/qnblackcat/uYouPlus/releases).
@@ -76,32 +78,36 @@
- My official AtlStore repo: https://qnblackcat.github.io/AltStore/ - My official AtlStore repo: https://qnblackcat.github.io/AltStore/
- [Open in AltStore (v17.16.4-2.1)](https://tinyurl.com/2p8t49r2) - It will take a while to install because AltStore needs to download the IPA. - [Open in AltStore (v17.23.6-2.1)](https://tinyurl.com/5upjtvbv) - It will take a while to install because AltStore needs to download the IPA.
- Version info: _(last update: Apr 25)_ - Version info: _(last update: June 14)_
<details> <details>
<summary> Expand</summary> <summary>Expand</summary>
| **Tweaks/App** | **Version** | **Open source** | | **Tweaks/App** | **Version** | **Open source** |
| :------------: | :----------:| :-------------: | | :------------: | :----------:| :-------------: |
| **YouTube** | 17.16.4 | ✖︎ | | **YouTube** | 17.23.6 | ✖︎ |
| **uYou** | 2.1 | ✖︎ | | [uYou](https://github.com/MiRO92/uYou-for-YouTube) | 2.1 | ✖︎ |
| **Return YouTube Dislike** | 1.6.4 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) | | [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions/) | 1.2 | ✖︎ |
| **Return YouTube Dislike** | 1.6.5 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
| **iSponsorBlock** | 1.0-14 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) | | **iSponsorBlock** | 1.0-14 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
| **Alderis Color Picker** | 1.1.2| [✔︎](https://github.com/hbang/Alderis) | | **Alderis Color Picker** | 1.2| [✔︎](https://github.com/hbang/Alderis) |
| **NoYTPremium** | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium/) |
| **YouRememberCaption** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) | | **YouRememberCaption** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) |
| **YTClassicVideoQuality** | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) | | **YTClassicVideoQuality** | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) |
| **YTNoCheckLocalNetwork** | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) | | **YTNoCheckLocalNetwork** | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
| **YTNoHoverCards** | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) | | **YTNoHoverCards** | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
| **YTSystemAppearance** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) | | **YTSystemAppearance** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) |
| **YTUHD** | 1.2.7 | [✔︎](https://github.com/PoomSmart/YTUHD) | | **YTUHD** | 1.2.7 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | 1.6.11 | [✔︎](https://github.com/PoomSmart/YouPiP) | | **YouPiP** | 1.7.3 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **IAmYouTube** | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
| **YTSpeed** | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) | | **YTSpeed** | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
| **YTAutoFullScreen** | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen/) | | **YTAutoFullScreen** | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen/) |
| **YTReExplore** | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) | | **YTReExplore** | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
| **BigYTMiniPlayer** | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) | | **BigYTMiniPlayer** | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
| **YTCastConfirm** | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) | | **YTCastConfirm** | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
| **YTMiniplayerEnabler** | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
</details> </details>
+151 -103
View File
@@ -1,115 +1,163 @@
#import "Tweaks/YouTubeHeader/YTSettingsViewController.h"
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h" #import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
#import "Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
#import "Header.h"
@interface YTSettingsSectionItemManager (YouPiP)
- (void)updateuYouPlusSectionWithEntry:(id)entry;
@end
static const NSInteger uYouPlusSection = 500;
extern NSBundle *uYouPlusBundle();
extern BOOL hideHUD(); extern BOOL hideHUD();
extern BOOL oled(); extern BOOL oled();
extern BOOL oledKB();
extern BOOL autoFullScreen(); extern BOOL autoFullScreen();
extern BOOL noHoverCard(); extern BOOL hideHoverCard();
extern BOOL ReExplore(); extern BOOL reExplore();
extern BOOL bigYTMiniPlayer(); extern BOOL bigYTMiniPlayer();
extern BOOL hideCC(); extern BOOL hideCC();
extern BOOL hideAutoplaySwitch(); extern BOOL hideAutoplaySwitch();
extern BOOL castConfirm(); extern BOOL castConfirm();
extern BOOL ytMiniPlayer();
extern BOOL hidePreviousAndNextButton();
// Settings // Settings
%hook YTSettingsViewController %hook YTAppSettingsPresentationData
- (void)setSectionItems:(NSMutableArray <YTSettingsSectionItem *>*)sectionItems forCategory:(NSInteger)category title:(NSString *)title titleDescription:(NSString *)titleDescription headerHidden:(BOOL)headerHidden { + (NSArray *)settingsCategoryOrder {
if (category == 1) { NSArray *order = %orig;
NSUInteger statsForNerdsIndex = [sectionItems indexOfObjectPassingTest:^BOOL (YTSettingsSectionItem *item, NSUInteger idx, BOOL *stop) { NSMutableArray *mutableOrder = [order mutableCopy];
return item.settingItemId == 265; NSUInteger insertIndex = [order indexOfObject:@(1)];
}]; if (insertIndex != NSNotFound)
if (statsForNerdsIndex != NSNotFound) { [mutableOrder insertObject:@(uYouPlusSection) atIndex:insertIndex + 1];
// return mutableOrder;
YTSettingsSectionItem *castConfirm = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Confirm alert before casting (YTCastConfirm)" titleDescription:@"Show a confirm alert before casting to prevent accidentally hijacking TV."]; }
castConfirm.hasSwitch = YES; %end
castConfirm.switchVisible = YES;
castConfirm.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"]; %hook YTSettingsSectionItemManager
castConfirm.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { %new
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"castConfirm_enabled"]; - (void)updateuYouPlusSectionWithEntry:(id)entry {
return YES; YTSettingsViewController *delegate = [self valueForKey:@"_dataDelegate"];
}; NSBundle *tweakBundle = uYouPlusBundle();
[sectionItems insertObject:castConfirm atIndex:statsForNerdsIndex + 1];
// YTSettingsSectionItem *hidePreviousAndNextButton = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON") titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC")];
YTSettingsSectionItem *hoverCardItem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Show End screens hover cards (YTNoHoverCards)" titleDescription:@"Allows creator End screens (thumbnails) to appear at the end of videos."]; hidePreviousAndNextButton.hasSwitch = YES;
hoverCardItem.hasSwitch = YES; hidePreviousAndNextButton.switchVisible = YES;
hoverCardItem.switchVisible = YES; hidePreviousAndNextButton.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePreviousAndNextButton_enabled"];
hoverCardItem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"]; hidePreviousAndNextButton.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
hoverCardItem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePreviousAndNextButton_enabled"];
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hover_cards_enabled"]; return YES;
return YES; };
};
[sectionItems insertObject:hoverCardItem atIndex:statsForNerdsIndex + 1]; YTSettingsSectionItem *ytMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"YT_MINIPLAYER") titleDescription:LOC(@"YT_MINIPLAYER_DESC")];
// ytMiniPlayer.hasSwitch = YES;
YTSettingsSectionItem *bigYTMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"New miniplayer bar style (BigYTMiniPlayer)" titleDescription:@"App restart is required."]; ytMiniPlayer.switchVisible = YES;
bigYTMiniPlayer.hasSwitch = YES; ytMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"ytMiniPlayer_enabled"];
bigYTMiniPlayer.switchVisible = YES; ytMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
bigYTMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"bigYTMiniPlayer_enabled"]; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytMiniPlayer_enabled"];
bigYTMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { return YES;
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"bigYTMiniPlayer_enabled"]; };
return YES;
}; YTSettingsSectionItem *castConfirm = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"CAST_CONFIRM") titleDescription:LOC(@"CAST_CONFIRM_DESC")];
[sectionItems insertObject:bigYTMiniPlayer atIndex:statsForNerdsIndex + 2]; castConfirm.hasSwitch = YES;
// castConfirm.switchVisible = YES;
YTSettingsSectionItem *reExplore = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Replace Shorts tab with Explore tab (YTReExplore)" titleDescription:@"App restart is required."]; castConfirm.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
reExplore.hasSwitch = YES; castConfirm.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
reExplore.switchVisible = YES; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"castConfirm_enabled"];
reExplore.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"]; return YES;
reExplore.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { };
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"reExplore_enabled"];
return YES; YTSettingsSectionItem *hideHoverCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_HOVER_CARD") titleDescription:LOC(@"HIDE_HOVER_CARD_DESC")];
}; hideHoverCard.hasSwitch = YES;
[sectionItems insertObject:reExplore atIndex:statsForNerdsIndex + 2]; hideHoverCard.switchVisible = YES;
// hideHoverCard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHoverCards_enabled"];
YTSettingsSectionItem *hideCC = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide Subtitles button" titleDescription:@"Hide the Subtitles button in video controls overlay. "]; hideHoverCard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
hideCC.hasSwitch = YES; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHoverCards_enabled"];
hideCC.switchVisible = YES; return YES;
hideCC.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideCC_enabled"]; };
hideCC.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCC_enabled"]; YTSettingsSectionItem *bigYTMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"NEW_MINIPLAYER_STYLE") titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC")];
return YES; bigYTMiniPlayer.hasSwitch = YES;
}; bigYTMiniPlayer.switchVisible = YES;
[sectionItems insertObject:hideCC atIndex:statsForNerdsIndex + 1]; bigYTMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"bigYTMiniPlayer_enabled"];
// bigYTMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
YTSettingsSectionItem *hideAutoplaySwitch = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide Autoplay switch" titleDescription:@"Hide the Autoplay switch button in video controls overlay."]; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"bigYTMiniPlayer_enabled"];
hideAutoplaySwitch.hasSwitch = YES; return YES;
hideAutoplaySwitch.switchVisible = YES; };
hideAutoplaySwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
hideAutoplaySwitch.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { YTSettingsSectionItem *reExplore = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"YT_RE_EXPLORE") titleDescription:LOC(@"YT_RE_EXPLORE_DESC")];
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideAutoplaySwitch_enabled"]; reExplore.hasSwitch = YES;
return YES; reExplore.switchVisible = YES;
}; reExplore.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"];
[sectionItems insertObject:hideAutoplaySwitch atIndex:statsForNerdsIndex + 1]; reExplore.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
// [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"reExplore_enabled"];
YTSettingsSectionItem *autoFUll = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Auto Full Screen (YTAutoFullScreen)" titleDescription:@"Autoplay videos at full screen."]; return YES;
autoFUll.hasSwitch = YES; };
autoFUll.switchVisible = YES;
autoFUll.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"autofull_enabled"]; YTSettingsSectionItem *hideCC = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_SUBTITLES_BUTTON") titleDescription:LOC(@"HIDE_SUBTITLES_BUTTON_DESC")];
autoFUll.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { hideCC.hasSwitch = YES;
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autofull_enabled"]; hideCC.switchVisible = YES;
return YES; hideCC.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideCC_enabled"];
}; hideCC.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[sectionItems insertObject:autoFUll atIndex:statsForNerdsIndex + 3]; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCC_enabled"];
// return YES;
YTSettingsSectionItem *hideHUD = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Hide HUD Messages" titleDescription:@"Example: CC is turned on/off, Video loop is on,..."]; };
hideHUD.hasSwitch = YES;
hideHUD.switchVisible = YES; YTSettingsSectionItem *hideAutoplaySwitch = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_AUTOPLAY_SWITCH") titleDescription:LOC(@"HIDE_AUTOPLAY_SWITCH_DESC")];
hideHUD.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"]; hideAutoplaySwitch.hasSwitch = YES;
hideHUD.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { hideAutoplaySwitch.switchVisible = YES;
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"]; hideAutoplaySwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
return YES; hideAutoplaySwitch.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
}; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideAutoplaySwitch_enabled"];
[sectionItems insertObject:hideHUD atIndex:statsForNerdsIndex + 1]; return YES;
// };
YTSettingsSectionItem *Oleditem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"OLED Dark mode (Experimental)" titleDescription:@"WARNING: OLED Dark mode only works when YouTube is in Dark theme. App restart is required."];
Oleditem.hasSwitch = YES; YTSettingsSectionItem *autoFull = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"AUTO_FULLSCREEN") titleDescription:LOC(@"AUTO_FULLSCREEN_DESC")];
Oleditem.switchVisible = YES; autoFull.hasSwitch = YES;
Oleditem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"]; autoFull.switchVisible = YES;
Oleditem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) { autoFull.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"autoFull_enabled"];
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oled_enabled"]; autoFull.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
return YES; [[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autoFull_enabled"];
}; return YES;
[sectionItems insertObject:Oleditem atIndex:statsForNerdsIndex + 1]; };
}
} YTSettingsSectionItem *hideHUD = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_HUD_MESSAGES") titleDescription:LOC(@"HIDE_HUD_MESSAGES_DESC")];
%orig; hideHUD.hasSwitch = YES;
} hideHUD.switchVisible = YES;
hideHUD.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
hideHUD.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"];
return YES;
};
YTSettingsSectionItem *oledDarkMode = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"OLED_DARKMODE") titleDescription:LOC(@"OLED_DARKMODE_DESC")];
oledDarkMode.hasSwitch = YES;
oledDarkMode.switchVisible = YES;
oledDarkMode.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
oledDarkMode.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oled_enabled"];
return YES;
};
YTSettingsSectionItem *oledKeyBoard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"OLED_KEYBOARD") titleDescription:LOC(@"OLED_KEYBOARD_DESC")];
oledKeyBoard.hasSwitch = YES;
oledKeyBoard.switchVisible = YES;
oledKeyBoard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
oledKeyBoard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"];
return YES;
};
NSMutableArray <YTSettingsSectionItem *> *sectionItems = [NSMutableArray arrayWithArray:@[autoFull, castConfirm, ytMiniPlayer, hideAutoplaySwitch, hideCC, hideHUD, hidePreviousAndNextButton, hideHoverCard, bigYTMiniPlayer, oledDarkMode, oledKeyBoard, reExplore]];
[delegate setSectionItems:sectionItems forCategory:uYouPlusSection title:@"uYouPlus" titleDescription:nil headerHidden:NO];
}
- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry {
if (category == uYouPlusSection) {
[self updateuYouPlusSectionWithEntry:entry];
return;
}
%orig;
}
%end %end
+27 -12
View File
@@ -4,34 +4,49 @@
cd "$(dirname "$0")" cd "$(dirname "$0")"
# Check uYou # Check uYou
if [[ ! -f Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb ]] if [ ! -f Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb ]
then then
echo -e "==> \033[1muYou v2.1 is not found. Downloading uYou (v2.1)...\033[0m" echo -e "==> \033[1muYou v2.1 is not found. Downloading uYou (v2.1)...\033[0m"
(set -x ; curl https://miro92.com/repo/debs/com.miro.uyou_2.1_iphoneos-arm.deb --output Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb) (set -x ; curl https://miro92.com/repo/debs/com.miro.uyou_2.1_iphoneos-arm.deb --output Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb)
else else
echo -e "==> \033[1mFounded uYou (v2.1)!\033[0m" echo -e "==> \033[1mFounded uYou (v2.1)!\033[0m"
fi fi
# Extract uYou # Extract uYou
echo -e "==> \033[1mExtracting uYou...\033[0m" echo -e "==> \033[1mExtracting uYou...\033[0m"
if (cd Tweaks/uYou && tar -xf com.miro.uyou_2.1_iphoneos-arm.deb && tar -xf data.tar.*) if (cd Tweaks/uYou && tar -xf com.miro.uyou_2.1_iphoneos-arm.deb && tar -xf data.tar.*)
then then
echo -e "\033[1m> Extracted uYou!\033[0m" echo -e "\033[1m> Extracted uYou!\033[0m"
else else
echo "> \033[1mCouldn't extract uYou\033[0m" echo "> \033[1mCouldn't extract uYou\033[0m"
fi fi
# Makefile # Makefile
read -e -p "==> Path to the decrypted YouTube iPA: " PATHTOIPA if [ -d ./tmp ]
if [[ $PATHTOIPA == *.ipa ]]
then then
sed -i '' "14s#.*#uYouPlus_IPA = $PATHTOIPA#g" ./Makefile rm -rf ./tmp
fi
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
if [[ $PATHTOYT == *.ipa ]]
then
unzip -q "$PATHTOYT" -d ./tmp
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
make package
open ./packages
elif [[ $PATHTOYT == *.app ]]
then
mkdir -p ./tmp/Payload/
cp -R "$PATHTOYT" ./tmp/Payload 2>/dev/null
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
make package make package
open ./packages open ./packages
else else
echo "This is not an iPA" echo "This is not an ipa/app!"
fi fi
# Clean up # Clean up
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m" tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
rm -rf Resources .theos/_/Payload rm -rf tmp/ Resources .theos/_/Payload
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί κατά την αναπαραγωγή βίντεο.";
"YT_MINIPLAYER" = "Ενεργοποιήστε το miniplayer για όλα τα βίντεο του YouTube";
"YT_MINIPLAYER_DESC" = "Τα παιδικά βίντεο για παράδειγμα.";
"CAST_CONFIRM" = "Επιβεβαιωτικό μήνυμα πριν γίνει Cast(YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Να φανεί ένα επιβεβαιωτικό μήνυμα πριν γίνει cast για να αποτρεπτεί η καταλάθως σύνδεση στην τηλεόραση.";
"HIDE_HOVER_CARD" = "Κρύψτε τις τελικές καρτέλες (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Κρύψτε τις τελικές καρτέλες από τους δημιουργούς (thumbnails) στο τέλος των βίντεο.";
"NEW_MINIPLAYER_STYLE" = "Καινούργιο miniplayer θέμα στην μπάρα (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";
"YT_RE_EXPLORE" = "Αντικατάσταση της καρτέλας Shorts με την καρτέλα Explore (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";
"HIDE_SUBTITLES_BUTTON" = "Κρύψτε το κουμπί των Υπότιτλων";
"HIDE_SUBTITLES_BUTTON_DESC" = "Κρύψτε το κουμπί των Υπότιτλων κατά την αναπαραγωγή βίντεο.";
"HIDE_AUTOPLAY_SWITCH" = "Κρύψτε τον διακόπτη της αυτόματης αναπαραγωγής";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Κρύψτε τον διακόπτη της αυτόματης αναπαραγωγής κατά την αναπαραγωγή βίντεο";
"AUTO_FULLSCREEN" = "Αυτόματη αναπαραγωγή σε πλήρη οθόνη (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Αυτόματη αναπαραγωγή των βίντεο σε πλήρη οθόνη.";
"HIDE_HUD_MESSAGES" = "Κρύψτε τα μηνύματα του HUD";
"HIDE_HUD_MESSAGES_DESC" = "Παράδειγμα: Οι Υπότιτλοι απενεργοποιήθηκαν/ενεργοποιήθηκαν...";
"OLED_DARKMODE" = "OLED Μαύρο θέμα (Experimental)";
"OLED_DARKMODE_DESC" = "Μπορεί να μην δουλέψει σε κάποιες περιπτώσεις. Απαιτείται επανεκκίνηση της εφαρμογής αφού το ενεργοποιήσετε/απενεργοποιήσετε.";
"OLED_KEYBOARD" = "OLED πληκτρολόγιο (Experimental)";
"OLED_KEYBOARD_DESC" = "Μπορεί να μην δουλέψει σε κάποιες περιπτώσεις. Απαιτείται επανεκκίνηση της εφαρμογής.";
// YTCastConfirm
"CASTING" = "Μετάδοση";
"MSG_ARE_YOU_SURE" = "Είστε σίγουροι ότι θέλενε να ξεκινήσετε την μετάδοση;";
"MSG_YES" = "Ναι";
"MSG_CANCEL" = "Ακύρωση";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Hide Previous and Next button";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide Previous and Next button in video controls overlay.";
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
"YT_MINIPLAYER_DESC" = "Kid videos for example.";
"CAST_CONFIRM" = "Confirm alert before casting (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Show a confirm alert before casting to prevent accidentally hijacking TV.";
"HIDE_HOVER_CARD" = "Hide End screens hover cards (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Hide creator End screens (thumbnails) at the end of videos.";
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "App restart is required.";
"HIDE_SUBTITLES_BUTTON" = "Hide Subtitles button";
"HIDE_SUBTITLES_BUTTON_DESC" = "Hide the Subtitles button in video controls overlay.";
"HIDE_AUTOPLAY_SWITCH" = "Hide Autoplay switch";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Hide the Autoplay switch in video controls overlay.";
"AUTO_FULLSCREEN" = "Auto Full Screen (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Autoplay videos at full screen.";
"HIDE_HUD_MESSAGES" = "Hide HUD Messages";
"HIDE_HUD_MESSAGES_DESC" = "Example: CC is turned on/off, Video loop is on,...";
"OLED_DARKMODE" = "OLED Dark mode (Experimental)";
"OLED_DARKMODE_DESC" = "Might not working correctly in some cases. App restart is required after you enable/disable this option.";
"OLED_KEYBOARD" = "OLED Keyboard (Experimental)";
"OLED_KEYBOARD_DESC" = "Might not working correctly in some cases. App restart is required.";
// YTCastConfirm
"CASTING" = "Castings";
"MSG_ARE_YOU_SURE" = "Are you sure you want to start casting?";
"MSG_YES" = "Yes";
"MSG_CANCEL" = "Cancel";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Masquer les boutons Précédent et Suivant";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Masquer les boutons Précédent et Suivant dans la superposition des contrôles vidéo";
"YT_MINIPLAYER" = "Activer le mini-lecteur pour toutes les vidéos YouTube";
"YT_MINIPLAYER_DESC" = "Vidéos pour enfants par exemple";
"CAST_CONFIRM" = "Confirmer l'alerte avant le casting (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Afficher une alerte de confirmation avant le casting pour éviter de déclancher accidentellement la télévision";
"HIDE_HOVER_CARD" = "Masquer les cartes de survol des écrans de fin (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Masquer les écrans de fin (vignettes) des créateurs à la fin des vidéos";
"NEW_MINIPLAYER_STYLE" = "Nouveau style de barre de mini-lecteur (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Un redémarrage de l'application est nécessaire";
"YT_RE_EXPLORE" = "Remplacer l'onglet Shorts par l'onglet Explorer (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Un redémarrage de l'application est nécessaire";
"HIDE_SUBTITLES_BUTTON" = "Bouton de masquage des sous-titres";
"HIDE_SUBTITLES_BUTTON_DESC" = "Masquer le bouton des sous-titres dans la superposition des contrôles vidéo";
"HIDE_AUTOPLAY_SWITCH" = "Masquer l'interrupteur de lecture automatique";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Masquer le bouton de lecture automatique dans la superposition des contrôles vidéo";
"AUTO_FULLSCREEN" = "Plein écran automatique (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Lecture automatique des vidéos en plein écran";
"HIDE_HUD_MESSAGES" = "Masquer les messages de l'ATH";
"HIDE_HUD_MESSAGES_DESC" = "Exemple : Les sous-titres sont activés/désactivés, la boucle vidéo est activée,...";
"OLED_DARKMODE" = "Mode sombre OLED (Expérimental)";
"OLED_DARKMODE_DESC" = "Peut ne pas fonctionner correctement dans certains cas. Un redémarrage de l'application est nécessaire après avoir activé/désactivé cette option.";
"OLED_KEYBOARD" = "Clavier OLED (Expérimental)";
"OLED_KEYBOARD_DESC" = "Peut ne pas fonctionner correctement dans certains cas. Un redémarrage de l'application est nécessaire.";
// YTCastConfirm
"CASTING" = "Castings";
"MSG_ARE_YOU_SURE" = "Êtes-vous sûr de vouloir commencer le casting ?";
"MSG_YES" = "Oui";
"MSG_CANCEL" = "Annuler";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "הסתר את הקודם והבא";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "הסתר את כפתורי הקודם והבא בתצוגת השליטה בסרטון.";
"YT_MINIPLAYER" = "אפשר את הנגן הקטן עבור כל הסרטונים ב-YouTube";
"YT_MINIPLAYER_DESC" = "סרטוני ילדים לדוגמה.";
"CAST_CONFIRM" = "התראת אישור לפני שידור לטלוויזיה (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "הצג התראת אישור לפני שידור לטלוויזיה כדי למנוע לחיצה בטעות.";
"HIDE_HOVER_CARD" = "הסתר כרטיסיות סיום סרטון (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "הסתר את מסכי הסיום של סרטונים המציגים את הערוץ וסרטונים נוספים.";
"NEW_MINIPLAYER_STYLE" = "עיצוב נגן קטן חדש (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "נדרש לפתוח מחדש את היישום.";
"YT_RE_EXPLORE" = "החלף את לשונית ה-Shorts בלשונית Explore (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "נדרש לפתוח מחדש את היישום.";
"HIDE_SUBTITLES_BUTTON" = "הסתר את כפתור הכתוביות";
"HIDE_SUBTITLES_BUTTON_DESC" = "הסתר את כפתור הכתוביות בתצוגת השליטה בסרטון.";
"HIDE_AUTOPLAY_SWITCH" = "הסתר את כפתור ההפעלה האוטומטית";
"HIDE_AUTOPLAY_SWITCH_DESC" = "הסתר את כפתור ההפעלה האוטומטית בתצוגת השליטה בסרטון.";
"AUTO_FULLSCREEN" = "מסך מלא אוטומטי (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "נגן סרטונים במסך מלא אוטומטית.";
"HIDE_HUD_MESSAGES" = "הסתר הודעות קופצות";
"HIDE_HUD_MESSAGES_DESC" = "לדוגמה: כתוביות מופעלות/מושבתות, הופעל סרטון בלופ,...";
"OLED_DARKMODE" = "תצוגה כהה OLED (נסיוני)";
"OLED_DARKMODE_DESC" = "עלול לא לעבוד נכון בחלק מהמקרים, נדרש לפתוח מחדש את היישום.";
"OLED_KEYBOARD" = "מקלדת כהה OLED (נסיוני)";
"OLED_DARKMODE_DESC" = "עלול לא לעבוד נכון בחלק מהמקרים, נדרש לפתוח מחדש את היישום.";
// YTCastConfirm
"CASTING" = "משדר";
"MSG_ARE_YOU_SURE" = "האם להתחיל לשדר?";
"MSG_YES" = "כן";
"MSG_CANCEL" = "ביטול";
@@ -0,0 +1,43 @@
/* uYouPlusSettings */
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Скрыть «Пред.» и «След.»";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Убирает кнопки переключения видео «Следующий» и «Предыдущий» с плеера.";
"YT_MINIPLAYER" = "Мини-плеер для всех видео";
"YT_MINIPLAYER_DESC" = "Принудительно активирует мини-плеер для всех видео, включая видео, предназначенное для детей.";
"CAST_CONFIRM" = "Подтверждение «Трансляции» (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Спрашивать подтверждение перед началом трансляции во избежание случайных подключений к ТВ.";
"HIDE_HOVER_CARD" = "Скрыть рекомендации (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Скрывает эскизы, отображаемые по окончанию видеоролика.";
"NEW_MINIPLAYER_STYLE" = "Мини-плеер в стиле iPad (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Потребуется перезагрузка.";
"YT_RE_EXPLORE" = "Вкладка «Навигация» вместо «Shorts»";
"YT_RE_EXPLORE_DESC" = "Потребуется перезагрузка.";
"HIDE_SUBTITLES_BUTTON" = "Скрыть «Субтитры»";
"HIDE_SUBTITLES_BUTTON_DESC" = "Скрывает кнопку субтитров с оверлея плеера.";
"HIDE_AUTOPLAY_SWITCH" = "Скрыть «Автовоспроизведение»";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Убирает тумблер «Автовоспроизведение» с оверлея плеера.";
"AUTO_FULLSCREEN" = "Полноэкранный режим (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Автоматически открывает ролики в полноэкранном режиме.";
"HIDE_HUD_MESSAGES" = "Скрыть сообщения плеера";
"HIDE_HUD_MESSAGES_DESC" = "Скрывает надписи YouTube, появляющиеся поверх видео.";
"OLED_DARKMODE" = "Темный режим для OLED (Бета)";
"OLED_DARKMODE_DESC" = "Понадобится перезагрузка при смене цветовой темы приложения. Если OLED-тема не включится, попробуйте переключиться не светлый режим и обратно, а затем перезагрузить приложение.";
"OLED_KEYBOARD" = "OLED-клавиатура (Бета)";
"OLED_KEYBOARD_DESC" = "Возможно, на некоторых устройствах будет работать криво. Потребуется перезагрузка.";
/* YTCastConfirm */
"CASTING" = "Трансляция";
"MSG_ARE_YOU_SURE" = "Начать трансляцию экрана?";
"MSG_YES" = "Да";
"MSG_CANCEL" = "Отмена";
@@ -0,0 +1,53 @@
// 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!
//
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Hide Previous and Next button";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide Previous and Next button in video controls overlay.";
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
"YT_MINIPLAYER_DESC" = "Kid videos for example.";
"CAST_CONFIRM" = "Confirm alert before casting (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Show a confirm alert before casting to prevent accidentally hijacking TV.";
"HIDE_HOVER_CARD" = "Hide End screens hover cards (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Hide creator End screens (thumbnails) at the end of videos.";
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "App restart is required.";
"HIDE_SUBTITLES_BUTTON" = "Hide Subtitles button";
"HIDE_SUBTITLES_BUTTON_DESC" = "Hide the Subtitles button in video controls overlay.";
"HIDE_AUTOPLAY_SWITCH" = "Hide Autoplay switch";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Hide the Autoplay switch in video controls overlay.";
"AUTO_FULLSCREEN" = "Auto Full Screen (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Autoplay videos at full screen.";
"HIDE_HUD_MESSAGES" = "Hide HUD Messages";
"HIDE_HUD_MESSAGES_DESC" = "Example: CC is turned on/off, Video loop is on,...";
"OLED_DARKMODE" = "OLED Dark mode (Experimental)";
"OLED_DARKMODE_DESC" = "Might not working correctly in some cases. App restart is required after you enable/disable this option.";
"OLED_KEYBOARD" = "OLED Keyboard (Experimental)";
"OLED_KEYBOARD_DESC" = "Might not working correctly in some cases. App restart is required.";
// YTCastConfirm
"CASTING" = "Castings";
"MSG_ARE_YOU_SURE" = "Are you sure you want to start casting?";
"MSG_YES" = "Yes";
"MSG_CANCEL" = "Cancel";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ẩn nút Next và nút Previous";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ẩn nút Next và nút Previous trong trình phát video.";
"YT_MINIPLAYER" = "Cho phép trình phát thu nhỏ chạy với mọi video";
"YT_MINIPLAYER_DESC" = "Ví dụ: Video cho trẻ em.";
"CAST_CONFIRM" = "Xác nhận trước khi cast video (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Hiện hộp thoại xác nhận trước khi cast video sang TV để ngăn việc vô tình làm gián đoạn TV.";
"HIDE_HOVER_CARD" = "Ẩn video dạng thumbnails (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Ẩn các video dạng thu nhỏ (thumbnails) xuất hiện ở gần cuối video.";
"NEW_MINIPLAYER_STYLE" = "Giao diện trình phát thu nhỏ kiểu mới (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Cần khởi động lại ứng dụng.";
"YT_RE_EXPLORE" = "Thay thế tab Shorts bằng tab Khám phá (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "Cần khởi động lại ứng dụng.";
"HIDE_SUBTITLES_BUTTON" = "Ẩn nút bật Phụ đề";
"HIDE_SUBTITLES_BUTTON_DESC" = "Ẩn nút bật phụ đề trong trình phát video.";
"HIDE_AUTOPLAY_SWITCH" = "Ẩn công tắc Tự động phát";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ẩn công tắc Tự động phát trong trình phát video.";
"AUTO_FULLSCREEN" = "Tự động toàn màn hình (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "Tự động phát video ở chế độ toàn màn hình.";
"HIDE_HUD_MESSAGES" = "Ẩn tin nhắn HUD";
"HIDE_HUD_MESSAGES_DESC" = "Ví dụ: Đã bật/tắt phụ đề, Tính năng phát video lặp lại đang bật,...";
"OLED_DARKMODE" = "Chế độ tối OLED (Thử nghiệm)";
"OLED_DARKMODE_DESC" = "Cần khởi động lại ứng dụng nếu bạn bật/tắt tính năng này, nhưng không cần khởi động lại ứng dụng nếu chuyển giữa chế độ Sáng và chế độ Tối.";
"OLED_KEYBOARD" = "Bàn phím OLED (Thử nghiệm)";
"OLED_KEYBOARD_DESC" = "Tính năng này có thể không hoạt động tốt trong một vài trường hợp. Cần khởi động lại ứng dụng.";
// YTCastConfirm
"CASTING" = "Truyền video";
"MSG_ARE_YOU_SURE" = "Bạn có muốn bắt đầu truyền video không?";
"MSG_YES" = "Có";
"MSG_CANCEL" = "Không";
@@ -0,0 +1,43 @@
// Settings
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
"YT_MINIPLAYER" = "為所有YouTube影片啟用迷你播放器";
"YT_MINIPLAYER_DESC" = "例如兒童影片";
"CAST_CONFIRM" = "投放前確認 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止意外攔劫電視。";
"HIDE_HOVER_CARD" = "隱藏片尾畫面懸浮卡片 (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面(縮略圖)。";
"NEW_MINIPLAYER_STYLE" = "新的迷你播放器控制列風格 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";
"YT_RE_EXPLORE" = "用探索選項卡替換Shorts選項卡 (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "需要重新啟動應用程式。";
"HIDE_SUBTITLES_BUTTON" = "隱藏字幕按鈕";
"HIDE_SUBTITLES_BUTTON_DESC" = "隱藏影片控制層中的字幕按鈕。";
"HIDE_AUTOPLAY_SWITCH" = "隱藏自動播放開關";
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制層中隱藏自動播放開關。";
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
"HIDE_HUD_MESSAGES" = "隱藏 HUD 訊息";
"HIDE_HUD_MESSAGES_DESC" = "舉例來說:CC字幕 開啟/關閉,影片循環開啟,...";
"OLED_DARKMODE" = "OLED 深色模式(實驗性)";
"OLED_DARKMODE_DESC" = "在某些情況下可能無法正常工作。啟用/禁用此選項後,需要重新啟動應用程式。";
"OLED_KEYBOARD" = "OLED 鍵盤(實驗性)";
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常工作。需要重新啟動應用程式。";
// YTCastConfirm
"CASTING" = "投放中";
"MSG_ARE_YOU_SURE" = "確定要開始投放嗎?";
"MSG_YES" = "是";
"MSG_CANCEL" = "取消";
+436 -368
View File
@@ -1,9 +1,9 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import <objc/runtime.h> #import <objc/runtime.h>
#import <dlfcn.h>
#import "Header.h" #import "Header.h"
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h" #import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h" #import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTWatchController.h" #import "Tweaks/YouTubeHeader/YTWatchController.h"
#import "Tweaks/YouTubeHeader/YTIGuideResponse.h" #import "Tweaks/YouTubeHeader/YTIGuideResponse.h"
@@ -11,21 +11,41 @@
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h" #import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h" #import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h" #import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
#include <RemoteLog.h> #import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
NSBundle *uYouPlusBundle() {
static NSBundle *bundle = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"uYouPlus" ofType:@"bundle"];
bundle = [NSBundle bundleWithPath:tweakBundlePath];
});
return bundle;
}
NSBundle *tweakBundle = uYouPlusBundle();
//
BOOL hideHUD() { BOOL hideHUD() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
} }
BOOL oled() { BOOL oled() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
} }
BOOL oledKB() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
}
BOOL isDarkMode() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
}
BOOL autoFullScreen() { BOOL autoFullScreen() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"autofull_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"autoFull_enabled"];
} }
BOOL noHoverCard() { BOOL hideHoverCard() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHoverCards_enabled"];
} }
BOOL ReExplore() { BOOL reExplore() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"];
} }
BOOL bigYTMiniPlayer() { BOOL bigYTMiniPlayer() {
@@ -37,41 +57,60 @@ BOOL hideCC() {
BOOL hideAutoplaySwitch() { BOOL hideAutoplaySwitch() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
} }
BOOL hidePreviousAndNextButton() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePreviousAndNextButton_enabled"];
}
BOOL castConfirm() { BOOL castConfirm() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"]; return [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
} }
BOOL ytMiniPlayer() {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ytMiniPlayer_enabled"];
}
UIColor* oledColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0]; # pragma mark - Tweaks
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
%hook YTWatchMiniBarViewController
- (void)updateMiniBarPlayerStateFromRenderer {
if (ytMiniPlayer()) {}
else { return %orig; }
}
%end
// Hide CC / Autoplay switch // Hide CC / Autoplay switch / Next & Previous button
%hook YTMainAppControlsOverlayView %hook YTMainAppControlsOverlayView
- (void)layoutSubviews { - (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { // hide CC button
%orig(); if (hideCC()) { return %orig(NO); }
if (hideAutoplaySwitch()) { else { return %orig; }
MSHookIvar<UIView *>(self, "_autonavSwitch").hidden = YES; }
} - (void)setAutoplaySwitchButtonRenderer:(id)arg1 { // hide Autoplay
if (hideCC()) { if (hideAutoplaySwitch()) {}
MSHookIvar<UIView *>(self, "_closedCaptionsOrSubtitlesButton").hidden = YES; else { return %orig; }
} }
- (void)layoutSubviews { // hide Next & Previous button
%orig;
if (hidePreviousAndNextButton()) {
MSHookIvar<YTMainAppControlsOverlayView *>(self, "_nextButton").hidden = YES;
MSHookIvar<YTMainAppControlsOverlayView *>(self, "_previousButton").hidden = YES;
// YouTube love beta testing :/
MSHookIvar<YTTransportControlsButtonView *>(self, "_nextButtonView").hidden = YES;
MSHookIvar<YTTransportControlsButtonView *>(self, "_previousButtonView").hidden = YES;
}
} }
%end %end
// Hide HUD Messages // Hide HUD Messages
%hook YTHUDMessageView %hook YTHUDMessageView
- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { - (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 {
if (hideHUD()) { return hideHUD() ? nil : %orig;
return NULL;
} else { return %orig; }
} }
%end %end
// YTAutoFullScreen: https://github.com/PoomSmart/YTAutoFullScreen/ // YTAutoFullScreen: https://github.com/PoomSmart/YTAutoFullScreen/
%hook YTPlayerViewController %hook YTPlayerViewController
- (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 { - (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 {
if (autoFullScreen()) {
%orig; %orig;
[NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO]; if (autoFullScreen())
} else { return %orig; } [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO];
} }
%new %new
- (void)autoFullscreen { - (void)autoFullscreen {
@@ -83,44 +122,44 @@ UIColor* oledColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards // YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards
%hook YTCreatorEndscreenView %hook YTCreatorEndscreenView
- (void)setHidden:(BOOL)hidden { - (void)setHidden:(BOOL)hidden {
if (!noHoverCard()) if (hideHoverCard())
hidden = YES; hidden = YES;
%orig; %orig;
} }
%end %end
//YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm //YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm
%hook MDXPlaybackRouteButtonController %hook MDXPlaybackRouteButtonController
-(void)didPressButton:(id)arg1 { - (void)didPressButton:(id)arg1 {
if (castConfirm()) { if (castConfirm()) {
UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:@"Casting" UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:LOC(@"CASTING")
message:@"Are you sure you want to start casting?" message:LOC(@"MSG_ARE_YOU_SURE")
preferredStyle:UIAlertControllerStyleAlert]; preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:LOC(@"MSG_YES") style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
%orig; %orig;
}]; }];
UIAlertAction* noButton = [%c(UIAlertAction) UIAlertAction* noButton = [%c(UIAlertAction)
actionWithTitle:@"Cancel" actionWithTitle:LOC(@"MSG_CANCEL")
style:UIAlertActionStyleDefault style:UIAlertActionStyleDefault
handler: ^(UIAlertAction * action) { handler: ^(UIAlertAction * action) {
return; return;
}]; }];
[alertController addAction:defaultAction]; [alertController addAction:defaultAction];
[alertController addAction:noButton]; [alertController addAction:noButton];
id rootViewController = [%c(UIApplication) sharedApplication].delegate.window.rootViewController; id rootViewController = [%c(UIApplication) sharedApplication].delegate.window.rootViewController;
if([rootViewController isKindOfClass:[%c(UINavigationController) class]]) { if ([rootViewController isKindOfClass:[%c(UINavigationController) class]]) {
rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject; rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
} }
if([rootViewController isKindOfClass:[%c(UITabBarController) class]]) { if ([rootViewController isKindOfClass:[%c(UITabBarController) class]]) {
rootViewController = ((UITabBarController *)rootViewController).selectedViewController; rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
} }
if ([rootViewController presentedViewController] != nil) { if ([rootViewController presentedViewController] != nil) {
rootViewController = [rootViewController presentedViewController]; rootViewController = [rootViewController presentedViewController];
} }
[rootViewController presentViewController:alertController animated:YES completion:nil]; [rootViewController presentViewController:alertController animated:YES completion:nil];
} else { return %orig; } } else { return %orig; }
} }
%end %end
@@ -148,380 +187,380 @@ UIColor* oledColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
%hook YTColdConfig %hook YTColdConfig
- (BOOL)shouldUseAppThemeSetting { return YES; } - (BOOL)shouldUseAppThemeSetting { return YES; }
- (BOOL)respectDeviceCaptionSetting { return NO; } - (BOOL)respectDeviceCaptionSetting { return NO; }
- (BOOL)isEnhancedSearchBarEnabled { return YES; }
%end %end
// OLED // NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
// Thanks u/DGh0st for his very well explained comment - https://www.reddit.com/r/jailbreakdevelopers/comments/9uape7/comment/e94sq80/ %hook YTCommerceEventGroupHandler
// Thanks sinfool for his flex patch which brings OLED Dark mode for YouTube - "Color Customizer (YouTube) OLED" - (void)addEventHandlers {}
%end
%hook YTInterstitialPromoEventGroupHandler
- (void)addEventHandlers {}
%end
%hook YTPromosheetEventGroupHandler
- (void)addEventHandlers {}
%end
%hook YTPromoThrottleController
- (BOOL)canShowThrottledPromo { return NO; }
- (BOOL)canShowThrottledPromoWithFrequencyCap:(id)arg1 { return NO; }
- (BOOL)canShowThrottledPromoWithFrequencyCaps:(id)arg1 { return NO; }
%end
%hook YTIShowFullscreenInterstitialCommand
- (BOOL)shouldThrottleInterstitial { return YES; }
%end
%hook YTSurveyController
- (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {}
%end
// Enable Shorts scroll bar - level3tjg - https://reddit.com/r/jailbreak/comments/v29yvk/_/iasl1l0/
%hook YTReelPlayerViewControllerSub
- (BOOL)shouldEnablePlayerBar { return YES; }
%end
// Hide the download playlist button of uYou cuz it's broken ?!
// Why aren't you working?? :/
// %hook YTPlaylistHeaderViewController
// - (void)viewDidLoad {
// %orig;
// self.downloadsButton.hidden = YES;
// }
// %end
// Workaround for issue #54
%hook YTMainAppVideoPlayerOverlayViewController
- (void)updateRelatedVideos {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
else { return %orig; }
}
%end
# pragma mark - IAmYouTube - https://github.com/PoomSmart/IAmYouTube/
%hook YTVersionUtils
+ (NSString *)appName { return YT_NAME; }
+ (NSString *)appID { return YT_BUNDLE_ID; }
%end
%hook GCKBUtils
+ (NSString *)appIdentifier { return YT_BUNDLE_ID; }
%end
%hook GPCDeviceInfo
+ (NSString *)bundleId { return YT_BUNDLE_ID; }
%end
%hook OGLBundle
+ (NSString *)shortAppName { return YT_NAME; }
%end
%hook GVROverlayView
+ (NSString *)appName { return YT_NAME; }
%end
%hook OGLPhenotypeFlagServiceImpl
- (NSString *)bundleId { return YT_BUNDLE_ID; }
%end
%hook SSOConfiguration
- (id)initWithClientID:(id)clientID supportedAccountServices:(id)supportedAccountServices {
self = %orig;
[self setValue:YT_NAME forKey:@"_shortAppName"];
[self setValue:YT_BUNDLE_ID forKey:@"_applicationIdentifier"];
return self;
}
%end
%hook NSBundle
- (NSString *)bundleIdentifier {
NSArray *address = [NSThread callStackReturnAddresses];
Dl_info info = {0};
if (dladdr((void *)[address[2] longLongValue], &info) == 0)
return %orig;
NSString *path = [NSString stringWithUTF8String:info.dli_fname];
if ([path hasPrefix:NSBundle.mainBundle.bundlePath])
return YT_BUNDLE_ID;
return %orig;
}
- (id)objectForInfoDictionaryKey:(NSString *)key {
if ([key isEqualToString:@"CFBundleIdentifier"])
return YT_BUNDLE_ID;
if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"])
return YT_NAME;
return %orig;
}
%end
# pragma mark - OLED dark mode by BandarHL
UIColor* oledColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
%group gOLED %group gOLED
%hook UIView %hook YTCommonColorPalette
-(void)setBackgroundColor:(id)arg1 { - (UIColor *)brandBackgroundSolid {
if ([self.nextResponder isKindOfClass:%c(DownloadedVC)]) //uYou if (self.pageStyle == 1) {
arg1 = oledColor; return oledColor;
if ([self.nextResponder isKindOfClass:%c(DownloadsPagerVC)]) //uYou
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(DownloadingVC)]) //uYou
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(PlayerVC)]) //uYou
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTLinkCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTCommentsHeaderView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTSearchView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTSearchBoxView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTEngagementPanelHeaderView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTEngagementPanelView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTPivotBarView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTHUDMessageView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTChipCloudCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YCHLiveChatTextCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YCHLiveChatViewerEngagementCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTSlideForActionsView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTPlaylistHeaderView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTAsyncCollectionView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTFeedHeaderView)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTMessageCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTPlaylistPanelProminentThumbnailVideoCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(ASWAppSwitcherCollectionViewCell)])
arg1 = oledColor;
if ([self.nextResponder isKindOfClass:%c(YTEditSheetControllerHeader)])
arg1 = oledColor;
%orig;
}
//- (void)layoutSubviews {
// %orig;
// if ([self.nextResponder isKindOfClass:%c(YTALDialog)])
// self.backgroundColor = oledColor;
//}
%end
%hook YTAsyncCollectionView
-(void)setBackgroundColor:(id)arg1 {
if([self.nextResponder isKindOfClass:%c(YTRelatedVideosCollectionViewController)]) {
arg1 = [oledColor colorWithAlphaComponent:0.0];
} else if([self.nextResponder isKindOfClass:%c(YTFullscreenMetadataHighlightsCollectionViewController)]) {
arg1 = [oledColor colorWithAlphaComponent:0.0];
} else {
arg1 = oledColor;
} }
%orig; return %orig;
}
- (UIColor *)brandBackgroundPrimary {
if (self.pageStyle == 1) {
return oledColor;
}
return %orig;
}
- (UIColor *)brandBackgroundSecondary {
if (self.pageStyle == 1) {
return oledColor;
}
return %orig;
}
- (UIColor *)staticBrandBlack {
if (self.pageStyle == 1) {
return oledColor;
}
return %orig;
}
- (UIColor *)generalBackgroundA {
if (self.pageStyle == 1) {
return oledColor;
}
return %orig;
} }
%end %end
%hook YTTopAlignedView // Example from Dune - https://github.com/Skittyblock/Dune/blob/9b1df9790230115b7553cc9dbadf36889018d7f9/Tweak.xm#L700 // Account view controller
-(void)layoutSubviews { %hook YTAccountPanelBodyViewController
%orig; - (UIColor *)backgroundColor:(NSInteger)pageStyle {
MSHookIvar<UIView *>(self, "_contentView").backgroundColor = oledColor; if (pageStyle == 1) {
return oledColor;
}
return %orig;
} }
%end %end
%hook MDXQueueView // Cast queue %hook YTInnerTubeCollectionViewController
-(void)setBackgroundColor:(id)arg1 { - (UIColor *)backgroundColor:(NSInteger)pageStyle {
arg1 = oledColor; if (pageStyle == 1) {
%orig; return oledColor;
}
return %orig;
} }
%end %end
%hook YTChannelProfileEditorView // Explore
-(void)setBackgroundColor:(id)arg1 { %hook ASScrollView
arg1 = oledColor; - (void)didMoveToWindow {
%orig; if (isDarkMode()) {
%orig;
self.backgroundColor = oledColor;
}
} }
%end %end
%hook YTChannelSubMenuView // // Your videos
-(void)setBackgroundColor:(id)arg1 { %hook ASCollectionView
arg1 = oledColor; - (void)didMoveToWindow {
%orig; if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
%orig;
self.superview.backgroundColor = [UIColor clearColor];
}
} }
%end %end
%hook YTChannelListSubMenuView // sub - // iSponsorBlock
-(void)setBackgroundColor:(id)arg1 { %hook SponsorBlockSettingsController
arg1 = oledColor; - (void)viewDidLoad {
%orig; if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.tableView.backgroundColor = oledColor;
} else { return %orig; }
} }
%end %end
%hook SponsorBlockViewController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.view.backgroundColor = oledColor;
} else { return %orig; }
}
%end
// YT Miniplayer
%hook YTWatchMiniBarView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9]);
}
return %orig;
}
%end
// Search View
%hook YTSearchBarView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig(oledColor);
}
return %orig;
}
%end
// History Search view
%hook YTSearchBoxView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig(oledColor);
}
return %orig;
}
%end
// Comment view
%hook YTCommentView %hook YTCommentView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
return %orig;
} }
%end %end
%hook YTCreateCommentAccessoryView %hook YTCreateCommentAccessoryView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
return %orig;
} }
%end %end
%hook YTCreateCommentTextView %hook YTCreateCommentTextView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
return %orig;
}
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
if (isDarkMode()) {
return %orig([UIColor whiteColor]);
}
return %orig;
} }
%end %end
%hook YTFormattedStringLabel // YT is werid...
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor clearColor]);
}
return %orig;
}
%end
// Live chat comment
%hook YCHLiveChatActionPanelView %hook YCHLiveChatActionPanelView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
return %orig;
} }
%end %end
%hook YTEmojiTextView %hook YTEmojiTextView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
return %orig;
} }
%end %end
%hook YTShareTitleView // Share sheet // Nasty stuff :/
-(void)setBackgroundColor:(id)arg1 { %hook _ASDisplayView
arg1 = oledColor; - (void)didMoveToWindow {
%orig; %orig;
if (isDarkMode()) {
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = oledColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = oledColor; }
}
} }
%end %end
%hook YTNavigationBar // Open link with...
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
-(void)setBarTintColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTPrivacyTosFooterView
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTWatchMiniBarView
-(void)setBackgroundColor:(id)arg1 {
arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
%orig;
}
%end
%hook YTPlaylistMiniBarView
-(void)setBackgroundColor:(id)arg1 {
arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
%orig;
}
%end
%hook _LNPopupBarContentView // uYou player
-(void)setBackgroundColor:(id)arg1 {
arg1 = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.9];
%orig;
}
%end
%hook YTEngagementPanelHeaderView
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTChannelMobileHeaderView
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTInlineSignInView
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTHeaderView //Stt bar
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTTabTitlesView // Tab bar - mychannel
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTSettingsCell // Settings
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook GOODialogView // 3 dots menu
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTCollectionView //sharesheet
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook ASWAppSwitchingSheetHeaderView %hook ASWAppSwitchingSheetHeaderView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
} }
%end %end
%hook ASWAppSwitchingSheetFooterView %hook ASWAppSwitchingSheetFooterView
-(void)setBackgroundColor:(id)arg1 { - (void)setBackgroundColor:(UIColor *)color {
arg1 = oledColor; if (isDarkMode()) {
%orig; return %orig(oledColor);
}
} }
%end %end
%hook YTCollectionSeparatorView %hook ASWAppSwitcherCollectionViewCell
-(void)setBackgroundColor:(id)arg1 { - (void)didMoveToWindow {
arg1 = oledColor; if (isDarkMode()) {
%orig;
self.subviews[1].backgroundColor = oledColor;
self.superview.backgroundColor = oledColor;
}
}
%end
%end
# pragma mark - OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
%group gOLEDKB
%hook UIPredictionViewController
- (void)loadView {
%orig; %orig;
[self.view setBackgroundColor:oledColor];
} }
- (void)layoutSubviews {}
%end %end
%hook YTLightweightQTMButton %hook UICandidateViewController
-(void)setBackgroundColor:(id)arg1 { - (void)loadView {
if([self.nextResponder isKindOfClass:%c(YTShareMainView)]) {
arg1 = oledColor;
%orig; %orig;
} [self.view setBackgroundColor:oledColor];
} }
-(void)setCustomTitleColor:(id)arg1 { %end
arg1 = [UIColor whiteColor];
%hook UIKeyboardDockView
- (void)didMoveToWindow {
%orig; %orig;
self.backgroundColor = oledColor;
} }
%end %end
%hook YTShareBusyView // sharesheet load %hook UIKeyboardLayoutStar
-(void)setBackgroundColor:(id)arg1 { - (void)didMoveToWindow {
arg1 = oledColor;
%orig;
}
%end
%hook YTSearchSuggestionCollectionViewCell
-(void)updateColors {}
%end
%hook UISearchBarBackground
-(void)setBarTintColor:(id)arg1 {
arg1 = oledColor;
%orig; %orig;
self.backgroundColor = oledColor;
} }
%end %end
%hook YTELMView // upload videos %hook UIKBRenderConfig // Prediction text color
-(void)layoutSubviews { - (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); }
%orig;
self.backgroundColor = oledColor;
}
%end %end
%hook YTMealBarPromoView
-(void)setBackgroundColor:(id)arg1 { // Offline
arg1 = oledColor;
%orig;
}
%end
%hook NIAttributedLabel
-(void)setBackgroundColor:(id)arg1 {
if ([self.nextResponder isKindOfClass:%c(UIScrollView)])
arg1 = oledColor;
%orig;
}
%end
////
/*
%hook YTShortsGalleryHeaderView // upload videos heaer (gallery)
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook _ASDisplayView // edit your videos
-(void)layoutSubviews {
if ([self.nextResponder isKindOfClass:%c(ELMView)]) //uYou
self.backgroundColor = oledColor;
}
%end
%hook ASCollectionView
-(void)layoutSubviews {
self.backgroundColor = oledColor;
%orig;
}
%end
%hook YTChannelProfileDescriptionEditorView // edit profile Description
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
%hook YTChannelProfileNameEditorView // edit profile Name
-(void)setBackgroundColor:(id)arg1 {
arg1 = oledColor;
%orig;
}
%end
hook GOOTextField
-(void)setBackgroundColor:(id)arg1 { // edit profile Description
arg1 = oledColor;
%orig;
}
%end
%hook GOOMultilineTextField//
-(void)setBackgroundColor:(id)arg1 { // edit profile Name
arg1 = oledColor;
%orig;
}
%end
*/
%end %end
// YTReExplore: https://github.com/PoomSmart/YTReExplore/ // YTReExplore: https://github.com/PoomSmart/YTReExplore/
@@ -561,37 +600,66 @@ static void replaceTab(YTIGuideResponse *response) {
// BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer // BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer
%group Main %group Main
%hook YTWatchMiniBarView %hook YTWatchMiniBarView
-(void)setWatchMiniPlayerLayout:(int)arg1 { - (void)setWatchMiniPlayerLayout:(int)arg1 {
%orig(1); %orig(1);
} }
-(int)watchMiniPlayerLayout { - (int)watchMiniPlayerLayout {
return 1; return 1;
} }
-(void)layoutSubviews { - (void)layoutSubviews {
%orig; %orig;
self.frame = CGRectMake(([UIScreen mainScreen].bounds.size.width - self.frame.size.width), self.frame.origin.y, self.frame.size.width, self.frame.size.height); self.frame = CGRectMake(([UIScreen mainScreen].bounds.size.width - self.frame.size.width), self.frame.origin.y, self.frame.size.width, self.frame.size.height);
} }
%end %end
%hook YTMainAppVideoPlayerOverlayView %hook YTMainAppVideoPlayerOverlayView
-(BOOL)isUserInteractionEnabled { - (BOOL)isUserInteractionEnabled {
if([[self _viewControllerForAncestor].parentViewController.parentViewController isKindOfClass:%c(YTWatchMiniBarViewController)]) { if([[self _viewControllerForAncestor].parentViewController.parentViewController isKindOfClass:%c(YTWatchMiniBarViewController)]) {
return NO; return NO;
} }
return %orig; return %orig;
} }
%end %end
%end %end
// iOS 16 uYou crash fix
%group iOS16
%hook OBPrivacyLinkButton
%new
- (instancetype)initWithCaption:(NSString *)caption
buttonText:(NSString *)buttonText
image:(UIImage *)image
imageSize:(CGSize)imageSize
useLargeIcon:(BOOL)useLargeIcon {
return [self initWithCaption:caption
buttonText:buttonText
image:image
imageSize:imageSize
useLargeIcon:useLargeIcon
displayLanguage:[NSLocale currentLocale].languageCode];
}
%end
%end
# pragma mark - ctor
%ctor { %ctor {
%init; %init;
if (oled() && ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1)) { if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"relatedVideosAtTheEndOfYTVideos"]) {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"];
}
if (oled()) {
%init(gOLED); %init(gOLED);
} }
if (ReExplore()) { if (oledKB()) {
%init(gReExplore) %init(gOLEDKB);
}
if (reExplore()) {
%init(gReExplore);
} }
if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) { if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
%init(Main) %init(Main);
}
if (@available(iOS 16, *)) {
%init(iOS16);
} }
} }