Compare commits

..

2 commits

Author SHA1 Message Date
arichornlover
376176db22
Update buildapp.yml 2024-06-21 21:11:52 -05:00
arichornlover
6f54760c2f
Update Makefile 2024-06-21 21:11:25 -05:00
56 changed files with 1452 additions and 2241 deletions

View file

@ -26,14 +26,14 @@ body:
- type: input - type: input
attributes: attributes:
label: iOS/iPadOS version label: iOS/iPadOS version
placeholder: iOS 18.0.0 placeholder: iOS 17.5.1
validations: validations:
required: true required: true
- type: input - type: input
attributes: attributes:
label: Device model label: Device model
placeholder: iPhone 16 Pro Max placeholder: iPhone 15 Pro Max
validations: validations:
required: true required: true
@ -111,12 +111,10 @@ body:
- type: checkboxes - type: checkboxes
attributes: attributes:
label: Select the configuration used for building or obtaining the uYouEnhanced ipa. (Optional) label: Select the configuration used for building the uYouEnhanced ipa. (Optional)
options: options:
- label: "buildapp.yml (GitHub Actions — build method as suggested by [Wiki - Building](https://github.com/arichornlover/uYouEnhanced/wiki/Building))" - label: "buildapp.yml (GitHub Actions — build method as suggested by [Wiki - Building](https://github.com/arichornlover/uYouEnhanced/wiki/Building))"
- label: "build.sh (Shell script)" - label: "build.sh (Shell script)"
- label: "AltStore Source (obtained from https://raw.githubusercontent.com/arichornlover/arichornlover.github.io/main/apps.json)"
- label: "Other (obtained from untrusted or potentially unsafe sources such as phishing sites, unknown individuals, or unofficial channels.)"
- type: textarea - type: textarea
attributes: attributes:

View file

@ -8,7 +8,7 @@ on:
inputs: inputs:
sdk_version: sdk_version:
description: "iOS SDK Version" description: "iOS SDK Version"
default: "16.5" default: "18.0"
required: true required: true
type: string type: string
uyou_version: uyou_version:
@ -54,13 +54,13 @@ concurrency:
jobs: jobs:
build: build:
name: Build uYouEnhanced name: Build uYouEnhanced
runs-on: macos-13 runs-on: macos-12
permissions: permissions:
contents: write contents: write
steps: steps:
- name: Checkout Main - name: Checkout Main
uses: actions/checkout@v4.2.1 uses: actions/checkout@v4.1.6
with: with:
path: main path: main
ref: ${{ github.event.inputs.commit_id || github.ref }} ref: ${{ github.event.inputs.commit_id || github.ref }}
@ -73,7 +73,7 @@ jobs:
run: echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH run: echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH
- name: Setup Theos - name: Setup Theos
uses: actions/checkout@v4.2.1 uses: actions/checkout@v4.1.6
with: with:
repository: theos/theos repository: theos/theos
ref: 5bfdc3cb7133ec1cab43182115d902e2b57c9eac ref: 5bfdc3cb7133ec1cab43182115d902e2b57c9eac
@ -82,7 +82,7 @@ jobs:
- name: SDK Caching - name: SDK Caching
id: SDK id: SDK
uses: actions/cache@v4.1.1 uses: actions/cache@v4.0.2
env: env:
cache-name: iOS-${{ inputs.sdk_version }}-SDK cache-name: iOS-${{ inputs.sdk_version }}-SDK
with: with:
@ -93,7 +93,7 @@ jobs:
- name: Download iOS SDK - name: Download iOS SDK
if: steps.SDK.outputs.cache-hit != 'true' if: steps.SDK.outputs.cache-hit != 'true'
run: | run: |
git clone --quiet -n --depth=1 --filter=tree:0 https://github.com/theos/sdks/ git clone --quiet -n --depth=1 --filter=tree:0 https://github.com/arichornlover/sdks/
cd sdks cd sdks
git sparse-checkout set --no-cone iPhoneOS${{ inputs.sdk_version }}.sdk git sparse-checkout set --no-cone iPhoneOS${{ inputs.sdk_version }}.sdk
git checkout git checkout
@ -102,7 +102,7 @@ jobs:
THEOS: ${{ github.workspace }}/theos THEOS: ${{ github.workspace }}/theos
- name: Setup Theos Jailed - name: Setup Theos Jailed
uses: actions/checkout@v4.2.1 uses: actions/checkout@v4.1.6
with: with:
repository: qnblackcat/theos-jailed repository: qnblackcat/theos-jailed
ref: master ref: master
@ -151,7 +151,7 @@ jobs:
- name: Upload Artifact - name: Upload Artifact
if: ${{ inputs.upload_artifact }} if: ${{ inputs.upload_artifact }}
uses: actions/upload-artifact@v4.4.3 uses: actions/upload-artifact@v4.3.3
env: env:
UYOU_VERSION: ${{ inputs.uyou_version }} UYOU_VERSION: ${{ inputs.uyou_version }}
YOUTUBE_VERSION: ${{ steps.prepare_youtube.outputs.youtube_version }} YOUTUBE_VERSION: ${{ steps.prepare_youtube.outputs.youtube_version }}
@ -163,7 +163,7 @@ jobs:
- name: Create Release - name: Create Release
if: ${{ inputs.create_release }} if: ${{ inputs.create_release }}
id: create_release id: create_release
uses: softprops/action-gh-release@v2.0.8 uses: softprops/action-gh-release@v2.0.5
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
UYOU_VERSION: ${{ inputs.uyou_version }} UYOU_VERSION: ${{ inputs.uyou_version }}

View file

@ -1,8 +1,6 @@
name: Update Submodules name: Update Submodules
on: on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch: workflow_dispatch:
jobs: jobs:
@ -11,7 +9,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4.2.1 uses: actions/checkout@v4.1.6
- name: Set up Git - name: Set up Git
run: | run: |
@ -24,10 +22,14 @@ jobs:
git add . git add .
git submodule update --init --recursive --remote Tweaks/DontEatMyContent git submodule update --init --recursive --remote Tweaks/DontEatMyContent
git add . git add .
git submodule update --init --recursive --remote Tweaks/IAmYouTube
git add .
git submodule update --init --recursive --remote Tweaks/YTHoldForSpeed git submodule update --init --recursive --remote Tweaks/YTHoldForSpeed
git add . git add .
git submodule update --init --recursive --remote Tweaks/YTSpeed git submodule update --init --recursive --remote Tweaks/YTSpeed
git add . git add .
git submodule update --init --recursive --remote Tweaks/MrBeastify
git add .
git submodule update --init --recursive --remote Tweaks/Return-YouTube-Dislikes git submodule update --init --recursive --remote Tweaks/Return-YouTube-Dislikes
git add . git add .
git submodule update --init --recursive --remote Tweaks/uYouLocalization git submodule update --init --recursive --remote Tweaks/uYouLocalization
@ -54,8 +56,6 @@ jobs:
git add . git add .
git submodule update --init --recursive --remote Tweaks/iSponsorBlock git submodule update --init --recursive --remote Tweaks/iSponsorBlock
git add . git add .
git submodule update --init --recursive --remote Tweaks/protobuf
git add .
git submodule update --init --recursive git submodule update --init --recursive
git commit -m "updated submodules" git commit -m "updated submodules"
git push git push

44
.gitmodules vendored
View file

@ -8,7 +8,7 @@
branch = main branch = main
[submodule "Tweaks/YouMute"] [submodule "Tweaks/YouMute"]
path = Tweaks/YouMute path = Tweaks/YouMute
url = https://github.com/PoomSmart/YouMute.git url = https://github.com/arichornlover/YouMute.git
branch = main branch = main
[submodule "Tweaks/YouQuality"] [submodule "Tweaks/YouQuality"]
path = Tweaks/YouQuality path = Tweaks/YouQuality
@ -20,10 +20,11 @@
branch = main branch = main
[submodule "Tweaks/Return-YouTube-Dislikes"] [submodule "Tweaks/Return-YouTube-Dislikes"]
path = Tweaks/Return-YouTube-Dislikes path = Tweaks/Return-YouTube-Dislikes
url = https://github.com/PoomSmart/Return-YouTube-Dislikes.git url = https://github.com/arichornloverALT/Return-YouTube-Dislikes.git
branch = uYouEnhanced
[submodule "Tweaks/YouTubeHeader"] [submodule "Tweaks/YouTubeHeader"]
path = Tweaks/YouTubeHeader path = Tweaks/YouTubeHeader
url = https://github.com/arichornloverALT/YouTubeHeader.git url = https://github.com/arichornlover/YouTubeHeader.git
branch = main branch = main
[submodule "Extensions"] [submodule "Extensions"]
path = Extensions path = Extensions
@ -31,12 +32,8 @@
branch = main branch = main
[submodule "Tweaks/YTABConfig"] [submodule "Tweaks/YTABConfig"]
path = Tweaks/YTABConfig path = Tweaks/YTABConfig
url = https://github.com/PoomSmart/YTABConfig.git url = https://github.com/arichornlover/YTABConfig2.git
branch = main branch = main
[submodule "Tweaks/FLEXing"]
path = Tweaks/FLEXing
url = https://github.com/PoomSmart/FLEXing
branch = rootless
[submodule "Tweaks/Alderis"] [submodule "Tweaks/Alderis"]
path = Tweaks/Alderis path = Tweaks/Alderis
url = https://github.com/hbang/Alderis.git url = https://github.com/hbang/Alderis.git
@ -45,11 +42,14 @@
url = https://github.com/Muirey03/RemoteLog url = https://github.com/Muirey03/RemoteLog
[submodule "Tweaks/DontEatMyContent"] [submodule "Tweaks/DontEatMyContent"]
path = Tweaks/DontEatMyContent path = Tweaks/DontEatMyContent
url = https://github.com/arichornloverALT/DontEatMyContent url = https://github.com/therealFoxster/DontEatMyContent
[submodule "Tweaks/iSponsorBlock"] [submodule "Tweaks/iSponsorBlock"]
path = Tweaks/iSponsorBlock path = Tweaks/iSponsorBlock
url = https://github.com/Galactic-Dev/iSponsorBlock.git url = https://github.com/Galactic-Dev/iSponsorBlock.git
branch = master branch = master
[submodule "Tweaks/IAmYouTube"]
path = Tweaks/IAmYouTube
url = https://github.com/PoomSmart/IAmYouTube.git
[submodule "Tweaks/YTClassicVideoQuality"] [submodule "Tweaks/YTClassicVideoQuality"]
path = Tweaks/YTClassicVideoQuality path = Tweaks/YTClassicVideoQuality
url = https://github.com/PoomSmart/YTClassicVideoQuality.git url = https://github.com/PoomSmart/YTClassicVideoQuality.git
@ -58,32 +58,26 @@
url = https://github.com/PoomSmart/NoYTPremium.git url = https://github.com/PoomSmart/NoYTPremium.git
[submodule "Tweaks/YTSpeed"] [submodule "Tweaks/YTSpeed"]
path = Tweaks/YTSpeed path = Tweaks/YTSpeed
url = https://github.com/arichornloverALT/YTSpeed.git url = https://github.com/arichornlover/YTSpeed.git
[submodule "Tweaks/YouTube-X"]
path = Tweaks/YouTube-X
url = https://github.com/PoomSmart/YouTube-X/
[submodule "Tweaks/IAmYouTube"]
path = Tweaks/IAmYouTube
url = https://github.com/PoomSmart/IAmYouTube.git
[submodule "Tweaks/YTHoldForSpeed"]
path = Tweaks/YTHoldForSpeed
url = https://github.com/arichornloverALT/YTHoldForSpeed.git
[submodule "Tweaks/MrBeastify"] [submodule "Tweaks/MrBeastify"]
path = Tweaks/MrBeastify path = Tweaks/MrBeastify
url = https://github.com/arichornloverALT/MrBeastify.git url = https://github.com/arichornlover/MrBeastify.git
branch = main branch = main
[submodule "Tweaks/FLEXing"]
path = Tweaks/FLEXing
url = https://github.com/PoomSmart/FLEXing
[submodule "Tweaks/YTHoldForSpeed"]
path = Tweaks/YTHoldForSpeed
url = https://github.com/arichornlover/YTHoldForSpeed.git
[submodule "Tweaks/uYouLocalization"] [submodule "Tweaks/uYouLocalization"]
path = Tweaks/uYouLocalization path = Tweaks/uYouLocalization
url = https://github.com/dayanch96/uYouLocalization.git url = https://github.com/dayanch96/uYouLocalization.git
[submodule "Tweaks/YouGroupSettings"] [submodule "Tweaks/YouGroupSettings"]
path = Tweaks/YouGroupSettings path = Tweaks/YouGroupSettings
url = https://github.com/arichornloverALT/YouGroupSettings.git url = https://github.com/arichornlover/YouGroupSettings.git
[submodule "Tweaks/YouTimeStamp"] [submodule "Tweaks/YouTimeStamp"]
path = Tweaks/YouTimeStamp path = Tweaks/YouTimeStamp
url = https://github.com/arichornloverALT/YouTimeStamp.git url = https://github.com/arichornlover/YouTimeStamp.git
[submodule "Tweaks/protobuf"] [submodule "Tweaks/protobuf"]
path = Tweaks/protobuf path = Tweaks/protobuf
url = https://github.com/protocolbuffers/protobuf.git url = https://github.com/protocolbuffers/protobuf.git
[submodule "Tweaks/YouLoop"]
path = Tweaks/YouLoop
url = https://github.com/bhackel/YouLoop.git

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 891 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 688 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -66,8 +66,8 @@
"HIDE_AUTOPLAY_SWITCH" = "Ocultar interruptor de Reproducir automáticamente"; "HIDE_AUTOPLAY_SWITCH" = "Ocultar interruptor de Reproducir automáticamente";
"HIDE_AUTOPLAY_SWITCH_DESC" = "Ocultar el interruptor de Reproducir automáticamente en los botones superpuestos."; "HIDE_AUTOPLAY_SWITCH_DESC" = "Ocultar el interruptor de Reproducir automáticamente en los botones superpuestos.";
"HIDE_YTMUSIC_BUTTON" = "Ocultar botón de Youtube Music"; "HIDE_YTMUSIC_BUTTON" = "Hide Youtube Music button";
"HIDE_YTMUSIC_BUTTON_DESC" = "Oculta el botón de Youtube Music que aparece con Premium."; "HIDE_YTMUSIC_BUTTON_DESC" = "Hides Youtube Music button that appears with Premium";
"HIDE_SUBTITLES_BUTTON" = "Ocultar botón de Subtítulos"; "HIDE_SUBTITLES_BUTTON" = "Ocultar botón de Subtítulos";
"HIDE_SUBTITLES_BUTTON_DESC" = "Ocultar el botón de Subtítulos en los botones superpuestos."; "HIDE_SUBTITLES_BUTTON_DESC" = "Ocultar el botón de Subtítulos en los botones superpuestos.";
@ -76,22 +76,22 @@
"HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, Vídeo en bucle está activado,..."; "HIDE_HUD_MESSAGES_DESC" = "Ejemplo: CC está activado/desactivado, Vídeo en bucle está activado,...";
"HIDE_PAID_PROMOTION_CARDS" = "Ocultar banner de contenido promocional"; "HIDE_PAID_PROMOTION_CARDS" = "Ocultar banner de contenido promocional";
"HIDE_PAID_PROMOTION_CARDS_DESC" = "Oculta el banner de 'Incluye contenido promocional' en algunos vídeos."; "HIDE_PAID_PROMOTION_CARDS_DESC" = "Ocultar el banner de 'Incluye contenido promocional' en algunos vídeos.";
"HIDE_CHANNEL_WATERMARK" = "Ocultar marca de agua del canal"; "HIDE_CHANNEL_WATERMARK" = "Ocultar marca de agua del canal";
"HIDE_CHANNEL_WATERMARK_DESC" = "Oculta la marca de agua del canal en la superposición de controles de vídeo. Es necesario reiniciar la aplicación."; "HIDE_CHANNEL_WATERMARK_DESC" = "Ocultar la marca de agua del canal en la superposición de controles de vídeo. Es necesario reiniciar la aplicación.";
"HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ocultar el botón de Anterior y Siguiente"; "HIDE_PREVIOUS_AND_NEXT_BUTTON" = "Ocultar el botón de Anterior y Siguiente";
"HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Oculta el botón de Anterior y Siguiente en los botones superpuestos."; "HIDE_PREVIOUS_AND_NEXT_BUTTON_DESC" = "Ocultar el botón de Anterior y Siguiente en los botones superpuestos.";
"REPLACE_PREVIOUS_NEXT_BUTTON" = "Remplazar botón anterior y siguiente"; "REPLACE_PREVIOUS_NEXT_BUTTON" = "Reemplazar botón anterior y siguiente";
"REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Remplaza el botón Anterior y Siguiente con el botón Avance rápido y Rebobinado. Es necesario reiniciar la aplicación."; "REPLACE_PREVIOUS_NEXT_BUTTON_DESC" = "Reemplace el botón Anterior y Siguiente con el botón Avance rápido y Rebobinado. Es necesario reiniciar la aplicación.";
"RED_PROGRESS_BAR" = "Barra de progreso roja"; "RED_PROGRESS_BAR" = "Barra de progreso roja";
"RED_PROGRESS_BAR_DESC" = "Recupera la barra de progreso roja. Es necesario reiniciar la aplicación."; "RED_PROGRESS_BAR_DESC" = "Recupera la barra de progreso roja. Es necesario reiniciar la aplicación.";
"HIDE_HOVER_CARD" = "Ocultar tarjetas flotantes en las pantallas finales (YTNoHoverCards)"; "HIDE_HOVER_CARD" = "Ocultar tarjetas flotantes en las pantallas finales (YTNoHoverCards)";
"HIDE_HOVER_CARD_DESC" = "Oculta las tarjetas flotantes del creador (miniaturas) al final de los vídeos."; "HIDE_HOVER_CARD_DESC" = "Ocultar tarjetas flotantes del creador (miniaturas) al final de los vídeos.";
"HIDE_RIGHT_PANEL" = "Ocultar el panel derecho en modo pantalla completa"; "HIDE_RIGHT_PANEL" = "Ocultar el panel derecho en modo pantalla completa";
"HIDE_RIGHT_PANEL_DESC" = "Es necesario reiniciar la aplicación."; "HIDE_RIGHT_PANEL_DESC" = "Es necesario reiniciar la aplicación.";
@ -100,10 +100,10 @@
"SHORTS_CONTROLS_OVERLAY_OPTIONS" = "💥 Configurar superposición de Shorts"; "SHORTS_CONTROLS_OVERLAY_OPTIONS" = "💥 Configurar superposición de Shorts";
"HIDE_SUPER_THANKS" = "Ocultar banner 'Comprar Supergracias"; "HIDE_SUPER_THANKS" = "Ocultar banner 'Comprar Supergracias";
"HIDE_SUPER_THANKS_DESC" = "Oculta el banner 'Comprar Supergracias' en Shorts."; "HIDE_SUPER_THANKS_DESC" = "Ocultar el banner 'Comprar Supergracias' en Shorts.";
"HIDE_SUBCRIPTIONS" = "Ocultar el botón de suscripción"; "HIDE_SUBCRIPTIONS" = "Ocultar el botón de suscripción";
"HIDE_SUBCRIPTIONS_DESC" = "Oculta el botón de suscripción del Reproductor."; "HIDE_SUBCRIPTIONS_DESC" = "";
"DISABLE_RESUME_TO_SHORTS" = "Desactivar reanudación a Shorts"; "DISABLE_RESUME_TO_SHORTS" = "Desactivar reanudación a Shorts";
"DISABLE_RESUME_TO_SHORTS_DESC" = "Si cierras YouTube mientras ves Shorts, éstos no se reproducirán automáticamente la próxima vez que inicies YouTube."; "DISABLE_RESUME_TO_SHORTS_DESC" = "Si cierras YouTube mientras ves Shorts, éstos no se reproducirán automáticamente la próxima vez que inicies YouTube.";
@ -115,7 +115,7 @@
"HIDE_ISPONSORBLOCK" = "Ocultar botón iSponsorBlock"; "HIDE_ISPONSORBLOCK" = "Ocultar botón iSponsorBlock";
"CAST_CONFIRM" = "Alerta de confirmación antes de Enviar contenido (YTCastConfirm)"; "CAST_CONFIRM" = "Alerta de confirmación antes de Enviar contenido (YTCastConfirm)";
"CAST_CONFIRM_DESC" = "Muestra una alerta de confirmación antes de Enviar contenido para prevenir el secuestro accidental del TV."; "CAST_CONFIRM_DESC" = "Mostrar una alerta de confirmación antes de Enviar contenido para prevenir el secuestro accidental del TV.";
"CASTING" = "Enviar contenido"; "CASTING" = "Enviar contenido";
"MSG_ARE_YOU_SURE" = "¿Estás seguro de que deseas Enviar contenido?"; "MSG_ARE_YOU_SURE" = "¿Estás seguro de que deseas Enviar contenido?";
"MSG_YES" = "Sí"; "MSG_YES" = "Sí";
@ -124,11 +124,11 @@
"DISABLE_HINTS" = "Desactivar sugerencias"; "DISABLE_HINTS" = "Desactivar sugerencias";
"DISABLE_HINTS_DESC" = "Desactiva las sugerencias de YouTube que suelen aparecer cuando la aplicación está recién instalada."; "DISABLE_HINTS_DESC" = "Desactiva las sugerencias de YouTube que suelen aparecer cuando la aplicación está recién instalada.";
"ENABLE_YT_STARTUP_ANIMATION" = "Activar animación de inicio de YouTube"; "ENABLE_YT_STARTUP_ANIMATION" = "Activar la animación de inicio de YouTube";
"ENABLE_YT_STARTUP_ANIMATION_DESC" = "Activa la animación al iniciar Youtube"; "ENABLE_YT_STARTUP_ANIMATION_DESC" = "";
"HIDE_CHIP_BAR" = "Ocultar barra superiorm"; "HIDE_CHIP_BAR" = "Ocultar la barra superior";
"HIDE_CHIP_BAR_DESC" = "Oculta la barra superior de las fuentes de inicio (Tendencias, Música, Juegos...) y de suscripción (Todos los vídeos, Seguir viendo...). Es necesario reiniciar la aplicación."; "HIDE_CHIP_BAR_DESC" = "Ocultar la barra superior de las fuentes de inicio (Tendencias, Música, Juegos...) y de suscripción (Todos los vídeos, Seguir viendo...). Es necesario reiniciar la aplicación.";
"HIDE_PLAY_NEXT_IN_QUEUE" = "Ocultar \"Reproducir siguiente en cola\""; "HIDE_PLAY_NEXT_IN_QUEUE" = "Ocultar \"Reproducir siguiente en cola\"";
"HIDE_PLAY_NEXT_IN_QUEUE_DESC" = ""; "HIDE_PLAY_NEXT_IN_QUEUE_DESC" = "";
@ -149,105 +149,105 @@
"FIX_GOOGLE_SIGNIN_DESC" = "Active esta opción solo cuando no pueda iniciar sesión con su cuenta de Google y la aplicación se instaló a través de TrollStore. Si puede iniciar sesión normalmente, manténgala desactivada. Es necesario reiniciar la aplicación."; "FIX_GOOGLE_SIGNIN_DESC" = "Active esta opción solo cuando no pueda iniciar sesión con su cuenta de Google y la aplicación se instaló a través de TrollStore. Si puede iniciar sesión normalmente, manténgala desactivada. Es necesario reiniciar la aplicación.";
// uYouEnhanced Localization // uYouEnhanced Localization
"SUPPORT_THE_DEVELOPERS" = "Apoya a los desarrolladores"; "SUPPORT_THE_DEVELOPERS" = "Support the Developers";
"COPY_SETTINGS" = "Copiar Ajustes"; "COPY_SETTINGS" = "Copy Settings";
"COPY_SETTINGS_DESC" = "Copiar Ajustes actuales al Portapapeles"; "COPY_SETTINGS_DESC" = "Copy all current settings to the clipboard";
"PASTE_SETTINGS" = "Pegar Ajustes"; "PASTE_SETTINGS" = "Paste Settings";
"PASTE_SETTINGS_DESC" = "Pegar Ajustes desde el Portapapeles y aplicar"; "PASTE_SETTINGS_DESC" = "Paste settings from clipboard and apply";
"EXPORT_SETTINGS" = "Exportar Ajustes"; "EXPORT_SETTINGS" = "Export Settings";
"EXPORT_SETTINGS_DESC" = "Exporta todos los Ajustes actuales en un archivo .txt"; "EXPORT_SETTINGS_DESC" = "Exports all current settings into a .txt file";
"IMPORT_SETTINGS" = "Importar Ajustes"; "IMPORT_SETTINGS" = "Import Settings";
"IMPORT_SETTINGS_DESC" = "Pulsa para importar Ajustes (.txt)"; "IMPORT_SETTINGS_DESC" = "Press to import settings (.txt)";
"REPLACE_COPY_AND_PASTE_BUTTONS" = "Remplaza los botones 'Copiar Ajustes' y 'Pegar Ajustes'"; "REPLACE_COPY_AND_PASTE_BUTTONS" = "Replace 'Copy Settings' & 'Paste Settings' Buttons";
"REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Remplaza los botones a 'Exportar Ajustes' e 'Importar Ajustes'"; "REPLACE_COPY_AND_PASTE_BUTTONS_DESC" = "Replaces the Buttons to 'Export Settings' and 'Import Settings'";
"UYOUENHANCED_ESSENTIAL_MENU" = "Menú Esencial de uYouEnhanced"; "UYOUENHANCED_ESSENTIAL_MENU" = "uYouEnhanced Essential Menu";
"CHANGE_APP_ICON" = "Cambiar Icono de Aplicación"; "CHANGE_APP_ICON" = "Change App Icon";
"CLEAR_NOTIFICATIONS" = "Borrar Notificaciones"; "CLEAR_NOTIFICATIONS" = "Clear Notifications";
"CLEAR_NOTIFICATIONS_DESC" = "Forzar borrado de todas las notificaciones de la app (Recomendado para Sideload)"; "CLEAR_NOTIFICATIONS_DESC" = "Force clear all app notifications (Recommended when Sideloaded)";
"CUSTOM_DARK_THEME" = "Tema Oscuro Personalizado"; "CUSTOM_DARK_THEME" = "Custom Dark Theme";
"ENABLE_PORTRAIT_FULLSCREEN" = "Habilitar Modo Retrato a Pantalla Completa"; "ENABLE_PORTRAIT_FULLSCREEN" = "Enable Portrait Fullscreen";
"ENABLE_PORTRAIT_FULLSCREEN_DESC" = "Habilita Modo Retrato a Pantalla Completa en la aplicación de YouTube. Se requiere el reicio de la app."; "ENABLE_PORTRAIT_FULLSCREEN_DESC" = "Enables Portrait Fullscreen on the YouTube App. App restart is required.";
"ENABLE_TAP_TO_SEEK" = "Habilitar toque para buscar"; "ENABLE_TAP_TO_SEEK" = "Enable Tap To Seek";
"ENABLE_TAP_TO_SEEK_DESC" = "Salta a cualquier parte de un vídeo con un simple toque en la barra de búsqueda"; "ENABLE_TAP_TO_SEEK_DESC" = "Jump to anywhere in a video by single-tapping the seek bar";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Deshabilitar gesto arrastrar para Pantalla Completa"; "DISABLE_PULL_TO_FULLSCREEN_GESTURE" = "Disable pull-to-fullscreen gesture";
"DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Deshabilita el gesto de arrastrar para entrar en Pantalla Completa vertical. Sólo se aplica a vídeos en modo apaisado."; "DISABLE_PULL_TO_FULLSCREEN_GESTURE_DESC" = "Disable the drag gesture to enter vertical fullscreen. Only applies to landscape videos.";
"DISABLE_DOUBLE_TAP_TO_SKIP_CHAPTER" = "Deshabilitar Doble toque para saltar capítulo"; "DISABLE_DOUBLE_TAP_TO_SKIP_CHAPTER" = "Disable Double tap to skip chapter";
"DISABLE_DOUBLE_TAP_TO_SKIP_CHAPTER_DESC" = "Deshabilita el gesto de doble toque con 2 dedos para saltar adelante/atrás en un capítulo."; "DISABLE_DOUBLE_TAP_TO_SKIP_CHAPTER_DESC" = "Disable the 2-finger double tap gesture that skips forward/backward by a chapter.";
"ALWAYS_USE_REMAINING_TIME" = "Usar siempre tiempo restante"; "ALWAYS_USE_REMAINING_TIME" = "Always use remaining time";
"ALWAYS_USE_REMAINING_TIME_DESC" = "Cambiar el tiempo restante por defecto en la barra del reproductor."; "ALWAYS_USE_REMAINING_TIME_DESC" = "Change the default to show time remaining in the player bar.";
"DISABLE_TOGGLE_TIME_REMAINING" = "Deshabilitar el selector de tiempo restante"; "DISABLE_TOGGLE_TIME_REMAINING" = "Disable toggle time remaining";
"DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Deshabilita el cambio de tiempo transcurrido a tiempo restante. Usar junto con otros ajustes para mostrar siempre el tiempo restante."; "DISABLE_TOGGLE_TIME_REMAINING_DESC" = "Disables changing time elapsed to time remaining. Use with other setting to always show remaining time.";
"ENABLE_SHARE_BUTTON" = "Habilitar Botón de Compartir"; "ENABLE_SHARE_BUTTON" = "Enable Share Button";
"ENABLE_SHARE_BUTTON_DESC" = "Habilita el Botón de Compartir en los controles de vídeo superpuestos."; "ENABLE_SHARE_BUTTON_DESC" = "Enable the Share Button in video controls overlay.";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Habilitar Botón Guardar en Lista de Reproducción"; "ENABLE_SAVE_TO_PLAYLIST_BUTTON" = "Enable Save To Playlist Button";
"ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Habilita el Botón de Guardar en la Lista de Reproducción en los controles de vídeo superpuestos."; "ENABLE_SAVE_TO_PLAYLIST_BUTTON_DESC" = "Enable the Save To Playlist Button in video controls overlay.";
"HIDE_YTMUSIC_BUTTON" = "Ocultar botón de Youtube Music"; "HIDE_YTMUSIC_BUTTON" = "Hide Youtube Music button";
"HIDE_YTMUSIC_BUTTON_DESC" = "Oculta el botón de Youtube Music que aparece con Premium"; "HIDE_YTMUSIC_BUTTON_DESC" = "Hides Youtube Music button that appears with Premium";
"HIDE_VIDEO_TITLE_IN_FULLSCREEN" = "Ocultar Título de Vídeo en Pantalla Completa"; "HIDE_VIDEO_TITLE_IN_FULLSCREEN" = "Hide Video Title in Fullscreen";
"HIDE_VIDEO_TITLE_IN_FULLSCREEN_DESC" = "Oculta el Título del Vídeo que aparece funcionalmente en la esquina superior izquierda del reproductor a Pantalla Completa."; "HIDE_VIDEO_TITLE_IN_FULLSCREEN_DESC" = "Hides the Video Title along with the functionality in the Top Left of the Fullscreen Video Player.";
"HIDE_COLLAPSE_BUTTON" = "Ocultar Botón de Colapso"; "HIDE_COLLAPSE_BUTTON" = "Hide Collapse Button";
"HIDE_COLLAPSE_BUTTON_DESC" = "Oculta el Botón de Colapso en Flecha que se encuentra en la parte superior izquierda del Reproductor de Vídeo."; "HIDE_COLLAPSE_BUTTON_DESC" = "Hides the Arrow Collapse Button that was shown in the Top Left of the Video Player.";
"HIDE_FULLSCREEN_BUTTON" = "Ocultar Botón de Pantalla Completa"; "HIDE_FULLSCREEN_BUTTON" = "Hide Fullscreen Button";
"HIDE_FULLSCREEN_BUTTON_DESC" = "Oculta el Botón de Pantalla Completa que se encuentra en la parte inferior derecha del Reproductor de Vídeo."; "HIDE_FULLSCREEN_BUTTON_DESC" = "Hides the Fullscreen Button that was shown at the Bottom Right of the Video Player.";
"HIDE_SHADOW_OVERLAY_BUTTONS" = "Ocultar Botones de Superposición de Sombra"; "HIDE_SHADOW_OVERLAY_BUTTONS" = "Hide Shadow Overlay Buttons";
"HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Oculta la Superposición de Sombra en los Botones Reproducir/Pausa, Anterior, Siguiente, Adelatar y Retrasar."; "HIDE_SHADOW_OVERLAY_BUTTONS_DESC" = "Hide the Shadow Overlay on the Play/Pause, Previous, Next, Forward & Rewind Buttons.";
"HIDE_FULLSCREEN_ACTION_BUTTONS" = "Ocultar Botones de Acción en Pantalla Completa"; "HIDE_FULLSCREEN_ACTION_BUTTONS" = "Hide Fullscreen Action Buttons";
"HIDE_FULLSCREEN_ACTION_BUTTONS_DESC" = "Oculta los botones de la pantalla en modo apaisado."; "HIDE_FULLSCREEN_ACTION_BUTTONS_DESC" = "Hides the buttons at the bottom of the screen when in landscape.";
"HIDE_SUGGESTED_VIDEO" = "Ocultar Vídeos Sugeridos"; "HIDE_SUGGESTED_VIDEO" = "Hide Suggested Video";
"HIDE_SUGGESTED_VIDEO_DESC" = "Elimina la ventana emergente de vídeos sugeridos al final de un vídeo. Esto impide que la reproducción automática fucione."; "HIDE_SUGGESTED_VIDEO_DESC" = "Remove the suggested video popup when finishing a video. Note that this will prevent autoplay from working.";
"HIDE_HEATWAVES_BAR" = "Ocultar Barra de Momentos Destacados"; "HIDE_HEATWAVES_BAR" = "Hide Heatwaves Bar";
"HIDE_HEATWAVES_BAR_DESC" = "Oculta la Barra de Momentos Destacados que se muestra originalmente por defecto en la Barra de Progreso del Reproductor. Se requiere reiniciar la App."; "HIDE_HEATWAVES_BAR_DESC" = "Hides the Heatwaves Bar that is originally shown in the Progress Bar by Default in the video player. App restart is required.";
"HIDE_DOUBLE_TAP_TO_SEEK_OVERLAY" = "Ocultar Doble Toque para Superposición de Búsqueda"; "HIDE_DOUBLE_TAP_TO_SEEK_OVERLAY" = "Hide Double Tap to Seek Overlay";
"HIDE_DOUBLE_TAP_TO_SEEK_OVERLAY_DESC" = "Esto oculta el doble toque animado para la superposición de búsqueda del reproductor de vídeo. Se requiere reiniciar la App."; "HIDE_DOUBLE_TAP_TO_SEEK_OVERLAY_DESC" = "This hides the animated double tap to seek overlay in the video player. App restart is required.";
"HIDE_DARK_OVERLAY_BACKGROUND" = "Ocultar Superposición de Fondo Oscuro"; "HIDE_DARK_OVERLAY_BACKGROUND" = "Hide Dark Overlay Background";
"HIDE_DARK_OVERLAY_BACKGROUND_DESC" = "Oculta la Superposición de Fondo Oscuro en el reproductor de vídeo. Se requiere reiniciar la App."; "HIDE_DARK_OVERLAY_BACKGROUND_DESC" = "Hide the Dark Overlay Background in the video player. App restart is required.";
"HIDE_AMBIENT_MODE_IN_FULLSCREEN" = "Ocultar Modo Ambiente en Pantalla Completa"; "HIDE_AMBIENT_MODE_IN_FULLSCREEN" = "Hide Ambient Mode in Fullscreen";
"HIDE_AMBIENT_MODE_IN_FULLSCREEN_DESC" = "Oculta y Previene el uso del Modo Ambiente del Reproductor de Vídeo en Pantalla Completa. Se requiere reiniciar la App."; "HIDE_AMBIENT_MODE_IN_FULLSCREEN_DESC" = "Hides and Prevents Ambient Mode from being used in the Video Player when in Fullscreen. App restart is required.";
"HIDE_SUGGESTED_VIDEOS_IN_FULLSCREEN" = "Ocultar Vídeos Sugeridos en Pantalla Completa"; "HIDE_SUGGESTED_VIDEOS_IN_FULLSCREEN" = "Hide Suggested Videos in Fullscreen";
"HIDE_SUGGESTED_VIDEOS_IN_FULLSCREEN_DESC" = "Oculta los vídeos sugeridos cuando el Reproductor de Vídeo está en Pantalla Completa. Se requiere reiniciar la App."; "HIDE_SUGGESTED_VIDEOS_IN_FULLSCREEN_DESC" = "Hide the suggested videos whenever in the Fullscreen Video Player. App restart is required.";
"HIDE_ALL_VIDEOS_UNDER_PLAYER" = "Ocutar todos los vídeos bajo el reproductor"; "HIDE_ALL_VIDEOS_UNDER_PLAYER" = "Hide all videos under player";
"HIDE_ALL_VIDEOS_UNDER_PLAYER_DESC" = "Elimina todos los vídeos bajo el Reproductor de Vídeo. Depende de la Orientación de Dispositivo."; "HIDE_ALL_VIDEOS_UNDER_PLAYER_DESC" = "Remove all videos under the video player. Depends on which Device Orientation.";
"SHORTS_QUALITY_PICKER" = "Selector de Calidad en Shorts"; "SHORTS_QUALITY_PICKER" = "Shorts Quality Picker";
"SHORTS_QUALITY_PICKER_DESC" = "Habilita el Selector de Calidad en los Shorts YouTube."; "SHORTS_QUALITY_PICKER_DESC" = "Enables the YouTube Shorts Quality Picker";
"VIDEO_PLAYER_BUTTON_OPTIONS" = "Opciones del Reproductor de Vídeo"; "VIDEO_PLAYER_BUTTON_OPTIONS" = "Video Player Button Options";
"RED_SUBSCRIBE_BUTTON" = "Botón de Suscripción Rojo"; "RED_SUBSCRIBE_BUTTON" = "Red Subscribe Button";
"RED_SUBSCRIBE_BUTTON_DESC" = "Restaura el color Rojo al Botón de Suscripción."; "RED_SUBSCRIBE_BUTTON_DESC" = "Restores the Subscribe Button Color to be Red.";
"HIDE_BUTTON_CONTAINERS_UNDER_PLAYER" = "Ocultar Contenedor de Botones bajo Reproductor"; "HIDE_BUTTON_CONTAINERS_UNDER_PLAYER" = "Hide Button Containers under player";
"HIDE_BUTTON_CONTAINERS_UNDER_PLAYER_DESC" = "Oculta el Cuerpo de los Botones bajo el reproductor de vídeo."; "HIDE_BUTTON_CONTAINERS_UNDER_PLAYER_DESC" = "Hides the Button Containers under the video player.";
"HIDE_CONNECT_BUTTON" = "Ocultar Botón Conectar bajo el reproductor"; "HIDE_CONNECT_BUTTON" = "Hide the Connect Button under player";
"HIDE_CONNECT_BUTTON_DESC" = "Oculta el Botón de Conectar bajo el reproductor de vídeo."; "HIDE_CONNECT_BUTTON_DESC" = "Hides the Connect Button under the video player.";
"HIDE_SHARE_BUTTON" = "Ocultar Botón Compartir bajo el reproductor"; "HIDE_SHARE_BUTTON" = "Hide the Share Button under player";
"HIDE_SHARE_BUTTON_DESC" = "Oculta el Botón de Compartir bajo el reproductor de vídeo."; "HIDE_SHARE_BUTTON_DESC" = "Hides the Share Button under the video player.";
"HIDE_THANKS_BUTTON" = "Ocultar Botón Gracias bajo el reproductor"; "HIDE_THANKS_BUTTON" = "Hide the Thanks Button under player";
"HIDE_THANKS_BUTTON_DESC" = "Oculta el Botón de Gracias bajo el reproductor de vídeo."; "HIDE_THANKS_BUTTON_DESC" = "Hides the Thanks Button under the video player.";
"HIDE_SAVE_BUTTON" = "Ocultar Botón Guardar bajo el reproductor"; "HIDE_SAVE_BUTTON" = "Hide the Save Button under player";
"HIDE_SAVE_BUTTON_DESC" = "Oculta el Botón de Guardar bajo el reproductor de vídeo."; "HIDE_SAVE_BUTTON_DESC" = "Hides the Save Button under the video player.";
"HIDE_REPORT_BUTTON" = "Ocultar Boton Reportar bajo el reproductor"; "HIDE_REPORT_BUTTON" = "Hide the Report Button under player";
"HIDE_REPORT_BUTTON_DESC" = "Oculta el Botón de Reportarbajo el reproductor de vídeo."; "HIDE_REPORT_BUTTON_DESC" = "Hides the Report Button under the video player.";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Ocultar Previsualización de Comentarios bajo el reproductor"; "HIDE_COMMENT_PREVIEWS_UNDER_PLAYER" = "Hide Comment previews under player";
"HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Oculta la Previsualización de Comentariosbajo el reproductor de vídeo."; "HIDE_COMMENT_PREVIEWS_UNDER_PLAYER_DESC" = "Hides the comment previews under the video player.";
"HIDE_COMMENT_SECTION_BUTTON" = "Ocultar Sección Comentarios bajo el reproductor"; "HIDE_COMMENT_SECTION_BUTTON" = "Hide the comment section under player";
"HIDE_COMMENT_SECTION_BUTTON_DESC" = "Oculta la Sección de Comentarios bajo el reproductor de vídeo."; "HIDE_COMMENT_SECTION_BUTTON_DESC" = "Hides the Comment Section under the video player.";
"APP_SETTINGS_OVERLAY_OPTIONS" = "Opciones de Superposición de Ajustes"; "APP_SETTINGS_OVERLAY_OPTIONS" = "App Settings Overlay Options";
"HIDE_ACCOUNT_SECTION" = "Ocultar Sección `Cuenta`"; "HIDE_ACCOUNT_SECTION" = "Hide `Account` Section";
"HIDE_AUTOPLAY_SECTION" = "Ocultar Sección `Autoplay`"; "HIDE_AUTOPLAY_SECTION" = "Hide `Autoplay` Section";
"HIDE_TRY_NEW_FEATURES_SECTION" = "Ocultar Sección `Prueba las nuevas funciones experimentales`"; "HIDE_TRY_NEW_FEATURES_SECTION" = "Hide `Try New Features` Section";
"HIDE_VIDEO_QUALITY_PREFERENCES_SECTION" = "Ocultar Sección `Preferencias de calidad de vídeo`"; "HIDE_VIDEO_QUALITY_PREFERENCES_SECTION" = "Hide `Video quality preferences` Section";
"HIDE_NOTIFICATIONS_SECTION" = "Ocultar Sección `Notificaciones`"; "HIDE_NOTIFICATIONS_SECTION" = "Hide `Notifications` Section";
"HIDE_MANAGE_ALL_HISTORY_SECTION" = "Ocultar Sección `Gestionar todo el historial`"; "HIDE_MANAGE_ALL_HISTORY_SECTION" = "Hide `Manage all history` Section";
"HIDE_YOUR_DATA_IN_YOUTUBE_SECTION" = "Ocultar Sección `Tus datos en YouTube`"; "HIDE_YOUR_DATA_IN_YOUTUBE_SECTION" = "Hide `Your data in YouTube` Section";
"HIDE_PRIVACY_SECTION" = "Ocultar Sección `Privacidad`"; "HIDE_PRIVACY_SECTION" = "Hide `Privacy` Section";
"HIDE_LIVE_CHAT_SECTION" = "Ocultar Sección `Chat en directo`"; "HIDE_LIVE_CHAT_SECTION" = "Hide `Live Chat` Section";
"HIDE_GET_YOUTUBE_PREMIUM_SECTION" = "Ocultar Sección `Consigue Youtube Premium`"; "HIDE_GET_YOUTUBE_PREMIUM_SECTION" = "Hide `Get Youtube Premium` Section";
"UI_INTERFACE_OPTIONS" = "UI Interface Options"; "UI_INTERFACE_OPTIONS" = "UI Interface Options";

View file

@ -1,6 +1,4 @@
export TARGET = iphone:clang:16.5:15.0 export TARGET = iphone:clang:18.0:15.0
export SDK_PATH = $(THEOS)/sdks/iPhoneOS16.5.sdk/
export SYSROOT = $(SDK_PATH)
export ARCHS = arm64 export ARCHS = arm64
export libcolorpicker_ARCHS = arm64 export libcolorpicker_ARCHS = arm64
@ -16,12 +14,11 @@ MODULES = jailed
endif endif
ifndef YOUTUBE_VERSION ifndef YOUTUBE_VERSION
YOUTUBE_VERSION = 19.40.4 YOUTUBE_VERSION = 19.23.3
endif endif
ifndef UYOU_VERSION ifndef UYOU_VERSION
UYOU_VERSION = 3.0.4 UYOU_VERSION = 3.0.4
endif endif
PACKAGE_NAME = $(TWEAK_NAME)
PACKAGE_VERSION = $(YOUTUBE_VERSION)-$(UYOU_VERSION) PACKAGE_VERSION = $(YOUTUBE_VERSION)-$(UYOU_VERSION)
INSTALL_TARGET_PROCESSES = YouTube INSTALL_TARGET_PROCESSES = YouTube
@ -34,7 +31,7 @@ $(TWEAK_NAME)_FRAMEWORKS = UIKit Foundation AVFoundation AVKit Photos Accelerate
$(TWEAK_NAME)_LIBRARIES = bz2 c++ iconv z $(TWEAK_NAME)_LIBRARIES = bz2 c++ iconv z
$(TWEAK_NAME)_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unused-but-set-variable -DTWEAK_VERSION=\"$(PACKAGE_VERSION)\" $(TWEAK_NAME)_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unused-but-set-variable -DTWEAK_VERSION=\"$(PACKAGE_VERSION)\"
#uYouLocalization $(TWEAK_NAME)_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib $(THEOS_OBJ_DIR)/uYouLocalization.dylib #uYouLocalization $(TWEAK_NAME)_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib $(THEOS_OBJ_DIR)/uYouLocalization.dylib
$(TWEAK_NAME)_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib $(THEOS_OBJ_DIR)/libFLEX.dylib $(THEOS_OBJ_DIR)/iSponsorBlock.dylib $(THEOS_OBJ_DIR)/YTABConfig.dylib $(THEOS_OBJ_DIR)/YouGroupSettings.dylib $(THEOS_OBJ_DIR)/YouLoop.dylib $(THEOS_OBJ_DIR)/YouMute.dylib $(THEOS_OBJ_DIR)/YouPiP.dylib $(THEOS_OBJ_DIR)/YouQuality.dylib $(THEOS_OBJ_DIR)/YouTimeStamp.dylib $(THEOS_OBJ_DIR)/YouTubeDislikesReturn.dylib $(THEOS_OBJ_DIR)/DontEatMyContent.dylib $(THEOS_OBJ_DIR)/YTHoldForSpeed.dylib $(THEOS_OBJ_DIR)/YoutubeSpeed.dylib $(THEOS_OBJ_DIR)/YTUHD.dylib $(THEOS_OBJ_DIR)/YTVideoOverlay.dylib $(TWEAK_NAME)_INJECT_DYLIBS = Tweaks/uYou/Library/MobileSubstrate/DynamicLibraries/uYou.dylib $(THEOS_OBJ_DIR)/libFLEX.dylib $(THEOS_OBJ_DIR)/iSponsorBlock.dylib $(THEOS_OBJ_DIR)/YouPiP.dylib $(THEOS_OBJ_DIR)/YouTubeDislikesReturn.dylib $(THEOS_OBJ_DIR)/YTABConfig.dylib $(THEOS_OBJ_DIR)/YTUHD.dylib $(THEOS_OBJ_DIR)/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib $(THEOS_OBJ_DIR)/YTNoCommunityPosts.dylib $(THEOS_OBJ_DIR)/YTVideoOverlay.dylib $(THEOS_OBJ_DIR)/YouMute.dylib $(THEOS_OBJ_DIR)/YouQuality.dylib $(THEOS_OBJ_DIR)/YouTimeStamp.dylib .theos/obj/YouGroupSettings.dylib $(THEOS_OBJ_DIR)/YoutubeSpeed.dylib # $(THEOS_OBJ_DIR)/MrBeastify-ObjC.dylib
$(TWEAK_NAME)_EMBED_LIBRARIES = $(THEOS_OBJ_DIR)/libcolorpicker.dylib $(TWEAK_NAME)_EMBED_LIBRARIES = $(THEOS_OBJ_DIR)/libcolorpicker.dylib
$(TWEAK_NAME)_EMBED_FRAMEWORKS = $(_THEOS_LOCAL_DATA_DIR)/$(THEOS_OBJ_DIR_NAME)/install_Alderis.xcarchive/Products/var/jb/Library/Frameworks/Alderis.framework $(TWEAK_NAME)_EMBED_FRAMEWORKS = $(_THEOS_LOCAL_DATA_DIR)/$(THEOS_OBJ_DIR_NAME)/install_Alderis.xcarchive/Products/var/jb/Library/Frameworks/Alderis.framework
$(TWEAK_NAME)_EMBED_BUNDLES = $(wildcard Bundles/*.bundle) $(TWEAK_NAME)_EMBED_BUNDLES = $(wildcard Bundles/*.bundle)
@ -43,7 +40,7 @@ $(TWEAK_NAME)_EMBED_EXTENSIONS = $(wildcard Extensions/*.appex)
include $(THEOS)/makefiles/common.mk include $(THEOS)/makefiles/common.mk
ifneq ($(JAILBROKEN),1) ifneq ($(JAILBROKEN),1)
#uYouLocalization SUBPROJECTS += Tweaks/Alderis Tweaks/uYouLocalization #uYouLocalization SUBPROJECTS += Tweaks/Alderis Tweaks/uYouLocalization
SUBPROJECTS += Tweaks/Alderis Tweaks/DontEatMyContent Tweaks/FLEXing/libflex Tweaks/iSponsorBlock Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouGroupSettings Tweaks/YouLoop Tweaks/YouMute Tweaks/YouPiP Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YTHoldForSpeed Tweaks/YTSpeed Tweaks/YTUHD Tweaks/YTVideoOverlay SUBPROJECTS += Tweaks/Alderis Tweaks/FLEXing/libflex Tweaks/iSponsorBlock Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YTUHD Tweaks/DontEatMyContent Tweaks/YTHoldForSpeed Tweaks/YTVideoOverlay Tweaks/YouMute Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YouGroupSettings Tweaks/YTSpeed # Tweaks/MrBeastify
include $(THEOS_MAKE_PATH)/aggregate.mk include $(THEOS_MAKE_PATH)/aggregate.mk
endif endif
include $(THEOS_MAKE_PATH)/tweak.mk include $(THEOS_MAKE_PATH)/tweak.mk

View file

@ -287,43 +287,40 @@
- **Compatibility:** Requires iOS/iPadOS 15.0 or later. - **Compatibility:** Requires iOS/iPadOS 15.0 or later.
- For AltStore user: - For AltStore user:
- My official AltStore repo (uYouEnhanced - iOS 15+): https://therealfoxster.github.io/altsource-viewer/view/?source=https://raw.githubusercontent.com/arichornloverALT/arichornloverALT.github.io/main/apps.json - My official AltStore repo: https://therealfoxster.github.io/altsource-viewer/view/?source=https://raw.githubusercontent.com/arichornlover/arichornlover.github.io/main/apps.json
- My alternative AltStore repo (uYouEnhanced - iOS 14+ - mainly for Trollstore users): https://therealfoxster.github.io/altsource-viewer/view/?source=https://raw.githubusercontent.com/arichornloverALT/arichornloverALT.github.io/main/apps-legacy.json - not sure if i can update this ipa. this IPA will be locked in YouTube Version **19.20.2** - [Open in AltStore (v19.21.2-3.0.4)](https://tinyurl.com/2wea84xd) - It will take a while to install because AltStore needs to download the IPA first.
- [Open in AltStore (v19.40.4-3.0.4)](https://tinyurl.com/44zmcw8t) - It will take a while to install because AltStore needs to download the IPA first.
<details> <details>
<summary>Version information (last updated: Oct 10, 2024)</summary> <summary>Version information (last updated: May 28, 2024)</summary>
| **Tweaks/App** | **Developer** | **Version** | **Open source** | | **Tweaks/App** | **Developer** | **Version** | **Open source** |
| - | - | :-: | :-: | | - | - | :-: | :-: |
| **YouTube** | Google Inc | 19.40.4 | ✖︎ | | **YouTube** | Google Inc | 19.21.2 | ✖︎ |
| [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 3.0.4 | ✖︎ | | [uYou](https://github.com/MiRO92/uYou-for-YouTube) | [MiRO92](https://twitter.com/miro92) | 3.0.4 | ✖︎ |
| **Open in YouTube** | [CokePokes](https://github.com/CokePokes) | 1.2 | [✔︎](https://github.com/CokePokes/YoutubeExtensions) | | **Open in YouTube** | [CokePokes](https://github.com/CokePokes) | 1.2 | [✔︎](https://github.com/CokePokes/YoutubeExtensions) |
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.2.9 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) | | **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.2.5 | [✔︎](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.1.8 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) | | **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.1.6 | [✔︎](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) |
| **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.5.5 | [✔︎](https://github.com/PoomSmart/YTUHD) | | **YTUHD** | [PoomSmart](https://twitter.com/poomsmart) | 1.5.1 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.8.14 | [✔︎](https://github.com/PoomSmart/YouPiP) | | **YouPiP** | [PoomSmart](https://twitter.com/poomsmart) | 1.8.9 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) | | **IAmYouTube** | [PoomSmart](https://twitter.com/poomsmart) | 1.3.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
| **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.3 | [✔︎](https://github.com/PoomSmart/YTABConfig) | | **YTABConfig** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.2 | [✔︎](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) |
| **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.12.7 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) | | **Return YouTube Dislike** | [PoomSmart](https://twitter.com/poomsmart) | 1.11.11 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
| **YouMute** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.3 | [✔︎](https://github.com/PoomSmart/YouMute) | | **YouMute** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.1-3 | [✔︎](https://github.com/PoomSmart/YouMute) |
| **YouQuality** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.1 | [✔︎](https://github.com/PoomSmart/YouQuality) | | **YouQuality** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.1 | [✔︎](https://github.com/PoomSmart/YouQuality) |
| **YouTube-X** | [PoomSmart](https://twitter.com/poomsmart) | 1.7.3 | [✔︎](https://github.com/PoomSmart/YouTube-X) | | **YTVideoOverlay** | [PoomSmart](https://twitter.com/poomsmart) | 1.1.6 | [✔︎](https://github.com/PoomSmart/YTVideoOverlay) |
| **YTVideoOverlay** | [PoomSmart](https://twitter.com/poomsmart) | 1.2.0 | [✔︎](https://github.com/PoomSmart/YTVideoOverlay) | | **YTHoldForSpeed** | [joshuaseltzer](https://github.com/joshuaseltzer) | 1.2.0 | [✔︎](https://github.com/joshuaseltzer/YTHoldForSpeed) |
| **YTHoldForSpeed** | [joshuaseltzer](https://github.com/joshuaseltzer) | 1.2.1 | [✔︎](https://github.com/joshuaseltzer/YTHoldForSpeed) |
| **LowContrastMode** | [arichornlover](https://github.com/arichornlover) | 1.5.2 | [✔︎](https://github.com/arichornlover/YTLowContrastMode) | | **LowContrastMode** | [arichornlover](https://github.com/arichornlover) | 1.5.2 | [✔︎](https://github.com/arichornlover/YTLowContrastMode) |
| **YouTimeStamp** | [arichornlover](https://github.com/arichornlover) | 1.0.1 | [✔︎](https://github.com/arichornlover/YouTimeStamp) | | **YouTimeStamp** | [arichornlover](https://github.com/arichornlover) | 1.0.0 | [✔︎](https://github.com/arichornlover/YouTimeStamp) |
</details> </details>
@ -335,7 +332,7 @@
| MiRO92 | uYou 3.0 | v18.06.6 - v18.18.2 | iOS 14.0 - iOS 15.8.2 | | MiRO92 | uYou 3.0 | v18.06.6 - v18.18.2 | iOS 14.0 - iOS 15.8.2 |
| MiRO92 | uYou 3.0.1 | v18.19.1 - v18.41.5 | iOS 14.0 - iOS 17.5.1 | | MiRO92 | uYou 3.0.1 | v18.19.1 - v18.41.5 | iOS 14.0 - iOS 17.5.1 |
| MiRO92 | uYou 3.0.2 / 3.0.3 | v19.06.2 - v19.15.1 | iOS 14.0 - iOS 17.5.1 | | MiRO92 | uYou 3.0.2 / 3.0.3 | v19.06.2 - v19.15.1 | iOS 14.0 - iOS 17.5.1 |
| MiRO92 | uYou 3.0.4 | v19.06.2 - v19.22.6 | iOS 14.0 - 17.5.1 | | MiRO92 | uYou 3.0.4 | v19.06.2 - latest | iOS 14.0 - 17.5.1 |
# Building # Building
@ -373,19 +370,18 @@ See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installati
# Wiki # Wiki
See [arichornlover - Wiki](https://github.com/arichornlover/uYouEnhanced/wiki/) or [qnblackcat - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/) See [arichornlover - Wiki](https://github.com/arichornlover/uYouenhanced/wiki/) or [qnblackcat - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/)
## Lightweight Alternative - YTLitePlus ## Lightweight Alternative - YTLitePlus
<details> <details>
<summary>Read more</summary><br> <summary>Read more</summary><br>
- Change from uYouEnhanced to YTLitePlus (optional)
# Switch from uYouEnhanced to YTLitePlus (optional) Hello, this is here to showcase this tweak. I have been seeing the YTLitePlus tweak on Reddit for quite some time now and decided to join in. Before you download the tweak, you should take a look at the pros and cons below to learn more about the tweak.
Hello, this is here to showcase this tweak. I have been seeing the posts about the YTLitePlus tweak on Reddit for quite some time now and decided to add it here. Before you download or check out the tweak, you should take a look at the pros and cons below to learn more about YTLitePlus. https://github.com/Balackburn/YTLitePlus/releases
https://github.com/YTLitePlus/YTLitePlus/releases
**Pros** **Pros**
@ -393,9 +389,9 @@ https://github.com/YTLitePlus/YTLitePlus/releases
- YTLitePlus provides more features in YTLite & YTLitePlus Sections in Settings that uYouPlus/uYouEnhanced may not have. - YTLitePlus provides more features in YTLite & YTLitePlus Sections in Settings that uYouPlus/uYouEnhanced may not have.
- YTLitePlus includes a lightweight and simplified version of the App Version Spoofer, making it easier to use. - YTLitePlus includes a lightweight version of the App Version Spoofer, making it easier to use.
- YTLitePlus does not cause your device to overheat, unlike uYouPlus/uYouEnhanced. - YTLitePlus does not cause your device to overheat, unlike uYouEnhanced.
- YTLitePlus provides faster video & audio downloading than uYouPlus/uYouEnhanced. - YTLitePlus provides faster video & audio downloading than uYouPlus/uYouEnhanced.
@ -403,5 +399,5 @@ https://github.com/YTLitePlus/YTLitePlus/releases
- Video quality on WiFi option is not available in YTLitePlus. - Video quality on WiFi option is not available in YTLitePlus.
- Reordering the pivot bar tabs such as `Home`, `Shorts`, `Explore`, `Trending`, `Create`, `Subscriptions` & `You` is not available in YTLitePlus. - Reordering the pivot bar tabs such as Home, Shorts, Explore, Trending, Create, Subscriptions & You is not available in YTLitePlus.
</details> </details>

View file

@ -2,9 +2,11 @@
#import <YouTubeHeader/YTAssetLoader.h> #import <YouTubeHeader/YTAssetLoader.h>
@interface AppIconOptionsController () <UITableViewDataSource, UITableViewDelegate> @interface AppIconOptionsController () <UITableViewDataSource, UITableViewDelegate>
@property (strong, nonatomic) UITableView *tableView; @property (strong, nonatomic) UITableView *tableView;
@property (strong, nonatomic) NSArray<NSString *> *appIcons; @property (strong, nonatomic) NSArray<NSString *> *appIcons;
@property (assign, nonatomic) NSInteger selectedIconIndex; @property (assign, nonatomic) NSInteger selectedIconIndex;
@end @end
@implementation AppIconOptionsController @implementation AppIconOptionsController
@ -13,6 +15,8 @@
[super viewDidLoad]; [super viewDidLoad];
self.title = @"Change App Icon"; self.title = @"Change App Icon";
[self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"YTSans-Bold" size:22], NSForegroundColorAttributeName: [UIColor whiteColor]}];
self.selectedIconIndex = -1; self.selectedIconIndex = -1;
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
@ -21,11 +25,28 @@
[self.view addSubview:self.tableView]; [self.view addSubview:self.tableView];
self.backButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.backButton setImage:[UIImage customBackButtonImage] forState:UIControlStateNormal]; NSBundle *backIcon = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"uYouPlus" ofType:@"bundle"]];
UIImage *backImage = [UIImage imageNamed:@"Back.png" inBundle:backIcon compatibleWithTraitCollection:nil];
backImage = [self resizeImage:backImage newSize:CGSizeMake(24, 24)];
backImage = [backImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[self.backButton setTintColor:[UIColor whiteColor]];
[self.backButton setImage:backImage forState:UIControlStateNormal];
[self.backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; [self.backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
[self.backButton setFrame:CGRectMake(0, 0, 24, 24)];
UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithCustomView:self.backButton]; UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithCustomView:self.backButton];
self.navigationItem.leftBarButtonItem = customBackButton; self.navigationItem.leftBarButtonItem = customBackButton;
UIColor *buttonColor = [UIColor colorWithRed:203.0/255.0 green:22.0/255.0 blue:51.0/255.0 alpha:1.0];
UIImage *resetImage = [UIImage systemImageNamed:@"arrow.clockwise.circle.fill"];
UIBarButtonItem *resetButton = [[UIBarButtonItem alloc] initWithImage:resetImage style:UIBarButtonItemStylePlain target:self action:@selector(resetIcon)];
resetButton.tintColor = buttonColor;
UIImage *saveImage = [UIImage systemImageNamed:@"square.and.arrow.up.fill"];
UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithImage:saveImage style:UIBarButtonItemStylePlain target:self action:@selector(saveIcon)];
saveButton.tintColor = buttonColor;
self.navigationItem.rightBarButtonItems = @[saveButton, resetButton];
NSString *path = [[NSBundle mainBundle] pathForResource:@"uYouPlus" ofType:@"bundle"]; NSString *path = [[NSBundle mainBundle] pathForResource:@"uYouPlus" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:path]; NSBundle *bundle = [NSBundle bundleWithPath:path];
self.appIcons = [bundle pathsForResourcesOfType:@"png" inDirectory:@"AppIcons"]; self.appIcons = [bundle pathsForResourcesOfType:@"png" inDirectory:@"AppIcons"];
@ -56,8 +77,14 @@
cell.imageView.image = iconImage; cell.imageView.image = iconImage;
cell.imageView.layer.cornerRadius = 10.0; cell.imageView.layer.cornerRadius = 10.0;
cell.imageView.clipsToBounds = YES; cell.imageView.clipsToBounds = YES;
cell.imageView.frame = CGRectMake(10, 10, 40, 40);
cell.textLabel.frame = CGRectMake(60, 10, self.view.frame.size.width - 70, 40);
cell.accessoryType = (indexPath.row == self.selectedIconIndex) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; if (indexPath.row == self.selectedIconIndex) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell; return cell;
} }
@ -70,6 +97,11 @@
} }
- (void)resetIcon { - (void)resetIcon {
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
[infoDict removeObjectForKey:@"ALTAppIcon"];
[infoDict writeToFile:plistPath atomically:YES];
[[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) { [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {
if (error) { if (error) {
NSLog(@"Error resetting icon: %@", error.localizedDescription); NSLog(@"Error resetting icon: %@", error.localizedDescription);
@ -77,37 +109,70 @@
} else { } else {
NSLog(@"Icon reset successfully"); NSLog(@"Icon reset successfully");
[self showAlertWithTitle:@"Success" message:@"Icon reset successfully"]; [self showAlertWithTitle:@"Success" message:@"Icon reset successfully"];
[self.tableView reloadData]; dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
} }
}]; }];
} }
- (void)saveIcon { - (void)saveIcon {
if (self.selectedIconIndex < 0) { if (![UIApplication sharedApplication].supportsAlternateIcons) {
[self showAlertWithTitle:@"Error" message:@"No icon selected"]; NSLog(@"Alternate icons are not supported on this device.");
return; return;
} }
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *selectedIcon = self.appIcons[self.selectedIconIndex]; NSString *selectedIcon = self.selectedIconIndex >= 0 ? self.appIcons[self.selectedIconIndex] : nil;
NSString *iconName = [selectedIcon.lastPathComponent stringByDeletingPathExtension]; if (selectedIcon) {
NSString *iconName = [selectedIcon.lastPathComponent stringByDeletingPathExtension];
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
if (error) { NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
NSLog(@"Error setting alternate icon: %@", error.localizedDescription); NSMutableDictionary *infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
[self showAlertWithTitle:@"Error" message:@"Failed to set alternate icon"]; [infoDict setObject:iconName forKey:@"ALTAppIcon"];
[infoDict writeToFile:plistPath atomically:YES];
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"Error setting alternate icon: %@", error.localizedDescription);
[self showAlertWithTitle:@"Error" message:@"Failed to set alternate icon"];
} else {
NSLog(@"Alternate icon set successfully");
[self showAlertWithTitle:@"Success" message:@"Alternate icon set successfully"];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
}
}];
} else { } else {
NSLog(@"Alternate icon set successfully"); NSLog(@"Selected icon path is nil");
[self showAlertWithTitle:@"Success" message:@"Alternate icon set successfully"];
[self.tableView reloadData];
} }
}]; });
}
- (UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)size {
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
- (UIImage *)resizeImage:(UIImage *)image newSize:(CGSize)newSize {
UIGraphicsBeginImageContextWithOptions(newSize, NO, [UIScreen mainScreen].scale);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
} }
- (void)showAlertWithTitle:(NSString *)title message:(NSString *)message { - (void)showAlertWithTitle:(NSString *)title message:(NSString *)message {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; dispatch_async(dispatch_get_main_queue(), ^{
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:okAction]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[self presentViewController:alert animated:YES completion:nil]; [alert addAction:okAction];
[self presentViewController:alert animated:YES completion:nil];
});
} }
- (void)back { - (void)back {

View file

@ -25,7 +25,7 @@
%end %end
%ctor { %ctor {
if (IS_ENABLED(kBigYTMiniPlayer) && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) { if (IS_ENABLED(@"bigYTMiniPlayer_enabled") && (UIDevice.currentDevice.userInterfaceIdiom != UIUserInterfaceIdiomPad)) {
%init(BigYTMiniPlayer); %init(BigYTMiniPlayer);
} }
} }

View file

@ -10,13 +10,10 @@ static BOOL lowContrastMode() {
static BOOL customContrastMode() { static BOOL customContrastMode() {
return IS_ENABLED(@"lowContrastMode_enabled") && contrastMode() == 1; return IS_ENABLED(@"lowContrastMode_enabled") && contrastMode() == 1;
} }
// static UIColor *whiteTextColor() {
// return [UIColor whiteColor];
// }
UIColor *lcmHexColor; UIColor *lcmHexColor;
%group gLowContrastMode // Low Contrast Mode v1.6.0 BETA (Compatible with only YouTube v17.33.2-v17.38.10) %group gLowContrastMode // Low Contrast Mode v1.5.2 (Compatible with only YouTube v17.33.2-v17.38.10)
%hook UIColor %hook UIColor
+ (UIColor *)whiteColor { // Dark Theme Color + (UIColor *)whiteColor { // Dark Theme Color
return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00]; return [UIColor colorWithRed: 0.56 green: 0.56 blue: 0.56 alpha: 1.00];
@ -57,51 +54,39 @@ UIColor *lcmHexColor;
%end %end
%hook YTCommonColorPalette %hook YTCommonColorPalette
- (UIColor *)textPrimary { - (UIColor *)textPrimary {
NSLog(@"LowContrastMode: textPrimary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)textSecondary { - (UIColor *)textSecondary {
NSLog(@"LowContrastMode: textSecondary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)overlayTextPrimary { - (UIColor *)overlayTextPrimary {
NSLog(@"LowContrastMode: overlayTextPrimary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)overlayTextSecondary { - (UIColor *)overlayTextSecondary {
NSLog(@"LowContrastMode: overlayTextSecondary called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)iconActive { - (UIColor *)iconActive {
NSLog(@"LowContrastMode: iconActive called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)iconActiveOther { - (UIColor *)iconActiveOther {
NSLog(@"LowContrastMode: iconActiveOther called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)brandIconActive { - (UIColor *)brandIconActive {
NSLog(@"LowContrastMode: brandIconActive called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)staticBrandWhite { - (UIColor *)staticBrandWhite {
NSLog(@"LowContrastMode: staticBrandWhite called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)overlayIconActiveOther { - (UIColor *)overlayIconActiveOther {
NSLog(@"LowContrastMode: overlayIconActiveOther called");
return self.pageStyle == 1 ? [UIColor whiteColor] : %orig; return self.pageStyle == 1 ? [UIColor whiteColor] : %orig;
} }
- (UIColor *)overlayIconInactive { - (UIColor *)overlayIconInactive {
NSLog(@"LowContrastMode: overlayIconInactive called");
return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.7] : %orig; return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.7] : %orig;
} }
- (UIColor *)overlayIconDisabled { - (UIColor *)overlayIconDisabled {
NSLog(@"LowContrastMode: overlayIconDisabled called");
return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.3] : %orig; return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.3] : %orig;
} }
- (UIColor *)overlayFilledButtonActive { - (UIColor *)overlayFilledButtonActive {
NSLog(@"LowContrastMode: overlayFilledButtonActive called");
return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.2] : %orig; return self.pageStyle == 1 ? [[UIColor whiteColor] colorWithAlphaComponent:0.2] : %orig;
} }
%end %end
@ -261,21 +246,12 @@ UIColor *lcmHexColor;
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state); %orig(modifiedAttributes, state);
} }
- (void)setCustomTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *customAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[customAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(customAttributes, state);
}
%end %end
%hook UIButton %hook UIButton
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state { - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
color = [UIColor whiteColor]; color = [UIColor whiteColor];
%orig(color, state); %orig(color, state);
} }
- (void)setCustomTitleColor:(UIColor *)color forState:(UIControlState)state {
color = [UIColor whiteColor];
%orig(color, state);
}
%end %end
%hook UIBarButtonItem %hook UIBarButtonItem
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state { - (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
@ -283,11 +259,6 @@ UIColor *lcmHexColor;
[modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName]; [modifiedAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(modifiedAttributes, state); %orig(modifiedAttributes, state);
} }
- (void)setCustomTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state {
NSMutableDictionary *customAttributes = [NSMutableDictionary dictionaryWithDictionary:attributes];
[customAttributes setObject:[UIColor whiteColor] forKey:NSForegroundColorAttributeName];
%orig(customAttributes, state);
}
%end %end
%hook NSAttributedString %hook NSAttributedString
- (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSAttributedStringKey, id> *)attrs { - (instancetype)initWithString:(NSString *)str attributes:(NSDictionary<NSAttributedStringKey, id> *)attrs {
@ -579,18 +550,7 @@ UIColor *lcmHexColor;
%end %end
%hook CATextLayer %hook CATextLayer
- (void)setTextColor:(CGColorRef)textColor { - (void)setTextColor:(CGColorRef)textColor {
%orig([[UIColor whiteColor] CGColor]); %orig([UIColor whiteColor].CGColor);
}
%end
%hook _ASDisplayView
- (void)setAttributedText:(NSAttributedString *)attributedText {
NSMutableAttributedString *newAttributedString = [attributedText mutableCopy];
[newAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, newAttributedString.length)];
%orig(newAttributedString);
}
- (void)setTextColor:(UIColor *)textColor {
textColor = [UIColor whiteColor];
%orig(textColor);
} }
%end %end
%hook ASTextNode %hook ASTextNode
@ -603,20 +563,20 @@ UIColor *lcmHexColor;
%end %end
%hook ASTextFieldNode %hook ASTextFieldNode
- (void)setTextColor:(UIColor *)textColor { - (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]); %orig([UIColor whiteColor]);
} }
%end %end
%hook ASTextView %hook ASTextView
- (void)setTextColor:(UIColor *)textColor { - (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]); %orig([UIColor whiteColor]);
} }
%end %end
%hook ASButtonNode %hook ASButtonNode
- (void)setTextColor:(UIColor *)textColor { - (void)setTextColor:(UIColor *)textColor {
%orig([UIColor whiteColor]); %orig([UIColor whiteColor]);
} }
%end %end
%hook UIControl %hook UIControl // snackbar fix for lcm
- (UIColor *)backgroundColor { - (UIColor *)backgroundColor {
return [UIColor blackColor]; return [UIColor blackColor];
} }

View file

@ -1,43 +0,0 @@
#import "uYouPlus.h"
#import "uYouPlusSettings.h"
// Keys for "Copy settings" button (for: uYouEnhanced)
// In alphabetical order for tweaks after uYouEnhanced
NSArray *NSUserDefaultsCopyKeys = @[
// uYouEnhanced - gathered using get_keys.py
kReplaceCopyandPasteButtons, kAppTheme, kOLEDKeyboard, kPortraitFullscreen, kFullscreenToTheRight, kSlideToSeek, kYTTapToSeek, kDoubleTapToSeek, kSnapToChapter, kPinchToZoom, kYTMiniPlayer, kStockVolumeHUD, kReplaceYTDownloadWithuYou, kDisablePullToFull, kDisableChapterSkip, kAlwaysShowRemainingTime, kDisableRemainingTime, kEnableShareButton, kEnableSaveToButton, kHideYTMusicButton, kHideAutoplaySwitch, kHideCC, kHideVideoTitle, kDisableCollapseButton, kDisableFullscreenButton, kHideHUD, kHidePaidPromotionCard, kHideChannelWatermark, kHideVideoPlayerShadowOverlayButtons, kHidePreviousAndNextButton, kRedProgressBar, kHideHoverCards, kHideRightPanel, kHideFullscreenActions, kHideSuggestedVideo, kHideHeatwaves, kHideDoubleTapToSeekOverlay, kHideOverlayDarkBackground, kDisableAmbientMode, kHideVideosInFullscreen, kHideRelatedWatchNexts, kHideBuySuperThanks, kHideSubscriptions, kShortsQualityPicker, kRedSubscribeButton, kHideButtonContainers, kHideConnectButton, kHideShareButton, kHideRemixButton, kHideThanksButton, kHideDownloadButton, kHideClipButton, kHideSaveToPlaylistButton, kHideReportButton, kHidePreviewCommentSection, kHideCommentSection, kDisableAccountSection, kDisableAutoplaySection, kDisableTryNewFeaturesSection, kDisableVideoQualityPreferencesSection, kDisableNotificationsSection, kDisableManageAllHistorySection, kDisableYourDataInYouTubeSection, kDisablePrivacySection, kDisableLiveChatSection, kHidePremiumPromos, kHideHomeTab, kLowContrastMode, kClassicVideoPlayer, kFixLowContrastMode, kDisableModernButtons, kDisableRoundedHints, kDisableModernFlags, kYTNoModernUI, kEnableVersionSpoofer, kGoogleSignInPatch, kAdBlockWorkaroundLite, kAdBlockWorkaround, kYouTabFakePremium, kDisableAnimatedYouTubeLogo, kCenterYouTubeLogo, kHideYouTubeLogo, kYTStartupAnimation, kDisableHints, kStickNavigationBar, kHideiSponsorBlockButton, kHideChipBar, kHidePlayNextInQueue, kHideCommunityPosts, kHideChannelHeaderLinks, kiPhoneLayout, kBigYTMiniPlayer, kReExplore, kAutoHideHomeBar, kHideSubscriptionsNotificationBadge, kFixCasting, kNewSettingsUI, kFlex, kGoogleSigninFix,
// uYou - https://github.com/MiRO92/uYou-for-YouTube
@"showedWelcomeVC", @"hideShortsTab", @"hideCreateTab", @"hideCastButton", @"relatedVideosAtTheEndOfYTVideos", @"removeYouTubeAds", @"backgroundPlayback", @"disableAgeRestriction", @"iPadLayout", @"noSuggestedVideoAtEnd", @"shortsProgressBar", @"hideShortsCells", @"removeShortsCell", @"startupPage",
// DEMC - https://github.com/therealFoxster/DontEatMyContent/blob/master/Tweak.h
@"DEMC_enabled", @"DEMC_colorViewsEnabled", @"DEMC_safeAreaConstant", @"DEMC_disableAmbientMode",
@"DEMC_limitZoomToFill", @"DEMC_enableForAllVideos",
// iSponsorBlock cannot be exported using this method - it is also being removed in v5
// Return-YouTube-Dislike - https://github.com/PoomSmart/Return-YouTube-Dislikes/blob/main/TweakSettings.h
@"RYD-ENABLED", @"RYD-VOTE-SUBMISSION", @"RYD-EXACT-LIKE-NUMBER", @"RYD-EXACT-NUMBER",
// All YTVideoOverlay Tweaks - https://github.com/PoomSmart/YTVideoOverlay/blob/0fc6d29d1aa9e75f8c13d675daec9365f753d45e/Tweak.x#L28C1-L41C84
@"YTVideoOverlay-YouLoop-Enabled", @"YTVideoOverlay-YouTimeStamp-Enabled", @"YTVideoOverlay-YouMute-Enabled",
@"YTVideoOverlay-YouQuality-Enabled", @"YTVideoOverlay-YouLoop-Position", @"YTVideoOverlay-YouTimeStamp-Position",
@"YTVideoOverlay-YouMute-Position", @"YTVideoOverlay-YouQuality-Position",
// YouPiP - https://github.com/PoomSmart/YouPiP/blob/main/Header.h
@"YouPiPPosition", @"CompatibilityModeKey", @"PiPActivationMethodKey", @"PiPActivationMethod2Key",
@"NoMiniPlayerPiPKey", @"NonBackgroundableKey",
// YTABConfig cannot be reasonably exported using this method
// YTHoldForSpeed will be removed in v5
// YouTube Plus / YTLite cannot be exported using this method
// YTUHD - https://github.com/PoomSmart/YTUHD/blob/master/Header.h
@"EnableVP9", @"AllVP9",
// Useful YouTube Keys
@"inline_muted_playback_enabled",
];
// Some default values to ignore when exporting settings
NSDictionary *NSUserDefaultsCopyKeysDefaults = @{
@"fixCasting_enabled": @1,
@"inline_muted_playback_enabled": @5,
@"newSettingsUI_enabled": @1,
@"DEMC_safeAreaConstant": @21.5,
@"RYD-ENABLED": @1,
@"RYD-VOTE-SUBMISSION": @1,
// Duplicate keys are not allowed in NSDictionary. If present, only the last one will be kept.
};

View file

@ -3,7 +3,7 @@
// YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/ // YTMiniPlayerEnabler: https://github.com/level3tjg/YTMiniplayerEnabler/
%hook YTWatchMiniBarViewController %hook YTWatchMiniBarViewController
- (void)updateMiniBarPlayerStateFromRenderer { - (void)updateMiniBarPlayerStateFromRenderer {
if (IS_ENABLED(kYTMiniPlayer)) {} if (IS_ENABLED(@"ytMiniPlayer_enabled")) {}
else { return %orig; } else { return %orig; }
} }
%end %end

View file

@ -3,7 +3,7 @@
// YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards // YTNoHoverCards: https://github.com/level3tjg/YTNoHoverCards
%hook YTCreatorEndscreenView %hook YTCreatorEndscreenView
- (void)setHidden:(BOOL)hidden { - (void)setHidden:(BOOL)hidden {
if (IS_ENABLED(kHideHoverCards)) if (IS_ENABLED(@"hideHoverCards_enabled"))
hidden = YES; hidden = YES;
%orig; %orig;
} }

View file

@ -5,18 +5,18 @@
// YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo // YTNoPaidPromo: https://github.com/PoomSmart/YTNoPaidPromo
%hook YTMainAppVideoPlayerOverlayViewController %hook YTMainAppVideoPlayerOverlayViewController
- (void)setPaidContentWithPlayerData:(id)data { - (void)setPaidContentWithPlayerData:(id)data {
if (IS_ENABLED(kHidePaidPromotionCard)) {} if (IS_ENABLED(@"hidePaidPromotionCard_enabled")) {}
else { return %orig; } else { return %orig; }
} }
- (void)playerOverlayProvider:(YTPlayerOverlayProvider *)provider didInsertPlayerOverlay:(YTPlayerOverlay *)overlay { - (void)playerOverlayProvider:(YTPlayerOverlayProvider *)provider didInsertPlayerOverlay:(YTPlayerOverlay *)overlay {
if ([[overlay overlayIdentifier] isEqualToString:@"player_overlay_paid_content"] && IS_ENABLED(kHidePaidPromotionCard)) return; if ([[overlay overlayIdentifier] isEqualToString:@"player_overlay_paid_content"] && IS_ENABLED(@"hidePaidPromotionCard_enabled")) return;
%orig; %orig;
} }
%end %end
%hook YTInlineMutedPlaybackPlayerOverlayViewController %hook YTInlineMutedPlaybackPlayerOverlayViewController
- (void)setPaidContentWithPlayerData:(id)data { - (void)setPaidContentWithPlayerData:(id)data {
if (IS_ENABLED(kHidePaidPromotionCard)) {} if (IS_ENABLED(@"hidePaidPromotionCard_enabled")) {}
else { return %orig; } else { return %orig; }
} }
%end %end

View file

@ -38,7 +38,7 @@ static void replaceTab(YTIGuideResponse *response) {
%end %end
%ctor { %ctor {
if (IS_ENABLED(kReExplore)) { if (IS_ENABLED(@"reExplore_enabled")) {
%init(YTReExplore); %init(YTReExplore);
} }
} }

View file

@ -1,61 +1,53 @@
#import <UIKit/UIKit.h> #import <UIKit/UIKit.h>
#import <HBLog.h>
#import <Foundation/Foundation.h>
#import <CaptainHook/CaptainHook.h>
#import <dlfcn.h>
#import <LocalAuthentication/LocalAuthentication.h> #import <LocalAuthentication/LocalAuthentication.h>
#import <CaptainHook/CaptainHook.h>
#import <Foundation/Foundation.h>
#import <objc/runtime.h> #import <objc/runtime.h>
#import <rootless.h> #import <dlfcn.h>
#import <substrate.h>
#import <sys/utsname.h> #import <sys/utsname.h>
#import <YouTubeHeader/ASCollectionElement.h> #import <substrate.h>
#import <YouTubeHeader/ASCollectionView.h> #import <rootless.h>
#import <YouTubeHeader/ELMCellNode.h>
#import <YouTubeHeader/ELMNodeController.h> #import "uYouPlusThemes.h" // Hide "Buy Super Thanks" banner (_ASDisplayView)
#import <YouTubeHeader/ELMPBElement.h> #import <YouTubeHeader/YTAppDelegate.h> // Activate FLEX
#import <YouTubeHeader/ELMPBProperties.h> #import <YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h>
#import <YouTubeHeader/ELMPBIdentifierProperties.h> #import <YouTubeHeader/YTIPlayerBarDecorationModel.h>
#import <YouTubeHeader/GPBMessage.h> #import <YouTubeHeader/YTPlayerBarRectangleDecorationView.h>
#import <YouTubeHeader/MLPlayerStickySettings.h> #import <YouTubeHeader/YTVideoQualitySwitchOriginalController.h>
#import <YouTubeHeader/YTAppDelegate.h>
#import <YouTubeHeader/YTCollectionViewCell.h>
#import <YouTubeHeader/YTIBrowseRequest.h>
#import <YouTubeHeader/YTIButtonRenderer.h>
#import <YouTubeHeader/YTICompactLinkRenderer.h>
#import <YouTubeHeader/YTICompactListItemRenderer.h>
#import <YouTubeHeader/YTICompactListItemThumbnailSupportedRenderers.h>
#import <YouTubeHeader/YTIIconThumbnailRenderer.h>
#import <YouTubeHeader/YTIElementRenderer.h>
#import <YouTubeHeader/YTIFormattedString.h>
#import <YouTubeHeader/YTIGuideResponse.h> #import <YouTubeHeader/YTIGuideResponse.h>
#import <YouTubeHeader/YTIGuideResponseSupportedRenderers.h> #import <YouTubeHeader/YTIGuideResponseSupportedRenderers.h>
#import <YouTubeHeader/YTIMenuConditionalServiceItemRenderer.h>
#import <YouTubeHeader/YTInnerTubeCollectionViewController.h>
#import <YouTubeHeader/YTInlinePlayerBarContainerView.h>
#import <YouTubeHeader/YTIPivotBarItemRenderer.h>
#import <YouTubeHeader/YTIPivotBarRenderer.h>
#import <YouTubeHeader/YTIPivotBarSupportedRenderers.h> #import <YouTubeHeader/YTIPivotBarSupportedRenderers.h>
#import <YouTubeHeader/YTIPlayerBarDecorationModel.h> #import <YouTubeHeader/YTIPivotBarItemRenderer.h>
#import <YouTubeHeader/YTIBrowseRequest.h>
#import <YouTubeHeader/YTIButtonRenderer.h>
#import <YouTubeHeader/YTIElementRenderer.h>
#import <YouTubeHeader/YTISectionListRenderer.h> #import <YouTubeHeader/YTISectionListRenderer.h>
#import <YouTubeHeader/YTIStringRun.h> #import <YouTubeHeader/YTWatchNextResultsViewController.h>
#import <YouTubeHeader/YTMainAppVideoPlayerOverlayViewController.h>
#import <YouTubeHeader/YTMainAppVideoPlayerOverlayView.h>
#import <YouTubeHeader/YTNavigationBarTitleView.h>
#import <YouTubeHeader/YTPlayerBarController.h>
#import <YouTubeHeader/YTPlayerBarRectangleDecorationView.h>
#import <YouTubeHeader/YTPlayerOverlay.h> #import <YouTubeHeader/YTPlayerOverlay.h>
#import <YouTubeHeader/YTPlayerOverlayProvider.h> #import <YouTubeHeader/YTPlayerOverlayProvider.h>
#import <YouTubeHeader/YTPlayerOverlayManager.h> #import <YouTubeHeader/YTMainAppVideoPlayerOverlayView.h>
#import <YouTubeHeader/YTReelModel.h> #import <YouTubeHeader/YTMainAppVideoPlayerOverlayViewController.h>
#import <YouTubeHeader/YTReelWatchPlaybackOverlayView.h> #import <YouTubeHeader/YTReelWatchPlaybackOverlayView.h>
#import <YouTubeHeader/YTResponder.h> #import <YouTubeHeader/YTInlinePlayerBarContainerView.h>
#import <YouTubeHeader/YTVideoQualitySwitchOriginalController.h> #import <YouTubeHeader/YTInnerTubeCollectionViewController.h>
#import <YouTubeHeader/YTVideoWithContextNode.h> #import <YouTubeHeader/YTPivotBarItemView.h>
#import <YouTubeHeader/YTWatchNextResultsViewController.h> #import <YouTubeHeader/YTCollectionViewCell.h>
#import <YouTubeHeader/YTWatchPlayerViewLayoutSource.h> #import <YouTubeHeader/YTIFormattedString.h>
#import <YouTubeHeader/YTWatchPullToFullController.h> #import <YouTubeHeader/GPBMessage.h>
#import <YouTubeHeader/YTIStringRun.h>
#import <YouTubeHeader/YTWatchViewController.h> #import <YouTubeHeader/YTWatchViewController.h>
#import "uYouPlusThemes.h" // uYouPlus Themes #import <YouTubeHeader/YTIPivotBarRenderer.h>
#import <YouTubeHeader/YTPlayerOverlayManager.h> // Fixes uYou crash when trying to play video (#1422)
// Hide buttons under the video player by @PoomSmart
#import <YouTubeHeader/ASCollectionElement.h>
#import <YouTubeHeader/ASCollectionView.h>
#import <YouTubeHeader/ELMNodeController.h>
// YouTube-X
#import <YouTubeHeader/YTReelModel.h>
#import <YouTubeHeader/YTVideoWithContextNode.h>
#import <YouTubeHeader/ELMCellNode.h>
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil] #define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define IS_ENABLED(k) [[NSUserDefaults standardUserDefaults] boolForKey:k] #define IS_ENABLED(k) [[NSUserDefaults standardUserDefaults] boolForKey:k]
@ -65,120 +57,13 @@
#define DEFAULT_RATE 1.0f // YTSpeed #define DEFAULT_RATE 1.0f // YTSpeed
#define LOWCONTRASTMODE_CUTOFF_VERSION @"17.38.10" // LowContrastMode (v17.33.2-17.38.10) #define LOWCONTRASTMODE_CUTOFF_VERSION @"17.38.10" // LowContrastMode (v17.33.2-17.38.10)
// Keys
// Copy/Paste Settings
static NSString *const kReplaceCopyandPasteButtons = @"replaceCopyandPasteButtons_enabled";
// App appearance
static NSString *const kAppTheme = @"appTheme";
static NSString *const kOLEDKeyboard = @"oledKeyBoard_enabled";
// Video player
static NSString *const kPortraitFullscreen = @"portraitFullscreen_enabled";
static NSString *const kFullscreenToTheRight = @"fullscreenToTheRight_enabled";
static NSString *const kSlideToSeek = @"slideToSeek_enabled";
static NSString *const kYTTapToSeek = @"YTTapToSeek_enabled";
static NSString *const kDoubleTapToSeek = @"doubleTapToSeek_enabled";
static NSString *const kSnapToChapter = @"snapToChapter_enabled";
static NSString *const kPinchToZoom = @"pinchToZoom_enabled";
static NSString *const kYTMiniPlayer = @"ytMiniPlayer_enabled";
static NSString *const kStockVolumeHUD = @"stockVolumeHUD_enabled";
static NSString *const kReplaceYTDownloadWithuYou = @"kReplaceYTDownloadWithuYou_enabled";
static NSString *const kDisablePullToFull = @"disablePullToFull_enabled";
static NSString *const kDisableChapterSkip = @"disableChapterSkip_enabled";
static NSString *const kAlwaysShowRemainingTime = @"alwaysShowRemainingTime_enabled";
static NSString *const kDisableRemainingTime = @"disableRemainingTime_enabled";
// Video controls overlay
static NSString *const kEnableShareButton = @"enableShareButton_enabled";
static NSString *const kEnableSaveToButton = @"enableSaveToButton_enabled";
static NSString *const kHideYTMusicButton = @"hideYTMusicButton_enabled";
static NSString *const kHideAutoplaySwitch = @"hideAutoplaySwitch_enabled";
static NSString *const kHideCC = @"hideCC_enabled";
static NSString *const kHideVideoTitle = @"hideVideoTitle_enabled";
static NSString *const kDisableCollapseButton = @"disableCollapseButton_enabled";
static NSString *const kDisableFullscreenButton = @"disableFullscreenButton_enabled";
static NSString *const kHideHUD = @"hideHUD_enabled";
static NSString *const kHidePaidPromotionCard = @"hidePaidPromotionCard_enabled";
static NSString *const kHideChannelWatermark = @"hideChannelWatermark_enabled";
static NSString *const kHideVideoPlayerShadowOverlayButtons = @"hideVideoPlayerShadowOverlayButtons_enabled";
static NSString *const kHidePreviousAndNextButton = @"hidePreviousAndNextButton_enabled";
static NSString *const kRedProgressBar = @"redProgressBar_enabled";
static NSString *const kHideHoverCards = @"hideHoverCards_enabled";
static NSString *const kHideRightPanel = @"hideRightPanel_enabled";
static NSString *const kHideFullscreenActions = @"hideFullscreenActions_enabled";
static NSString *const kHideSuggestedVideo = @"hideSuggestedVideo_enabled";
static NSString *const kHideHeatwaves = @"hideHeatwaves_enabled";
static NSString *const kHideDoubleTapToSeekOverlay = @"hideDoubleTapToSeekOverlay_enabled";
static NSString *const kHideOverlayDarkBackground = @"hideOverlayDarkBackground_enabled";
static NSString *const kDisableAmbientMode = @"disableAmbientMode_enabled";
static NSString *const kHideVideosInFullscreen = @"hideVideosInFullscreen_enabled";
static NSString *const kHideRelatedWatchNexts = @"hideRelatedWatchNexts_enabled";
// Shorts control overlay
static NSString *const kHideBuySuperThanks = @"hideBuySuperThanks_enabled";
static NSString *const kHideSubscriptions = @"hideSubscriptions_enabled";
static NSString *const kShortsQualityPicker = @"shortsQualityPicker_enabled";
// Video player buttons
static NSString *const kRedSubscribeButton = @"redSubscribeButton_enabled";
static NSString *const kHideButtonContainers = @"hideButtonContainers_enabled";
static NSString *const kHideConnectButton = @"hideConnectButton_enabled";
static NSString *const kHideShareButton = @"hideShareButton_enabled";
static NSString *const kHideRemixButton = @"hideRemixButton_enabled";
static NSString *const kHideThanksButton = @"hideRemixButton_enabled";
static NSString *const kHideDownloadButton = @"hideDownloadButton_enabled";
static NSString *const kHideClipButton = @"hideClipButton_enabled";
static NSString *const kHideSaveToPlaylistButton = @"hideSaveToPlaylistButton_enabled";
static NSString *const kHideReportButton = @"hideReportButton_enabled";
static NSString *const kHidePreviewCommentSection = @"hidePreviewCommentSection_enabled";
static NSString *const kHideCommentSection = @"hideCommentSection_enabled";
// App settings overlay
static NSString *const kDisableAccountSection = @"disableAccountSection_enabled";
static NSString *const kDisableAutoplaySection = @"disableAutoplaySection_enabled";
static NSString *const kDisableTryNewFeaturesSection = @"disableTryNewFeaturesSection_enabled";
static NSString *const kDisableVideoQualityPreferencesSection = @"disableVideoQualityPreferencesSection_enabled";
static NSString *const kDisableNotificationsSection = @"disableNotificationsSection_enabled";
static NSString *const kDisableManageAllHistorySection = @"disableManageAllHistorySection_enabled";
static NSString *const kDisableYourDataInYouTubeSection = @"disableYourDataInYouTubeSection_enabled";
static NSString *const kDisablePrivacySection = @"disablePrivacySection_enabled";
static NSString *const kDisableLiveChatSection = @"disableLiveChatSection_enabled";
static NSString *const kHidePremiumPromos = @"hidePremiumPromos_enabled";
// UI Interface
static NSString *const kHideHomeTab = @"hideHomeTab_enabled";
static NSString *const kLowContrastMode = @"lowContrastMode_enabled";
static NSString *const kClassicVideoPlayer = @"classicVideoPlayer_enabled";
static NSString *const kFixLowContrastMode = @"fixLowContrastMode_enabled";
static NSString *const kDisableModernButtons = @"disableModernButtons_enabled";
static NSString *const kDisableRoundedHints = @"disableRoundedHints_enabled";
static NSString *const kDisableModernFlags = @"disableModernFlags_enabled";
static NSString *const kYTNoModernUI = @"ytNoModernUI_enabled";
static NSString *const kEnableVersionSpoofer = @"enableVersionSpoofer_enabled";
// Miscellaneous
static NSString *const kGoogleSignInPatch = @"googleSignInPatch_enabled";
static NSString *const kAdBlockWorkaroundLite = @"adBlockWorkaroundLite_enabled";
static NSString *const kAdBlockWorkaround = @"adBlockWorkaround_enabled";
static NSString *const kYouTabFakePremium = @"youTabFakePremium_enabled";
static NSString *const kDisableAnimatedYouTubeLogo = @"disableAnimatedYouTubeLogo_enabled";
static NSString *const kCenterYouTubeLogo = @"centerYouTubeLogo_enabled";
static NSString *const kHideYouTubeLogo = @"hideYouTubeLogo_enabled";
static NSString *const kYTStartupAnimation = @"ytStartupAnimation_enabled";
static NSString *const kDisableHints = @"disableHints_enabled";
static NSString *const kStickNavigationBar = @"stickNavigationBar_enabled";
static NSString *const kHideiSponsorBlockButton = @"hideiSponsorBlockButton_enabled";
static NSString *const kHideChipBar = @"hideChipBar_enabled";
static NSString *const kHidePlayNextInQueue = @"hidePlayNextInQueue_enabled";
static NSString *const kHideCommunityPosts = @"hideCommunityPosts_enabled";
static NSString *const kHideChannelHeaderLinks = @"hideChannelHeaderLinks_enabled";
static NSString *const kiPhoneLayout = @"iPhoneLayout_enabled";
static NSString *const kBigYTMiniPlayer = @"bigYTMiniPlayer_enabled";
static NSString *const kReExplore = @"reExplore_enabled";
static NSString *const kAutoHideHomeBar = @"autoHideHomeBar_enabled";
static NSString *const kHideSubscriptionsNotificationBadge = @"hideSubscriptionsNotificationBadge_enabled";
static NSString *const kFixCasting = @"fixCasting_enabled";
static NSString *const kNewSettingsUI = @"newSettingsUI_enabled";
static NSString *const kFlex = @"flex_enabled";
// unused (uYouEnhanced)
static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
// Always show remaining time in video player - @bhackel // Always show remaining time in video player - @bhackel
// Header has been moved to https://github.com/PoomSmart/YouTubeHeader/blob/main/YTPlayerBarController.h @interface YTPlayerBarController : NSObject
// Header has been moved to https://github.com/PoomSmart/YouTubeHeader/blob/main/YTInlinePlayerBarContainerView.h @property(nonatomic, strong) YTInlinePlayerBarContainerView *playerBar;
@end
@interface YTInlinePlayerBarContainerView (uYouEnhanced)
@property(nonatomic, assign) BOOL shouldDisplayTimeRemaining;
@end
// IAmYouTube // IAmYouTube
@interface SSOConfiguration : NSObject @interface SSOConfiguration : NSObject
@ -197,18 +82,15 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
- (CABasicAnimation *)uYouEnhancedGetBlankColorAnimation; - (CABasicAnimation *)uYouEnhancedGetBlankColorAnimation;
@end @end
// OLED Live Chat - @bhackel
@interface YTLUserDefaults : NSUserDefaults
+ (void)exportYtlSettings;
@end
// Hide Home Tab - @bhackel // Hide Home Tab - @bhackel
@interface YTPivotBarItemViewAccessibilityControl : UIControl @interface YTPivotBarItemViewAccessibilityControl : UIControl
@end @end
// YTPivotBarItemView Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTPivotBarItemView.h @interface YTPivotBarItemView (uYouEnhanced)
@property (nonatomic, strong) YTPivotBarItemViewAccessibilityControl *hitTarget;
@end
// YTTapToSeek - https://github.com/bhackel/YTTapToSeek // YTTapToSeek - https://github.com/bhackel/YTTapToSeek
// YTMainAppVideoPlayerOverlayViewController Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTMainAppVideoPlayerOverlayViewController.h // Header has been moved to https://github.com/arichornlover/YouTubeHeader/blob/main/YTMainAppVideoPlayerOverlayViewController.h
// Enable Premium logo - @bhackel // Enable Premium logo - @bhackel
@interface YTITopbarLogoRenderer : NSObject @interface YTITopbarLogoRenderer : NSObject
@ -216,12 +98,36 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
@end @end
// Hide Premium Promo in You tab - @bhackel // Hide Premium Promo in You tab - @bhackel
// YTIIconThumbnailRenderer Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTIIconThumbnailRenderer.h @interface YTIIconThumbnailRenderer : GPBMessage
// YTICompactListItemThumbnailSupportedRenderers Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTICompactListItemThumbnailSupportedRenderers.h @property (nonatomic, strong) YTIIcon *icon;
// YTICompactListItemRenderer Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTICompactListItemRenderer.h - (BOOL)hasIcon;
// YTIIcon Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTIIcon.h @end
// YTICompactLinkRenderer Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTICompactLinkRenderer.h @interface YTICompactListItemThumbnailSupportedRenderers : GPBMessage
// YTIItemSectionSupportedRenderers Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/YTIItemSectionSupportedRenderers.h @property (nonatomic, strong) YTIIconThumbnailRenderer *iconThumbnailRenderer;
- (BOOL)hasIconThumbnailRenderer;
@end
@interface YTICompactListItemRenderer : GPBMessage
@property (nonatomic, strong) YTICompactListItemThumbnailSupportedRenderers *thumbnail;
@property (nonatomic, strong) YTIFormattedString *title;
- (BOOL)hasThumbnail;
- (BOOL)hasTitle;
@end
@interface YTIIcon (uYouEnhanced)
- (BOOL)hasIconType;
@end
@interface YTICompactLinkRenderer : GPBMessage
@property (nonatomic, strong) YTIIcon *icon;
@property (nonatomic, strong) YTIFormattedString *title;
@property (nonatomic, strong) YTICompactListItemThumbnailSupportedRenderers *thumbnail;
- (BOOL)hasIcon;
- (BOOL)hasThumbnail;
@end
@interface YTIItemSectionSupportedRenderers (uYouEnhanced)
@property(readonly, nonatomic) YTICompactLinkRenderer *compactLinkRenderer;
@property(readonly, nonatomic) YTICompactListItemRenderer *compactListItemRenderer;
- (BOOL)hasCompactLinkRenderer;
- (BOOL)hasCompactListItemRenderer;
@end
@interface YTAppCollectionViewController : YTInnerTubeCollectionViewController @interface YTAppCollectionViewController : YTInnerTubeCollectionViewController
- (void)uYouEnhancedFakePremiumModel:(YTISectionListRenderer *)model; - (void)uYouEnhancedFakePremiumModel:(YTISectionListRenderer *)model;
@end @end
@ -230,18 +136,17 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
@end @end
// Disable Pull to Full for landscape videos - @bhackel // Disable Pull to Full for landscape videos - @bhackel
// YTWatchPullToFullController Header has been moved to https://github.com/PoomSmart/YouTubeHeader/blob/main/YTWatchPullToFullController.h @interface YTWatchPullToFullController : NSObject
@property(nonatomic, strong) YTWatchViewController *playerViewSource;
// Fullscreen to the Right (uYouEnhanced Version) - @arichornlover @end
@interface YTWatchViewController (uYouEnhanced) @interface YTWatchViewController (uYouEnhanced)
@property(nonatomic, strong) YTWatchPullToFullController *pullToFullController;
- (NSUInteger) allowedFullScreenOrientations;
// Fullscreen to the Right (uYouEnhanced Version) - @arichornlover
- (BOOL) fullscreen;
- (UIInterfaceOrientationMask) supportedInterfaceOrientations; - (UIInterfaceOrientationMask) supportedInterfaceOrientations;
- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation; - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation;
@end - (void)forceRightFullscreenOrientation;
// Center YouTube Logo (Custom Version) - @arichornlover
@interface YTNavigationBarTitleView (uYouEnhanced)
@property (nonatomic, strong) UIView *customView;
- (void)alignCustomViewToCenterOfWindow;
@end @end
// uYouPlus // uYouPlus
@ -249,6 +154,9 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
@property(readonly, nonatomic) long long pageStyle; @property(readonly, nonatomic) long long pageStyle;
@end @end
@interface YTNavigationBarTitleView : UIView
@end
@interface YTChipCloudCell : UIView @interface YTChipCloudCell : UIView
@end @end
@ -281,9 +189,6 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
@interface YTPlaybackButton : UIControl @interface YTPlaybackButton : UIControl
@end @end
@interface HelperVC : UIViewController
@end
@interface YTPlaylistHeaderViewController : UIViewController @interface YTPlaylistHeaderViewController : UIViewController
@property UIButton *downloadsButton; @property UIButton *downloadsButton;
@end @end
@ -291,16 +196,17 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
// Buttons // Buttons
@interface YTRightNavigationButtons : UIView @interface YTRightNavigationButtons : UIView
- (id)_viewControllerForAncestor; - (id)_viewControllerForAncestor;
@property (readonly, nonatomic) NSArray *dynamicButtons; @property(readonly, nonatomic) YTQTMButton *searchButton;
@property (readonly, nonatomic) NSArray *visibleButtons; @property(readonly, nonatomic) YTQTMButton *notificationButton;
@property (readonly, nonatomic) NSArray *buttons; @property(strong, nonatomic) YTQTMButton *sponsorBlockButton;
@property (readonly, nonatomic) YTQTMButton *searchButton; @property(strong, nonatomic) YTQTMButton *uYouPlusButton;
@property (readonly, nonatomic) YTQTMButton *notificationButton;
@property (strong, nonatomic) YTQTMButton *sponsorBlockButton;
@property (strong, nonatomic) YTQTMButton *settingsButton;
- (void)setDynamicButtons:(NSArray *)buttons;
- (void)setLeadingPadding:(CGFloat)arg1; - (void)setLeadingPadding:(CGFloat)arg1;
- (void)settingsAction; - (void)uYouPlusRootOptionsAction;
@end
@interface YTISlimMetadataButtonSupportedRenderers : NSObject
- (id)slimButton_buttonRenderer;
- (id)slimMetadataButtonRenderer;
@end @end
// YTSpeed // YTSpeed
@ -315,7 +221,9 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
- (void)internalSetRate; - (void)internalSetRate;
@end @end
// MLPlayerStickySettings Header has been moved to https://github.com/arichornloverALT/YouTubeHeader/blob/main/MLPlayerStickySettings.h @interface MLPlayerStickySettings (uYouPlus)
- (void)setRate:(float)rate;
@end
@interface MLPlayerEventCenter : NSObject @interface MLPlayerEventCenter : NSObject
- (void)broadcastRateChange:(float)rate; - (void)broadcastRateChange:(float)rate;
@ -355,9 +263,6 @@ static NSString *const kGoogleSigninFix = @"googleSigninFix_enabled";
@interface ELMContainerNode : NSObject @interface ELMContainerNode : NSObject
@end @end
@interface YTWrapperSplitView : UIView
@end
@interface YTAutonavEndscreenView : UIView @interface YTAutonavEndscreenView : UIView
@end @end

File diff suppressed because it is too large Load diff

View file

@ -1,12 +1,10 @@
#import <UIKit/UIActivityViewController.h> #import <UIKit/UIActivityViewController.h>
#import <YouTubeHeader/YTUIUtils.h> #import <YouTubeHeader/YTUIUtils.h>
#import <YouTubeHeader/YTCommonUtils.h>
#import <YouTubeHeader/YTColorPalette.h> #import <YouTubeHeader/YTColorPalette.h>
#import <YouTubeHeader/YTCommonColorPalette.h> #import <YouTubeHeader/YTCommonColorPalette.h>
#import <YouTubeHeader/GOODialogView.h> #import "Tweaks/protobuf/objectivec/GPBDescriptor.h"
#import <YouTubeHeader/GPBDescriptor.h> #import "Tweaks/protobuf/objectivec/GPBUnknownField.h"
#import <YouTubeHeader/GPBUnknownField.h> #import "Tweaks/protobuf/objectivec/GPBUnknownFieldSet.h"
#import <YouTubeHeader/GPBUnknownFields.h>
#import "uYouPlus.h" #import "uYouPlus.h"
@interface PlayerManager : NSObject @interface PlayerManager : NSObject
@ -75,15 +73,6 @@
@interface ELMPBShowActionSheetCommand : GPBMessage @interface ELMPBShowActionSheetCommand : GPBMessage
@property (nonatomic, strong, readwrite) ELMPBCommand *onAppear; @property (nonatomic, strong, readwrite) ELMPBCommand *onAppear;
@property (nonatomic, assign, readwrite) BOOL hasOnAppear; @property (nonatomic, assign, readwrite) BOOL hasOnAppear;
- (id)listOptionArray;
@end
@interface ELMContext : NSObject
@property (nonatomic, strong, readwrite) UIView *fromView;
@end
@interface ELMCommandContext : NSObject
@property (nonatomic, strong, readwrite) ELMContext *context;
@end @end
@interface YTIUpdateShareSheetCommand @interface YTIUpdateShareSheetCommand
@ -96,11 +85,6 @@
+ (GPBExtensionDescriptor*)innertubeCommand; + (GPBExtensionDescriptor*)innertubeCommand;
@end @end
@interface YTAccountScopedCommandResponderEvent
@property (nonatomic, strong, readwrite) YTICommand *command;
@property (nonatomic, strong, readwrite) UIView *fromView;
@end
@interface YTIShareEntityEndpoint @interface YTIShareEntityEndpoint
@property (nonatomic, assign, readwrite) BOOL hasSerializedShareEntity; @property (nonatomic, assign, readwrite) BOOL hasSerializedShareEntity;
@property (nonatomic, copy, readwrite) NSString *serializedShareEntity; @property (nonatomic, copy, readwrite) NSString *serializedShareEntity;

View file

@ -3,7 +3,6 @@
# pragma mark - YouTube patches # pragma mark - YouTube patches
// Fix Google Sign in by @PoomSmart and @level3tjg (qnblackcat/uYouPlus#684) // Fix Google Sign in by @PoomSmart and @level3tjg (qnblackcat/uYouPlus#684)
%group gGoogleSignInPatch
%hook NSBundle %hook NSBundle
- (NSDictionary *)infoDictionary { - (NSDictionary *)infoDictionary {
NSMutableDictionary *info = %orig.mutableCopy; NSMutableDictionary *info = %orig.mutableCopy;
@ -12,7 +11,6 @@
return info; return info;
} }
%end %end
%end
// Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263 // Workaround for MiRO92/uYou-for-YouTube#12, qnblackcat/uYouPlus#263
%hook YTDataUtils %hook YTDataUtils
@ -98,31 +96,30 @@ typedef NS_ENUM(NSInteger, ShareEntityType) {
ShareEntityFieldVideo = 1, ShareEntityFieldVideo = 1,
ShareEntityFieldPlaylist = 2, ShareEntityFieldPlaylist = 2,
ShareEntityFieldChannel = 3, ShareEntityFieldChannel = 3,
ShareEntityFieldPost = 6,
ShareEntityFieldClip = 8 ShareEntityFieldClip = 8
}; };
static inline NSString* extractIdWithFormat(GPBUnknownFields *fields, NSInteger fieldNumber, NSString *format) { static inline NSString* extractIdWithFormat(GPBUnknownFieldSet *fields, NSInteger fieldNumber, NSString *format) {
NSArray<GPBUnknownField*> *fieldArray = [fields fields:fieldNumber]; if (![fields hasField:fieldNumber])
if (!fieldArray)
return nil; return nil;
if ([fieldArray count] != 1) GPBUnknownField *idField = [fields getField:fieldNumber];
if ([idField.lengthDelimitedList count] != 1)
return nil; return nil;
NSString *id = [[NSString alloc] initWithData:[fieldArray firstObject].lengthDelimited encoding:NSUTF8StringEncoding]; NSString *id = [[NSString alloc] initWithData:[idField.lengthDelimitedList firstObject] encoding:NSUTF8StringEncoding];
return [NSString stringWithFormat:format, id]; return [NSString stringWithFormat:format, id];
} }
static BOOL showNativeShareSheet(NSString *serializedShareEntity, UIView *sourceView) { static BOOL showNativeShareSheet(NSString *serializedShareEntity) {
GPBMessage *shareEntity = [%c(GPBMessage) deserializeFromString:serializedShareEntity]; GPBMessage *shareEntity = [%c(GPBMessage) deserializeFromString:serializedShareEntity];
GPBUnknownFields *fields = [[%c(GPBUnknownFields) alloc] initFromMessage:shareEntity]; GPBUnknownFieldSet *fields = shareEntity.unknownFields;
NSString *shareUrl; NSString *shareUrl;
NSArray<GPBUnknownField*> *shareEntityClip = [fields fields:ShareEntityFieldClip]; if ([fields hasField:ShareEntityFieldClip]) {
if (shareEntityClip) { GPBUnknownField *shareEntityClip = [fields getField:ShareEntityFieldClip];
if ([shareEntityClip count] != 1) if ([shareEntityClip.lengthDelimitedList count] != 1)
return NO; return FALSE;
GPBMessage *clipMessage = [%c(GPBMessage) parseFromData:[shareEntityClip firstObject].lengthDelimited error:nil]; GPBMessage *clipMessage = [%c(GPBMessage) parseFromData:[shareEntityClip.lengthDelimitedList firstObject] error:nil];
shareUrl = extractIdWithFormat([[%c(GPBUnknownFields) alloc] initFromMessage:clipMessage], 1, @"https://youtube.com/clip/%@"); shareUrl = extractIdWithFormat(clipMessage.unknownFields, 1, @"https://youtube.com/clip/%@");
} }
if (!shareUrl) if (!shareUrl)
@ -141,39 +138,34 @@ static BOOL showNativeShareSheet(NSString *serializedShareEntity, UIView *source
shareUrl = extractIdWithFormat(fields, ShareEntityFieldVideo, @"https://youtube.com/watch?v=%@"); shareUrl = extractIdWithFormat(fields, ShareEntityFieldVideo, @"https://youtube.com/watch?v=%@");
if (!shareUrl) if (!shareUrl)
shareUrl = extractIdWithFormat(fields, ShareEntityFieldPost, @"https://youtube.com/post/%@"); return FALSE;
if (!shareUrl) UIActivityViewController *activityViewController = [[UIActivityViewController alloc]initWithActivityItems:@[shareUrl] applicationActivities:nil];
return NO; [[%c(YTUIUtils) topViewControllerForPresenting] presentViewController:activityViewController animated:YES completion:^{}];
return TRUE;
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[shareUrl] applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint];
UIViewController *topViewController = [%c(YTUIUtils) topViewControllerForPresenting];
if (activityViewController.popoverPresentationController) {
activityViewController.popoverPresentationController.sourceView = topViewController.view;
activityViewController.popoverPresentationController.sourceRect = [sourceView convertRect:sourceView.bounds toView:topViewController.view];
}
[topViewController presentViewController:activityViewController animated:YES completion:nil];
return YES;
} }
/* -------------------- iPad Layout -------------------- */ /* -------------------- iPad Layout -------------------- */
// %group gYouTubeNativeShare // YouTube Native Share Option - 0.2.3 - Supports YouTube v17.33.2-v19.34.2 %hook YTShareRequestViewController
%hook YTAccountScopedCommandResponderEvent - (id)initWithService:(id)_service parentResponder:(id)_parentResponder {
- (void)send { // disable the default share sheet behavior and force the app to call [YTAccountScopedCommandRouter handleCommand]
return NULL;
}
%end
%hook YTAccountScopedCommandRouter
- (BOOL)handleCommand:(id)command entry:(id)_entry fromView:(id)_fromView sender:(id)_sender completionBlock:(id)_completionBlock {
GPBExtensionDescriptor *shareEntityEndpointDescriptor = [%c(YTIShareEntityEndpoint) shareEntityEndpoint]; GPBExtensionDescriptor *shareEntityEndpointDescriptor = [%c(YTIShareEntityEndpoint) shareEntityEndpoint];
if (![self.command hasExtension:shareEntityEndpointDescriptor]) if (![command hasExtension:shareEntityEndpointDescriptor])
return %orig; return %orig;
YTIShareEntityEndpoint *shareEntityEndpoint = [self.command getExtension:shareEntityEndpointDescriptor]; YTIShareEntityEndpoint *shareEntityEndpoint = [command getExtension:shareEntityEndpointDescriptor];
if (!shareEntityEndpoint.hasSerializedShareEntity) if(!shareEntityEndpoint.hasSerializedShareEntity)
return %orig; return %orig;
if (!showNativeShareSheet(shareEntityEndpoint.serializedShareEntity, self.fromView)) if (!showNativeShareSheet(shareEntityEndpoint.serializedShareEntity))
return %orig; return %orig;
return TRUE;
} }
%end %end
@ -181,7 +173,7 @@ static BOOL showNativeShareSheet(NSString *serializedShareEntity, UIView *source
/* ------------------- iPhone Layout ------------------- */ /* ------------------- iPhone Layout ------------------- */
%hook ELMPBShowActionSheetCommand %hook ELMPBShowActionSheetCommand
- (void)executeWithCommandContext:(ELMCommandContext*)context handler:(id)_handler { - (void)executeWithCommandContext:(id)_context handler:(id)_handler {
if (!self.hasOnAppear) if (!self.hasOnAppear)
return %orig; return %orig;
GPBExtensionDescriptor *innertubeCommandDescriptor = [%c(YTIInnertubeCommandExtensionRoot) innertubeCommand]; GPBExtensionDescriptor *innertubeCommandDescriptor = [%c(YTIInnertubeCommandExtensionRoot) innertubeCommand];
@ -194,13 +186,10 @@ static BOOL showNativeShareSheet(NSString *serializedShareEntity, UIView *source
YTIUpdateShareSheetCommand *updateShareSheetCommand = [innertubeCommand getExtension:updateShareSheetCommandDescriptor]; YTIUpdateShareSheetCommand *updateShareSheetCommand = [innertubeCommand getExtension:updateShareSheetCommandDescriptor];
if (!updateShareSheetCommand.hasSerializedShareEntity) if (!updateShareSheetCommand.hasSerializedShareEntity)
return %orig; return %orig;
if (!showNativeShareSheet(updateShareSheetCommand.serializedShareEntity, context.context.fromView)) if (!showNativeShareSheet(updateShareSheetCommand.serializedShareEntity))
return %orig; return %orig;
} }
%end %end
// %end
//
// iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224 // iOS 16 uYou crash fix - @level3tjg: https://github.com/qnblackcat/uYouPlus/pull/224
// %group iOS16 // %group iOS16
@ -337,69 +326,8 @@ static void refreshUYouAppearance() {
- (void)beginEnlargeAnimation {} - (void)beginEnlargeAnimation {}
%end %end
%hook GOODialogView
- (id)imageView {
UIImageView *imageView = %orig;
if ([[self titleLabel].text containsString:@"uYou\n"]) {
// // Invert uYou logo in download dialog if dark mode is enabled
// if ([[NSUserDefaults standardUserDefaults] integerForKey:@"page_style"] == 0)
// return imageView;
// // https://gist.github.com/coryalder/3113a43734f5e0e4b497
// UIImage *image = [imageView image];
// CIImage *ciImage = [[CIImage alloc] initWithImage:image];
// CIFilter *filter = [CIFilter filterWithName:@"CIColorInvert"];
// [filter setDefaults];
// [filter setValue:ciImage forKey:kCIInputImageKey];
// CIContext *context = [CIContext contextWithOptions:nil];
// CIImage *output = [filter outputImage];
// CGImageRef cgImage = [context createCGImage:output fromRect:[output extent]];
// UIImage *icon = [UIImage imageWithCGImage:cgImage];
// CGImageRelease(cgImage);
// Load icon_clipped.png from uYouBundle.bundle
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"uYouBundle" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];
NSString *iconPath = [bundle pathForResource:@"icon_clipped" ofType:@"png"];
UIImage *icon = [UIImage imageWithContentsOfFile:iconPath];
[imageView setImage:icon];
// Resize image to 30x30
// https://stackoverflow.com/a/2658801/19227228
CGSize size = CGSizeMake(30, 30);
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
[icon drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[imageView setImage:resizedImage];
}
return imageView;
}
// Increase space between uYou label and video title
- (id)titleLabel {
UILabel *titleLabel = %orig;
if ([titleLabel.text containsString:@"uYou\n"] &&
![titleLabel.text containsString:@"uYou\n\n"]
) {
NSString *text = [titleLabel.text stringByReplacingOccurrencesOfString:@"uYou\n" withString:@"uYou\n\n"];
[titleLabel setText:text];
}
return titleLabel;
}
%end
%ctor { %ctor {
%init; %init;
if (IS_ENABLED(kGoogleSignInPatch)) {
%init(gGoogleSignInPatch);
}
/*
if (IS_ENABLED(kYouTubeNativeShare)) {
%init(gYouTubeNativeShare);
}
*/
// if (@available(iOS 16, *)) { // if (@available(iOS 16, *)) {
// %init(iOS16); // %init(iOS16);
// } // }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,7 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4.1.7 uses: actions/checkout@v4.1.4
- name: Set up Git - name: Set up Git
run: | run: |
@ -20,12 +20,11 @@ jobs:
- name: Add uYouEnhanced submodules - name: Add uYouEnhanced submodules
run: | run: |
# git submodule add https://github.com/PoomSmart/FLEXing.git Tweaks/FLEXing
git submodule add https://github.com/dayanch96/uYouLocalization.git Tweaks/uYouLocalization git submodule add https://github.com/dayanch96/uYouLocalization.git Tweaks/uYouLocalization
git submodule add https://github.com/arichornloverALT/YTHoldForSpeed.git Tweaks/YTHoldForSpeed git submodule add https://github.com/arichornlover/YTHoldForSpeed.git Tweaks/YTHoldForSpeed
git submodule add https://github.com/arichornloverALT/YouGroupSettings.git Tweaks/YouGroupSettings git submodule add https://github.com/arichornlover/YouGroupSettings.git Tweaks/YouGroupSettings
git submodule add https://github.com/arichornloverALT/YouTimeStamp.git Tweaks/YouTimeStamp git submodule add https://github.com/arichornlover/YouTimeStamp.git Tweaks/YouTimeStamp
git submodule add https://github.com/bhackel/YouLoop.git Tweaks/YouLoop
git submodule add https://github.com/protocolbuffers/protobuf.git Tweaks/protobuf
git add . git add .
git commit -m "added uYouEnhanced submodules" git commit -m "added uYouEnhanced submodules"
git push origin git push origin
@ -66,8 +65,6 @@ jobs:
git add . git add .
git submodule update --init --recursive --remote Tweaks/YouMute git submodule update --init --recursive --remote Tweaks/YouMute
git add . git add .
git submodule update --init --recursive --remote Tweaks/YouLoop
git add .
git submodule update --init --recursive --remote Tweaks/YouPiP git submodule update --init --recursive --remote Tweaks/YouPiP
git add . git add .
git submodule update --init --recursive --remote Tweaks/YouQuality git submodule update --init --recursive --remote Tweaks/YouQuality
@ -87,10 +84,10 @@ jobs:
- name: Make .bundle files - name: Make .bundle files
run: | run: |
cd Bundles cd Bundles
ln -s ../Tweaks/MrBeastify/layout/Library/Application\ Support/MrBeastify.bundle MrBeastify.bundle
ln -s ../Tweaks/uYouLocalization/layout/Library/Application\ Support/uYouLocalization.bundle uYouLocalization.bundle ln -s ../Tweaks/uYouLocalization/layout/Library/Application\ Support/uYouLocalization.bundle uYouLocalization.bundle
ln -s ../Tweaks/YTHoldForSpeed/layout/Library/Application\ Support/YTHoldForSpeed.bundle YTHoldForSpeed.bundle ln -s ../Tweaks/YTHoldForSpeed/layout/Library/Application\ Support/YTHoldForSpeed.bundle YTHoldForSpeed.bundle
ln -s ../Tweaks/YouGroupSettings/layout/Library/Application\ Support/YouGroupSettings.bundle YouGroupSettings.bundle ln -s ../Tweaks/YouGroupSettings/layout/Library/Application\ Support/YouGroupSettings.bundle YouGroupSettings.bundle
ln -s ../Tweaks/YouLoop/layout/Library/Application\ Support/YouLoop.bundle YouLoop.bundle
ln -s ../Tweaks/YouTimeStamp/layout/Library/Application\ Support/YouTimeStamp.bundle YouTimeStamp.bundle ln -s ../Tweaks/YouTimeStamp/layout/Library/Application\ Support/YouTimeStamp.bundle YouTimeStamp.bundle
git add . git add .
git commit -m "Added bundles" git commit -m "Added bundles"
@ -105,7 +102,6 @@ jobs:
# rm -f uYouLocalization.bundle # rm -f uYouLocalization.bundle
# rm -f YTHoldForSpeed.bundle # rm -f YTHoldForSpeed.bundle
# rm -f YouGroupSettings.bundle # rm -f YouGroupSettings.bundle
# rm -f YouLoop.bundle
# rm -f YouTimeStamp.bundle # rm -f YouTimeStamp.bundle
# git add . # git add .
# git commit -m "Deleted bundles" # git commit -m "Deleted bundles"

@ -1 +1 @@
Subproject commit 15b061bf414cf29fd0d4e0e124e9e2ccb99326b0 Subproject commit 2aa3086244d296cfb3c8e782ef09c76316452a9d

@ -1 +1 @@
Subproject commit a9134c82b032b145541f3c06a3c4950487f01474 Subproject commit 95fecff296722df4a9938308c3bdb178cb690b7c

@ -1 +1 @@
Subproject commit 9ef7bbb3b7d7cd2218a9884d8680625db0d898f3 Subproject commit d3b2da8ba06c7d438aa3c2fb3359ae01d89b6731

@ -1 +1 @@
Subproject commit a22ef4deb929c6622069290bb340d21b280f300e Subproject commit 67e321458867029b1ffcdfa29759332835b80eca

@ -1 +1 @@
Subproject commit 5af54ea6bf3aed6a615094fa285669a0e46ece51 Subproject commit 2a4282fbdcbd0c8b586a64ad364fbb3ec880f606

@ -1 +1 @@
Subproject commit 96508bf22012d588a6ad29bfff3f694800a3a525 Subproject commit 3cda9a9035e9964c881191268c30a9c0a4fc52a1

@ -1 +1 @@
Subproject commit 12b4991ade6d3edd1e4fb28fe19bb32b6dc93206 Subproject commit ec0c012561b56a908d7693a51f8db0015e1a6c30

@ -1 +1 @@
Subproject commit f5af14fc258cd84d7534bc55c51717f30172c79c Subproject commit 159da3e9569e8f156a73df80b153c57cccc1dad1

@ -1 +0,0 @@
Subproject commit 58f76b1271c1ec05d6513e054f46e4080780a0d9

@ -1 +1 @@
Subproject commit 63fe2c05fd23a517191645cd450115dc6965e0d8 Subproject commit 1f3ee2c5eef13ceb4ddc478148a48ffa19e1a9a7

@ -1 +1 @@
Subproject commit a308e3eeb6eb60cb8f118cf7fdced0015e584ad4 Subproject commit 33d903ddb5fee7c8e8a27a32e378caf9b854ca64

@ -1 +1 @@
Subproject commit e89ffe8be85564fe2bfc04345a186c4a02ef456a Subproject commit 38a2b7032200f700c661b6f6e9d22b4a7eb47e85

@ -1 +1 @@
Subproject commit 128c9305d7e796b883d8563b3cb6e7eac7a33ea8 Subproject commit 8ed225d41ba7c9894df8e51afff3674c3ded4dbf

@ -1 +1 @@
Subproject commit b4e1bc798149d68029c89510948600be2986968b Subproject commit 58951f248bfe90298ca65007603d465f58369876

@ -1 +1 @@
Subproject commit 60ca6e06d78e68854f8b1bd1c644a7f4376f6168 Subproject commit 532f0c2ed52b60bc33492a2ee4cbf9c4ca960450