Compare commits

...
Author SHA1 Message Date
qnblackcat 82de8d62ac v17.48.2-2.1 2022-12-12 09:28:46 +07:00
qnblackcat 881d6292aa Hide search ads by @PoomSmart 2022-12-12 09:28:11 +07:00
Nguyễn Đạt 1150659ea1 Merge pull request #754 from qnblackcat/3503754715
[Auto-generated] Submodule Updates 3503754715
2022-12-12 02:18:28 +07:00
github-actions a61882280e updating submodules 2022-12-11 19:17:36 +00:00
Nguyễn Đạt 5aec68985f Merge pull request #753 from qnblackcat/3503754715
[Auto-generated] Submodule Updates 3503754715
2022-12-12 00:57:51 +07:00
github-actions 37bbbbf369 updating submodules 2022-12-11 17:57:37 +00:00
Nguyễn Đạt 33deba766a Merge pull request #695 from olivertzeng/patch-1
update
2022-12-11 11:47:48 +07:00
Oliver Tzeng 1f3707a3f2 done 2022-12-11 11:20:06 +08:00
Nguyễn Đạt 396515d600 Merge pull request #747 from qnblackcat/3503754715
[Auto-generated] Submodule Updates 3503754715
2022-12-10 12:27:20 +07:00
github-actions a61405c3fb updating submodules 2022-12-10 05:25:59 +00:00
Nguyễn Đạt 76837d0ce7 Merge pull request #731 from qnblackcat/3503754715
[Auto-generated] Submodule Updates 3503754715
2022-12-04 21:05:19 +07:00
github-actions 5475c77d52 updating submodules 2022-12-04 14:04:25 +00:00
Nguyễn Đạt e81e6ff159 Merge pull request #723 from qnblackcat/3503754715
[Auto-generated] Submodule Updates 3503754715
2022-11-30 21:18:50 +07:00
github-actions d6694e4e14 updating submodules 2022-11-30 14:18:17 +00:00
qnblackcat 90cd7cd3dd improvements 2022-11-30 21:16:59 +07:00
Nguyễn Đạt dc53dd2578 Merge pull request #720 from yodaluca23/patch-2
Minor changes to bug template
2022-11-29 07:34:34 +07:00
Nguyễn Đạt bd37e43070 Update bug.md 2022-11-29 07:34:00 +07:00
Luca LeBlanc 544f6b57c4 Update bug.md 2022-11-28 18:20:30 -06:00
Luca LeBlanc 43984cc2a6 Minor changes to bug template
Minor changes to the bug template, including clarification of where the title goes as I have seen lots of people change the name of their issue after the original creation.
2022-11-28 17:40:22 -06:00
Nguyễn Đạt 5bfc931a02 Merge pull request #701 from arichorn/patch-1
Update buildapp.yml dependences
2022-11-26 19:35:38 +07:00
Aric 2e2c364b44 Update dependences
also removes Deprecation Errors
2022-11-23 13:55:32 -06:00
Nguyễn Đạt 3e63708ac8 Merge pull request #697 from qnblackcat/3503754715
[Auto-generated] Submodule Updates 3503754715
2022-11-19 20:45:25 +07:00
github-actions fd603e902c updating submodules 2022-11-19 13:44:58 +00:00
Oliver Tzeng f9de2d7b8d update
improvements
2022-11-19 09:52:42 +08:00
Nguyễn Đạt 49ace6eb4d Merge pull request #680 from therealFoxster/main
Update DontEatMyContent (v1.0.4 -> v1.0.5)
2022-11-16 06:39:17 +07:00
foxster-mp4 c42d2b85c9 Update DontEatMyContent (v1.0.4 -> v1.0.5)
Fix engagement panel layout in full screen (check when engagement panel is presented/dismissed and activate/deactivate tweak accordingly)

Use different (proper) method to detect new video played

Refactored
2022-11-15 10:48:36 -08:00
Nguyễn Đạt 880f92f2f6 Merge pull request #674 from qnblackcat/3272866751
[Auto-generated] Submodule Updates 3272866751
2022-11-14 20:58:55 +07:00
github-actions 4387a27214 updating submodules 2022-11-14 13:58:25 +00:00
qnblackcat aed43dc389 edit bundle name/ app name 2022-11-12 20:47:03 +07:00
Nguyễn Đạt 9edcd82315 Merge pull request #670 from therealFoxster/main
Update DontEatMyContent (1.0.3 -> 1.0.4)
2022-11-12 15:35:32 +07:00
foxster-mp4 acc86a1bf6 Update DontEatMyContent (1.0.3 -> 1.0.4)
Compatible with YouTube's pinch-to-zoom feature

Fix crash due to dangly constraint

Better zoomed-to-fill detection

Bye bye backwards compatibility (remove old code that was kept to support older YouTube versions)

Rename & add prefix to functions
2022-11-11 22:04:25 -08:00
Nguyễn Đạt 635b0673b4 Merge pull request #655 from dayanch96/patch-3
Change CastConfirm's alert to YTAlertView
2022-11-12 08:44:40 +07:00
Nguyễn Đạt 6b60f22eaf Update README.md 2022-11-07 21:44:31 +07:00
Nguyễn Đạt 65fd05f5db Update README.md 2022-11-07 21:43:12 +07:00
dayanch96 908caaf047 fixed bundle name 2022-11-07 04:28:16 +02:00
dayanch96 276ce261a5 Change CastConfirm's alert to YTAlertView 2022-11-07 04:25:53 +02:00
Nguyễn Đạt da03ae08a6 Merge pull request #652 from qnblackcat/3272866751
[Auto-generated] Submodule Updates 3272866751
2022-11-06 16:47:42 +07:00
github-actions 2f9b656acd updating submodules 2022-11-06 09:47:18 +00:00
Nguyễn Đạt 9c8486d017 No more hacky fix 2022-11-06 16:46:27 +07:00
qnblackcat e71069e678 fix compiling 2022-11-06 15:06:09 +07:00
qnblackcat 0e1e6d4396 v17.43.1-2.1 2022-11-06 11:22:41 +07:00
qnblackcat 6b3026159c clean up 2022-11-06 11:22:31 +07:00
qnblackcat 8aff0035ac Temporarily disable YTNoCheckLocalNetwork 2022-11-06 11:22:22 +07:00
qnblackcat b846e6e45e update Header.h 2022-11-06 11:22:04 +07:00
14 changed files with 318 additions and 204 deletions
+3 -3
View File
@@ -1,13 +1,13 @@
---
name: Bug
about: Make sure you complete the template. Otherwise, it will be closed without further explanation!
title: "[Bug]"
title: "[Bug] (Replace this with your title)"
labels: bug
assignees: ''
---
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the FAQ page first!!! ⚠️
## ⚠️ Have you read the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ)? Make sure you visit the [FAQ](https://github.com/qnblackcat/uYouPlus/wiki/FAQ) page first!!! ⚠️
_Make sure you complete the template. Otherwise, it will be closed without further explanation!_
@@ -24,7 +24,7 @@ _Make sure you complete the template. Otherwise, it will be closed without furth
_(Please attach videos or screenshots if possible)_
### Crash log (if possible)
_(The crash log can be found in the Settings app > Privacy > Analytics & Improvements > Analytics Data > Youtube...)_
_(The crash log can be found in your device's Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips)_
### Are you using the newest version of uYouPlus? If not, why?
_(Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the latest version before reporting about an issue???)_
+25 -10
View File
@@ -21,6 +21,16 @@ on:
default: ""
required: true
type: string
bundle_id:
description: "Modify the bundle ID. Not recommended"
default: "com.google.ios.youtube"
required: true
type: string
app_name:
description: "Modify the name of the app on the Home Screen. Not recommended"
default: "YouTube"
required: true
type: string
create_release:
description: "Create a draft release"
default: true
@@ -90,12 +100,12 @@ jobs:
- name: Download uYou & Prepare YouTube iPA
run: |
curl "https://raw.githubusercontent.com/Muirey03/RemoteLog/master/RemoteLog.h" --output "$THEOS/include/RemoteLog.h"
curl "https://miro92.com/repo/debs/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" --output "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb"
wget "$YOUTUBE_URL" --no-verbose -O ./main/YouTube.ipa
dpkg-deb -x "./main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" ./main/Tweaks/uYou/
unzip -q ./main/YouTube.ipa -d ./main/tmp
rm -rf ./main/tmp/Payload/YouTube.app/PlugIns/*
cp -R ./main/Extensions/*.appex ./main/tmp/Payload/YouTube.app/PlugIns
curl "https://miro92.com/repo/debs/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" --output "main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb"
wget "$YOUTUBE_URL" --no-verbose -O main/YouTube.ipa
dpkg-deb -x "main/Tweaks/uYou/com.miro.uyou_${{ env.UYOU_VERSION }}_iphoneos-arm.deb" main/Tweaks/uYou/
unzip -q main/YouTube.ipa -d main/tmp
rm -rf main/tmp/Payload/YouTube.app/PlugIns/*
cp -R main/Extensions/*.appex main/tmp/Payload/YouTube.app/PlugIns
env:
THEOS: ${{ github.workspace }}/theos
@@ -107,15 +117,20 @@ jobs:
run: |
(echo 'THEOS_IGNORE_PARALLEL_BUILDING_NOTICE = yes' >> ~/.theosrc)
cd ${{ github.workspace }}/main
(cd ${{ github.workspace }}/main/Tweaks/YouPiP && sed -i '' "14s/$/ AVFoundation UIKit/" Makefile)
(cd ${{ github.workspace }}/main/Tweaks/YTABConfig && sed -i '' "12s#.*#YTABConfig_FRAMEWORKS = UIKit#g" Makefile)
sed -i '' "12s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
sed -i '' "11s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
make package FINALPACKAGE=1
(mv "packages/$(ls -t packages | head -n1)" "packages/uYouPlus_${{ env.YOUTUBE_VERSION }}_${{ env.UYOU_VERSION }}.ipa")
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"
echo -e "==> \033[1mBundle ID: ${{ env.BUNDLE_ID }}\033[0m"
env:
THEOS: ${{ github.workspace }}/theos
UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
BUNDLE_ID: ${{ inputs.bundle_id }}
APP_NAME: ${{ inputs.app_name }}
- name: Upload Artifact
uses: actions/upload-artifact@v3
@@ -129,7 +144,7 @@ jobs:
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v0.1.14
uses: softprops/action-gh-release@v0.1.15
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
UYOU_VERSION: ${{ inputs.uyou_version }}
@@ -138,5 +153,5 @@ jobs:
with:
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
name: v${{ env.YOUTUBE_VERSION }}-${{ env.UYOU_VERSION }}-(${{ github.run_number }})
files: ./main/packages/*.ipa
files: main/packages/*.ipa
draft: ${{ env.DRAFT }}
+25 -15
View File
@@ -4,8 +4,8 @@
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define YT_BUNDLE_ID @"com.google.ios.youtube"
#define YT_NAME @"YouTube"
#define UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
#define THRESHOLD 1.99 // DontEatMycontent
#define DEMC_UNSUPPORTED_DEVICES @[@"iPhone14,3", @"iPhone14,6", @"iPhone14,8"] // DontEatMycontent
#define DEMC_THRESHOLD 1.99 // DontEatMycontent
#define DEFAULT_RATE 2.0f // YTSpeed
// IAmYouTube
@@ -42,26 +42,33 @@
@end
// DontEatMyContent
NSString* deviceName();
void aspectRatioChanged(CGFloat arg);
BOOL deviceIsSupported();
void activate();
void deactivate();
void center();
BOOL DEMC_deviceIsSupported();
void DEMC_activate();
void DEMC_deactivate();
void DEMC_centerRenderingView();
@interface YTPlayerView : UIView
- (BOOL)zoomToFill;
- (id)renderingView;
- (id)playerView;
@end
@interface MLHAMSBDLSampleBufferRenderingView : UIView
@end
@interface YTMainAppVideoPlayerOverlayViewController : UIViewController
- (BOOL)isFullscreen;
- (id)videoPlayerOverlayView;
- (id)activeVideoPlayerOverlay;
@end
@interface HAMSBDLSampleBufferRenderingView : UIView
@end
@interface MLHAMSBDLSampleBufferRenderingView : HAMSBDLSampleBufferRenderingView
@end
@interface YTMainAppEngagementPanelViewController : UIViewController
- (BOOL)isLandscapeEngagementPanel;
- (BOOL)isPeekingSupported;
@end
@interface YTEngagementPanelContainerViewController : UIViewController
- (BOOL)isLandscapeEngagementPanel;
- (BOOL)isPeekingSupported;
@end
// YTSpeed
@@ -130,6 +137,9 @@ void center();
@end
// OLED Darkmode
@interface ELMView : UIView
@end
@interface ASWAppSwitcherCollectionViewCell : UIView
@end
+2 -2
View File
@@ -5,7 +5,7 @@ ARCHS = arm64
MODULES = jailed
FINALPACKAGE = 1
CODESIGN_IPA = 0
PACKAGE_VERSION = 17.42.7_2.1
PACKAGE_VERSION = 17.48.2_2.1
TWEAK_NAME = uYouPlus
DISPLAY_NAME = YouTube
@@ -13,7 +13,7 @@ BUNDLE_ID = com.google.ios.youtube
uYouPlus_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib
uYouPlus_FILES = uYouPlus.xm Settings.xm
uYouPlus_IPA = ./tmp/Payload/YouTube.app
uYouPlus_IPA = tmp/Payload/YouTube.app
uYouPlus_FRAMEWORKS = UIKit Security
uYouPlus_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION)
+32 -8
View File
@@ -1,4 +1,28 @@
![IMG_2196](https://user-images.githubusercontent.com/52943116/189822859-8a0952db-9264-4b5b-9cbe-d0a87b2db5a0.PNG)
***
<p align="center">
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
<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
@@ -160,37 +184,37 @@
- 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>
<summary>Expand ️</summary>
| **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 | ✖︎ |
| [Open in YouTube](https://github.com/CokePokes/YoutubeExtensions) | [CokePokes](https://github.com/CokePokes) | 1.2 | ✖︎ |
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
| **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
| **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
| **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.2 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.5 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
| **YTSpeed** | [Lyvendia](https://github.com/Lyvendia) | 1.0.1 | [✔︎](https://github.com/Lyvendia/YTSpeed) |
| **YTCastConfirm** | [JamieBerghmans](https://github.com/JamieBerghmans) | 1.0.0 | [✔︎](https://github.com/JamieBerghmans/YTCastConfirm) |
| **Alderis Color Picker** | [HASHBANG Productions](https://github.com/hbang) | 1.2| [✔︎](https://github.com/hbang/Alderis) |
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.4 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.14 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.4-2 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.15-2 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.4.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) |
| **NoYTPremium** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
| **YTNoPaidPromo** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
| **YTAutoFullScreen** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
| **YTShortsProgress** | [PoomSmart](https://twitter.com/poomsmart) | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
| **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) |
</details>
+15 -12
View File
@@ -22,31 +22,34 @@ else
fi
# Makefile
if [ -d ./tmp ]
if [ -d tmp ]
then
rm -rf ./tmp
rm -rf tmp
fi
read -e -p "==> Path to the decrypted YouTube.ipa or YouTube.app: " PATHTOYT
if [[ $PATHTOYT == *.ipa ]]
then
unzip -q "$PATHTOYT" -d ./tmp
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
unzip -q "$PATHTOYT" -d tmp
rm -rf tmp/Payload/YouTube.app/_CodeSignature/CodeResources
rm -rf tmp/Payload/YouTube.app/PlugIns/*.appex
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
make package
open ./packages
make package FINALPACKAGE=1
open packages
elif [[ $PATHTOYT == *.app ]]
then
mkdir -p ./tmp/Payload/
cp -R "$PATHTOYT" ./tmp/Payload 2>/dev/null
rm -rf ./tmp/Payload/YouTube.app/PlugIns/*.appex
mkdir -p tmp/Payload/
cp -R "$PATHTOYT" tmp/Payload 2>/dev/null
rm -rf tmp/Payload/YouTube.app/_CodeSignature/CodeResources
rm -rf tmp/Payload/YouTube.app/PlugIns/*.appex
cp -R Extensions/*.appex tmp/Payload/YouTube.app/PlugIns
make package
open ./packages
make package FINALPACKAGE=1
open packages
else
echo "This is not an ipa/app!"
fi
# Clean up
tput setaf 1 && echo -e "==> \033[1mCleaning up...\033[0m"
find Tweaks/uYou -mindepth 1 ! -name "com.miro.uyou_2.1_iphoneos-arm.deb" ! -name ".gitkeep" -exec rm -rf {} \; 2>/dev/null
rm -rf tmp/ Resources .theos/_/Payload
rm -rf tmp/ Resources .theos/_/Payload
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa)\033[0m"
@@ -1,15 +1,15 @@
// Settings
"VERSION" = "您的uYouPlus版本為: %@";
"VERSION_CHECK" = "點擊查看最新版本!";
"VERSION" = "uYouPlus 版本為: %@";
"VERSION_CHECK" = "查看最新版本";
"DONT_EAT_MY_CONTENT" = "2:1影片瀏海/動態島優化 DontEatMyContent";
"DONT_EAT_MY_CONTENT_DESC" = "改進部分機型的瀏海區域動態島在2:1比例影片中引發的遮擋問題需要重新啟動應用程式。";
"DONT_EAT_MY_CONTENT" = "2:1 影片瀏海/動態島優化(DontEatMyContent";
"DONT_EAT_MY_CONTENT_DESC" = "改進部分機型的瀏海區域/動態島在 2:1 影片中的遮擋問題需要重新啟動應用程式。";
"REPLACE_PREVIOUS_NEXT_BUTTON" = "換上一個/下一個按鈕";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "將影片播放器控制介面上的上一個/下一個按鈕替換成快進/快退按鈕需要重新啟動應用程式。";
"REPLACE_PREVIOUS_NEXT_BUTTON" = "換上一個/下一個按鈕";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "將影片播放器控制介面上的上一個/下一個按鈕替換成快轉/倒轉按鈕需要重新啟動應用程式。";
"FIX_GOOGLE_SIGNIN" = "修復Google帳號登入問題(僅TrollStore用戶有效)";
"FIX_GOOGLE_SIGNIN_DESC" = "僅在使用TrollStore安裝本App的情況下生效:啟用本設後即可正常登錄您的Google帳號需要重新啟動應用程式。";
"FIX_GOOGLE_SIGNIN" = "修復 Google 帳號登入問題(僅TrollStore 使用者有效)";
"FIX_GOOGLE_SIGNIN_DESC" = "僅在使用 TrollStore 安裝此應用程式時有效:啟用本設後即可正常登Google 帳號需要重新啟動應用程式。";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "隱藏上一個和下一個按鈕";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "在影片控制層中隱藏上一個和下一個按鈕";
@@ -18,40 +18,40 @@
"YT_MINIPLAYER_DESC" = "例如兒童影片";
"CAST_CONFIRM" = "投放前確認 (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止意外攔劫電視。";
"CAST_CONFIRM_DESC" = "在投放前顯示確認訊息,以防止家人幹樵。";
"HIDE_HOVER_CARD" = "隱藏片尾畫面懸浮卡片 (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面(縮略圖)。";
"HIDE_HOVER_CARD_DESC" = "在影片結尾隱藏創作者結束畫面。";
"NEW_MINIPLAYER_STYLE" = "新的迷你播放器控制列風格 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE" = "迷你播放器 (BigYTMiniPlayer)";
"NEW_MINIPLAYER_STYLE_DESC" = "需要重新啟動應用程式。";
"YT_RE_EXPLORE" = "用探索選項卡替換Shorts選項卡 (YTReExplore)";
"YT_RE_EXPLORE" = "用探索選項卡代替 Shorts 選項卡 (YTReExplore)";
"YT_RE_EXPLORE_DESC" = "需要重新啟動應用程式。";
"HIDE_SUBTITLES_BUTTON" = "隱藏字幕按鈕";
"HIDE_SUBTITLES_BUTTON_DESC" = "隱藏影片控制層中的字幕按鈕。";
"HIDE_AUTOPLAY_SWITCH" = "隱藏自動播放開關";
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制中隱藏自動播放開關。";
"HIDE_AUTOPLAY_SWITCH_DESC" = "在影片控制中隱藏自動播放開關。";
"AUTO_FULLSCREEN" = "自動全螢幕 (YTAutoFullScreen)";
"AUTO_FULLSCREEN_DESC" = "自動全螢幕播放影片。";
"HIDE_HUD_MESSAGES" = "隱藏 HUD 訊息";
"HIDE_HUD_MESSAGES_DESC" = "舉例來說CC字幕 開啟/關閉影片循環開啟...";
"HIDE_HUD_MESSAGES_DESC" = "例如CC字幕開啟/關閉影片循環開啟...";
"OLED_DARKMODE" = "OLED 深色模式(實驗性)";
"OLED_DARKMODE_DESC" = "在某些情況下可能無法正常作。啟用/禁用此選項後,需要重新啟動應用程式。";
"OLED_DARKMODE_DESC" = "在某些情況下無法正常作。更動此選項後,需要重新啟動應用程式。";
"OLED_KEYBOARD" = "OLED 鍵盤(實驗性)";
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常作。需要重新啟動應用程式。";
"OLED_KEYBOARD_DESC" = "在某些情況下可能無法正常作。需要重新啟動應用程式。";
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費促銷橫幅";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏包括付費促銷橫幅。";
"HIDE_PAID_PROMOTION_CARDS" = "隱藏付費橫幅YTNoPaidPromo";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "在某些影片中隱藏包括付費促銷橫幅。";
// YTCastConfirm
"CASTING" = "投放中";
"MSG_ARE_YOU_SURE" = "確定要開始投放嗎?";
"MSG_ARE_YOU_SURE" = "是否開始投放嗎?";
"MSG_YES" = "確定";
"MSG_CANCEL" = "取消";
+191 -129
View File
@@ -20,6 +20,8 @@
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTAlertView.h"
#import "Tweaks/YouTubeHeader/YTIElementRenderer.h"
// Tweak's bundle for Localizations support - @PoomSmart - https://github.com/PoomSmart/YouPiP/commit/aea2473f64c75d73cab713e1e2d5d0a77675024f
NSBundle *uYouPlusBundle() {
@@ -187,35 +189,16 @@ BOOL dontEatMyContent() {
%hook MDXPlaybackRouteButtonController
- (void)didPressButton:(id)arg1 {
if (castConfirm()) {
UIAlertController* alertController = [%c(UIAlertController) alertControllerWithTitle:LOC(@"CASTING")
message:LOC(@"MSG_ARE_YOU_SURE")
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [%c(UIAlertAction) actionWithTitle:LOC(@"MSG_YES") style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
NSBundle *tweakBundle = uYouPlusBundle();
YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{
%orig;
}];
UIAlertAction* noButton = [%c(UIAlertAction)
actionWithTitle:LOC(@"MSG_CANCEL")
style:UIAlertActionStyleDefault
handler: ^(UIAlertAction * action) {
return;
}];
[alertController addAction:defaultAction];
[alertController addAction:noButton];
id rootViewController = [%c(UIApplication) sharedApplication].delegate.window.rootViewController;
if ([rootViewController isKindOfClass:[%c(UINavigationController) class]]) {
rootViewController = ((UINavigationController *)rootViewController).viewControllers.firstObject;
}
if ([rootViewController isKindOfClass:[%c(UITabBarController) class]]) {
rootViewController = ((UITabBarController *)rootViewController).selectedViewController;
}
if ([rootViewController presentedViewController] != nil) {
rootViewController = [rootViewController presentedViewController];
}
[rootViewController presentViewController:alertController animated:YES completion:nil];
} else { return %orig; }
} actionTitle:LOC(@"MSG_YES")];
alertView.title = LOC(@"CASTING");
alertView.subtitle = LOC(@"MSG_ARE_YOU_SURE");
[alertView show];
} else {
return %orig;
}
}
%end
@@ -226,6 +209,29 @@ BOOL dontEatMyContent() {
}
%end
// Hide search ads by @PoomSmart - https://github.com/PoomSmart/YouTube-X
BOOL didLateHook = NO;
%group LateHook
%hook YTIElementRenderer
- (NSData *)elementData {
if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData)
return nil;
return %orig;
}
%end
%end
%hook YTSectionListViewController
- (void)loadWithModel:(id)model {
if (!didLateHook) {
%init(LateHook);
didLateHook = YES;
}
%orig;
}
%end
// Workaround for https://github.com/MiRO92/uYou-for-YouTube/issues/94
%hook UIResponder
%new
@@ -261,9 +267,9 @@ BOOL dontEatMyContent() {
%end
// YTNoCheckLocalNetwork: https://poomsmart.github.io/repo/depictions/ytnochecklocalnetwork.html
%hook YTHotConfig
- (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
%end
// %hook YTHotConfig
// - (BOOL)isPromptForLocalNetworkPermissionsEnabled { return NO; }
// %end
// A/B flags
%hook YTColdConfig
@@ -643,6 +649,16 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
}
%end
// Sub menu?
%hook ELMView
- (void)didMoveToWindow {
%orig;
if (isDarkMode()) {
self.subviews[0].backgroundColor = [UIColor clearColor];
}
}
%end
// iSponsorBlock
%hook SponsorBlockSettingsController
- (void)viewDidLoad {
@@ -753,6 +769,16 @@ UIColor* raisedColor = [UIColor colorWithRed:0.035 green:0.035 blue:0.035 alpha:
}
%end
//
%hook YTBackstageCreateRepostDetailView
- (void)setBackgroundColor:(UIColor *)color {
if (isDarkMode()) {
return %orig([UIColor blackColor]);
}
return %orig;
}
%end
// Others
%hook _ASDisplayView
- (void)didMoveToWindow {
@@ -903,166 +929,202 @@ static void replaceTab(YTIGuideResponse *response) {
%end
// DontEatMyContent - @therealFoxster: https://github.com/therealFoxster/DontEatMyContent
double aspectRatio = 16/9;
bool zoomedToFill = false;
static double videoAspectRatio = 16/9;
static bool zoomedToFill = false;
static bool engagementPanelIsVisible = false, removeEngagementPanelViewControllerWithIdentifierCalled = false;
MLHAMSBDLSampleBufferRenderingView *renderingView;
NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
static MLHAMSBDLSampleBufferRenderingView *renderingView;
static NSLayoutConstraint *widthConstraint, *heightConstraint, *centerXConstraint, *centerYConstraint;
%group gDontEatMyContent
// Retrieve video aspect ratio
%hook YTPlayerView
- (void)setAspectRatio:(CGFloat)aspectRatio {
%orig(aspectRatio);
videoAspectRatio = aspectRatio;
}
%end
%hook YTPlayerViewController
- (void)viewDidAppear:(BOOL)animated {
YTPlayerView *playerView = [self playerView];
UIView *renderingViewContainer = MSHookIvar<UIView *>(playerView, "_renderingViewContainer");
renderingView = [playerView renderingView];
CGFloat constant = 23; // Make renderingView a bit larger since safe area has sizeable margins from the notch and side borders; tested on iPhone 13 mini
// Making renderingView a bit larger since constraining to safe area leaves a gap between the notch and video
CGFloat constant = 24.5; // Tested on iPhone 13 mini
widthConstraint = [renderingView.widthAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.widthAnchor constant:constant];
heightConstraint = [renderingView.heightAnchor constraintEqualToAnchor:renderingViewContainer.safeAreaLayoutGuide.heightAnchor constant:constant];
centerXConstraint = [renderingView.centerXAnchor constraintEqualToAnchor:renderingViewContainer.centerXAnchor];
centerYConstraint = [renderingView.centerYAnchor constraintEqualToAnchor:renderingViewContainer.centerYAnchor];
// playerView.backgroundColor = [UIColor greenColor];
// renderingViewContainer.backgroundColor = [UIColor redColor];
// renderingView.backgroundColor = [UIColor blueColor];
// playerView.backgroundColor = [UIColor blueColor];
// renderingViewContainer.backgroundColor = [UIColor greenColor];
// renderingView.backgroundColor = [UIColor redColor];
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
// Must check class since YTInlineMutedPlaybackPlayerOverlayViewController doesn't have -(BOOL)isFullscreen
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] && [activeVideoPlayerOverlay isFullscreen]) {
activate();
if ([NSStringFromClass([activeVideoPlayerOverlay class]) isEqualToString:@"YTMainAppVideoPlayerOverlayViewController"] // isKindOfClass doesn't work for some reason
&& [activeVideoPlayerOverlay isFullscreen]) {
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
} else {
center();
DEMC_centerRenderingView();
}
%orig(animated);
}
- (void)didPressToggleFullscreen {
YTMainAppVideoPlayerOverlayViewController *activeVideoPlayerOverlay = [self activeVideoPlayerOverlay];
if (![activeVideoPlayerOverlay isFullscreen]) // Entering fullscreen
activate();
else // Exiting fullscreen
deactivate();
- (void)didPressToggleFullscreen {
%orig;
if (![[self activeVideoPlayerOverlay] isFullscreen]) { // Entering full screen
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
} else { // Exiting full screen
DEMC_deactivate();
}
%orig;
}
- (void)didSwipeToEnterFullscreen { %orig; activate(); }
- (void)didSwipeToExitFullscreen { %orig; deactivate(); }
// Retrieve video aspect ratio (1) (no longer works but kept for backwards compatibility)
- (void)singleVideo:(id)arg1 aspectRatioDidChange:(CGFloat)arg2 {
%orig(arg1, arg2);
aspectRatioChanged(arg2);
- (void)didSwipeToEnterFullscreen {
%orig;
if (!zoomedToFill && !engagementPanelIsVisible) DEMC_activate();
}
- (void)didSwipeToExitFullscreen {
%orig;
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
// Retrieve video aspect ratio (2) (no longer works but kept for backwards compatibility)
%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)
// Pinch to zoom
%hook YTVideoFreeZoomOverlayView
- (void)didRecognizePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer {
if ([pinchGestureRecognizer velocity] <= 0.0) { // >>Zoom out<<
zoomedToFill = false;
activate();
} else if ([pinchGestureRecognizer velocity] > 0.0) { // <<Zoom in>>
zoomedToFill = true;
deactivate();
}
DEMC_deactivate();
%orig(pinchGestureRecognizer);
}
// 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 // 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
// https://stackoverflow.com/a/11197770/19227228
NSString* deviceName() {
%hook YTMainAppEngagementPanelViewController
// Engagement panel (comment, description, etc.) about to show up
- (void)viewWillAppear:(BOOL)animated {
if ([self isPeekingSupported]) {
// Shorts (only Shorts support peeking, I think)
} else {
// Everything else
engagementPanelIsVisible = true;
if ([self isLandscapeEngagementPanel]) {
DEMC_deactivate();
}
}
%orig(animated);
}
// Engagement panel about to dismiss
// - (void)viewDidDisappear:(BOOL)animated { %orig; %log; } // Called too late & isn't reliable so sometimes constraints aren't activated even when engagement panel is closed
%end
%hook YTEngagementPanelContainerViewController
// Engagement panel about to dismiss
- (void)notifyEngagementPanelContainerControllerWillHideFinalPanel { // Called in time but crashes if plays new video while in full screen causing engagement panel dismissal
// Must check if engagement panel was dismissed because new video played
// (i.e. if -(void)removeEngagementPanelViewControllerWithIdentifier:(id) was called prior)
if (![self isPeekingSupported] && !removeEngagementPanelViewControllerWithIdentifierCalled) {
engagementPanelIsVisible = false;
if ([self isLandscapeEngagementPanel] && !zoomedToFill) {
DEMC_activate();
}
}
%orig;
}
- (void)removeEngagementPanelViewControllerWithIdentifier:(id)identifier {
// Usually called when engagement panel is open & new video is played or mini bar is dismissed
removeEngagementPanelViewControllerWithIdentifierCalled = true;
%orig(identifier);
}
%end
%end// group gDontEatMyContent
BOOL DEMC_deviceIsSupported() {
// Get device model identifier (e.g. iPhone14,4)
// https://stackoverflow.com/a/11197770/19227228
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
BOOL deviceIsSupported() {
NSString *identifier = deviceName();
NSArray *unsupportedDevices = UNSUPPORTED_DEVICES;
NSString *deviceModelID = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
for (NSString *device in unsupportedDevices) {
if ([device isEqualToString:identifier]) {
NSArray *unsupportedModelIDs = DEMC_UNSUPPORTED_DEVICES;
for (NSString *identifier in unsupportedModelIDs) {
if ([deviceModelID isEqualToString:identifier]) {
return NO;
}
}
if ([identifier containsString:@"iPhone"]) {
NSString *model = [identifier stringByReplacingOccurrencesOfString:@"iPhone" withString:@""];
model = [model stringByReplacingOccurrencesOfString:@"," withString:@"."];
if ([identifier isEqualToString:@"iPhone13,1"]) { // iPhone 12 mini
if ([deviceModelID containsString:@"iPhone"]) {
if ([deviceModelID isEqualToString:@"iPhone13,1"]) {
// iPhone 12 mini
return YES;
} else if ([model floatValue] >= 14.0) { // iPhone 13 series and newer
}
NSString *modelNumber = [[deviceModelID stringByReplacingOccurrencesOfString:@"iPhone" withString:@""] stringByReplacingOccurrencesOfString:@"," withString:@"."];
if ([modelNumber floatValue] >= 14.0) {
// iPhone 13 series and newer
return YES;
} else return NO;
} else return NO;
}
void aspectRatioChanged(CGFloat arg) {
aspectRatio = arg;
if (aspectRatio == 0.0) {
// App backgrounded or something went wrong
} else if (aspectRatio < THRESHOLD) {
deactivate();
} else {
activate();
void DEMC_activate() {
if (videoAspectRatio < DEMC_THRESHOLD) {
DEMC_deactivate();
return;
}
}
void activate() {
if (aspectRatio < THRESHOLD || zoomedToFill) return;
// NSLog(@"activate");
center();
DEMC_centerRenderingView();
renderingView.translatesAutoresizingMaskIntoConstraints = NO;
widthConstraint.active = YES;
heightConstraint.active = YES;
}
void deactivate() {
void DEMC_deactivate() {
// NSLog(@"deactivate");
center();
DEMC_centerRenderingView();
renderingView.translatesAutoresizingMaskIntoConstraints = YES;
widthConstraint.active = NO;
heightConstraint.active = NO;
}
void center() {
void DEMC_centerRenderingView() {
centerXConstraint.active = YES;
centerYConstraint.active = YES;
}
@@ -1172,7 +1234,7 @@ static BOOL didFinishLaunching;
if (replacePreviousAndNextButton()) {
%init(gReplacePreviousAndNextButton);
}
if (dontEatMyContent() && deviceIsSupported()) {
if (dontEatMyContent() && DEMC_deviceIsSupported()) {
%init(gDontEatMyContent);
}
if (@available(iOS 16, *)) {