├── .gitattributes ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── Tweak.x ├── YouMute.plist ├── control └── layout └── Library └── Application Support └── YouMute.bundle ├── Info.plist ├── ar.lproj └── Localizable.strings ├── de.lproj └── Localizable.strings ├── en.lproj └── Localizable.strings ├── es.lproj └── Localizable.strings ├── id.lproj └── Localizable.strings ├── ja.lproj └── Localizable.strings ├── pl.lproj └── Localizable.strings ├── ru.lproj └── Localizable.strings ├── th.lproj └── Localizable.strings ├── tr.lproj └── Localizable.strings ├── vi.lproj └── Localizable.strings ├── zh_TW.lproj └── Localizable.strings └── zh_cn.lproj └── Localizable.strings /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .theos 2 | .DS_Store 3 | packages -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 - 2025 PoomSmart 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ifeq ($(SIMULATOR),1) 2 | TARGET = simulator:clang:latest:15.0 3 | else 4 | ifeq ($(THEOS_PACKAGE_SCHEME),rootless) 5 | TARGET = iphone:clang:latest:15.0 6 | else ifeq ($(THEOS_PACKAGE_SCHEME),roothide) 7 | TARGET = iphone:clang:latest:15.0 8 | else 9 | TARGET = iphone:clang:latest:11.0 10 | endif 11 | endif 12 | INSTALL_TARGET_PROCESSES = YouTube 13 | ARCHS = arm64 14 | 15 | include $(THEOS)/makefiles/common.mk 16 | 17 | TWEAK_NAME = YouMute 18 | 19 | $(TWEAK_NAME)_FILES = Tweak.x 20 | $(TWEAK_NAME)_CFLAGS = -fobjc-arc 21 | $(TWEAK_NAME)_FRAMEWORKS = UIKit 22 | 23 | include $(THEOS_MAKE_PATH)/tweak.mk 24 | 25 | ifeq ($(SIMULATOR),1) 26 | include ../../Simulator/preferenceloader-sim/locatesim.mk 27 | setup:: clean all 28 | @rm -f /opt/simject/$(TWEAK_NAME).dylib 29 | @cp -v $(THEOS_OBJ_DIR)/$(TWEAK_NAME).dylib /opt/simject/$(TWEAK_NAME).dylib 30 | @cp -v $(PWD)/$(TWEAK_NAME).plist /opt/simject/$(TWEAK_NAME).plist 31 | @mkdir -p "$(PL_SIMULATOR_APPLICATION_SUPPORT_PATH)" 32 | @cp -vR "$(PWD)/layout/Library/Application Support/$(TWEAK_NAME).bundle" "$(PL_SIMULATOR_APPLICATION_SUPPORT_PATH)/" 33 | endif 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # YouMute 2 | Mutes/unmutes videos in iOS YouTube faster from the video overlay. 3 | 4 | ## Prerequisites 5 | 6 | [YTVideoOverlay](https://github.com/PoomSmart/YTVideoOverlay). 7 | 8 | ## Supported YouTube versions 9 | Version 16.42.3 and newer. Lower are either untested or unsupported. 10 | -------------------------------------------------------------------------------- /Tweak.x: -------------------------------------------------------------------------------- 1 | #import "../YTVideoOverlay/Header.h" 2 | #import "../YTVideoOverlay/Init.x" 3 | #import 4 | #import 5 | #import 6 | #import 7 | 8 | #define TweakKey @"YouMute" 9 | 10 | @interface YTMainAppControlsOverlayView (YouMute) 11 | - (void)didPressMute:(id)arg; 12 | @end 13 | 14 | @interface YTInlinePlayerBarContainerView (YouMute) 15 | - (void)didPressMute:(id)arg; 16 | @end 17 | 18 | static BOOL isMutedTop(YTMainAppControlsOverlayView *self) { 19 | YTMainAppVideoPlayerOverlayViewController *c = [self valueForKey:@"_eventsDelegate"]; 20 | YTSingleVideoController *video = [c valueForKey:@"_currentSingleVideoObservable"]; 21 | return [video isMuted]; 22 | } 23 | 24 | static BOOL isMutedBottom(YTInlinePlayerBarContainerView *self) { 25 | YTSingleVideoController *video = [self.delegate valueForKey:@"_currentSingleVideo"]; 26 | return [video isMuted]; 27 | } 28 | 29 | static UIImage *muteImage(BOOL muted) { 30 | return [%c(QTMIcon) imageWithName:muted ? @"ic_volume_off" : @"ic_volume_up" color:[%c(YTColor) white1]]; 31 | } 32 | 33 | %group Top 34 | 35 | %hook YTMainAppControlsOverlayView 36 | 37 | - (UIImage *)buttonImage:(NSString *)tweakId { 38 | return [tweakId isEqualToString:TweakKey] ? muteImage(isMutedTop(self)) : %orig; 39 | } 40 | 41 | %new(v@:@) 42 | - (void)didPressMute:(id)arg { 43 | YTMainAppVideoPlayerOverlayViewController *c = [self valueForKey:@"_eventsDelegate"]; 44 | YTSingleVideoController *video = [c valueForKey:@"_currentSingleVideoObservable"]; 45 | [video setMuted:![video isMuted]]; 46 | [self.overlayButtons[TweakKey] setImage:muteImage([video isMuted]) forState:UIControlStateNormal]; 47 | } 48 | 49 | %end 50 | 51 | %end 52 | 53 | %group Bottom 54 | 55 | %hook YTInlinePlayerBarContainerView 56 | 57 | - (UIImage *)buttonImage:(NSString *)tweakId { 58 | return [tweakId isEqualToString:TweakKey] ? muteImage(isMutedBottom(self)) : %orig; 59 | } 60 | 61 | %new(v@:@) 62 | - (void)didPressMute:(id)arg { 63 | YTSingleVideoController *video = [self.delegate valueForKey:@"_currentSingleVideo"]; 64 | [video setMuted:![video isMuted]]; 65 | [self.overlayButtons[TweakKey] setImage:muteImage([video isMuted]) forState:UIControlStateNormal]; 66 | } 67 | 68 | %end 69 | 70 | %end 71 | 72 | %ctor { 73 | initYTVideoOverlay(TweakKey, @{ 74 | AccessibilityLabelKey: @"Mute", 75 | SelectorKey: @"didPressMute:", 76 | UpdateImageOnVisibleKey: @YES 77 | }); 78 | %init(Top); 79 | %init(Bottom); 80 | } 81 | -------------------------------------------------------------------------------- /YouMute.plist: -------------------------------------------------------------------------------- 1 | { Filter = { Bundles = ( "com.google.ios.youtube" ); }; } 2 | -------------------------------------------------------------------------------- /control: -------------------------------------------------------------------------------- 1 | Package: com.ps.youmute 2 | Name: YouMute 3 | Version: 1.3.2 4 | Architecture: iphoneos-arm 5 | Description: Mutes/unmutes videos in YouTube directly. 6 | Maintainer: PoomSmart 7 | Author: PoomSmart 8 | Section: Tweaks 9 | Depends: mobilesubstrate (>= 0.9.5000), firmware (>= 11.0), com.ps.ytvideooverlay (>= 2.0.0) 10 | Depiction: https://poomsmart.github.io/repo/depictions/youmute.html 11 | SileoDepiction: https://poomsmart.github.io/repo/sileodepictions/youmute.json 12 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | YouMute 9 | CFBundleIdentifier 10 | com.ps.youmute 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1.0 21 | NSPrincipalClass 22 | YouMute 23 | 24 | 25 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "إظهار زر كتم الصوت"; 2 | "POSITION" = "مكان زر كتم الصوت"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Stummschalttaste anzeigen"; 2 | "POSITION" = "Position der Stummschalttaste"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Show mute button"; 2 | "POSITION" = "Mute button position"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Mostrar botón de silencio"; 2 | "POSITION" = "Posición del botón Silencio"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/id.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Tampilkan tombol bisukan"; 2 | "POSITION" = "Posisi tombol bisukan"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "ミュートボタンを表示"; 2 | "POSITION" = "ミュートボタンの位置"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/pl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Pokaż przycisk wyciszenia głośności"; 2 | "POSITION" = "Pozycja przycisku wyciszenia głośności"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Отображать кнопку «Без звука»"; 2 | "POSITION" = "Место расположения кнопки"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/th.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "แสดงปุ่มส่งเสียง"; 2 | "POSITION" = "ตำแหน่งปุ่มส่งเสียง"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/tr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Sessiz düğmesini göster"; 2 | "POSITION" = "Sessiz düğmesi konumu"; -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/vi.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "Hiển thị nút tắt tiếng"; 2 | "POSITION" = "Vị trí nút tắt tiếng"; -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/zh_TW.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "顯示靜音按鈕"; 2 | "POSITION" = "靜音按鈕位置"; 3 | -------------------------------------------------------------------------------- /layout/Library/Application Support/YouMute.bundle/zh_cn.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "ENABLED" = "显示静音按钮"; 2 | "POSITION" = "静音按钮位置"; 3 | --------------------------------------------------------------------------------