Compare commits
44
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
82de8d62ac | ||
|
|
881d6292aa | ||
|
|
1150659ea1 | ||
|
|
a61882280e | ||
|
|
5aec68985f | ||
|
|
37bbbbf369 | ||
|
|
33deba766a | ||
|
|
1f3707a3f2 | ||
|
|
396515d600 | ||
|
|
a61405c3fb | ||
|
|
76837d0ce7 | ||
|
|
5475c77d52 | ||
|
|
e81e6ff159 | ||
|
|
d6694e4e14 | ||
|
|
90cd7cd3dd | ||
|
|
dc53dd2578 | ||
|
|
bd37e43070 | ||
|
|
544f6b57c4 | ||
|
|
43984cc2a6 | ||
|
|
5bfc931a02 | ||
|
|
2e2c364b44 | ||
|
|
3e63708ac8 | ||
|
|
fd603e902c | ||
|
|
f9de2d7b8d | ||
|
|
49ace6eb4d | ||
|
|
c42d2b85c9 | ||
|
|
880f92f2f6 | ||
|
|
4387a27214 | ||
|
|
aed43dc389 | ||
|
|
9edcd82315 | ||
|
|
acc86a1bf6 | ||
|
|
635b0673b4 | ||
|
|
6b60f22eaf | ||
|
|
65fd05f5db | ||
|
|
908caaf047 | ||
|
|
276ce261a5 | ||
|
|
da03ae08a6 | ||
|
|
2f9b656acd | ||
|
|
9c8486d017 | ||
|
|
e71069e678 | ||
|
|
0e1e6d4396 | ||
|
|
6b3026159c | ||
|
|
8aff0035ac | ||
|
|
b846e6e45e |
@@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
name: Bug
|
name: Bug
|
||||||
about: Make sure you complete the template. Otherwise, it will be closed without further explanation!
|
about: Make sure you complete the template. Otherwise, it will be closed without further explanation!
|
||||||
title: "[Bug]"
|
title: "[Bug] (Replace this with your title)"
|
||||||
labels: bug
|
labels: bug
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️
|
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ) page first!!! ⚠️
|
||||||
|
|
||||||
_Make sure you complete the template. Otherwise, it will be closed without further explanation!_
|
_Make sure you complete the template. Otherwise, it will be closed without further explanation!_
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ _Make sure you complete the template. Otherwise, it will be closed without furth
|
|||||||
_(Please attach videos or screenshots if possible)_
|
_(Please attach videos or screenshots if possible)_
|
||||||
|
|
||||||
### Crash log (if possible)
|
### Crash log (if possible)
|
||||||
_(The crash log can be found in the Settings app > Privacy > Analytics & Improvements > Analytics Data > Youtube...)_
|
_(The crash log can be found in your device's Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips)_
|
||||||
|
|
||||||
### Are you using the newest version of uYouPlus? If not, why?
|
### Are you using the newest version of uYouPlus? If not, why?
|
||||||
_(Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the latest version before reporting about an issue???)_
|
_(Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the latest version before reporting about an issue???)_
|
||||||
|
|||||||
@@ -21,6 +21,16 @@ on:
|
|||||||
default: ""
|
default: ""
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
bundle_id:
|
||||||
|
description: "Modify the bundle ID. Not recommended"
|
||||||
|
default: "com.google.ios.youtube"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
app_name:
|
||||||
|
description: "Modify the name of the app on the Home Screen. Not recommended"
|
||||||
|
default: "YouTube"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
create_release:
|
create_release:
|
||||||
description: "Create a draft release"
|
description: "Create a draft release"
|
||||||
default: true
|
default: true
|
||||||
@@ -90,12 +100,12 @@ jobs:
|
|||||||
- name: Download uYou & Prepare YouTube iPA
|
- name: Download uYou & Prepare YouTube iPA
|
||||||
run: |
|
run: |
|
||||||
curl "https://raw.githubusercontent.com/Muirey03/RemoteLog/master/RemoteLog.h" --output "$THEOS/include/RemoteLog.h"
|
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"
|
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
|
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/
|
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
|
unzip -q main/YouTube.ipa -d main/tmp
|
||||||
rm -rf ./main/tmp/Payload/YouTube.app/PlugIns/*
|
rm -rf main/tmp/Payload/YouTube.app/PlugIns/*
|
||||||
cp -R ./main/Extensions/*.appex ./main/tmp/Payload/YouTube.app/PlugIns
|
cp -R main/Extensions/*.appex main/tmp/Payload/YouTube.app/PlugIns
|
||||||
|
|
||||||
env:
|
env:
|
||||||
THEOS: ${{ github.workspace }}/theos
|
THEOS: ${{ github.workspace }}/theos
|
||||||
@@ -107,15 +117,20 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
(echo 'THEOS_IGNORE_PARALLEL_BUILDING_NOTICE = yes' >> ~/.theosrc)
|
(echo 'THEOS_IGNORE_PARALLEL_BUILDING_NOTICE = yes' >> ~/.theosrc)
|
||||||
cd ${{ github.workspace }}/main
|
cd ${{ github.workspace }}/main
|
||||||
(cd ${{ github.workspace }}/main/Tweaks/YouPiP && sed -i '' "14s/$/ AVFoundation UIKit/" Makefile)
|
sed -i '' "12s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
|
||||||
(cd ${{ github.workspace }}/main/Tweaks/YTABConfig && sed -i '' "12s#.*#YTABConfig_FRAMEWORKS = UIKit#g" Makefile)
|
sed -i '' "11s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
|
||||||
make package FINALPACKAGE=1
|
make package FINALPACKAGE=1
|
||||||
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
|
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
|
||||||
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
|
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
|
||||||
|
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"
|
||||||
|
echo -e "==> \033[1mBundle ID: ${{ env.BUNDLE_ID }}\033[0m"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
THEOS: ${{ github.workspace }}/theos
|
THEOS: ${{ github.workspace }}/theos
|
||||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||||
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
|
||||||
|
BUNDLE_ID: ${{ inputs.bundle_id }}
|
||||||
|
APP_NAME: ${{ inputs.app_name }}
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
@@ -129,7 +144,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
id: create_release
|
id: create_release
|
||||||
uses: softprops/action-gh-release@v0.1.14
|
uses: softprops/action-gh-release@v0.1.15
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
UYOU_VERSION: ${{ inputs.uyou_version }}
|
UYOU_VERSION: ${{ inputs.uyou_version }}
|
||||||
@@ -138,5 +153,5 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
||||||
name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
|
||||||
files: ./main/packages/*.ipa
|
files: main/packages/*.ipa
|
||||||
draft: ${{ env.DRAFT }}
|
draft: ${{ env.DRAFT }}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
|
||||||
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
#define YT_BUNDLE_ID @"com.google.ios.youtube"
|
||||||
#define YT_NAME @"YouTube"
|
#define YT_NAME @"YouTube"
|
||||||
#define UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
|
#define DEMC_UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
|
||||||
#define THRESHOLD 1.99 // DontEatMycontent
|
#define DEMC_THRESHOLD 1.99 // DontEatMycontent
|
||||||
#define DEFAULT_RATE 2.0f // YTSpeed
|
#define DEFAULT_RATE 2.0f // YTSpeed
|
||||||
|
|
||||||
// IAmYouTube
|
// IAmYouTube
|
||||||
@@ -42,26 +42,33 @@
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
// DontEatMyContent
|
// DontEatMyContent
|
||||||
NSString* deviceName();
|
BOOL DEMC_deviceIsSupported();
|
||||||
void aspectRatioChanged(CGFloat arg);
|
void DEMC_activate();
|
||||||
BOOL deviceIsSupported();
|
void DEMC_deactivate();
|
||||||
void activate();
|
void DEMC_centerRenderingView();
|
||||||
void deactivate();
|
|
||||||
void center();
|
|
||||||
|
|
||||||
@interface YTPlayerView : UIView
|
@interface YTPlayerView : UIView
|
||||||
- (BOOL)zoomToFill;
|
|
||||||
- (id)renderingView;
|
- (id)renderingView;
|
||||||
- (id)playerView;
|
|
||||||
@end
|
|
||||||
|
|
||||||
@interface MLHAMSBDLSampleBufferRenderingView : UIView
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
|
||||||
- (BOOL)isFullscreen;
|
- (BOOL)isFullscreen;
|
||||||
- (id)videoPlayerOverlayView;
|
@end
|
||||||
- (id)activeVideoPlayerOverlay;
|
|
||||||
|
@interface HAMSBDLSampleBufferRenderingView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface MLHAMSBDLSampleBufferRenderingView : HAMSBDLSampleBufferRenderingView
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTMainAppEngagementPanelViewController : UIViewController
|
||||||
|
- (BOOL)isLandscapeEngagementPanel;
|
||||||
|
- (BOOL)isPeekingSupported;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface YTEngagementPanelContainerViewController : UIViewController
|
||||||
|
- (BOOL)isLandscapeEngagementPanel;
|
||||||
|
- (BOOL)isPeekingSupported;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// YTSpeed
|
// YTSpeed
|
||||||
@@ -130,6 +137,9 @@ void center();
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
// OLED Darkmode
|
// OLED Darkmode
|
||||||
|
@interface ELMView : UIView
|
||||||
|
@end
|
||||||
|
|
||||||
@interface ASWAppSwitcherCollectionViewCell : UIView
|
@interface ASWAppSwitcherCollectionViewCell : UIView
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ ARCHS = arm64
|
|||||||
MODULES = jailed
|
MODULES = jailed
|
||||||
FINALPACKAGE = 1
|
FINALPACKAGE = 1
|
||||||
CODESIGN_IPA = 0
|
CODESIGN_IPA = 0
|
||||||
PACKAGE_VERSION = 17.42.7_2.1
|
PACKAGE_VERSION = 17.48.2_2.1
|
||||||
|
|
||||||
TWEAK_NAME = uYouPlus
|
TWEAK_NAME = uYouPlus
|
||||||
DISPLAY_NAME = YouTube
|
DISPLAY_NAME = YouTube
|
||||||
@@ -13,7 +13,7 @@ BUNDLE_ID = com.google.ios.youtube
|
|||||||
|
|
||||||
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib
|
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib
|
||||||
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
uYouPlus_FILES = uYouPlus.xm Settings.xm
|
||||||
uYouPlus_IPA = ./tmp/Payload/YouTube.app
|
uYouPlus_IPA = tmp/Payload/YouTube.app
|
||||||
uYouPlus_FRAMEWORKS = UIKit Security
|
uYouPlus_FRAMEWORKS = UIKit Security
|
||||||
uYouPlus_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION)
|
uYouPlus_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,28 @@
|
|||||||

|

|
||||||
|
***
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus/wiki/FAQ"><img src="https://img.shields.io/badge/Question%3F-FAQ-yellow" alt="Badge"></img></a>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus/wiki/FAQ"><img src="https://custom-icon-badges.demolab.com/badge/translate-blue.svg?logo=translate&logoColor=white" alt="Badge"></img></a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus/release/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/qnblackcat/uYouPlus?color=brightgreen&label=Latest%20release" alt="Badge"></img></a>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus/releases/latest"><img src="https://img.shields.io/github/downloads/qnblackcat/uYouPlus/total?label=Download" alt="Badge"></img></a>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/qnblackcat/uYouPlus?logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus/issues"><img src="https://custom-icon-badges.demolab.com/github/issues-raw/qnblackcat/uYouPlus?logo=issue-opened&label=Issues" alt="Badge"></img></a>
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://img.shields.io/github/stars/qnblackcat/uYouPlus?style=social" alt="Badge"/>
|
||||||
|
<img src="https://img.shields.io/github/forks/qnblackcat/uYouPlus?style=social" alt="Badge"/>
|
||||||
|
<a href="https://github.com/qnblackcat/uYouPlus#support-the-developers"><img src="https://img.shields.io/badge/-Support-lightgrey?style=social&logo=paypal" alt="Badge"></img></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
# Table of Contents
|
# Table of Contents
|
||||||
|
|
||||||
@@ -160,37 +184,37 @@
|
|||||||
|
|
||||||
- My official AltStore repo: https://qnblackcat.github.io/AltStore/
|
- My official AltStore repo: https://qnblackcat.github.io/AltStore/
|
||||||
|
|
||||||
- [Open in AltStore (v17.42.7-2.1)](https://tinyurl.com/4j5nyb6z) - It will take a while to install because AltStore needs to download the IPA first.
|
- [Open in AltStore (v17.48.2-2.1)](https://tinyurl.com/59kjzeth) - It will take a while to install because AltStore needs to download the IPA first.
|
||||||
|
|
||||||
- Version info: _(last update: Oct 28)_
|
- Version info: _(last update: Dec 12)_
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Expand ℹ️</summary>
|
<summary>Expand ℹ️</summary>
|
||||||
|
|
||||||
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
|
||||||
| - | - | :-: | :-: |
|
| - | - | :-: | :-: |
|
||||||
| **YouTube** | Google Inc | 17.42.7 | ✖︎ |
|
| **YouTube** | Google Inc | 17.48.2 | ✖︎ |
|
||||||
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
|
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 2.1 | ✖︎ |
|
||||||
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
|
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
|
||||||
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
|
||||||
| **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
|
| **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) |
|
| **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) |
|
| **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
|
||||||
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.2 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
|
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.5 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
|
||||||
| **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
|
| **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
|
||||||
| **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
|
| **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
|
||||||
| **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
|
| **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
|
||||||
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.4 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.4-2 | [✔︎](https://github.com/PoomSmart/YTUHD) |
|
||||||
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.14 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.15-2 | [✔︎](https://github.com/PoomSmart/YouPiP) |
|
||||||
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
|
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
|
||||||
| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.4.2 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
|
| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.4.6 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
|
||||||
| **YTReExplore** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
|
| **YTReExplore** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
|
||||||
| **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
|
| **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
|
||||||
| **YTNoPaidPromo** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
|
| **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) |
|
| **YTAutoFullScreen** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
|
||||||
| **YTShortsProgress** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
|
| **YTShortsProgress** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
|
||||||
| **YouRememberCaption** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) |
|
| **YouRememberCaption** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://poomsmart.github.io/repo/depictions/youremembercaption.html) |
|
||||||
| **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.3 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
| **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.9.0 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
|
||||||
| **YTNoCheckLocalNetwork** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
| **YTNoCheckLocalNetwork** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html) |
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|||||||
Submodule Tweaks/Return-YouTube-Dislikes updated: 85ad2058c2...a8d6722271
+1
-1
Submodule Tweaks/YTABConfig updated: 7764a326c0...24ad4214b4
+1
-1
Submodule Tweaks/YTUHD updated: 96af5b5a38...ba1b89d24a
+1
-1
Submodule Tweaks/YouPiP updated: d6bcbe00f1...abe97aa0cc
+1
-1
Submodule Tweaks/YouTubeHeader updated: 43fdc1ff31...99f98ccbc1
+1
-1
Submodule Tweaks/iSponsorBlock updated: 997d792317...92007946c2
+14
-11
@@ -22,27 +22,29 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Makefile
|
# Makefile
|
||||||
if [ -d ./tmp ]
|
if [ -d tmp ]
|
||||||
then
|
then
|
||||||
rm -rf ./tmp
|
rm -rf tmp
|
||||||
fi
|
fi
|
||||||
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
|
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
|
||||||
if [[ $PATHTOYT == *.ipa ]]
|
if [[ $PATHTOYT == *.ipa ]]
|
||||||
then
|
then
|
||||||
unzip -q "$PATHTOYT" -d ./tmp
|
unzip -q "$PATHTOYT" -d tmp
|
||||||
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
|
rm -rf tmp/Payload/YouTube.app/_CodeSignature/CodeResources
|
||||||
|
rm -rf tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||||
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
||||||
make package
|
make package FINALPACKAGE=1
|
||||||
open ./packages
|
open packages
|
||||||
|
|
||||||
elif [[ $PATHTOYT == *.app ]]
|
elif [[ $PATHTOYT == *.app ]]
|
||||||
then
|
then
|
||||||
mkdir -p ./tmp/Payload/
|
mkdir -p tmp/Payload/
|
||||||
cp -R "$PATHTOYT" ./tmp/Payload 2>/dev/null
|
cp -R "$PATHTOYT" tmp/Payload 2>/dev/null
|
||||||
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
|
rm -rf tmp/Payload/YouTube.app/_CodeSignature/CodeResources
|
||||||
|
rm -rf tmp/Payload/YouTube.app/PlugIns/*.appex
|
||||||
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
|
||||||
make package
|
make package FINALPACKAGE=1
|
||||||
open ./packages
|
open packages
|
||||||
else
|
else
|
||||||
echo "This is not an ipa/app!"
|
echo "This is not an ipa/app!"
|
||||||
fi
|
fi
|
||||||
@@ -50,3 +52,4 @@ fi
|
|||||||
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
|
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
|
||||||
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
|
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
|
||||||
rm -rf tmp/ Resources .theos/_/Payload
|
rm -rf tmp/ Resources .theos/_/Payload
|
||||||
|
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa)\033[0m"
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
// Settings
|
// Settings
|
||||||
"VERSION" = "您的uYouPlus版本為: %@";
|
"VERSION" = "uYouPlus 版本為: %@";
|
||||||
"VERSION_CHECK" = "點擊查看最新版本!";
|
"VERSION_CHECK" = "查看最新版本";
|
||||||
|
|
||||||
"DONT_EAT_MY_CONTENT" = "2:1影片瀏海/動態島優化 (DontEatMyContent)";
|
"DONT_EAT_MY_CONTENT" = "2:1 影片瀏海/動態島優化(DontEatMyContent)";
|
||||||
"DONT_EAT_MY_CONTENT_DESC" = "改進部分機型的瀏海區域或動態島在2:1比例影片中引發的遮擋問題。需要重新啟動應用程式。";
|
"DONT_EAT_MY_CONTENT_DESC" = "改進部分機型的瀏海區域/動態島在 2:1 影片中的遮擋問題,需要重新啟動應用程式。";
|
||||||
|
|
||||||
"REPLACE_PREVIOUS_NEXT_BUTTON" = "替換上一個/下一個按鈕";
|
"REPLACE_PREVIOUS_NEXT_BUTTON" = "更換上一個/下一個按鈕";
|
||||||
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "將影片播放器控制介面上的上一個/下一個按鈕替換成快進/快退按鈕。需要重新啟動應用程式。";
|
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "將影片播放器控制介面上的上一個/下一個按鈕替換成快轉/倒轉按鈕,需要重新啟動應用程式。";
|
||||||
|
|
||||||
"FIX_GOOGLE_SIGNIN" = "修復Google帳號登入問題(僅TrollStore用戶有效)";
|
"FIX_GOOGLE_SIGNIN" = "修復 Google 帳號登入問題(僅TrollStore 使用者有效)";
|
||||||
"FIX_GOOGLE_SIGNIN_DESC" = "僅在使用TrollStore安裝本App的情況下生效:啟用本設置後即可正常登錄您的Google帳號。需要重新啟動應用程式。";
|
"FIX_GOOGLE_SIGNIN_DESC" = "僅在使用 TrollStore 安裝此應用程式時有效:啟用本設定後即可正常登入 Google 帳號,需要重新啟動應用程式。";
|
||||||
|
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
|
||||||
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
|
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
|
||||||
@@ -18,40 +18,40 @@
|
|||||||
"YT_MINIPLAYER_DESC" = "例如兒童影片";
|
"YT_MINIPLAYER_DESC" = "例如兒童影片";
|
||||||
|
|
||||||
"CAST_CONFIRM" = "投放前確認 (YTCastConfirm)";
|
"CAST_CONFIRM" = "投放前確認 (YTCastConfirm)";
|
||||||
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止意外攔劫電視。";
|
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止家人幹樵。";
|
||||||
|
|
||||||
"HIDE_HOVER_CARD" = "隱藏片尾畫面懸浮卡片 (YTNoHoverCards)";
|
"HIDE_HOVER_CARD" = "隱藏片尾畫面懸浮卡片 (YTNoHoverCards)";
|
||||||
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面(縮略圖)。";
|
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面。";
|
||||||
|
|
||||||
"NEW_MINIPLAYER_STYLE" = "新的迷你播放器控制列風格 (BigYTMiniPlayer)";
|
"NEW_MINIPLAYER_STYLE" = "迷你播放器 (BigYTMiniPlayer)";
|
||||||
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";
|
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";
|
||||||
|
|
||||||
"YT_RE_EXPLORE" = "用探索選項卡替換Shorts選項卡 (YTReExplore)";
|
"YT_RE_EXPLORE" = "用探索選項卡代替 Shorts 選項卡 (YTReExplore)";
|
||||||
"YT_RE_EXPLORE_DESC" = "需要重新啟動應用程式。";
|
"YT_RE_EXPLORE_DESC" = "需要重新啟動應用程式。";
|
||||||
|
|
||||||
"HIDE_SUBTITLES_BUTTON" = "隱藏字幕按鈕";
|
"HIDE_SUBTITLES_BUTTON" = "隱藏字幕按鈕";
|
||||||
"HIDE_SUBTITLES_BUTTON_DESC" = "隱藏影片控制層中的字幕按鈕。";
|
"HIDE_SUBTITLES_BUTTON_DESC" = "隱藏影片控制層中的字幕按鈕。";
|
||||||
|
|
||||||
"HIDE_AUTOPLAY_SWITCH" = "隱藏自動播放開關";
|
"HIDE_AUTOPLAY_SWITCH" = "隱藏自動播放開關";
|
||||||
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制層中隱藏自動播放開關。";
|
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制中隱藏自動播放開關。";
|
||||||
|
|
||||||
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
|
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
|
||||||
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
|
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
|
||||||
|
|
||||||
"HIDE_HUD_MESSAGES" = "隱藏 HUD 訊息";
|
"HIDE_HUD_MESSAGES" = "隱藏 HUD 訊息";
|
||||||
"HIDE_HUD_MESSAGES_DESC" = "舉例來說:CC字幕 開啟/關閉,影片循環開啟,...";
|
"HIDE_HUD_MESSAGES_DESC" = "例如:CC字幕、開啟/關閉、影片循環開啟等...";
|
||||||
|
|
||||||
"OLED_DARKMODE" = "OLED 深色模式(實驗性)";
|
"OLED_DARKMODE" = "OLED 深色模式(實驗性)";
|
||||||
"OLED_DARKMODE_DESC" = "在某些情況下可能無法正常工作。啟用/禁用此選項後,需要重新啟動應用程式。";
|
"OLED_DARKMODE_DESC" = "在某些情況下無法正常運作。更動此選項後,需要重新啟動應用程式。";
|
||||||
|
|
||||||
"OLED_KEYBOARD" = "OLED 鍵盤(實驗性)";
|
"OLED_KEYBOARD" = "OLED 鍵盤(實驗性)";
|
||||||
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常工作。需要重新啟動應用程式。";
|
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常運作。需要重新啟動應用程式。";
|
||||||
|
|
||||||
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費促銷橫幅";
|
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費橫幅(YTNoPaidPromo)";
|
||||||
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏“包括付費促銷”橫幅。";
|
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏「包括付費促銷」橫幅。";
|
||||||
|
|
||||||
// YTCastConfirm
|
// YTCastConfirm
|
||||||
"CASTING" = "投放中";
|
"CASTING" = "投放中";
|
||||||
"MSG_ARE_YOU_SURE" = "確定要開始投放嗎?";
|
"MSG_ARE_YOU_SURE" = "是否開始投放嗎?";
|
||||||
"MSG_YES" = "確定";
|
"MSG_YES" = "確定";
|
||||||
"MSG_CANCEL" = "取消";
|
"MSG_CANCEL" = "取消";
|
||||||
|
|||||||
+192
-130
@@ -20,6 +20,8 @@
|
|||||||
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
|
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
|
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
|
||||||
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
|
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTAlertView.h"
|
||||||
|
#import "Tweaks/YouTubeHeader/YTIElementRenderer.h"
|
||||||
|
|
||||||
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
|
||||||
NSBundle *uYouPlusBundle() {
|
NSBundle *uYouPlusBundle() {
|
||||||
@@ -187,35 +189,16 @@ BOOL dontEatMyContent() {
|
|||||||
%hook MDXPlaybackRouteButtonController
|
%hook MDXPlaybackRouteButtonController
|
||||||
- (void)didPressButton:(id)arg1 {
|
- (void)didPressButton:(id)arg1 {
|
||||||
if (castConfirm()) {
|
if (castConfirm()) {
|
||||||
UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:LOC(@"CASTING")
|
NSBundle *tweakBundle = uYouPlusBundle();
|
||||||
message:LOC(@"MSG_ARE_YOU_SURE")
|
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
|
||||||
preferredStyle:UIAlertControllerStyleAlert];
|
|
||||||
UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:LOC(@"MSG_YES") style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
|
|
||||||
%orig;
|
%orig;
|
||||||
}];
|
} actionTitle:LOC(@"MSG_YES")];
|
||||||
|
alertView.title = LOC(@"CASTING");
|
||||||
UIAlertAction* noButton = [%c(UIAlertAction)
|
alertView.subtitle = LOC(@"MSG_ARE_YOU_SURE");
|
||||||
actionWithTitle:LOC(@"MSG_CANCEL")
|
[alertView show];
|
||||||
style:UIAlertActionStyleDefault
|
} else {
|
||||||
handler: ^(UIAlertAction * action) {
|
return %orig;
|
||||||
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
|
%end
|
||||||
|
|
||||||
@@ -226,6 +209,29 @@ BOOL dontEatMyContent() {
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// Hide search ads by @PoomSmart - https://github.com/PoomSmart/YouTube-X
|
||||||
|
BOOL didLateHook = NO;
|
||||||
|
|
||||||
|
%group LateHook
|
||||||
|
%hook YTIElementRenderer
|
||||||
|
- (NSData *)elementData {
|
||||||
|
if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData)
|
||||||
|
return nil;
|
||||||
|
return %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTSectionListViewController
|
||||||
|
- (void)loadWithModel:(id)model {
|
||||||
|
if (!didLateHook) {
|
||||||
|
%init(LateHook);
|
||||||
|
didLateHook = YES;
|
||||||
|
}
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
|
||||||
%hook UIResponder
|
%hook UIResponder
|
||||||
%new
|
%new
|
||||||
@@ -261,9 +267,9 @@ BOOL dontEatMyContent() {
|
|||||||
%end
|
%end
|
||||||
|
|
||||||
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
|
||||||
%hook YTHotConfig
|
// %hook YTHotConfig
|
||||||
- (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
|
// - (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
|
||||||
%end
|
// %end
|
||||||
|
|
||||||
// A/B flags
|
// A/B flags
|
||||||
%hook YTColdConfig
|
%hook YTColdConfig
|
||||||
@@ -643,6 +649,16 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
// Sub menu?
|
||||||
|
%hook ELMView
|
||||||
|
- (void)didMoveToWindow {
|
||||||
|
%orig;
|
||||||
|
if (isDarkMode()) {
|
||||||
|
self.subviews[0].backgroundColor = [UIColor clearColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
// iSponsorBlock
|
// iSponsorBlock
|
||||||
%hook SponsorBlockSettingsController
|
%hook SponsorBlockSettingsController
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
@@ -753,6 +769,16 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
|
|||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
|
//
|
||||||
|
%hook YTBackstageCreateRepostDetailView
|
||||||
|
- (void)setBackgroundColor:(UIColor *)color {
|
||||||
|
if (isDarkMode()) {
|
||||||
|
return %orig([UIColor blackColor]);
|
||||||
|
}
|
||||||
|
return %orig;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
// Others
|
// Others
|
||||||
%hook _ASDisplayView
|
%hook _ASDisplayView
|
||||||
- (void)didMoveToWindow {
|
- (void)didMoveToWindow {
|
||||||
@@ -903,166 +929,202 @@ static void replaceTab(YTIGuideResponse *response) {
|
|||||||
%end
|
%end
|
||||||
|
|
||||||
// DontEatMyContent - @therealFoxster: https://github.com/therealFoxster/DontEatMyContent
|
// DontEatMyContent - @therealFoxster: https://github.com/therealFoxster/DontEatMyContent
|
||||||
double aspectRatio = 16/9;
|
static double videoAspectRatio = 16/9;
|
||||||
bool zoomedToFill = false;
|
static bool zoomedToFill = false;
|
||||||
|
static bool engagementPanelIsVisible = false, removeEngagementPanelViewControllerWithIdentifierCalled = false;
|
||||||
|
|
||||||
MLHAMSBDLSampleBufferRenderingView *renderingView;
|
static MLHAMSBDLSampleBufferRenderingView *renderingView;
|
||||||
NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
|
static NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
|
||||||
|
|
||||||
%group gDontEatMyContent
|
%group gDontEatMyContent
|
||||||
|
|
||||||
|
// Retrieve video aspect ratio
|
||||||
|
%hook YTPlayerView
|
||||||
|
- (void)setAspectRatio:(CGFloat)aspectRatio {
|
||||||
|
%orig(aspectRatio);
|
||||||
|
videoAspectRatio = aspectRatio;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
%hook YTPlayerViewController
|
%hook YTPlayerViewController
|
||||||
- (void)viewDidAppear:(BOOL)animated {
|
- (void)viewDidAppear:(BOOL)animated {
|
||||||
YTPlayerView *playerView = [self playerView];
|
YTPlayerView *playerView = [self playerView];
|
||||||
UIView *renderingViewContainer = MSHookIvar<UIView *>(playerView, "_renderingViewContainer");
|
UIView *renderingViewContainer = MSHookIvar<UIView *>(playerView, "_renderingViewContainer");
|
||||||
renderingView = [playerView renderingView];
|
renderingView = [playerView renderingView];
|
||||||
|
|
||||||
CGFloat constant = 23; // Make renderingView a bit larger since safe area has sizeable margins from the notch and side borders; tested on iPhone 13 mini
|
// Making renderingView a bit larger since constraining to safe area leaves a gap between the notch and video
|
||||||
|
CGFloat constant = 24.5; // Tested on iPhone 13 mini
|
||||||
|
|
||||||
widthConstraint = [renderingView.widthAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.widthAnchor constant:constant];
|
widthConstraint = [renderingView.widthAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.widthAnchor constant:constant];
|
||||||
heightConstraint = [renderingView.heightAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.heightAnchor constant:constant];
|
heightConstraint = [renderingView.heightAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.heightAnchor constant:constant];
|
||||||
centerXConstraint = [renderingView.centerXAnchor constraintEqualToAnchor:renderingViewContainer.centerXAnchor];
|
centerXConstraint = [renderingView.centerXAnchor constraintEqualToAnchor:renderingViewContainer.centerXAnchor];
|
||||||
centerYConstraint = [renderingView.centerYAnchor constraintEqualToAnchor:renderingViewContainer.centerYAnchor];
|
centerYConstraint = [renderingView.centerYAnchor constraintEqualToAnchor:renderingViewContainer.centerYAnchor];
|
||||||
|
|
||||||
// playerView.backgroundColor = [UIColor greenColor];
|
// playerView.backgroundColor = [UIColor blueColor];
|
||||||
// renderingViewContainer.backgroundColor = [UIColor redColor];
|
// renderingViewContainer.backgroundColor = [UIColor greenColor];
|
||||||
// renderingView.backgroundColor = [UIColor blueColor];
|
// renderingView.backgroundColor = [UIColor redColor];
|
||||||
|
|
||||||
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
||||||
|
|
||||||
// Must check class since YTInlineMutedPlaybackPlayerOverlayViewController doesn't have -(BOOL)isFullscreen
|
// Must check class since YTInlineMutedPlaybackPlayerOverlayViewController doesn't have -(BOOL)isFullscreen
|
||||||
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] && [activeVideoPlayerOverlay isFullscreen]) {
|
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] // isKindOfClass doesn't work for some reason
|
||||||
activate();
|
&& [activeVideoPlayerOverlay isFullscreen]) {
|
||||||
|
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
|
||||||
} else {
|
} else {
|
||||||
center();
|
DEMC_centerRenderingView();
|
||||||
}
|
}
|
||||||
|
|
||||||
%orig(animated);
|
%orig(animated);
|
||||||
}
|
}
|
||||||
- (void)didPressToggleFullscreen {
|
- (void)didPressToggleFullscreen {
|
||||||
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
|
%orig;
|
||||||
if (![activeVideoPlayerOverlay isFullscreen]) // Entering fullscreen
|
if (![[self activeVideoPlayerOverlay] isFullscreen]) { // Entering full screen
|
||||||
activate();
|
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
|
||||||
else // Exiting fullscreen
|
} else { // Exiting full screen
|
||||||
deactivate();
|
DEMC_deactivate();
|
||||||
|
}
|
||||||
|
|
||||||
%orig;
|
%orig;
|
||||||
}
|
}
|
||||||
- (void)didSwipeToEnterFullscreen { %orig; activate(); }
|
- (void)didSwipeToEnterFullscreen {
|
||||||
- (void)didSwipeToExitFullscreen { %orig; deactivate(); }
|
%orig;
|
||||||
|
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
|
||||||
// Retrieve video aspect ratio (1) (no longer works but kept for backwards compatibility)
|
}
|
||||||
- (void)singleVideo:(id)arg1 aspectRatioDidChange:(CGFloat)arg2 {
|
- (void)didSwipeToExitFullscreen {
|
||||||
%orig(arg1, arg2);
|
%orig;
|
||||||
aspectRatioChanged(arg2);
|
DEMC_deactivate();
|
||||||
|
}
|
||||||
|
// New video played
|
||||||
|
-(void)playbackController:(id)playbackController didActivateVideo:(id)video withPlaybackData:(id)playbackData {
|
||||||
|
%orig(playbackController, video, playbackData);
|
||||||
|
if ([[self activeVideoPlayerOverlay] isFullscreen]) // New video played while in full screen (landscape)
|
||||||
|
// Activate since new videos played in full screen aren't zoomed-to-fill by default
|
||||||
|
// (i.e. the notch/Dynamic Island will cut into content when playing a new video in full screen)
|
||||||
|
DEMC_activate();
|
||||||
|
engagementPanelIsVisible = false;
|
||||||
|
removeEngagementPanelViewControllerWithIdentifierCalled = false;
|
||||||
}
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
// Retrieve video aspect ratio (2) (no longer works but kept for backwards compatibility)
|
// Pinch to zoom
|
||||||
%hook YTVideoZoomOverlayController
|
|
||||||
- (void)resetForVideoWithAspectRatio:(double)arg1 {
|
|
||||||
%orig(arg1);
|
|
||||||
aspectRatioChanged(arg1);
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
// Retrieve video aspect ratio (3)
|
|
||||||
%hook YTPlayerView
|
|
||||||
- (void)setAspectRatio:(CGFloat)arg1 {
|
|
||||||
%orig(arg1);
|
|
||||||
aspectRatioChanged(arg1);
|
|
||||||
// %log((CGFloat) aspectRatio);
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
// Detect pinch gesture (1) (no longer works but kept for backwards compatibility)
|
|
||||||
%hook YTVideoZoomOverlayView
|
|
||||||
- (void)didRecognizePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer {
|
|
||||||
// %log((CGFloat) [pinchGestureRecognizer scale], (CGFloat) [pinchGestureRecognizer velocity]);
|
|
||||||
if ([pinchGestureRecognizer velocity] <= 0.0) { // >>Zoom out<<
|
|
||||||
zoomedToFill = false;
|
|
||||||
activate();
|
|
||||||
} else if ([pinchGestureRecognizer velocity] > 0.0) { // <<Zoom in>>
|
|
||||||
zoomedToFill = true;
|
|
||||||
deactivate();
|
|
||||||
}
|
|
||||||
%orig(pinchGestureRecognizer);
|
|
||||||
}
|
|
||||||
%end
|
|
||||||
|
|
||||||
// Detect pinch gesture (2)
|
|
||||||
%hook YTVideoFreeZoomOverlayView
|
%hook YTVideoFreeZoomOverlayView
|
||||||
- (void)didRecognizePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer {
|
- (void)didRecognizePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer {
|
||||||
if ([pinchGestureRecognizer velocity] <= 0.0) { // >>Zoom out<<
|
DEMC_deactivate();
|
||||||
zoomedToFill = false;
|
|
||||||
activate();
|
|
||||||
} else if ([pinchGestureRecognizer velocity] > 0.0) { // <<Zoom in>>
|
|
||||||
zoomedToFill = true;
|
|
||||||
deactivate();
|
|
||||||
}
|
|
||||||
%orig(pinchGestureRecognizer);
|
%orig(pinchGestureRecognizer);
|
||||||
}
|
}
|
||||||
|
// Detect zoom to fill
|
||||||
|
- (void)showLabelForSnapState:(NSInteger)snapState {
|
||||||
|
if (snapState == 0) { // Original
|
||||||
|
zoomedToFill = false;
|
||||||
|
DEMC_activate();
|
||||||
|
} else if (snapState == 1) { // Zoomed to fill
|
||||||
|
zoomedToFill = true;
|
||||||
|
// No need to deactivate constraints as it's already done in -(void)didRecognizePinch:(UIPinchGestureRecognizer *)
|
||||||
|
}
|
||||||
|
%orig(snapState);
|
||||||
|
}
|
||||||
%end
|
%end
|
||||||
|
|
||||||
%end // gDontEatMyContent
|
// Mini bar dismiss
|
||||||
|
%hook YTWatchMiniBarViewController
|
||||||
|
- (void)dismissMiniBarWithVelocity:(CGFloat)velocity gestureType:(int)gestureType {
|
||||||
|
%orig(velocity, gestureType);
|
||||||
|
zoomedToFill = false; // Setting to false since YouTube undoes zoom-to-fill when mini bar is dismissed
|
||||||
|
}
|
||||||
|
- (void)dismissMiniBarWithVelocity:(CGFloat)velocity gestureType:(int)gestureType skipShouldDismissCheck:(BOOL)skipShouldDismissCheck {
|
||||||
|
%orig(velocity, gestureType, skipShouldDismissCheck);
|
||||||
|
zoomedToFill = false;
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
// DontEatMycontent - detecting device model
|
%hook YTMainAppEngagementPanelViewController
|
||||||
// https://stackoverflow.com/a/11197770/19227228
|
// Engagement panel (comment, description, etc.) about to show up
|
||||||
NSString* deviceName() {
|
- (void)viewWillAppear:(BOOL)animated {
|
||||||
|
if ([self isPeekingSupported]) {
|
||||||
|
// Shorts (only Shorts support peeking, I think)
|
||||||
|
} else {
|
||||||
|
// Everything else
|
||||||
|
engagementPanelIsVisible = true;
|
||||||
|
if ([self isLandscapeEngagementPanel]) {
|
||||||
|
DEMC_deactivate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%orig(animated);
|
||||||
|
}
|
||||||
|
// Engagement panel about to dismiss
|
||||||
|
// - (void)viewDidDisappear:(BOOL)animated { %orig; %log; } // Called too late & isn't reliable so sometimes constraints aren't activated even when engagement panel is closed
|
||||||
|
%end
|
||||||
|
|
||||||
|
%hook YTEngagementPanelContainerViewController
|
||||||
|
// Engagement panel about to dismiss
|
||||||
|
- (void)notifyEngagementPanelContainerControllerWillHideFinalPanel { // Called in time but crashes if plays new video while in full screen causing engagement panel dismissal
|
||||||
|
// Must check if engagement panel was dismissed because new video played
|
||||||
|
// (i.e. if -(void)removeEngagementPanelViewControllerWithIdentifier:(id) was called prior)
|
||||||
|
if (![self isPeekingSupported] && !removeEngagementPanelViewControllerWithIdentifierCalled) {
|
||||||
|
engagementPanelIsVisible = false;
|
||||||
|
if ([self isLandscapeEngagementPanel] && !zoomedToFill) {
|
||||||
|
DEMC_activate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
%orig;
|
||||||
|
}
|
||||||
|
- (void)removeEngagementPanelViewControllerWithIdentifier:(id)identifier {
|
||||||
|
// Usually called when engagement panel is open & new video is played or mini bar is dismissed
|
||||||
|
removeEngagementPanelViewControllerWithIdentifierCalled = true;
|
||||||
|
%orig(identifier);
|
||||||
|
}
|
||||||
|
%end
|
||||||
|
|
||||||
|
%end// group gDontEatMyContent
|
||||||
|
|
||||||
|
BOOL DEMC_deviceIsSupported() {
|
||||||
|
// Get device model identifier (e.g. iPhone14,4)
|
||||||
|
// https://stackoverflow.com/a/11197770/19227228
|
||||||
struct utsname systemInfo;
|
struct utsname systemInfo;
|
||||||
uname(&systemInfo);
|
uname(&systemInfo);
|
||||||
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
NSString *deviceModelID = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
||||||
}
|
|
||||||
|
|
||||||
BOOL deviceIsSupported() {
|
NSArray *unsupportedModelIDs = DEMC_UNSUPPORTED_DEVICES;
|
||||||
NSString *identifier = deviceName();
|
for (NSString *identifier in unsupportedModelIDs) {
|
||||||
NSArray *unsupportedDevices = UNSUPPORTED_DEVICES;
|
if ([deviceModelID isEqualToString:identifier]) {
|
||||||
|
|
||||||
for (NSString *device in unsupportedDevices) {
|
|
||||||
if ([device isEqualToString:identifier]) {
|
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([identifier containsString:@"iPhone"]) {
|
if ([deviceModelID containsString:@"iPhone"]) {
|
||||||
NSString *model = [identifier stringByReplacingOccurrencesOfString:@"iPhone" withString:@""];
|
if ([deviceModelID isEqualToString:@"iPhone13,1"]) {
|
||||||
model = [model stringByReplacingOccurrencesOfString:@"," withString:@"."];
|
// iPhone 12 mini
|
||||||
if ([identifier isEqualToString:@"iPhone13,1"]) { // iPhone 12 mini
|
|
||||||
return YES;
|
return YES;
|
||||||
} else if ([model floatValue] >= 14.0) { // iPhone 13 series and newer
|
|
||||||
return YES;
|
|
||||||
} else return NO;
|
|
||||||
} else return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
void aspectRatioChanged(CGFloat arg) {
|
|
||||||
aspectRatio = arg;
|
|
||||||
if (aspectRatio == 0.0) {
|
|
||||||
// App backgrounded or something went wrong
|
|
||||||
} else if (aspectRatio < THRESHOLD) {
|
|
||||||
deactivate();
|
|
||||||
} else {
|
|
||||||
activate();
|
|
||||||
}
|
}
|
||||||
|
NSString *modelNumber = [[deviceModelID stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] stringByReplacingOccurrencesOfString:@"," withString:@"."];
|
||||||
|
if ([modelNumber floatValue] >= 14.0) {
|
||||||
|
// iPhone 13 series and newer
|
||||||
|
return YES;
|
||||||
|
} else return NO;
|
||||||
|
} else return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
void activate() {
|
void DEMC_activate() {
|
||||||
if (aspectRatio < THRESHOLD || zoomedToFill) return;
|
if (videoAspectRatio < DEMC_THRESHOLD) {
|
||||||
|
DEMC_deactivate();
|
||||||
|
return;
|
||||||
|
}
|
||||||
// NSLog(@"activate");
|
// NSLog(@"activate");
|
||||||
center();
|
DEMC_centerRenderingView();
|
||||||
renderingView.translatesAutoresizingMaskIntoConstraints = NO;
|
renderingView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
widthConstraint.active = YES;
|
widthConstraint.active = YES;
|
||||||
heightConstraint.active = YES;
|
heightConstraint.active = YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
void deactivate() {
|
void DEMC_deactivate() {
|
||||||
// NSLog(@"deactivate");
|
// NSLog(@"deactivate");
|
||||||
center();
|
DEMC_centerRenderingView();
|
||||||
renderingView.translatesAutoresizingMaskIntoConstraints = YES;
|
renderingView.translatesAutoresizingMaskIntoConstraints = YES;
|
||||||
widthConstraint.active = NO;
|
widthConstraint.active = NO;
|
||||||
heightConstraint.active = NO;
|
heightConstraint.active = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
void center() {
|
void DEMC_centerRenderingView() {
|
||||||
centerXConstraint.active = YES;
|
centerXConstraint.active = YES;
|
||||||
centerYConstraint.active = YES;
|
centerYConstraint.active = YES;
|
||||||
}
|
}
|
||||||
@@ -1172,7 +1234,7 @@ static BOOL didFinishLaunching;
|
|||||||
if (replacePreviousAndNextButton()) {
|
if (replacePreviousAndNextButton()) {
|
||||||
%init(gReplacePreviousAndNextButton);
|
%init(gReplacePreviousAndNextButton);
|
||||||
}
|
}
|
||||||
if (dontEatMyContent() && deviceIsSupported()) {
|
if (dontEatMyContent() && DEMC_deviceIsSupported()) {
|
||||||
%init(gDontEatMyContent);
|
%init(gDontEatMyContent);
|
||||||
}
|
}
|
||||||
if (@available(iOS 16, *)) {
|
if (@available(iOS 16, *)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user