Compare commits

...

87 commits

Author SHA1 Message Date
arichorn
14487c8cb5
Update LowContrastMode.xm 2023-09-16 16:50:37 -05:00
GitHub Actions
4ab1b0573f updated submodules 2023-09-16 03:00:58 +00:00
arichorn
f59f4243be
Update OLED Dark Theme
Added stuff so that OLED Dark Theme works correctly on the latest version of YouTube.
2023-09-14 18:56:39 -05:00
arichorn
88dd1b711f
Update Themes.xm 2023-09-13 17:01:24 -05:00
arichorn
9afbdb2dac
Fix OLD Dark Theme
Fix OLD Dark Theme not working on newer YouTube Versions.
2023-09-13 16:43:58 -05:00
arichorn
10ce2d1bd8
Update Settings.xm 2023-09-11 18:37:14 -05:00
arichorn
ef025bd3ac
Disable CustomContrastMode
Crashes as soon as you use it. My fault.
2023-09-11 18:33:49 -05:00
arichorn
9c52e27b9a
Update uYouPlus.xm 2023-09-07 20:22:41 -05:00
GitHub Actions
4512d43e42 updated submodules 2023-09-08 01:02:06 +00:00
arichorn
a194b345f8
Update uYouPlus.xm 2023-09-07 19:44:29 -05:00
arichorn
2215e3bd5f
Update Settings.xm 2023-09-07 19:43:43 -05:00
arichorn
c27a33ccff
Add files via upload 2023-09-07 19:27:09 -05:00
arichorn
ccda2827a9
Update Localizable.strings 2023-09-07 16:52:40 -05:00
GitHub Actions
95095dbddd updated submodules 2023-09-07 21:51:39 +00:00
arichorn
c9d32fd2c3
Update Themes.xm 2023-09-07 16:37:39 -05:00
GitHub Actions
619223cc90 updated submodules 2023-09-07 21:37:12 +00:00
arichorn
eae46196ed
Update Return YouTube Dislike #101 2023-09-07 16:35:56 -05:00
arichorn
e4fc237941
Update Themes.xm 2023-09-07 16:28:25 -05:00
arichorn
defe4a0f8c
Improvements to Themes 2023-09-06 16:36:29 -05:00
arichorn
7681af2aaf
v18.34.5-3.0.1 2023-09-05 22:45:21 -05:00
arichorn
65d96a84e1
Update Settings.xm 2023-09-05 22:14:06 -05:00
arichorn
359ce0e29d
Update uYouPlus.xm 2023-09-05 22:13:36 -05:00
arichorn
d8a0f921a4
Update Themes.xm 2023-09-05 22:12:08 -05:00
arichorn
5b1ff83bdd
Update Themes.xm 2023-09-05 21:32:50 -05:00
arichorn
2254c8511a
Update Makefile 2023-09-05 21:02:31 -05:00
arichorn
db1a29a0e3
Fix Native Dark Theme
This commit changes Old Dark Theme aswell.
2023-09-05 20:56:22 -05:00
arichorn
dd015adea7
Update uYouPlus.xm 2023-09-05 20:48:20 -05:00
arichorn
1d2be63a9e
Changes from qnblackcat/uYouPlus
I’m suspicious with the commit. Looks identical to my version.
2023-09-05 20:42:27 -05:00
arichorn
2bd5aed405
Update Localizable.strings 2023-09-05 20:39:40 -05:00
arichorn
c7d141c3d3
Update Localization 2023-09-05 20:38:04 -05:00
GitHub Actions
e5b3fdbb3b updated submodules 2023-09-06 01:37:53 +00:00
GitHub Actions
f6dc419db7 updated submodules 2023-09-05 00:53:59 +00:00
GitHub Actions
36c05f3678 updated submodules 2023-09-05 00:52:03 +00:00
GitHub Actions
0fac075d6c updated submodules 2023-09-05 00:36:31 +00:00
arichorn
fe0b4f7ab0
Fix broken options
Fix broken options related to the Sections DontEatMyContent, Return YouTube Dislike & YouPiP
2023-09-04 18:59:39 -05:00
GitHub Actions
91eb0d1a42 updated submodules 2023-09-04 23:04:11 +00:00
arichorn
cfcfcf05b2
Update uYouPlus.xm 2023-09-04 14:17:47 -05:00
arichorn
1a307df502
Merge pull request #100 from olivertzeng/patch-1
Update Localizable.strings
2023-09-04 11:50:06 -05:00
arichorn
8127b3da9d
Undo buildapp.yml changes 2023-09-04 11:46:57 -05:00
arichorn
432ebc879f
Merge branch 'qnblackcat:main' into main 2023-09-04 11:45:43 -05:00
GitHub Actions
cd401daa37 updated submodules 2023-09-04 02:05:51 +00:00
arichorn
9126bbe2b6
Temporary Update MrBeastify Tweak 2023-09-03 21:05:10 -05:00
arichorn
5819451c4f
Update Settings.xm 2023-09-03 19:04:37 -05:00
arichorn
1eff0b0fd4
Update Makefile 2023-09-03 18:53:54 -05:00
arichorn
63624a49f9
Update Settings.xm 2023-09-03 18:51:05 -05:00
arichorn
efeb36f1e6
New Options!
The new options shown in the code replaces the old option “Disabled Wifi Related Settings”
2023-09-03 18:38:02 -05:00
arichorn
d20263bf35
Update update-submodules.yml 2023-09-03 17:53:14 -05:00
GitHub Actions
0c414df932 Added submodule bundle 2023-09-03 22:51:39 +00:00
GitHub Actions
107a5e35d6 added MrBeastify submodule 2023-09-03 22:51:38 +00:00
arichorn
12f9830817
Update update-submodules.yml 2023-09-03 17:51:13 -05:00
arichorn
aa69f5161c
Updated update-submodules Template 2023-09-03 17:48:30 -05:00
arichorn
3c5c6536c0
Removed buildapp.sh
Unfortunately buildapp.sh is not working. So I recommend forking uYouPlusExtra and then building the ipa with GitHub Actions.
2023-09-03 17:21:02 -05:00
Oliver Tzeng
7af1e4368b
Update Localizable.strings
Missing strings lol
2023-09-03 15:52:37 +08:00
arichorn
c00a28aba9
Update YTColor Headers
Updated this so it’ll be able to do more changes related to the UI around the app.
2023-09-02 16:29:57 -05:00
arichorn
aaee12c551
Improved Hex Color 2023-09-02 13:04:14 -05:00
arichorn
7e8fbc10da
Removed all ColorContrastMode options
next I need to figure out how to implement the Hex Color for the new functionality of the tweak.
2023-09-02 09:58:02 -05:00
arichorn
10d879fe11
Deprecate ColorContrastMode
ColorContrastMode was something made by Dayanch96, an beloved extension to the LowContrastMode tweak. But as of September 1st 2023, it has been removed because of how tiring it is to modify and also having them here makes the code be over 1000+ lines. So ColorContrastMode will be replaced with Hex Color.
2023-09-01 23:41:47 -05:00
arichorn
3861f57711
New Tweak: YTNoTracking 2023-08-30 17:08:06 -05:00
arichorn
b3cb53e998
Updated YTShortsProgress to v1.0.3
This is my own version of YTShortsProgress, a contribution to PoomSmarts Tweak.

Changes:
Removed Flag `mobileShortsTablnlined` as a replacement for the new flag `mobileShortsTablnlinedExpandWatchOnDismiss`, the flag that I removed isn’t on the app anymore.

Added an Implementation to remove YouTube’s Tracking Parameters
2023-08-30 16:23:08 -05:00
arichorn
7f4faf44ed
LowContrastMode Improvements 2 2023-08-28 23:58:18 -05:00
arichorn
bbeb521b04
LowContrastMode Improvements 2023-08-28 19:18:57 -05:00
arichorn
29dcffb0e8
New Header - YTColor (for LowContrastMode v1.4.2) 2023-08-28 14:41:12 -05:00
arichorn
bbf056a051
LowContrastMode v1.4.2 2023-08-28 14:35:51 -05:00
arichorn
afe0955072
🔨 Update buildapp.yml Dependencies 2023-08-27 16:14:45 -05:00
arichorn
9c099faa10
Update update-submodules.yml 2023-08-27 16:12:55 -05:00
arichorn
fa6e26fa2e
Updated update-submodules template dependencies 2023-08-27 16:12:33 -05:00
arichorn
a39798499f
Disabled some OLED Dark Theme UI 2023-08-27 12:21:45 -05:00
arichorn
8777cf41fe
Update LowContrastMode.xm 2023-08-26 14:11:42 -05:00
arichorn
0a4e56c0c4
Fix LowContrastMode 2023-08-25 22:21:38 -05:00
arichorn
15051b2e42
v18.33.2-3.0.1 2023-08-25 20:58:24 -05:00
arichorn
b0341f5596
Update Makefile 2023-08-25 20:36:39 -05:00
GitHub Actions
1525f7c0fb updated submodules 2023-08-24 23:12:12 +00:00
arichorn
3ff69825b2
LowContrastMode v1.4.1 2023-08-23 20:27:38 -05:00
arichorn
cfac3d25e6
Revert OLED Dark Theme Modifications
I kept some of the modifications for OLED because it is important for it to function as intended.
2023-08-23 16:03:01 -05:00
arichorn
bf49a3a8d7
Reimplement Keychain Patch & Login Fix 2023-08-21 16:52:36 -05:00
arichorn
22f68d61e6
Update README.md 2023-08-20 04:06:47 -05:00
arichorn
70d757bc6f
Update update-submodules.yml 2023-08-19 23:04:44 -05:00
arichorn
13e72a298f
Target iOS 16.2 2023-08-19 22:50:17 -05:00
arichorn
8f2c87ce33
New iOS SDK (iOS 16.2)
uYouPlusExtra now uses a up to date SDK as of August 19th 2023
using the iOS 15.5 SDK is now not recommended for this tweak.
2023-08-19 22:49:34 -05:00
GitHub Actions
26cd4536cb Added bundles 2023-08-19 20:30:37 +00:00
GitHub Actions
254704fbd5 updated submodules 2023-08-19 20:30:36 +00:00
GitHub Actions
a6e87b94d5 added YTNoCommunityPosts submodule 2023-08-19 20:30:29 +00:00
arichorn
cee5ffca3c
Update update-submodules.yml 2023-08-19 15:29:49 -05:00
arichorn
42cad3f974
Create delete-workflow-runs.yml 2023-08-19 15:27:33 -05:00
arichorn
470e95e605
Downgrade Theos ⚠️
Theos had an update which breaks the building
this is why I downgraded it: https://github.com/arichorn/uYouPlusExtra/actions/runs/5651520528
2023-08-19 15:26:35 -05:00
arichorn
98085815f7
Readded uYouPlusExtra Makefile 2023-08-19 15:23:54 -05:00
arichorn
a9943de261
Refreshed uYouPlusExtra Branch
Branch has been refreshed to update to the latest commits from qnblackcat/uYouPlus to provide a more up-to-date experience.
2023-08-19 15:21:42 -05:00
49 changed files with 4856 additions and 556 deletions

View file

@ -1,7 +1,7 @@
# 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
name: Build and Release uYouPlusExtra
on:
workflow_dispatch:
@ -44,13 +44,13 @@ concurrency:
jobs:
build:
name: Build uYouPlus
runs-on: macos-11
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout Main
uses: actions/checkout@v3.2.0
uses: actions/checkout@v3.6.0
with:
path: main
submodules: recursive
@ -62,32 +62,32 @@ jobs:
run: echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH
- name: Setup Theos
uses: actions/checkout@v3.2.0
uses: actions/checkout@v3.6.0
with:
repository: theos/theos
ref: master
ref: 3da31488281ecf4394d10302d2629607f4a1aa07
path: theos
submodules: recursive
- name: Caching
id: SDK
uses: actions/cache@v3.2.0
uses: actions/cache@v3.3.1
env:
cache-name: iOS-15.5-SDK
cache-name: iOS-16.2-SDK
with:
path: theos/sdks/
key: ${{ env.cache-name }}
- name: Download iOS 15.5 SDK
- name: Download iOS 16.2 SDK
if: steps.SDK.outputs.cache-hit != 'true'
run: |
svn checkout -q https://github.com/chrisharper22/sdks/trunk/iPhoneOS15.5.sdk
svn checkout -q https://github.com/arichorn/sdks/trunk/iPhoneOS16.2.sdk
mv *.sdk $THEOS/sdks
env:
THEOS: ${{ github.workspace }}/theos
- name: Setup Theos Jailed
uses: actions/checkout@v3.2.0
uses: actions/checkout@v3.6.0
with:
repository: qnblackcat/theos-jailed
ref: master
@ -116,7 +116,7 @@ jobs:
sed -i '' "27s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
sed -i '' "26s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
make package IPA=YouTube.ipa FINALPACKAGE=1
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlusExtra_${{ 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"
@ -129,12 +129,12 @@ jobs:
APP_NAME: ${{ inputs.app_name }}
- name: Upload Artifact
uses: actions/upload-artifact@v3.1.1
uses: actions/upload-artifact@v3.1.2
env:
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}
name: uYouPlusExtra_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
if-no-files-found: error

View file

@ -0,0 +1,59 @@
name: Delete Workflow Runs
on:
workflow_dispatch:
inputs:
days:
description: 'Number of days.'
required: true
default: 0
minimum_runs:
description: 'The minimum runs to keep for each workflow.'
required: true
default: 0
delete_workflow_pattern:
description: 'The name or filename of the workflow. if not set then it will target all workflows.'
required: false
delete_workflow_by_state_pattern:
description: 'Remove workflow by state: active, deleted, disabled_fork, disabled_inactivity, disabled_manually'
required: true
default: "All"
type: choice
options:
- "All"
- active
- deleted
- disabled_inactivity
- disabled_manually
delete_run_by_conclusion_pattern:
description: 'Remove workflow by conclusion: action_required, cancelled, failure, skipped, success'
required: true
default: "All"
type: choice
options:
- "All"
- action_required
- cancelled
- failure
- skipped
- success
dry_run:
description: 'Only log actions, do not perform any delete operations.'
required: false
jobs:
del_runs:
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- name: Delete workflow runs
uses: Mattraks/delete-workflow-runs@v2
with:
token: ${{ github.token }}
repository: ${{ github.repository }}
retain_days: ${{ github.event.inputs.days }}
keep_minimum_runs: ${{ github.event.inputs.minimum_runs }}
delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }}
delete_workflow_by_state_pattern: ${{ github.event.inputs.delete_workflow_by_state_pattern }}
delete_run_by_conclusion_pattern: ${{ github.event.inputs.delete_run_by_conclusion_pattern }}
dry_run: ${{ github.event.inputs.dry_run }}

View file

@ -1,43 +1,59 @@
---
name: Update submodules!
name: Update Submodules
#############################
# Start the job on all push #
#############################
on:
schedule:
- cron: "0 0 */7 * *"
workflow_dispatch:
###############
# Set the Job #
###############
jobs:
build:
name: Update submodules
update-submodules:
runs-on: ubuntu-latest
env:
PARENT_REPOSITORY: 'qnblackcat/uYouPlus'
CHECKOUT_BRANCH: 'main'
PR_AGAINST_BRANCH: 'main'
OWNER: 'qnblackcat'
steps:
##########################
# Checkout the code base #
##########################
- name: Checkout Code
uses: actions/checkout@v3
- name: Checkout code
uses: actions/checkout@v3.6.0
####################################
# Run the action against code base #
####################################
- name: run action
id: run_action
uses: qnblackcat/github-action-create-pr-parent-submodule@main
with:
github_token: ${{ secrets.RELEASE_HUB_SECRET }}
parent_repository: ${{ env.PARENT_REPOSITORY }}
checkout_branch: ${{ env.CHECKOUT_BRANCH }}
pr_against_branch: ${{ env.PR_AGAINST_BRANCH }}
owner: ${{ env.OWNER }}
- name: Set up Git
run: |
git config --global user.email "actions@github.com"
git config --global user.name "GitHub Actions"
- name: Update submodules
run: |
git submodule update --init --recursive --remote Tweaks/Alderis
git add .
git submodule update --init --recursive --remote Tweaks/DontEatMyContent
git add .
git submodule update --init --recursive --remote Tweaks/MrBeastify
git add .
git submodule update --init --recursive --remote Tweaks/PSHeader
git add .
git submodule update --init --recursive --remote Tweaks/Return-YouTube-Dislikes
git add .
git submodule update --init --recursive --remote Tweaks/YTABConfig
git add .
git submodule update --init --recursive --remote Tweaks/YTNoCommunityPosts
git add .
git submodule update --init --recursive --remote Tweaks/YTUHD
git add .
git submodule update --init --recursive --remote Tweaks/YTVideoOverlay
git add .
git submodule update --init --recursive --remote Tweaks/YouMute
git add .
git submodule update --init --recursive --remote Tweaks/YouPiP
git add .
git submodule update --init --recursive --remote Tweaks/YouQuality
git add .
git submodule update --init --recursive --remote Tweaks/YouTubeHeader
git add .
git submodule update --init --recursive --remote Tweaks/iSponsorBlock
git add .
git commit -m "updated submodules"
git push origin
continue-on-error: true
- name: Check exit code
run: |
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "Submodule update failed with exit code $exit_code"
exit 1
fi

10
.gitmodules vendored
View file

@ -20,8 +20,8 @@
branch = main
[submodule "Tweaks/Return-YouTube-Dislikes"]
path = Tweaks/Return-YouTube-Dislikes
url = https://github.com/PoomSmart/Return-YouTube-Dislikes.git
branch = main
url = https://github.com/arichorn/Return-YouTube-Dislikes.git
branch = uYouPlusExtra
[submodule "Tweaks/YouTubeHeader"]
path = Tweaks/YouTubeHeader
url = https://github.com/PoomSmart/YouTubeHeader.git
@ -54,3 +54,9 @@
path = Tweaks/iSponsorBlock
url = https://github.com/Galactic-Dev/iSponsorBlock.git
branch = master
[submodule "Tweaks/YTNoCommunityPosts"]
path = Tweaks/YTNoCommunityPosts
url = https://github.com/michael-winay/YTNoCommunityPosts.git
[submodule "Tweaks/MrBeastify"]
path = Tweaks/MrBeastify
url = https://github.com/arichorn/MrBeastify.git

1
Bundles/MrBeastify.bundle Symbolic link
View file

@ -0,0 +1 @@
../Tweaks/MrBeastify/layout/Library/Application Support/MrBeastify.bundle

View file

@ -0,0 +1 @@
../Tweaks/YTNoCommunityPosts/layout/Library/Application Support/YTNoCommunityPosts.bundle

View file

@ -0,0 +1 @@
../Tweaks/YTVideoOverlay/layout/Library/Application Support/YTVideoOverlay.bundle

1
Bundles/YouMute.bundle Symbolic link
View file

@ -0,0 +1 @@
../Tweaks/YouMute/layout/Library/Application Support/YouMute.bundle

1
Bundles/YouQuality.bundle Symbolic link
View file

@ -0,0 +1 @@
../Tweaks/YouQuality/layout/Library/Application Support/YouQuality.bundle

View file

@ -1,5 +1,6 @@
#import "Tweaks/YouTubeHeader/YTAppDelegate.h"
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTQTMButton.h"
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@ -15,6 +16,7 @@
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
#import "Tweaks/YouTubeHeader/YTColorPalette.h"
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
@ -25,6 +27,10 @@
#import "Tweaks/YouTubeHeader/YTAlertView.h"
#import "Tweaks/YouTubeHeader/YTISectionListRenderer.h"
#import "Tweaks/YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h"
#import "Tweaks/YouTubeHeader/YTPivotBarItemView.h"
#import "Tweaks/YouTubeHeader/YTVideoWithContextNode.h" // YouTube-X
#import "Tweaks/YouTubeHeader/ELMCellNode.h" // YouTube-X
#import "Tweaks/YouTubeHeader/ELMNodeController.h" // YouTube-X
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define YT_BUNDLE_ID @"com.google.ios.youtube"
@ -63,6 +69,9 @@
@interface boolSettingsVC : UIViewController
@end
@interface YTPlaybackButton : UIControl
@end
@interface PlayerManager : NSObject
- (float)progress;
@end
@ -75,6 +84,12 @@
@property UIButton *downloadsButton;
@end
// Buttons
@interface YTRightNavigationButtons : UIView
@property YTQTMButton *notificationButton;
@property YTQTMButton *sponsorBlockButton;
@end
// YTSpeed
@interface YTVarispeedSwitchControllerOption : NSObject
- (id)initWithTitle:(id)title rate:(float)rate;
@ -99,16 +114,6 @@
- (void)setRate:(float)rate;
@end
// iOS16 fix
@interface OBPrivacyLinkButton : UIButton
- (instancetype)initWithCaption:(NSString *)caption
buttonText:(NSString *)buttonText
image:(UIImage *)image
imageSize:(CGSize)imageSize
useLargeIcon:(BOOL)useLargeIcon
displayLanguage:(NSString *)displayLanguage;
@end
// uYouLocal fix
@interface YTLocalPlaybackController : NSObject
- (id)activeVideo;
@ -119,7 +124,6 @@
@property(nonatomic, strong) id downloadsVC;
@end
// BigYTMiniPlayer
@interface YTMainAppVideoPlayerOverlayView : UIView
- (UIViewController *)_viewControllerForAncestor;
@ -131,9 +135,6 @@
// YTAutoFullScreen
@interface YTPlayerViewController (YTAFS)
- (void)autoFullscreen;
// DontEatMycontent
- (id)activeVideoPlayerOverlay;
- (id)playerView;
// YTSpeed
@property id activeVideo;
@property float playbackRate;
@ -141,6 +142,24 @@
@end
// App Theme
@interface YTColor : NSObject
+ (UIColor *)white1;
+ (UIColor *)white2;
+ (UIColor *)white3;
+ (UIColor *)white4;
+ (UIColor *)white5;
+ (UIColor *)black0;
+ (UIColor *)black1;
+ (UIColor *)black2;
+ (UIColor *)black3;
+ (UIColor *)black4;
+ (UIColor *)blackPure;
+ (UIColor *)grey1;
+ (UIColor *)grey2;
+ (UIColor *)white1Alpha98;
+ (UIColor *)white1Alpha95;
@end
@interface YCHLiveChatView : UIView
@end
@ -150,6 +169,9 @@
@interface YTRelatedVideosView : UIView
@end
@interface YTTopAlignedView : UIView
@end
@interface ELMView : UIView
@end
@ -168,6 +190,9 @@
@interface _ASDisplayView : UIView
@end
@interface YTPivotBarIndicatorView : UIView
@end
@interface YTCommentDetailHeaderCell : UIView
@end
@ -191,4 +216,4 @@
@interface settingsReorderTable : UIViewController
@property(nonatomic, strong) UITableView *tableView;
@end
@end

View file

@ -1,4 +1,4 @@
export TARGET = iphone:clang:15.5:14.0
export TARGET = iphone:clang:16.2:14.0
export ARCHS = arm64
export libcolorpicker_ARCHS = arm64
@ -14,7 +14,7 @@ MODULES = jailed
endif
ifndef YOUTUBE_VERSION
YOUTUBE_VERSION = 18.32.2
YOUTUBE_VERSION = 18.34.5
endif
ifndef UYOU_VERSION
UYOU_VERSION = 3.0.1
@ -26,10 +26,10 @@ TWEAK_NAME = uYouPlus
DISPLAY_NAME = YouTube
BUNDLE_ID = com.google.ios.youtube
$(TWEAK_NAME)_FILES = uYouPlus.xm Settings.xm
$(TWEAK_NAME)_FILES = uYouPlus.xm Settings.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m')
$(TWEAK_NAME)_FRAMEWORKS = UIKit Security
$(TWEAK_NAME)_CFLAGS = -fobjc-arc -DTWEAK_VERSION=\"$(PACKAGE_VERSION)\"
$(TWEAK_NAME)_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib $(THEOS_OBJ_DIR)/libFLEX.dylib $(THEOS_OBJ_DIR)/iSponsorBlock.dylib $(THEOS_OBJ_DIR)/YouPiP.dylib $(THEOS_OBJ_DIR)/YouTubeDislikesReturn.dylib $(THEOS_OBJ_DIR)/YTABConfig.dylib $(THEOS_OBJ_DIR)/YTUHD.dylib $(THEOS_OBJ_DIR)/DontEatMyContent.dylib
$(TWEAK_NAME)_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib $(THEOS_OBJ_DIR)/libFLEX.dylib $(THEOS_OBJ_DIR)/iSponsorBlock.dylib $(THEOS_OBJ_DIR)/YouPiP.dylib $(THEOS_OBJ_DIR)/YouTubeDislikesReturn.dylib $(THEOS_OBJ_DIR)/YTABConfig.dylib $(THEOS_OBJ_DIR)/YTUHD.dylib $(THEOS_OBJ_DIR)/DontEatMyContent.dylib $(THEOS_OBJ_DIR)/MrBeastify.dylib $(THEOS_OBJ_DIR)/YTNoCommunityPosts.dylib $(THEOS_OBJ_DIR)/YTVideoOverlay.dylib $(THEOS_OBJ_DIR)/YouMute.dylib $(THEOS_OBJ_DIR)/YouQuality.dylib
$(TWEAK_NAME)_EMBED_LIBRARIES = $(THEOS_OBJ_DIR)/libcolorpicker.dylib
$(TWEAK_NAME)_EMBED_FRAMEWORKS = $(_THEOS_LOCAL_DATA_DIR)/$(THEOS_OBJ_DIR_NAME)/install/Library/Frameworks/Alderis.framework
$(TWEAK_NAME)_EMBED_BUNDLES = $(wildcard Bundles/*.bundle)
@ -37,7 +37,7 @@ $(TWEAK_NAME)_EMBED_EXTENSIONS = $(wildcard Extensions/*.appex)
include $(THEOS)/makefiles/common.mk
ifneq ($(JAILBROKEN),1)
SUBPROJECTS += Tweaks/Alderis Tweaks/FLEXing/libflex Tweaks/iSponsorBlock Tweaks/Return-YouTube-Dislikes Tweaks/YouPiP Tweaks/YTABConfig Tweaks/YTUHD Tweaks/DontEatMyContent Tweaks/YTVideoOverlay Tweaks/YouMute Tweaks/YouQuality
SUBPROJECTS += Tweaks/Alderis Tweaks/FLEXing/libflex Tweaks/iSponsorBlock Tweaks/Return-YouTube-Dislikes Tweaks/YouPiP Tweaks/YTABConfig Tweaks/YTUHD Tweaks/DontEatMyContent Tweaks/MrBeastify Tweaks/YTNoCommunityPosts Tweaks/YTVideoOverlay Tweaks/YouMute Tweaks/YouQuality
include $(THEOS_MAKE_PATH)/aggregate.mk
endif
include $(THEOS_MAKE_PATH)/tweak.mk

100
README.md
View file

@ -1,5 +1,4 @@
![IMG_2196](https://user-images.githubusercontent.com/52943116/189822859-8a0952db-9264-4b5b-9cbe-d0a87b2db5a0.PNG)
***
<p align="center">
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
@ -11,17 +10,17 @@
</p>
<p align="center">
<a href="https://github.com/qnblackcat/uYouPlus/releases/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>
<a href="https://github.com/arichorn/uYouPlusExtra/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/arichorn/uYouPlusExtra?color=brightgreen&label=Latest%20release" alt="Badge"></img></a>
<a href="https://github.com/arichorn/uYouPlusExtra/releases/latest"><img src="https://img.shields.io/github/downloads/qnblackcat/uYouPlus/total?label=Download" alt="Badge"></img></a>
<a href="https://github.com/arichorn/uYouPlusExtra/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/arichorn/uYouPlusExtra?logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
<a href="https://github.com/arichorn/uYouPlusExtra/issues"><img src="https://custom-icon-badges.demolab.com/github/issues-raw/arichorn/uYouPlusExtra?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>
<img src="https://img.shields.io/github/stars/arichorn/uYouPlusExtra?style=social" alt="Badge"/>
<img src="https://img.shields.io/github/forks/arichorn/uYouPlusExtra?style=social" alt="Badge"/>
<a href="https://github.com/arichorn/uYouPlusExtra#support-the-developers"><img src="https://img.shields.io/badge/-Support-lightgrey?style=social&logo=paypal" alt="Badge"></img></a>
</p>
# Table of Contents
@ -46,6 +45,12 @@
</a>
<h4 align='center'><a href='https://twitter.com/miro92'>MiRO92</a></h4>
</td>
<td id='qnblackcat'>
<a href='https://github.com/qnblackcat'>
<img src='https://github.com/qnblackcat.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/qnblackcat'>qnblackcat</a></h4>
</td>
<td id='poomsmart'>
<a href='https://github.com/PoomSmart'>
<img src='https://github.com/PoomSmart.png' width='140px;'>
@ -64,15 +69,15 @@
</a>
<h4 align='center'><a href='https://twitter.com/bandarhl'>BandarHelal</a></h4>
</td>
</tr>
<tr>
<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;'>
@ -97,15 +102,15 @@
</a>
<h4 align='center'><a href='https://twitter.com/therealFoxster'>Foxster</a></h4>
</td>
</tr>
<tr>
<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;'>
@ -168,6 +173,10 @@
15. **YTVideoOverlay**: add buttons to overlay the video.
16. **YTNoCommunityPosts**: Tweak to disable all Community Posts on the YouTube app. **<-- uYouPlusExtra Exclusive Feature (may change)**
17. **LowContrastMode**: this tweak allows users to darken the text in the YouTube app. **<-- uYouPlusExtra Exclusive Feature (may change)**
</details>
# Known issues
@ -178,36 +187,36 @@
# Download
- **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).
- **uYouPlusExtra** (or you can just call it uYou+) requires iOS or iPadOS 14.0 or later. The latest version of **uYouPlusExtra** ipa can be found in the [Release tab](https://github.com/arichorn/uYouPlusExtra/releases/latest).
<!-- - For AltStore user:
- For AltStore user:
- My official AltStore repo: https://qnblackcat.github.io/AltStore/
- My official AltStore repo: https://therealfoxster.github.io/altsource-viewer/index.html?source=https://raw.githubusercontent.com/arichorn/arichorn.github.io/main/apps.json
- [Open in AltStore (v18.14.1-3.0)](https://tinyurl.com/yv6wrxjz) - It will take a while to install because AltStore needs to download the IPA first. -->
- [Open in AltStore (v18.34.5-3.0.1)](https://tinyurl.com/mr3nrdz2) - It will take a while to install because AltStore needs to download the IPA first.
- Version info: _(last update: Aug 5)_
- Version info: _(last update: Sep 5)_
<details>
<summary>Expand </summary>
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
| - | - | :-: | :-: |
| **YouTube** | Google Inc | 18.30.7 | ✖︎ |
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 3.0 | ✖︎ |
| **YouTube** | Google Inc | 18.34.5 | ✖︎ |
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 3.0.1 | ✖︎ |
| **Open in YouTube** | [CokePokes](https://github.com/CokePokes) | 1.2 | [✔︎](https://github.com/CokePokes/YoutubeExtensions) |
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.2 | [✔︎](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.6 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.10 | [✔︎](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.5-1 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.19-1 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.4.0 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.20 | [✔︎](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.5.0 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.5.0-1 | [✔︎](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) |
@ -216,15 +225,24 @@
| **YouMute** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.1-2 | [✔︎](https://github.com/PoomSmart/YouMute) |
| **YouQuality** | [PoomSmart](https://twitter.com/poomsmart) | 1.1.4 | [✔︎](https://github.com/PoomSmart/YouQuality) |
| **YTVideoOverlay** | [PoomSmart](https://twitter.com/poomsmart) | 1.1.0-2 | [✔︎](https://github.com/PoomSmart/YTVideoOverlay) |
| **YTNoCommunityPosts** | [michael-winay](https://github.com/michael-winay) | 0.0.2 | [✔︎](https://github.com/michael-winay/YTNoCommunityPosts) |
| **LowContrastMode** | [arichorn](https://github.com/arichorn) | 1.4.2 | [✔︎](https://github.com/arichorn/YTLowContrastMode) |
</details>
# uYou Tweak Compatibility List
| Developer | Tweak Name and Version | App Version Compatibility | iOS Version Compatibility |
|-----------|:----------------------:|:-------------------------:|:-------------------------:|
| MiRO92 | uYou 2.1/2.3~1 | Works on v16.42.3-18.01.6 | Works on iOS13-iOS15 |
| MiRO92 | uYou 3.0 | Works on v18.06.6-18.18.2 | Works on iOS14-iOS15 |
| MiRO92 | uYou 3.0.1 | Works on v18.06.6-latest | Works on iOS14-iOS16 |
# 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
- [**Poomsmart**](https://twitter.com/poomsmart): https://poomsmart.github.io
- [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg
- [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL
- [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne
@ -238,4 +256,30 @@ See [FAQ - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/FAQ).
# Building (optional)
See [Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building).
See [qnblackcat/Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building)
or [arichorn/Building - Wiki](https://github.com/arichorn/uYouPlusExtra/wiki/Building).
<details>
<summary>Balackburn's YTLitePlus</summary>
# change from uYouPlus/uYouPlusExtra to YTLitePlus (optional)
hello, this is here to show yall this tweak. I've been seeing the YTLitePlus tweak on reddit for quite some time now and decided to join in. before you download the tweak you must look at the Pros and Cons below before downloading because it lets you know more about the tweak.
https://github.com/Balackburn/YTLitePlus/releases
**Pros**
- YTLitePlus is stable and more tweakable then uYouPlus/uYouPlusExtra.
- YTLitePlus has more features in YTLite Settings that uYouPlusExtra doesn't have.
- YTLitePlus has a lightweight Version of the App Version Spoofer which makes it easier to use.
- YTLitePlus does not make your device heat up unlike uYouPlusExtra.
**Cons**
- No Video Downloading in YTLitePlus.
- Video Quality on WiFi not in YTLitePlus.
</details>

20
SECURITY.md Normal file
View file

@ -0,0 +1,20 @@
# Security Policy for uYouPlus Developers
If I verify a reported security vulnerability, my policy is:
- the uYouPlusExtra Developer will patch the current main branch, as well as the immediate prior minor release branch.
- the Contributors are allowed to patch the current main branch with custom features and the ability to add new & updated Localizable Strings.
- After fully patching the main branch, the uYouPlusExtra Developer will issue a new release for the main branch along with LTS release branches.
## Supported Versions
these versions of the project are
currently being supported with security/feature updates.
| Version | LTS Support of the uYouPlusExtra Tweak | YT Version Supported by Google | App Stability |
| ------- | -------------------------------------- | ------------------------------ | -------------------- |
| [latest](https://github.com/arichorn/uYouPlusExtra/releases/latest) | ✅ | ✅ | The latest version is stable! |
| [17.49.6-2.3.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v17.49.6-2.3.1-F4) | ✅ | ✅ | This version is Stable, this version may be unstable to some if using it on iOS 17 Beta. |
| [17.38.10-2.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/latest) | N/A | ✅ | This new LTS Release will soon to replace **16.42.3-2.1** next year. |
| [16.42.3-2.1 LTS](https://github.com/arichorn/uYouPlusExtra/releases/tag/v16.42.3-2.1-F19) | ❌ | ✅ until 2024+ | Unstable if you are using iOS 16 or later, Stage Manager won't work correctly when playing videos in the video player, The App Pivot Bar does not hide when playing videos in iOS 16+ due to iOS/iPadOS Changes but this version can still get new features from Google like for these new ones that were recently added in as an example --> (Shorts, Continue Watching Section, Watch It Again Section, Handles & etc.) so overrall this YouTube Version is still supported by Google. |

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var colorButton: UIButton!
var textColor: UIColor = (red: 0.56, green: 0.56, blue: 0.56, alpha: 1.00)
override func viewDidLoad() {
super.viewDidLoad()
// Configure Text Field
textField.placeholder = "YouTube"
// Configure Color Button
colorButton.setTitleColor(textColor, for: .normal)
}
@IBAction func onColorButtonTap(_ sender: Any) {
let colorPicker = UIColorPickerViewController()
colorPicker.delegate = self
present(colorPicker, animated: true, completion: nil)
}
}
extension ViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
extension ViewController: UIColorPickerViewControllerDelegate {
func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
textColor = viewController.selectedColor
colorButton.setTitleColor(textColor, for: .normal)
}
func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
dismiss

458
Source/LowContrastMode.xm Normal file
View file

@ -0,0 +1,458 @@
#import "../Header.h"
//
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static int contrastMode() {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"lcm"];
}
static BOOL lowContrastMode() {
return IsEnabled(@"lowContrastMode_enabled") && contrastMode() == 0;
}
/*
static BOOL customContrastMode() {
return IsEnabled(@"lowContrastMode_enabled") && contrastMode() == 1;
}
*/
UIColor *lcmHexColor;
%group gLowContrastMode // Low Contrast Mode v1.4.2 (Compatible with only YouTube v16.05.7-v17.38.10)
%hook UIColor
+ (UIColor *)whiteColor { // Dark Theme Color
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
+ (UIColor *)lightTextColor {
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
+ (UIColor *)placeholderTextColor {
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
+ (UIColor *)labelColor {
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
+ (UIColor *)secondaryLabelColor {
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
+ (UIColor *)tertiaryLabelColor {
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
+ (UIColor *)quaternaryLabelColor {
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
}
%end
%hook YTCommonColorPalette
- (UIColor *)textPrimary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)textSecondary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayTextPrimary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayTextSecondary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)iconActive {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)iconActiveOther {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)brandIconActive {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)staticBrandWhite {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayIconActiveOther {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
%end
%hook YTColor
+ (UIColor *)white2 {
return [UIColor whiteColor];
}
+ (UIColor *)white3 {
return [UIColor whiteColor];
}
+ (UIColor *)white4 {
return [UIColor whiteColor];
}
+ (UIColor *)white5 {
return [UIColor whiteColor];
}
%end
%hook QTMColorGroup
- (UIColor *)tint100 {
return [UIColor whiteColor];
}
- (UIColor *)tint300 {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnLighterColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnRegularColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnDarkerColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnAccentColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnOnBrightAccentColor {
return [UIColor whiteColor];
}
- (UIColor *)lightBodyTextColor {
return [UIColor whiteColor];
}
- (UIColor *)buttonBackgroundColor {
return [UIColor whiteColor];
}
%end
%hook YTQTMButton
- (void)setImage:(UIImage *)image {
UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self setTintColor:[UIColor whiteColor]];
%orig(currentImage);
}
%end
%hook WKCompositingView // YouTube Playables (v18.34.5+)
- (void)layoutSubviews {
%orig;
for (UILabel *label in self.subviews) {
if ([label isKindOfClass:[UILabel class]]) {
label.textColor = [UIColor whiteColor];
}
}
}
%end
%hook UIExtendedSRGColorSpace
- (void)setTextColor:(UIColor *)textColor {
textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.9];
%orig();
}
%end
%hook VideoTitleLabel
- (void)setTextColor:(UIColor *)textColor {
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UILabel
+ (void)load {
@autoreleasepool {
[[UILabel appearance] setTextColor:[UIColor whiteColor]];
}
}
- (void)setTextColor:(UIColor *)textColor {
%log;
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UITextField
- (void)setTextColor:(UIColor *)textColor {
%log;
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UITextView
- (void)setTextColor:(UIColor *)textColor {
%log;
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UISearchBar
- (void)setTextColor:(UIColor *)textColor {
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UISegmentedControl
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state);
}
%end
%hook UIButton
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
color = [UIColor whiteColor];
%orig(color, state);
}
%end
%hook UIBarButtonItem
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state);
}
%end
%hook NSAttributedString
- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSAttributedStringKey, id> *)attrs {
NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs];
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
return %orig(str, modifiedAttributes);
}
%end
%hook CATextLayer
- (void)setTextColor:(CGColorRef)textColor {
%orig([UIColor whiteColor].CGColor);
}
%end
%hook ASTextNode
- (NSAttributedString *)attributedString {
NSAttributedString *originalAttributedString = %orig;
NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy];
[newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)];
return newAttributedString;
}
%end
%hook ASTextFieldNode
- (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]);
}
%end
%hook ASTextView
- (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]);
}
%end
%hook ASButtonNode
- (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]);
}
%end
%end
/*
%group gCustomContrastMode // Custom Contrast Mode (Hex Color)
%hook UIColor
+ (UIColor *)whiteColor {
return lcmHexColor;
}
+ (UIColor *)lightTextColor {
return lcmHexColor;
}
+ (UIColor *)placeholderTextColor {
return lcmHexColor;
}
+ (UIColor *)labelColor {
return lcmHexColor;
}
+ (UIColor *)secondaryLabelColor {
return lcmHexColor;
}
+ (UIColor *)tertiaryLabelColor {
return lcmHexColor;
}
+ (UIColor *)quaternaryLabelColor {
return lcmHexColor;
}
%end
%hook YTCommonColorPalette
- (UIColor *)textPrimary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)textSecondary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayTextPrimary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayTextSecondary {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)iconActive {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)iconActiveOther {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)brandIconActive {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)staticBrandWhite {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
- (UIColor *)overlayIconActiveOther {
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
}
%end
%hook YTColor
+ (UIColor *)white2 {
return [UIColor whiteColor];
}
+ (UIColor *)white3 {
return [UIColor whiteColor];
}
+ (UIColor *)white4 {
return [UIColor whiteColor];
}
+ (UIColor *)white5 {
return [UIColor whiteColor];
}
%end
%hook QTMColorGroup
- (UIColor *)tint100 {
return [UIColor whiteColor];
}
- (UIColor *)tint300 {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnLighterColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnRegularColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnDarkerColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnAccentColor {
return [UIColor whiteColor];
}
- (UIColor *)bodyTextColorOnOnBrightAccentColor {
return [UIColor whiteColor];
}
- (UIColor *)lightBodyTextColor {
return [UIColor whiteColor];
}
- (UIColor *)buttonBackgroundColor {
return [UIColor whiteColor];
}
%end
%hook YTQTMButton
- (void)setImage:(UIImage *)image {
UIImage *currentImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self setTintColor:[UIColor whiteColor]];
%orig(currentImage);
}
%end
%hook UIExtendedSRGColorSpace
- (void)setTextColor:(UIColor *)textColor {
textColor = [[UIColor whiteColor] colorWithAlphaComponent:0.9];
%orig();
}
%end
%hook VideoTitleLabel
- (void)setTextColor:(UIColor *)textColor {
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UILabel
+ (void)load {
@autoreleasepool {
[[UILabel appearance] setTextColor:[UIColor whiteColor]];
}
}
- (void)setTextColor:(UIColor *)textColor {
%log;
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UITextField
- (void)setTextColor:(UIColor *)textColor {
%log;
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UITextView
- (void)setTextColor:(UIColor *)textColor {
%log;
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UISearchBar
- (void)setTextColor:(UIColor *)textColor {
textColor = [UIColor whiteColor];
%orig(textColor);
}
%end
%hook UISegmentedControl
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state);
}
%end
%hook UIButton
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
color = [UIColor whiteColor];
%orig(color, state);
}
%end
%hook UIBarButtonItem
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state);
}
%end
%hook NSAttributedString
- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSAttributedStringKey, id> *)attrs {
NSMutableDictionary *modifiedAttributes = [NSMutableDictionary dictionaryWithDictionary:attrs];
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
return %orig(str, modifiedAttributes);
}
%end
%hook CATextLayer
- (void)setTextColor:(CGColorRef)textColor {
%orig([UIColor whiteColor].CGColor);
}
%end
%hook ASTextNode
- (NSAttributedString *)attributedString {
NSAttributedString *originalAttributedString = %orig;
NSMutableAttributedString *newAttributedString = [originalAttributedString mutableCopy];
[newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)];
return newAttributedString;
}
%end
%hook ASTextFieldNode
- (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]);
}
%end
%hook ASTextView
- (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]);
}
%end
%hook ASButtonNode
- (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]);
}
%end
%end
*/
# pragma mark - ctor
%ctor {
%init;
if (lowContrastMode()) {
%init(gLowContrastMode);
}
/*
if (customContrastMode()) {
%init(gCustomContrastMode);
}
*/
}

638
Source/Themes.xm Normal file
View file

@ -0,0 +1,638 @@
#import "../Header.h"
static BOOL IsEnabled(NSString *key) {
return [[NSUserDefaults standardUserDefaults] boolForKey:key];
}
static BOOL isDarkMode() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
}
static BOOL oledDarkTheme() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 1);
}
static BOOL oldDarkTheme() {
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"appTheme"] == 2);
}
// Themes.xm - Theme Options
// Old dark theme (gray)
%group gOldDarkTheme
UIColor *originalColor = [UIColor colorWithRed:0.129 green:0.129 blue:0.129 alpha:1.0];
%hook YTCommonColorPalette
- (UIColor *)background1 {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)background2 {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)background3 {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)baseBackground {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)brandBackgroundSolid {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)brandBackgroundPrimary {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)brandBackgroundSecondary {
return self.pageStyle == 1 ? [originalColor colorWithAlphaComponent:0.9] : %orig;
}
- (UIColor *)raisedBackground {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)staticBrandBlack {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)generalBackgroundA {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)generalBackgroundB {
return self.pageStyle == 1 ? originalColor : %orig;
}
- (UIColor *)menuBackground {
return self.pageStyle == 1 ? originalColor : %orig;
}
%end
%hook YTInnerTubeCollectionViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? originalColor : %orig;
}
%end
// Explore
%hook ASScrollView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.backgroundColor = [UIColor clearColor];
}
}
%end
// Your videos
%hook ASCollectionView
- (void)didMoveToWindow {
%orig;
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
self.superview.backgroundColor = originalColor;
}
}
%end
// Sub menu?
%hook ELMView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[0].backgroundColor = [UIColor clearColor];
}
}
%end
// iSponsorBlock
%hook SponsorBlockSettingsController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.tableView.backgroundColor = originalColor;
} else { return %orig; }
}
%end
%hook SponsorBlockViewController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.view.backgroundColor = originalColor;
} else { return %orig; }
}
%end
// Search View
%hook YTSearchBarView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
// History Search view
%hook YTSearchBoxView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
// Comment view
%hook YTCommentView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTCreateCommentAccessoryView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTCreateCommentTextView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
return isDarkMode() ? %orig([UIColor whiteColor]) : %orig;
}
%end
%hook YTCommentDetailHeaderCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[2].backgroundColor = originalColor;
}
}
%end
%hook YTAsyncCollectionView
- (void)layoutSubviews {
%orig();
if ([self.nextResponder isKindOfClass:NSClassFromString(@"YTWatchNextResultsViewController")]) {
if (isDarkMode()) {
self.subviews[0].subviews[0].backgroundColor = originalColor;
}
}
}
%end
%hook YTFormattedStringLabel // YT is werid...
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor clearColor]) : %orig;
}
%end
// Live chat comment
%hook YCHLiveChatActionPanelView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YCHLiveChatView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[1].backgroundColor = originalColor;
}
}
%end
%hook YTEmojiTextView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTAppView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTCollectionView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTChannelListSubMenuView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTChannelSubMenuView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTWrapperSplitView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTPageView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTWatchView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
%hook YTPrivacyTosFooterView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
//
%hook YTBackstageCreateRepostDetailView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(originalColor) : %orig;
}
%end
// Others
%hook _ASDisplayView
- (void)layoutSubviews {
%orig;
if (isDarkMode()) {
UIResponder *responder = [self nextResponder];
while (responder != nil) {
if ([responder isKindOfClass:NSClassFromString(@"YTActionSheetDialogViewController")]) {
self.backgroundColor = originalColor;
}
if ([responder isKindOfClass:NSClassFromString(@"YTPanelLoadingStrategyViewController")]) {
self.backgroundColor = originalColor;
}
if ([responder isKindOfClass:NSClassFromString(@"YTTabHeaderElementsViewController")]) {
self.backgroundColor = originalColor;
}
if ([responder isKindOfClass:NSClassFromString(@"YTEditSheetControllerElementsContentViewController")]) {
self.backgroundColor = originalColor;
}
responder = [responder nextResponder];
}
}
}
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"brand.promo_view"]) { self.superview.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = originalColor; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; }
}
}
%end
%end
// OLED dark mode by @BandarHL
UIColor* raisedColor = [UIColor blackColor];
%group gOLED
%hook YTCommonColorPalette
- (UIColor *)background1 {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)background2 {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)background3 {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)baseBackground {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)brandBackgroundSolid {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)brandBackgroundPrimary {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)brandBackgroundSecondary {
return self.pageStyle == 1 ? [[UIColor blackColor] colorWithAlphaComponent:0.9] : %orig;
}
- (UIColor *)raisedBackground {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)staticBrandBlack {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)generalBackgroundA {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)generalBackgroundB {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
- (UIColor *)menuBackground {
return self.pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
/*
// uYou settings (Conflicts iSponsorBlock)
%hook UITableViewCell
- (void)_layoutSystemBackgroundView {
%orig;
UIView *systemBackgroundView = [self valueForKey:@"_systemBackgroundView"];
NSString *backgroundViewKey = class_getInstanceVariable(systemBackgroundView.class, "_colorView") ? @"_colorView" : @"_backgroundView";
((UIView *)[systemBackgroundView valueForKey:backgroundViewKey]).backgroundColor = [UIColor blackColor];
}
- (void)_layoutSystemBackgroundView:(BOOL)arg1 {
%orig;
((UIView *)[[self valueForKey:@"_systemBackgroundView"] valueForKey:@"_colorView"]).backgroundColor = [UIColor blackColor];
}
%end
%hook settingsReorderTable
- (void)viewDidLayoutSubviews {
%orig;
self.tableView.backgroundColor = [UIColor blackColor];
}
%end
%hook FRPSelectListTable
- (void)viewDidLayoutSubviews {
%orig;
self.tableView.backgroundColor = [UIColor blackColor];
}
%end
%hook FRPreferences
- (void)viewDidLayoutSubviews {
%orig;
self.tableView.backgroundColor = [UIColor blackColor];
}
%end
*/
%hook YTInnerTubeCollectionViewController
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
return pageStyle == 1 ? [UIColor blackColor] : %orig;
}
%end
// Explore
%hook ASScrollView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.backgroundColor = [UIColor clearColor];
}
}
%end
// Your videos
%hook ASCollectionView
- (void)didMoveToWindow {
%orig;
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
self.superview.backgroundColor = [UIColor blackColor];
}
}
%end
// Sub menu?
%hook ELMView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[0].backgroundColor = [UIColor clearColor];
}
}
%end
// iSponsorBlock
%hook SponsorBlockSettingsController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.tableView.backgroundColor = [UIColor blackColor];
} else { return %orig; }
}
%end
%hook SponsorBlockViewController
- (void)viewDidLoad {
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
%orig;
self.view.backgroundColor = [UIColor blackColor];
} else { return %orig; }
}
%end
// Search View
%hook YTSearchBarView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
// History Search view
%hook YTSearchBoxView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
// Comment view
%hook YTCommentView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YTCreateCommentAccessoryView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YTCreateCommentTextView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
return isDarkMode() ? %orig([UIColor whiteColor]) : %orig;
}
%end
%hook YTCommentDetailHeaderCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[2].backgroundColor = [UIColor blackColor];
}
}
%end
%hook YTFormattedStringLabel // YT is werid...
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor clearColor]) : %orig;
}
%end
// Live chat comment
%hook YCHLiveChatActionPanelView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YTEmojiTextView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
%hook YCHLiveChatView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[1].backgroundColor = [UIColor blackColor];
}
}
%end
%hook YTCollectionView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
//
%hook YTBackstageCreateRepostDetailView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig([UIColor blackColor]) : %orig;
}
%end
// Others
%hook _ASDisplayView
- (void)layoutSubviews {
%orig;
if (isDarkMode()) {
UIResponder *responder = [self nextResponder];
while (responder != nil) {
if ([responder isKindOfClass:NSClassFromString(@"YTActionSheetDialogViewController")]) {
self.backgroundColor = [UIColor blackColor];
}
if ([responder isKindOfClass:NSClassFromString(@"YTPanelLoadingStrategyViewController")]) {
self.backgroundColor = [UIColor blackColor];
}
if ([responder isKindOfClass:NSClassFromString(@"YTTabHeaderElementsViewController")]) {
self.backgroundColor = [UIColor blackColor];
}
if ([responder isKindOfClass:NSClassFromString(@"YTEditSheetControllerElementsContentViewController")]) {
self.backgroundColor = [UIColor blackColor];
}
responder = [responder nextResponder];
}
}
}
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"brand.promo_view"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"eml.live_chat_text_message"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = [UIColor clearColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; }
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.comment_group_detail_container"]) { self.backgroundColor = [UIColor clearColor]; }
}
}
%end
// Open link with...
%hook ASWAppSwitchingSheetHeaderView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(raisedColor) : %orig;
}
%end
%hook ASWAppSwitchingSheetFooterView
- (void)setBackgroundColor:(UIColor *)color {
return isDarkMode() ? %orig(raisedColor) : %orig;
}
%end
%hook ASWAppSwitcherCollectionViewCell
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.backgroundColor = raisedColor;
self.subviews[1].backgroundColor = raisedColor;
self.superview.backgroundColor = raisedColor;
}
}
%end
%end
// OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
%group gOLEDKB
%hook UIPredictionViewController
- (void)loadView {
%orig;
[self.view setBackgroundColor:[UIColor blackColor]];
}
%end
%hook UICandidateViewController
- (void)loadView {
%orig;
[self.view setBackgroundColor:[UIColor blackColor]];
}
%end
%hook UIKeyboardDockView
- (void)didMoveToWindow {
%orig;
self.backgroundColor = [UIColor blackColor];
}
%end
%hook UIKeyboardLayoutStar
- (void)didMoveToWindow {
%orig;
self.backgroundColor = [UIColor blackColor];
}
%end
%hook UIKBRenderConfig // Prediction text color
- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); }
%end
%end
# pragma mark - ctor
%ctor {
%init;
if (IsEnabled(@"oledKeyBoard_enabled")) {
%init(gOLEDKB);
}
if (oledDarkTheme()) {
%init(gOLED);
}
if (oldDarkTheme()) {
%init(gOldDarkTheme);
}
}

1591
Source/VersionSpoofer.xm Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,90 @@
// Template for whenever I refresh the main branch. and to re-add the submodules afterwards.
name: Update Submodules
on:
workflow_dispatch:
jobs:
update-submodules:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3.6.0
- name: Set up Git
run: |
git config --global user.email "actions@github.com"
git config --global user.name "GitHub Actions"
- name: Add uYouPlusExtra submodules
run: |
git submodule add https://github.com/leminlimez/MrBeastify.git Tweaks/MrBeastify
git submodule add https://github.com/michael-winay/YTNoCommunityPosts.git Tweaks/YTNoCommunityPosts
# git submodule add https://github.com/arichorn/YTHoldForSpeed.git Tweaks/YTHoldForSpeed
git add .
git commit -m "added uYouPlusExtra submodules"
git push origin
# - name: Update submodules
# run: |
# git submodule update --init --recursive --remote
# git add .
# git commit -m "updated submodules"
# git push origin
# continue-on-error: true
- name: Update submodules
run: |
git submodule update --init --recursive --remote Tweaks/Alderis
git add .
git submodule update --init --recursive --remote Tweaks/DontEatMyContent
git add .
git submodule update --init --recursive --remote Tweaks/MrBeastify
git add .
git submodule update --init --recursive --remote Tweaks/PSHeader
git add .
git submodule update --init --recursive --remote Tweaks/Return-YouTube-Dislikes
git add .
git submodule update --init --recursive --remote Tweaks/YTABConfig
git add .
git submodule update --init --recursive --remote Tweaks/YTNoCommunityPosts
git add .
git submodule update --init --recursive --remote Tweaks/YTUHD
git add .
git submodule update --init --recursive --remote Tweaks/YTVideoOverlay
git add .
git submodule update --init --recursive --remote Tweaks/YouMute
git add .
git submodule update --init --recursive --remote Tweaks/YouPiP
git add .
git submodule update --init --recursive --remote Tweaks/YouQuality
git add .
git submodule update --init --recursive --remote Tweaks/YouTubeHeader
git add .
git submodule update --init --recursive --remote Tweaks/iSponsorBlock
git add .
git commit -m "updated submodules"
git push origin
continue-on-error: true
- name: Make .bundle files
run: |
cd Bundles
ln -s ../Tweaks/MrBeastify/layout/Library/Application\ Support/MrBeastify.bundle MrBeastify.bundle
ln -s ../Tweaks/YTNoCommunityPosts/layout/Library/Application\ Support/YTNoCommunityPosts.bundle YTNoCommunityPosts.bundle
ln -s ../Tweaks/YTVideoOverlay/layout/Library/Application\ Support/YTVideoOverlay.bundle YTVideoOverlay.bundle
ln -s ../Tweaks/YouMute/layout/Library/Application\ Support/YouMute.bundle YouMute.bundle
ln -s ../Tweaks/YouQuality/layout/Library/Application\ Support/YouQuality.bundle YouQuality.bundle
git add .
git commit -m "Added bundles"
git push origin
- name: Check exit code
run: |
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "Submodule update failed with exit code $exit_code"
exit 1
fi

@ -1 +1 @@
Subproject commit a514fbe4e063a1157da6e68fc05633ef9cec0f44
Subproject commit c6fe81f55bd33c0e943150bf77826cbb251d668c

1
Tweaks/MrBeastify Submodule

@ -0,0 +1 @@
Subproject commit 1ab07d1e473566aef7ef0cab2866db4e0ac450cc

@ -1 +1 @@
Subproject commit 91fc25a8504faa62eca55dae451fe11ac7d1602d
Subproject commit c994fbfa1b9c1551d975563a18b9d3626fa10c92

@ -0,0 +1 @@
Subproject commit 86f949d14095abe7ee5efae08e57d7c4b2d0a613

@ -1 +1 @@
Subproject commit 23dcadf5b418c4da60fb1dd76192f38f68530c48
Subproject commit 865cd8321efdf201f4dda26805921cbddc8afac8

@ -1 +1 @@
Subproject commit 96954d578d56e6762f0b179a2b837598a542d40c
Subproject commit 74f8265ed22e829146a01b0d5c0bb1c4980599f5

View file

@ -1,8 +0,0 @@
read -p $'\e[34m==> \e[1;39mPath to the decrypted YouTube.ipa or YouTube.app: ' PATHTOYT
make package IPA=$PATHTOYT FINALPACKAGE=1
if [[ $? -eq 0 ]]; then
open packages
echo "\033[0;32m==> \033[1;39mSHASUM256: $(shasum -a 256 packages/*.ipa)"
else
echo "\033[0;31m==> \033[1;39mFailed building uYouPlus"
fi

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "إخفاء الشريط العلوي";
"HIDE_CHIP_BAR_DESC" = "إخفاء الشريط العلوي من تبويب الصفحة الرئيسية (موسيقى، ألعاب فيديو، تشكيلات ...) ومن تبويب الاشتراكات (كل الفيديوهات، متابعة المشاهدة,...). تتطلب إعادة تشغيل التطبيق.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "إخفاء \"تشغيل المقطع التالي من قائمة الانتظار\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "إخفاء خيار \"تشغيل التالي من قائمة الانتظار\" من قائمة السياق في حسابات يوتيوب المدفوعة";
"NEW_MINIPLAYER_STYLE" = "تغيير شكل المشغّل المصغر (أداة BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "تغيير شكل المشغّل المصغر في الآيفون إلى نفس شكله في الآيباد - تتطلب إغلاق التطبيق وإعادة فتحه.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Nový styl minipřehrávače (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Je potřeba restart aplikace.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Obere Leiste ausblenden";
"HIDE_CHIP_BAR_DESC" = "Obere Leiste in den Home-Feeds (Trends, Musik, Spiele...) und Abo-Feeds (Alle Videos, Weiterschauen...) ausblenden. App-Neustart erforderlich.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Neuer Miniplayer Style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App-Neustart erforderlich!";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Καινούργιο miniplayer θέμα στην μπάρα (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subscription feeds (All videos, Continue watching...).";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "New mini player bar style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Ocultar la barra superior";
"HIDE_CHIP_BAR_DESC" = "Ocultar la barra superior de las fuentes de inicio (Tendencias, Música, Juegos...) y de suscripción (Todos los vídeos, Seguir viendo...). Es necesario reiniciar la aplicación.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Nuevo estilo de barra del minirreproductor (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Requiere reiniciar la app.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Masquer la barre supérieure";
"HIDE_CHIP_BAR_DESC" = "Masquer la barre supérieure dans les fils d'actualité (Tendances, Musique, Gaming...) et les fils d'abonnement (Toutes les vidéos, Poursuivre la lecture...). Un redémarrage de l'application est nécessaire.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Nouveau style de barre de mini-lecteur (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Un redémarrage de l'application est nécessaire";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "עיצוב נגן קטן חדש (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "נדרש לפתוח מחדש את היישום.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Új minilejátszó sáv (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Az alkalmazás újraindítása szükséges.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Nascondi la barra superiore";
"HIDE_CHIP_BAR_DESC" = "Nascondi la barra superiore nella Home (Tendenze, Musica, Giochi...) e Iscrizioni (Tutti i video, Continua a guardare...). È richiesto il riavvio dell'app.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Nuovo stile per la barra del miniplayer (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "È richiesto un riavvio dell'app.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "トップバーを非表示";
"HIDE_CHIP_BAR_DESC" = "ホーム(トレンド,音楽,ゲーム...)とサブスクリプション(すべてのビデオ、視聴を続ける...)リボンのトップバーを非表示にします。アプリの再起動が必要です。";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "新しいミニプレーヤー・バーを使う (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "アプリの再起動が必要です。";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "피드 선택 막대 숨기기";
"HIDE_CHIP_BAR_DESC" = "앱의 홈 화면에서 맞춤 동영상(인기 급상승, 음악, 게임...)과 구독 피드(전체, 감상한 동영상...) 선택 막대를 숨깁니다. 앱을 다시 시작해야 합니다.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "새로운 스타일의 미니 플레이어 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "앱을 다시 시작해야 합니다.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Nieuwe Mini Speler stijl (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Je moet de app opnieuw opstarten om dit te activeren.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Nowy styl miniodtwarzacza (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Restart aplikacji jest wymagany.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Ocultar a Barra superior";
"HIDE_CHIP_BAR_DESC" = "Oculta a Barra superior nos Feeds iniciais (Tendências, Música, Jogos...) e Feeds de inscrições (Todos os vídeos, Continuar assistindo...). A reinicialização do app é necessária.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Novo estilo de barra de miniplayer (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "A reinicialização do app é necessária.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subcription feeds (All videos, Continue watching...). App restart is required.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Stil nou bară Miniplayer (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Este necesară repornirea aplicației.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Скрыть верхнюю панель";
"HIDE_CHIP_BAR_DESC" = "Скрывает верхнюю панель на вкладках «Главная» (Тренды, Музыка, Игры...) и «Подписки» (Все видео, Продолжить просмотр...)\nТребуется перезапуск приложения.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Мини-плеер в стиле iPad (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Потребуется перезагрузка.";

View file

@ -145,6 +145,9 @@ https://github.com/PoomSmart/Return-YouTube-Dislikes/tree/main/layout/Library/Ap
"HIDE_CHIP_BAR" = "Hide the Upper bar";
"HIDE_CHIP_BAR_DESC" = "Hide Upper bar in the Home feeds (Trends, Music, Gaming...) and Subscription feeds (All videos, Continue watching...).";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "New mini player bar style (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";

View file

@ -127,6 +127,9 @@
"HIDE_CHIP_BAR" = "Üst çubuğu gizle";
"HIDE_CHIP_BAR_DESC" = "Ana Sayfa akışlarında (Trendler, Müzik, Oyun...) ve Abonelik akışlarında (Tüm videolar, İzlemeye devam et...) Üst çubuğu gizle. Uygulamanın yeniden başlatılması gerekir.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "Yeni mini oynatıcı bar stili. (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "Uygulamanın yeniden başlatılması gerekir.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "Ẩn thanh phím tắt";
"HIDE_CHIP_BAR_DESC" = "Ẩn thanh phím tắt trong Home feed (Thịnh hành, Âm nhạc, Trò chơi...) và trong Subciption feed (Tất cả, Tiếp tục xem...).";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"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.";

View file

@ -130,6 +130,9 @@
"HIDE_CHIP_BAR" = "隐藏顶部标签栏";
"HIDE_CHIP_BAR_DESC" = "隐藏首页和订阅内容页顶部的标签栏(例如:首页顶部的“音乐”、“游戏”、“新闻”以及订阅内容页顶部的“今天”、“继续观看”、“未观看”等)。更改本设置后需要重启 App。";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "新迷你播放器风格 BigYTMiniPlayer";
"NEW_MINIPLAYER_STYLE_DESC" = "更改本设置后需要重启 App。";

View file

@ -8,7 +8,7 @@
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
"DISABLE_DOUBLE_TAP_TO_SEEK" = "Disable double tap to seek";
"DISABLE_DOUBLE_TAP_TO_SEEK" = "停用影片快轉與倒轉";
"DISABLE_DOUBLE_TAP_TO_SEEK_DESC" = "";
"SNAP_TO_CHAPTER" = "停用章節跳轉";
@ -131,6 +131,9 @@
"HIDE_CHIP_BAR" = "隱藏上層欄位";
"HIDE_CHIP_BAR_DESC" = "隱藏主畫面上層欄位 (話題, 音樂, 遊戲...) 和訂閱對象動態 (所有影片, 繼續觀看...). 需要重新啟動應用程式。";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Hide \"Play next in queue\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "Hide the premium \"Play next in queue\" option in video context menus";
"NEW_MINIPLAYER_STYLE" = "迷你播放器 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";

File diff suppressed because it is too large Load diff