Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f325a31196 | ||
|
|
cab48bbe9e | ||
|
|
5424e4a9e8 | ||
|
|
d7a7c90cf0 | ||
|
|
fe45ebaac1 | ||
|
|
4590369aa1 | ||
|
|
36bf21ad2e | ||
|
|
c2d1581698 | ||
|
|
ca0650d73a | ||
|
|
ad29207afd | ||
|
|
64c7717b38 | ||
|
|
25f66162c5 | ||
|
|
5becdf5a85 | ||
|
|
9145301cc8 | ||
|
|
b2b14305eb | ||
|
|
02ec80256c | ||
|
|
b37f1e1a24 | ||
|
|
244e5a3576 | ||
|
|
3a532cfa63 | ||
|
|
ef153f5d9c | ||
|
|
4258986378 | ||
|
|
dae08da6bf | ||
|
|
7f0e749030 | ||
|
|
c6dd02a759 | ||
|
|
23d745e869 | ||
|
|
2116d96e6a | ||
|
|
f2cb699e3b | ||
|
|
fbafccf1bd | ||
|
|
029ab22b9f | ||
|
|
f4215a7b0b | ||
|
|
0d1e7bad8e | ||
|
|
e97ada36c1 | ||
|
|
4d1b478606 | ||
|
|
24c2f5594f | ||
|
|
c1e3976200 | ||
|
|
0fc9032979 | ||
|
|
b4c70ee668 | ||
|
|
f966182c15 | ||
|
|
1b20c07f03 | ||
|
|
7ad8f9409b | ||
|
|
122d5b8280 | ||
|
|
5744474710 | ||
|
|
faaecd51cb | ||
|
|
8250a1462e | ||
|
|
9371c72a42 | ||
|
|
1acf0a4eba | ||
|
|
1a63491af3 | ||
|
|
e912dc0bda | ||
|
|
fa87084000 | ||
|
|
0b30adb3f4 | ||
|
|
349a49eb93 | ||
|
|
57ed260959 | ||
|
|
9b03cac475 | ||
|
|
0a6179a4b7 | ||
|
|
9e37aaed11 | ||
|
|
691d7d3078 | ||
|
|
915bb7efb3 | ||
|
|
d8151344ae | ||
|
|
163dac3e81 | ||
|
|
3383edbb05 | ||
|
|
c2efac035c | ||
|
|
0fad665452 | ||
|
|
1b554d0994 | ||
|
|
87575119b8 | ||
|
|
90468a2b69 | ||
|
|
29c7f279ae | ||
|
|
e870be2f52 | ||
|
|
772cc2af2e | ||
|
|
9e3065fac6 | ||
|
|
5db4a43777 | ||
|
|
7ab7b499d7 | ||
|
|
c922424d53 | ||
|
|
f1b540af8b | ||
|
|
9afaddb2e0 | ||
|
|
b7f6c21353 | ||
|
|
8e4293f7a1 | ||
|
|
573dfa1d67 | ||
|
|
5d2cc93f56 | ||
|
|
42959eb9fb | ||
|
|
aa139dffa8 | ||
|
|
6520ae2d53 | ||
|
|
4bfb78634f | ||
|
|
78fbf1dc6b | ||
|
|
3dcf4f290f | ||
|
|
85ddb15d38 | ||
|
|
5948dac548 | ||
|
|
070647ecd5 | ||
|
|
b7328028aa | ||
|
|
79f058f354 | ||
|
|
26b5912495 | ||
|
|
f029b9a372 | ||
|
|
ecf3107846 | ||
|
|
93397e48d7 | ||
|
|
b83081fd57 | ||
|
|
c74b5203f7 | ||
|
|
920b7c4882 | ||
|
|
d469f31270 | ||
|
|
f910c416ef | ||
|
|
fb0e5073ae | ||
|
|
f9e05fee77 | ||
|
|
ec7eec660b | ||
|
|
2e6c19c060 | ||
|
|
bb3b8ed310 | ||
|
|
b94a5cc967 | ||
|
|
8b50a3c1b7 | ||
|
|
025dc4d2cb | ||
|
|
9860fdb4e8 | ||
|
|
5e9d719882 | ||
|
|
f63cfa8b43 | ||
|
|
37b6b1e07e | ||
|
|
1827ece773 | ||
|
|
f9e98fa04d | ||
|
|
2c5d0545d7 | ||
|
|
3c33e6fed0 | ||
|
|
daa004d027 | ||
|
|
556f4dd8cf | ||
|
|
68855e71bf | ||
|
|
8fcf17572d | ||
|
|
94c58965c7 | ||
|
|
5e7b7717ff | ||
|
|
1a99fa819e | ||
|
|
0c8376fc60 | ||
|
|
5b70271968 | ||
|
|
968dc841ee | ||
|
|
ada2c00338 | ||
|
|
0e2ec9a52e | ||
|
|
274abee25d | ||
|
|
5b920d7353 | ||
|
|
34e34a4fef | ||
|
|
3e4264e3c7 | ||
|
|
e3d779cbf2 | ||
|
|
314efca54b | ||
|
|
feaeb234cc | ||
|
|
4502236d64 | ||
|
|
3154b51cf6 | ||
|
|
4f99b08a63 | ||
|
|
ae1dc1a701 | ||
|
|
f1eb708e08 | ||
|
|
9298cadbf8 | ||
|
|
efe8670c51 | ||
|
|
fb5781865c | ||
|
|
afb6bd9842 | ||
|
|
8ee749dad1 | ||
|
|
a38e37f6e9 | ||
|
|
ff5167af99 | ||
|
|
62b0168cff | ||
|
|
5d87e7ee1c | ||
|
|
6330c15d2e | ||
|
|
de4f2f7373 | ||
|
|
67aba1f2ad | ||
|
|
d89b146e3d | ||
|
|
0e2a4049c2 | ||
|
|
94b62ba4d3 | ||
|
|
a3165878aa | ||
|
|
702406f87f | ||
|
|
32bd36c423 | ||
|
|
82d7c39fdb | ||
|
|
4119cc4796 | ||
|
|
9763459838 | ||
|
|
ef0c1a8930 | ||
|
|
ca57262430 | ||
|
|
83c685c28f | ||
|
|
766ff8b142 | ||
|
|
c83dd8f5ea | ||
|
|
5d6d1c0f23 | ||
|
|
6e7aa03b55 | ||
|
|
2aca730640 | ||
|
|
e3cc3cb62a | ||
|
|
539143ca86 | ||
|
|
f1903fe989 | ||
|
|
9a590b903c | ||
|
|
abad6888e1 | ||
|
|
691ae41732 | ||
|
|
2dfaf37125 | ||
|
|
d0e315f864 | ||
|
|
98aba40ba2 | ||
|
|
c7cf984f1b | ||
|
|
689fe3af35 | ||
|
|
800b8be778 | ||
|
|
77161f4830 | ||
|
|
03b5b0ec6c | ||
|
|
0972479b62 |
@@ -7,22 +7,26 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Device info:**
|
||||
## ⚠️ 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
|
||||
- iOS/iPadOS version:
|
||||
- Device model:
|
||||
- Sideload tool (Ex: AltStore, Sideloadly...)
|
||||
- Version of uYouPlus:
|
||||
|
||||
**Describe the bug:**
|
||||
-
|
||||
### Describe the bug
|
||||
|
||||
**How to reproduce the bug:**
|
||||
|
||||
### How to reproduce the bug
|
||||
_(Please attach videos or screenshots if possible)_
|
||||
|
||||
|
||||
**Crash log (if possible):**
|
||||
### Crash log (if possible)
|
||||
_(The crash log can be found in the Settings app - Privacy - Analytics & Improvements - Analytics Data - Youtube...)_
|
||||
|
||||
|
||||
**Additional context:**
|
||||
_(Add any other context about the problem here)_
|
||||
### Additional context:
|
||||
|
||||
|
||||
@@ -7,5 +7,7 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
### Have you read the FAQ? Make sure you visit the FAQ page before asking any question!!!
|
||||
## Have you read the FAQ? Make sure you visit the FAQ page before asking any question!!!
|
||||
https://github.com/qnblackcat/uYouPlus/wiki/FAQ
|
||||
|
||||
###
|
||||
|
||||
@@ -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 uYou & prepare YouTube iPA
|
||||
run: |
|
||||
curl "https://raw.githubusercontent.com/Muirey03/RemoteLog/master/RemoteLog.h" --output "$THEOS/include/RemoteLog.h"
|
||||
curl "https://miro92.com/repo/debs/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" --output "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb"
|
||||
wget "$YOUTUBE_URL" --no-verbose -O ./main/YouTube.ipa
|
||||
dpkg-deb -x "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" ./main/Tweaks/uYou/
|
||||
unzip -q ./main/YouTube.ipa -d ./main/tmp
|
||||
rm -rf ./main/tmp/Payload/YouTube.app/PlugIns/*
|
||||
cp -R ./main/Extensions/*.appex ./main/tmp/Payload/YouTube.app/PlugIns
|
||||
|
||||
env:
|
||||
THEOS: ${{ github.workspace }}/theos
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_URL: ${{ inputs.decrypted_youtube_url }}
|
||||
|
||||
- name: Fix compiling && Build Package
|
||||
id: build_package
|
||||
run: |
|
||||
cd ${{ github.workspace }}/main
|
||||
(cd ${{ github.workspace }}/main/Tweaks/YouPiP && sed -i '' "14s/$/ AVFoundation UIKit/" Makefile)
|
||||
make package FINALPACKAGE=1
|
||||
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
|
||||
echo "::set-output name=package::$(ls -t packages | head -n1)"
|
||||
env:
|
||||
THEOS: ${{ github.workspace }}/theos
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
env:
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||
with:
|
||||
name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}
|
||||
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
|
||||
if-no-files-found: error
|
||||
|
||||
- name: Create Release
|
||||
if: ${{ inputs.create_release }}
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||
with:
|
||||
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
||||
release_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
||||
draft: true
|
||||
prerelease: false
|
||||
|
||||
- name: Upload Release Asset
|
||||
if: ${{ inputs.create_release }}
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
|
||||
asset_name: uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa
|
||||
asset_content_type: application/vnd.debian.binary-package
|
||||
@@ -1,5 +1,7 @@
|
||||
.theos
|
||||
.DS_Store
|
||||
packages
|
||||
obj
|
||||
Resources/Frameworks
|
||||
packages/
|
||||
tmp/
|
||||
Tweaks/uYou/*
|
||||
!Tweaks/uYou/.gitkeep
|
||||
Resources/
|
||||
@@ -26,3 +26,11 @@
|
||||
path = Tweaks/PSHeader
|
||||
url = https://github.com/PoomSmart/PSHeader.git
|
||||
branch = master
|
||||
[submodule "Tweaks/YTSpeed"]
|
||||
path = Tweaks/YTSpeed
|
||||
url = https://github.com/qnblackcat/YTSpeed.git
|
||||
branch = main
|
||||
[submodule "Extensions"]
|
||||
path = Extensions
|
||||
url = https://github.com/CokePokes/YoutubeExtensions.git
|
||||
branch = main
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
#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 _ASCollectionViewCell : UICollectionViewCell
|
||||
- (id)node;
|
||||
@end
|
||||
|
||||
@interface YTAsyncCollectionView : UICollectionView
|
||||
- (void)removeShortsAndFeaturesAdsAtIndexPath:(NSIndexPath *)indexPath;
|
||||
@end
|
||||
|
||||
@interface FRPSliderCell : UITableViewCell
|
||||
@end
|
||||
|
||||
// iOS16 fix
|
||||
@interface OBPrivacyLinkButton : UIButton
|
||||
- (instancetype)initWithCaption:(NSString *)caption
|
||||
buttonText:(NSString *)buttonText
|
||||
image:(UIImage *)image
|
||||
imageSize:(CGSize)imageSize
|
||||
useLargeIcon:(BOOL)useLargeIcon
|
||||
displayLanguage:(NSString *)displayLanguage;
|
||||
@end
|
||||
|
||||
// uYouLocal fix
|
||||
@interface YTLocalPlaybackController : NSObject
|
||||
- (id)activeVideo;
|
||||
@end
|
||||
|
||||
// BigYTMiniPlayer
|
||||
@interface YTMainAppVideoPlayerOverlayView : UIView
|
||||
- (UIViewController *)_viewControllerForAncestor;
|
||||
@end
|
||||
|
||||
@interface YTWatchMiniBarView : UIView
|
||||
@end
|
||||
|
||||
// YTAutoFullScreen
|
||||
@interface YTPlayerViewController (YTAFS)
|
||||
- (void)autoFullscreen;
|
||||
@end
|
||||
|
||||
// OLED Darkmode
|
||||
@interface ASWAppSwitcherCollectionViewCell : UIView
|
||||
@end
|
||||
|
||||
@interface ASScrollView : UIView
|
||||
@end
|
||||
|
||||
@interface UIKeyboardLayoutStar : UIView
|
||||
@end
|
||||
|
||||
@interface UIKeyboardDockView : UIView
|
||||
@end
|
||||
|
||||
@interface _ASDisplayView : UIView
|
||||
@end
|
||||
|
||||
@interface YTCommentDetailHeaderCell : UIView
|
||||
@end
|
||||
|
||||
@interface SponsorBlockSettingsController : UITableViewController
|
||||
@end
|
||||
|
||||
@interface SponsorBlockViewController : UIViewController
|
||||
@end
|
||||
|
||||
@interface UICandidateViewController : UIViewController
|
||||
@end
|
||||
|
||||
@interface UIPredictionViewController : UIViewController
|
||||
@end
|
||||
@@ -1,6 +1,6 @@
|
||||
uYouPlus_INJECT_DYLIBS = Tweaks/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib
|
||||
|
||||
TARGET = iphone:clang:latest:13.0
|
||||
uYouPlus_USE_FLEX = 0
|
||||
uYouPlus_USE_FISHHOOK = 0
|
||||
ARCHS = arm64
|
||||
MODULES = jailed
|
||||
FINALPACKAGE = 1
|
||||
@@ -10,17 +10,24 @@ TWEAK_NAME = uYouPlus
|
||||
DISPLAY_NAME = YouTube
|
||||
BUNDLE_ID = com.google.ios.youtube
|
||||
|
||||
uYouPlus_FILES = uYouPlus.x
|
||||
uYouPlus_IPA = /path/to/your/decrypted/YouTube.ipa
|
||||
### Important: edit the path to your decrypted YouTube IPA!!!
|
||||
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_IPA = ./tmp/Payload/YouTube.app
|
||||
uYouPlus_FRAMEWORKS = UIKit
|
||||
uYouPlus_CFLAGS = -fobjc-arc
|
||||
|
||||
include $(THEOS)/makefiles/common.mk
|
||||
include $(THEOS_MAKE_PATH)/tweak.mk
|
||||
SUBPROJECTS += Tweaks/iSponsorBlock Tweaks/Alderis Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes
|
||||
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTSpeed
|
||||
include $(THEOS_MAKE_PATH)/aggregate.mk
|
||||
|
||||
all::
|
||||
rm -rf Resources/Frameworks && mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \;
|
||||
install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib
|
||||
install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
|
||||
|
||||
before-package::
|
||||
@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/ \;
|
||||
@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/uYou/Library/Application\ Support/uYouBundle.bundle Resources/
|
||||
@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/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
|
||||
|
||||
@@ -1,36 +1,34 @@
|
||||

|
||||
|
||||
|
||||
# Table of Contents
|
||||
|
||||
* [Credits](#credits)
|
||||
* [Features](#features)
|
||||
* [Known issues](#known-issues)
|
||||
* [Download](#download)
|
||||
* [Installation](#installation)
|
||||
* [Support the developers!](#support-the-developers)
|
||||
* [FAQ](#faq)
|
||||
* [Building (optional)](#building-optional)
|
||||
|
||||
* [Building](#building-optional)
|
||||
|
||||
# Credits
|
||||
|
||||
- [MiRO92](https://twitter.com/miro92?s=21) for [uYou](https://github.com/MiRO92/uYou-for-YouTube).
|
||||
- [MiRO92](https://twitter.com/miro92) for [uYou](https://github.com/MiRO92/uYou-for-YouTube).
|
||||
|
||||
- [Galactic-Dev](https://github.com/Galactic-Dev) and [Luewii](https://github.com/Luewii) for [iSponsorBlock](https://github.com/Galactic-Dev/iSponsorBlock).
|
||||
|
||||
- [Lillie](https://github.com/LillieWeeb001), [PoomSmart](https://twitter.com/poomsmart?s=21) and [kirb](https://twitter.com/hbkirb?s=21) for [YouTube Dislike Return](https://github.com/PoomSmart/Return-YouTube-Dislikes)
|
||||
- [Galactic-Dev](https://github.com/Galactic-Dev) and [Luewii](https://github.com/Luewii) for [iSponsorBlock](https://github.com/Galactic-Dev/iSponsorBlock) and [BigYTMiniPlayer](https://github.com/Galactic-Dev/BigYTMiniPlayer).
|
||||
|
||||
- [HASHBANG Productions](https://github.com/hbang) for [Alderis Color Picker](https://github.com/hbang/Alderis) - a dependency of iSponsorBlock.
|
||||
|
||||
- [PoomSmart](https://twitter.com/poomsmart?s=21) - the developer of many tweaks used by uYouPlus, include: [YouRememberCaption](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/), [YTClassicVideoQuality](https://poomsmart.github.io/repo/depictions/ytclassicvideoquality.html), [YTNoCheckLocalNetwork](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html), [YTSystemAppearance](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html), [YTUHD](https://poomsmart.github.io/repo/depictions/ytuhd.html) and [YouPiP](https://poomsmart.github.io/repo/depictions/youpip.html).
|
||||
- [PoomSmart](https://twitter.com/poomsmart) - the developer of many tweaks used by uYouPlus, see [Version info - Download](#download) for more details.
|
||||
|
||||
- [level3tjg](https://twitter.com/level3tjg?s=21) - for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards).
|
||||
- [level3tjg](https://twitter.com/level3tjg) - for [YTNoHoverCards](https://github.com/level3tjg/YTNoHoverCards) and [YTMiniplayerEnabler](https://github.com/level3tjg/YTMiniplayerEnabler).
|
||||
|
||||
- [Al4ise](https://github.com/Al4ise) for [Azule](https://github.com/Al4ise/Azule), a tool used to inject jailbreak tweaks into jailed iOS apps.
|
||||
- [Lyvendia](https://github.com/Lyvendia/) for [YTSpeed](https://github.com/Lyvendia/YTSpeed/)
|
||||
|
||||
- [YouTube Extensions](https://github.com/CokePokes/YoutubeExtensions) by [CokePokes](https://github.com/CokePokes/).
|
||||
|
||||
- [theos team](https://github.com/theos/theos) for theos & theos-jailed.
|
||||
|
||||
|
||||
# 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!
|
||||
@@ -42,17 +40,26 @@
|
||||
4. **YTUHD:** unlock VP9 codec and in effect, enables video quality of 2K and 4K. You can enable/disable YTUHD in YouTube Settings - Video quality preferences.
|
||||
|
||||
<details>
|
||||
<summary>And more...!</summary>
|
||||
<summary>And many more...!</summary>
|
||||
|
||||
5. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
|
||||
5. **YTAutoFullScreen:** autoplay videos at full screen.
|
||||
|
||||
6. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
|
||||
6. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
|
||||
|
||||
7. **YTSystemAppearance**: sync the YouTube theme (dark/light) with the system theme.
|
||||
7. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
|
||||
|
||||
8. **YTNoCheckLocalNetwork**: block the Local Network permission popup.
|
||||
8. **YTSystemAppearance**: sync the YouTube theme (dark/light) with the system theme.
|
||||
|
||||
9. **YTNoCheckLocalNetwork**: block the Local Network permission popup.
|
||||
|
||||
10. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
|
||||
|
||||
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.
|
||||
|
||||
9. **YouRememberCaption**: make YouTube remember your video caption setting (if not already).
|
||||
</details>
|
||||
|
||||
# Known issues
|
||||
@@ -61,7 +68,6 @@
|
||||
|
||||
- Issues that related to **uYouPlus** are [here](https://github.com/qnblackcat/uYouPlus/issues/)
|
||||
|
||||
|
||||
# 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).
|
||||
@@ -70,30 +76,43 @@
|
||||
|
||||
- My official AtlStore repo: https://qnblackcat.github.io/AltStore/
|
||||
|
||||
- [Open in AltStore (v17.06.3-2.1)](https://tinyurl.com/4aprkhc5) - It will take a while to install because AltStore needs to download the IPA.
|
||||
- [Open in AltStore (v17.26.2-2.1)](https://tinyurl.com/2y86dh6b) - It will take a while to install because AltStore needs to download the IPA.
|
||||
|
||||
- Version info: _(last update: Feb 16)_
|
||||
- Version info: _(last update: Jul 11)_
|
||||
|
||||
<details>
|
||||
<summary> Expand</summary>
|
||||
<summary>Expand</summary>
|
||||
|
||||
| **Tweaks/App** | **Version** | **Open source** |
|
||||
| :------------: | :----------:| :-------------: |
|
||||
| **YouTube** | 17.06.3 | ✖︎ |
|
||||
| **uYou** | 2.1 | ✖︎ |
|
||||
| **Return YouTube Dislike** | 1.6.3 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||
| **iSponsorBlock** | 1.0-13 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||
| **Alderis Color Picker** | 1.1.2| [✔︎](https://github.com/hbang/Alderis) |
|
||||
| **YouRememberCaption** | 1.0.0 | [✔︎](https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/) |
|
||||
| **YTClassicVideoQuality** | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) |
|
||||
| **YTNoCheckLocalNetwork** | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
||||
| **YTNoHoverCards** | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
|
||||
| **YTSystemAppearance** | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) |
|
||||
| **YTUHD** | 1.2.6 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||
| **YouPiP** | 1.6.6 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
||||
| - | - | :-: | :-: |
|
||||
| **YouTube** | Google Inc | 17.26.2 | ✖︎ |
|
||||
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
|
||||
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
|
||||
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-14 | [✔︎](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) |
|
||||
| **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.2.8 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.7 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
|
||||
| **YTReExplore** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
|
||||
| **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
|
||||
| **YTNoPaidPromo** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
|
||||
| **YTAutoFullScreen** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
|
||||
| **YouRememberCaption** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) |
|
||||
| **YTSystemAppearance** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/ytsystemappearance.html) |
|
||||
| **YTClassicVideoQuality** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.1 | [✔︎](https://github.com/PoomSmart/YTClassicVideoQuality) |
|
||||
| **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.6.5 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||
| **YTNoCheckLocalNetwork** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
||||
|
||||
</details>
|
||||
|
||||
# Installation
|
||||
See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installation)
|
||||
|
||||
# Support the developers
|
||||
|
||||
<details>
|
||||
@@ -105,7 +124,7 @@
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Poomsmart</summary>
|
||||
<summary>PoomSmart</summary>
|
||||
|
||||
- Paypal: https://poomsmart.github.io/
|
||||
|
||||
@@ -119,11 +138,6 @@
|
||||
- Venmo: https://venmo.com/u/DavidBrett
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Lillie</summary>
|
||||
|
||||
- Patreon: https://patreon.com/lillieweeb
|
||||
</details>
|
||||
|
||||
# FAQ
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 397 B |
|
Before Width: | Height: | Size: 506 B |
|
Before Width: | Height: | Size: 621 B |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1 +0,0 @@
|
||||
{"v":"5.7.1","fr":25,"ip":0,"op":26,"w":24,"h":24,"nm":"folder_download","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.69,"y":0},"t":0,"s":[16.41,15.3,0],"to":[0,0.617,0],"ti":[0,-0.617,0]},{"t":25,"s":[16.41,19,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.47,0.47,0.47],"y":[1,1,1]},"o":{"x":[0.53,0.53,0.53],"y":[0,0,0]},"t":12,"s":[6,6,100]},{"t":25,"s":[0,0,100]}],"ix":6}},"ao":0,"ip":0,"op":324,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.614,-145.97,0],"ix":2},"a":{"a":0,"k":[102.114,-19.97,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.47,0.47,0.47],"y":[1,1,1]},"o":{"x":[0.53,0.53,0.53],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":12,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[250,268.441],[305.322,268.441],[305.322,194.678],[342.203,194.678],[342.203,268.441],[397.525,268.441],[323.762,342.203]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-221.648,-214.648],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":324,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"folder_download Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12,12,0],"ix":2},"a":{"a":0,"k":[12,12,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,-1.1],[0,0],[0,0],[1.1,0],[0,0],[0,0],[0,1.1],[0,0],[0,0],[-1.1,0],[0,0]],"o":[[0,0],[0,0],[1.1,0],[0,0],[0,0],[0,1.1],[0,0],[0,0],[-1.1,0],[0,0],[0,0],[0,-1.1],[0,0],[0,0]],"v":[[-2,-8],[0,-6],[8,-6],[10,-4],[10,-4],[10,6],[8,8],[8,8],[-8,8],[-10,6],[-10,6],[-9.99,-6],[-8,-8],[-8,-8]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"tr","p":{"a":0,"k":[12,12],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9215686274509803,0.2823529411764706,0.3254901960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":324,"st":0,"bm":0}],"markers":[]}
|
||||
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,173 @@
|
||||
#import "Tweaks/YouTubeHeader/YTSettingsViewController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTSettingsSectionItem.h"
|
||||
#import "Tweaks/YouTubeHeader/YTSettingsSectionItemManager.h"
|
||||
#import "Header.h"
|
||||
|
||||
@interface YTSettingsSectionItemManager (YouPiP)
|
||||
- (void)updateuYouPlusSectionWithEntry:(id)entry;
|
||||
@end
|
||||
|
||||
static const NSInteger uYouPlusSection = 500;
|
||||
|
||||
extern NSBundle *uYouPlusBundle();
|
||||
extern BOOL hideHUD();
|
||||
extern BOOL oled();
|
||||
extern BOOL oledKB();
|
||||
extern BOOL autoFullScreen();
|
||||
extern BOOL hideHoverCard();
|
||||
extern BOOL reExplore();
|
||||
extern BOOL bigYTMiniPlayer();
|
||||
extern BOOL hideCC();
|
||||
extern BOOL hideAutoplaySwitch();
|
||||
extern BOOL castConfirm();
|
||||
extern BOOL ytMiniPlayer();
|
||||
extern BOOL hidePreviousAndNextButton();
|
||||
extern BOOL hidePaidPromotionCard();
|
||||
|
||||
// Settings
|
||||
%hook YTAppSettingsPresentationData
|
||||
+ (NSArray *)settingsCategoryOrder {
|
||||
NSArray *order = %orig;
|
||||
NSMutableArray *mutableOrder = [order mutableCopy];
|
||||
NSUInteger insertIndex = [order indexOfObject:@(1)];
|
||||
if (insertIndex != NSNotFound)
|
||||
[mutableOrder insertObject:@(uYouPlusSection) atIndex:insertIndex + 1];
|
||||
return mutableOrder;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTSettingsSectionItemManager
|
||||
%new
|
||||
- (void)updateuYouPlusSectionWithEntry:(id)entry {
|
||||
YTSettingsViewController *delegate = [self valueForKey:@"_dataDelegate"];
|
||||
NSBundle *tweakBundle = uYouPlusBundle();
|
||||
|
||||
YTSettingsSectionItem *hidePaidPromotionCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PAID_PROMOTION_CARDS") titleDescription:LOC(@"HIDE_PAID_PROMOTION_CARDS_DESC")];
|
||||
hidePaidPromotionCard.hasSwitch = YES;
|
||||
hidePaidPromotionCard.switchVisible = YES;
|
||||
hidePaidPromotionCard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePaidPromotionCard_enabled"];
|
||||
hidePaidPromotionCard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePaidPromotionCard_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *hidePreviousAndNextButton = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON") titleDescription:LOC(@"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC")];
|
||||
hidePreviousAndNextButton.hasSwitch = YES;
|
||||
hidePreviousAndNextButton.switchVisible = YES;
|
||||
hidePreviousAndNextButton.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePreviousAndNextButton_enabled"];
|
||||
hidePreviousAndNextButton.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hidePreviousAndNextButton_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *ytMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"YT_MINIPLAYER") titleDescription:LOC(@"YT_MINIPLAYER_DESC")];
|
||||
ytMiniPlayer.hasSwitch = YES;
|
||||
ytMiniPlayer.switchVisible = YES;
|
||||
ytMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"ytMiniPlayer_enabled"];
|
||||
ytMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"ytMiniPlayer_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *castConfirm = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"CAST_CONFIRM") titleDescription:LOC(@"CAST_CONFIRM_DESC")];
|
||||
castConfirm.hasSwitch = YES;
|
||||
castConfirm.switchVisible = YES;
|
||||
castConfirm.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
|
||||
castConfirm.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"castConfirm_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *hideHoverCard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_HOVER_CARD") titleDescription:LOC(@"HIDE_HOVER_CARD_DESC")];
|
||||
hideHoverCard.hasSwitch = YES;
|
||||
hideHoverCard.switchVisible = YES;
|
||||
hideHoverCard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHoverCards_enabled"];
|
||||
hideHoverCard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHoverCards_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *bigYTMiniPlayer = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"NEW_MINIPLAYER_STYLE") titleDescription:LOC(@"NEW_MINIPLAYER_STYLE_DESC")];
|
||||
bigYTMiniPlayer.hasSwitch = YES;
|
||||
bigYTMiniPlayer.switchVisible = YES;
|
||||
bigYTMiniPlayer.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"bigYTMiniPlayer_enabled"];
|
||||
bigYTMiniPlayer.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"bigYTMiniPlayer_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *reExplore = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"YT_RE_EXPLORE") titleDescription:LOC(@"YT_RE_EXPLORE_DESC")];
|
||||
reExplore.hasSwitch = YES;
|
||||
reExplore.switchVisible = YES;
|
||||
reExplore.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"];
|
||||
reExplore.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"reExplore_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *hideCC = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_SUBTITLES_BUTTON") titleDescription:LOC(@"HIDE_SUBTITLES_BUTTON_DESC")];
|
||||
hideCC.hasSwitch = YES;
|
||||
hideCC.switchVisible = YES;
|
||||
hideCC.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideCC_enabled"];
|
||||
hideCC.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideCC_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *hideAutoplaySwitch = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_AUTOPLAY_SWITCH") titleDescription:LOC(@"HIDE_AUTOPLAY_SWITCH_DESC")];
|
||||
hideAutoplaySwitch.hasSwitch = YES;
|
||||
hideAutoplaySwitch.switchVisible = YES;
|
||||
hideAutoplaySwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
|
||||
hideAutoplaySwitch.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideAutoplaySwitch_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *autoFull = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"AUTO_FULLSCREEN") titleDescription:LOC(@"AUTO_FULLSCREEN_DESC")];
|
||||
autoFull.hasSwitch = YES;
|
||||
autoFull.switchVisible = YES;
|
||||
autoFull.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"autoFull_enabled"];
|
||||
autoFull.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"autoFull_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *hideHUD = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"HIDE_HUD_MESSAGES") titleDescription:LOC(@"HIDE_HUD_MESSAGES_DESC")];
|
||||
hideHUD.hasSwitch = YES;
|
||||
hideHUD.switchVisible = YES;
|
||||
hideHUD.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||
hideHUD.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hideHUD_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *oledDarkMode = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"OLED_DARKMODE") titleDescription:LOC(@"OLED_DARKMODE_DESC")];
|
||||
oledDarkMode.hasSwitch = YES;
|
||||
oledDarkMode.switchVisible = YES;
|
||||
oledDarkMode.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
|
||||
oledDarkMode.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oled_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
YTSettingsSectionItem *oledKeyBoard = [[%c(YTSettingsSectionItem) alloc] initWithTitle:LOC(@"OLED_KEYBOARD") titleDescription:LOC(@"OLED_KEYBOARD_DESC")];
|
||||
oledKeyBoard.hasSwitch = YES;
|
||||
oledKeyBoard.switchVisible = YES;
|
||||
oledKeyBoard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
|
||||
oledKeyBoard.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"oledKeyBoard_enabled"];
|
||||
return YES;
|
||||
};
|
||||
|
||||
NSMutableArray <YTSettingsSectionItem *> *sectionItems = [NSMutableArray arrayWithArray:@[autoFull, castConfirm, ytMiniPlayer, hideAutoplaySwitch, hideCC, hideHUD, hidePaidPromotionCard, 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
|
||||
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
# Thanks Al4ise for his support
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Check uYou
|
||||
if [ ! -f Tweaks/uYou/com.miro.uyou_2.1_iphoneos-arm.deb ]
|
||||
then
|
||||
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)
|
||||
else
|
||||
echo -e "==> \033[1mFounded uYou (v2.1)!\033[0m"
|
||||
fi
|
||||
|
||||
# Extract uYou
|
||||
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.*)
|
||||
then
|
||||
echo -e "\033[1m> Extracted uYou!\033[0m"
|
||||
else
|
||||
echo "> \033[1mCouldn't extract uYou\033[0m"
|
||||
fi
|
||||
|
||||
# Makefile
|
||||
if [ -d ./tmp ]
|
||||
then
|
||||
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
|
||||
open ./packages
|
||||
else
|
||||
echo "This is not an ipa/app!"
|
||||
fi
|
||||
# Clean up
|
||||
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
|
||||
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
|
||||
rm -rf tmp/ Resources .theos/_/Payload
|
||||
@@ -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" = "Spultasten ausblenden";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Spultasten im Video ausblenden";
|
||||
|
||||
"YT_MINIPLAYER" = "Miniplayer für alle YouTube-Videos aktivieren";
|
||||
"YT_MINIPLAYER_DESC" = "Zum Beispiel bei Videos für Kinder.";
|
||||
|
||||
"CAST_CONFIRM" = "Warnung vor Starten einer Übertragung (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "Warnung vor Starten einer Übertragung, um ein versehentliches Übernehmen des TVs zu verhindern.";
|
||||
|
||||
"HIDE_HOVER_CARD" = "Endkarten ausblenden (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "Endkarten (Thumbnails) am Ende von Videos ausblenden.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "Neue Miniplayer-Leiste (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "App-Neustart erforderlich.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Registerkarte Shorts durch Registerkarte Entdecken ersetzen (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "App-Neustart erforderlich.";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "Schaltfläche Untertitel ausblenden";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "Schaltfläche Untertitel im Video ausblenden.";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "Schaltfläche Autoplay ausblenden";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "Schaltfläche Autoplay im Video ausblenden.";
|
||||
|
||||
"AUTO_FULLSCREEN" = "Auto-Vollbild (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "Auto. Videos im Vollbild starten.";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "HUD-Meldungen ausblenden";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "Beispiel: CC ist ein/ausgeschaltet, Videoschleife ist eingeschaltet,...";
|
||||
|
||||
"OLED_DARKMODE" = "OLED-Dunkelmodus (Experimentell)";
|
||||
"OLED_DARKMODE_DESC" = "Funktioniert in einigen Fällen möglicherweise nicht richtig. Ein App-Neustart ist nach Aktiv-/Deaktivierung erforderlich.";
|
||||
|
||||
"OLED_KEYBOARD" = "OLED-Tastatur (Experimentell)";
|
||||
"OLED_KEYBOARD_DESC" = "Funktioniert in einigen Fällen möglicherweise nicht richtig. App-Neustart erforderlich.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Übertragen";
|
||||
"MSG_ARE_YOU_SURE" = "Sind Sie sicher, dass Sie mit der Übertragung beginnen wollen?";
|
||||
"MSG_YES" = "Ja";
|
||||
"MSG_CANCEL" = "Abbrechen";
|
||||
@@ -0,0 +1,43 @@
|
||||
// Settings
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Κρύψτε το προηγούμενο και το επόμενο κουμπί κατά την αναπαραγωγή βίντεο.";
|
||||
|
||||
"YT_MINIPLAYER" = "Ενεργοποιήστε το miniplayer για όλα τα βίντεο του YouTube";
|
||||
"YT_MINIPLAYER_DESC" = "Τα παιδικά βίντεο για παράδειγμα.";
|
||||
|
||||
"CAST_CONFIRM" = "Επιβεβαιωτικό μήνυμα πριν γίνει Cast(YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "Να φανεί ένα επιβεβαιωτικό μήνυμα πριν γίνει cast για να αποτρεπτεί η καταλάθως σύνδεση στην τηλεόραση.";
|
||||
|
||||
"HIDE_HOVER_CARD" = "Κρύψτε τις τελικές καρτέλες (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "Κρύψτε τις τελικές καρτέλες από τους δημιουργούς (thumbnails) στο τέλος των βίντεο.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "Καινούργιο miniplayer θέμα στην μπάρα (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Αντικατάσταση της καρτέλας Shorts με την καρτέλα Explore (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "Απαιτείται επανεκκίνηση της εφαρμογής.";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "Κρύψτε το κουμπί των Υπότιτλων";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "Κρύψτε το κουμπί των Υπότιτλων κατά την αναπαραγωγή βίντεο.";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "Κρύψτε τον διακόπτη της αυτόματης αναπαραγωγής";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "Κρύψτε τον διακόπτη της αυτόματης αναπαραγωγής κατά την αναπαραγωγή βίντεο";
|
||||
|
||||
"AUTO_FULLSCREEN" = "Αυτόματη αναπαραγωγή σε πλήρη οθόνη (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "Αυτόματη αναπαραγωγή των βίντεο σε πλήρη οθόνη.";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "Κρύψτε τα μηνύματα του HUD";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "Παράδειγμα: Οι Υπότιτλοι απενεργοποιήθηκαν/ενεργοποιήθηκαν...";
|
||||
|
||||
"OLED_DARKMODE" = "OLED Μαύρο θέμα (Experimental)";
|
||||
"OLED_DARKMODE_DESC" = "Μπορεί να μην δουλέψει σε κάποιες περιπτώσεις. Απαιτείται επανεκκίνηση της εφαρμογής αφού το ενεργοποιήσετε/απενεργοποιήσετε.";
|
||||
|
||||
"OLED_KEYBOARD" = "OLED πληκτρολόγιο (Experimental)";
|
||||
"OLED_KEYBOARD_DESC" = "Μπορεί να μην δουλέψει σε κάποιες περιπτώσεις. Απαιτείται επανεκκίνηση της εφαρμογής.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Μετάδοση";
|
||||
"MSG_ARE_YOU_SURE" = "Είστε σίγουροι ότι θέλενε να ξεκινήσετε την μετάδοση;";
|
||||
"MSG_YES" = "Ναι";
|
||||
"MSG_CANCEL" = "Ακύρωση";
|
||||
@@ -0,0 +1,46 @@
|
||||
// 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.";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "Hide Paid Promotion banner";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Hide the 'Includes Paid Promotions' banner in some videos.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Castings";
|
||||
"MSG_ARE_YOU_SURE" = "Are you sure you want to start casting?";
|
||||
"MSG_YES" = "Yes";
|
||||
"MSG_CANCEL" = "Cancel";
|
||||
@@ -0,0 +1,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,58 @@
|
||||
// How to translate uYouPlus to your languate:
|
||||
//
|
||||
// 1. Fork uYouPlus repo
|
||||
// 2. Duplicate the template.lproj folder, and edit the duplicated folder's name to your <lang_code>.lproj id.
|
||||
// For example: <ru.lproj> for Russia. For more details, visit: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
|
||||
// 3. Translate each line below after each =
|
||||
// 4. Open a Pull Request
|
||||
//
|
||||
// If your language already exists then feel free to check it and/or improve it!
|
||||
// You can also add your localiztion to YouPiP here, the process is the same
|
||||
// https://github.com/PoomSmart/YouPiP/tree/main/layout/Library/Application%20Support/YouPiP.bundle
|
||||
//
|
||||
// Settings
|
||||
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Hide Previous and Next button";
|
||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Hide Previous and Next button in video controls overlay.";
|
||||
|
||||
"YT_MINIPLAYER" = "Enable the Miniplayer for all YouTube videos";
|
||||
"YT_MINIPLAYER_DESC" = "Kid videos for example.";
|
||||
|
||||
"CAST_CONFIRM" = "Confirm alert before casting (YTCastConfirm)";
|
||||
"CAST_CONFIRM_DESC" = "Show a confirm alert before casting to prevent accidentally hijacking TV.";
|
||||
|
||||
"HIDE_HOVER_CARD" = "Hide End screens hover cards (YTNoHoverCards)";
|
||||
"HIDE_HOVER_CARD_DESC" = "Hide creator End screens (thumbnails) at the end of videos.";
|
||||
|
||||
"NEW_MINIPLAYER_STYLE" = "New miniplayer bar style (BigYTMiniPlayer)";
|
||||
"NEW_MINIPLAYER_STYLE_DESC" = "App restart is required.";
|
||||
|
||||
"YT_RE_EXPLORE" = "Replace Shorts tab with Explore tab (YTReExplore)";
|
||||
"YT_RE_EXPLORE_DESC" = "App restart is required.";
|
||||
|
||||
"HIDE_SUBTITLES_BUTTON" = "Hide Subtitles button";
|
||||
"HIDE_SUBTITLES_BUTTON_DESC" = "Hide the Subtitles button in video controls overlay.";
|
||||
|
||||
"HIDE_AUTOPLAY_SWITCH" = "Hide Autoplay switch";
|
||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "Hide the Autoplay switch in video controls overlay.";
|
||||
|
||||
"AUTO_FULLSCREEN" = "Auto Full Screen (YTAutoFullScreen)";
|
||||
"AUTO_FULLSCREEN_DESC" = "Autoplay videos at full screen.";
|
||||
|
||||
"HIDE_HUD_MESSAGES" = "Hide HUD Messages";
|
||||
"HIDE_HUD_MESSAGES_DESC" = "Example: CC is turned on/off, Video loop is on,...";
|
||||
|
||||
"OLED_DARKMODE" = "OLED Dark mode (Experimental)";
|
||||
"OLED_DARKMODE_DESC" = "Might not working correctly in some cases. App restart is required after you enable/disable this option.";
|
||||
|
||||
"OLED_KEYBOARD" = "OLED Keyboard (Experimental)";
|
||||
"OLED_KEYBOARD_DESC" = "Might not working correctly in some cases. App restart is required.";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "Hide Paid Promotion banner";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Hide the 'Includes Paid Promotions' banner in some videos.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Castings";
|
||||
"MSG_ARE_YOU_SURE" = "Are you sure you want to start casting?";
|
||||
"MSG_YES" = "Yes";
|
||||
"MSG_CANCEL" = "Cancel";
|
||||
@@ -0,0 +1,46 @@
|
||||
// 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.";
|
||||
|
||||
"HIDE_PAID_PROMOTION_CARDS" = "Ẩn popup quảng cáo được trả tiền";
|
||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Ẩn popup 'Chứa nội dung được trả tiền để quảng cáo' trong một số video.";
|
||||
|
||||
// YTCastConfirm
|
||||
"CASTING" = "Truyền video";
|
||||
"MSG_ARE_YOU_SURE" = "Bạn có muốn bắt đầu truyền video không?";
|
||||
"MSG_YES" = "Có";
|
||||
"MSG_CANCEL" = "Không";
|
||||
@@ -0,0 +1,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" = "取消";
|
||||
@@ -1,100 +0,0 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
|
||||
|
||||
%hook YTAdsInnerTubeContextDecorator
|
||||
- (void)decorateContext:(id)arg1 {
|
||||
%orig(nil);
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
// YouRememberCaption: https://www.ios-repo-updates.com/repository/poomsmart/package/com.ps.youremembercaption/
|
||||
|
||||
%hook YTColdConfig
|
||||
- (BOOL)respectDeviceCaptionSetting {
|
||||
return NO;
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
// YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality
|
||||
|
||||
@interface YTVideoQualitySwitchOriginalController : NSObject
|
||||
- (instancetype)initWithParentResponder:(id)responder;
|
||||
@end
|
||||
|
||||
%hook YTVideoQualitySwitchControllerFactory
|
||||
|
||||
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
||||
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
||||
return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
||||
|
||||
%hook YTHotConfig
|
||||
|
||||
- (BOOL)isPromptForLocalNetworkPermissionsEnabled {
|
||||
return NO;
|
||||
}
|
||||
%end
|
||||
|
||||
// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards
|
||||
|
||||
@interface YTCollectionViewCell : UICollectionViewCell
|
||||
@end
|
||||
|
||||
@interface YTSettingsCell : YTCollectionViewCell
|
||||
@end
|
||||
|
||||
@interface YTSettingsSectionItem : NSObject
|
||||
@property BOOL hasSwitch;
|
||||
@property BOOL switchVisible;
|
||||
@property BOOL on;
|
||||
@property BOOL (^switchBlock)(YTSettingsCell *, BOOL);
|
||||
@property int settingItemId;
|
||||
- (instancetype)initWithTitle:(NSString *)title titleDescription:(NSString *)titleDescription;
|
||||
@end
|
||||
|
||||
%hook YTSettingsViewController
|
||||
- (void)setSectionItems:(NSMutableArray <YTSettingsSectionItem *>*)sectionItems forCategory:(NSInteger)category title:(NSString *)title titleDescription:(NSString *)titleDescription headerHidden:(BOOL)headerHidden {
|
||||
if (category == 1) {
|
||||
NSInteger appropriateIdx = [sectionItems indexOfObjectPassingTest:^BOOL(YTSettingsSectionItem *item, NSUInteger idx, BOOL *stop) {
|
||||
return item.settingItemId == 294;
|
||||
}];
|
||||
if (appropriateIdx != NSNotFound) {
|
||||
YTSettingsSectionItem *hoverCardItem = [[%c(YTSettingsSectionItem) alloc] initWithTitle:@"Show End screens hover cards" titleDescription:@"Allows creator End screens (thumbnails) to appear at the end of videos"];
|
||||
hoverCardItem.hasSwitch = YES;
|
||||
hoverCardItem.switchVisible = YES;
|
||||
hoverCardItem.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"];
|
||||
hoverCardItem.switchBlock = ^BOOL (YTSettingsCell *cell, BOOL enabled) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"hover_cards_enabled"];
|
||||
return YES;
|
||||
};
|
||||
[sectionItems insertObject:hoverCardItem atIndex:appropriateIdx + 1];
|
||||
}
|
||||
}
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTCreatorEndscreenView
|
||||
- (void)setHidden:(BOOL)hidden {
|
||||
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hover_cards_enabled"])
|
||||
hidden = YES;
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
|
||||
// YTSystemAppearance: https://poomsmart.github.io/repo/depictions/ytsystemappearance.html
|
||||
|
||||
%hook YTColdConfig
|
||||
- (BOOL)shouldUseAppThemeSetting {
|
||||
return YES;
|
||||
}
|
||||
%end
|
||||
@@ -0,0 +1,725 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
#import <dlfcn.h>
|
||||
#import "Header.h"
|
||||
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTWatchController.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIGuideResponse.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
|
||||
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
|
||||
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
|
||||
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
|
||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
|
||||
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
|
||||
|
||||
// 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() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHUD_enabled"];
|
||||
}
|
||||
BOOL oled() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oled_enabled"];
|
||||
}
|
||||
BOOL oledKB() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"oledKeyBoard_enabled"];
|
||||
}
|
||||
BOOL isDarkMode() {
|
||||
return ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 1);
|
||||
}
|
||||
BOOL autoFullScreen() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"autoFull_enabled"];
|
||||
}
|
||||
BOOL hideHoverCard() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideHoverCards_enabled"];
|
||||
}
|
||||
BOOL reExplore() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"reExplore_enabled"];
|
||||
}
|
||||
BOOL bigYTMiniPlayer() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"bigYTMiniPlayer_enabled"];
|
||||
}
|
||||
BOOL hideCC() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideCC_enabled"];
|
||||
}
|
||||
BOOL hideAutoplaySwitch() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hideAutoplaySwitch_enabled"];
|
||||
}
|
||||
BOOL hidePreviousAndNextButton() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePreviousAndNextButton_enabled"];
|
||||
}
|
||||
BOOL castConfirm() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"castConfirm_enabled"];
|
||||
}
|
||||
BOOL ytMiniPlayer() {
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ytMiniPlayer_enabled"];
|
||||
}
|
||||
BOOL hidePaidPromotionCard(){
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:@"hidePaidPromotionCard_enabled"];
|
||||
}
|
||||
|
||||
# pragma mark - Tweaks
|
||||
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
|
||||
%hook YTWatchMiniBarViewController
|
||||
- (void)updateMiniBarPlayerStateFromRenderer {
|
||||
if (ytMiniPlayer()) {}
|
||||
else { return %orig; }
|
||||
}
|
||||
%end
|
||||
|
||||
// Hide CC / Autoplay switch / Next & Previous button
|
||||
%hook YTMainAppControlsOverlayView
|
||||
- (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { // hide CC button
|
||||
if (hideCC()) { return %orig(NO); }
|
||||
else { return %orig; }
|
||||
}
|
||||
- (void)setAutoplaySwitchButtonRenderer:(id)arg1 { // hide Autoplay
|
||||
if (hideAutoplaySwitch()) {}
|
||||
else { return %orig; }
|
||||
}
|
||||
- (void)layoutSubviews { // hide Next & Previous button
|
||||
%orig;
|
||||
if (hidePreviousAndNextButton()) {
|
||||
MSHookIvar<YTMainAppControlsOverlayView *>(self, "_nextButton").hidden = YES;
|
||||
MSHookIvar<YTMainAppControlsOverlayView *>(self, "_previousButton").hidden = YES;
|
||||
// MSHookIvar<YTTransportControlsButtonView *>(self, "_nextButtonView").hidden = YES;
|
||||
// MSHookIvar<YTTransportControlsButtonView *>(self, "_previousButtonView").hidden = YES;
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// Hide HUD Messages
|
||||
%hook YTHUDMessageView
|
||||
- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 {
|
||||
return hideHUD() ? nil : %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// YTAutoFullScreen: https://github.com/PoomSmart/YTAutoFullScreen/
|
||||
%hook YTPlayerViewController
|
||||
- (void)loadWithPlayerTransition:(id)arg1 playbackConfig:(id)arg2 {
|
||||
%orig;
|
||||
if (autoFullScreen())
|
||||
[NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(autoFullscreen) userInfo:nil repeats:NO];
|
||||
}
|
||||
%new
|
||||
- (void)autoFullscreen {
|
||||
YTWatchController *watchController = [self valueForKey:@"_UIDelegate"];
|
||||
[watchController showFullScreen];
|
||||
}
|
||||
%end
|
||||
|
||||
// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards
|
||||
%hook YTCreatorEndscreenView
|
||||
- (void)setHidden:(BOOL)hidden {
|
||||
if (hideHoverCard())
|
||||
hidden = YES;
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
//YTCastConfirm: https://github.com/JamieBerghmans/YTCastConfirm
|
||||
%hook MDXPlaybackRouteButtonController
|
||||
- (void)didPressButton:(id)arg1 {
|
||||
if (castConfirm()) {
|
||||
UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:LOC(@"CASTING")
|
||||
message:LOC(@"MSG_ARE_YOU_SURE")
|
||||
preferredStyle:UIAlertControllerStyleAlert];
|
||||
UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:LOC(@"MSG_YES") style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
|
||||
%orig;
|
||||
}];
|
||||
|
||||
UIAlertAction* noButton = [%c(UIAlertAction)
|
||||
actionWithTitle:LOC(@"MSG_CANCEL")
|
||||
style:UIAlertActionStyleDefault
|
||||
handler: ^(UIAlertAction * action) {
|
||||
return;
|
||||
}];
|
||||
|
||||
[alertController addAction:defaultAction];
|
||||
[alertController addAction:noButton];
|
||||
|
||||
id rootViewController = [%c(UIApplication) sharedApplication].delegate.window.rootViewController;
|
||||
if ([rootViewController isKindOfClass:[%c(UINavigationController) class]]) {
|
||||
rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
|
||||
}
|
||||
if ([rootViewController isKindOfClass:[%c(UITabBarController) class]]) {
|
||||
rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
|
||||
}
|
||||
if ([rootViewController presentedViewController] != nil) {
|
||||
rootViewController = [rootViewController presentedViewController];
|
||||
}
|
||||
[rootViewController presentViewController:alertController animated:YES completion:nil];
|
||||
} else { return %orig; }
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/12
|
||||
%hook YTAdsInnerTubeContextDecorator
|
||||
- (void)decorateContext:(id)arg1 { %orig(nil); }
|
||||
%end
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
||||
%hook YTELMView
|
||||
%new
|
||||
- (id)entry {
|
||||
return nil;
|
||||
}
|
||||
%end
|
||||
|
||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/140
|
||||
%hook YTLocalPlaybackController
|
||||
%new
|
||||
- (id)activeVideoController {
|
||||
return [self activeVideo];
|
||||
}
|
||||
%end
|
||||
|
||||
// YTClassicVideoQuality: https://github.com/PoomSmart/YTClassicVideoQuality
|
||||
%hook YTVideoQualitySwitchControllerFactory
|
||||
- (id)videoQualitySwitchControllerWithParentResponder:(id)responder {
|
||||
Class originalClass = %c(YTVideoQualitySwitchOriginalController);
|
||||
return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
||||
%hook YTHotConfig
|
||||
- (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
|
||||
%end
|
||||
|
||||
// YTSystemAppearance: https://poomsmart.github.io/repo/depictions/ytsystemappearance.html
|
||||
// YouRememberCaption: https://poomsmart.github.io/repo/depictions/youremembercaption.html
|
||||
%hook YTColdConfig
|
||||
- (BOOL)shouldUseAppThemeSetting { return YES; }
|
||||
- (BOOL)respectDeviceCaptionSetting { return NO; }
|
||||
- (BOOL)isEnhancedSearchBarEnabled { return YES; }
|
||||
%end
|
||||
|
||||
// NOYTPremium - https://github.com/PoomSmart/NoYTPremium/
|
||||
%hook YTCommerceEventGroupHandler
|
||||
- (void)addEventHandlers {}
|
||||
%end
|
||||
|
||||
%hook YTInterstitialPromoEventGroupHandler
|
||||
- (void)addEventHandlers {}
|
||||
%end
|
||||
|
||||
%hook YTPromosheetEventGroupHandler
|
||||
- (void)addEventHandlers {}
|
||||
%end
|
||||
|
||||
%hook YTPromoThrottleController
|
||||
- (BOOL)canShowThrottledPromo { return NO; }
|
||||
- (BOOL)canShowThrottledPromoWithFrequencyCap:(id)arg1 { return NO; }
|
||||
- (BOOL)canShowThrottledPromoWithFrequencyCaps:(id)arg1 { return NO; }
|
||||
%end
|
||||
|
||||
%hook YTIShowFullscreenInterstitialCommand
|
||||
- (BOOL)shouldThrottleInterstitial { return YES; }
|
||||
%end
|
||||
|
||||
%hook YTSurveyController
|
||||
- (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {}
|
||||
%end
|
||||
|
||||
// Enable Shorts scroll bar - @level3tjg - https://reddit.com/r/jailbreak/comments/v29yvk/_/iasl1l0/
|
||||
%hook YTReelPlayerViewController
|
||||
- (BOOL)shouldEnablePlayerBar { return YES; }
|
||||
%end
|
||||
|
||||
// Workaround for issue #54
|
||||
%hook YTMainAppVideoPlayerOverlayViewController
|
||||
- (void)updateRelatedVideos {
|
||||
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"relatedVideosAtTheEndOfYTVideos"] == NO) {}
|
||||
else { return %orig; }
|
||||
}
|
||||
%end
|
||||
|
||||
// Hide YouTube Shorts banner in Home page? - @MiRO92 - YTNoShorts: https://github.com/MiRO92/YTNoShorts
|
||||
%hook YTAsyncCollectionView
|
||||
- (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
UICollectionViewCell *cell = %orig;
|
||||
if ([cell isKindOfClass:NSClassFromString(@"_ASCollectionViewCell")]) {
|
||||
_ASCollectionViewCell *cell = %orig;
|
||||
if ([cell respondsToSelector:@selector(node)]) {
|
||||
if ([[[cell node] accessibilityIdentifier] isEqualToString:@"statement_banner.view"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; }
|
||||
if ([[[cell node] accessibilityIdentifier] isEqualToString:@"compact.view"]) { [self removeShortsAndFeaturesAdsAtIndexPath:indexPath]; }
|
||||
}
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
|
||||
%new
|
||||
- (void)removeShortsAndFeaturesAdsAtIndexPath:(NSIndexPath *)indexPath {
|
||||
[self deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
|
||||
}
|
||||
%end
|
||||
|
||||
// uYou's slide settings?
|
||||
%hook FRPSliderCell
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
|
||||
MSHookIvar<UILabel *>(self, "_lLabel").textColor = [UIColor whiteColor];
|
||||
MSHookIvar<UILabel *>(self, "_rLabel").textColor = [UIColor whiteColor];
|
||||
MSHookIvar<UILabel *>(self, "_cLabel").textColor = [UIColor whiteColor];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo
|
||||
%hook YTMainAppVideoPlayerOverlayViewController
|
||||
- (void)setPaidContentWithPlayerData:(id)data {
|
||||
if (hidePaidPromotionCard()) {}
|
||||
else { return %orig; }
|
||||
}
|
||||
- (void)playerOverlayProvider:(YTPlayerOverlayProvider *)provider didInsertPlayerOverlay:(YTPlayerOverlay *)overlay {
|
||||
if ([[overlay overlayIdentifier] isEqualToString:@"player_overlay_paid_content"] && hidePaidPromotionCard()) return;
|
||||
%orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTInlineMutedPlaybackPlayerOverlayViewController
|
||||
- (void)setPaidContentWithPlayerData:(id)data {
|
||||
if (hidePaidPromotionCard()) {}
|
||||
else { return %orig; }
|
||||
}
|
||||
%end
|
||||
|
||||
# pragma mark - IAmYouTube - https://github.com/PoomSmart/IAmYouTube/
|
||||
%hook YTVersionUtils
|
||||
+ (NSString *)appName { return YT_NAME; }
|
||||
+ (NSString *)appID { return YT_BUNDLE_ID; }
|
||||
%end
|
||||
|
||||
%hook GCKBUtils
|
||||
+ (NSString *)appIdentifier { return YT_BUNDLE_ID; }
|
||||
%end
|
||||
|
||||
%hook GPCDeviceInfo
|
||||
+ (NSString *)bundleId { return YT_BUNDLE_ID; }
|
||||
%end
|
||||
|
||||
%hook OGLBundle
|
||||
+ (NSString *)shortAppName { return YT_NAME; }
|
||||
%end
|
||||
|
||||
%hook GVROverlayView
|
||||
+ (NSString *)appName { return YT_NAME; }
|
||||
%end
|
||||
|
||||
%hook OGLPhenotypeFlagServiceImpl
|
||||
- (NSString *)bundleId { return YT_BUNDLE_ID; }
|
||||
%end
|
||||
|
||||
%hook 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* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:1.0];
|
||||
%group gOLED
|
||||
%hook YTCommonColorPalette
|
||||
- (UIColor *)brandBackgroundSolid {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)brandBackgroundPrimary {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)brandBackgroundSecondary {
|
||||
if (self.pageStyle == 1) {
|
||||
return [[UIColor blackColor] colorWithAlphaComponent:0.9];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)raisedBackground {
|
||||
if (self.pageStyle == 1) {
|
||||
return raisedColor;
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)staticBrandBlack {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (UIColor *)generalBackgroundA {
|
||||
if (self.pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Account view controller
|
||||
%hook YTAccountPanelBodyViewController
|
||||
- (UIColor *)backgroundColor:(NSInteger)pageStyle {
|
||||
if (pageStyle == 1) {
|
||||
return [UIColor blackColor];
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Explore
|
||||
%hook ASScrollView
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode()) {
|
||||
self.backgroundColor = [UIColor clearColor];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// Your videos
|
||||
%hook ASCollectionView
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode() && [self.nextResponder isKindOfClass:%c(_ASDisplayView)]) {
|
||||
self.superview.backgroundColor = [UIColor 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 {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// History Search view
|
||||
%hook YTSearchBoxView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Comment view
|
||||
%hook YTCommentView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTCreateCommentAccessoryView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTCreateCommentTextView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
- (void)setTextColor:(UIColor *)color { // fix black text in #Shorts video's comment
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor whiteColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTCommentDetailHeaderCell
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode()) {
|
||||
self.subviews[2].backgroundColor = [UIColor blackColor];
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTFormattedStringLabel // YT is werid...
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor clearColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Live chat comment
|
||||
%hook YCHLiveChatActionPanelView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTEmojiTextView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig([UIColor blackColor]);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
// Others
|
||||
%hook _ASDisplayView
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode()) {
|
||||
if ([self.nextResponder isKindOfClass:%c(ASScrollView)]) { self.backgroundColor = raisedColor; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"eml.cvr"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"rich_header"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.comment_cell"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.ui.cancel.button"]) { self.superview.backgroundColor = raisedColor; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.filter_chip_bar"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.comment_composer"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.elements.components.video_list_entry"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.guidelines_text"]) { self.superview.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_bottom_sheet_container"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
if ([self.accessibilityIdentifier isEqualToString:@"id.comment.channel_guidelines_entry_banner_container"]) { self.backgroundColor = [UIColor blackColor]; }
|
||||
}
|
||||
}
|
||||
%end
|
||||
|
||||
// Open link with...
|
||||
%hook ASWAppSwitchingSheetHeaderView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig(raisedColor);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook ASWAppSwitchingSheetFooterView
|
||||
- (void)setBackgroundColor:(UIColor *)color {
|
||||
if (isDarkMode()) {
|
||||
return %orig(raisedColor);
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
|
||||
%hook ASWAppSwitcherCollectionViewCell
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
if (isDarkMode()) {
|
||||
self.subviews[1].backgroundColor = raisedColor;
|
||||
self.superview.backgroundColor = raisedColor;
|
||||
}
|
||||
}
|
||||
%end
|
||||
%end
|
||||
|
||||
# pragma mark - OLED keyboard by @ichitaso <3 - http://gist.github.com/ichitaso/935100fd53a26f18a9060f7195a1be0e
|
||||
%group gOLEDKB
|
||||
%hook UIPredictionViewController
|
||||
- (void)loadView {
|
||||
%orig;
|
||||
[self.view setBackgroundColor:[UIColor blackColor]];
|
||||
}
|
||||
%end
|
||||
|
||||
%hook UICandidateViewController
|
||||
- (void)loadView {
|
||||
%orig;
|
||||
[self.view setBackgroundColor:[UIColor blackColor]];
|
||||
}
|
||||
%end
|
||||
|
||||
%hook UIKeyboardDockView
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
self.backgroundColor = [UIColor blackColor];
|
||||
}
|
||||
%end
|
||||
|
||||
%hook UIKeyboardLayoutStar
|
||||
- (void)didMoveToWindow {
|
||||
%orig;
|
||||
self.backgroundColor = [UIColor blackColor];
|
||||
}
|
||||
%end
|
||||
|
||||
%hook UIKBRenderConfig // Prediction text color
|
||||
- (void)setLightKeyboard:(BOOL)arg1 { %orig(NO); }
|
||||
%end
|
||||
%end
|
||||
|
||||
// YTReExplore: https://github.com/PoomSmart/YTReExplore/
|
||||
%group gReExplore
|
||||
static void replaceTab(YTIGuideResponse *response) {
|
||||
NSMutableArray <YTIGuideResponseSupportedRenderers *> *renderers = [response itemsArray];
|
||||
for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) {
|
||||
YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer];
|
||||
NSMutableArray <YTIPivotBarSupportedRenderers *> *items = [pivotBarRenderer itemsArray];
|
||||
NSUInteger shortIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
|
||||
return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:@"FEshorts"];
|
||||
}];
|
||||
if (shortIndex != NSNotFound) {
|
||||
[items removeObjectAtIndex:shortIndex];
|
||||
NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) {
|
||||
return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]];
|
||||
}];
|
||||
if (exploreIndex == NSNotFound) {
|
||||
YTIPivotBarSupportedRenderers *exploreTab = [%c(YTIPivotBarRenderer) pivotSupportedRenderersWithBrowseId:[%c(YTIBrowseRequest) browseIDForExploreTab] title:@"Explore" iconType:292];
|
||||
[items insertObject:exploreTab atIndex:1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
%hook YTGuideServiceCoordinator
|
||||
- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion {
|
||||
replaceTab(response);
|
||||
%orig(response, completion);
|
||||
}
|
||||
- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion {
|
||||
replaceTab(response);
|
||||
%orig(response, error, completion);
|
||||
}
|
||||
%end
|
||||
%end
|
||||
|
||||
// BigYTMiniPlayer: https://github.com/Galactic-Dev/BigYTMiniPlayer
|
||||
%group Main
|
||||
%hook YTWatchMiniBarView
|
||||
- (void)setWatchMiniPlayerLayout:(int)arg1 {
|
||||
%orig(1);
|
||||
}
|
||||
- (int)watchMiniPlayerLayout {
|
||||
return 1;
|
||||
}
|
||||
- (void)layoutSubviews {
|
||||
%orig;
|
||||
self.frame = CGRectMake(([UIScreen mainScreen].bounds.size.width - self.frame.size.width), self.frame.origin.y, self.frame.size.width, self.frame.size.height);
|
||||
}
|
||||
%end
|
||||
|
||||
%hook YTMainAppVideoPlayerOverlayView
|
||||
- (BOOL)isUserInteractionEnabled {
|
||||
if([[self _viewControllerForAncestor].parentViewController.parentViewController isKindOfClass:%c(YTWatchMiniBarViewController)]) {
|
||||
return NO;
|
||||
}
|
||||
return %orig;
|
||||
}
|
||||
%end
|
||||
%end
|
||||
|
||||
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
|
||||
%group iOS16
|
||||
%hook OBPrivacyLinkButton
|
||||
%new
|
||||
- (instancetype)initWithCaption:(NSString *)caption
|
||||
buttonText:(NSString *)buttonText
|
||||
image:(UIImage *)image
|
||||
imageSize:(CGSize)imageSize
|
||||
useLargeIcon:(BOOL)useLargeIcon {
|
||||
return [self initWithCaption:caption
|
||||
buttonText:buttonText
|
||||
image:image
|
||||
imageSize:imageSize
|
||||
useLargeIcon:useLargeIcon
|
||||
displayLanguage:[NSLocale currentLocale].languageCode];
|
||||
}
|
||||
%end
|
||||
%end
|
||||
|
||||
# pragma mark - ctor
|
||||
%ctor {
|
||||
%init;
|
||||
if (![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"relatedVideosAtTheEndOfYTVideos"]) {
|
||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"relatedVideosAtTheEndOfYTVideos"];
|
||||
}
|
||||
if (oled()) {
|
||||
%init(gOLED);
|
||||
}
|
||||
if (oledKB()) {
|
||||
%init(gOLEDKB);
|
||||
}
|
||||
if (reExplore()) {
|
||||
%init(gReExplore);
|
||||
}
|
||||
if (bigYTMiniPlayer() && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
|
||||
%init(Main);
|
||||
}
|
||||
if (@available(iOS 16, *)) {
|
||||
%init(iOS16);
|
||||
}
|
||||
}
|
||||