diff --git a/README-template.md b/README-template.md index f98e5d100..a242ee62f 100644 --- a/README-template.md +++ b/README-template.md @@ -1,6 +1,8 @@ ## 🧩 ReVanced Patches -ReVanced Extended Patches. +ReVanced Extended Patches. + +See the [documentation](https://github.com/inotia00/revanced-documentation#readme) to learn how to apply patches and build ReVanced Extended apps. ## 📋 List of patches in this repository diff --git a/README.md b/README.md index 9d71deced..091dc2929 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ ## 🧩 ReVanced Patches -ReVanced Extended Patches. +ReVanced Extended Patches. + +See the [documentation](https://github.com/inotia00/revanced-documentation#readme) to learn how to apply patches and build ReVanced Extended apps. ## 📋 List of patches in this repository diff --git a/gradle.properties b/gradle.properties index 2d36c7582..e9528e482 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 4.14.1 +version = 4.14.2 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2b189974c..fb602ee2a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=5b9c5eb3f9fc2c94abaea57d90bd78747ca117ddbbf96c859d3741181a12bf2a -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/patches.json b/patches.json index 0f7868154..6c6c83196 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Ambient mode control","description":"Adds options to disable Ambient mode and to bypass Ambient mode restrictions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Amoled","description":"Applies a pure black theme to some components.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bitrate default value","description":"Sets the audio quality to \u0027Always High\u0027 when you first install the app.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass image region restrictions","description":"Adds an option to use a different host for static images, so that images blocked in some countries can be received.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass image region restrictions","description":"Adds an option to use a different host for static images, so that images blocked in some countries can be received.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Certificate spoof","description":"Enables YouTube Music to work with Android Auto by spoofing the YouTube Music certificate.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Changes the package name for Reddit to the name specified in options.json.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"PackageNameReddit","default":"com.reddit.frontpage","values":{"Clone":"com.reddit.frontpage.revanced","Default":"com.reddit.frontpage.rvx","Original":"com.reddit.frontpage"},"title":"Package name of Reddit","description":"The name of the package to rename the app to.","required":true}]},{"name":"Change player flyout menu toggles","description":"Adds an option to use text toggles instead of switch toggles within the additional settings menu.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change share sheet","description":"Add option to change from in-app share sheet to system share sheet.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change share sheet","description":"Add option to change from in-app share sheet to system share sheet.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change version code","description":"Changes the version code of the app to the value specified in options.json. Except when mounting, this can prevent app stores from updating the app and allow the app to be installed over an existing installation that has a higher version code. By default, the highest version code is set.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"ChangeVersionCode","default":false,"values":null,"title":"Change version code","description":"Changes the version code of the app.","required":true},{"key":"VersionCode","default":"2147483647","values":null,"title":"Version code","description":"The version code to use. (1 ~ 2147483647)","required":true}]},{"name":"Custom Shorts action buttons","description":"Changes, at compile time, the icon of the action buttons of the Shorts player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"IconType","default":"youtubeoutline","values":{"Outline":"outline","OutlineCircle":"outlinecircle","Round":"round","YoutubeOutline":"youtubeoutline","YouTube":"youtube"},"title":"Shorts icon style ","description":"The style of the icons for the action buttons in the Shorts player.","required":true}]},{"name":"Custom branding icon for YouTube","description":"Changes the YouTube app icon to the icon specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppIcon","default":"revancify_blue","values":{"AFN Blue":"afn_blue","AFN Red":"afn_red","MMT":"mmt","Revancify Blue":"revancify_blue","Revancify Red":"revancify_red","YouTube":"youtube","YouTube (Minimal header)":"youtube_minimal_header"},"title":"App icon","description":"The icon to apply to the app.\n\nIf a path to a folder is provided, the folder must contain the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders must contain the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":true},{"key":"ChangeSplashIcon","default":true,"values":null,"title":"Change splash icons","description":"Apply the custom branding icon to the splash screen.","required":true},{"key":"RestoreOldSplashAnimation","default":true,"values":null,"title":"Restore old splash animation","description":"Restore the old style splash animation.","required":true}]},{"name":"Custom branding icon for YouTube Music","description":"Changes the YouTube Music app icon to the icon specified in options.json.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppIcon","default":"revancify_blue","values":{"AFN Blue":"afn_blue","AFN Red":"afn_red","MMT":"mmt","Revancify Blue":"revancify_blue","Revancify Red":"revancify_red","YouTube Music":"youtube_music"},"title":"App icon","description":"The icon to apply to the app.\n\nIf a path to a folder is provided, the folder must contain the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders must contain the following files:\n\n- adaptiveproduct_youtube_music_background_color_108.png\n- adaptiveproduct_youtube_music_foreground_color_108.png\n- ic_launcher_release.png","required":true},{"key":"ChangeSplashIcon","default":true,"values":null,"title":"Change splash icons","description":"Apply the custom branding icon to the splash screen.","required":true},{"key":"RestoreOldSplashIcon","default":false,"values":null,"title":"Restore old splash icon","description":"Restore the old style splash icon.\n\nIf you enable both the old style splash icon and the Cairo splash animation,\n\nOld style splash icon will appear first and then the Cairo splash animation will start.","required":true}]},{"name":"Custom branding name for Reddit","description":"Renames the Reddit app to the name specified in options.json.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"AppName","default":"Reddit","values":{"Default":"RVX Reddit","Original":"Reddit"},"title":"App name","description":"The name of the app.","required":true}]},{"name":"Custom branding name for YouTube","description":"Renames the YouTube app to the name specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppName","default":"RVX","values":{"ReVanced Extended":"ReVanced Extended","RVX":"RVX","YouTube RVX":"YouTube RVX","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":true}]},{"name":"Custom branding name for YouTube Music","description":"Renames the YouTube Music app to the name specified in options.json.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppNameNotification","default":"RVX Music","values":{"ReVanced Extended Music":"ReVanced Extended Music","RVX Music":"RVX Music","YouTube Music":"YouTube Music","YT Music":"YT Music"},"title":"App name in notification panel","description":"The name of the app as it appears in the notification panel.","required":true},{"key":"AppNameLauncher","default":"RVX Music","values":{"ReVanced Extended Music":"ReVanced Extended Music","RVX Music":"RVX Music","YouTube Music":"YouTube Music","YT Music":"YT Music"},"title":"App name in launcher","description":"The name of the app as it appears in the launcher.","required":true}]},{"name":"Custom double tap length","description":"Adds Double-tap to seek values that are specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"DoubleTapLengthArrays","default":"3, 5, 10, 15, 20, 30, 60, 120, 180","values":null,"title":"Double-tap to seek values","description":"A list of custom Double-tap to seek lengths to be added, separated by commas.","required":true}]},{"name":"Custom header for YouTube","description":"Applies a custom header in the top left corner within the app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"CustomHeader","default":"custom_branding_icon","values":{"Custom branding icon":"custom_branding_icon"},"title":"Custom header","description":"The header to apply to the app.\n\nPatch option \u0027Custom branding icon\u0027 applies only when:\n\n1. Patch \u0027Custom branding icon for YouTube\u0027 is included.\n2. Patch option for \u0027Custom branding icon for YouTube\u0027 is selected from the preset.\n\nIf a path to a folder is provided, the folder must contain one or more of the following folders, depending on the DPI of the device:\n\n- drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-hdpi\n- drawable-mdpi\n\nEach of the folders must contain all of the following files:\n\n[Generic header]\n\n- yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png\n\nThe image dimensions must be as follows:\n\n- drawable-xxxhdpi: 488px x 192px\n- drawable-xxhdpi: 366px x 144px\n- drawable-xhdpi: 244px x 96px\n- drawable-hdpi: 184px x 72px\n- drawable-mdpi: 122px x 48px\n\n[Premium header]\n\n- yt_premium_wordmark_header_light.png\n- yt_premium_wordmark_header_dark.png\n\nThe image dimensions must be as follows:\n- drawable-xxxhdpi: 516px x 192px\n- drawable-xxhdpi: 387px x 144px\n- drawable-xhdpi: 258px x 96px\n- drawable-hdpi: 194px x 72px\n- drawable-mdpi: 129px x 48px","required":true}]},{"name":"Custom header for YouTube Music","description":"Applies a custom header in the top left corner within the app.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"CustomHeader","default":"custom_branding_icon","values":{"Custom branding icon":"custom_branding_icon"},"title":"Custom header","description":"The header to apply to the app.\n\nPatch option \u0027Custom branding icon\u0027 applies only when:\n\n1. Patch \u0027Custom branding icon for YouTube Music\u0027 is included.\n2. Patch option for \u0027Custom branding icon for YouTube Music\u0027 is selected from the preset.\n\nIf a path to a folder is provided, the folder must contain one or more of the following folders, depending on the DPI of the device:\n\n- drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-hdpi\n- drawable-mdpi\n\nEach of the folders must contain all of the following files:\n\n- action_bar_logo.png\n- logo_music.png\n- ytm_logo.png\n\nThe image \u0027action_bar_logo.png\u0027 dimensions must be as follows:\n\n- drawable-xxxhdpi: 320px x 96px\n- drawable-xxhdpi: 240px x 72px\n- drawable-xhdpi: 160px x 48px\n- drawable-hdpi: 121px x 36px\n- drawable-mdpi: 80px x 24px\n\nThe image \u0027logo_music.png\u0027 dimensions must be as follows:\n\n- drawable-xxxhdpi: 576px x 200px\n- drawable-xxhdpi: 432px x 150px\n- drawable-xhdpi: 288px x 100px\n- drawable-hdpi: 217px x 76px\n- drawable-mdpi: 144px x 50px\n\nThe image \u0027ytm_logo.png\u0027 dimensions must be as follows:\n\n- drawable-xxxhdpi: 412px x 144px\n- drawable-xxhdpi: 309px x 108px\n- drawable-xhdpi: 206px x 72px\n- drawable-hdpi: 155px x 54px\n- drawable-mdpi: 103px x 36px","required":true}]},{"name":"Description components","description":"Adds options to hide and disable description components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Cairo splash animation","description":"Adds an option to disable Cairo splash animation.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["7.06.54","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable QUIC protocol","description":"Adds an option to disable CronetEngine\u0027s QUIC protocol.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto audio tracks","description":"Adds an option to disable audio tracks from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dislike redirection","description":"Adds an option to disable redirection to the next track when clicking the Dislike button.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable haptic feedback","description":"Adds options to disable haptic feedback when swiping in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Adds an option to disable the popup that appears when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable splash animation","description":"Adds an option to disable the splash animation on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable OPUS codec","description":"Adds an options to enable the OPUS audio codec if the player response includes.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable OPUS codec","description":"Adds an options to enable the OPUS audio codec if the player response includes.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debug logging","description":"Adds an option to enable debug logging.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debug logging","description":"Adds an option to enable debug logging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable external browser","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable gradient loading screen","description":"Adds an option to enable the gradient loading screen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable landscape mode","description":"Adds an option to enable landscape mode when rotating the screen on phones.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable open links directly","description":"Adds an option to skip over redirection URLs in external links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Flyout menu components","description":"Adds options to hide or change flyout menu components.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Force hide player buttons background","description":"Removes, at compile time, the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fullscreen components","description":"Adds options to hide or change components related to fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"GmsCoreVendorGroupId","default":"app.revanced","values":{"ReVanced":"app.revanced"},"title":"GmsCore vendor group ID","description":"The vendor\u0027s group ID for GmsCore.","required":true},{"key":"CheckGmsCore","default":true,"values":null,"title":"Check GmsCore","description":"Check if GmsCore is installed on the device and has battery optimizations disabled when the app starts. \n\nIf GmsCore is not installed the app will not work, so disabling this is not recommended.","required":true},{"key":"PackageNameYouTube","default":"app.rvx.android.youtube","values":{"Clone":"com.rvx.android.youtube","Default":"app.rvx.android.youtube"},"title":"Package name of YouTube","description":"The name of the package to use in GmsCore support.","required":true},{"key":"PackageNameYouTubeMusic","default":"app.rvx.android.apps.youtube.music","values":{"Clone":"com.rvx.android.apps.youtube.music","Default":"app.rvx.android.apps.youtube.music"},"title":"Package name of YouTube Music","description":"The name of the package to use in GmsCore support.","required":true}]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"GmsCoreVendorGroupId","default":"app.revanced","values":{"ReVanced":"app.revanced"},"title":"GmsCore vendor group ID","description":"The vendor\u0027s group ID for GmsCore.","required":true},{"key":"CheckGmsCore","default":true,"values":null,"title":"Check GmsCore","description":"Check if GmsCore is installed on the device and has battery optimizations disabled when the app starts. \n\nIf GmsCore is not installed the app will not work, so disabling this is not recommended.","required":true},{"key":"PackageNameYouTube","default":"app.rvx.android.youtube","values":{"Clone":"com.rvx.android.youtube","Default":"app.rvx.android.youtube"},"title":"Package name of YouTube","description":"The name of the package to use in GmsCore support.","required":true},{"key":"PackageNameYouTubeMusic","default":"app.rvx.android.apps.youtube.music","values":{"Clone":"com.rvx.android.apps.youtube.music","Default":"app.rvx.android.apps.youtube.music"},"title":"Package name of YouTube Music","description":"The name of the package to use in GmsCore support.","required":true}]},{"name":"Hide Recently Visited shelf","description":"Adds an option to hide the Recently Visited shelf in the sidebar.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts dimming","description":"Removes, at compile time, the dimming effect at the top and bottom of Shorts videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide account components","description":"Adds options to hide components related to the account menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide action bar components","description":"Adds options to hide action bar components and replace the offline download button with an external download button.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide action buttons","description":"Adds options to hide action buttons under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to hide ads.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to hide ads.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Hide ads","description":"Adds options to hide ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide comments components","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide feed components","description":"Adds options to hide components related to feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide feed flyout menu","description":"Adds the ability to hide feed flyout menu components using a custom filter.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide navigation buttons","description":"Adds options to hide buttons in the navigation bar.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide overlay filter","description":"Removes, at compile time, the dark overlay that appears when player flyout menus are open.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds options to hide buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player flyout menu","description":"Adds options to hide player flyout menu components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player overlay filter","description":"Removes, at compile time, the dark overlay that appears when single-tapping in the player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended communities shelf","description":"Adds an option to hide the recommended communities shelves in subreddits.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide shortcuts","description":"Remove, at compile time, the app shortcuts that appears when app icon is long pressed.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"Explore","default":false,"values":null,"title":"Hide Explore","description":"Hide Explore from shortcuts.","required":true},{"key":"Subscriptions","default":false,"values":null,"title":"Hide Subscriptions","description":"Hide Subscriptions from shortcuts.","required":true},{"key":"Search","default":false,"values":null,"title":"Hide Search","description":"Hide Search from shortcuts.","required":true},{"key":"Shorts","default":true,"values":null,"title":"Hide Shorts","description":"Hide Shorts from shortcuts.","required":true}]},{"name":"Hook YouTube Music actions","description":"Adds support for opening music in RVX Music using the in-app YouTube Music button.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hook download actions","description":"Adds support to download videos with an external downloader app using the in-app download button.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Layout switch","description":"Adds an option to spoof the dpi in order to use a tablet or phone layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"MaterialYou","description":"Applies the MaterialYou theme for Android 12+ devices.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Miniplayer","description":"Adds options to change the in app minimized player, and if patching target 19.16+ adds options to use modern miniplayers.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation bar components","description":"Adds options to hide or change components related to the navigation bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation bar components","description":"Adds options to hide or change components related to the navigation bar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links directly","description":"Adds an option to skip over redirection URLs in external links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Overlay buttons","description":"Adds options to display overlay buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"IconType","default":"bold","values":{"Bold":"bold","Rounded":"rounded","Thin":"thin"},"title":"Icon type","description":"The icon type.","required":true},{"key":"BottomMargin","default":"2.5dip","values":{"Default":"2.5dip","None":"0.0dip","Wider":"5.0dip"},"title":"Bottom margin","description":"The bottom margin for the overlay buttons and timestamp.","required":true},{"key":"ChangeTopButtons","default":false,"values":null,"title":"Change top buttons","description":"Change the icons at the top of the player.","required":true}]},{"name":"Player components","description":"Adds options to hide or change components related to the player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player components","description":"Adds options to hide or change components related to the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Premium icon","description":"Unlocks premium app icons.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove background playback restrictions","description":"Removes restrictions on background playback, including for kids videos.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove background playback restrictions","description":"Removes restrictions on background playback, including for music and kids videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove subreddit dialog","description":"Adds options to remove the NSFW community warning and notifications suggestion dialogs by dismissing them automatically.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old style library shelf","description":"Adds an option to return the Library tab to the old style.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of songs using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Sanitize sharing links","description":"Adds an option to remove tracking query parameters from URLs when sharing links.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Sanitize sharing links","description":"Adds an option to remove tracking query parameters from URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Sanitize sharing links","description":"Adds an option to remove tracking query parameters from URLs when sharing links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar components","description":"Adds options to hide or change components related to the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings for Reddit","description":"Applies mandatory patches to implement ReVanced Extended settings into the application.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"RVXSettingsMenuName","default":"ReVanced Extended","values":null,"title":"RVX settings menu name","description":"The name of the RVX settings menu.","required":true}]},{"name":"Settings for YouTube","description":"Applies mandatory patches to implement ReVanced Extended settings into the application.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"InsertPosition","default":"@string/about_key","values":{"Parent settings":"@string/parent_tools_key","General":"@string/general_key","Account":"@string/account_switcher_key","Data saving":"@string/data_saving_settings_key","Autoplay":"@string/auto_play_key","Video quality preferences":"@string/video_quality_settings_key","Background":"@string/offline_key","Watch on TV":"@string/pair_with_tv_key","Manage all history":"@string/history_key","Your data in YouTube":"@string/your_data_key","Privacy":"@string/privacy_key","History \u0026 privacy":"@string/privacy_key","Try experimental new features":"@string/premium_early_access_browse_page_key","Purchases and memberships":"@string/subscription_product_setting_key","Billing \u0026 payments":"@string/billing_and_payment_key","Billing and payments":"@string/billing_and_payment_key","Notifications":"@string/notification_key","Connected apps":"@string/connected_accounts_browse_page_key","Live chat":"@string/live_chat_key","Captions":"@string/captions_key","Accessibility":"@string/accessibility_settings_key","About":"@string/about_key"},"title":"Insert position","description":"The settings menu name that the RVX settings menu should be above.","required":true},{"key":"RVXSettingsMenuName","default":"ReVanced Extended","values":null,"title":"RVX settings menu name","description":"The name of the RVX settings menu.","required":true}]},{"name":"Settings for YouTube Music","description":"Applies mandatory patches to implement ReVanced Extended settings into the application.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"RVXSettingsMenuName","default":"ReVanced Extended","values":null,"title":"RVX settings menu name","description":"The name of the RVX settings menu.","required":true}]},{"name":"Shorts components","description":"Adds options to hide or change components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments, such as non-music sections.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments, such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"OutlineIcon","default":false,"values":null,"title":"Outline icons","description":"Apply the outline icon.","required":true}]},{"name":"Spoof app version","description":"Adds options to spoof the YouTube Music client version. This can remove the radio mode restriction in Canadian regions or disable real-time lyrics.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds options to spoof the YouTube client version. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof streaming data","description":"Adds options to spoof the streaming data to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options for controlling volume and brightness with swiping, and whether to enter fullscreen when swiping down below the player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Changes the app\u0027s theme to the values specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"DarkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled Black":"@android:color/black","Catppuccin (Mocha)":"#FF181825","Dark Pink":"#FF290025","Dark Blue":"#FF001029","Dark Green":"#FF002905","Dark Yellow":"#FF282900","Dark Orange":"#FF291800","Dark Red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":true},{"key":"LightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Catppuccin (Latte)":"#FFE6E9EF","Light Pink":"#FFFCCFF3","Light Blue":"#FFD1E0FF","Light Green":"#FFCCFFCC","Light Yellow":"#FFFDFFCC","Light Orange":"#FFFFE6CC","Light Red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":true}]},{"name":"Toolbar components","description":"Adds options to hide or change components located on the toolbar, such as toolbar buttons, search bar, and header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Translations for YouTube","description":"Add translations or remove string resources.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"CustomTranslations","default":"","values":null,"title":"Custom translations","description":"The path to the \u0027strings.xml\u0027 file.\nPlease note that applying the \u0027strings.xml\u0027 file will overwrite all existing translations.","required":true},{"key":"SelectedTranslations","default":"ar, bg-rBG, de-rDE, el-rGR, es-rES, fr-rFR, hu-rHU, it-rIT, ja-rJP, ko-rKR, pl-rPL, pt-rBR, ru-rRU, tr-rTR, uk-rUA, vi-rVN, zh-rCN, zh-rTW","values":null,"title":"Translations to add","description":"A list of translations to be added for the RVX settings, separated by commas.","required":true},{"key":"SelectedStringResources","default":"af, am, ar, ar-rXB, as, az, b+es+419, b+sr+Latn, be, bg, bn, bs, ca, cs, da, de, el, en-rAU, en-rCA, en-rGB, en-rIN, en-rXA, en-rXC, es, es-rUS, et, eu, fa, fi, fr, fr-rCA, gl, gu, hi, hr, hu, hy, id, in, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, nb, ne, nl, no, or, pa, pl, pt, pt-rBR, pt-rPT, ro, ru, si, sk, sl, sq, sr, sv, sw, ta, te, th, tl, tr, uk, ur, uz, vi, zh, zh-rCN, zh-rHK, zh-rTW, zu","values":null,"title":"String resources to keep","description":"A list of string resources to be kept, separated by commas.\nString resources not in the list will be removed from the app.\n\nDefault string resource, English, is not removed.","required":true}]},{"name":"Translations for YouTube Music","description":"Add translations or remove string resources.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"CustomTranslations","default":"","values":null,"title":"Custom translations","description":"The path to the \u0027strings.xml\u0027 file.\nPlease note that applying the \u0027strings.xml\u0027 file will overwrite all existing language translations.","required":true},{"key":"SelectedTranslations","default":"bg-rBG, bn, cs-rCZ, el-rGR, es-rES, fr-rFR, hu-rHU, id-rID, in, it-rIT, ja-rJP, ko-rKR, nl-rNL, pl-rPL, pt-rBR, ro-rRO, ru-rRU, tr-rTR, uk-rUA, vi-rVN, zh-rCN, zh-rTW","values":null,"title":"Translations to add","description":"A list of translations to be added for the RVX settings, separated by commas.","required":true},{"key":"SelectedStringResources","default":"af, am, ar, ar-rXB, as, az, b+es+419, b+sr+Latn, be, bg, bn, bs, ca, cs, da, de, el, en-rAU, en-rCA, en-rGB, en-rIN, en-rXA, en-rXC, es, es-rUS, et, eu, fa, fi, fr, fr-rCA, gl, gu, hi, hr, hu, hy, id, in, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, nb, ne, nl, no, or, pa, pl, pt, pt-rBR, pt-rPT, ro, ru, si, sk, sl, sq, sr, sv, sw, ta, te, th, tl, tr, uk, ur, uz, vi, zh, zh-rCN, zh-rHK, zh-rTW, zu","values":null,"title":"String resources to keep","description":"A list of string resources to be kept, separated by commas.\nString resources not in the list will be removed from the app.\n\nDefault string resource, English, is not removed.","required":true}]},{"name":"Video playback","description":"Adds options to customize settings related to video playback, such as default video quality and playback speed.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video playback","description":"Adds options to customize settings related to video playback, such as default video quality and playback speed.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Visual preferences icons for YouTube","description":"Adds icons to specific preferences in the settings.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"RVXSettingsMenuIcon","default":"extension","values":{"Custom branding icon":"custom_branding_icon","Extension":"extension","Gear":"gear","YT alt":"yt_alt","ReVanced":"revanced","ReVanced Colored":"revanced_colored"},"title":"RVX settings menu icon","description":"The icon for the RVX settings menu.","required":true},{"key":"ApplyToAll","default":false,"values":null,"title":"Apply to all settings menu","description":"Whether to apply Visual preferences icons to all settings menus.\n\nIf true: icons are applied to the parent PreferenceScreen of YouTube settings, the parent PreferenceScreen of RVX settings and the RVX sub-settings (if supports).\n\nIf false: icons are applied only to the parent PreferenceScreen of YouTube settings and RVX settings.","required":true}]},{"name":"Visual preferences icons for YouTube Music","description":"Adds icons to specific preferences in the settings.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"RVXSettingsMenuIcon","default":"extension","values":{"Custom branding icon":"custom_branding_icon","Extension":"extension","Gear":"gear","ReVanced":"revanced","ReVanced Colored":"revanced_colored"},"title":"RVX settings menu icon","description":"The icon for the RVX settings menu.","required":true}]},{"name":"Watch history","description":"Adds an option to change the domain of the watch history or check its status.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file +[{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails using the DeArrow API or image captures from the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Ambient mode control","description":"Adds options to disable Ambient mode and to bypass Ambient mode restrictions.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Amoled","description":"Applies a pure black theme to some components.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bitrate default value","description":"Sets the audio quality to \u0027Always High\u0027 when you first install the app.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass image region restrictions","description":"Adds an option to use a different host for static images, so that images blocked in some countries can be received.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass image region restrictions","description":"Adds an option to use a different host for static images, so that images blocked in some countries can be received.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Certificate spoof","description":"Enables YouTube Music to work with Android Auto by spoofing the YouTube Music certificate.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Changes the package name for Reddit to the name specified in options.json.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"PackageNameReddit","default":"com.reddit.frontpage","values":{"Clone":"com.reddit.frontpage.revanced","Default":"com.reddit.frontpage.rvx","Original":"com.reddit.frontpage"},"title":"Package name of Reddit","description":"The name of the package to rename the app to.","required":true}]},{"name":"Change player flyout menu toggles","description":"Adds an option to use text toggles instead of switch toggles within the additional settings menu.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change share sheet","description":"Add option to change from in-app share sheet to system share sheet.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change share sheet","description":"Add option to change from in-app share sheet to system share sheet.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change start page","description":"Adds an option to set which page the app opens in instead of the homepage.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Change version code","description":"Changes the version code of the app to the value specified in options.json. Except when mounting, this can prevent app stores from updating the app and allow the app to be installed over an existing installation that has a higher version code. By default, the highest version code is set.","compatiblePackages":null,"use":false,"requiresIntegrations":false,"options":[{"key":"ChangeVersionCode","default":false,"values":null,"title":"Change version code","description":"Changes the version code of the app.","required":true},{"key":"VersionCode","default":"2147483647","values":null,"title":"Version code","description":"The version code to use. (1 ~ 2147483647)","required":true}]},{"name":"Custom Shorts action buttons","description":"Changes, at compile time, the icon of the action buttons of the Shorts player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"IconType","default":"cairo","values":{"Cairo":"cairo","Outline":"outline","OutlineCircle":"outlinecircle","Round":"round","YoutubeOutline":"youtubeoutline","YouTube":"youtube"},"title":"Shorts icon style ","description":"The style of the icons for the action buttons in the Shorts player.","required":true}]},{"name":"Custom branding icon for YouTube","description":"Changes the YouTube app icon to the icon specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppIcon","default":"revancify_blue","values":{"AFN Blue":"afn_blue","AFN Red":"afn_red","MMT":"mmt","Revancify Blue":"revancify_blue","Revancify Red":"revancify_red","YouTube":"youtube"},"title":"App icon","description":"The icon to apply to the app.\n\nIf a path to a folder is provided, the folder must contain the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders must contain the following files:\n\n- adaptiveproduct_youtube_background_color_108.png\n- adaptiveproduct_youtube_foreground_color_108.png\n- ic_launcher.png\n- ic_launcher_round.png","required":true},{"key":"ChangeSplashIcon","default":true,"values":null,"title":"Change splash icons","description":"Apply the custom branding icon to the splash screen.","required":true},{"key":"RestoreOldSplashAnimation","default":true,"values":null,"title":"Restore old splash animation","description":"Restore the old style splash animation.","required":true}]},{"name":"Custom branding icon for YouTube Music","description":"Changes the YouTube Music app icon to the icon specified in options.json.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppIcon","default":"revancify_blue","values":{"AFN Blue":"afn_blue","AFN Red":"afn_red","MMT":"mmt","Revancify Blue":"revancify_blue","Revancify Red":"revancify_red","YouTube Music":"youtube_music"},"title":"App icon","description":"The icon to apply to the app.\n\nIf a path to a folder is provided, the folder must contain the following folders:\n\n- mipmap-xxxhdpi\n- mipmap-xxhdpi\n- mipmap-xhdpi\n- mipmap-hdpi\n- mipmap-mdpi\n\nEach of these folders must contain the following files:\n\n- adaptiveproduct_youtube_music_background_color_108.png\n- adaptiveproduct_youtube_music_foreground_color_108.png\n- ic_launcher_release.png","required":true},{"key":"ChangeSplashIcon","default":true,"values":null,"title":"Change splash icons","description":"Apply the custom branding icon to the splash screen.","required":true},{"key":"RestoreOldSplashIcon","default":false,"values":null,"title":"Restore old splash icon","description":"Restore the old style splash icon.\n\nIf you enable both the old style splash icon and the Cairo splash animation,\n\nOld style splash icon will appear first and then the Cairo splash animation will start.","required":true}]},{"name":"Custom branding name for Reddit","description":"Renames the Reddit app to the name specified in options.json.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"AppName","default":"Reddit","values":{"Default":"RVX Reddit","Original":"Reddit"},"title":"App name","description":"The name of the app.","required":true}]},{"name":"Custom branding name for YouTube","description":"Renames the YouTube app to the name specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppName","default":"RVX","values":{"ReVanced Extended":"ReVanced Extended","RVX":"RVX","YouTube RVX":"YouTube RVX","YouTube":"YouTube"},"title":"App name","description":"The name of the app.","required":true}]},{"name":"Custom branding name for YouTube Music","description":"Renames the YouTube Music app to the name specified in options.json.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"AppNameNotification","default":"RVX Music","values":{"ReVanced Extended Music":"ReVanced Extended Music","RVX Music":"RVX Music","YouTube Music":"YouTube Music","YT Music":"YT Music"},"title":"App name in notification panel","description":"The name of the app as it appears in the notification panel.","required":true},{"key":"AppNameLauncher","default":"RVX Music","values":{"ReVanced Extended Music":"ReVanced Extended Music","RVX Music":"RVX Music","YouTube Music":"YouTube Music","YT Music":"YT Music"},"title":"App name in launcher","description":"The name of the app as it appears in the launcher.","required":true}]},{"name":"Custom double tap length","description":"Adds Double-tap to seek values that are specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"DoubleTapLengthArrays","default":"3, 5, 10, 15, 20, 30, 60, 120, 180","values":null,"title":"Double-tap to seek values","description":"A list of custom Double-tap to seek lengths to be added, separated by commas.","required":true}]},{"name":"Custom header for YouTube","description":"Applies a custom header in the top left corner within the app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"CustomHeader","default":"custom_branding_icon","values":{"Custom branding icon":"custom_branding_icon"},"title":"Custom header","description":"The header to apply to the app.\n\nPatch option \u0027Custom branding icon\u0027 applies only when:\n\n1. Patch \u0027Custom branding icon for YouTube\u0027 is included.\n2. Patch option for \u0027Custom branding icon for YouTube\u0027 is selected from the preset.\n\nIf a path to a folder is provided, the folder must contain one or more of the following folders, depending on the DPI of the device:\n\n- drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-hdpi\n- drawable-mdpi\n\nEach of the folders must contain all of the following files:\n\n[Generic header]\n\n- yt_wordmark_header_light.png\n- yt_wordmark_header_dark.png\n\nThe image dimensions must be as follows:\n\n- drawable-xxxhdpi: 488px x 192px\n- drawable-xxhdpi: 366px x 144px\n- drawable-xhdpi: 244px x 96px\n- drawable-hdpi: 184px x 72px\n- drawable-mdpi: 122px x 48px\n\n[Premium header]\n\n- yt_premium_wordmark_header_light.png\n- yt_premium_wordmark_header_dark.png\n\nThe image dimensions must be as follows:\n- drawable-xxxhdpi: 516px x 192px\n- drawable-xxhdpi: 387px x 144px\n- drawable-xhdpi: 258px x 96px\n- drawable-hdpi: 194px x 72px\n- drawable-mdpi: 129px x 48px","required":true}]},{"name":"Custom header for YouTube Music","description":"Applies a custom header in the top left corner within the app.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"CustomHeader","default":"custom_branding_icon","values":{"Custom branding icon":"custom_branding_icon"},"title":"Custom header","description":"The header to apply to the app.\n\nPatch option \u0027Custom branding icon\u0027 applies only when:\n\n1. Patch \u0027Custom branding icon for YouTube Music\u0027 is included.\n2. Patch option for \u0027Custom branding icon for YouTube Music\u0027 is selected from the preset.\n\nIf a path to a folder is provided, the folder must contain one or more of the following folders, depending on the DPI of the device:\n\n- drawable-xxxhdpi\n- drawable-xxhdpi\n- drawable-xhdpi\n- drawable-hdpi\n- drawable-mdpi\n\nEach of the folders must contain all of the following files:\n\n- action_bar_logo.png\n- logo_music.png\n- ytm_logo.png\n\nThe image \u0027action_bar_logo.png\u0027 dimensions must be as follows:\n\n- drawable-xxxhdpi: 320px x 96px\n- drawable-xxhdpi: 240px x 72px\n- drawable-xhdpi: 160px x 48px\n- drawable-hdpi: 121px x 36px\n- drawable-mdpi: 80px x 24px\n\nThe image \u0027logo_music.png\u0027 dimensions must be as follows:\n\n- drawable-xxxhdpi: 576px x 200px\n- drawable-xxhdpi: 432px x 150px\n- drawable-xhdpi: 288px x 100px\n- drawable-hdpi: 217px x 76px\n- drawable-mdpi: 144px x 50px\n\nThe image \u0027ytm_logo.png\u0027 dimensions must be as follows:\n\n- drawable-xxxhdpi: 412px x 144px\n- drawable-xxhdpi: 309px x 108px\n- drawable-xhdpi: 206px x 72px\n- drawable-hdpi: 155px x 54px\n- drawable-mdpi: 103px x 36px","required":true}]},{"name":"Description components","description":"Adds options to hide and disable description components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Cairo splash animation","description":"Adds an option to disable Cairo splash animation.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["7.06.54","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable QUIC protocol","description":"Adds an option to disable CronetEngine\u0027s QUIC protocol.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto audio tracks","description":"Adds an option to disable audio tracks from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Adds an option to disable captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dislike redirection","description":"Adds an option to disable redirection to the next track when clicking the Dislike button.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable haptic feedback","description":"Adds options to disable haptic feedback when swiping in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable resuming Shorts on startup","description":"Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Adds an option to disable the popup that appears when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable splash animation","description":"Adds an option to disable the splash animation on app startup.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable OPUS codec","description":"Adds an options to enable the OPUS audio codec if the player response includes.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable OPUS codec","description":"Adds an options to enable the OPUS audio codec if the player response includes.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debug logging","description":"Adds an option to enable debug logging.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debug logging","description":"Adds an option to enable debug logging.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable external browser","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable gradient loading screen","description":"Adds an option to enable the gradient loading screen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable landscape mode","description":"Adds an option to enable landscape mode when rotating the screen on phones.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable open links directly","description":"Adds an option to skip over redirection URLs in external links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Flyout menu components","description":"Adds options to hide or change flyout menu components.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Force hide player buttons background","description":"Removes, at compile time, the dark background surrounding the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Fullscreen components","description":"Adds options to hide or change components related to fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"GmsCoreVendorGroupId","default":"app.revanced","values":{"ReVanced":"app.revanced"},"title":"GmsCore vendor group ID","description":"The vendor\u0027s group ID for GmsCore.","required":true},{"key":"CheckGmsCore","default":true,"values":null,"title":"Check GmsCore","description":"Check if GmsCore is installed on the device and has battery optimizations disabled when the app starts. \n\nIf GmsCore is not installed the app will not work, so disabling this is not recommended.","required":true},{"key":"PackageNameYouTube","default":"app.rvx.android.youtube","values":{"Clone":"com.rvx.android.youtube","Default":"app.rvx.android.youtube"},"title":"Package name of YouTube","description":"The name of the package to use in GmsCore support.","required":true},{"key":"PackageNameYouTubeMusic","default":"app.rvx.android.apps.youtube.music","values":{"Clone":"com.rvx.android.apps.youtube.music","Default":"app.rvx.android.apps.youtube.music"},"title":"Package name of YouTube Music","description":"The name of the package to use in GmsCore support.","required":true}]},{"name":"GmsCore support","description":"Allows patched Google apps to run without root and under a different package name by using GmsCore instead of Google Play Services.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"GmsCoreVendorGroupId","default":"app.revanced","values":{"ReVanced":"app.revanced"},"title":"GmsCore vendor group ID","description":"The vendor\u0027s group ID for GmsCore.","required":true},{"key":"CheckGmsCore","default":true,"values":null,"title":"Check GmsCore","description":"Check if GmsCore is installed on the device and has battery optimizations disabled when the app starts. \n\nIf GmsCore is not installed the app will not work, so disabling this is not recommended.","required":true},{"key":"PackageNameYouTube","default":"app.rvx.android.youtube","values":{"Clone":"com.rvx.android.youtube","Default":"app.rvx.android.youtube"},"title":"Package name of YouTube","description":"The name of the package to use in GmsCore support.","required":true},{"key":"PackageNameYouTubeMusic","default":"app.rvx.android.apps.youtube.music","values":{"Clone":"com.rvx.android.apps.youtube.music","Default":"app.rvx.android.apps.youtube.music"},"title":"Package name of YouTube Music","description":"The name of the package to use in GmsCore support.","required":true}]},{"name":"Hide Recently Visited shelf","description":"Adds an option to hide the Recently Visited shelf in the sidebar.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts dimming","description":"Removes, at compile time, the dimming effect at the top and bottom of Shorts videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide account components","description":"Adds options to hide components related to the account menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide action bar components","description":"Adds options to hide action bar components and replace the offline download button with an external download button.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide action buttons","description":"Adds options to hide action buttons under videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to hide ads.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Adds options to hide ads.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Hide ads","description":"Adds options to hide ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide comments components","description":"Adds options to hide components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide feed components","description":"Adds options to hide components related to feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide feed flyout menu","description":"Adds the ability to hide feed flyout menu components using a custom filter.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Adds options to hide general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide navigation buttons","description":"Adds options to hide buttons in the navigation bar.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide overlay filter","description":"Removes, at compile time, the dark overlay that appears when player flyout menus are open.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds options to hide buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player flyout menu","description":"Adds options to hide player flyout menu components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player overlay filter","description":"Removes, at compile time, the dark overlay that appears when single-tapping in the player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended communities shelf","description":"Adds an option to hide the recommended communities shelves in subreddits.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide shortcuts","description":"Remove, at compile time, the app shortcuts that appears when app icon is long pressed.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[{"key":"Explore","default":false,"values":null,"title":"Hide Explore","description":"Hide Explore from shortcuts.","required":true},{"key":"Subscriptions","default":false,"values":null,"title":"Hide Subscriptions","description":"Hide Subscriptions from shortcuts.","required":true},{"key":"Search","default":false,"values":null,"title":"Hide Search","description":"Hide Search from shortcuts.","required":true},{"key":"Shorts","default":true,"values":null,"title":"Hide Shorts","description":"Hide Shorts from shortcuts.","required":true}]},{"name":"Hook YouTube Music actions","description":"Adds support for opening music in RVX Music using the in-app YouTube Music button.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hook download actions","description":"Adds support to download videos with an external downloader app using the in-app download button.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Layout switch","description":"Adds an option to spoof the dpi in order to use a tablet or phone layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"MaterialYou","description":"Applies the MaterialYou theme for Android 12+ devices.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Miniplayer","description":"Adds options to change the in app minimized player, and if patching target 19.16+ adds options to use modern miniplayers.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation bar components","description":"Adds options to hide or change components related to the navigation bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation bar components","description":"Adds options to hide or change components related to the navigation bar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links directly","description":"Adds an option to skip over redirection URLs in external links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Adds an option to always open links in your browser instead of in the in-app-browser.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Overlay buttons","description":"Adds options to display overlay buttons in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"IconType","default":"bold","values":{"Bold":"bold","Rounded":"rounded","Thin":"thin"},"title":"Icon type","description":"The icon type.","required":true},{"key":"BottomMargin","default":"2.5dip","values":{"Default":"2.5dip","None":"0.0dip","Wider":"5.0dip"},"title":"Bottom margin","description":"The bottom margin for the overlay buttons and timestamp.","required":true},{"key":"WiderButtonsSpace","default":false,"values":null,"title":"Wider between-buttons space","description":"Prevent adjacent button presses by increasing the horizontal spacing between buttons.","required":true},{"key":"ChangeTopButtons","default":false,"values":null,"title":"Change top buttons","description":"Change the icons at the top of the player.","required":true}]},{"name":"Player components","description":"Adds options to hide or change components related to the player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player components","description":"Adds options to hide or change components related to the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Premium icon","description":"Unlocks premium app icons.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove background playback restrictions","description":"Removes restrictions on background playback, including for kids videos.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove background playback restrictions","description":"Removes restrictions on background playback, including for music and kids videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove subreddit dialog","description":"Adds options to remove the NSFW community warning and notifications suggestion dialogs by dismissing them automatically.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove viewer discretion dialog","description":"Adds an option to remove the dialog that appears when opening a video that has been age-restricted by accepting it automatically. This does not bypass the age restriction.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Restore old style library shelf","description":"Adds an option to return the Library tab to the old style.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of songs using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Return YouTube Dislike","description":"Adds an option to show the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Sanitize sharing links","description":"Adds an option to remove tracking query parameters from URLs when sharing links.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Sanitize sharing links","description":"Adds an option to remove tracking query parameters from URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Sanitize sharing links","description":"Adds an option to remove tracking query parameters from URLs when sharing links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar components","description":"Adds options to hide or change components related to the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings for Reddit","description":"Applies mandatory patches to implement ReVanced Extended settings into the application.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":["2023.12.0","2024.17.0"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"RVXSettingsMenuName","default":"ReVanced Extended","values":null,"title":"RVX settings menu name","description":"The name of the RVX settings menu.","required":true}]},{"name":"Settings for YouTube","description":"Applies mandatory patches to implement ReVanced Extended settings into the application.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"InsertPosition","default":"@string/about_key","values":{"Parent settings":"@string/parent_tools_key","General":"@string/general_key","Account":"@string/account_switcher_key","Data saving":"@string/data_saving_settings_key","Autoplay":"@string/auto_play_key","Video quality preferences":"@string/video_quality_settings_key","Background":"@string/offline_key","Watch on TV":"@string/pair_with_tv_key","Manage all history":"@string/history_key","Your data in YouTube":"@string/your_data_key","Privacy":"@string/privacy_key","History \u0026 privacy":"@string/privacy_key","Try experimental new features":"@string/premium_early_access_browse_page_key","Purchases and memberships":"@string/subscription_product_setting_key","Billing \u0026 payments":"@string/billing_and_payment_key","Billing and payments":"@string/billing_and_payment_key","Notifications":"@string/notification_key","Connected apps":"@string/connected_accounts_browse_page_key","Live chat":"@string/live_chat_key","Captions":"@string/captions_key","Accessibility":"@string/accessibility_settings_key","About":"@string/about_key"},"title":"Insert position","description":"The settings menu name that the RVX settings menu should be above.","required":true},{"key":"RVXSettingsMenuName","default":"ReVanced Extended","values":null,"title":"RVX settings menu name","description":"The name of the RVX settings menu.","required":true}]},{"name":"Settings for YouTube Music","description":"Applies mandatory patches to implement ReVanced Extended settings into the application.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":true,"options":[{"key":"RVXSettingsMenuName","default":"ReVanced Extended","values":null,"title":"RVX settings menu name","description":"The name of the RVX settings menu.","required":true}]},{"name":"Shorts components","description":"Adds options to hide or change components related to YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments, such as non-music sections.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Adds options to enable and configure SponsorBlock, which can skip undesired video segments, such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"OutlineIcon","default":false,"values":null,"title":"Outline icons","description":"Apply the outline icon.","required":true}]},{"name":"Spoof app version","description":"Adds options to spoof the YouTube Music client version. This can remove the radio mode restriction in Canadian regions or disable real-time lyrics.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Adds options to spoof the YouTube client version. This can be used to restore old UI elements and features.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof streaming data","description":"Adds options to spoof the streaming data to allow video playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds options for controlling volume and brightness with swiping, and whether to enter fullscreen when swiping down below the player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Changes the app\u0027s theme to the values specified in options.json.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"DarkThemeBackgroundColor","default":"@android:color/black","values":{"Amoled Black":"@android:color/black","Catppuccin (Mocha)":"#FF181825","Dark Pink":"#FF290025","Dark Blue":"#FF001029","Dark Green":"#FF002905","Dark Yellow":"#FF282900","Dark Orange":"#FF291800","Dark Red":"#FF290000"},"title":"Dark theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":true},{"key":"LightThemeBackgroundColor","default":"@android:color/white","values":{"White":"@android:color/white","Catppuccin (Latte)":"#FFE6E9EF","Light Pink":"#FFFCCFF3","Light Blue":"#FFD1E0FF","Light Green":"#FFCCFFCC","Light Yellow":"#FFFDFFCC","Light Orange":"#FFFFE6CC","Light Red":"#FFFFD6D6"},"title":"Light theme background color","description":"Can be a hex color (#AARRGGBB) or a color resource reference.","required":true}]},{"name":"Toolbar components","description":"Adds options to hide or change components located on the toolbar, such as toolbar buttons, search bar, and header.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Translations for YouTube","description":"Add translations or remove string resources.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"CustomTranslations","default":"","values":null,"title":"Custom translations","description":"The path to the \u0027strings.xml\u0027 file.\nPlease note that applying the \u0027strings.xml\u0027 file will overwrite all existing translations.","required":true},{"key":"SelectedTranslations","default":"ar, bg-rBG, de-rDE, el-rGR, es-rES, fr-rFR, hu-rHU, it-rIT, ja-rJP, ko-rKR, pl-rPL, pt-rBR, ru-rRU, tr-rTR, uk-rUA, vi-rVN, zh-rCN, zh-rTW","values":null,"title":"Translations to add","description":"A list of translations to be added for the RVX settings, separated by commas.","required":true},{"key":"SelectedStringResources","default":"af, am, ar, ar-rXB, as, az, b+es+419, b+sr+Latn, be, bg, bn, bs, ca, cs, da, de, el, en-rAU, en-rCA, en-rGB, en-rIN, en-rXA, en-rXC, es, es-rUS, et, eu, fa, fi, fr, fr-rCA, gl, gu, hi, hr, hu, hy, id, in, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, nb, ne, nl, no, or, pa, pl, pt, pt-rBR, pt-rPT, ro, ru, si, sk, sl, sq, sr, sv, sw, ta, te, th, tl, tr, uk, ur, uz, vi, zh, zh-rCN, zh-rHK, zh-rTW, zu","values":null,"title":"String resources to keep","description":"A list of string resources to be kept, separated by commas.\nString resources not in the list will be removed from the app.\n\nDefault string resource, English, is not removed.","required":true}]},{"name":"Translations for YouTube Music","description":"Add translations or remove string resources.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"CustomTranslations","default":"","values":null,"title":"Custom translations","description":"The path to the \u0027strings.xml\u0027 file.\nPlease note that applying the \u0027strings.xml\u0027 file will overwrite all existing language translations.","required":true},{"key":"SelectedTranslations","default":"bg-rBG, bn, cs-rCZ, el-rGR, es-rES, fr-rFR, hu-rHU, id-rID, in, it-rIT, ja-rJP, ko-rKR, nl-rNL, pl-rPL, pt-rBR, ro-rRO, ru-rRU, tr-rTR, uk-rUA, vi-rVN, zh-rCN, zh-rTW","values":null,"title":"Translations to add","description":"A list of translations to be added for the RVX settings, separated by commas.","required":true},{"key":"SelectedStringResources","default":"af, am, ar, ar-rXB, as, az, b+es+419, b+sr+Latn, be, bg, bn, bs, ca, cs, da, de, el, en-rAU, en-rCA, en-rGB, en-rIN, en-rXA, en-rXC, es, es-rUS, et, eu, fa, fi, fr, fr-rCA, gl, gu, hi, hr, hu, hy, id, in, is, it, iw, ja, ka, kk, km, kn, ko, ky, lo, lt, lv, mk, ml, mn, mr, ms, my, nb, ne, nl, no, or, pa, pl, pt, pt-rBR, pt-rPT, ro, ru, si, sk, sl, sq, sr, sv, sw, ta, te, th, tl, tr, uk, ur, uz, vi, zh, zh-rCN, zh-rHK, zh-rTW, zu","values":null,"title":"String resources to keep","description":"A list of string resources to be kept, separated by commas.\nString resources not in the list will be removed from the app.\n\nDefault string resource, English, is not removed.","required":true}]},{"name":"Video playback","description":"Adds options to customize settings related to video playback, such as default video quality and playback speed.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video playback","description":"Adds options to customize settings related to video playback, such as default video quality and playback speed.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Visual preferences icons for YouTube","description":"Adds icons to specific preferences in the settings.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"RVXSettingsMenuIcon","default":"extension","values":{"Custom branding icon":"custom_branding_icon","Extension":"extension","Gear":"gear","YT alt":"yt_alt","ReVanced":"revanced","ReVanced Colored":"revanced_colored"},"title":"RVX settings menu icon","description":"The icon for the RVX settings menu.","required":true},{"key":"ApplyToAll","default":false,"values":null,"title":"Apply to all settings menu","description":"Whether to apply Visual preferences icons to all settings menus.\n\nIf true: icons are applied to the parent PreferenceScreen of YouTube settings, the parent PreferenceScreen of RVX settings and the RVX sub-settings (if supported).\n\nIf false: icons are applied only to the parent PreferenceScreen of YouTube settings and RVX settings.","required":true}]},{"name":"Visual preferences icons for YouTube Music","description":"Adds icons to specific preferences in the settings.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":["6.20.51","6.29.59","6.42.55","6.51.53","7.16.53"]}],"use":true,"requiresIntegrations":false,"options":[{"key":"RVXSettingsMenuIcon","default":"extension","values":{"Custom branding icon":"custom_branding_icon","Extension":"extension","Gear":"gear","ReVanced":"revanced","ReVanced Colored":"revanced_colored"},"title":"RVX settings menu icon","description":"The icon for the RVX settings menu.","required":true}]},{"name":"Watch history","description":"Adds an option to change the domain of the watch history or check its status.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.29.38","18.33.40","18.38.44","18.48.39","19.05.36","19.16.39"]}],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt index 3c0b8a71d..ac54c88a9 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L", "Ljava/lang/Object;"), - literalSupplier = { AccountSwitcherAccessibility } + literalSupplier = { AccountSwitcherAccessibility }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/MenuEntryFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/MenuEntryFingerprint.kt index 79e10550c..10bb54a5e 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/MenuEntryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/MenuEntryFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object MenuEntryFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { MenuEntry } + literalSupplier = { MenuEntry }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt index 52dbd3cd8..6735c0640 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt @@ -20,5 +20,5 @@ internal object NamesInactiveAccountThumbnailSizeFingerprint : LiteralValueFinge Opcode.MOVE_RESULT_OBJECT, Opcode.IF_EQZ ), - literalSupplier = { NamesInactiveAccountThumbnailSize } + literalSupplier = { NamesInactiveAccountThumbnailSize }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/TermsOfServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/TermsOfServiceFingerprint.kt index 35743e7fe..2f40b2c3a 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/TermsOfServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/components/fingerprints/TermsOfServiceFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object TermsOfServiceFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", - literalSupplier = { TosFooter } + literalSupplier = { TosFooter }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/ActionBarComponentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/ActionBarComponentFingerprint.kt index de2ac50ad..21839de04 100644 --- a/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/ActionBarComponentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/ActionBarComponentFingerprint.kt @@ -17,5 +17,5 @@ internal object ActionBarComponentFingerprint : LiteralValueFingerprint( Opcode.SGET_OBJECT, Opcode.SGET_OBJECT ), - literalSupplier = { 99180 } + literalSupplier = { 99180 }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/LikeDislikeContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/LikeDislikeContainerFingerprint.kt index d507f7a5b..a05d19a7a 100644 --- a/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/LikeDislikeContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/actionbar/components/fingerprints/LikeDislikeContainerFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object LikeDislikeContainerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { LikeDislikeContainer } + literalSupplier = { LikeDislikeContainer }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/AdsPatch.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/AdsPatch.kt index 9a1d8d21c..a0de47604 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/AdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/AdsPatch.kt @@ -2,7 +2,6 @@ package app.revanced.patches.music.ads.general import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patches.music.ads.general.MusicAdsPatch.hookLithoFullscreenAds import app.revanced.patches.music.ads.general.MusicAdsPatch.hookNonLithoFullscreenAds @@ -10,8 +9,6 @@ import app.revanced.patches.music.ads.general.fingerprints.AccountMenuFooterFing import app.revanced.patches.music.ads.general.fingerprints.FloatingLayoutFingerprint import app.revanced.patches.music.ads.general.fingerprints.GetPremiumTextViewFingerprint import app.revanced.patches.music.ads.general.fingerprints.InterstitialsContainerFingerprint -import app.revanced.patches.music.ads.general.fingerprints.MembershipSettingsFingerprint -import app.revanced.patches.music.ads.general.fingerprints.MembershipSettingsParentFingerprint import app.revanced.patches.music.ads.general.fingerprints.NotifierShelfFingerprint import app.revanced.patches.music.ads.general.fingerprints.ShowDialogCommandFingerprint import app.revanced.patches.music.navigation.components.NavigationBarComponentsPatch @@ -55,7 +52,6 @@ object AdsPatch : BaseBytecodePatch( FloatingLayoutFingerprint, GetPremiumTextViewFingerprint, InterstitialsContainerFingerprint, - MembershipSettingsParentFingerprint, NotifierShelfFingerprint, ShowDialogCommandFingerprint ) @@ -163,20 +159,6 @@ object AdsPatch : BaseBytecodePatch( } } - // premium membership menu in settings - MembershipSettingsFingerprint.resolve( - context, - MembershipSettingsParentFingerprint.resultOrThrow().classDef - ) - MembershipSettingsFingerprint.resultOrThrow().mutableMethod.addInstructions( - 0, """ - const/4 v0, 0x0 - return-object v0 - """ - ) - - // endregion - LithoFilterPatch.addFilter(ADS_FILTER_CLASS_DESCRIPTOR) SettingsPatch.addSwitchPreference( diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/AccountMenuFooterFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/AccountMenuFooterFingerprint.kt index 0ddd4bf72..92a5c8c76 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/AccountMenuFooterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/AccountMenuFooterFingerprint.kt @@ -17,5 +17,5 @@ internal object AccountMenuFooterFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT ), - literalSupplier = { PrivacyTosFooter } + literalSupplier = { PrivacyTosFooter }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt index ec2956f36..9d512607d 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt @@ -9,5 +9,5 @@ internal object FloatingLayoutFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { FloatingLayout } + literalSupplier = { FloatingLayout }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt index c5f600a10..1b18c8d54 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object InterstitialsContainerFingerprint : LiteralValueFingerprint( returnType = "V", strings = listOf("overlay_controller_param"), - literalSupplier = { InterstitialsContainer } + literalSupplier = { InterstitialsContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/MembershipSettingsParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/MembershipSettingsParentFingerprint.kt deleted file mode 100644 index 54f428559..000000000 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/MembershipSettingsParentFingerprint.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.music.ads.general.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal object MembershipSettingsParentFingerprint : MethodFingerprint( - returnType = "L", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - parameters = emptyList(), - strings = listOf("SPmanage_red") -) diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/DialogSolidFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/DialogSolidFingerprint.kt index 9d8ad020d..92cb13bdb 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/DialogSolidFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/DialogSolidFingerprint.kt @@ -15,6 +15,6 @@ internal object DialogSolidFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_STATIC ), - literalSupplier = { DialogSolid } + literalSupplier = { DialogSolid }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/EndButtonsContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/EndButtonsContainerFingerprint.kt index c06ff0ea8..bad8c6357 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/EndButtonsContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/EndButtonsContainerFingerprint.kt @@ -5,6 +5,6 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object EndButtonsContainerFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { EndButtonsContainer } + literalSupplier = { EndButtonsContainer }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/SleepTimerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/SleepTimerFingerprint.kt index 79e58c36f..e374b56d9 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/SleepTimerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/SleepTimerFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object SleepTimerFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45372767 } + literalSupplier = { 45372767 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TouchOutsideFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TouchOutsideFingerprint.kt index a53a0fbc5..31008c1b3 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TouchOutsideFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TouchOutsideFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object TouchOutsideFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", - literalSupplier = { TouchOutside } + literalSupplier = { TouchOutside }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceConfigFingerprint.kt index b33df48b6..be1db6639 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceConfigFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint object TrimSilenceConfigFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45619123 } + literalSupplier = { 45619123 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceSwitchFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceSwitchFingerprint.kt index 1330ccdc5..6e619e0f4 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceSwitchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutmenu/components/fingerprints/TrimSilenceSwitchFingerprint.kt @@ -8,6 +8,6 @@ import com.android.tools.smali.dexlib2.AccessFlags object TrimSilenceSwitchFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { TrimSilenceSwitch } + literalSupplier = { TrimSilenceSwitch }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/LayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/components/LayoutComponentsPatch.kt index f43d509f2..ff23d1798 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/LayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/LayoutComponentsPatch.kt @@ -9,13 +9,15 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.general.components.fingerprints.ChipCloudFingerprint -import app.revanced.patches.music.general.components.fingerprints.ContentPillInFingerprint +import app.revanced.patches.music.general.components.fingerprints.ContentPillFingerprint import app.revanced.patches.music.general.components.fingerprints.FloatingButtonFingerprint import app.revanced.patches.music.general.components.fingerprints.FloatingButtonParentFingerprint import app.revanced.patches.music.general.components.fingerprints.HistoryMenuItemFingerprint import app.revanced.patches.music.general.components.fingerprints.HistoryMenuItemOfflineTabFingerprint import app.revanced.patches.music.general.components.fingerprints.MediaRouteButtonFingerprint +import app.revanced.patches.music.general.components.fingerprints.ParentToolMenuFingerprint import app.revanced.patches.music.general.components.fingerprints.PlayerOverlayChipFingerprint +import app.revanced.patches.music.general.components.fingerprints.PreferenceScreenFingerprint import app.revanced.patches.music.general.components.fingerprints.SearchBarFingerprint import app.revanced.patches.music.general.components.fingerprints.SearchBarParentFingerprint import app.revanced.patches.music.general.components.fingerprints.SoundSearchFingerprint @@ -26,6 +28,7 @@ import app.revanced.patches.music.general.components.fingerprints.TopBarMenuItem import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_PATH import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTasteBuilderShelf import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PlayerOverlayChip @@ -57,12 +60,14 @@ object LayoutComponentsPatch : BaseBytecodePatch( compatiblePackages = COMPATIBLE_PACKAGE, fingerprints = setOf( ChipCloudFingerprint, - ContentPillInFingerprint, + ContentPillFingerprint, FloatingButtonParentFingerprint, HistoryMenuItemFingerprint, HistoryMenuItemOfflineTabFingerprint, MediaRouteButtonFingerprint, + ParentToolMenuFingerprint, PlayerOverlayChipFingerprint, + PreferenceScreenFingerprint, SearchBarParentFingerprint, SoundSearchFingerprint, TasteBuilderConstructorFingerprint, @@ -70,9 +75,10 @@ object LayoutComponentsPatch : BaseBytecodePatch( TopBarMenuItemImageViewFingerprint ) ) { + private const val INTEGRATIONS_SETTINGS_MENU_DESCRIPTOR = + "$GENERAL_PATH/SettingsMenuPatch;" private const val CUSTOM_FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/CustomFilter;" - private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/LayoutComponentsFilter;" @@ -194,6 +200,35 @@ object LayoutComponentsPatch : BaseBytecodePatch( // endregion + // region patch for hide setting menus + + PreferenceScreenFingerprint.resultOrThrow().mutableMethod.apply { + addInstructions( + implementation!!.instructions.lastIndex, """ + invoke-virtual/range {p0 .. p0}, Lcom/google/android/apps/youtube/music/settings/fragment/SettingsHeadersFragment;->getPreferenceScreen()Landroidx/preference/PreferenceScreen; + move-result-object v0 + invoke-static {v0}, $INTEGRATIONS_SETTINGS_MENU_DESCRIPTOR->hideSettingsMenu(Landroidx/preference/PreferenceScreen;)V + """ + ) + } + + // The lowest version supported by the patch does not have parent tool settings + ParentToolMenuFingerprint.result?.let { + it.mutableMethod.apply { + val index = it.scanResult.patternScanResult!!.startIndex + 1 + val register = getInstruction(index).registerD + + addInstructions( + index, """ + invoke-static {v$register}, $INTEGRATIONS_SETTINGS_MENU_DESCRIPTOR->hideParentToolsMenu(Z)Z + move-result v$register + """ + ) + } + } + + // endregion + // region patch for hide sound search button SoundSearchFingerprint.result?.let { @@ -208,7 +243,7 @@ object LayoutComponentsPatch : BaseBytecodePatch( // region patch for hide tap to update button - ContentPillInFingerprint.resultOrThrow().let { + ContentPillFingerprint.resultOrThrow().let { it.mutableMethod.apply { addInstructionsWithLabels( 0, @@ -299,16 +334,6 @@ object LayoutComponentsPatch : BaseBytecodePatch( "revanced_custom_filter_strings", "revanced_custom_filter" ) - SettingsPatch.addSwitchPreference( - CategoryType.GENERAL, - "revanced_hide_settings_menu", - "false" - ) - SettingsPatch.addPreferenceWithIntent( - CategoryType.GENERAL, - "revanced_hide_settings_menu_filter_strings", - "revanced_hide_settings_menu" - ) SettingsPatch.addSwitchPreference( CategoryType.GENERAL, "revanced_hide_button_shelf", @@ -373,5 +398,66 @@ object LayoutComponentsPatch : BaseBytecodePatch( "revanced_hide_voice_search_button", "false" ) + + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_parent_tools", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_general", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_playback", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_data_saving", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_downloads_and_storage", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_notification", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_privacy_and_location", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_recommendations", + "false", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_paid_memberships", + "true", + false + ) + SettingsPatch.addSwitchPreference( + CategoryType.SETTINGS, + "revanced_hide_settings_menu_about", + "false", + false + ) } } diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ChipCloudFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ChipCloudFingerprint.kt index f96fdb6ff..e8f920198 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ChipCloudFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ChipCloudFingerprint.kt @@ -12,6 +12,6 @@ internal object ChipCloudFingerprint : LiteralValueFingerprint( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { ChipCloud } + literalSupplier = { ChipCloud }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ContentPillInFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ContentPillFingerprint.kt similarity index 76% rename from src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ContentPillInFingerprint.kt rename to src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ContentPillFingerprint.kt index 6fed0ad94..cfb292686 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ContentPillInFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ContentPillFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.general.components.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -internal object ContentPillInFingerprint : MethodFingerprint( +internal object ContentPillFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Content pill VE is null") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/FloatingButtonParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/FloatingButtonParentFingerprint.kt index 360c10ad4..91868dfa6 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/FloatingButtonParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/FloatingButtonParentFingerprint.kt @@ -10,6 +10,6 @@ internal object FloatingButtonParentFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = listOf("L"), opcodes = listOf(Opcode.INVOKE_DIRECT), - literalSupplier = { 259982244 } + literalSupplier = { 259982244 }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ParentToolMenuFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ParentToolMenuFingerprint.kt new file mode 100644 index 000000000..39e03d6e7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/ParentToolMenuFingerprint.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.music.general.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal object ParentToolMenuFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + opcodes = listOf( + Opcode.CONST_4, + Opcode.INVOKE_VIRTUAL, + Opcode.IGET, + ), + strings = listOf("pref_key_parent_tools"), + customFingerprint = { methodDef, _ -> + methodDef.name == "onSettingsLoaded" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PlayerOverlayChipFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PlayerOverlayChipFingerprint.kt index 30978def7..c2c880d4b 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PlayerOverlayChipFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PlayerOverlayChipFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object PlayerOverlayChipFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { PlayerOverlayChip } + literalSupplier = { PlayerOverlayChip }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PreferenceScreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PreferenceScreenFingerprint.kt new file mode 100644 index 000000000..53e1e95de --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/PreferenceScreenFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.music.general.components.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object PreferenceScreenFingerprint : MethodFingerprint( + returnType = "V", + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "Lcom/google/android/apps/youtube/music/settings/fragment/SettingsHeadersFragment;" && + methodDef.name == "onCreatePreferences" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/SoundSearchFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/SoundSearchFingerprint.kt index 86f4fe708..5a9fa7cf0 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/SoundSearchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/SoundSearchFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object SoundSearchFingerprint : LiteralValueFingerprint( parameters = emptyList(), - literalSupplier = { 45625491 } + literalSupplier = { 45625491 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TasteBuilderConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TasteBuilderConstructorFingerprint.kt index 148e3f36c..39b3baa3e 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TasteBuilderConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TasteBuilderConstructorFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object TasteBuilderConstructorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { MusicTasteBuilderShelf } + literalSupplier = { MusicTasteBuilderShelf }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TooltipContentViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TooltipContentViewFingerprint.kt index e5934cefa..936c702af 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TooltipContentViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TooltipContentViewFingerprint.kt @@ -9,5 +9,5 @@ internal object TooltipContentViewFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), - literalSupplier = { ToolTipContentView } + literalSupplier = { ToolTipContentView }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TopBarMenuItemImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TopBarMenuItemImageViewFingerprint.kt index 5f7b40f4e..7b91a2e67 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TopBarMenuItemImageViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/components/fingerprints/TopBarMenuItemImageViewFingerprint.kt @@ -9,6 +9,6 @@ internal object TopBarMenuItemImageViewFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { TopBarMenuItemImageView } + literalSupplier = { TopBarMenuItemImageView }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt index d9105934e..b958e9dcc 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt @@ -15,6 +15,6 @@ internal object TabletIdentifierFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT ), - literalSupplier = { IsTablet } + literalSupplier = { IsTablet }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt index 4fbc74a4e..e4cddc798 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt @@ -9,5 +9,5 @@ internal object BrowseIdFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), strings = listOf("FEmusic_offline"), - literalSupplier = { 45358178 } + literalSupplier = { 45358178 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/spoofappversion/SpoofAppVersionPatch.kt index f179b4c43..11a691e9c 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/spoofappversion/SpoofAppVersionPatch.kt @@ -1,10 +1,15 @@ package app.revanced.patches.music.general.spoofappversion import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patches.music.general.oldstylelibraryshelf.OldStyleLibraryShelfPatch import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType +import app.revanced.patches.music.utils.settings.SettingsBytecodePatch import app.revanced.patches.music.utils.settings.SettingsPatch +import app.revanced.util.appendAppVersion +import app.revanced.util.findMethodOrThrow import app.revanced.util.patch.BaseResourcePatch @Suppress("unused") @@ -21,6 +26,17 @@ object SpoofAppVersionPatch : BaseResourcePatch( ) { override fun execute(context: ResourceContext) { + if (SettingsPatch.upward0718) { + context.appendAppVersion("7.16.53") + + SettingsBytecodePatch.contexts.findMethodOrThrow(GENERAL_CLASS_DESCRIPTOR) { + name == "getSpoofAppVersionDefault" + }.replaceInstruction( + 0, + "const-string v0, \"7.16.53\"" + ) + } + SettingsPatch.addSwitchPreference( CategoryType.GENERAL, "revanced_spoof_app_version", diff --git a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt index ae4fc69e7..ac0953fcd 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt @@ -12,6 +12,6 @@ internal object DesignBottomSheetDialogFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { DesignBottomSheetDialog } + literalSupplier = { DesignBottomSheetDialog }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt index 019c90a9b..c7969c38a 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/visual/VisualPreferencesIconsPatch.kt @@ -136,6 +136,7 @@ object VisualPreferencesIconsPatch : BaseResourcePatch( "revanced_preference_screen_general", "revanced_preference_screen_navigation", "revanced_preference_screen_player", + "revanced_preference_screen_settings", "revanced_preference_screen_video", "revanced_preference_screen_ryd", "revanced_preference_screen_sb", diff --git a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt index ed4e79c7f..a2a3f7043 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -12,7 +12,7 @@ import app.revanced.patches.music.misc.backgroundplayback.fingerprints.PodCastCo import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.util.getReference import app.revanced.util.getWalkerMethod -import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstStringInstructionOrThrow import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.resultOrThrow @@ -52,8 +52,8 @@ object BackgroundPlaybackPatch : BaseBytecodePatch( // don't play music video MusicBrowserServiceFingerprint.resultOrThrow().let { it.mutableMethod.apply { - val stringIndex = MusicBrowserServiceFingerprint.indexOfMBSInstruction(this) - val targetIndex = indexOfFirstInstructionReversedOrThrow(stringIndex) { + val stringIndex = it.scanResult.stringsScanResult!!.matches.first().index + val targetIndex = indexOfFirstInstructionOrThrow(stringIndex) { val reference = getReference() opcode == Opcode.INVOKE_VIRTUAL && reference?.returnType == "Z" && diff --git a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt index df6f80446..7115f9a86 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt @@ -8,5 +8,5 @@ internal object BackgroundPlaybackManagerFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), - literalSupplier = { 64657230 } + literalSupplier = { 64657230 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/MusicBrowserServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/MusicBrowserServiceFingerprint.kt index 2823a0079..714e4fa05 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/MusicBrowserServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/MusicBrowserServiceFingerprint.kt @@ -2,28 +2,14 @@ package app.revanced.patches.music.misc.backgroundplayback.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patches.music.misc.backgroundplayback.fingerprints.MusicBrowserServiceFingerprint.indexOfMBSInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.StringReference internal object MusicBrowserServiceFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/String;", "Landroid/os/Bundle;"), - customFingerprint = custom@{ methodDef, _ -> - if (!methodDef.definingClass.endsWith("/MusicBrowserService;")) - return@custom false - - indexOfMBSInstruction(methodDef) >= 0 - } -) { - fun indexOfMBSInstruction(methodDef: Method) = - methodDef.indexOfFirstInstruction { - opcode == Opcode.CONST_STRING && - getReference()?.string?.startsWith("MBS: Return empty root for client: %s") == true - } -} \ No newline at end of file + strings = listOf("android.service.media.extra.RECENT"), + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/MusicBrowserService;") + }, +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/PodCastConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/PodCastConfigFingerprint.kt index 0d75bcdb3..c4bd6a020 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/PodCastConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/fingerprints/PodCastConfigFingerprint.kt @@ -8,5 +8,5 @@ internal object PodCastConfigFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { 45388403 } + literalSupplier = { 45388403 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt index 4de97d056..3950eaac5 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt @@ -9,5 +9,5 @@ internal object BottomSheetRecyclerViewFingerprint : LiteralValueFingerprint( returnType = "Lj${'$'}/util/Optional;", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { BottomSheetRecyclerView } + literalSupplier = { BottomSheetRecyclerView }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutFingerprint.kt index e5144deee..a9c0cccf8 100644 --- a/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutFingerprint.kt @@ -10,6 +10,6 @@ internal object TabLayoutFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), strings = listOf("FEmusic_radio_builder"), - literalSupplier = { ColorGrey } + literalSupplier = { ColorGrey }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutTextFingerprint.kt index 7d6613b23..60ca9dc58 100644 --- a/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/navigation/components/fingerprints/TabLayoutTextFingerprint.kt @@ -19,6 +19,6 @@ internal object TabLayoutTextFingerprint : LiteralValueFingerprint( Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT ), - literalSupplier = { Text1 } + literalSupplier = { Text1 }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt index 1cead791f..ffcdedd01 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/PlayerComponentsPatch.kt @@ -6,6 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.extensions.or import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable @@ -13,6 +14,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.player.components.fingerprints.AudioVideoSwitchToggleFingerprint +import app.revanced.patches.music.player.components.fingerprints.AudioVideoSwitchToggleFingerprint.AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY import app.revanced.patches.music.player.components.fingerprints.EngagementPanelHeightFingerprint import app.revanced.patches.music.player.components.fingerprints.EngagementPanelHeightParentFingerprint import app.revanced.patches.music.player.components.fingerprints.HandleSearchRenderedFingerprint @@ -35,19 +37,17 @@ import app.revanced.patches.music.player.components.fingerprints.PlayerViewPager import app.revanced.patches.music.player.components.fingerprints.QuickSeekOverlayFingerprint import app.revanced.patches.music.player.components.fingerprints.RemixGenericButtonFingerprint import app.revanced.patches.music.player.components.fingerprints.RepeatTrackFingerprint -import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint -import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfImageViewInstruction -import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfOrdinalInstruction +import app.revanced.patches.music.player.components.fingerprints.ShuffleOnClickFingerprint import app.revanced.patches.music.player.components.fingerprints.SwipeToCloseFingerprint import app.revanced.patches.music.player.components.fingerprints.SwitchToggleColorFingerprint import app.revanced.patches.music.player.components.fingerprints.ZenModeFingerprint import app.revanced.patches.music.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.fingerprints.PendingIntentReceiverFingerprint import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH +import app.revanced.patches.music.utils.integrations.Constants.INTEGRATIONS_PATH import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.AudioVideoSwitchToggle import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ColorGrey import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.DarkBackground import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPlayerPlayPauseReplayButton @@ -61,6 +61,7 @@ import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.utils.videotype.VideoTypeHookPatch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT +import app.revanced.util.addStaticFieldToIntegration import app.revanced.util.alsoResolve import app.revanced.util.findMethodOrThrow import app.revanced.util.getReference @@ -73,11 +74,10 @@ import app.revanced.util.injectLiteralInstructionBooleanCall import app.revanced.util.injectLiteralInstructionViewCall import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.resultOrThrow -import app.revanced.util.transformFields +import app.revanced.util.transformMethods import app.revanced.util.traverseClassHierarchy import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.MethodParameter import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -88,7 +88,6 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.Reference import com.android.tools.smali.dexlib2.immutable.ImmutableField import com.android.tools.smali.dexlib2.immutable.ImmutableMethod -import com.android.tools.smali.dexlib2.util.MethodUtil import kotlin.properties.Delegates @Suppress("unused", "LocalVariableName") @@ -101,7 +100,7 @@ object PlayerComponentsPatch : BaseBytecodePatch( PlayerComponentsResourcePatch::class, SettingsPatch::class, SharedResourceIdPatch::class, - VideoTypeHookPatch::class + VideoTypeHookPatch::class, ), compatiblePackages = COMPATIBLE_PACKAGE, fingerprints = setOf( @@ -126,13 +125,16 @@ object PlayerComponentsPatch : BaseBytecodePatch( QuickSeekOverlayFingerprint, RemixGenericButtonFingerprint, RepeatTrackFingerprint, - ShuffleClassReferenceFingerprint, + ShuffleOnClickFingerprint, SwipeToCloseFingerprint, ) ) { private const val FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/PlayerComponentsFilter;" + private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = + "$INTEGRATIONS_PATH/utils/VideoUtils;" + override fun execute(context: BytecodeContext) { // region patch for disable gesture in player @@ -628,14 +630,25 @@ object PlayerComponentsPatch : BaseBytecodePatch( // region patch for hide audio video switch toggle AudioVideoSwitchToggleFingerprint.resultOrThrow().mutableMethod.apply { - val constIndex = indexOfFirstWideLiteralInstructionValueOrThrow(AudioVideoSwitchToggle) - val viewIndex = indexOfFirstInstructionOrThrow(constIndex, Opcode.MOVE_RESULT_OBJECT) - val viewRegister = getInstruction(viewIndex).registerA + implementation!!.instructions + .withIndex() + .filter { (_, instruction) -> + val reference = (instruction as? ReferenceInstruction)?.reference + instruction.opcode == Opcode.INVOKE_VIRTUAL && + reference is MethodReference && + reference.toString() == AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY + } + .map { (index, _) -> index } + .reversed() + .forEach { index -> + val instruction = getInstruction(index) - addInstruction( - viewIndex + 1, - "invoke-static {v$viewRegister}, $PLAYER_CLASS_DESCRIPTOR->hideAudioVideoSwitchToggle(Landroid/view/View;)V" - ) + replaceInstruction( + index, + "invoke-static {v${instruction.registerC}, v${instruction.registerD}}," + + "$PLAYER_CLASS_DESCRIPTOR->hideAudioVideoSwitchToggle(Landroid/view/View;I)V" + ) + } } SettingsPatch.addSwitchPreference( @@ -735,154 +748,87 @@ object PlayerComponentsPatch : BaseBytecodePatch( // region patch for remember shuffle state - val MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR = - "Lcom/google/android/apps/youtube/music/watchpage/MusicPlaybackControls;" + ShuffleOnClickFingerprint.resultOrThrow().mutableMethod.apply { + val accessibilityIndex = + ShuffleOnClickFingerprint.indexOfAccessibilityInstruction(this) - lateinit var rememberShuffleStateObjectClass: String - lateinit var rememberShuffleStateImageViewReference: Reference - lateinit var rememberShuffleStateShuffleStateLabel: String + // region set shuffle enum - ShuffleClassReferenceFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - rememberShuffleStateObjectClass = definingClass - - val imageViewIndex = indexOfImageViewInstruction(this) - val ordinalIndex = indexOfOrdinalInstruction(this) - - val invokeInterfaceIndex = - indexOfFirstInstructionReversedOrThrow(ordinalIndex, Opcode.INVOKE_INTERFACE) - val iGetObjectIndex = - indexOfFirstInstructionReversedOrThrow(invokeInterfaceIndex, Opcode.IGET_OBJECT) - val checkCastIndex = - indexOfFirstInstructionOrThrow(invokeInterfaceIndex, Opcode.CHECK_CAST) - - val iGetObjectReference = - getInstruction(iGetObjectIndex).reference - val invokeInterfaceReference = - getInstruction(invokeInterfaceIndex).reference - val checkCastReference = - getInstruction(checkCastIndex).reference - val getOrdinalClassReference = - getInstruction(checkCastIndex + 1).reference - val ordinalReference = - getInstruction(ordinalIndex).reference - - rememberShuffleStateImageViewReference = - getInstruction(imageViewIndex).reference - - rememberShuffleStateShuffleStateLabel = """ - iget-object v1, v0, $iGetObjectReference - invoke-interface {v1}, $invokeInterfaceReference - move-result-object v1 - check-cast v1, $checkCastReference - """ - - rememberShuffleStateShuffleStateLabel += if (getInstruction(checkCastIndex + 1).opcode == Opcode.INVOKE_VIRTUAL) { - // YouTube Music 7.16.53+ - """ - invoke-virtual {v1}, $getOrdinalClassReference - move-result-object v1 - - """.trimIndent() - } else { - """ - iget-object v1, v1, $getOrdinalClassReference - - """.trimIndent() - } - - rememberShuffleStateShuffleStateLabel += """ - invoke-virtual {v1}, $ordinalReference - move-result v1 - - """.trimIndent() + val enumIndex = indexOfFirstInstructionReversedOrThrow(accessibilityIndex) { + opcode == Opcode.INVOKE_DIRECT && + getReference()?.returnType == "Ljava/lang/String;" } + val enumRegister = getInstruction(enumIndex).registerD + val enumClass = + (getInstruction(enumIndex).reference as MethodReference).parameterTypes.first() - val constructorMethod = - it.mutableClass.methods.first { method -> MethodUtil.isConstructor(method) } - val onClickMethod = it.mutableClass.methods.first { method -> method.name == "onClick" } + addInstruction( + enumIndex, + "invoke-static {v$enumRegister}, $PLAYER_CLASS_DESCRIPTOR->setShuffleState(Ljava/lang/Enum;)V" + ) - constructorMethod.apply { - addInstruction( - implementation!!.instructions.lastIndex, - "sput-object p0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass" - ) - } + // endregion - onClickMethod.apply { - addInstructions( - 0, """ - move-object v0, p0 - """ + rememberShuffleStateShuffleStateLabel + """ - invoke-static {v1}, $PLAYER_CLASS_DESCRIPTOR->setShuffleState(I)V - """ - ) - } + // region set static field - context.traverseClassHierarchy(it.mutableClass) { - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL - transformFields { - ImmutableField( + val shuffleClassIndex = + indexOfFirstInstructionReversedOrThrow(accessibilityIndex, Opcode.CHECK_CAST) + val shuffleClass = + getInstruction(shuffleClassIndex).reference.toString() + val shuffleMutableClass = context.findClass { classDef -> + classDef.type == shuffleClass + }!!.mutableClass + + val shuffleMethod = shuffleMutableClass.methods.find { method -> + method.parameterTypes.firstOrNull() == enumClass && + method.parameterTypes.size == 1 && + method.returnType == "V" + } ?: throw PatchException("target not found") + + val smaliInstructions = + """ + if-eqz v0, :ignore + sget-object v1, $enumClass->b:$enumClass + invoke-virtual {v0, v1}, $shuffleClass->${shuffleMethod.name}($enumClass)V + :ignore + return-void + """ + + context.addStaticFieldToIntegration( + INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR, + "shuffleTracks", + "shuffleClass", + shuffleClass, + smaliInstructions + ) + + // endregion + + // region make all methods accessible + + context.traverseClassHierarchy(shuffleMutableClass) { + transformMethods { + ImmutableMethod( definingClass, name, - type, - AccessFlags.PUBLIC or AccessFlags.PUBLIC, - null, + parameters, + returnType, + AccessFlags.PUBLIC or AccessFlags.FINAL, annotations, - null + hiddenApiRestrictions, + implementation ).toMutable() } } + + // endregion + } - MusicPlaybackControlsFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - addInstruction( - 0, - "invoke-virtual {v0}, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->rememberShuffleState()V" - ) - - val shuffleField = ImmutableField( - definingClass, - "shuffleClass", - rememberShuffleStateObjectClass, - AccessFlags.PUBLIC or AccessFlags.STATIC, - null, - annotations, - null - ).toMutable() - - val shuffleMethod = ImmutableMethod( - definingClass, - "rememberShuffleState", - emptyList(), - "V", - AccessFlags.PUBLIC or AccessFlags.FINAL, - annotations, null, - MutableMethodImplementation(5) - ).toMutable() - - shuffleMethod.addInstructionsWithLabels( - 0, """ - invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->getShuffleState()I - move-result v2 - if-nez v2, :dont_shuffle - sget-object v0, $MUSIC_PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$rememberShuffleStateObjectClass - """ + rememberShuffleStateShuffleStateLabel + """ - iget-object v3, v0, $rememberShuffleStateImageViewReference - if-eqz v3, :dont_shuffle - invoke-virtual {v3}, Landroid/view/View;->callOnClick()Z - if-eqz v1, :dont_shuffle - invoke-virtual {v3}, Landroid/view/View;->callOnClick()Z - :dont_shuffle - return-void - """ - ) - - it.mutableClass.methods.add(shuffleMethod) - it.mutableClass.staticFields.add(shuffleField) - } - } + MusicPlaybackControlsFingerprint.resultOrThrow().mutableMethod.addInstruction( + 0, + "invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->shuffleTracks()V" + ) SettingsPatch.addSwitchPreference( CategoryType.PLAYER, diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt index 2386ccab8..1638d3f81 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/AudioVideoSwitchToggleFingerprint.kt @@ -1,12 +1,25 @@ package app.revanced.patches.music.player.components.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.AudioVideoSwitchToggle -import app.revanced.util.fingerprint.LiteralValueFingerprint +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.music.player.components.fingerprints.AudioVideoSwitchToggleFingerprint.AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal object AudioVideoSwitchToggleFingerprint : LiteralValueFingerprint( +internal object AudioVideoSwitchToggleFingerprint : MethodFingerprint( returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { AudioVideoSwitchToggle } -) \ No newline at end of file + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = emptyList(), + customFingerprint = { methodDef, _ -> + methodDef.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.toString() == AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY + } >= 0 + } +) { + const val AUDIO_VIDEO_SWITCH_TOGGLE_VISIBILITY = + "Lcom/google/android/apps/youtube/music/player/AudioVideoSwitcherToggleView;->setVisibility(I)V" +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/EngagementPanelHeightFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/EngagementPanelHeightFingerprint.kt index 85111f705..6c3e8c3a9 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/EngagementPanelHeightFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/EngagementPanelHeightFingerprint.kt @@ -11,7 +11,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal object EngagementPanelHeightFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + // In YouTube Music 7.21.50+, there are two methods with similar structure, so this Opcode pattern must be used. opcodes = listOf( + Opcode.IGET_OBJECT, Opcode.IGET_OBJECT, Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerDefaultTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerDefaultTextFingerprint.kt index 84ae01df7..98c8c26e2 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerDefaultTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerDefaultTextFingerprint.kt @@ -11,5 +11,5 @@ internal object MiniPlayerDefaultTextFingerprint : LiteralValueFingerprint( Opcode.SGET_OBJECT, Opcode.IF_NE ), - literalSupplier = { MiniPlayerDefaultText } + literalSupplier = { MiniPlayerDefaultText }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerParentFingerprint.kt index dd066fde4..ab5ba7ac3 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/MiniPlayerParentFingerprint.kt @@ -9,5 +9,5 @@ internal object MiniPlayerParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { MiniPlayerMdxPlaying } + literalSupplier = { MiniPlayerMdxPlaying }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldEngagementPanelFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldEngagementPanelFingerprint.kt index cfac0fb62..168a6bdef 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldEngagementPanelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldEngagementPanelFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object OldEngagementPanelFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45427672 } + literalSupplier = { 45427672 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerBackgroundFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerBackgroundFingerprint.kt index f6185e1e9..4ba052e1c 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerBackgroundFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerBackgroundFingerprint.kt @@ -8,5 +8,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object OldPlayerBackgroundFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45415319 } + literalSupplier = { 45415319 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerLayoutFingerprint.kt index e4034b50c..810b9eecf 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/OldPlayerLayoutFingerprint.kt @@ -8,5 +8,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object OldPlayerLayoutFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45399578 } + literalSupplier = { 45399578 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/RemixGenericButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/RemixGenericButtonFingerprint.kt index 6e9c75bd8..52afccd65 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/RemixGenericButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/RemixGenericButtonFingerprint.kt @@ -15,5 +15,5 @@ internal object RemixGenericButtonFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT, Opcode.FLOAT_TO_INT ), - literalSupplier = { RemixGenericButtonSize } + literalSupplier = { RemixGenericButtonSize }, ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/ShuffleClassReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/ShuffleClassReferenceFingerprint.kt deleted file mode 100644 index 537f12105..000000000 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/ShuffleClassReferenceFingerprint.kt +++ /dev/null @@ -1,40 +0,0 @@ -package app.revanced.patches.music.player.components.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfImageViewInstruction -import app.revanced.patches.music.player.components.fingerprints.ShuffleClassReferenceFingerprint.indexOfOrdinalInstruction -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.YtFillArrowShuffle -import app.revanced.util.containsWideLiteralInstructionValue -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -internal object ShuffleClassReferenceFingerprint : MethodFingerprint( - returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - parameters = emptyList(), - strings = listOf("Unknown shuffle mode"), - customFingerprint = { methodDef, _ -> - methodDef.containsWideLiteralInstructionValue(YtFillArrowShuffle) && - indexOfOrdinalInstruction(methodDef) >= 0 && - indexOfImageViewInstruction(methodDef) >= 0 - } -) { - fun indexOfOrdinalInstruction(methodDef: Method) = - methodDef.indexOfFirstInstruction { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "ordinal" - } - - fun indexOfImageViewInstruction(methodDef: Method) = - methodDef.indexOfFirstInstruction { - opcode == Opcode.IGET_OBJECT && - getReference()?.type == "Landroid/widget/ImageView;" - } -} - diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/ShuffleOnClickFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/ShuffleOnClickFingerprint.kt new file mode 100644 index 000000000..b7a548956 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/ShuffleOnClickFingerprint.kt @@ -0,0 +1,30 @@ +package app.revanced.patches.music.player.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.music.player.components.fingerprints.ShuffleOnClickFingerprint.indexOfAccessibilityInstruction +import app.revanced.util.containsWideLiteralInstructionValue +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal object ShuffleOnClickFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("Landroid/view/View;"), + customFingerprint = { methodDef, _ -> + methodDef.containsWideLiteralInstructionValue(45468) && + methodDef.name == "onClick" && + indexOfAccessibilityInstruction(methodDef) >= 0 + } +) { + fun indexOfAccessibilityInstruction(methodDef: Method) = + methodDef.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "announceForAccessibility" + } +} + diff --git a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/SwipeToCloseFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/SwipeToCloseFingerprint.kt index 66dc077d9..97eaf0cf5 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/SwipeToCloseFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/components/fingerprints/SwipeToCloseFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object SwipeToCloseFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45398432 } + literalSupplier = { 45398432 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fix/header/fingerprints/HeaderSwitchConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fix/header/fingerprints/HeaderSwitchConfigFingerprint.kt index 4b0d14f5e..659b8218c 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fix/header/fingerprints/HeaderSwitchConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fix/header/fingerprints/HeaderSwitchConfigFingerprint.kt @@ -10,5 +10,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object HeaderSwitchConfigFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { 45617851 } + literalSupplier = { 45617851 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/flyoutmenu/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/flyoutmenu/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt index e5a241eac..629b94a3b 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/flyoutmenu/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/flyoutmenu/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt @@ -6,8 +6,8 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object PlaybackRateBottomSheetClassFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { VarispeedUnavailableTitle } + literalSupplier = { VarispeedUnavailableTitle }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt index d2339902e..bd40f4674 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt @@ -8,7 +8,6 @@ import app.revanced.patches.shared.mapping.ResourceMappingPatch.getId import app.revanced.patches.shared.mapping.ResourceType.BOOL import app.revanced.patches.shared.mapping.ResourceType.COLOR import app.revanced.patches.shared.mapping.ResourceType.DIMEN -import app.revanced.patches.shared.mapping.ResourceType.DRAWABLE import app.revanced.patches.shared.mapping.ResourceType.ID import app.revanced.patches.shared.mapping.ResourceType.LAYOUT import app.revanced.patches.shared.mapping.ResourceType.STRING @@ -17,7 +16,6 @@ import app.revanced.patches.shared.mapping.ResourceType.STYLE @Patch(dependencies = [ResourceMappingPatch::class]) object SharedResourceIdPatch : ResourcePatch() { var AccountSwitcherAccessibility = -1L - var AudioVideoSwitchToggle = -1L var BottomSheetRecyclerView = -1L var ButtonContainer = -1L var ButtonIconPaddingMedium = -1L @@ -59,12 +57,10 @@ object SharedResourceIdPatch : ResourcePatch() { var TouchOutside = -1L var TrimSilenceSwitch: Long = -1 var VarispeedUnavailableTitle = -1L - var YtFillArrowShuffle = -1L override fun execute(context: ResourceContext) { AccountSwitcherAccessibility = getId(STRING, "account_switcher_accessibility_label") - AudioVideoSwitchToggle = getId(ID, "audio_video_switch_toggle") BottomSheetRecyclerView = getId(LAYOUT, "bottom_sheet_recycler_view") ButtonContainer = getId(ID, "button_container") ButtonIconPaddingMedium = getId(DIMEN, "button_icon_padding_medium") @@ -106,7 +102,6 @@ object SharedResourceIdPatch : ResourcePatch() { TouchOutside = getId(ID, "touch_outside") TrimSilenceSwitch = getId(ID, "trim_silence_switch") VarispeedUnavailableTitle = getId(STRING, "varispeed_unavailable_title") - YtFillArrowShuffle = getId(DRAWABLE, "yt_fill_arrow_shuffle_vd_theme_24") } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt index 5dc90e3ea..3275a60af 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.Opcode internal object TextComponentFingerprint : LiteralValueFingerprint( returnType = "V", opcodes = listOf(Opcode.CONST_HIGH16), - literalSupplier = { ButtonIconPaddingMedium } + literalSupplier = { ButtonIconPaddingMedium }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt index 963afa60b..4219f5ba3 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/CategoryType.kt @@ -8,6 +8,7 @@ enum class CategoryType(val value: String, var added: Boolean) { GENERAL("general", false), NAVIGATION("navigation", false), PLAYER("player", false), + SETTINGS("settings", false), VIDEO("video", false), RETURN_YOUTUBE_DISLIKE("ryd", false), SPONSOR_BLOCK("sb", false), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt index e3a25fead..44ac05499 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsBytecodePatch.kt @@ -44,8 +44,10 @@ object SettingsBytecodePatch : BytecodePatch( "$INTEGRATIONS_PATH/settings/preference/ReVancedPreferenceFragment;" private const val INTEGRATIONS_INITIALIZATION_CLASS_DESCRIPTOR = "$UTILS_PATH/InitializationPatch;" + lateinit var contexts: BytecodeContext override fun execute(context: BytecodeContext) { + contexts = context /** * Set SharedPrefCategory diff --git a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekBarConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekBarConstructorFingerprint.kt index 9edfd4c98..f88378919 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekBarConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekBarConstructorFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object SeekBarConstructorFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { InlineTimeBarAdBreakMarkerColor } + literalSupplier = { InlineTimeBarAdBreakMarkerColor }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoQualityListFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoQualityListFingerprint.kt index 7bc5e35c2..a57f89772 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoQualityListFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoQualityListFingerprint.kt @@ -11,5 +11,5 @@ internal object VideoQualityListFingerprint : LiteralValueFingerprint( Opcode.INVOKE_INTERFACE, Opcode.RETURN_VOID ), - literalSupplier = { QualityAuto } + literalSupplier = { QualityAuto }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt index f3fb5c800..de75b2e5b 100644 --- a/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt @@ -19,5 +19,5 @@ internal object MusicAdsFingerprint : LiteralValueFingerprint( Opcode.IPUT_WIDE, Opcode.CONST_4, ), - literalSupplier = { 4 } + literalSupplier = { 4 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt b/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt index 5f3092409..44f846c43 100644 --- a/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt @@ -96,17 +96,20 @@ object LithoFilterPatch : BytecodePatch( } .map { (index, _) -> index } .reversed() - .forEach { - val insertRegister = - getInstruction(it + 1).registerA - val insertIndex = it + 2 + .forEach { index -> + val insertInstruction = getInstruction(index + 1) + if (insertInstruction is OneRegisterInstruction) { + val insertRegister = + insertInstruction.registerA + val insertIndex = index + 2 - addInstructionsWithLabels( - insertIndex, """ + addInstructionsWithLabels( + insertIndex, """ if-nez v$insertRegister, :ignore """ + emptyComponentLabel, - ExternalLabel("ignore", getInstruction(insertIndex)) - ) + ExternalLabel("ignore", getInstruction(insertIndex)) + ) + } } emptyComponentLabel = """ diff --git a/src/main/kotlin/app/revanced/patches/shared/settingmenu/SettingsMenuPatch.kt b/src/main/kotlin/app/revanced/patches/shared/settingmenu/SettingsMenuPatch.kt index d6a487dfb..a95ce1f63 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settingmenu/SettingsMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/settingmenu/SettingsMenuPatch.kt @@ -1,42 +1,43 @@ package app.revanced.patches.shared.settingmenu import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.integrations.Constants.PATCHES_PATH -import app.revanced.patches.shared.settingmenu.fingerprints.SettingsMenuFingerprint -import app.revanced.patches.shared.viewgroup.ViewGroupMarginLayoutParamsHookPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.resultOrThrow -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import app.revanced.patches.shared.settingmenu.fingerprints.FindPreferenceFingerprint +import app.revanced.patches.shared.settingmenu.fingerprints.RemovePreferenceFingerprint +import app.revanced.util.findMethodOrThrow +import app.revanced.util.getMethodCall @Patch( description = "Hide the settings menu for YouTube or YouTube Music.", - dependencies = [ViewGroupMarginLayoutParamsHookPatch::class] ) object SettingsMenuPatch : BytecodePatch( - setOf(SettingsMenuFingerprint) + setOf( + FindPreferenceFingerprint, + RemovePreferenceFingerprint + ) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "$PATCHES_PATH/SettingsMenuPatch;" + "$PATCHES_PATH/BaseSettingsMenuPatch;" override fun execute(context: BytecodeContext) { - SettingsMenuFingerprint.resultOrThrow().mutableMethod.apply { - val insertIndex = indexOfFirstInstructionOrThrow { - getReference()?.type == "Landroid/support/v7/widget/RecyclerView;" - } - val insertRegister = getInstruction(insertIndex).registerA + val findPreferenceMethodCall = FindPreferenceFingerprint.getMethodCall() + val removePreferenceMethodCall = RemovePreferenceFingerprint.getMethodCall() - addInstruction( - insertIndex, - "invoke-static {v$insertRegister}, " + - "$INTEGRATIONS_CLASS_DESCRIPTOR->hideSettingsMenu(Landroid/support/v7/widget/RecyclerView;)V" - ) - } + context.findMethodOrThrow(INTEGRATIONS_CLASS_DESCRIPTOR) { + name == "removePreference" + }.addInstructionsWithLabels( + 0, """ + invoke-virtual {p0, p1}, $findPreferenceMethodCall + move-result-object v0 + if-eqz v0, :ignore + invoke-virtual {p0, v0}, $removePreferenceMethodCall + :ignore + return-void + """ + ) } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/FindPreferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/FindPreferenceFingerprint.kt new file mode 100644 index 000000000..fe8eb7556 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/FindPreferenceFingerprint.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.shared.settingmenu.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object FindPreferenceFingerprint : MethodFingerprint( + returnType = "Landroidx/preference/Preference;", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("Ljava/lang/CharSequence;"), + strings = listOf("Key cannot be null"), + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "Landroidx/preference/PreferenceGroup;" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/RemovePreferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/RemovePreferenceFingerprint.kt new file mode 100644 index 000000000..bd158b644 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/RemovePreferenceFingerprint.kt @@ -0,0 +1,19 @@ +package app.revanced.patches.shared.settingmenu.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal object RemovePreferenceFingerprint : MethodFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("Landroidx/preference/Preference;"), + opcodes = listOf(Opcode.INVOKE_VIRTUAL), + customFingerprint = custom@{ methodDef, _ -> + if (methodDef.definingClass != "Landroidx/preference/PreferenceGroup;") { + return@custom false + } + val instructions = methodDef.implementation?.instructions ?: return@custom false + instructions.elementAt(0).opcode == Opcode.INVOKE_DIRECT + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/SettingsMenuFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/SettingsMenuFingerprint.kt deleted file mode 100644 index 67f06179a..000000000 --- a/src/main/kotlin/app/revanced/patches/shared/settingmenu/fingerprints/SettingsMenuFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.shared.settingmenu.fingerprints - -import app.revanced.util.fingerprint.LiteralValueFingerprint - -internal object SettingsMenuFingerprint : LiteralValueFingerprint( - returnType = "Landroid/view/View;", - literalSupplier = { 16908351 } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/textcomponent/TextComponentPatch.kt b/src/main/kotlin/app/revanced/patches/shared/textcomponent/TextComponentPatch.kt new file mode 100644 index 000000000..44aa2ee80 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/textcomponent/TextComponentPatch.kt @@ -0,0 +1,135 @@ +package app.revanced.patches.shared.textcomponent + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patches.shared.textcomponent.fingerprints.SpannableStringBuilderFingerprint +import app.revanced.patches.shared.textcomponent.fingerprints.TextComponentConstructorFingerprint +import app.revanced.patches.shared.textcomponent.fingerprints.TextComponentContextFingerprint +import app.revanced.util.alsoResolve +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.resultOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +object TextComponentPatch : BytecodePatch( + setOf( + SpannableStringBuilderFingerprint, + TextComponentConstructorFingerprint, + ) +) { + override fun execute(context: BytecodeContext) { + + SpannableStringBuilderFingerprint.resultOrThrow().mutableMethod.apply { + spannedMethod = this + spannedIndex = SpannableStringBuilderFingerprint.indexOfSpannableStringInstruction(this) + spannedRegister = getInstruction(spannedIndex).registerC + spannedContextRegister = + getInstruction(0).registerA + + replaceInstruction( + spannedIndex, + "nop" + ) + addInstruction( + ++spannedIndex, + "invoke-static {v$spannedRegister}, ${SpannableStringBuilderFingerprint.SPANNABLE_STRING_REFERENCE}" + ) + } + + TextComponentContextFingerprint.alsoResolve( + context, TextComponentConstructorFingerprint + ).let { + it.mutableMethod.apply { + textComponentMethod = this + val conversionContextFieldIndex = indexOfFirstInstructionOrThrow { + getReference()?.type == "Ljava/util/Map;" + } - 1 + val conversionContextFieldReference = + getInstruction(conversionContextFieldIndex).reference + + // ~ YouTube 19.32.xx + val legacyCharSequenceIndex = indexOfFirstInstruction { + getReference()?.type == "Ljava/util/BitSet;" + } - 1 + val charSequenceIndex = indexOfFirstInstruction { + val reference = getReference() + opcode == Opcode.INVOKE_VIRTUAL && + reference?.returnType == "V" && + reference.parameterTypes.firstOrNull() == "Ljava/lang/CharSequence;" + } + + val insertIndex: Int + + if (legacyCharSequenceIndex > -2) { + textComponentRegister = + getInstruction(legacyCharSequenceIndex).registerA + insertIndex = legacyCharSequenceIndex - 1 + } else if (charSequenceIndex > -1) { + textComponentRegister = + getInstruction(charSequenceIndex).registerD + insertIndex = charSequenceIndex + } else { + throw PatchException("Could not find insert index") + } + + textComponentContextRegister = getInstruction( + indexOfFirstInstructionOrThrow(insertIndex, Opcode.IGET_OBJECT) + ).registerA + + addInstructions( + insertIndex, """ + move-object/from16 v$textComponentContextRegister, p0 + iget-object v$textComponentContextRegister, v$textComponentContextRegister, $conversionContextFieldReference + """ + ) + textComponentIndex = insertIndex + 2 + } + } + } + + private lateinit var spannedMethod: MutableMethod + private var spannedIndex = 0 + private var spannedRegister = 0 + private var spannedContextRegister = 0 + + private lateinit var textComponentMethod: MutableMethod + private var textComponentIndex = 0 + private var textComponentRegister = 0 + private var textComponentContextRegister = 0 + + fun hookSpannableString( + classDescriptor: String, + methodName: String + ) = spannedMethod.addInstructions( + spannedIndex, """ + invoke-static {v$spannedContextRegister, v$spannedRegister}, $classDescriptor->$methodName(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-result-object v$spannedRegister + """ + ) + + fun hookTextComponent( + classDescriptor: String, + methodName: String = "onLithoTextLoaded" + ) = textComponentMethod.apply { + addInstructions( + textComponentIndex, """ + invoke-static {v$textComponentContextRegister, v$textComponentRegister}, $classDescriptor->$methodName(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-result-object v$textComponentRegister + """ + ) + textComponentIndex += 2 + } +} + diff --git a/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/SpannableStringBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/SpannableStringBuilderFingerprint.kt new file mode 100644 index 000000000..1d88bab53 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/SpannableStringBuilderFingerprint.kt @@ -0,0 +1,26 @@ +package app.revanced.patches.shared.textcomponent.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.shared.textcomponent.fingerprints.SpannableStringBuilderFingerprint.indexOfSpannableStringInstruction +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal object SpannableStringBuilderFingerprint : MethodFingerprint( + returnType = "Ljava/lang/CharSequence;", + strings = listOf("Failed to set PB Style Run Extension in TextComponentSpec. Extension id: %s"), + customFingerprint = { methodDef, _ -> + indexOfSpannableStringInstruction(methodDef) >= 0 + } +) { + const val SPANNABLE_STRING_REFERENCE = + "Landroid/text/SpannableString;->valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;" + + fun indexOfSpannableStringInstruction(methodDef: Method) = + methodDef.indexOfFirstInstruction { + opcode == Opcode.INVOKE_STATIC && + getReference()?.toString() == SPANNABLE_STRING_REFERENCE + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/TextComponentConstructorFingerprint.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/TextComponentConstructorFingerprint.kt index fea97280e..264d3d178 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/TextComponentConstructorFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints +package app.revanced.patches.shared.textcomponent.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/TextComponentContextFingerprint.kt similarity index 86% rename from src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/TextComponentContextFingerprint.kt index 85798107a..7815f6cca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/textcomponent/fingerprints/TextComponentContextFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints +package app.revanced.patches.shared.textcomponent.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/general/fingerprints/InterstitialsContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/general/fingerprints/InterstitialsContainerFingerprint.kt index 69c71032f..cb641b65a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/general/fingerprints/InterstitialsContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/general/fingerprints/InterstitialsContainerFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object InterstitialsContainerFingerprint : LiteralValueFingerprint( returnType = "V", strings = listOf("overlay_controller_param"), - literalSupplier = { InterstitialsContainer } + literalSupplier = { InterstitialsContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/FeedComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/FeedComponentsPatch.kt index 1ed6fc011..742a38879 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/FeedComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/FeedComponentsPatch.kt @@ -18,6 +18,7 @@ import app.revanced.patches.youtube.feed.components.fingerprints.ChannelListSubM import app.revanced.patches.youtube.feed.components.fingerprints.ChannelListSubMenuTabletSyntheticFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ChannelTabBuilderFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ChannelTabRendererFingerprint +import app.revanced.patches.youtube.feed.components.fingerprints.ContentPillFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ElementParserFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.ElementParserParentFingerprint import app.revanced.patches.youtube.feed.components.fingerprints.EngagementPanelUpdateFingerprint @@ -37,8 +38,13 @@ import app.revanced.patches.youtube.utils.integrations.Constants.FEED_PATH import app.revanced.patches.youtube.utils.navigation.NavigationBarHookPatch import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Bar import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.CaptionToggleContainer +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ChannelListSubMenu +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ContentPill +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.HorizontalCardList import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT import app.revanced.util.alsoResolve import app.revanced.util.getReference import app.revanced.util.getWalkerMethod @@ -46,6 +52,7 @@ import app.revanced.util.indexOfFirstInstruction import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow +import app.revanced.util.injectLiteralInstructionViewCall import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode @@ -78,6 +85,7 @@ object FeedComponentsPatch : BaseBytecodePatch( ChannelListSubMenuTabletFingerprint, ChannelListSubMenuTabletSyntheticFingerprint, ChannelTabRendererFingerprint, + ContentPillFingerprint, ElementParserParentFingerprint, EngagementPanelBuilderFingerprint, FilterBarHeightFingerprint, @@ -106,23 +114,35 @@ object FeedComponentsPatch : BaseBytecodePatch( // region patch for hide carousel shelf, subscriptions channel section, latest videos button - mapOf( - BreakingNewsFingerprint to "hideBreakingNewsShelf", // carousel shelf, only used to tablet layout. - ChannelListSubMenuFingerprint to "hideSubscriptionsChannelSection", // subscriptions channel section - LatestVideosButtonFingerprint to "hideLatestVideosButton", // latest videos button - ).forEach { (fingerprint, methodName) -> - fingerprint.resultOrThrow().let { - it.mutableMethod.apply { - val targetIndex = it.scanResult.patternScanResult!!.endIndex - val targetRegister = - getInstruction(targetIndex).registerA - - addInstruction( - targetIndex + 1, - "invoke-static {v$targetRegister}, $FEED_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" - ) - } - } + listOf( + // carousel shelf, only used to tablet layout. + Triple( + BreakingNewsFingerprint, + "hideBreakingNewsShelf", + HorizontalCardList + ), + // subscriptions channel section. + Triple( + ChannelListSubMenuFingerprint, + "hideSubscriptionsChannelSection", + ChannelListSubMenu + ), + // latest videos button + Triple( + ContentPillFingerprint, + "hideLatestVideosButton", + ContentPill + ), + Triple( + LatestVideosButtonFingerprint, + "hideLatestVideosButton", + Bar + ), + ).forEach { (fingerprint, methodName, literal) -> + val smaliInstruction = """ + invoke-static {v$REGISTER_TEMPLATE_REPLACEMENT}, $FEED_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V + """ + fingerprint.injectLiteralInstructionViewCall(literal, smaliInstruction) } // endregion diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/BreakingNewsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/BreakingNewsFingerprint.kt index 0af30c324..4ff593594 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/BreakingNewsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/BreakingNewsFingerprint.kt @@ -4,15 +4,8 @@ import app.revanced.patcher.extensions.or import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.HorizontalCardList import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode internal object BreakingNewsFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - opcodes = listOf( - Opcode.CONST, - Opcode.CONST_4, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT - ), - literalSupplier = { HorizontalCardList } + literalSupplier = { HorizontalCardList }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonFingerprint.kt index 8595d78e0..1c845448c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonFingerprint.kt @@ -9,5 +9,5 @@ internal object CaptionsButtonFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { CaptionToggleContainer } + literalSupplier = { CaptionToggleContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonSyntheticFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonSyntheticFingerprint.kt index e14eaca43..6a2e5d7f4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonSyntheticFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/CaptionsButtonSyntheticFingerprint.kt @@ -9,5 +9,5 @@ internal object CaptionsButtonSyntheticFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.BRIDGE or AccessFlags.SYNTHETIC, parameters = listOf("Landroid/content/Context;"), - literalSupplier = { CaptionToggleContainer } + literalSupplier = { CaptionToggleContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuFingerprint.kt index 17fe9b2bd..26979d9c0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuFingerprint.kt @@ -2,14 +2,7 @@ package app.revanced.patches.youtube.feed.components.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ChannelListSubMenu import app.revanced.util.fingerprint.LiteralValueFingerprint -import com.android.tools.smali.dexlib2.Opcode internal object ChannelListSubMenuFingerprint : LiteralValueFingerprint( - opcodes = listOf( - Opcode.CONST, - Opcode.CONST_4, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT - ), - literalSupplier = { ChannelListSubMenu } + literalSupplier = { ChannelListSubMenu }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuTabletFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuTabletFingerprint.kt index 78c272980..910bd0501 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuTabletFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ChannelListSubMenuTabletFingerprint.kt @@ -6,8 +6,8 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object ChannelListSubMenuTabletFingerprint : LiteralValueFingerprint( + returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - returnType = "V", - literalSupplier = { DrawerResults } + literalSupplier = { DrawerResults }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ContentPillFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ContentPillFingerprint.kt new file mode 100644 index 000000000..0b2a092e7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ContentPillFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.youtube.feed.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ContentPill +import app.revanced.util.fingerprint.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object ContentPillFingerprint : LiteralValueFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L", "Z"), + literalSupplier = { ContentPill }, +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/FilterBarHeightFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/FilterBarHeightFingerprint.kt index bd5cca583..a6df9a5b2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/FilterBarHeightFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/FilterBarHeightFingerprint.kt @@ -15,5 +15,5 @@ internal object FilterBarHeightFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT, Opcode.IPUT ), - literalSupplier = { FilterBarHeight } + literalSupplier = { FilterBarHeight }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/LatestVideosButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/LatestVideosButtonFingerprint.kt index af2c83dda..93ec87b80 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/LatestVideosButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/LatestVideosButtonFingerprint.kt @@ -4,17 +4,10 @@ import app.revanced.patcher.extensions.or import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Bar import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode internal object LatestVideosButtonFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "Z"), - opcodes = listOf( - Opcode.CONST, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT - ), - literalSupplier = { Bar } + literalSupplier = { Bar }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/RelatedChipCloudFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/RelatedChipCloudFingerprint.kt index 7f771088c..d4cb3363d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/RelatedChipCloudFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/RelatedChipCloudFingerprint.kt @@ -14,5 +14,5 @@ internal object RelatedChipCloudFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { RelatedChipCloudMargin } + literalSupplier = { RelatedChipCloudMargin }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/SearchResultsChipBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/SearchResultsChipBarFingerprint.kt index a53de7c02..4fb791f91 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/SearchResultsChipBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/SearchResultsChipBarFingerprint.kt @@ -16,5 +16,5 @@ internal object SearchResultsChipBarFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { BarContainerHeight } + literalSupplier = { BarContainerHeight }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ShowMoreButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ShowMoreButtonFingerprint.kt index cae0cf3ae..2ad836a7a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ShowMoreButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/components/fingerprints/ShowMoreButtonFingerprint.kt @@ -11,5 +11,5 @@ internal object ShowMoreButtonFingerprint : LiteralValueFingerprint( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { ExpandButtonDown } + literalSupplier = { ExpandButtonDown }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/feed/flyoutmenu/fingerprints/ContextualMenuItemBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/feed/flyoutmenu/fingerprints/ContextualMenuItemBuilderFingerprint.kt index 3e04d7cfc..351eeb26b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/feed/flyoutmenu/fingerprints/ContextualMenuItemBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/feed/flyoutmenu/fingerprints/ContextualMenuItemBuilderFingerprint.kt @@ -7,9 +7,9 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal object ContextualMenuItemBuilderFingerprint : LiteralValueFingerprint( + returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC, parameters = listOf("L", "L"), - returnType = "V", opcodes = listOf( Opcode.CHECK_CAST, Opcode.INVOKE_VIRTUAL, @@ -17,5 +17,5 @@ internal object ContextualMenuItemBuilderFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT, Opcode.ADD_INT_2ADDR ), - literalSupplier = { PosterArtWidthDefault } + literalSupplier = { PosterArtWidthDefault }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/LayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/LayoutComponentsPatch.kt index dded8f631..579d3a6c6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/LayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/LayoutComponentsPatch.kt @@ -5,6 +5,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.litho.LithoFilterPatch @@ -19,11 +20,13 @@ import app.revanced.patches.youtube.general.components.fingerprints.AppBlockingC import app.revanced.patches.youtube.general.components.fingerprints.BottomUiContainerFingerprint import app.revanced.patches.youtube.general.components.fingerprints.FloatingMicrophoneFingerprint import app.revanced.patches.youtube.general.components.fingerprints.PiPNotificationFingerprint +import app.revanced.patches.youtube.general.components.fingerprints.PreferenceScreenFingerprint import app.revanced.patches.youtube.general.components.fingerprints.TooltipContentFullscreenFingerprint import app.revanced.patches.youtube.general.components.fingerprints.TooltipContentViewFingerprint import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_PATH import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -60,10 +63,13 @@ object LayoutComponentsPatch : BaseBytecodePatch( BottomUiContainerFingerprint, FloatingMicrophoneFingerprint, PiPNotificationFingerprint, + PreferenceScreenFingerprint, TooltipContentFullscreenFingerprint, TooltipContentViewFingerprint ) ) { + private const val INTEGRATIONS_SETTINGS_MENU_DESCRIPTOR = + "$GENERAL_PATH/SettingsMenuPatch;" private const val CUSTOM_FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/CustomFilter;" private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR = @@ -193,6 +199,29 @@ object LayoutComponentsPatch : BaseBytecodePatch( // endregion + // region patch for hide setting menus + + PreferenceScreenFingerprint.resultOrThrow().mutableMethod.apply { + val targetIndex = + PreferenceScreenFingerprint.indexOfPreferenceScreenInstruction(this) + val targetRegister = getInstruction(targetIndex).registerC + val targetReference = getInstruction(targetIndex).reference + + val insertIndex = implementation!!.instructions.lastIndex + + addInstructions( + insertIndex + 1, """ + invoke-virtual {v$targetRegister}, $targetReference + move-result-object v$targetRegister + invoke-static {v$targetRegister}, $INTEGRATIONS_SETTINGS_MENU_DESCRIPTOR->hideSettingsMenu(Landroidx/preference/PreferenceScreen;)V + return-void + """ + ) + removeInstruction(insertIndex) + } + + // endregion + // region patch for hide snack bar BottomUiContainerFingerprint.resultOrThrow().let { diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountListParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountListParentFingerprint.kt index 955ad5695..4b32faa84 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountListParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountListParentFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Compa import app.revanced.util.fingerprint.LiteralValueFingerprint internal object AccountListParentFingerprint : LiteralValueFingerprint( - literalSupplier = { CompactListItem } + literalSupplier = { CompactListItem }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountMenuParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountMenuParentFingerprint.kt index 927439b10..2bd74dce4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountMenuParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountMenuParentFingerprint.kt @@ -11,5 +11,5 @@ internal object AccountMenuParentFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { CompactLink } + literalSupplier = { CompactLink }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt index 8e0672ae3..125129fcc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L", "Ljava/lang/Object;"), - literalSupplier = { AccountSwitcherAccessibility } + literalSupplier = { AccountSwitcherAccessibility }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/FloatingMicrophoneFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/FloatingMicrophoneFingerprint.kt index 0be68d53c..1dabe7843 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/FloatingMicrophoneFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/FloatingMicrophoneFingerprint.kt @@ -15,5 +15,5 @@ internal object FloatingMicrophoneFingerprint : LiteralValueFingerprint( Opcode.IF_EQZ, Opcode.RETURN_VOID ), - literalSupplier = { Fab } + literalSupplier = { Fab }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PiPNotificationFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PiPNotificationFingerprint.kt index 82974ffa2..7452b4f1a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PiPNotificationFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PiPNotificationFingerprint.kt @@ -9,5 +9,5 @@ internal object PiPNotificationFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), - literalSupplier = { EditSettingsAction } + literalSupplier = { EditSettingsAction }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PreferenceScreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PreferenceScreenFingerprint.kt new file mode 100644 index 000000000..db92fe910 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/PreferenceScreenFingerprint.kt @@ -0,0 +1,30 @@ +package app.revanced.patches.youtube.general.components.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.general.components.fingerprints.PreferenceScreenFingerprint.indexOfPreferenceScreenInstruction +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionReversed +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal object PreferenceScreenFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = emptyList(), + strings = listOf(":android:show_fragment_args"), + customFingerprint = { methodDef, classDef -> + AccessFlags.SYNTHETIC.isSet(classDef.accessFlags) && + indexOfPreferenceScreenInstruction(methodDef) >= 0 + } +) { + fun indexOfPreferenceScreenInstruction(methodDef: Method) = + methodDef.indexOfFirstInstructionReversed { + val reference = getReference() + opcode == Opcode.INVOKE_VIRTUAL && + reference?.returnType == "Landroidx/preference/PreferenceScreen;" && + reference.parameterTypes.size == 0 + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentFullscreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentFullscreenFingerprint.kt index b3bdff38f..0f691b2d0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentFullscreenFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentFullscreenFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object TooltipContentFullscreenFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { 45384061 } + literalSupplier = { 45384061 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentViewFingerprint.kt index dca75978f..f1043f946 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/components/fingerprints/TooltipContentViewFingerprint.kt @@ -9,5 +9,5 @@ internal object TooltipContentViewFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), - literalSupplier = { ToolTipContentView } + literalSupplier = { ToolTipContentView }, ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt index 1137e867c..d3cea0a63 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/downloads/fingerprints/AccessibilityOfflineButtonSyncFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object AccessibilityOfflineButtonSyncFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", - literalSupplier = { AccessibilityOfflineButtonSync } + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + literalSupplier = { AccessibilityOfflineButtonSync }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/LayoutSwitchPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/LayoutSwitchPatch.kt index f4c8c6139..6758e0449 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/LayoutSwitchPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/LayoutSwitchPatch.kt @@ -2,19 +2,22 @@ package app.revanced.patches.youtube.general.layoutswitch import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.general.layoutswitch.fingerprints.GetFormFactorFingerprint +import app.revanced.patches.shared.fingerprints.CreatePlayerRequestBodyWithModelFingerprint +import app.revanced.patches.youtube.general.layoutswitch.fingerprints.FormFactorEnumConstructorFingerprint import app.revanced.patches.youtube.general.layoutswitch.fingerprints.LayoutSwitchFingerprint import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.FieldReference @Suppress("unused") object LayoutSwitchPatch : BaseBytecodePatch( @@ -23,52 +26,51 @@ object LayoutSwitchPatch : BaseBytecodePatch( dependencies = setOf(SettingsPatch::class), compatiblePackages = COMPATIBLE_PACKAGE, fingerprints = setOf( - GetFormFactorFingerprint, + CreatePlayerRequestBodyWithModelFingerprint, + FormFactorEnumConstructorFingerprint, LayoutSwitchFingerprint ) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$GENERAL_PATH/LayoutSwitchPatch;" + override fun execute(context: BytecodeContext) { - // region patch for enable tablet layout + val formFactorEnumClass = FormFactorEnumConstructorFingerprint + .resultOrThrow() + .mutableMethod + .definingClass - GetFormFactorFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - val jumpIndex = indexOfFirstInstructionReversedOrThrow(Opcode.SGET_OBJECT) - - addInstructionsWithLabels( - 0, """ - invoke-static { }, $GENERAL_CLASS_DESCRIPTOR->enableTabletLayout()Z - move-result v0 # Free register - if-nez v0, :is_large_form_factor - """, - ExternalLabel( - "is_large_form_factor", - getInstruction(jumpIndex) - ) - ) + CreatePlayerRequestBodyWithModelFingerprint.resultOrThrow().mutableMethod.apply { + val index = indexOfFirstInstructionOrThrow { + val reference = getReference() + opcode == Opcode.IGET && + reference?.definingClass == formFactorEnumClass && + reference.type == "I" } + val register = getInstruction(index).registerA + + addInstructions( + index + 1, """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->getFormFactor(I)I + move-result v$register + """ + ) } - // endregion - - // region patch for enable phone layout - LayoutSwitchFingerprint.resultOrThrow().let { it.mutableMethod.apply { - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.IF_NEZ) - val insertRegister = getInstruction(insertIndex).registerA + val index = indexOfFirstInstructionReversedOrThrow(Opcode.IF_NEZ) + val register = getInstruction(index).registerA addInstructions( - insertIndex, """ - invoke-static {v$insertRegister}, $GENERAL_CLASS_DESCRIPTOR->enablePhoneLayout(I)I - move-result v$insertRegister + index, """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->getWidthDp(I)I + move-result v$register """ ) } } - // endregion - /** * Add settings */ diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/fingerprints/FormFactorEnumConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/fingerprints/FormFactorEnumConstructorFingerprint.kt new file mode 100644 index 000000000..2c2f41211 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/fingerprints/FormFactorEnumConstructorFingerprint.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.youtube.general.layoutswitch.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object FormFactorEnumConstructorFingerprint : MethodFingerprint( + returnType = "V", + strings = listOf( + "UNKNOWN_FORM_FACTOR", + "SMALL_FORM_FACTOR", + "LARGE_FORM_FACTOR" + ) +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/fingerprints/GetFormFactorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/fingerprints/GetFormFactorFingerprint.kt deleted file mode 100644 index c3f22c424..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/general/layoutswitch/fingerprints/GetFormFactorFingerprint.kt +++ /dev/null @@ -1,25 +0,0 @@ -package app.revanced.patches.youtube.general.layoutswitch.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -internal object GetFormFactorFingerprint : MethodFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, - returnType = "L", - parameters = listOf("Landroid/content/Context;", "Ljava/util/List;"), - opcodes = listOf( - Opcode.SGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ, - Opcode.SGET_OBJECT, - Opcode.RETURN_OBJECT, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT - ) -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt index 19b454e54..c11cdb1f2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt @@ -3,5 +3,5 @@ package app.revanced.patches.youtube.general.loadingscreen.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint internal object GradientLoadingScreenPrimaryFingerprint : LiteralValueFingerprint( - literalSupplier = { 45412406 } + literalSupplier = { 45412406 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt index 5834fb42b..201d2201f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt @@ -3,5 +3,5 @@ package app.revanced.patches.youtube.general.loadingscreen.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint internal object GradientLoadingScreenSecondaryFingerprint : LiteralValueFingerprint( - literalSupplier = { 45418917 } + literalSupplier = { 45418917 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/MiniplayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/MiniplayerPatch.kt index 8482e06f7..c49dcfb85 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/MiniplayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/MiniplayerPatch.kt @@ -93,9 +93,9 @@ object MiniplayerPatch : BaseBytecodePatch( // Modern mini player is only present and functional in 19.15+. // Resource is not present in older versions. Using it to determine, if patching an old version. - val isPatchingOldVersion = !SettingsPatch.upward1912 + val isPatchingOldVersion = !SettingsPatch.upward1915 - // From 19.12 to 19.16 using mixed up drawables for tablet modern. + // From 19.15 to 19.16 using mixed up drawables for tablet modern. val shouldFixMixedUpDrawables = YtOutlineXWhite > 0 && YtOutlinePictureInPictureWhite > 0 // region Enable tablet miniplayer. diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt index dd37100c8..a58eac8f0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerDimensionsCalculatorParentFingerprint.kt @@ -7,8 +7,8 @@ import com.android.tools.smali.dexlib2.AccessFlags @Suppress("SpellCheckingInspection") internal object MiniplayerDimensionsCalculatorParentFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), - literalSupplier = { FloatyBarTopMargin } + literalSupplier = { FloatyBarTopMargin }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt index 9c63dc513..041075be3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernCloseButtonFingerprint.kt @@ -10,8 +10,8 @@ import com.android.tools.smali.dexlib2.AccessFlags */ @Suppress("SpellCheckingInspection") internal object MiniplayerModernCloseButtonFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { ModernMiniPlayerClose } + literalSupplier = { ModernMiniPlayerClose }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernDragAndDropFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernDragAndDropFingerprint.kt index d0b567c19..dfe924f68 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernDragAndDropFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernDragAndDropFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object MiniplayerModernDragAndDropFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = listOf("L"), - literalSupplier = { 45628752 } + literalSupplier = { 45628752 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernEnabledFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernEnabledFingerprint.kt index 86ab4512c..67481d5d8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernEnabledFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernEnabledFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint @Suppress("SpellCheckingInspection") internal object MiniplayerModernEnabledFingerprint : LiteralValueFingerprint( - literalSupplier = { 45622882 } + literalSupplier = { 45622882 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt index bd912b283..998c6bde2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandButtonFingerprint.kt @@ -10,8 +10,8 @@ import com.android.tools.smali.dexlib2.AccessFlags */ @Suppress("SpellCheckingInspection") internal object MiniplayerModernExpandButtonFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { ModernMiniPlayerExpand } + literalSupplier = { ModernMiniPlayerExpand }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt index d5e80163f..549f30269 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernExpandCloseDrawablesFingerprint.kt @@ -10,8 +10,8 @@ import com.android.tools.smali.dexlib2.AccessFlags */ @Suppress("SpellCheckingInspection") internal object MiniplayerModernExpandCloseDrawablesFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), - literalSupplier = { YtOutlinePictureInPictureWhite } + literalSupplier = { YtOutlinePictureInPictureWhite }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt index 4557f557e..895487aca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernForwardButtonFingerprint.kt @@ -10,8 +10,8 @@ import com.android.tools.smali.dexlib2.AccessFlags */ @Suppress("SpellCheckingInspection") internal object MiniplayerModernForwardButtonFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { ModernMiniPlayerForwardButton } + literalSupplier = { ModernMiniPlayerForwardButton }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt index 62223c5da..75c041e40 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernOverlayViewFingerprint.kt @@ -10,8 +10,8 @@ import com.android.tools.smali.dexlib2.AccessFlags */ @Suppress("SpellCheckingInspection") internal object MiniplayerModernOverlayViewFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { ScrimOverlay } + literalSupplier = { ScrimOverlay }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt index 0a257a0c1..d9027236a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/miniplayer/fingerprints/MiniplayerModernRewindButtonFingerprint.kt @@ -10,8 +10,8 @@ import com.android.tools.smali.dexlib2.AccessFlags */ @Suppress("SpellCheckingInspection") internal object MiniplayerModernRewindButtonFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/widget/ImageView;", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { ModernMiniPlayerRewindButton } + literalSupplier = { ModernMiniPlayerRewindButton }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/music/YouTubeMusicActionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/music/YouTubeMusicActionsPatch.kt index 9b49e8603..5c348be0b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/music/YouTubeMusicActionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/music/YouTubeMusicActionsPatch.kt @@ -8,9 +8,9 @@ import app.revanced.patches.youtube.general.music.fingerprints.AppDeepLinkFinger import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.gms.GmsCoreSupportResourcePatch.PackageNameYouTubeMusic import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_PATH -import app.revanced.patches.youtube.utils.settings.ResourceUtils.addEntryValues import app.revanced.patches.youtube.utils.settings.SettingsBytecodePatch import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.addEntryValues import app.revanced.util.findMethodOrThrow import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/navigation/fingerprints/TranslucentNavigationBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/navigation/fingerprints/TranslucentNavigationBarFingerprint.kt index eb917d081..a95b753c5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/navigation/fingerprints/TranslucentNavigationBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/navigation/fingerprints/TranslucentNavigationBarFingerprint.kt @@ -3,5 +3,5 @@ package app.revanced.patches.youtube.general.navigation.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint internal object TranslucentNavigationBarFingerprint : LiteralValueFingerprint( - literalSupplier = { 45630927 } + literalSupplier = { 45630927 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/spoofappversion/SpoofAppVersionPatch.kt index 54a4a0b0a..df15871e7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/spoofappversion/SpoofAppVersionPatch.kt @@ -2,8 +2,8 @@ package app.revanced.patches.youtube.general.spoofappversion import app.revanced.patcher.data.ResourceContext import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE -import app.revanced.patches.youtube.utils.settings.ResourceUtils.addEntryValues import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.appendAppVersion import app.revanced.util.patch.BaseResourcePatch @Suppress("unused") @@ -17,12 +17,6 @@ object SpoofAppVersionPatch : BaseResourcePatch( ), compatiblePackages = COMPATIBLE_PACKAGE ) { - private const val ATTRIBUTE_NAME_ENTRIES = - "revanced_spoof_app_version_target_entries" - - private const val ATTRIBUTE_NAME_ENTRY_VALUE = - "revanced_spoof_app_version_target_entry_values" - override fun execute(context: ResourceContext) { if (SettingsPatch.upward1834) { @@ -48,17 +42,4 @@ object SpoofAppVersionPatch : BaseResourcePatch( SettingsPatch.updatePatchStatus(this) } - - private fun ResourceContext.appendAppVersion(appVersion: String) { - addEntryValues( - ATTRIBUTE_NAME_ENTRIES, - "@string/revanced_spoof_app_version_target_entry_" + appVersion.replace(".", "_"), - prepend = false - ) - addEntryValues( - ATTRIBUTE_NAME_ENTRY_VALUE, - appVersion, - prepend = false - ) - } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarComponentsPatch.kt index 911ecb988..320091e12 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarComponentsPatch.kt @@ -24,6 +24,7 @@ import app.revanced.patches.youtube.general.toolbar.fingerprints.SearchBarParent import app.revanced.patches.youtube.general.toolbar.fingerprints.SearchResultFingerprint import app.revanced.patches.youtube.general.toolbar.fingerprints.SetActionBarRingoFingerprint import app.revanced.patches.youtube.general.toolbar.fingerprints.SetWordMarkHeaderFingerprint +import app.revanced.patches.youtube.general.toolbar.fingerprints.YoodlesImageViewFingerprint import app.revanced.patches.youtube.general.toolbar.fingerprints.YouActionBarFingerprint import app.revanced.patches.youtube.utils.castbutton.CastButtonPatch import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE @@ -42,6 +43,7 @@ import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT import app.revanced.util.alsoResolve import app.revanced.util.doRecursively import app.revanced.util.findMethodOrThrow +import app.revanced.util.findOpcodeIndicesReversed import app.revanced.util.getReference import app.revanced.util.getWalkerMethod import app.revanced.util.indexOfFirstInstructionOrThrow @@ -84,6 +86,7 @@ object ToolBarComponentsPatch : BaseBytecodePatch( SetActionBarRingoFingerprint, SetWordMarkHeaderFingerprint, ImageSearchButtonConfigFingerprint, + YoodlesImageViewFingerprint, ) ) { private const val TARGET_RESOURCE_PATH = "res/layout/action_bar_ringo_background.xml" @@ -366,6 +369,26 @@ object ToolBarComponentsPatch : BaseBytecodePatch( // endregion + // region patch for hide YouTube Doodles + + YoodlesImageViewFingerprint.resultOrThrow().mutableMethod.apply { + findOpcodeIndicesReversed{ + opcode == Opcode.INVOKE_VIRTUAL + && getReference()?.name == "setImageDrawable" + }.forEach { insertIndex -> + val (viewRegister, drawableRegister) = getInstruction(insertIndex).let { + Pair(it.registerC, it.registerD) + } + replaceInstruction( + insertIndex, + "invoke-static {v$viewRegister, v$drawableRegister}, " + + "$GENERAL_CLASS_DESCRIPTOR->hideYouTubeDoodles(Landroid/widget/ImageView;Landroid/graphics/drawable/Drawable;)V" + ) + } + } + + // endregion + // region patch for replace create button CreateButtonDrawableFingerprint.resultOrThrow().mutableMethod.apply { diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/CreateButtonDrawableFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/CreateButtonDrawableFingerprint.kt index cc1c6d795..3cd5ee41b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/CreateButtonDrawableFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/CreateButtonDrawableFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOut import app.revanced.util.fingerprint.LiteralValueFingerprint internal object CreateButtonDrawableFingerprint : LiteralValueFingerprint( - literalSupplier = { YtOutlineVideoCamera } + literalSupplier = { YtOutlineVideoCamera }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/DrawerContentViewConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/DrawerContentViewConstructorFingerprint.kt index 169e83c9f..bad2f98f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/DrawerContentViewConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/DrawerContentViewConstructorFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object DrawerContentViewConstructorFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { DrawerContentView } + literalSupplier = { DrawerContentView }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/ImageSearchButtonConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/ImageSearchButtonConfigFingerprint.kt index 1a139ee62..2e12a27af 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/ImageSearchButtonConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/ImageSearchButtonConfigFingerprint.kt @@ -10,5 +10,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ImageSearchButtonConfigFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { 45617544 } + literalSupplier = { 45617544 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchBarParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchBarParentFingerprint.kt index fe9339b88..e29df434f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchBarParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchBarParentFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint object SearchBarParentFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", strings = listOf("voz-target-id"), - literalSupplier = { VoiceSearch } + literalSupplier = { VoiceSearch }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchResultFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchResultFingerprint.kt index 2e8e7caee..3f5d07d7a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchResultFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SearchResultFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint object SearchResultFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", strings = listOf("search_filter_chip_applied", "search_original_chip_query"), - literalSupplier = { VoiceSearch } + literalSupplier = { VoiceSearch }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SetActionBarRingoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SetActionBarRingoFingerprint.kt index 9396e5c10..c39838953 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SetActionBarRingoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/SetActionBarRingoFingerprint.kt @@ -13,5 +13,5 @@ internal object SetActionBarRingoFingerprint : LiteralValueFingerprint( Opcode.IGET_OBJECT, Opcode.INVOKE_STATIC ), - literalSupplier = { ActionBarRingo } + literalSupplier = { ActionBarRingo }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/YoodlesImageViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/YoodlesImageViewFingerprint.kt new file mode 100644 index 000000000..90f21ec7b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/fingerprints/YoodlesImageViewFingerprint.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.general.toolbar.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YouTubeLogo +import app.revanced.util.fingerprint.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +@Suppress("SpellCheckingInspection") +internal object YoodlesImageViewFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L", "L"), + returnType = "Landroid/view/View;", + literalSupplier = { YouTubeLogo } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/actionbuttons/ShortsActionButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/actionbuttons/ShortsActionButtonsPatch.kt index 7284a5ea1..60297f3e4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/actionbuttons/ShortsActionButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/actionbuttons/ShortsActionButtonsPatch.kt @@ -16,17 +16,18 @@ object ShortsActionButtonsPatch : BaseResourcePatch( dependencies = setOf(SettingsPatch::class), compatiblePackages = COMPATIBLE_PACKAGE ) { - private const val DEFAULT_ICON = "youtubeoutline" + private const val DEFAULT_ICON = "cairo" private const val YOUTUBE_ICON = "youtube" private val IconType = stringPatchOption( key = "IconType", default = DEFAULT_ICON, values = mapOf( + "Cairo" to DEFAULT_ICON, "Outline" to "outline", "OutlineCircle" to "outlinecircle", "Round" to "round", - "YoutubeOutline" to DEFAULT_ICON, + "YoutubeOutline" to "youtubeoutline", "YouTube" to YOUTUBE_ICON ), title = "Shorts icon style ", @@ -80,6 +81,11 @@ object ShortsActionButtonsPatch : BaseResourcePatch( ) } + if (iconType == DEFAULT_ICON) { + SettingsPatch.updatePatchStatus(this) + return + } + context.copyResources( "youtube/shorts/actionbuttons/shared", ResourceGroup( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt index 2bd701575..956b6f320 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt @@ -30,8 +30,7 @@ object CustomBrandingIconPatch : BaseResourcePatch( "MMT" to "mmt", "Revancify Blue" to DEFAULT_ICON, "Revancify Red" to "revancify_red", - "YouTube" to "youtube", - "YouTube (Minimal header)" to "youtube_minimal_header" + "YouTube" to "youtube" ) private val sizeArray = arrayOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt index ad981948c..83c3d816e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt @@ -4,9 +4,9 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE -import app.revanced.patches.youtube.utils.settings.ResourceUtils.addEntryValues import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup +import app.revanced.util.addEntryValues import app.revanced.util.copyResources import app.revanced.util.patch.BaseResourcePatch import java.nio.file.Files diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/BaseThemePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/BaseThemePatch.kt index d0e95dc1a..0b10925b9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/BaseThemePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/BaseThemePatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.theme import app.revanced.patcher.data.ResourceContext +import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.drawable.DrawableColorPatch @@ -10,28 +11,32 @@ import org.w3c.dom.Element @Patch(dependencies = [DrawableColorPatch::class]) @Suppress("DEPRECATION") object BaseThemePatch : ResourcePatch() { + private const val SPLASH_SCREEN_COLOR_NAME = "splashScreenColor" + private const val SPLASH_SCREEN_COLOR_ATTRIBUTE = "?attr/$SPLASH_SCREEN_COLOR_NAME" + override fun execute(context: ResourceContext) { DrawableColorPatch.injectCall("$UTILS_PATH/DrawableColorPatch;->getColor(I)I") // edit the resource files to change the splash screen color - val attrsPath = "res/values/attrs.xml" - val stylesPaths: List = listOf( - "res/values/styles.xml", // Android 11 (and below) - "res/values-v31/styles.xml", // Android 12 (and above) - ) + val attrsResourceFile = "res/values/attrs.xml" + val stylesResourceFiles = + listOf("values", "values-v31").map { valuesPath -> + "res/$valuesPath/styles.xml" + }.toTypedArray() - context.xmlEditor[attrsPath].use { editor -> + context.xmlEditor[attrsResourceFile].use { editor -> val file = editor.file (file.getElementsByTagName("resources").item(0) as Element).appendChild( file.createElement("attr").apply { setAttribute("format", "reference") - setAttribute("name", "splashScreenColor") + setAttribute("name", SPLASH_SCREEN_COLOR_NAME) } ) } - stylesPaths.forEachIndexed { pathIndex, stylesPath -> + + stylesResourceFiles.forEachIndexed { pathIndex, stylesPath -> context.xmlEditor[stylesPath].use { editor -> val file = editor.file @@ -62,7 +67,7 @@ object BaseThemePatch : ResourcePatch() { } 1 -> when (nodeAttributeName) { - "Base.Theme.YouTube.Launcher" -> "?attr/splashScreenColor" + "Base.Theme.YouTube.Launcher" -> SPLASH_SCREEN_COLOR_ATTRIBUTE else -> "null" } @@ -78,12 +83,27 @@ object BaseThemePatch : ResourcePatch() { } } - arrayOf("drawable", "drawable-sw600dp").forEach { quantumLaunchScreenPath -> - context.xmlEditor["res/$quantumLaunchScreenPath/quantum_launchscreen_youtube.xml"].use { editor -> - val resourcesNode = editor.file.getElementsByTagName("item").item(0) as Element + val splashScreenResourceFiles = + listOf("drawable", "drawable-sw600dp").map { quantumLaunchScreenPath -> + "res/$quantumLaunchScreenPath/quantum_launchscreen_youtube.xml" + }.toTypedArray() - if (resourcesNode.attributes.getNamedItem("android:drawable") != null) - resourcesNode.setAttribute("android:drawable", "?attr/splashScreenColor") + splashScreenResourceFiles.forEach editSplashScreen@{ resourceFile -> + context.xmlEditor[resourceFile].use { editor -> + val document = editor.file + + val layerList = document.getElementsByTagName("layer-list").item(0) as Element + + val childNodes = layerList.childNodes + for (i in 0 until childNodes.length) { + val node = childNodes.item(i) + if (node is Element && node.hasAttribute("android:drawable")) { + node.setAttribute("android:drawable", SPLASH_SCREEN_COLOR_ATTRIBUTE) + return@editSplashScreen + } + } + + throw PatchException("Failed to modify launch screen") } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt index 10dc49270..1a04051b1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt @@ -44,9 +44,6 @@ object MaterialYouPatch : BaseResourcePatch( context.copyXmlNode("youtube/materialyou/host", "values-v31/colors.xml", "resources") - /** - * Add settings - */ context.updatePatchStatusTheme("MaterialYou") isMonetPatchIncluded = true diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt index 7929eb953..39ba1eddd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/visual/VisualPreferencesIconsPatch.kt @@ -48,7 +48,7 @@ object VisualPreferencesIconsPatch : BaseResourcePatch( description = """ Whether to apply Visual preferences icons to all settings menus. - If true: icons are applied to the parent PreferenceScreen of YouTube settings, the parent PreferenceScreen of RVX settings and the RVX sub-settings (if supports). + If true: icons are applied to the parent PreferenceScreen of YouTube settings, the parent PreferenceScreen of RVX settings and the RVX sub-settings (if supported). If false: icons are applied only to the parent PreferenceScreen of YouTube settings and RVX settings. """.trimIndentMultiline(), @@ -117,7 +117,7 @@ object VisualPreferencesIconsPatch : BaseResourcePatch( // endregion. - SettingsPatch.updatePatchStatus(this) + SettingsPatch.updatePatchStatus("Visual preferences icons") } override fun close() { diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt index 2ef35d10a..58062077f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackManagerFingerprint.kt @@ -10,5 +10,5 @@ internal object BackgroundPlaybackManagerFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), opcodes = listOf(Opcode.AND_INT_LIT16), - literalSupplier = { 64657230 } + literalSupplier = { 64657230 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackSettingsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackSettingsFingerprint.kt index b765c2a66..60d416489 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackSettingsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/BackgroundPlaybackSettingsFingerprint.kt @@ -18,5 +18,5 @@ internal object BackgroundPlaybackSettingsFingerprint : LiteralValueFingerprint( Opcode.IF_NEZ, Opcode.GOTO ), - literalSupplier = { BackgroundCategory } + literalSupplier = { BackgroundCategory }, ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/KidsBackgroundPlaybackPolicyControllerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/KidsBackgroundPlaybackPolicyControllerFingerprint.kt index 80da2fe0d..2cb36f739 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/KidsBackgroundPlaybackPolicyControllerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/KidsBackgroundPlaybackPolicyControllerFingerprint.kt @@ -8,5 +8,5 @@ internal object KidsBackgroundPlaybackPolicyControllerFingerprint : LiteralValue returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "L", "L"), - literalSupplier = { 5 } + literalSupplier = { 5 }, ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/PiPControllerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/PiPControllerFingerprint.kt index 45a2f92b2..0c1b6fa3d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/PiPControllerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/fingerprints/PiPControllerFingerprint.kt @@ -13,5 +13,5 @@ internal object PiPControllerFingerprint : LiteralValueFingerprint( Opcode.IF_NEZ, Opcode.INVOKE_DIRECT ), - literalSupplier = { 151635310 } + literalSupplier = { 151635310 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt index 6f32beb8c..297fe4417 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/share/fingerprints/BottomSheetRecyclerViewFingerprint.kt @@ -9,5 +9,5 @@ internal object BottomSheetRecyclerViewFingerprint : LiteralValueFingerprint( returnType = "Lj${'$'}/util/Optional;", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { BottomSheetRecyclerView } + literalSupplier = { BottomSheetRecyclerView }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt index c232564e7..7b94ab1df 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object AmbientModeInFullscreenFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { 45389368 } + literalSupplier = { 45389368 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/LithoSubtitleButtonConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/LithoSubtitleButtonConfigFingerprint.kt index 98eaaffa6..19ec81f51 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/LithoSubtitleButtonConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/LithoSubtitleButtonConfigFingerprint.kt @@ -10,5 +10,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint */ internal object LithoSubtitleButtonConfigFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45421555 } + literalSupplier = { 45421555 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt index 284da3ce8..74105b961 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object MusicAppDeeplinkButtonParentFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { MusicAppDeeplinkButtonView } + literalSupplier = { MusicAppDeeplinkButtonView }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt index 12f55734b..59c5b3cd2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/buttons/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt @@ -14,5 +14,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object YouTubeControlsOverlaySubtitleButtonFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, - literalSupplier = { YouTubeControlsOverlaySubtitleButton } + literalSupplier = { YouTubeControlsOverlaySubtitleButton }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt index 146415068..02c2205e6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsLiveStreamEmojiPickerOnClickListenerFingerprint : LiteralValueFingerprint( returnType = "V", - parameters = listOf("L"), accessFlags = AccessFlags.PUBLIC.value, - literalSupplier = { 126326492 } + parameters = listOf("L"), + literalSupplier = { 126326492 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt index d2c3d3fd5..eee1f0873 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/comments/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt @@ -9,5 +9,5 @@ internal object ShortsLiveStreamEmojiPickerOpacityFingerprint : LiteralValueFing returnType = "Landroid/widget/ImageView;", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { EmojiPickerIcon } + literalSupplier = { EmojiPickerIcon }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt index eca7754ce..e87f246ba 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/PlayerComponentsPatch.kt @@ -50,6 +50,7 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT import app.revanced.util.findMethodOrThrow import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow @@ -147,13 +148,15 @@ object PlayerComponentsPatch : BaseBytecodePatch( hookInitVideoPanel(1) } else { val syntheticIndex = - indexOfFirstInstructionOrThrow(Opcode.NEW_INSTANCE) - val syntheticReference = - getInstruction(syntheticIndex).reference.toString() + indexOfFirstInstruction(0, Opcode.NEW_INSTANCE) + if (syntheticIndex >= 0) { + val syntheticReference = + getInstruction(syntheticIndex).reference.toString() - context.findMethodOrThrow(syntheticReference) { - name == "onClick" - }.hookInitVideoPanel(0) + context.findMethodOrThrow(syntheticReference) { + name == "onClick" + }.hookInitVideoPanel(0) + } } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/CrowdfundingBoxFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/CrowdfundingBoxFingerprint.kt index 3ef948311..feb8cab78 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/CrowdfundingBoxFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/CrowdfundingBoxFingerprint.kt @@ -13,5 +13,5 @@ internal object CrowdfundingBoxFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.IPUT_OBJECT ), - literalSupplier = { DonationCompanion } + literalSupplier = { DonationCompanion }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayConfigFingerprint.kt index 7385f2e3c..df335235b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayConfigFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object FilmStripOverlayConfigFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45381958 } + literalSupplier = { 45381958 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayParentFingerprint.kt index e9fe1dee8..c38e2a2e5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/FilmStripOverlayParentFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object FilmStripOverlayParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { Scrubbing } + literalSupplier = { Scrubbing }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutCircleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutCircleFingerprint.kt index ee1271910..4e645543c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutCircleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutCircleFingerprint.kt @@ -13,5 +13,5 @@ internal object LayoutCircleFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.CHECK_CAST, ), - literalSupplier = { EndScreenElementLayoutCircle } + literalSupplier = { EndScreenElementLayoutCircle }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutIconFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutIconFingerprint.kt index 95483245a..9322b0951 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutIconFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutIconFingerprint.kt @@ -11,5 +11,5 @@ internal object LayoutIconFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.CHECK_CAST, ), - literalSupplier = { EndScreenElementLayoutIcon } + literalSupplier = { EndScreenElementLayoutIcon }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutVideoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutVideoFingerprint.kt index 611f98549..34a6066cf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutVideoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LayoutVideoFingerprint.kt @@ -13,5 +13,5 @@ internal object LayoutVideoFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.CHECK_CAST, ), - literalSupplier = { EndScreenElementLayoutVideo } + literalSupplier = { EndScreenElementLayoutVideo }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt index 628169860..672aa7bdd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/LithoComponentOnClickListenerFingerprint.kt @@ -10,5 +10,5 @@ internal object LithoComponentOnClickListenerFingerprint : LiteralValueFingerpri returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, parameters = listOf("L"), - literalSupplier = { ComponentLongClickListener } + literalSupplier = { ComponentLongClickListener }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt index 6569ac7d7..4f0d4cfb8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/NoticeOnClickListenerFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object NoticeOnClickListenerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { Notice } + literalSupplier = { Notice }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt index 932196b00..f00f73426 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/OfflineActionsOnClickListenerFingerprint.kt @@ -9,5 +9,5 @@ internal object OfflineActionsOnClickListenerFingerprint : LiteralValueFingerpri returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/String;"), - literalSupplier = { OfflineActionsVideoDeletedUndoSnackbarText } + literalSupplier = { OfflineActionsVideoDeletedUndoSnackbarText }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SeekEduContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SeekEduContainerFingerprint.kt index 7bac8bba3..2a622797e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SeekEduContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SeekEduContainerFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object SeekEduContainerFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { EasySeekEduContainer } + literalSupplier = { EasySeekEduContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SuggestedActionsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SuggestedActionsFingerprint.kt index 626dff9b7..c5d9ba153 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SuggestedActionsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/SuggestedActionsFingerprint.kt @@ -12,5 +12,5 @@ internal object SuggestedActionsFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { SuggestedAction } + literalSupplier = { SuggestedAction }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/TouchAreaOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/TouchAreaOnClickListenerFingerprint.kt index e202e8a00..fa45da0ef 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/TouchAreaOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/TouchAreaOnClickListenerFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object TouchAreaOnClickListenerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { TouchArea } + literalSupplier = { TouchArea }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/VideoZoomSnapIndicatorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/VideoZoomSnapIndicatorFingerprint.kt index f03138eb5..218bf87ad 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/VideoZoomSnapIndicatorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/components/fingerprints/VideoZoomSnapIndicatorFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object VideoZoomSnapIndicatorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { VideoZoomSnapIndicator } + literalSupplier = { VideoZoomSnapIndicator }, ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/AdvancedQualityBottomSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/AdvancedQualityBottomSheetFingerprint.kt index 38a6cde06..c036793b0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/AdvancedQualityBottomSheetFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/AdvancedQualityBottomSheetFingerprint.kt @@ -7,9 +7,9 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal object AdvancedQualityBottomSheetFingerprint : LiteralValueFingerprint( + returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L", "L"), - returnType = "L", opcodes = listOf( Opcode.IGET_OBJECT, Opcode.INVOKE_STATIC, @@ -36,5 +36,5 @@ internal object AdvancedQualityBottomSheetFingerprint : LiteralValueFingerprint( Opcode.IGET_OBJECT, Opcode.CONST_STRING ), - literalSupplier = { VideoQualityBottomSheet } + literalSupplier = { VideoQualityBottomSheet }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/PiPModeConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/PiPModeConfigFingerprint.kt index 3542b478c..217fc1699 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/PiPModeConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/hide/fingerprints/PiPModeConfigFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint * This fingerprint is compatible with YouTube v18.39.xx+ */ internal object PiPModeConfigFingerprint : LiteralValueFingerprint( - literalSupplier = { 45427407 } + literalSupplier = { 45427407 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt index 9e9e5eeef..74b414083 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/flyoutmenu/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object AdditionalSettingsConfigFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45412662 } + literalSupplier = { 45412662 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/EngagementPanelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/EngagementPanelFingerprint.kt index fec64cd51..f4852ef59 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/EngagementPanelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/EngagementPanelFingerprint.kt @@ -6,5 +6,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object EngagementPanelFingerprint : LiteralValueFingerprint( returnType = "L", parameters = listOf("L"), - literalSupplier = { FullScreenEngagementPanel } + literalSupplier = { FullScreenEngagementPanel }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/LandScapeModeConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/LandScapeModeConfigFingerprint.kt index fe1678afd..4e5e0caae 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/LandScapeModeConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/LandScapeModeConfigFingerprint.kt @@ -7,5 +7,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint */ internal object LandScapeModeConfigFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45446428 } + literalSupplier = { 45446428 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/PlayerTitleViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/PlayerTitleViewFingerprint.kt index 1f8cc8b05..7594c0dd3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/PlayerTitleViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/PlayerTitleViewFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object PlayerTitleViewFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { PlayerVideoTitleView } + literalSupplier = { PlayerVideoTitleView }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/QuickActionsElementFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/QuickActionsElementFingerprint.kt index 726b0048f..ce28b148a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/QuickActionsElementFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/QuickActionsElementFingerprint.kt @@ -6,8 +6,8 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object QuickActionsElementFingerprint : LiteralValueFingerprint( + returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;"), - returnType = "V", - literalSupplier = { QuickActionsElementContainer } + literalSupplier = { QuickActionsElementContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/RelatedEndScreenResultsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/RelatedEndScreenResultsFingerprint.kt index 3e0a05da9..60e230e4e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/RelatedEndScreenResultsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/fullscreen/fingerprints/RelatedEndScreenResultsFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object RelatedEndScreenResultsFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { AppRelatedEndScreenResults } + literalSupplier = { AppRelatedEndScreenResults }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/overlaybuttons/OverlayButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/overlaybuttons/OverlayButtonsPatch.kt index e01517f4f..b2a31d9c5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/overlaybuttons/OverlayButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/overlaybuttons/OverlayButtonsPatch.kt @@ -70,6 +70,15 @@ object OverlayButtonsPatch : BaseResourcePatch( required = true ) + // Option to choose wider between-buttons space + private val WiderButtonsSpace by booleanPatchOption( + key = "WiderButtonsSpace", + default = false, + title = "Wider between-buttons space", + description = "Prevent adjacent button presses by increasing the horizontal spacing between buttons.", + required = true + ) + // Option to change top buttons private val ChangeTopButtons by booleanPatchOption( key = "ChangeTopButtons", @@ -203,18 +212,26 @@ object OverlayButtonsPatch : BaseResourcePatch( "@id/timestamps_container" to "14.0dip" ) + val widerButtonsSpace = WiderButtonsSpace == true + val layoutHeightWidth = if (widerButtonsSpace) + "56.0dip" + else + "48.0dip" + if (isButton) { node.setAttribute("android:layout_marginBottom", marginBottom) node.setAttribute("android:paddingLeft", "0.0dip") node.setAttribute("android:paddingRight", "0.0dip") node.setAttribute("android:paddingBottom", "22.0dip") if (heightIsNotZero && widthIsNotZero) { - node.setAttribute("android:layout_height", "48.0dip") - node.setAttribute("android:layout_width", "48.0dip") + node.setAttribute("android:layout_height", layoutHeightWidth) + node.setAttribute("android:layout_width", layoutHeightWidth) } } else if (timBarItem.containsKey(id)) { node.setAttribute("android:layout_marginBottom", marginBottom) - node.setAttribute("android:paddingBottom", timBarItem.getValue(id)) + if (!widerButtonsSpace) { + node.setAttribute("android:paddingBottom", timBarItem.getValue(id)) + } } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/CairoSeekbarConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/CairoSeekbarConfigFingerprint.kt index 2428b6454..ecf32d373 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/CairoSeekbarConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/CairoSeekbarConfigFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object CairoSeekbarConfigFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45617850 } + literalSupplier = { 45617850 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ShortsSeekbarColorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ShortsSeekbarColorFingerprint.kt index 7ce85b4aa..64a5793de 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ShortsSeekbarColorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ShortsSeekbarColorFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsSeekbarColorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { ReelTimeBarPlayedColor } + literalSupplier = { ReelTimeBarPlayedColor }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ThumbnailPreviewConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ThumbnailPreviewConfigFingerprint.kt index ce6bf6c4e..990c549e4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ThumbnailPreviewConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/seekbar/fingerprints/ThumbnailPreviewConfigFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object ThumbnailPreviewConfigFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), - literalSupplier = { 45398577 } + literalSupplier = { 45398577 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/HorizontalTouchOffsetConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/HorizontalTouchOffsetConstructorFingerprint.kt index b6f74ec64..e26fd9996 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/HorizontalTouchOffsetConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/HorizontalTouchOffsetConstructorFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object HorizontalTouchOffsetConstructorFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { SeekEasyHorizontalTouchOffsetToStartScrubbing } + literalSupplier = { SeekEasyHorizontalTouchOffsetToStartScrubbing }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt index a6904c670..65c2c1aa2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt @@ -11,5 +11,5 @@ internal object RestoreSlideToSeekBehaviorFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), opcodes = listOf(Opcode.MOVE_RESULT), - literalSupplier = { 45411329 } + literalSupplier = { 45411329 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt index ad71e2e0d..904dc51b4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt @@ -11,5 +11,5 @@ internal object SpeedOverlayFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), opcodes = listOf(Opcode.MOVE_RESULT), - literalSupplier = { 45411330 } + literalSupplier = { 45411330 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFloatValueFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFloatValueFingerprint.kt index d5557db6b..0679395f1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFloatValueFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFloatValueFingerprint.kt @@ -13,5 +13,5 @@ internal object SpeedOverlayFloatValueFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf(Opcode.DOUBLE_TO_FLOAT), - literalSupplier = { 45411328 } + literalSupplier = { 45411328 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt index e30dac5c8..bc7f688f3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt @@ -11,6 +11,7 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.patches.shared.textcomponent.TextComponentPatch import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsButtonFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsPaidPromotionFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsPausedHeaderFingerprint @@ -18,7 +19,6 @@ import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsPivotLe import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsSubscriptionsTabletFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsSubscriptionsTabletParentFingerprint import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE -import app.revanced.patches.youtube.utils.fingerprints.TextComponentSpecFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH @@ -35,7 +35,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Right import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.video.information.VideoInformationPatch import app.revanced.util.REGISTER_TEMPLATE_REPLACEMENT -import app.revanced.util.getReference +import app.revanced.util.getWalkerMethod import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.indexOfFirstWideLiteralInstructionValueOrThrow @@ -43,7 +43,6 @@ import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.replaceLiteralInstructionCall import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -64,7 +63,8 @@ object ShortsComponentPatch : BaseBytecodePatch( ShortsRepeatPatch::class, ShortsTimeStampPatch::class, ShortsToolBarPatch::class, - VideoInformationPatch::class + TextComponentPatch::class, + VideoInformationPatch::class, ), compatiblePackages = COMPATIBLE_PACKAGE, fingerprints = setOf( @@ -73,7 +73,6 @@ object ShortsComponentPatch : BaseBytecodePatch( ShortsPausedHeaderFingerprint, ShortsPivotLegacyFingerprint, ShortsSubscriptionsTabletParentFingerprint, - TextComponentSpecFingerprint ) ) { private const val INTEGRATION_CLASS_DESCRIPTOR = @@ -283,15 +282,39 @@ object ShortsComponentPatch : BaseBytecodePatch( ShortsPausedHeaderFingerprint.resultOrThrow().let { it.mutableMethod.apply { - val insertIndex = it.scanResult.patternScanResult!!.startIndex - val insertRegister = getInstruction(insertIndex).registerA + val targetIndex = it.scanResult.patternScanResult!!.endIndex + 1 + val targetInstruction = getInstruction(targetIndex) + val targetReference = + (targetInstruction as? ReferenceInstruction)?.reference as? MethodReference + val useMethodWalker = targetInstruction.opcode == Opcode.INVOKE_VIRTUAL && + targetReference?.returnType == "V" && + targetReference.parameterTypes.firstOrNull() == "Landroid/view/View;" - addInstructions( - insertIndex, """ - invoke-static {v$insertRegister}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPausedHeader(Z)Z - move-result v$insertRegister - """ - ) + if (useMethodWalker) { + // YouTube 18.29.38 ~ YouTube 19.28.42 + getWalkerMethod(context, targetIndex).apply { + addInstructionsWithLabels( + 0, """ + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPausedHeader()Z + move-result v0 + if-eqz v0, :show + return-void + """, ExternalLabel("show", getInstruction(0)) + ) + } + } else { + // YouTube 19.29.42 ~ + val insertIndex = it.scanResult.patternScanResult!!.startIndex + val insertRegister = + getInstruction(insertIndex).registerA + + addInstructions( + insertIndex, """ + invoke-static {v$insertRegister}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPausedHeader(Z)Z + move-result v$insertRegister + """ + ) + } } } @@ -299,29 +322,7 @@ object ShortsComponentPatch : BaseBytecodePatch( // region patch for return shorts channel name - TextComponentSpecFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - val insertIndex = indexOfFirstInstructionOrThrow { - getReference()?.toString() == "Landroid/text/SpannableString;->valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;" - } - val charSequenceRegister = - getInstruction(insertIndex).registerC - val conversionContextRegister = - getInstruction(0).registerA - - val replaceReference = - getInstruction(insertIndex).reference - - addInstructions( - insertIndex + 1, """ - invoke-static {v$conversionContextRegister, v$charSequenceRegister}, $INTEGRATION_CLASS_DESCRIPTOR->onCharSequenceLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; - move-result-object v$charSequenceRegister - invoke-static {v$charSequenceRegister}, $replaceReference - """ - ) - removeInstruction(insertIndex) - } - } + TextComponentPatch.hookSpannableString(INTEGRATION_CLASS_DESCRIPTOR, "onCharSequenceLoaded") VideoInformationPatch.hookShorts("$INTEGRATION_CLASS_DESCRIPTOR->newShortsVideoStarted(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JZ)V") diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt index ab351ff88..537d09bee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt @@ -9,5 +9,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint * but due to the structure of ReVanced Patcher, the patch is applied to the method found first. */ internal object ShortsPaidPromotionFingerprint : LiteralValueFingerprint( - literalSupplier = { BadgeLabel } + literalSupplier = { BadgeLabel }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt index ed5ccc71b..124c718a1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt @@ -9,5 +9,5 @@ internal object ShortsPivotLegacyFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("Z", "Z", "L"), - literalSupplier = { ReelForcedMuteButton } + literalSupplier = { ReelForcedMuteButton }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt index c6d156b45..df73b83bd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsSubscriptionsTabletParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { ReelPlayerFooter } + literalSupplier = { ReelPlayerFooter }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampConstructorFingerprint.kt index 9d54f30f2..19b0170eb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampConstructorFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsTimeStampConstructorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - literalSupplier = { ReelVodTimeStampsContainer } + literalSupplier = { ReelVodTimeStampsContainer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampMetaPanelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampMetaPanelFingerprint.kt index a8b261427..2bb1a638d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampMetaPanelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampMetaPanelFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsTimeStampMetaPanelFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { MetaPanel } + literalSupplier = { MetaPanel }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampSecondaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampSecondaryFingerprint.kt index 9daf46271..ba11f135b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampSecondaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsTimeStampSecondaryFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsTimeStampSecondaryFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { 45638187 } + literalSupplier = { 45638187 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt index 6794f4af9..46f5aebc7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object FullScreenEngagementOverlayFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { FullScreenEngagementOverlay } + literalSupplier = { FullScreenEngagementOverlay }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeToSwitchVideoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeToSwitchVideoFingerprint.kt index 8ad8fb9e3..023412ae9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeToSwitchVideoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeToSwitchVideoFingerprint.kt @@ -7,5 +7,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint */ internal object SwipeToSwitchVideoFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { 45631116 } + literalSupplier = { 45631116 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchPanelGesturesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchPanelGesturesFingerprint.kt index e5dddb715..a9fe71f84 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchPanelGesturesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchPanelGesturesFingerprint.kt @@ -7,5 +7,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint */ internal object WatchPanelGesturesFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { 45372793 } + literalSupplier = { 45372793 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/bottomsheet/fingerprint/BottomSheetBehaviorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/bottomsheet/fingerprint/BottomSheetBehaviorFingerprint.kt index 73d6aa2cb..4a3825e50 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/bottomsheet/fingerprint/BottomSheetBehaviorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/bottomsheet/fingerprint/BottomSheetBehaviorFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object BottomSheetBehaviorFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { DesignBottomSheet } + literalSupplier = { DesignBottomSheet }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/MenuItemInitializeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/MenuItemInitializeFingerprint.kt index 7084ad399..da10f2f4f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/MenuItemInitializeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/MenuItemInitializeFingerprint.kt @@ -6,8 +6,8 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object MenuItemInitializeFingerprint : LiteralValueFingerprint( + returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/MenuItem;"), - returnType = "V", - literalSupplier = { CastMediaRouteButton } + literalSupplier = { CastMediaRouteButton }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/PlayerButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/PlayerButtonFingerprint.kt index 5de6ebad5..2b980fb43 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/PlayerButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/castbutton/fingerprints/PlayerButtonFingerprint.kt @@ -5,8 +5,8 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object PlayerButtonFingerprint : LiteralValueFingerprint( + returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = emptyList(), - returnType = "V", - literalSupplier = { 11208 } + literalSupplier = { 11208 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt index ffead17cc..f734b21ed 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt @@ -10,5 +10,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint */ internal object ControlsOverlayConfigFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45427491 } + literalSupplier = { 45427491 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt index 24dc36eb6..c23c9ae6a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlaybackRateBottomSheetBuilderFingerprint.kt @@ -14,5 +14,5 @@ internal object PlaybackRateBottomSheetBuilderFingerprint : LiteralValueFingerpr Opcode.IGET_BOOLEAN, Opcode.IF_EQZ, ), - literalSupplier = { VarispeedUnavailableTitle } + literalSupplier = { VarispeedUnavailableTitle }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt index d2dc7c79a..cda8d6352 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerButtonsResourcesFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object PlayerButtonsResourcesFingerprint : LiteralValueFingerprint( returnType = "I", parameters = listOf("Landroid/content/res/Resources;"), - literalSupplier = { 17694721 } + literalSupplier = { 17694721 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt index b303827a5..dc538c897 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt @@ -7,9 +7,9 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal object QualityMenuViewInflateFingerprint : LiteralValueFingerprint( + returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L", "L"), - returnType = "L", opcodes = listOf( Opcode.INVOKE_SUPER, Opcode.CONST, @@ -26,5 +26,5 @@ internal object QualityMenuViewInflateFingerprint : LiteralValueFingerprint( Opcode.MOVE_RESULT_OBJECT, Opcode.CHECK_CAST ), - literalSupplier = { VideoQualityBottomSheet } + literalSupplier = { VideoQualityBottomSheet }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TextComponentSpecFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TextComponentSpecFingerprint.kt deleted file mode 100644 index f698f4a9b..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TextComponentSpecFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.youtube.utils.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint - -internal object TextComponentSpecFingerprint : MethodFingerprint( - returnType = "Ljava/lang/CharSequence;", - strings = listOf("Failed to set PB Style Run Extension in TextComponentSpec. Extension id: %s") -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt index bc5601669..564fde336 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt @@ -5,5 +5,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object TotalTimeFingerprint : LiteralValueFingerprint( returnType = "V", - literalSupplier = { TotalTime } + literalSupplier = { TotalTime }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt index 2f52a0d27..e50c87bd2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object VideoEndFingerprint : LiteralValueFingerprint( strings = listOf("Attempting to seek during an ad"), - literalSupplier = { 45368273 } + literalSupplier = { 45368273 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonPositionFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonPositionFingerprint.kt index e325d7b02..e1d72269b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonPositionFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonPositionFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object FullscreenButtonPositionFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45627640 } + literalSupplier = { 45627640 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonViewStubFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonViewStubFingerprint.kt index f99b18df6..cc5efa3f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonViewStubFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/bottomui/fingerprints/FullscreenButtonViewStubFingerprint.kt @@ -4,5 +4,5 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint internal object FullscreenButtonViewStubFingerprint : LiteralValueFingerprint( returnType = "Z", - literalSupplier = { 45617294 } + literalSupplier = { 45617294 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/cairo/fingerprints/CarioFragmentConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/cairo/fingerprints/CarioFragmentConfigFingerprint.kt index b777e0e75..d9ac778ee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/cairo/fingerprints/CarioFragmentConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/cairo/fingerprints/CarioFragmentConfigFingerprint.kt @@ -13,5 +13,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object CarioFragmentConfigFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { 45532100 } + literalSupplier = { 45532100 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt index 8b72a0269..c3801a588 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.AccessFlags internal object ShortsPlaybackFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - literalSupplier = { 45387052 } + literalSupplier = { 45387052 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/streamingdata/fingerprints/BuildBrowseRequestFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/streamingdata/fingerprints/BuildBrowseRequestFingerprint.kt index d59e46819..1d6862602 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/streamingdata/fingerprints/BuildBrowseRequestFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/streamingdata/fingerprints/BuildBrowseRequestFingerprint.kt @@ -25,7 +25,7 @@ internal object BuildBrowseRequestFingerprint : MethodFingerprint( fun indexOfRequestFinishedListenerInstruction(methodDef: Method) = methodDef.indexOfFirstInstruction { opcode == Opcode.INVOKE_VIRTUAL && - getReference().toString() == "Lorg/chromium/net/ExperimentalUrlRequest${'$'}Builder;->setRequestFinishedListener(Lorg/chromium/net/RequestFinishedInfo${'$'}Listener;)Lorg/chromium/net/ExperimentalUrlRequest${'$'}Builder;" + getReference()?.name == "setRequestFinishedListener" } fun indexOfNewUrlRequestBuilderInstruction(methodDef: Method) = diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/SuggestedVideoEndScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/SuggestedVideoEndScreenPatch.kt index a4b297c0b..b078d06c2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/SuggestedVideoEndScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/SuggestedVideoEndScreenPatch.kt @@ -6,20 +6,28 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.youtube.utils.fix.suggestedvideoendscreen.fingerprints.AutoNavConstructorFingerprint +import app.revanced.patches.youtube.utils.fix.suggestedvideoendscreen.fingerprints.AutoNavStatusFingerprint import app.revanced.patches.youtube.utils.fix.suggestedvideoendscreen.fingerprints.RemoveOnLayoutChangeListenerFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR +import app.revanced.util.alsoResolve +import app.revanced.util.getReference import app.revanced.util.getWalkerMethod import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( description = "Fixes an issue where the suggested video end screen is always visible regardless of whether autoplay is set or not." ) object SuggestedVideoEndScreenPatch : BytecodePatch( - setOf(RemoveOnLayoutChangeListenerFingerprint) + setOf( + AutoNavConstructorFingerprint, + RemoveOnLayoutChangeListenerFingerprint + ) ) { override fun execute(context: BytecodeContext) { @@ -36,15 +44,23 @@ object SuggestedVideoEndScreenPatch : BytecodePatch( it.getWalkerMethod(context, it.scanResult.patternScanResult!!.endIndex) walkerIndex.apply { - val invokeInterfaceIndex = - indexOfFirstInstructionOrThrow(opcode = Opcode.INVOKE_INTERFACE) + val autoNavStatusMethodName = AutoNavStatusFingerprint.alsoResolve( + context, AutoNavConstructorFingerprint + ).mutableMethod.name + val invokeIndex = + indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.returnType == "Z" && + reference.parameterTypes.size == 0 && + reference.name == autoNavStatusMethodName + } val iGetObjectIndex = - indexOfFirstInstructionReversedOrThrow(invokeInterfaceIndex, Opcode.IGET_OBJECT) + indexOfFirstInstructionReversedOrThrow(invokeIndex, Opcode.IGET_OBJECT) - val invokeInterfaceReference = - getInstruction(invokeInterfaceIndex).reference + val invokeReference = getInstruction(invokeIndex).reference val iGetObjectReference = getInstruction(iGetObjectIndex).reference + val opcodeName = getInstruction(invokeIndex).opcode.name addInstructionsWithLabels( 0, @@ -56,7 +72,7 @@ object SuggestedVideoEndScreenPatch : BytecodePatch( iget-object v0, p0, $iGetObjectReference # This reference checks whether autoplay is turned on. - invoke-interface {v0}, $invokeInterfaceReference + $opcodeName {v0}, $invokeReference move-result v0 # Hide suggested video end screen only when autoplay is turned off. diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/fingerprints/AutoNavConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/fingerprints/AutoNavConstructorFingerprint.kt new file mode 100644 index 000000000..348ffbaad --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/fingerprints/AutoNavConstructorFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.youtube.utils.fix.suggestedvideoendscreen.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object AutoNavConstructorFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, + strings = listOf("main_app_autonav"), +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/MembershipSettingsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/fingerprints/AutoNavStatusFingerprint.kt similarity index 58% rename from src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/MembershipSettingsFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/fingerprints/AutoNavStatusFingerprint.kt index af3434c7f..818e4c5f9 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/MembershipSettingsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/suggestedvideoendscreen/fingerprints/AutoNavStatusFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.music.ads.general.fingerprints +package app.revanced.patches.youtube.utils.fix.suggestedvideoendscreen.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal object MembershipSettingsFingerprint : MethodFingerprint( - returnType = "Ljava/lang/CharSequence;", +internal object AutoNavStatusFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + returnType = "Z", parameters = emptyList() -) +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/flyoutmenu/fingerprints/VideoQualityBottomSheetClassFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/flyoutmenu/fingerprints/VideoQualityBottomSheetClassFingerprint.kt index 411644568..ed11d6e08 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/flyoutmenu/fingerprints/VideoQualityBottomSheetClassFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/flyoutmenu/fingerprints/VideoQualityBottomSheetClassFingerprint.kt @@ -6,8 +6,8 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object VideoQualityBottomSheetClassFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Z"), - literalSupplier = { VideoQualityUnavailableAnnouncement } + literalSupplier = { VideoQualityUnavailableAnnouncement }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/IntegrationsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/IntegrationsPatch.kt index a807e6edb..7f5d3eafa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/IntegrationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/IntegrationsPatch.kt @@ -1,3 +1,5 @@ +@file:Suppress("DEPRECATION") + package app.revanced.patches.youtube.utils.integrations import app.revanced.patcher.patch.annotation.Patch diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt index b36448aaf..b1ea2546c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt @@ -9,6 +9,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * It appears this hook may no longer be needed as one of the constructor parameters is the already hooked * [EmbeddedPlayerControlsOverlayFingerprint] */ +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object APIPlayerServiceFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lcom/google/android/apps/youtube/embeddedplayer/service/service/jar/ApiPlayerService;" }, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt index 31550f9b7..71d25eaf7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt @@ -10,6 +10,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * Note: this fingerprint may no longer be needed, as it appears * [RemoteEmbedFragmentFingerprint] may be set before this hook is called. */ +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object EmbeddedPlayerControlsOverlayFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt index 0bd3994e5..0eee834b5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt @@ -10,6 +10,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * Note: this fingerprint may or may not be needed, as * [RemoteEmbedFragmentFingerprint] might be set before this is called. */ +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object EmbeddedPlayerFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, returnType = "L", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt index 99a131a8a..e67934209 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt @@ -7,6 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * For embedded playback. Likely covers Google Play store and other Google products. */ +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object RemoteEmbedFragmentFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt index 4313dfdc0..df47f1bfe 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt @@ -7,6 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * For embedded playback inside 3rd party android app (such as 3rd party Reddit apps). */ +@Deprecated("Fingerprint is obsolete and will be deleted soon") internal object RemoteEmbeddedPlayerFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/NavigationBarHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/NavigationBarHookPatch.kt index 65d8819e7..632c6207a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/NavigationBarHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/NavigationBarHookPatch.kt @@ -56,8 +56,7 @@ object NavigationBarHookPatch : BytecodePatch( private lateinit var navigationTabCreatedCallback: MutableMethod private lateinit var bottomBarContainerMethod: MutableMethod - private var bottomBarContainerIndex = 0 - private var bottomBarContainerRegister = 0 + private var bottomBarContainerOffset = 0 override fun execute(context: BytecodeContext) { fun MutableMethod.addHook(hook: Hook, insertPredicate: Instruction.() -> Boolean) { @@ -131,13 +130,8 @@ object NavigationBarHookPatch : BytecodePatch( "onBackPressed" ) - InitializeBottomBarContainerFingerprint.resultOrThrow().mutableMethod.apply { - bottomBarContainerMethod = this - bottomBarContainerIndex = - InitializeBottomBarContainerFingerprint.indexOfLayoutChangeListenerInstruction(this) - bottomBarContainerRegister = - getInstruction(bottomBarContainerIndex).registerC - } + bottomBarContainerMethod = + InitializeBottomBarContainerFingerprint.resultOrThrow().mutableMethod } val hookNavigationButtonCreated: (String) -> Unit by lazy { @@ -152,11 +146,19 @@ object NavigationBarHookPatch : BytecodePatch( } } - fun addBottomBarContainerHook(descriptor: String) = - bottomBarContainerMethod.addInstruction( - bottomBarContainerIndex, - "invoke-static { v$bottomBarContainerRegister }, $descriptor" - ) + fun addBottomBarContainerHook(descriptor: String) { + bottomBarContainerMethod.apply { + val layoutChangeListenerIndex = + InitializeBottomBarContainerFingerprint.indexOfLayoutChangeListenerInstruction(this) + val bottomBarContainerRegister = + getInstruction(layoutChangeListenerIndex).registerC + + addInstruction( + layoutChangeListenerIndex + bottomBarContainerOffset--, + "invoke-static { v$bottomBarContainerRegister }, $descriptor" + ) + } + } private enum class Hook(val methodName: String, val parameters: String) { SET_LAST_APP_NAVIGATION_ENUM("setLastAppNavigationEnum", "Ljava/lang/Enum;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/fingerprints/InitializeButtonsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/fingerprints/InitializeButtonsFingerprint.kt index 98d93cf68..74579c405 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/fingerprints/InitializeButtonsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/navigation/fingerprints/InitializeButtonsFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object InitializeButtonsFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", - literalSupplier = { ImageOnlyTab } + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + literalSupplier = { ImageOnlyTab }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt index 5ef4e9224..27a579bc2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt @@ -12,5 +12,5 @@ internal object BottomControlsInflateFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { BottomUiContainerStub } + literalSupplier = { BottomUiContainerStub }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt index c837ad9aa..152e41d21 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt @@ -17,5 +17,5 @@ internal object ControlsLayoutInflateFingerprint : LiteralValueFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_OBJECT ), - literalSupplier = { ControlsLayoutStub } + literalSupplier = { ControlsLayoutStub }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/PlayerTypeHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/PlayerTypeHookPatch.kt index 748a0f96d..aa530b0cc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/PlayerTypeHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/PlayerTypeHookPatch.kt @@ -7,7 +7,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.SHARED_PATH import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.playertype.fingerprint.ActionBarSearchResultsFingerprint @@ -18,7 +17,6 @@ import app.revanced.patches.youtube.utils.playertype.fingerprint.VideoStateFinge import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelWatchPlayer import app.revanced.util.addStaticFieldToIntegration -import app.revanced.util.alsoResolve import app.revanced.util.findMethodOrThrow import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -38,7 +36,7 @@ object PlayerTypeHookPatch : BytecodePatch( BrowseIdClassFingerprint, PlayerTypeFingerprint, ReelWatchPagerFingerprint, - YouTubeControlsOverlayFingerprint + VideoStateFingerprint, ) ) { private const val INTEGRATIONS_PLAYER_TYPE_HOOK_CLASS_DESCRIPTOR = @@ -79,11 +77,9 @@ object PlayerTypeHookPatch : BytecodePatch( // region patch for set video state - VideoStateFingerprint.alsoResolve( - context, YouTubeControlsOverlayFingerprint - ).let { + VideoStateFingerprint.resultOrThrow().let { it.mutableMethod.apply { - val endIndex = it.scanResult.patternScanResult!!.endIndex + val endIndex = it.scanResult.patternScanResult!!.startIndex + 1 val videoStateFieldName = getInstruction(endIndex).reference diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/ReelWatchPagerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/ReelWatchPagerFingerprint.kt index 7bb7d066b..fadfba6cd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/ReelWatchPagerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/ReelWatchPagerFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags internal object ReelWatchPagerFingerprint : LiteralValueFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "Landroid/view/View;", - literalSupplier = { ReelWatchPlayer } + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + literalSupplier = { ReelWatchPlayer }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt index 331a79f96..b278da576 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt @@ -2,20 +2,26 @@ package app.revanced.patches.youtube.utils.playertype.fingerprint import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal object VideoStateFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - parameters = listOf("L"), + parameters = listOf("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;"), opcodes = listOf( - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, - Opcode.CONST_4, - Opcode.IF_EQZ, Opcode.IF_EQZ, Opcode.IGET_OBJECT, // obfuscated parameter field name - ) + Opcode.IGET_OBJECT, + Opcode.IF_NE, + ), + customFingerprint = { methodDef, _ -> + methodDef.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "equals" + } >= 0 + }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt index 00eb8c26d..035f7a14b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt @@ -3,5 +3,5 @@ package app.revanced.patches.youtube.utils.recyclerview.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint internal object BottomSheetRecyclerViewBuilderFingerprint : LiteralValueFingerprint( - literalSupplier = { 45382015 } + literalSupplier = { 45382015 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt index a8c77ce03..0819c4138 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt @@ -42,6 +42,7 @@ object SharedResourceIdPatch : ResourcePatch() { var CompactLink = -1L var CompactListItem = -1L var ComponentLongClickListener = -1L + var ContentPill = -1L var ControlsLayoutStub = -1L var DarkBackground = -1L var DarkSplashAnimation = -1L @@ -117,6 +118,7 @@ object SharedResourceIdPatch : ResourcePatch() { var VideoZoomSnapIndicator = -1L var VoiceSearch = -1L var YouTubeControlsOverlaySubtitleButton = -1L + var YouTubeLogo = -1L var YtOutlinePictureInPictureWhite = -1L var YtOutlineVideoCamera = -1L var YtOutlineXWhite = -1L @@ -150,6 +152,7 @@ object SharedResourceIdPatch : ResourcePatch() { CompactLink = getId(LAYOUT, "compact_link") CompactListItem = getId(LAYOUT, "compact_list_item") ComponentLongClickListener = getId(ID, "component_long_click_listener") + ContentPill = getId(LAYOUT, "content_pill") ControlsLayoutStub = getId(ID, "controls_layout_stub") DarkBackground = getId(ID, "dark_background") DarkSplashAnimation = getId(ID, "dark_splash_animation") @@ -231,6 +234,7 @@ object SharedResourceIdPatch : ResourcePatch() { VoiceSearch = getId(ID, "voice_search") YouTubeControlsOverlaySubtitleButton = getId(LAYOUT, "youtube_controls_overlay_subtitle_button") + YouTubeLogo = getId(ID, "youtube_logo") YtOutlinePictureInPictureWhite = getId(DRAWABLE, "yt_outline_picture_in_picture_white_24") YtOutlineVideoCamera = getId(DRAWABLE, "yt_outline_video_camera_black_24") YtOutlineXWhite = getId(DRAWABLE, "yt_outline_x_white_24") diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt index a580ea3ca..772cdaf9a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt @@ -2,34 +2,22 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.general import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.PatchException import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.patches.shared.textcomponent.TextComponentPatch import app.revanced.patches.youtube.utils.compatibility.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints.DislikeFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints.LikeFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints.RemoveLikeFingerprint -import app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints.TextComponentConstructorFingerprint -import app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerprints.TextComponentContextFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.ReturnYouTubeDislikeRollingNumberPatch import app.revanced.patches.youtube.utils.returnyoutubedislike.shorts.ReturnYouTubeDislikeShortsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.video.information.VideoInformationPatch import app.revanced.patches.youtube.video.videoid.VideoIdPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.resultOrThrow -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Suppress("unused") object ReturnYouTubeDislikePatch : BaseBytecodePatch( @@ -40,6 +28,7 @@ object ReturnYouTubeDislikePatch : BaseBytecodePatch( ReturnYouTubeDislikeRollingNumberPatch::class, ReturnYouTubeDislikeShortsPatch::class, SettingsPatch::class, + TextComponentPatch::class, VideoInformationPatch::class ), compatiblePackages = COMPATIBLE_PACKAGE, @@ -47,7 +36,6 @@ object ReturnYouTubeDislikePatch : BaseBytecodePatch( DislikeFingerprint, LikeFingerprint, RemoveLikeFingerprint, - TextComponentConstructorFingerprint ) ) { private const val INTEGRATIONS_RYD_CLASS_DESCRIPTOR = @@ -70,59 +58,7 @@ object ReturnYouTubeDislikePatch : BaseBytecodePatch( ) } - - TextComponentConstructorFingerprint.resultOrThrow().let { parentResult -> - // Resolves fingerprints - TextComponentContextFingerprint.resolve(context, parentResult.classDef) - - TextComponentContextFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - val conversionContextFieldIndex = indexOfFirstInstructionOrThrow { - getReference()?.type == "Ljava/util/Map;" - } - 1 - val conversionContextFieldReference = - getInstruction(conversionContextFieldIndex).reference - - val charSequenceIndex1932 = indexOfFirstInstruction { - getReference()?.type == "Ljava/util/BitSet;" - } - 1 - val charSequenceIndex1933 = indexOfFirstInstruction { - val reference = getReference() - opcode == Opcode.INVOKE_VIRTUAL && - reference?.returnType == "V" && - reference.parameterTypes.firstOrNull() == "Ljava/lang/CharSequence;" - } - - val insertIndex: Int - val charSequenceRegister: Int - - if (charSequenceIndex1932 > -2) { - charSequenceRegister = - getInstruction(charSequenceIndex1932).registerA - insertIndex = charSequenceIndex1932 - 1 - } else if (charSequenceIndex1933 > -1) { - charSequenceRegister = - getInstruction(charSequenceIndex1933).registerD - insertIndex = charSequenceIndex1933 - } else { - throw PatchException("Could not find insert index") - } - - val freeRegister = getInstruction( - indexOfFirstInstructionOrThrow(insertIndex, Opcode.IGET_OBJECT) - ).registerA - - addInstructions( - insertIndex, """ - move-object/from16 v$freeRegister, p0 - iget-object v$freeRegister, v$freeRegister, $conversionContextFieldReference - invoke-static {v$freeRegister, v$charSequenceRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; - move-result-object v$charSequenceRegister - """ - ) - } - } - } + TextComponentPatch.hookTextComponent(INTEGRATIONS_RYD_CLASS_DESCRIPTOR) // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. VideoIdPatch.hookVideoId("$INTEGRATIONS_RYD_CLASS_DESCRIPTOR->newVideoLoaded(Ljava/lang/String;)V") diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt index 0c38f5612..aed2602cf 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt @@ -8,5 +8,5 @@ import com.android.tools.smali.dexlib2.Opcode */ internal object RollingNumberSetterFingerprint : LiteralValueFingerprint( opcodes = listOf(Opcode.CHECK_CAST), - literalSupplier = { 45427773 } + literalSupplier = { 45427773 }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/ReturnYouTubeDislikeShortsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/ReturnYouTubeDislikeShortsPatch.kt index d174f5ece..f26911ea0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/ReturnYouTubeDislikeShortsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/ReturnYouTubeDislikeShortsPatch.kt @@ -1,33 +1,29 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.shorts import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.utils.fingerprints.TextComponentSpecFingerprint +import app.revanced.patches.shared.textcomponent.TextComponentPatch import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.returnyoutubedislike.shorts.fingerprints.ShortsTextViewFingerprint import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.resultOrThrow import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch(dependencies = [SettingsPatch::class]) +@Patch( + dependencies = [ + SettingsPatch::class, + TextComponentPatch::class + ] +) object ReturnYouTubeDislikeShortsPatch : BytecodePatch( - setOf( - ShortsTextViewFingerprint, - TextComponentSpecFingerprint - ) + setOf(ShortsTextViewFingerprint) ) { private const val INTEGRATIONS_RYD_CLASS_DESCRIPTOR = "$UTILS_PATH/ReturnYouTubeDislikePatch;" @@ -71,31 +67,8 @@ object ReturnYouTubeDislikeShortsPatch : BytecodePatch( } } - if (!SettingsPatch.upward1834) { - return - } - - TextComponentSpecFingerprint.resultOrThrow().let { - it.mutableMethod.apply { - val insertIndex = indexOfFirstInstructionOrThrow { - getReference()?.toString() == "Landroid/text/SpannableString;->valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;" - } - val charSequenceRegister = - getInstruction(insertIndex).registerC - val conversionContextRegister = - getInstruction(0).registerA - val replaceReference = - getInstruction(insertIndex).reference - - addInstructions( - insertIndex + 1, """ - invoke-static {v$conversionContextRegister, v$charSequenceRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onCharSequenceLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; - move-result-object v$charSequenceRegister - invoke-static {v$charSequenceRegister}, $replaceReference - """ - ) - removeInstruction(insertIndex) - } + if (SettingsPatch.upward1834) { + TextComponentPatch.hookSpannableString(INTEGRATIONS_RYD_CLASS_DESCRIPTOR, "onCharSequenceLoaded") } } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/ResourceUtils.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/ResourceUtils.kt index 451cd2b86..01a6c30f3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/ResourceUtils.kt @@ -49,34 +49,6 @@ object ResourceUtils { ) } - fun ResourceContext.addEntryValues( - attributeName: String, - attributeValue: String, - path: String = "res/values/arrays.xml", - prepend: Boolean = true, - ) { - xmlEditor[path].use { - with(it.file) { - val resourcesNode = getElementsByTagName("resources").item(0) as Element - - val newElement: Element = createElement("item") - for (i in 0 until resourcesNode.childNodes.length) { - val node = resourcesNode.childNodes.item(i) as? Element ?: continue - - if (node.getAttribute("name") == attributeName) { - newElement.appendChild(createTextNode(attributeValue)) - - if (prepend) { - node.appendChild(newElement) - } else { - node.insertBefore(newElement, node.firstChild) - } - } - } - } - } - } - fun ResourceContext.addPreference(settingArray: Array) { val prefs = this[TARGET_PREFERENCE_PATH] diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt index 385c536a6..cc57a53c2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt @@ -93,7 +93,7 @@ object SettingsPatch : BaseResourcePatch( internal var upward1842 = false internal var upward1849 = false internal var upward1902 = false - internal var upward1912 = false + internal var upward1915 = false internal var upward1923 = false internal var upward1925 = false internal var upward1928 = false @@ -288,7 +288,7 @@ object SettingsPatch : BaseResourcePatch( upward1842 = 234302000 <= playServicesVersion upward1849 = 235000000 <= playServicesVersion upward1902 = 240204000 < playServicesVersion - upward1912 = 241302000 <= playServicesVersion + upward1915 = 241602000 <= playServicesVersion upward1923 = 242402000 <= playServicesVersion upward1925 = 242599000 <= playServicesVersion upward1928 = 242905000 <= playServicesVersion diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt index 0debf02b7..3b5636d25 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt @@ -7,5 +7,5 @@ import com.android.tools.smali.dexlib2.Opcode internal object ThemeSetterSystemFingerprint : LiteralValueFingerprint( returnType = "L", opcodes = listOf(Opcode.RETURN_OBJECT), - literalSupplier = { Appearance } + literalSupplier = { Appearance }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt index 5f2c43afc..a053668c9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt @@ -7,9 +7,9 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal object ToolBarButtonFingerprint : LiteralValueFingerprint( + returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/MenuItem;"), - returnType = "V", opcodes = listOf( Opcode.INVOKE_INTERFACE, Opcode.MOVE_RESULT, @@ -17,5 +17,5 @@ internal object ToolBarButtonFingerprint : LiteralValueFingerprint( Opcode.IGET_OBJECT, Opcode.INVOKE_VIRTUAL ), - literalSupplier = { MenuItemView } + literalSupplier = { MenuItemView }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index bda19a0c3..8a5f61e0d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -2,7 +2,9 @@ package app.revanced.patches.youtube.video.information import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint @@ -38,6 +40,7 @@ import app.revanced.patches.youtube.video.playerresponse.PlayerResponseMethodHoo import app.revanced.patches.youtube.video.videoid.VideoIdPatch import app.revanced.util.addStaticFieldToIntegration import app.revanced.util.alsoResolve +import app.revanced.util.cloneMutable import app.revanced.util.getReference import app.revanced.util.getWalkerMethod import app.revanced.util.indexOfFirstInstructionOrThrow @@ -119,6 +122,7 @@ object VideoInformationPatch : BytecodePatch( private var seekSourceEnumType = "" private var seekSourceMethodName = "" private var seekRelativeSourceMethodName = "" + private var cloneSeekRelativeSourceMethod = false private lateinit var context: BytecodeContext @@ -135,6 +139,32 @@ object VideoInformationPatch : BytecodePatch( internal lateinit var speedSelectionInsertMethod: MutableMethod internal lateinit var videoEndMethod: MutableMethod + private fun cloneSeekRelativeSourceMethod(fingerprintResult: MethodFingerprintResult) { + if (!cloneSeekRelativeSourceMethod) return + + val methods = fingerprintResult.mutableClass.methods + + methods.find { method -> + method.name == seekRelativeSourceMethodName + }?.apply { + methods.add( + cloneMutable( + returnType = "Z" + ).apply { + val lastIndex = implementation!!.instructions.lastIndex + + removeInstruction(lastIndex) + addInstructions( + lastIndex, """ + move-result p1 + return p1 + """ + ) + } + ) + } + } + private fun addSeekInterfaceMethods( result: MethodFingerprintResult, seekMethodName: String, @@ -203,12 +233,16 @@ object VideoInformationPatch : BytecodePatch( // hook the player controller for use through integrations onCreateHook(INTEGRATIONS_CLASS_DESCRIPTOR, "initialize") - seekSourceEnumType = parameterTypes[1].toString() - seekSourceMethodName = name - seekRelativeSourceMethodName = SeekRelativeFingerprint.alsoResolve( + val seekRelativeMethod = SeekRelativeFingerprint.alsoResolve( context, VideoEndFingerprint - ).mutableMethod.name + ).mutableMethod + + seekSourceEnumType = parameterTypes[1].toString() + seekSourceMethodName = name + seekRelativeSourceMethodName = seekRelativeMethod.name + cloneSeekRelativeSourceMethod = seekRelativeMethod.returnType == "V" + cloneSeekRelativeSourceMethod(it) // Create integrations interface methods. addSeekInterfaceMethods( @@ -250,6 +284,8 @@ object VideoInformationPatch : BytecodePatch( // hook the MDX director for use through integrations onCreateHookMdx(INTEGRATIONS_CLASS_DESCRIPTOR, "initializeMdx") + cloneSeekRelativeSourceMethod(it) + // Create integrations interface methods. addSeekInterfaceMethods( it, diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/SeekRelativeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/SeekRelativeFingerprint.kt index a73ab1966..90146b3c7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/SeekRelativeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/SeekRelativeFingerprint.kt @@ -11,12 +11,11 @@ import com.android.tools.smali.dexlib2.Opcode */ internal object SeekRelativeFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - returnType = "Z", + // returnType = "Z", ~ YouTube 19.39.39 + // returnType = "V", YouTube 19.40.xx ~ parameters = listOf("J", "L"), opcodes = listOf( Opcode.ADD_LONG_2ADDR, Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.RETURN ) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoQualityListFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoQualityListFingerprint.kt index 17de772c9..21fcd8e6d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoQualityListFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoQualityListFingerprint.kt @@ -11,5 +11,5 @@ internal object VideoQualityListFingerprint : LiteralValueFingerprint( Opcode.INVOKE_INTERFACE, Opcode.RETURN_VOID ), - literalSupplier = { QualityAuto } + literalSupplier = { QualityAuto }, ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoTitleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoTitleFingerprint.kt index 24debd044..ff8ec7ef4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoTitleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/information/fingerprints/VideoTitleFingerprint.kt @@ -9,5 +9,5 @@ internal object VideoTitleFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), - literalSupplier = { NotificationBigPictureIconWidth } + literalSupplier = { NotificationBigPictureIconWidth }, ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/fingerprint/PlayerParameterBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/fingerprint/PlayerParameterBuilderFingerprint.kt index 0cb4f6f3d..39c7834cb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/fingerprint/PlayerParameterBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/fingerprint/PlayerParameterBuilderFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.youtube.video.playerresponse.fingerprint.PlayerParameterBuilderFingerprint.ENDS_WITH_PARAMETER_LIST import app.revanced.patches.youtube.video.playerresponse.fingerprint.PlayerParameterBuilderFingerprint.STARTS_WITH_PARAMETER_LIST -import app.revanced.patches.youtube.video.playerresponse.fingerprint.PlayerParameterBuilderFingerprint.parametersEqual +import app.revanced.util.parametersEqual import com.android.tools.smali.dexlib2.AccessFlags internal object PlayerParameterBuilderFingerprint : MethodFingerprint( @@ -48,13 +48,13 @@ internal object PlayerParameterBuilderFingerprint : MethodFingerprint( } val startsWithMethodParameterList = parameterTypes.slice(0..5) - val endsWithMethodParameterList = parameterTypes.slice(parameterSize - 7.., - parameters2: Iterable - ): Boolean { - if (parameters1.count() != parameters2.count()) return false - val iterator1 = parameters1.iterator() - parameters2.forEach { - if (!it.startsWith(iterator1.next())) return false - } - return true - } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 46adf69e0..bb3ea6e8e 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -16,10 +16,12 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableField import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.util.fingerprint.MultiMethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method +import com.android.tools.smali.dexlib2.iface.MethodParameter import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -30,6 +32,8 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.Reference import com.android.tools.smali.dexlib2.iface.reference.StringReference import com.android.tools.smali.dexlib2.immutable.ImmutableField +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.immutable.ImmutableMethodImplementation import com.android.tools.smali.dexlib2.util.MethodUtil const val REGISTER_TEMPLATE_REPLACEMENT: String = "REGISTER_INDEX" @@ -41,6 +45,18 @@ fun MethodFingerprint.resultOrThrow() = result ?: throw exception fun MultiMethodFingerprint.resultOrThrow() = result.ifEmpty { throw exception } +fun parametersEqual( + parameters1: Iterable, + parameters2: Iterable +): Boolean { + if (parameters1.count() != parameters2.count()) return false + val iterator1 = parameters1.iterator() + parameters2.forEach { + if (!it.startsWith(iterator1.next())) return false + } + return true +} + /** * The [PatchException] of failing to resolve a [MethodFingerprint]. * @@ -55,6 +71,18 @@ val MultiMethodFingerprint.exception fun MethodFingerprint.alsoResolve(context: BytecodeContext, fingerprint: MethodFingerprint) = also { resolve(context, fingerprint.resultOrThrow().classDef) }.resultOrThrow() +fun MethodFingerprint.getMethodCall() = + resultOrThrow().mutableMethod.getMethodCall() + +fun MutableMethod.getMethodCall(): String { + var methodCall = "$definingClass->$name(" + for (i in 0 until parameters.size) { + methodCall += parameterTypes[i] + } + methodCall += ")$returnType" + return methodCall +} + /** * Find the [MutableMethod] from a given [Method] in a [MutableClass]. * @@ -83,7 +111,7 @@ fun MutableClass.transformFields(transform: MutableField.() -> MutableField) { */ fun MutableClass.transformMethods(transform: MutableMethod.() -> MutableMethod) { val transformedMethods = methods.map { it.transform() } - methods.clear() + methods.removeIf { !MethodUtil.isConstructor(it) } methods.addAll(transformedMethods) } @@ -371,7 +399,7 @@ fun Method.findOpcodeIndicesReversed(opcode: Opcode): List = fun Method.findOpcodeIndicesReversed(filter: Instruction.() -> Boolean): List { val indexes = implementation!!.instructions .withIndex() - .filter { (_, instruction) -> filter.invoke(instruction) } + .filter { (_, instruction) -> filter(instruction) } .map { (index, _) -> index } .reversed() @@ -573,6 +601,38 @@ fun BytecodeContext.updatePatchStatus( "const/4 v0, 0x1" ) +/** + * Taken from BiliRoamingX: + * https://github.com/BiliRoamingX/BiliRoamingX/blob/ae58109f3acdd53ec2d2b3fb439c2a2ef1886221/patches/src/main/kotlin/app/revanced/patches/bilibili/utils/Extenstions.kt#L51 + */ +fun Method.cloneMutable( + registerCount: Int = implementation?.registerCount ?: 0, + clearImplementation: Boolean = false, + name: String = this.name, + accessFlags: Int = this.accessFlags, + parameters: List = this.parameters, + returnType: String = this.returnType +): MutableMethod { + val clonedImplementation = implementation?.let { + ImmutableMethodImplementation( + registerCount, + if (clearImplementation) emptyList() else it.instructions, + if (clearImplementation) emptyList() else it.tryBlocks, + if (clearImplementation) emptyList() else it.debugItems, + ) + } + return ImmutableMethod( + definingClass, + name, + parameters, + returnType, + accessFlags, + annotations, + hiddenApiRestrictions, + clonedImplementation + ).toMutable() +} + /** * Return the resolved methods of [MethodFingerprint]s early. */ diff --git a/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/src/main/kotlin/app/revanced/util/ResourceUtils.kt index 7e4612034..f82f8c1a5 100644 --- a/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -27,8 +27,6 @@ fun PatchOption.lowerCaseOrThrow() = valueOrThrow() fun PatchOption.underBarOrThrow() = lowerCaseOrThrow() .replace(" ", "_") - .replace("(", "") - .replace(")", "") fun Node.adoptChild(tagName: String, block: Element.() -> Unit) { val child = ownerDocument.createElement(tagName) @@ -72,6 +70,47 @@ fun List.getResourceGroup(fileNames: Array) = map { directory -> ) } +fun ResourceContext.appendAppVersion(appVersion: String) { + addEntryValues( + "revanced_spoof_app_version_target_entries", + "@string/revanced_spoof_app_version_target_entry_" + appVersion.replace(".", "_"), + prepend = false + ) + addEntryValues( + "revanced_spoof_app_version_target_entry_values", + appVersion, + prepend = false + ) +} + +fun ResourceContext.addEntryValues( + attributeName: String, + attributeValue: String, + path: String = "res/values/arrays.xml", + prepend: Boolean = true, +) { + xmlEditor[path].use { + with(it.file) { + val resourcesNode = getElementsByTagName("resources").item(0) as Element + + val newElement: Element = createElement("item") + for (i in 0 until resourcesNode.childNodes.length) { + val node = resourcesNode.childNodes.item(i) as? Element ?: continue + + if (node.getAttribute("name") == attributeName) { + newElement.appendChild(createTextNode(attributeValue)) + + if (prepend) { + node.appendChild(newElement) + } else { + node.insertBefore(newElement, node.firstChild) + } + } + } + } + } +} + fun ResourceContext.copyFile( resourceGroup: List, path: String, @@ -219,7 +258,10 @@ internal fun NodeList.findElementByAttributeValue(attributeName: String, value: return null } -internal fun NodeList.findElementByAttributeValueOrThrow(attributeName: String, value: String): Element { +internal fun NodeList.findElementByAttributeValueOrThrow( + attributeName: String, + value: String +): Element { return findElementByAttributeValue(attributeName, value) ?: throw PatchException("Could not find: $attributeName $value") } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/fingerprint/LiteralValueFingerprint.kt b/src/main/kotlin/app/revanced/util/fingerprint/LiteralValueFingerprint.kt index ea7cf3ebb..729f7217f 100644 --- a/src/main/kotlin/app/revanced/util/fingerprint/LiteralValueFingerprint.kt +++ b/src/main/kotlin/app/revanced/util/fingerprint/LiteralValueFingerprint.kt @@ -21,7 +21,7 @@ abstract class LiteralValueFingerprint( opcodes: Iterable? = null, strings: Iterable? = null, // Has to be a supplier because the fingerprint is created before patches can set literals. - literalSupplier: () -> Long + literalSupplier: () -> Long, ) : MethodFingerprint( returnType = returnType, accessFlags = accessFlags, diff --git a/src/main/kotlin/app/revanced/util/fingerprint/MultiMethodFingerprint.kt b/src/main/kotlin/app/revanced/util/fingerprint/MultiMethodFingerprint.kt index b25b53876..54927e034 100644 --- a/src/main/kotlin/app/revanced/util/fingerprint/MultiMethodFingerprint.kt +++ b/src/main/kotlin/app/revanced/util/fingerprint/MultiMethodFingerprint.kt @@ -13,6 +13,9 @@ private typealias StringMatch = MethodFingerprintResult.MethodFingerprintScanRes private typealias StringsScanResult = MethodFingerprintResult.MethodFingerprintScanResult.StringsScanResult /** + * Taken from BiliRoamingX: + * https://github.com/BiliRoamingX/BiliRoamingX/blob/ae58109f3acdd53ec2d2b3fb439c2a2ef1886221/patches/src/main/kotlin/app/revanced/patches/bilibili/patcher/fingerprint/MultiMethodFingerprint.kt + * * Represents the [MethodFingerprint] for a method. * @param returnType The return type of the method. * @param accessFlags The access flags of the method. diff --git a/src/main/kotlin/app/revanced/util/patch/MultiMethodBytecodePatch.kt b/src/main/kotlin/app/revanced/util/patch/MultiMethodBytecodePatch.kt index fa137319a..fc3e5d18d 100644 --- a/src/main/kotlin/app/revanced/util/patch/MultiMethodBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/util/patch/MultiMethodBytecodePatch.kt @@ -6,6 +6,10 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.util.fingerprint.MultiMethodFingerprint import app.revanced.util.fingerprint.MultiMethodFingerprint.Companion.resolve +/** + * Taken from BiliRoamingX: + * https://github.com/BiliRoamingX/BiliRoamingX/blob/ae58109f3acdd53ec2d2b3fb439c2a2ef1886221/patches/src/main/kotlin/app/revanced/patches/bilibili/patcher/patch/MultiMethodBytecodePatch.kt + */ abstract class MultiMethodBytecodePatch( val fingerprints: Set = setOf(), val multiFingerprints: Set = setOf() diff --git a/src/main/resources/music/settings/host/values/arrays.xml b/src/main/resources/music/settings/host/values/arrays.xml index 6c3e25d26..525a55888 100644 --- a/src/main/resources/music/settings/host/values/arrays.xml +++ b/src/main/resources/music/settings/host/values/arrays.xml @@ -7,7 +7,7 @@ @string/revanced_change_start_page_entry_library @string/revanced_change_start_page_entry_subscription - + FEmusic_charts FEmusic_explore FEmusic_home @@ -41,7 +41,7 @@ @string/revanced_spoof_app_version_target_entry_6_11_52 @string/revanced_spoof_app_version_target_entry_4_27_53 - + 6.11.52 4.27.53 diff --git a/src/main/resources/music/settings/host/values/strings.xml b/src/main/resources/music/settings/host/values/strings.xml index 0e9c15303..fb78c5501 100644 --- a/src/main/resources/music/settings/host/values/strings.xml +++ b/src/main/resources/music/settings/host/values/strings.xml @@ -128,7 +128,6 @@ Info: Keeps the Report menu in the comments section intact. - General @@ -151,11 +150,6 @@ Info: List of component path builder strings to filter, separated by new lines. Invalid custom filter: %s. - Hide settings menu - "Hide elements of the settings menu. -This hides not only the YT Music settings menu, but also the ReVanced Extended settings menu." - Settings menu filter - List of settings menu names to filter, separated by new lines. Hide button shelf Hides the button shelf in the feed. Hide carousel shelf @@ -194,6 +188,7 @@ This does not bypass the age restriction. It just accepts it automatically."Select the spoof app version target. 4.27.53 - Disable Radio mode in Canadian regions 6.11.52 - Disable real-time lyrics + 7.16.53 - Restore old action bar @@ -262,6 +257,22 @@ This does not bypass the age restriction. It just accepts it automatically.""Returns the player layout to the old style. Some features may not work properly in the old player layout." + + + Settings menu + + Hide Family Center menu + Hide General menu + Hide Playback menu + Hide Data saving menu + Hide Downloads & storage menu + Hide Notifications menu + Hide Privacy & data menu + Hide Recommendations menu + Hide Get Music premium menu + Hide About menu + + Video @@ -282,6 +293,7 @@ Some features may not work properly in the old player layout." Failed to set quality. Changing default Wi-Fi quality to %s. + Return YouTube Dislike diff --git a/src/main/resources/music/translations/bg-rBG/strings.xml b/src/main/resources/music/translations/bg-rBG/strings.xml index 362ef96b5..2d65cd629 100644 --- a/src/main/resources/music/translations/bg-rBG/strings.xml +++ b/src/main/resources/music/translations/bg-rBG/strings.xml @@ -132,11 +132,6 @@ Филтриране на компонентите по имена. Невалиден потребителски филтър: %s. - Скрийте менюто „Настройки“ - "Скриване на елементи от менюто с настройки. -Това не само скрива менюто с настройки на YT Music, но и менюто с разширени настройки на ReVanced." - Филтър на менюто „Настройки“ - Списък с имена на менюта на параметри за филтриране, разделени с нов ред. Скриване на секцията с бутони Скриване на секцията с бутони в емисията. Скриване на рафта с Препоръчани @@ -194,6 +189,7 @@ Tartsa a lejátszót mindig minimálisra, még akkor is, ha egy másik számot játszik le. Включване на zen режим Добавя сив оттенък към видеоплейъра, за да намали напрежението на очите. + Редактиране на скоростите по избор на видеото Добавяне или смяна на възможните скорости diff --git a/src/main/resources/music/translations/bn/strings.xml b/src/main/resources/music/translations/bn/strings.xml index 7ff7361ee..3d60684fe 100644 --- a/src/main/resources/music/translations/bn/strings.xml +++ b/src/main/resources/music/translations/bn/strings.xml @@ -53,6 +53,7 @@ প্লেয়ারকে স্থায়ীভাবে মিনিমাইজ করে রাখুন এমনকি যদি অন্য ট্র্যাক চালানো হয়। জেন মোড সক্রিয় করুন চোখের চাপ কমাতে ভিডিও প্লেয়ারে ধূসর আভা যোগ করুন। + কাস্টম প্লেব্যাক স্পিড সম্পাদনা করুন পাওয়া যাচ্ছে এমন প্লেব্যাক স্পিড যুক্ত বা পরিবর্তন করুন diff --git a/src/main/resources/music/translations/cs-rCZ/strings.xml b/src/main/resources/music/translations/cs-rCZ/strings.xml index 3bb063a58..d0f570fb2 100644 --- a/src/main/resources/music/translations/cs-rCZ/strings.xml +++ b/src/main/resources/music/translations/cs-rCZ/strings.xml @@ -46,6 +46,7 @@ Zachovat přehrávač trvale minimalizovaný, i když je přehrávána jiná skladba. Povolit zen mod Přidá šedý odstín do přehrávače videa ke snížení namáhání očí. + diff --git a/src/main/resources/music/translations/el-rGR/strings.xml b/src/main/resources/music/translations/el-rGR/strings.xml index ee5bbb920..ba5e96c1c 100644 --- a/src/main/resources/music/translations/el-rGR/strings.xml +++ b/src/main/resources/music/translations/el-rGR/strings.xml @@ -135,11 +135,6 @@ Λίστα από συμβολοσειρές στοιχείων που θα φιλτραριστούν, διαχωρισμένες με νέες γραμμές. Μη έγκυρο φίλτρο: %s. - Φιλτράρισμα του μενού ρυθμίσεων - "Απόκρυψη στοιχείων του μενού ρυθμίσεων YouTube. -Αυτή η λειτουργία γίνεται να κρύψει και το μενού ρυθμίσεων ReVanced Extended." - Αλλαγή φίλτρου του μενού ρυθμίσεων - Λίστα ονομάτων των επιλογών του μενού ρυθμίσεων για φιλτράρισμα, διαχωρισμένα με νέες γραμμές. Απόκρυψη ενότητας κουμπιών Απόκρυψη της ενότητας κουμπιών στη ροή. Απόκρυψη ενότητας καρουζέλ @@ -178,6 +173,7 @@ Επιλέξτε την έκδοση εφαρμογής που θα χρησιμοποιηθεί. 4.27.53 - Απενεργοποίηση λειτουργίας ραδιοφώνου σε περιοχές του Καναδά 6.11.52 - Απενεργοποίηση στίχων σε πραγματικό χρόνο + 7.16.53 - Επαναφορά παλιάς γραμμής ενεργειών Γραμμή πλοήγησης Μαύρη γραμμής πλοήγησης @@ -239,6 +235,18 @@ Οθόνη αναπαραγωγής παλιού στυλ "Επιστροφή της εμφάνισης της οθόνης αναπαραγωγής στο παλιό στυλ. Κάποιες λειτουργίες ενδέχεται να μη λειτουργούν σωστά στην παλιά εμφάνιση της οθόνης αναπαραγωγής." + + Μενού ρυθμίσεων + Απόκρυψη μενού «Οικογενειακό Κέντρο» + Απόκρυψη μενού «Γενικά» + Απόκρυψη μενού «Αναπαραγωγή» + Απόκρυψη μενού «Εξοικονόμηση δεδομένων» + Απόκρυψη μενού «Λήψεις & αποθηκευτικός χώρος» + Απόκρυψη μενού «Ειδοποιήσεις» + Απόκρυψη μενού «Απόρρητο & δεδομένα» + Απόκρυψη μενού «Προτάσεις» + Απόκρυψη μενού «Αποκτήστε το Music Premium» + Απόκρυψη μενού «Πληροφορίες για το YouTube Music» Βίντεο Επεξεργασία ταχυτήτων αναπαραγωγής diff --git a/src/main/resources/music/translations/es-rES/strings.xml b/src/main/resources/music/translations/es-rES/strings.xml index 52e947dc8..454403370 100644 --- a/src/main/resources/music/translations/es-rES/strings.xml +++ b/src/main/resources/music/translations/es-rES/strings.xml @@ -9,7 +9,7 @@ Cuenta Ocultar menú de cuenta - Oculta elementos del menú de la cuenta. + Oculta los elementos del menú de la cuenta usando el filtro personalizado. Filtro de menú de cuenta Lista de nombres del menú de la cuenta a filtrar separados por una nueva línea. Ocultar componente vacío @@ -135,11 +135,6 @@ Esta función aún está en desarrollo, por lo que puede ser inestable." Filtra los nombres de los componentes, separados por líneas. Filtro personalizado no válido: %s. - Ocultar menú de configuración - "Oculta elementos del menú de configuración. -Esto oculta no solo el menú de ajustes de YT Music, sino también el menú de ajustes de ReVanced Extended." - Filtro de menú de configuración - Lista de nombres del menú de configuración de YouTube a filtrar separados por una nueva línea. Ocultar estante de botones Oculta el estante de botones de la página de inicio y del explorador. Ocultar estante de carrusel @@ -178,6 +173,7 @@ Esto no evita la restricción de edad. Solo la acepta automáticamente."Seleccione el objetivo de la versión de la app a modificar. 4.27.53 - Desactivar el modo radio en las regiones canadienses 6.11.52 - Desactivar letras en tiempo real + 7.16.53 - Restaurar la antigua barra de acción Barra de navegación Activar barra de navegación negra @@ -239,6 +235,18 @@ Esto no evita la restricción de edad. Solo la acepta automáticamente."Activar diseño antiguo del reproductor "Devuelve el diseño del reproductor al estilo antiguo. Algunas características pueden no funcionar correctamente en la disposición del reproductor antiguo." + + Menú de ajustes + Ocultar menú de Centro Familiar + Ocultar menú general + Ocultar menú de reproducción + Ocultar menú de ahorro de datos + Ocultar Descargas & menú de almacenamiento + Ocultar menú de notificaciones + Ocultar menú privacidad de & datos + Ocultar menú de recomendaciones + Ocultar menú premium de Get Music + Ocultar menú Acerca de Video Editar velocidades de reproducción personalizadas diff --git a/src/main/resources/music/translations/fr-rFR/strings.xml b/src/main/resources/music/translations/fr-rFR/strings.xml index 652759317..d9dc423dd 100644 --- a/src/main/resources/music/translations/fr-rFR/strings.xml +++ b/src/main/resources/music/translations/fr-rFR/strings.xml @@ -135,11 +135,6 @@ Info : Filtrer la liste des noms du composant séparés par un saut de ligne. Filtre personnalisé invalide : %s. - Masquer le menu \'Paramètres\' - "Masquer les éléments du menu Paramètre. -Cela masque non seulement le menu paramètre de YT Music, mais également le menu paramètre de ReVanced Extended." - Filtre du menu \'Paramètres\' - Liste des noms du menu paramètre à filtrer, séparé par des sauts de lignes. Masquer les étagères de boutons Masque les étagères à boutons dans les flux. Masquer les étagères à suggestions @@ -178,6 +173,7 @@ Cela ne contourne pas la restriction d'âge, mais le confirme automatiquement."< Sélectionner la version de l\'application à falsifier. 4.27.53 - Désactive le mode radio dans les régions canadiennes 6.11.52 - Désactive les paroles en temps réel + 7.16.53 - Restaurer l\'ancienne barre d\'action Barre de navigation Activer la barre de navigation en noir @@ -239,6 +235,18 @@ Cela ne contourne pas la restriction d'âge, mais le confirme automatiquement."< Restaurer l\'ancienne mise en page du lecteur "Restaure l'ancien style de la mise en page du lecteur. Certaines fonctions peuvent ne pas fonctionner sur l'ancienne mise en page." + + Menu Paramètres + Masquer le menu \'Centre pour la famille\' + Masquer le menu \'Paramètres généraux\' + Masquer le menu \"Lecture\" + Masquer le menu \'Économie de données\' + Masquer le menu \'Téléchargements et stockage\' + Masquer le menu \'Notifications\' + Masquer le menu \'Confidentialité et données\' + Masquer le menu \'Recommandations\' + Masquer le menu \'Obtenir Music Premium\' + Masquer le menu \'À propos\' Qualité et vitesse vidéo Éditez les vitesses de lecture personnalisées diff --git a/src/main/resources/music/translations/hu-rHU/strings.xml b/src/main/resources/music/translations/hu-rHU/strings.xml index 7d984d7ee..f19a1e251 100644 --- a/src/main/resources/music/translations/hu-rHU/strings.xml +++ b/src/main/resources/music/translations/hu-rHU/strings.xml @@ -134,11 +134,6 @@ Információ: A szűrendő elemek útvonal-építő stringjeinek listája, új sorokkal elválasztva. Érvénytelen egyéni szűrő: %s. - Beállítások menü elrejtése - "A beállítások menü elemeinek elrejtése. -Ez nemcsak az YT Music beállítások menüjét, hanem a ReVanced Extended beállítások menüjét is elrejti." - Beállítások menü szűrő - A beállítások menüben szűrendő nevek listája, új sorokkal elválasztva. Gomb polc elrejtése Elrejti a gomb polcot a főoldalon. Forduló polc elrejtése @@ -238,6 +233,7 @@ Ez nem kerüli meg a korhatárkorlátozást. Csak automatikusan elfogadja azt."< Régi lejátszó kinézet visszaállítása "Visszaállítja a lejátszó elrendezését a régi stílusra. Előfordulhat, hogy egyes funkciók nem működnek megfelelően a régi lejátszó elrendezésben." + Videó Egyéni lejátszási sebességek szerkesztése diff --git a/src/main/resources/music/translations/id-rID/strings.xml b/src/main/resources/music/translations/id-rID/strings.xml index 92249c082..2d8bc5653 100644 --- a/src/main/resources/music/translations/id-rID/strings.xml +++ b/src/main/resources/music/translations/id-rID/strings.xml @@ -132,11 +132,6 @@ Info: Memfilter nama komponen dengan baris yang dipisahkan. Invalid custom filter: %s. - Sembunyikan menu pengaturan - "Sembunyikan elemen menu pengaturan. -Ini tidak hanya menyembunyikan menu pengaturan YT Music, tetapi juga menu pengaturan ReVanced Extended." - Filter menu pengaturan - Daftar nama menu pengaturan yang akan difilter, dipisahkan dengan baris baru. Sembunyikan rak tombol Menyembunyikan rak tombol dari beranda dan eksplorasi. Sembunyikan rak korsel @@ -236,6 +231,7 @@ This does not bypass the age restriction. It just accepts it automatically."Restore old player layout "Returns the player layout to the old style. Some features may not work properly in the old player layout." + Video Edit kecepatan pemutaran kustom diff --git a/src/main/resources/music/translations/in/strings.xml b/src/main/resources/music/translations/in/strings.xml index 92249c082..2d8bc5653 100644 --- a/src/main/resources/music/translations/in/strings.xml +++ b/src/main/resources/music/translations/in/strings.xml @@ -132,11 +132,6 @@ Info: Memfilter nama komponen dengan baris yang dipisahkan. Invalid custom filter: %s. - Sembunyikan menu pengaturan - "Sembunyikan elemen menu pengaturan. -Ini tidak hanya menyembunyikan menu pengaturan YT Music, tetapi juga menu pengaturan ReVanced Extended." - Filter menu pengaturan - Daftar nama menu pengaturan yang akan difilter, dipisahkan dengan baris baru. Sembunyikan rak tombol Menyembunyikan rak tombol dari beranda dan eksplorasi. Sembunyikan rak korsel @@ -236,6 +231,7 @@ This does not bypass the age restriction. It just accepts it automatically."Restore old player layout "Returns the player layout to the old style. Some features may not work properly in the old player layout." + Video Edit kecepatan pemutaran kustom diff --git a/src/main/resources/music/translations/it-rIT/strings.xml b/src/main/resources/music/translations/it-rIT/strings.xml index 68fa2a070..7b6db22eb 100644 --- a/src/main/resources/music/translations/it-rIT/strings.xml +++ b/src/main/resources/music/translations/it-rIT/strings.xml @@ -48,6 +48,7 @@ Ricorda lo stato della ripetizione. Ricorda lo stato della riproduzione casuale Ricorda lo stato della riproduzione casuale. + Modifica velocità di riproduzione personalizzate Aggiungi o modifica le velocità di riproduzione disponibili diff --git a/src/main/resources/music/translations/ja-rJP/strings.xml b/src/main/resources/music/translations/ja-rJP/strings.xml index 4d811c9c8..b7c653df4 100644 --- a/src/main/resources/music/translations/ja-rJP/strings.xml +++ b/src/main/resources/music/translations/ja-rJP/strings.xml @@ -134,11 +134,6 @@ コンポーネント名でフィルター (改行区切り) 無効なカスタムフィルターです: %s。 - 設定メニューを非表示 - "設定の要素を非表示にします。 -YT Music の設定だけでなく、ReVanced Extended の設定も非表示にします。" - 設定メニューフィルター - フィルタリングするYT Music 設定メニュー名のリスト(改行区切り) ボタン欄を非表示 ホームタブや探索タブのボタン欄を非表示にします。 カルーセル欄を非表示 @@ -238,6 +233,7 @@ YT Music の設定だけでなく、ReVanced Extended の設定も非表示に 古いプレーヤーのレイアウト "プレイヤーのレイアウトを古いスタイルに戻します。 一部の機能は正しく動作しない可能性があります。" + 動画 カスタム再生速度の編集 diff --git a/src/main/resources/music/translations/ko-rKR/strings.xml b/src/main/resources/music/translations/ko-rKR/strings.xml index 2d9447280..09edd7da1 100644 --- a/src/main/resources/music/translations/ko-rKR/strings.xml +++ b/src/main/resources/music/translations/ko-rKR/strings.xml @@ -135,11 +135,6 @@ 필터링할 구성요소를 줄바꿈으로 구분하여 설정합니다. 잘못된 필터 값입니다: %s - 설정 메뉴 제거 - "설정 메뉴 구성요소를 숨깁니다. -YT Music 설정 메뉴뿐만 아니라 ReVanced Extended 설정 메뉴도 숨겨집니다." - 설정 메뉴 필터 - 필터링할 설정 메뉴 이름을 줄바꿈으로 구분하여 설정합니다. 버튼형 선반 제거 피드에서 버튼형 선반을 숨깁니다. 좌우 슬라이드형 선반 제거 @@ -165,7 +160,7 @@ YT Music 설정 메뉴뿐만 아니라 ReVanced Extended 설정 메뉴도 숨겨 음성 검색 버튼 제거 툴바에서 음성 검색 버튼을 숨깁니다. 이전 보관함 선반으로 복원 - 이전 보관함 탭으로 복원합니다. (실험적인 기능) + 이전 보관함 탭으로 복원합니다. (실험 기능) 시청 경고 다이얼로그 제거 "시청 경고 다이얼로그를 제거합니다. @@ -179,6 +174,7 @@ YT Music 설정 메뉴뿐만 아니라 ReVanced Extended 설정 메뉴도 숨겨 변경할 앱 버전을 선택하세요. 4.27.53 - 캐나다 지역에서 뮤직 스테이션 모드를 비활성화합니다. 6.11.52 - 실시간 가사를 비활성화합니다. + 7.16.53 - 이전 액션바로 복원합니다. 하단바 검정 하단바 활성화 @@ -224,7 +220,7 @@ YT Music 설정 메뉴뿐만 아니라 ReVanced Extended 설정 메뉴도 숨겨 커뮤니티 가이드라인 제거 댓글 섹션 상단에서 커뮤니티 가이드라인을 숨깁니다. 타임스탬프, 이모지 버튼 제거 - 댓글을 입력할 때, 타임스탬프와 이모지 버튼을 숨깁니다. + 댓글을 입력할 때, 타임스탬프 및 이모지 버튼을 숨깁니다. 두 번 누르기 오버레이 필터 두 번 눌러서 탐색할 때 표시되는 어두운 오버레이를 숨깁니다. 전체 화면에서 공유 버튼 제거 @@ -240,6 +236,18 @@ YT Music 설정 메뉴뿐만 아니라 ReVanced Extended 설정 메뉴도 숨겨 이전 플레이어 레이아웃으로 복원 "이전 플레이어 레이아웃으로 복원합니다. 이전 플레이어 레이아웃에서 일부 기능이 제대로 작동하지 않을 수 있습니다." + + 설정 메뉴 + 가족 센터 메뉴 숨기기 + 일반 메뉴 숨기기 + 재생 메뉴 숨기기 + 데이터 절약 메뉴 숨기기 + 오프라인 저장 및 저장용량 메뉴 숨기기 + 알림 메뉴 숨기기 + 개인 정보 보호 및 데이터 메뉴 숨기기 + 맞춤 콘텐츠 메뉴 숨기기 + Music Premium 가입 메뉴 숨기기 + YouTube Music 정보 메뉴 숨기기 동영상 사용자 정의 재생 속도 편집 diff --git a/src/main/resources/music/translations/nl-rNL/strings.xml b/src/main/resources/music/translations/nl-rNL/strings.xml index 10775280d..7b38fab94 100644 --- a/src/main/resources/music/translations/nl-rNL/strings.xml +++ b/src/main/resources/music/translations/nl-rNL/strings.xml @@ -166,6 +166,7 @@ Bekende problemen: Onthoudt de status van de herhaling. Onthoud shuffle status Onthoudt de status van het shuffle. + Bewerk aangepaste afspeelsnelheden Voeg toe of verander de beschikbare afspeelsnelheden diff --git a/src/main/resources/music/translations/pl-rPL/strings.xml b/src/main/resources/music/translations/pl-rPL/strings.xml index a286e2d99..4ac6674c8 100644 --- a/src/main/resources/music/translations/pl-rPL/strings.xml +++ b/src/main/resources/music/translations/pl-rPL/strings.xml @@ -135,11 +135,6 @@ Informacje: Lista tekstów tworzących ścieżkę komponentów do filtrowania, które muszą być oddzielone nowymi liniami. Nieprawidłowy własny filtr: %s. - Ukryj menu ustawień - "Ukrywa elementy menu ustawień. -Działa nie tylko na elementy menu ustawień YT Music, lecz także ReVanced Extended." - Filtr menu ustawień - Lista menu ustawień do filtrowania, która musi być oddzielona nowymi liniami. Ukryj półki z przyciskami Ukrywa półkę z przyciskami na stronie głównej. Ukryj półki z karuzelami @@ -178,6 +173,7 @@ Nie pomija to ograniczeń wiekowych, lecz akceptuje je automatycznie." Wybierz wersję, którą chcesz oszukiwać. 4.27.53 - Wyłącz tryb radia w rejonach kanadyjskich 6.11.52 - Wyłącz teksty w czasie rzeczywistym + 7.16.53 - Przywróć stary pasek akcji Pasek nawigacji Włącz czarny pasek nawigacji @@ -239,6 +235,18 @@ Nie pomija to ograniczeń wiekowych, lecz akceptuje je automatycznie." Przywróć stary układ odtwarzacza "Przywraca układ odtwarzacza do starego wyglądu. Niektóre ustawienia mogą nie działać poprawnie ze starym układem odtwarzacza." + + Menu ustawień YouTube Music + Ukryj menu centrum rodziny + Ukryj menu ustawień ogólnych + Ukryj menu odtwarzania + Ukryj menu oszczędzania danych + Ukryj menu pobranych i miejsca na dane + Ukryj menu powiadomień + Ukryj menu prywatności i danych + Ukryj menu rekomendacji + Ukryj menu zasubskrybowania Music Premium + Ukryj menu informacji o YouTube Music Teledyski Edytuj niestandardowe prędkości odtwarzania diff --git a/src/main/resources/music/translations/pt-rBR/strings.xml b/src/main/resources/music/translations/pt-rBR/strings.xml index 01186c0be..d030d73f1 100644 --- a/src/main/resources/music/translations/pt-rBR/strings.xml +++ b/src/main/resources/music/translations/pt-rBR/strings.xml @@ -135,11 +135,6 @@ Informações: Lista de componentes a serem filtradas separadas por uma nova linha. Filtro personalizado inválido: %s. - Ocultar menu de configurações - "Oculte elementos do menu de configurações. -Isso oculta não apenas o menu de configurações do YT Music, mas também o menu de configurações do ReVanced Extended." - Filtro do menu configurações - Lista de nomes do menu de configurações para filtrar, separados por novas linhas. Ocultar painel de botões Oculta o painel de botões no feed. Ocultar painel de carrossel @@ -178,6 +173,7 @@ Isso não ignora a restrição de idade, apenas aceita isso automaticamente."Selecione a versão do app para falsificação. 4.27.53 - Desativar modo de Rádio em regiões Canadenses 6.11.52 - Desativar letras em tempo real + 7.16.53 - Restaurar barra de ação antiga Barra de Navegação Ativar barra de navegação preta @@ -239,6 +235,18 @@ Isso não ignora a restrição de idade, apenas aceita isso automaticamente."Restaurar antigo layout do reprodutor "Retorna o layout do reprodutor ao estilo antigo. Alguns recursos podem não funcionar corretamente no layout antigo do reprodutor." + + Menu de configurações + Ocultar menu Central da família + Ocultar menu Geral + Ocultar menu Reprodução + Ocultar menu Economia de dados + Ocultar menu Downloads e armazenamento + Ocultar Menu Notificações + Ocultar menu Privacidade e dados + Ocultar menu Recomendações + Ocultar menu Conheça o Music Premium + Ocultar menu Sobre o YouTube Music Vídeo Editar velocidades de reprodução personalizadas diff --git a/src/main/resources/music/translations/ro-rRO/strings.xml b/src/main/resources/music/translations/ro-rRO/strings.xml index 8bb126d26..13edef2ae 100644 --- a/src/main/resources/music/translations/ro-rRO/strings.xml +++ b/src/main/resources/music/translations/ro-rRO/strings.xml @@ -64,6 +64,7 @@ Probleme cunoscute: Reține starea repetării. Reține starea redării aleatorii Reține starea redării aleatorii. + Modifică vitezele de redare personalizate Adaugă sau modifică vitezele de redare disponibile. diff --git a/src/main/resources/music/translations/ru-rRU/strings.xml b/src/main/resources/music/translations/ru-rRU/strings.xml index ddbe67a1c..3d6335a57 100644 --- a/src/main/resources/music/translations/ru-rRU/strings.xml +++ b/src/main/resources/music/translations/ru-rRU/strings.xml @@ -134,11 +134,6 @@ Настройте, какие компоненты фильтровать, обозначая конец каждого из них новой строкой. Недопустимый пользовательский фильтр: %s. - Скрыть меню настроек - "Скрывает элементы меню настроек. -При этом скрывается не только меню настроек YT Music, но и меню настроек ReVanced Extended." - Фильтр настроек меню - Список названий меню настроек для фильтрации, разделенных новыми строками. Скрыть ряд кнопок Скрывает ряд кнопок с главной страницы и со вкладки \"Навигатор\". Скрыть карусель треков @@ -238,6 +233,7 @@ Восстановить старый интерфейс проигрывателя "Возвращает интерфейс проигрывателя к старому стилю. Некоторые вещи могут работать неправильно в старом интерфейсе проигрывателя." + Видео Изменить скорости diff --git a/src/main/resources/music/translations/tr-rTR/strings.xml b/src/main/resources/music/translations/tr-rTR/strings.xml index 9f119440b..8291e7e9a 100644 --- a/src/main/resources/music/translations/tr-rTR/strings.xml +++ b/src/main/resources/music/translations/tr-rTR/strings.xml @@ -132,11 +132,6 @@ Bilgi: Yeni satırlarla ayrılmış olarak hangi bileşenlerin filtreleneceğini yapılandırın. Geçersiz özel filtre: %s. - Ayarlar menüsünü gizle - "Ayarlar menüsünün öğelerini gizleyin. -Bu, yalnızca YT Music ayarlar menüsünü değil aynı zamanda ReVanced Extended ayarlar menüsünü de gizler." - Ayarları menüsü filtresi - Yeni bir satırla ayrılmış olarak filtrelenecek ayarlar menüsü adlarının listesi. Tuş rafını gizle Düğme rafını ana sayfadan ve keşfet sekmesinden gizler. Atlıkarınca rafını gizle @@ -236,6 +231,7 @@ Bu, yalnızca YT Music ayarlar menüsünü değil aynı zamanda ReVanced Extende Eski oynatıcı düzenini geri getir "Oynatıcı düzenini eski stile döndürün. Eski oynatıcı düzeninde bazı ayarlar düzgün çalışmayabilir." + Video Özel oynatma hızlarını düzenle diff --git a/src/main/resources/music/translations/uk-rUA/strings.xml b/src/main/resources/music/translations/uk-rUA/strings.xml index a7aa08dc4..44f389962 100644 --- a/src/main/resources/music/translations/uk-rUA/strings.xml +++ b/src/main/resources/music/translations/uk-rUA/strings.xml @@ -135,11 +135,6 @@ Список рядків конструктора шляхів компонентів для фільтрування, розділених новими рядками. Недопустимий користувацький фільтр: %s. - Приховати меню налаштувань - "Приховує елементи меню налаштувань. -Це приховує не лише меню налаштувань YT Music, а й меню налаштувань ReVanced Extended." - Фільтр меню налаштувань - Список назв меню налаштувань для фільтрування, розділених новим рядком. Приховати категорії в Навігації Приховує кнопки \"Новинки\", \"Хіт-паради\", \"Настрій і жанри\" на вкладці \"Навігація\". Приховати карусель треків @@ -147,7 +142,7 @@ Приховати полицю карток списку відтворення Приховує полицю карток списку відтворення в стрічці. Приховати полицю \"Семпли\" - Приховує полицю \"Семпли\" у стрічці. + Приховує полицю \"Семпли для вас\" у стрічці. Приховати кнопку \"Трансляція\" Приховує кнопку \"Трансляція\" в плеєрі та мініплеєрі. Приховати панель категорій @@ -178,6 +173,7 @@ Виберіть зі списку цільову версію підробки програми. 4.27.53 - Вимкнення режиму радіо в канадських регіонах 6.11.52 - Вимкнення динамічних текстів (караоке) + 7.16.53 - Відновлення старої панелі дій Панель навігації Увімкнути чорну панель навігації @@ -239,6 +235,18 @@ Відновити старий інтерфейс плеєра "Повертає інтерфейс плеєра до старого стилю. Деякі функції можуть працювати не належним чином у старому інтерфейсі плеєра." + + Меню налаштувань + Приховати \"Сімейний Центр\" + Приховати \"Загальні\" + Приховати \"Відтворення\" + Приховати \"Заощадження трафіку\" + Приховати \"Завантаження й зберігання\" + Приховати \"Сповіщення\" + Приховати \"Дані й конфіденційність\" + Приховати \"Рекомендації\" + Приховати \"Підписатися на Music Premium\" + Приховати \"Про YouTube Music\" Відео Редагувати користувацькі швидкості відтворення diff --git a/src/main/resources/music/translations/vi-rVN/strings.xml b/src/main/resources/music/translations/vi-rVN/strings.xml index 97f96f352..ff940ccae 100644 --- a/src/main/resources/music/translations/vi-rVN/strings.xml +++ b/src/main/resources/music/translations/vi-rVN/strings.xml @@ -70,12 +70,12 @@ Hạn chế: • Ảnh bìa Album trong thẻ Thư viện (Danh sách phát, Podcast, Bài hát, Đĩa nhạc, Nghệ sĩ,...) cũng thu gọn theo. • Bố cục Hẹn giờ ngủ có thể xuất hiện bất thường." - Bật/Tắt Cắt bỏ khoảng im lặng - "Thêm nút Bật/Tắt Cắt bỏ khoảng im lặng vào tuỳ chọn tốc độ phát. + Cắt bỏ khoảng lặng + "Thêm tính năng Cắt bỏ khoảng lặng vào mục tuỳ chọn tốc độ phát. Cụ thể: - • Tính năng dành cho podcast. - • Tính năng vẫn đang được phát triển nên có thể chưa ổn định." + • Tính năng này dành cho podcast. + • Tính năng này vẫn đang được phát triển nên có thể chưa ổn định." Ẩn các nút Thích và Không thích Ẩn thành phần 3 cột Ẩn mục Thêm vào danh sách chờ @@ -135,11 +135,6 @@ Hạn chế: Nhập tên các mục mà bạn muốn lọc được phân cách bằng dòng. Bộ lọc tuỳ chỉnh không hợp lệ: %s. - Ẩn menu cài đặt - "Ẩn các thành phần của menu Cài đặt. -Khi bật không chỉ ẩn menu Cài đặt YT Music, mà cả menu Cài đặt ReVanced Extended." - Cài đặt bộ lọc menu - Danh sách tên menu Cài đặt cần lọc, cách nhau từng dòng một. Ẩn khối danh mục Ẩn khối danh mục ở cuối thẻ Trang chủ và đầu thẻ Khám phá. Ẩn các kệ được cá nhân hoá @@ -154,7 +149,7 @@ Khi bật không chỉ ẩn menu Cài đặt YT Music, mà cả menu Cài đặt Ẩn thanh danh mục. Ẩn nút nổi Ẩn nút nổi trong thẻ Thư viện. - Ẩn nút \'Chạm để nâng cấp\' + Ẩn nút Nhấn để cập nhật Ẩn nút \'Chạm để nâng cấp\'. Ẩn nút Video đã xem Ẩn nút Video đã xem khỏi thanh công cụ. @@ -178,6 +173,7 @@ Lưu ý:\n- Tuỳ chọn này sẽ thay đổi giao diện ứng dụng, tuy nhi Chọn phiên bản YouTube Music mà bạn muốn giả mạo. 4.27.53 - Tắt chế độ Đài phát ở một số vùng của Canada 6.11.52 - Tắt lời bài hát theo thời gian thực + 7.16.53 - Khôi phục bảng nút thao tác cũ Thanh điều hướng Thanh điều hướng màu đen @@ -239,6 +235,18 @@ Lưu ý:\n- Tuỳ chọn này sẽ thay đổi giao diện ứng dụng, tuy nhi Khôi phục bố cục trình phát kiểu cũ "Khôi phục bố cục trình phát về kiểu cũ. \nLưu ý: Một số tính năng có thể không hoạt động bình thường trong bố cục trình phát kiểu cũ." + + Mục Cài đặt + Ẩn mục Trung tâm dành cho gia đình + Ẩn mục Chung + Ẩn mục Tính năng phát + Ẩn mục Chế độ tiết kiệm dữ liệu + Ẩn mục Nhạc tải xuống & bộ nhớ + Ẩn mục Thông báo + Ẩn mục Quyền riêng tư & dữ liệu + Ẩn mục Đề xuất + Ẩn mục Mua Music Premium + Ẩn mục Giới thiệu về Youtube music Video Chỉnh sửa tốc độ phát @@ -342,8 +350,12 @@ Lưu ý:\n- Tuỳ chọn này sẽ thay đổi giao diện ứng dụng, tuy nhi Bật ghi nhật ký gỡ lỗi. Bật nhật ký gỡ lỗi bộ đệm Bao gồm bộ đệm trong nhật ký gỡ lỗi. - Codec Opus - "Áp dụng codec âm thanh Opus thay vì MP4A." + Bộ giải mã OPUS + "Áp dụng bộ giải mã OPUS nếu phản hồi của trình phát bao gồm nó. + +Cụ thể: +• Ứng dụng YouTube Music mới nhất đặt mặc định là bộ giải mãi OPUS. +• Điều này chỉ áp dụng cho người dùng giả mạo với các phiên bản ứng dụng rất cũ." Mở GmsCore Mở MicroG để thiết lập tính năng nhận thông báo và các tuỳ chọn khác. GmsCore chưa được cài đặt. Hãy cài đặt nó. diff --git a/src/main/resources/music/translations/zh-rCN/strings.xml b/src/main/resources/music/translations/zh-rCN/strings.xml index d02e2d4cc..465790dc1 100644 --- a/src/main/resources/music/translations/zh-rCN/strings.xml +++ b/src/main/resources/music/translations/zh-rCN/strings.xml @@ -219,6 +219,7 @@ 记住重复播放状态 记住随机播放状态 记住随机播放状态 + 编辑自定义播放速度 添加或更改可用的播放速度 diff --git a/src/main/resources/music/translations/zh-rTW/strings.xml b/src/main/resources/music/translations/zh-rTW/strings.xml index f022707e6..b575a5e60 100644 --- a/src/main/resources/music/translations/zh-rTW/strings.xml +++ b/src/main/resources/music/translations/zh-rTW/strings.xml @@ -226,6 +226,7 @@ 恢復舊版播放器介面 "將播放器介面恢復為舊樣式 某些功能在舊的播放器介面中可能無法正常運作" + 影片 編輯自訂播放速度 diff --git a/src/main/resources/music/visual/shared/drawable/revanced_preference_screen_settings_icon.xml b/src/main/resources/music/visual/shared/drawable/revanced_preference_screen_settings_icon.xml new file mode 100644 index 000000000..984b1fc6d --- /dev/null +++ b/src/main/resources/music/visual/shared/drawable/revanced_preference_screen_settings_icon.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_premium_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_premium_wordmark_header_dark.png deleted file mode 100644 index 5ba804ae0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_premium_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_premium_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_premium_wordmark_header_light.png deleted file mode 100644 index 5ba804ae0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_premium_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_wordmark_header_dark.png deleted file mode 100644 index 5ba804ae0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_wordmark_header_light.png deleted file mode 100644 index 5ba804ae0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-hdpi/yt_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_premium_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_premium_wordmark_header_dark.png deleted file mode 100644 index 3542f98f5..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_premium_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_premium_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_premium_wordmark_header_light.png deleted file mode 100644 index 3542f98f5..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_premium_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_wordmark_header_dark.png deleted file mode 100644 index 3542f98f5..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_wordmark_header_light.png deleted file mode 100644 index 3542f98f5..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-mdpi/yt_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_premium_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_premium_wordmark_header_dark.png deleted file mode 100644 index c12303a7d..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_premium_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_premium_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_premium_wordmark_header_light.png deleted file mode 100644 index c12303a7d..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_premium_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_wordmark_header_dark.png deleted file mode 100644 index c12303a7d..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_wordmark_header_light.png deleted file mode 100644 index c12303a7d..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xhdpi/yt_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_premium_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_premium_wordmark_header_dark.png deleted file mode 100644 index aece8cfd9..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_premium_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_premium_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_premium_wordmark_header_light.png deleted file mode 100644 index aece8cfd9..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_premium_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_wordmark_header_dark.png deleted file mode 100644 index aece8cfd9..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_wordmark_header_light.png deleted file mode 100644 index aece8cfd9..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxhdpi/yt_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_premium_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_premium_wordmark_header_dark.png deleted file mode 100644 index 0ba37b7c0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_premium_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_premium_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_premium_wordmark_header_light.png deleted file mode 100644 index 0ba37b7c0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_premium_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_wordmark_header_dark.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_wordmark_header_dark.png deleted file mode 100644 index 0ba37b7c0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_wordmark_header_dark.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_wordmark_header_light.png b/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_wordmark_header_light.png deleted file mode 100644 index 0ba37b7c0..000000000 Binary files a/src/main/resources/youtube/branding/youtube_minimal_header/header/drawable-xxxhdpi/yt_wordmark_header_light.png and /dev/null differ diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/settings/drawable/revanced_extended_settings_key_icon.xml b/src/main/resources/youtube/branding/youtube_minimal_header/settings/drawable/revanced_extended_settings_key_icon.xml deleted file mode 100644 index 274b2e64f..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/settings/drawable/revanced_extended_settings_key_icon.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__1__0.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__1__0.xml deleted file mode 100644 index 35eb1ac38..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__1__0.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__1__1.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__1__1.xml deleted file mode 100644 index 35eb1ac38..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__1__1.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__2__0.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__2__0.xml deleted file mode 100644 index d6566bd9f..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__2__0.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__2__1.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__2__1.xml deleted file mode 100644 index d6566bd9f..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__2__1.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__3__0.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__3__0.xml deleted file mode 100644 index d6566bd9f..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__3__0.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__3__1.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__3__1.xml deleted file mode 100644 index d6566bd9f..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$$avd_anim__3__1.xml +++ /dev/null @@ -1,3 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__0.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__0.xml deleted file mode 100644 index 4d4459196..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__0.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__1.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__1.xml deleted file mode 100644 index 6e99759e1..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__1.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__2.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__2.xml deleted file mode 100644 index 15d9885e9..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__2.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__3.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__3.xml deleted file mode 100644 index 8d6ff8a2e..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__3.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__4.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__4.xml deleted file mode 100644 index d4e222862..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/$avd_anim__4.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/avd_anim.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/avd_anim.xml deleted file mode 100644 index 49266b4f4..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/drawable/avd_anim.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/main/resources/youtube/branding/youtube_minimal_header/splash/values-v31/styles.xml b/src/main/resources/youtube/branding/youtube_minimal_header/splash/values-v31/styles.xml deleted file mode 100644 index c7462f74a..000000000 --- a/src/main/resources/youtube/branding/youtube_minimal_header/splash/values-v31/styles.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/src/main/resources/youtube/settings/host/values/arrays.xml b/src/main/resources/youtube/settings/host/values/arrays.xml index 616c6bc4b..b84d97b2a 100644 --- a/src/main/resources/youtube/settings/host/values/arrays.xml +++ b/src/main/resources/youtube/settings/host/values/arrays.xml @@ -22,6 +22,20 @@ MIDDLE END + + @string/revanced_change_layout_entry_1 + @string/revanced_change_layout_entry_2 + @string/revanced_change_layout_entry_3 + @string/revanced_change_layout_entry_4 + @string/revanced_change_layout_entry_5 + + + ORIGINAL + SMALL_FORM_FACTOR + SMALL_FORM_FACTOR_WIDTH_DP + LARGE_FORM_FACTOR + LARGE_FORM_FACTOR_WIDTH_DP + @string/revanced_change_start_page_entry_default @string/revanced_change_start_page_entry_search @@ -196,12 +210,18 @@ 0 +1 +2 + +3 + +4 + +5 -1 0 1 2 + 3 + 4 + 5 @string/revanced_watch_history_type_entry_1 diff --git a/src/main/resources/youtube/settings/host/values/strings.xml b/src/main/resources/youtube/settings/host/values/strings.xml index 3826d132d..71bfacf39 100644 --- a/src/main/resources/youtube/settings/host/values/strings.xml +++ b/src/main/resources/youtube/settings/host/values/strings.xml @@ -278,7 +278,7 @@ Limitations: Hide UPCOMING video "Hide videos with UPCOMING label. -Note: Enabling this also hide Notify me button." +Note: Enabling this also hides the Notify me button." View count filter @@ -364,10 +364,12 @@ Limitation: Back button on the toolbar may not work." "Removes the viewer discretion dialog. This does not bypass the age restriction. It just accepts it automatically." - Enable phone layout - Spoofs the dpi to use some phone layouts. - Enable tablet layout - Spoofs the dpi to use some tablet layouts. + Change layout + Original + Phone + Phone (Max 480 dp) + Tablet + Tablet (Min 600 dp) Spoof app version Version spoofed @@ -524,13 +526,66 @@ If this setting do not take effect, try switching to Incognito mode." Settings menu Hide elements of the YouTube settings menu. - Hide YouTube settings menu - Hide elements of the YouTube settings menu. - YouTube settings menu filter - List of YouTube settings menu names to filter, separated by new lines. - "Account -Data saving -Captions" + Hide Family Center menu + Family Center menu is hidden. + Family Center menu is shown. + Hide General menu + General menu is hidden. + General menu is shown. + Hide Account menu + Account menu is hidden. + Account menu is shown. + Hide Data saving menu + Data saving menu is hidden. + Data saving menu is shown. + Hide Autoplay menu + Autoplay menu is hidden. + Autoplay menu is shown. + Hide Video quality preferences menu + Video quality preferences menu is hidden. + Video quality preferences menu is shown. + Hide Background menu + Background menu is hidden. + Background menu is shown. + Hide Watch on TV menu + Watch on TV menu is hidden. + Watch on TV menu is shown. + Hide Manage all history menu + Manage all history menu is hidden. + Manage all history menu is shown. + Hide Your data in YouTube menu + Your data in YouTube menu is hidden. + Your data in YouTube menu is shown. + Hide Privacy menu + Privacy menu is hidden. + Privacy menu is shown. + Hide Try experimental new features menu + Try experimental new features menu is hidden. + Try experimental new features menu is shown. + Hide Purchases and memberships menu + Purchases and memberships menu is hidden. + Purchases and memberships menu is shown. + Hide Billing and payments menu + Billing and payments menu is hidden. + Billing and payments menu is shown. + Hide Notifications menu + Notifications menu is hidden. + Notifications menu is shown. + Hide Connected apps menu + Connected apps menu is hidden. + Connected apps menu is shown. + Hide Live chat menu + Live chat menu is hidden. + Live chat menu is shown. + Hide Captions menu + Captions menu is hidden. + Captions menu is shown. + Hide Accessibility menu + Accessibility menu is hidden. + Accessibility menu is shown. + Hide About menu + About menu is hidden. + About menu is shown. Toolbar @@ -568,6 +623,13 @@ You tab → View channel → Menu → Settings" Hide voice search button Voice search button is hidden. Voice search button is shown. + Hide YouTube Doodles + YouTube Doodles are hidden. + YouTube Doodles are shown. + "YouTube Doodles show up a few days each year. + +If a YouTube Doodle is currently showing in your region and this hide setting is on, then the filter bar below the search bar will also be hidden." + Replace Create button Replaces the Create button with the Settings button. Action type to assign to button @@ -1125,15 +1187,18 @@ Side effect: Official headers in search results will be hidden." Hide paused overlay buttons Paused overlay buttons are hidden. Paused overlay buttons are shown. - Hide paid promotion label - Paid promotion label is hidden. - Paid promotion label is shown. Hide Trends button Trends button is hidden. Trends button is shown. Hide Shopping button Shopping button is hidden. Shopping button is shown. + Hide stickers + Stickers are hidden. + Stickers are shown. + Hide paid promotion label + Paid promotion label is hidden. + Paid promotion label is shown. Hide info panels Info panels are hidden. Info panels are shown. @@ -1159,9 +1224,9 @@ Side effect: Official headers in search results will be hidden." Hide Green screen button Green screen button is hidden. Green screen button is shown. - Hide Save sound button - Save sound button is hidden. - Save sound button is shown. + Hide Save music button + Save music button is hidden. + Save music button is shown. Hide Shop button Shop button is hidden. Shop button is shown. @@ -1241,7 +1306,7 @@ Limitations: Navigation bar is hidden. Navigation bar is shown. Height percentage of empty space - Configures the height percentage of the empty space left when the navigation bar is hidden, between 0 and 100 (%). + Configure the height percentage of the empty space left when the navigation bar is hidden, between 0 and 100 (%). Height percentage must be between 0-100 (%). Replace channel handle Channel name is used. @@ -1691,6 +1756,7 @@ Tap on the continue button and disable battery optimizations." Default client iOS Android + Android Creator Android Embedded Player Android Testsuite Android TV @@ -1702,7 +1768,8 @@ Tap on the continue button and disable battery optimizations." • Livestreams start from the beginning. • Videos may end 1 second early. • No opus audio codec." - • Audio track menu is missing. + "• Audio track menu is missing. +• Stable volume is not available." "• Audio track menu is missing. • Stable volume is not available." • Video may not play. @@ -1752,7 +1819,6 @@ AVC (H.264) has a maximum resolution of 1080p, and video playback will use more Revancify Blue Revancify Red YouTube - YouTube (Minimal header) Stock Excluded Included diff --git a/src/main/resources/youtube/settings/host/values/styles.xml b/src/main/resources/youtube/settings/host/values/styles.xml index 29bc424ca..649d2e7b9 100644 --- a/src/main/resources/youtube/settings/host/values/styles.xml +++ b/src/main/resources/youtube/settings/host/values/styles.xml @@ -5,8 +5,7 @@ 'android:windowBackground' is the background color of the alert dialog. If not overridden, the background color of the parent theme 'android.R.style.ThemeOverlay_Material_Dialog' is used. - 'R.attr.ytBaseBackground' is the background color in YouTube settings. - 'R.color.yt_white1' color is used in light theme, and the 'R.color.yt_black3' color is used in dark theme. + 'R.attr.ytRaisedBackground' is the background color of the YouTube alert dialog. 'android:windowIsTranslucent' makes the dialog window transparent. @@ -19,14 +18,14 @@ --> diff --git a/src/main/resources/youtube/settings/xml/revanced_prefs.xml b/src/main/resources/youtube/settings/xml/revanced_prefs.xml index 833cac28a..7d4b8d02e 100644 --- a/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -198,8 +198,26 @@ @@ -256,8 +275,7 @@ PREFERENCE_CATEGORY: GENERAL_EXPERIMENTAL_FLAGS --> + SETTINGS: LAYOUT_SWITCH --> عام تغيير صفحة البداية @@ -334,10 +335,12 @@ يتم عرض شريط Snack Bar. إزالة مربع حوار تقدير المشاهد "يزيل مربع حوار تقدير المشاهد. هذا لا يتجاوز القيود العمرية. إنه يقبل ذلك تلقائيًا." - تمكين تخطيط الجوَّال - محاكاة Dpi لاستخدام بعض تخطيطات الجوال. - تمكين تخطيط الجهاز اللوحي - محاكاة Dpi لاستخدام بعض تخطيطات الجهاز اللوحي. + تغيير التخطيط + الأساسي + الجوّال + الجوّال (الحد الأقصى 480 dp) + الجهاز اللوحي + الجهاز اللوحي (الحد الأدنى 600 dp) إصدار تطبيق وهمي تم تغيير اصدار التطبيق لم يتم تغيير اصدار التطبيق @@ -478,13 +481,66 @@ قائمة الإعدادات إخفاء العناصر في قائمة إعدادات YouTube. - إخفاء قائمة إعدادات YouTube - إخفاء العناصر في قائمة إعدادات YouTube. - فلتر قائمة إعدادات اليوتيوب - قائمة بأسماء قائمة إعدادات YouTube المراد تصفيتها، مفصولة بسطور جديدة. - "الحساب -توفير البيانات -الترجمة" + إخفاء قائمة مركز العائلة + تم إخفاء قائمة مركز العائلة. + يتم عرض قائمة مركز العائلة. + إخفاء قائمة عامة + تم إخفاء قائمة عامة. + يتم عرض قائمة عامة. + إخفاء قائمة الحساب + تم إخفاء قائمة الحساب. + يتم عرض قائمة الحساب. + إخفاء قائمة توفير البيانات + تم إخفاء قائمة توفير البيانات. + يتم عرض قائمة توفير البيانات. + إخفاء قائمة التشغيل التلقائي + تم إخفاء قائمة التشغيل التلقائي. + يتم عرض قائمة التشغيل التلقائي. + إخفاء قائمة الجودة المفضلة للفيديو + تم إخفاء قائمة الجودة المفضلة للفيديو. + يتم عرض قائمة الجودة المفضلة للفيديو. + إخفاء قائمة الخلفية + تم إخفاء قائمة الخلفية. + يتم عرض قائمة الخلفية. + إخفاء قائمة المشاهدة على التلفزيون + تم إخفاء قائمة المشاهدة على التلفزيون. + يتم عرض قائمة المشاهدة على التلفزيون. + إخفاء قائمة إدارة كل السجلّ + تم إخفاء قائمة إدارة كل السجلّ. + يتم عرض قائمة إدارة كل السجلّ. + إخفاء قائمة بياناتك في YouTube + تم إخفاء قائمة بياناتك في YouTube. + يتم عرض قائمة بياناتك في YouTube. + إخفاء قائمة الخصوصية + تم إخفاء قائمة الخصوصية. + يتم عرض قائمة الخصوصية. + إخفاء قائمة اختبار ميزات تجريبية جديدة + تم إخفاء قائمة اختبار ميزات تجريبية جديدة. + يتم عرض قائمة اختبار ميزات تجريبية جديدة. + إخفاء قائمة عمليات الشراء والاشتراكات + تم إخفاء قائمة عمليات الشراء والاشتراكات. + يتم عرض قائمة عمليات الشراء والاشتراكات. + إخفاء قائمة الفوترة والدفعات + تم إخفاء قائمة الفوترة والدفعات. + يتم عرض قائمة الفوترة والدفعات. + إخفاء قائمة الإشعارات + تم إخفاء قائمة الإشعارات. + يتم عرض قائمة الإشعارات. + إخفاء قائمة التطبيقات المرتبطة + تم إخفاء قائمة التطبيقات المرتبطة. + يتم عرض قائمة التطبيقات المرتبطة. + إخفاء قائمة المحادثات المباشرة + تم إخفاء قائمة المحادثات المباشرة. + يتم عرض قائمة المحادثات المباشرة. + إخفاء قائمة الترجمة + تم إخفاء قائمة الترجمة. + يتم عرض قائمة الترجمة. + إخفاء قائمة تمكين الوصول + تم إخفاء قائمة تمكين الوصول. + يتم عرض قائمة تمكين الوصول. + إخفاء قائمة لمحة + تم إخفاء قائمة لمحة. + يتم عرض قائمة لمحة. شريط الأدوات إخفاء أو تغيير المكونات الموجودة على شريط الأدوات، مثل شريط الأدوات وأزرار شريط الأدوات والعلامة. @@ -520,6 +576,12 @@ إخفاء زر البحث الصوتي تم إخفاء زر البحث الصوتي. يتم عرض زر البحث الصوتي. + إخفاء رسومات YouTube + تم إخفاء رسومات YouTube. + يتم عرض رسومات YouTube. + "تظهر رسومات YouTube Doodles لعدة أيام كل عام. + +إذا كانت رسومات YouTube Doodles تظهر حاليًا في منطقتك وكان إعداد الإخفاء هذا قيد التشغيل، فسيتم أيضًا إخفاء شريط الفلتر الموجود أسفل شريط البحث." استبدال زر الإنشاء استبدال زر الإنشاء بزر الإعدادات. نوع الإجراء الذي سيتم تعيينه للزر @@ -1038,15 +1100,18 @@ إخفاء أزرار واجهة التوقف تم إخفاء أزرار تراكب التوقف. يتم عرض أزرار تراكب التوقف. - إخفاء تصنيف الترويج المدفوع - تم إخفاء تصنيف الترويج المدفوع. - يتم عرض تصنيف الترويج المدفوع. إخفاء زر الرائجة تم إخفاء زر الرائجة. يتم عرض زر الرائجة. إخفاء زر التسوق تم إخفاء زر التسوق. يتم عرض زر التسوق. + إخفاء الملصقات + تم إخفاء الملصقات. + يتم عرض الملصقات. + إخفاء تصنيف الترويج المدفوع + تم إخفاء تصنيف الترويج المدفوع. + يتم عرض تصنيف الترويج المدفوع. إخفاء لوحات المعلومات تم إخفاء لوحات المعلومات. يتم عرض لوحات المعلومات. @@ -1066,9 +1131,13 @@ تم إخفاء تسمية رابط الفيديو. يتم عرض تسمية رابط الفيديو. - إخفاء زر حفظ الصوت إلى قائمة التشغيل - تم إخفاء زر حفظ الصوت في قائمة التشغيل. - يتم عرض زر حفظ الصوت في قائمة التشغيل. + الإجراءات المقترحة + إخفاء زر الشاشة الأخضر + تم إخفاء زر الشاشة الخضراء. + يتم عرض زر الشاشة الخضراء. + إخفاء زر حفظ الموسيقى + تم إخفاء زر حفظ الموسيقى. + يتم عرض زر حفظ الموسيقى. إخفاء زر التسوق تم إخفاء زر المتجر. يتم عرض زر المتجر. @@ -1112,6 +1181,9 @@ يتم عرض زر الصوت. تأثير الحركة / رد الفعل + تعطيل الرسوم المتحركة لزر أعجبني + تم تعطيل الرسوم المتحركة الفوّارة فوق زر أعجبني. + تم تمكين الرسوم المتحركة الفوّارة فوق زر أعجبني. إخفاء خلفية زر التشغيل & الإيقاف تم إخفاء خلفية الزر. يتم عرض خلفية الزر. @@ -1321,7 +1393,7 @@ تظهر الملاحظة عند تخطي مقطع تلقائيًا. اضغط هنا لمشاهدة مثال. لا تظهر الملاحظة. اضغط هنا لمشاهدة مثال. عرض مدة الفيديو بدون المقاطع - يعرض طول الفيديو ناقصًا منه طول المقطع المدمج بين قوسين بجوار طول الفيديو الكامل. + يعرض مدة الفيديو ناقصًا منها مدة المقطع المدمج بين قوسين بجوار مدة الفيديو الكامل. يتم عرض مدة الفيديو كاملةً. تغيير سلوك المقطع @@ -1559,6 +1631,7 @@ العميل الافتراضي iOS Android + Android Creator مشغل Android المضمّن Android Testsuite Android TV @@ -1570,7 +1643,8 @@ • يبدأ البث المباشر من البداية. • قد تنتهي الفيديوهات قبل النهاية بثانية واحدة. • لا يوجد ترميز الصوت Opus." - • قائمة المقطع الصوتي مفقودة. + "• قائمة المقطع الصوتي مفقودة. +• مستوى الصوت الثابت غير متوفر." "• قائمة المقطع الصوتي مفقودة. • مستوى الصوت الثابت غير متوفر." • قد لا يتم تشغيل الفيديو. @@ -1614,7 +1688,6 @@ Revancify Blue Revancify Red YouTube - YouTube (Minimal header) الإفتراضي مستبعد مضمن diff --git a/src/main/resources/youtube/translations/bg-rBG/strings.xml b/src/main/resources/youtube/translations/bg-rBG/strings.xml index ae0ea1e36..867bd2ff4 100644 --- a/src/main/resources/youtube/translations/bg-rBG/strings.xml +++ b/src/main/resources/youtube/translations/bg-rBG/strings.xml @@ -274,6 +274,7 @@ "Тази настройка ограничава максималния брой оформления, които могат да бъдат заредени на екрана на плейъра. Ако оформлението на екрана на плейъра се промени поради промени от страна на сървъра, нежеланите оформления може да бъдат скрити на екрана на плейъра." + Компенсиране Основни настройки Промяна на началната страница @@ -321,10 +322,12 @@ Лентата на състоянието се показва. Прозорец за възрастово ограничение "Премахва диалоговите прозорци. Това не заобикаля възрастовите ограничения, но ги приема автоматично." - Вкл. на оформление като на телефон - Подлъгване на dpi за оформление като на телефон. - Вкл. на режим за таблет - Подлъгване на dpi за оформление като на таблет. + Промяна на резолюция + Оригинал + Телефон + Телефон (Max 480 dip) + Таблет + Таблет (Мин 600 dip) Променете версията на приложението Подправена версия Не подправена версия @@ -462,13 +465,7 @@ Меню с настройки Скриване на елементи в менюто с настройки на YouTube. - Филтриране на менюто с настройки на YouTube - Скриване на елементи в менюто с настройки на YouTube. - Филтър на менюто с настройки на YouTube - Списък с заглавия на менюта с настройки на YouTube за филтриране, разделени с нов ред. - "Акаунт -Спестяване на данни -Субтитри" + Скриване на менюто на акаунта Лента с инструменти Скрива или променя елементи, разположени в лентата с инструменти, като бутони на лентата с инструменти, лента за търсене, заглавия. @@ -1022,15 +1019,18 @@ Показване на бутони при пауза Бутоните при пауза се скриват. Бутоните при пауза се показват. - Скриване на платените промоции - Промоционалните етикети са скрити. - Промоционалните етикети се показват. Бутон „Набиращи популярност“ Скрит. Показва се. Бутон \"Пазаруване\" Бутона за пазаруване е скрит. Бутона за пазаруване се показва. + Скриване на стикери + Стикерите са скрити. + Стикери са показани. + Скриване на платените промоции + Промоционалните етикети са скрити. + Промоционалните етикети се показват. Скриване на информационните панели Информационните панели са скрити. Информационните панели се показват. @@ -1054,9 +1054,9 @@ Зелен бутон на екрана Зелен бутон на екрана е скрит. Зелен бутон на екрана се показва. - Бутон за запазване на аудиото в плейлиста - Бутонът за Запазване в плейлиста е скрит. - Бутонът за Запазване в плейлиста се показва. + Скриване на бутона Запазване на музика + Бутонът за запазване на музика е скрит. + Показан е бутонът за запазване на музика. Скриване на бутона за пазаруване Бутона за пазаруване е скрит. Бутона за пазаруване се показва. @@ -1536,7 +1536,8 @@ Изключването на тази настройка може да причини проблеми с възпроизвеждането на видео. Клиент по подразбиране iOS - Android + Андроид + Създател на Android Вграден Android плейър Тестов пакет за Android Android TV @@ -1545,7 +1546,7 @@ Web Ефекти от замяната "• Филми или платени видеоклипове може да не се възпроизвеждат." - • Липсва менюто за избор на аудио. + "• Липсва менюто за избор на аудио." "• Липсва менюто за избор на аудио." • Видеото може да не се възпроизведе. Принудително AVC (H.264) за iOS @@ -1588,7 +1589,6 @@ AVC (H.264) има максимална разделителна способн Revancify синя Revancify Червена YouTube - YouTube (минимално заглавие) По подразбиране Изключване Включване diff --git a/src/main/resources/youtube/translations/de-rDE/strings.xml b/src/main/resources/youtube/translations/de-rDE/strings.xml index 3dd61aed9..469ebd236 100644 --- a/src/main/resources/youtube/translations/de-rDE/strings.xml +++ b/src/main/resources/youtube/translations/de-rDE/strings.xml @@ -283,10 +283,6 @@ Einschränkungen: Diskretion des Betrachters entfernen "Entfernt den Diskretionsdialog des Betrachters. Dies umgeht nicht die Altersbeschränkung. Es akzeptiert ihn nur automatisch." - Telefonlayout aktivieren - Umgehe die DPI, um einige Telefon-Layouts zu verwenden - Tablet-Layout aktivieren - Umgehe die dpi, um einige Tablet-Layouts zu verwenden Spoof App Version Version gefälscht Version nicht gefälscht @@ -392,13 +388,6 @@ Manche Komponenten könnten nicht versteckt werden." Einstellungsmenü Elemente im YouTube-Einstellungsmenü verstecken - YouTube Einstellungsmenü verstecken - Elemente im YouTube-Einstellungsmenü verstecken - YouTube Einstellungsmenüfilter - Liste der zu filternden Namen des YouTube-Einstellungsmenüs, getrennt durch neue Zeilen. - "Konto -Daten speichern -Untertitel" Werkzeugleiste Verstecke oder ändere Toolbar-Komponenten, wie die Suchleiste, Buttons und Header. diff --git a/src/main/resources/youtube/translations/el-rGR/strings.xml b/src/main/resources/youtube/translations/el-rGR/strings.xml index dd760e1f6..493435a53 100644 --- a/src/main/resources/youtube/translations/el-rGR/strings.xml +++ b/src/main/resources/youtube/translations/el-rGR/strings.xml @@ -282,6 +282,7 @@ Playlists "Αυτή η ρύθμιση περιορίζει τον μέγιστο αριθμό διατάξεων που μπορούν να εμφανιστούν στην οθόνη αναπαραγωγής. Στην περίπτωση που η διάταξη της οθόνης αναπαραγωγής αλλάξει λόγω αλλαγών από πλευράς του διακομιστή, ορισμένες διατάξεις της ενδέχεται να κρυφτούν χωρίς να είναι επιθυμητό." + Μετατόπιση Γενικά Αλλαγή αρχικής σελίδας @@ -330,10 +331,12 @@ Playlists Παράθυρο ηλικιακού περιορισμού "Αφαίρεση του παραθύρου προειδοποίησης ηλικιακού περιορισμού. Αυτό δεν παρακάμπτει τον ηλικιακό περιορισμό, απλά τον αποδέχεται αυτόματα." - Λειτουργία διεπαφής κινητού - Παραποίηση του dpi συσκευής ώστε να χρησιμοποιηθεί η διεπαφή κινητού. - Λειτουργία διεπαφής τάμπλετ - Παραποίηση του dpi συσκευής ώστε να χρησιμοποιηθεί η διεπαφή τάμπλετ. + Αλλαγή διεπαφής + Προεπιλογή + Κινητό + Κινητό (Μέγιστο dp 480) + Τάμπλετ + Τάμπλετ (Μέγιστο dp 600) Τροποποίηση έκδοσης εφαρμογής Η έκδοση τροποποιείται. Η έκδοση δεν τροποποιείται. @@ -474,13 +477,66 @@ Playlists Μενού ρυθμίσεων Απόκρυψη στοιχείων στο μενού ρυθμίσεων του YouTube. - Φιλτράρισμα του μενού ρυθμίσεων YouTube - Απόκρυψη στοιχείων στο μενού ρυθμίσεων του YouTube. - Αλλαγή φίλτρου μενού ρυθμίσεων του YouTube - Λίστα ονομάτων των επιλογών του μενού ρυθμίσεων YouTube για φιλτράρισμα, διαχωρισμένα με νέες γραμμές. - "Λογαριασμός -Εξοικονόμηση δεδομένων -Υπότιτλοι" + Μενού «Οικογενειακό Κέντρο» + Κρυμμένο. + Εμφανίζεται. + Μενού «Γενικά» + Κρυμμένο. + Εμφανίζεται. + Μενού «Λογαριασμός» + Κρυμμένο. + Εμφανίζεται. + Μενού «Εξοικονόμηση δεδομένων» + Κρυμμένο. + Εμφανίζεται. + Μενού «Αυτόματη αναπαραγωγή» + Κρυμμένο. + Εμφανίζεται. + Μενού «Προτιμήσεις ποιότητας βίντεο» + Κρυμμένο. + Εμφανίζεται. + Μενού «Παρασκήνιο» + Κρυμμένο. + Εμφανίζεται. + Μενού «Παρακολουθήστε σε TV» + Κρυμμένο. + Εμφανίζεται. + Μενού «Διαχείριση όλου του ιστορικού» + Κρυμμένο. + Εμφανίζεται. + Μενού «Τα δεδομένα σας στο YouTube» + Κρυμμένο. + Εμφανίζεται. + Μενού «Απόρρητο» + Κρυμμένο. + Εμφανίζεται. + Μενού «Δοκιμάστε νέες πειραματικές λειτουργίες» + Κρυμμένο. + Εμφανίζεται. + Μενού «Αγορές και συνδρομές» + Κρυμμένο. + Εμφανίζεται. + Μενού «Χρέωση και πληρωμές» + Κρυμμένο. + Εμφανίζονται. + Μενού «Ειδοποιήσεις» + Κρυμμένο. + Εμφανίζεται. + Μενού «Συνδεδεμένες εφαρμογές» + Κρυμμένο. + Εμφανίζεται. + Μενού «Ζωντανή συζήτηση» + Κρυμμένο. + Εμφανίζεται. + Μενού «Υπότιτλοι» + Κρυμμένο. + Εμφανίζεται. + Μενού «Προσβασιμότητα» + Κρυμμένο. + Εμφανίζεται. + Μενού «Σχετικά με» + Κρυμμένο. + Εμφανίζεται. Γραμμή εργαλείων Απόκρυψη ή αλλαγή στοιχείων που βρίσκονται στη γραμμή εργαλείων, όπως τα κουμπιά, την γραμμή αναζήτησης, ή την επικεφαλίδα. @@ -516,6 +572,12 @@ Playlists Κουμπί φωνητικής αναζήτησης Κρυμμένο. Εμφανίζεται. + YouTube Doodles + Κρυμμένα. + Εμφανίζονται. + "Τα YouTube Doodles εμφανίζονται για μερικές μέρες κάθε χρόνο. + +Αν ένα YouTube Doodle εμφανίζεται αυτή τη στιγμή στην περιοχή σας και αυτή η ρύθμιση απόκρυψης του είναι ενεργοποιημένη, τότε η γραμμή κατηγοριών κάτω από τη γραμμή αναζήτησης θα είναι κρυμμένη επίσης." Αντικατάσταση κουμπιού δημιουργίας Αντικατάσταση του κουμπιού δημιουργίας με το κουμπί ρυθμίσεων. Συμπεριφορά κουμπιού ρυθμίσεων @@ -1059,15 +1121,18 @@ Playlists Κουμπιά εμφάνισης κατά την παύση Κρυμμένα. Εμφανίζονται. - Ετικέτες προώθησης επί πληρωμή - Κρυμμένες. - Εμφανίζονται. Κουμπί «Τάσεις» Κρυμμένο. Εμφανίζεται. Κουμπί «Αγορές» Κρυμμένο. Εμφανίζεται. + Αυτοκόλλητα + Κρυμμένα. + Εμφανίζεται. + Ετικέτες προώθησης επί πληρωμή + Κρυμμένες. + Εμφανίζονται. Πάνελ πληροφοριών Κρυμμένα. Εμφανίζονται. @@ -1091,9 +1156,9 @@ Playlists Κουμπί «Πράσινη οθόνη» Κρυμμένο. Εμφανίζεται. - Κουμπί «Αποθήκευση ήχου» - Κρυμμένο. - Εμφανίζεται. + Κουμπί «Αποθήκευση μουσικής» + Κρυμμένο. + Εμφανίζεται. Κουμπί «Κατάστημα» Κρυμμένο. Εμφανίζεται. @@ -1583,6 +1648,7 @@ Playlists Προεπιλογή iOS Android + Android Creator Ενσωματωμένος αναπαραγωγέας Android Android Testsuite Android TV @@ -1594,7 +1660,8 @@ Playlists • Οι ζωντανές μεταδόσεις ξεκινούν από την αρχή κατά την αναπαραγωγή. • Τα βίντεο μπορεί να τελειώνουν 1 δευτερόλεπτο νωρίτερα. • Ο κωδικοποιητής ήχου opus δεν είναι διαθέσιμος." - • Το μενού «Κομμάτι ήχου» λείπει. + "• Το μενού «Κομμάτι ήχου» λείπει. +• Η λειτουργία «Σταθερή ένταση» δεν είναι διαθέσιμη." "• Το μενού «Κομμάτι ήχου» λείπει. • Η λειτουργία «Σταθερή ένταση» δεν είναι διαθέσιμη." • Τα βίντεο ενδέχεται να μην αναπαράγονται. @@ -1638,7 +1705,6 @@ Playlists Revancify Blue Revancify Red YouTube - YouTube (ελάχιστη επικεφαλίδα) Προεπιλογή Εξαιρέθηκε Συμπεριλήφθηκε diff --git a/src/main/resources/youtube/translations/es-rES/strings.xml b/src/main/resources/youtube/translations/es-rES/strings.xml index 936a73325..d9f0e5a8c 100644 --- a/src/main/resources/youtube/translations/es-rES/strings.xml +++ b/src/main/resources/youtube/translations/es-rES/strings.xml @@ -284,6 +284,7 @@ Limitaciones: "Este ajuste limita el número máximo de diseños que se pueden cargar en la pantalla del reproductor. Si el diseño de la pantalla del reproductor cambia debido a cambios en el servidor, es posible que se oculten diseños no deseados en la pantalla del reproductor." + Desplazamiento General Cambiar página de inicio @@ -332,10 +333,12 @@ Limitación: Es posible que el botón Atrás de la barra de herramientas no func Eliminar diálogo de discreción del espectador "Elimina el diálogo de discreción del espectador. Esto no evita la restricción de edad. Solo la acepta automáticamente." - Activar diseño de teléfono - Modifica los DPI para utilizar algunos diseños de teléfono. - Activar diseño de tableta - Modifica los DPI para utilizar algunos diseños de tableta. + Cambiar diseño + Original + Teléfono + Teléfono (máx. 480 dpi) + Tablet + Tablet (min. 600 dpi) Falsificar versión de la app Versión falsificada Versión no falsificada @@ -476,13 +479,66 @@ Si este ajuste no surte efecto, prueba a cambiar al modo incógnito." Menú de configuración Ocultar elementos del menú de configuración de YouTube. - Ocultar menú de configuración de YouTube - Ocultar elementos del menú de configuración de YouTube. - Filtro de menú de configuración de YouTube - Lista de nombres del menú de configuración de YouTube a filtrar separados por una nueva línea. - "Cuenta -Ahorro de datos -Subtítulos" + Ocultar menú de centro familiar + El menú de centro familiar está oculto. + El menú de centro familiar está visible. + Ocultar menú de general + El menú de general está oculto. + El menú de general está visible. + Ocultar menú de cuenta + El menú de cuenta está oculto. + El menú de cuenta está visible. + Ocultar menú de ahorro de datos + El menú de ahorro de datos está oculto. + El menú de ahorro de datos está visible. + Ocultar menú de reproducción automática + El menú de reproducción automática está oculto. + El menú de reproducción automática está visible. + Ocultar menú de preferencias de calidad de vídeo + El menú de preferencias de calidad de vídeo está oculto. + El menú de preferencias de calidad de vídeo está visible. + Ocultar menú de segundo plano + El menú de segundo plano está oculto. + El menú de segundo plano está visible. + Ocultar menú de ver en la televisión + El menú de ver en la televisión está oculto. + El menú de ver en la televisión está visible. + Ocultar menú de gestionar todo el historial + El menú de gestionar todo el historial está oculto. + El menú de gestionar todo el historial está visible. + Ocultar menú de tus datos en YouTube + El menú de tus datos en YouTube está oculto. + El menú de tus datos en YouTube está visible. + Ocultar menú de privacidad + El menú de privacidad está oculto. + El menú de privacidad está visible. + Ocultar menú de prueba las nuevas funciones experimentales + El menú de prueba las nuevas funciones experimentales está oculto. + El menú de prueba las nuevas funciones experimentales está visible. + Ocultar menú de compras y suscripciones + El menú de compras y suscripciones está oculto. + El menú de compras y suscripciones está visible. + Ocultar menú de facturación y pagos + El menú de facturación y pagos está oculto. + El menú de facturación y pagos está visible. + Ocultar menú de notificaciones + El menú de notificaciones está oculto. + El menú de notificaciones está visible. + Ocultar menú de aplicaciones conectadas + El menú de aplicaciones conectadas está oculto. + El menú de aplicaciones conectadas está visible. + Ocultar menú de chat en directo + El menú de chat en directo está oculto. + El menú de chat en directo está visible. + Ocultar menú de subtítulos + El menú de subtítulos está oculto. + El menú de subtítulos está visible. + Ocultar menú de accesibilidad + El menú de accesibilidad está oculto. + El menú de accesibilidad está visible. + Ocultar menú de información + El menú de información está oculto. + El menú de información está visible. Barra de herramientas Ocultar o cambiar los componentes situados en la barra de herramientas, como los botones, la barra de búsqueda o la cabecera. @@ -518,6 +574,12 @@ Pestaña Tú > Ver canal > Menú > Configuración." Ocultar botón de búsqueda por voz El botón de búsqueda por voz está oculto. El botón de búsqueda por voz está visible. + Ocultar Doodles de YouTube + Los Doodles de YouTube están ocultos. + Los Doodles de YouTube están visibles. + "Los Doodles de YouTube aparecen unos pocos días al año. + +Si un Doodle de YouTube está actualmente mostrándose en tu región y este ajuste de ocultar está activado, entonces la barra de filtros debajo de la barra de búsqueda también estará oculta." Reemplazar botón de crear Reemplaza el botón de crear con el botón de ajustes. Tipo de acción a asignar al botón @@ -1037,15 +1099,18 @@ Limitación: las cabeceras oficiales en los resultados de búsqueda estarán ocu Ocultar botones superpuestos en pausa Los botones superpuestos en pausa están ocultos. Los botones superpuestos en pausa están visibles. - Ocultar etiqueta de promoción pagada - La etiqueta de promoción pagada está oculta. - La etiqueta de promoción pagada está visible. Ocultar botón de tendencias El botón de tendencias está oculto. El botón de tendencias está visible. Ocultar botón de compras El botón de compras está oculto. El botón de compras está visible. + Ocultar stickers + Los stickers están ocultos. + Los stickers están visibles. + Ocultar etiqueta de promoción pagada + La etiqueta de promoción pagada está oculta. + La etiqueta de promoción pagada está visible. Ocultar paneles de información Los paneles de información están ocultos. Los paneles de información están visibles. @@ -1069,9 +1134,9 @@ Limitación: las cabeceras oficiales en los resultados de búsqueda estarán ocu Ocultar botón de pantalla verde El botón de la pantalla verde está oculto. El botón de la pantalla verde está visible. - Ocultar botón de guardar sonido - El botón de guardar sonido está oculto. - El botón de guardar sonido está visible. + Ocultar botón de guardar música + El botón de guardar música está oculto. + El botón de guardar música está visible. Ocultar botón de comprar El botón de comprar está oculto. El botón de comprar está visible. @@ -1557,6 +1622,7 @@ Pulsa el botón de continuar y desactiva las optimizaciones de la batería."Cliente predeterminado iOS Android + Creador de Android Reproductor integrado de Android Android Testsuite Android TV @@ -1565,7 +1631,7 @@ Pulsa el botón de continuar y desactiva las optimizaciones de la batería."Web Efectos secundarios de falsificación "• Las películas o vídeos de pago no pueden reproducirse." - • Falta el menú de la pista de audio. + "• Falta el menú de la pista de audio." "• Falta el menú de la pista de audio." • El vídeo no puede reproducirse. Forzar iOS AVC (H.264) @@ -1608,7 +1674,6 @@ AVC (H.264) tiene una resolución máxima de 1080p, y la reproducción de vídeo Revancify Blue Revancify Red YouTube - YouTube (cabecera mínima) Predeterminada Excluidos Incluidos diff --git a/src/main/resources/youtube/translations/fr-rFR/strings.xml b/src/main/resources/youtube/translations/fr-rFR/strings.xml index 882c47e93..4d96e2464 100644 --- a/src/main/resources/youtube/translations/fr-rFR/strings.xml +++ b/src/main/resources/youtube/translations/fr-rFR/strings.xml @@ -253,7 +253,7 @@ Limitations : Masquer les vidéos peu vues Masque les vidéos avec moins de 1,000 vues dans le flux \"accueil\" qui ont été mis en ligne par des personnes dont vous n\'êtes pas abonnés. Masquer les vidéos À SUIVRE - "Masquer les vidéos avec l'étiquette À SUIVRE. + "Masque les vidéos avec l'étiquette 'À SUIVRE'. Remarque : Activer ceci masque également le bouton \"M'avertir\"." @@ -285,7 +285,8 @@ Limitations : Les vidéos similaires sont affichés. "Ce paramètre limite le nombre maximum de mises en page pouvant être chargées sur l'écran du lecteur. -Si la mise en page de l'écran du lecteur change en raison de modifications côté serveur, des mises en page non souhaitées peuvent être masquées sur l'écran du lecteur." +Si la mise en page de l'écran du lecteur change en raison de modifications côté serveur, des mises en page non désirées risquent d'être masquées sur l'écran du lecteur." + Décalage Interface Modifier la page de démarrage @@ -305,11 +306,11 @@ Si la mise en page de l'écran du lecteur change en raison de modifications côt Abonnements Tendances Regarder plus tard - Modifier le type de page de démarrage - "La page d'accueil change toujours. + Type de modification de la page de démarrage + "La page de démarrage est toujours modifiée. Limitation : Le bouton Retour de la barre d'outils peut ne pas fonctionner." - La page d\'accueil ne change qu\'une seule fois. + La page de démarrage est modifiée une seule fois. Désact. les pistes audio forcés Les pistes audio automatiques forcées sont désactivé. Les pistes audio automatiques forcées sont activés. @@ -334,10 +335,12 @@ Limitation : Le bouton Retour de la barre d'outils peut ne pas fonctionner."Suppr. Message \"Confirmer votre âge\" "Supprime le message \"Confirmer votre âge\". Cela ne contourne pas la restriction d'âge, mais le confirme automatiquement." - Activer l\'interface téléphone - Falsifie le dpi pour activer l\'interface téléphone. - Activer l\'interface tablette - Falsifie le dpi pour activer l\'interface tablette. + Modifier la mise en page + Original + Téléphone + Téléphone (Max 480 dpi) + Tablette + Tablette (Min 600 dpi) Falsifier la version de l\'app Version falsifiée Version non falsifiée @@ -478,13 +481,66 @@ Si ce paramètre ne fait pas effet, essayer de passer en mode Incognito." Menu paramètre Masque des éléments dans le menu paramètre YouTube. - Masquer des paramètres YouTube - Masque des éléments dans le menu paramètres YouTube. - Filtre du menu paramètre YouTube - Liste des noms du menu paramètre YouTube à filtrer, séparés par un saut de ligne. - "Compte -Économie de données -Sous-titres" + Masquer le menu \'Centre pour la famille\' + Le menu \'Centre pour la famille\' est masqué. + Le menu \'Centre pour la famille\' est affiché. + Masquer le menu \'Paramètres généraux\' + Le menu \"Paramètres généraux\' est masqué. + Le menu \"Paramètres généraux\' est affiché. + Masquer le menu \'Compte\' + Le menu \'Compte\' est masqué. + Le menu \'Compte\' est affiché. + Masquer le menu \'Économie de données\' + Le menu \'Économie de données\' est masqué. + Le menu \'Économie de données\' est affiché. + Masquer le menu \'Lecture automatique\' + Le menu \'Lecture automatique\' est masqué. + Le menu \'Lecture automatique\' est affiché. + Masquer le menu \'Préférences de qualité vidéo\' + Le menu \'Préférences de qualité vidéo\' est masqué. + Le menu \'Préférences de qualité vidéo\' est affiché. + Masquer le menu \'Arrière-plan\' + Le menu \'Arrière-plan\' est masqué. + Le menu \'Arrière-plan\' est affiché. + Masquer le menu \'Regarder sur un téléviseur\' + Le menu \'Regarder sur un téléviseur\' est masqué. + Le menu \'Regarder sur un téléviseur\' est affiché. + Masquer le menu \'Gérer tout l\'historique\' + Le menu \'Gérer tout l\'historique\' est masqué. + Le menu \'Gérer tout l\'historique\' est affiché. + Masquer le menu \'Vos données dans YouTube\' + Le menu \'Vos données dans YouTube\' est masqué. + Le menu \'Vos données dans YouTube\' est affiché. + Masquer le menu \'Confidentialité\' + Le menu \'Confidentialité\' est masqué. + Le menu \'Confidentialité\' est affiché. + Masquer le menu \'Testez de nouvelles fonctionnalités expérimentales\' + Le menu \'Testez de nouvelles fonctionnalités expérimentales\' est masqué. + Le menu \'Testez de nouvelles fonctionnalités expérimentales\' est affiché. + Masquer le menu \'Achats et abonnement\' + Le menu \'Achats et abonnement\' est masqué. + Le menu \'Achats et abonnement\' est affiché. + Masquer le menu \'Facturations et paiements\' + Le menu \'Facturations et paiements\' est masqué. + Le menu \'Facturations et paiements\' est affiché. + Masquer le menu \'Notifications\' + Le menu \'Notifications\' est masqué. + Le menu \'Notifications\' est affiché. + Masquer le menu \'Applications connectées\' + Le menu \'Applications connectées\' est masqué. + Le menu \'Applications connectées\' est affiché. + Masquer le menu \'Chat en direct\' + Le menu \'Chat en direct\' est masqué. + Le menu \'Chat en direct\' est affiché. + Masquer le menu \'Sous-titres\' + Le menu \'Sous-titres\' est masqué. + Le menu \'Sous-titres\' est affiché. + Masquer le menu \'Accessibilité\' + Le menu \'Accessibilité\' est masqué. + Le menu \'Accessibilité\' est affiché. + Masquer le menu \'À propos\' + Le menu \'À propos\' est masqué. + Le menu \'À propos\' est affiché. Barre d\'outils Masque ou change les éléments situés dans la barre d\'outils, tels que les boutons de la barre d\'outils, la barre de recherche, l\'en-tête. @@ -520,6 +576,12 @@ Vous → Afficher la chaîne → Menu → Paramètres" Masquer le bouton \"Recherche vocale\" Le bouton \"Recherche vocale \" est masqué. Le bouton \"Recherche vocale \" est affiché. + Masquer les Doodles YouTube + Les Doodles YouTube sont masqués. + Les Doodles YouTube sont affichés. + "Les Doodles YouTube apparaissent quelques jours par an. + +Si un Doodle YouTube est actuellement diffusé dans votre région et que le paramètre pour le masquer est activé, la barre de filtre située à côté de la barre de recherche sera également masquée." Remplacer le bouton \"Créer\" Remplace le bouton \"Créer\" par le bouton \"Paramètre\". Action à attribuer au bouton @@ -587,9 +649,9 @@ Note : Masquer les suggestions d\'actions Les actions suggérées sont masquées. Les actions suggérées sont affichées. - Masquer les réactions dans le chat en direct - Les réactions dans le chat en direct sont masqués. - Les réactions dans le chat en direct sont affichés. + Masquer les réactions en temps réel + Les réactions en temps réel sont masqués. + Les réactions en temps réel sont affichés. Masq. suggestions vidéos à la fin de vidéo "Les suggestions de vidéos à l'écran de fin sont masqué lorsque la lecture automatique est désactivée. @@ -1038,15 +1100,18 @@ Effet secondaire : Les fiches officielles dans les résultats de recherche sont Masq. fond du bouton \"Pause\" Le fond du bouton \"Pause\" est masqué. Le fond du bouton \"Pause\" est affiché. - Masquer bannière \"Communication commerciale\" - La bannière \"Inclut une communication commerciale\" est masquée. - La bannière \"Inclut une communication commerciale\" est affichée. Masquer le bouton \"Tendance\" Le bouton \"Tendance\" est masqué. Le bouton \"Tendance\" est affiché. Masquer le bouton \"Produit\" Le bouton \"Produit\" est masqué. Le bouton \"Produit\" est affiché. + Masquer les stickers + Les stickers sont masqués. + Les stickers sont affichés. + Masquer bannière \"Communication commerciale\" + La bannière \"Inclut une communication commerciale\" est masquée. + La bannière \"Inclut une communication commerciale\" est affichée. Masquer les panneaux d\'information Les panneaux d\'information sont masqués. Les panneaux d\'information sont affichés. @@ -1070,9 +1135,9 @@ Effet secondaire : Les fiches officielles dans les résultats de recherche sont Masquer le bouton \'fond vert\' Le bouton \'fond vert\' est masqué. Le bouton \'fond vert\' est affiché. - Masquer le bouton \"Enregistrer le son\" - Le bouton \"Enregistrer le son\" est masqué. - Le bouton \"Enregistrer le son\" est affiché. + Masquer le bouton \"Enregistrer la musique\" + Le bouton \"Enregistrer la musique\" est masqué. + Le bouton \"Enregistrer la musique\" est affiché. Masquer le bouton \"Magasin\" Le bouton \"Magasin\" est masqué. Le bouton \"Magasin\" est affiché. @@ -1116,9 +1181,9 @@ Effet secondaire : Les fiches officielles dans les résultats de recherche sont Le bouton \"Son\" est affiché. Animation / Retour d\'expérience - Désactiver l\'animation du bouton j\'aime - L\'animation en cascade est désactivé pour le bouton j\'aime. - L\'animation en cascade est activé pour le bouton j\'aime. + Désactiver l\'animation du bouton J\'aime + L\'animation en fontaine est désactivé au-dessus du bouton j\'aime. + L\'animation en fontaine est activé au-dessus du bouton j\'aime. Masquer fond du bouton Lecture & Pause Le fond du bouton est masqué. Le fond du bouton est affiché. @@ -1559,6 +1624,7 @@ Cliquez sur le bouton Continuer et désactivez les optimisations de la batterie. Client par défaut iOS Android + Android Creator Lecteur intégré Android Android Testsuite Android TV @@ -1570,7 +1636,8 @@ Cliquez sur le bouton Continuer et désactivez les optimisations de la batterie. • Les diffusions en direct commencent au début. • Les vidéos peuvent se terminer une seconde avant. • Pas de codec audio opus." - • Le menu \"Piste Audio\" est manquant. + "• Le menu \"Piste Audio\" est manquant. +• Le volume stable n'es pas disponible." "• Le menu \"Piste Audio\" est manquant. • Le volume stable n'es pas disponible." • Les vidéos peuvent ne pas être lus. @@ -1614,7 +1681,6 @@ AVC (H.264) a une résolution maximale de 1080p, et la lecture vidéo utilisera Revancify Bleu Revancify Rouge Youtube - YouTube (En-tête minimal) Officiel Exclus Appliqué diff --git a/src/main/resources/youtube/translations/hu-rHU/strings.xml b/src/main/resources/youtube/translations/hu-rHU/strings.xml index b8819ec90..9061a76c3 100644 --- a/src/main/resources/youtube/translations/hu-rHU/strings.xml +++ b/src/main/resources/youtube/translations/hu-rHU/strings.xml @@ -282,6 +282,7 @@ Korlátozások: "Ez a beállítás korlátozza a lejátszó képernyőjére betölthető elrendezések maximális számát. Ha a lejátszó képernyőjének elrendezése a szerveroldali változtatások miatt megváltozik, akkor esetleg a nem kívánt elrendezések elrejthetők a lejátszó képernyőjén." + Eltolás Általános Kezdőlap megváltoztatása @@ -330,10 +331,12 @@ Korlátozás: Előfordulhat, hogy az eszköztár Vissza gombja nem működik."Távolítsa el a nézői diszkréciós párbeszédpanelt "Eltávolítja a nézői belátás párbeszédpanelt. Ez nem kerüli meg a korhatárt. Csak automatikusan fogadja el." - Telefonos felület engedélyezése - Hamisítja a dpi-t néhány telefonos elrendezés használatához. - Tablet felület engedélyezése - Hamisítja a dpi-t néhány táblagépes elrendezés használatához. + Elrendezés megváltoztatása + Eredeti + Telefon + Telefon (max 480 dpi) + Tablet + Tablet (min 600 dpi) Alkalmazásverzió hamisítása Verzió hamisítás Verzió nincs hamisítva @@ -472,13 +475,66 @@ Ha ez a beállítás nem működik, váltson inkognító módra." Beállítások menü Elrejti a YouTube beállítások menü elemeit. - YouTube beállítások menü elrejtése - Elrejti a YouTube beállítások menü elemeit. - YouTube beállítások menü szűrő - A szűrni kívánt YouTube beállítások menü neveinek listája, új sorokkal elválasztva. - "Fiók -Adatmegőrzés -Feliratok" + Családi központ menü elrejtése + A családi központ menü el van rejtve. + A családi központ menü látható. + Általános menü elrejtése + Az Általános menü el van rejtve. + Az Általános menü látható. + Fiókmenü elrejtése + A fiókmenü el van rejtve. + A fiókmenü látható. + Adatmegtakarító menü elejtése + Az adatmegtakarító menü el van rejtve. + Az adatmegtakarító menü látható. + Automatikus lejátszás menü elrejtése + Az automatikus lejátszás menü el van rejtve. + Az automatikus lejátszás menü látható. + Videóminőség beállítás menü elrejtése + A videóminőség beállítás menü el van rejtve. + A videóminőség beállítás menü látható. + Háttér menü elrejtése + A háttér menü el van rejtve. + A háttér menü látható. + Megtekintés a tévében menü elrejtése + A megtekintés a tévében menü el van rejtve. + A megtekintés a tévében menü látható. + Minden előzmény kezelése menü elrejtése + A minden előzmény kezelése menü el van rejtve. + A minden előzmény kezelése menü látható. + Adataid a YouTube-on menü elrejtése + Az adataid a YouTube-on menü el van rejtve. + Az adataid a YouTube-on menü látható. + Adatvédelem menü elrejtése + Az adatvédelem menü el van rejtve. + Az adatvédelem menü látható. + Próbálja ki a kísérleti új funkciókat menü elrejtése + A próbálja ki a kísérleti új funkciókat menü el van rejtve. + A próbálja ki a kísérleti új funkciókat menü látható. + Vásárlások és tagságok menü elrejtése + A vásárlások és tagságok menü el van rejtve. + A vásárlások és tagságok menü látható. + Számlázás és fizetés menü elrejtése + A számlázás és fizetés menü el van rejtve. + A számlázás és fizetés menü látható. + Értesítések menü elrejtése + Az értesítések menü el van rejtve. + Az értesítések menü látható. + Csatlakoztatott alkalmazások menü elrejtése + A csatlakoztatott alkalmazások menü el van rejtve. + A csatlakoztatott alkalmazások menü látható. + Élő csevegés menü elrejtése + Az élő csevegés menü el van rejtve. + Az élő csevegés menü látható. + Feliratok menü elrejtése + A feliratok menü el van rejtve. + A feliratok menü látható. + Kisegítő lehetőségek menü elrejtése + A kisegítő lehetőségek menü el van rejtve. + A kisegítő lehetőségek menü látható. + Névjegy menü elrejtése + A névjegy menü el van rejtve. + A névjegy menü látható. Eszköztár Elrejt vagy megváltoztat komponenseket az eszköztáron, mint például a keresősáv, eszköztár gombok és fejléc. @@ -514,6 +570,10 @@ Te fül → Csatorna megtekintése → Menü → Beállítások." Hangkeresés gomb elrejtése A hangkeresés gomb el van rejtve. A hangkeresés gomb látható. + YouTube Doodles elrejtése + A YouTube Doodles el van rejtve. + A YouTube Doodles látható. + "A YouTube emblémák minden évben néhány napra megjelennek.\n\nHa jelenleg egy YouTube embléma látható a régiódban, és az elrejtése be van kapcsolva, akkor a keresősáv alatti szűrősáv is el lesz rejtve." Létrehozás gomb cseréje A létrehozás gombot beállítások gombra cseréli. A gombhoz rendelhető művelet típusa @@ -568,7 +628,7 @@ Megjegyzés: Az info panelek láthatóak. Élő csevegés üzeneteinek elrejtése Az élő csevegés üzenetei el vannak rejtve.\n\nEz a beállítás a Shorts élő videókra is vonatkozik. - Az élő csevegés üzenetei megjelennek.\n\nEz a beállítás a Shorts élő videókra is érvényes. + Az élő csevegés üzenetei megjelennek.\n\nEz a beállítás a Shorts élő videókra is vonatkozik. Egészségügyi panelek elrejtése Az egészségügyi panelek el vannak rejtve. Az egészségügyi panelek láthatóak. @@ -674,9 +734,9 @@ Beállítások → Automatikus lejátszás → Következő videó automatikus le Megjegyzés előnézet elrejtés típusa Ez nem változtatja meg a megjegyzés rész méretét, így lehet a megjegyzés részben élő chat választ nyitni. Ez megváltoztatja a megjegyzés rész méretét, így nem lehet a megjegyzés részben élő chat választ nyitni. - Rövid videók létrehozása gomb elrejtése - A \'Shots létrehozása\' gomb el van rejtve. - A \'Shots létrehozása\' gomb látható. + Short létrehozás gomb elrejtése + A \'Short létrehozása\' gomb el van rejtve. + A \'Short létrehozása\' gomb látható. Köszönöm gomb elrejtése A Köszönöm gomb el van rejtve. A Köszönöm gomb megjelenik. @@ -986,22 +1046,22 @@ Mellékhatás: a Cairo stílus az értesítési pontokra is alkalmazódik." Leírás - Rövidfilmek - A Shorts lejátszás folytatásának kikapcsolása - A Shorts lejátszás nem indul el az alkalmazás indításakor - A Shorts lejátszás folytatódik az alkalmazás indításakor + Shorts + Shorts lejátszó folytatásának letiltása + A Shorts lejátszó nem indul újra az alkalmazás indításakor. + A Shorts lejátszó újraindul az alkalmazás indításakor. Lebegő gomb elrejtése "Az olyan lebegő gombok, mint a „Használja ezt a hangot”, el vannak rejtve a Shorts csatorna lapon." "Az olyan lebegő gombok, mint a „Használja ezt a hangot”, a Shorts csatorna lapon láthatóak." Shorts polcok - Rövid tartalmak polcának elrejtése - "Elrejti a rövid tartalmak polcát. + Shorts polcok elrejtése + "Elrejti a Shorts polcokat. -Korlát: A hivatalos fejlécek a keresési eredményekben el lesznek rejtve." - Elrejtés a kezdőlapon és a kapcsolódó videók között - Elrejtve a kezdőlapon és a kapcsolódó videók között. - Megjelenítve a kezdőlapon és a kapcsolódó videók között. +Mellékhatás: A hivatalos fejlécek a keresési eredményekben el lesznek rejtve." + Elrejtés a kezdőlapon és a kapcsolódó videóknál + Elrejtve a kezdőlapon és a kapcsolódó videóknál. + Látható a kezdőlapon és a kapcsolódó videóknál. Elrejtés a feliratkozások között Elrejtve a feliratkozások között. Megjelenítve a feliratkozások között. @@ -1018,54 +1078,61 @@ Korlát: A hivatalos fejlécek a keresési eredményekben el lesznek rejtve."Szünet Ismétlés - Rövidfilm lejátszó - Komponensek elrejtése vagy megjelenítése a Rövid videók lejátszójában. + Shorts lejátszó + Komponensek elrejtése vagy megjelenítése a Shorts lejátszójában. Csatlakozás gomb elrejtése - A csatlakozás gomb el van rejtve - A csatlakozás gomb meg van jelenítve + A csatlakozás gomb el van rejtve. + A csatlakozás gomb látható. Feliratkozás gomb elrejtése - A feliratkozás gomb el van rejtve - A feliratkozás gomb látható + A feliratkozás gomb el van rejtve. + A feliratkozás gomb látható. Szüneteltetett fejléc elrejtése A szüneteltetett fejléc elrejtve. A szüneteltetett fejléc látható. - Szüneteltetett fedő gombok elrejtése - A szüneteltetett fedő gombok el vannak rejtve - A szüneteltetett fedő gombok megjelennek - Fizetett promóciós címke elrejtése - A fizetett promóciós címke el van rejtve. - A fizetett promóciós címke meg van jelenítve. + Szüneteltetett videóvezérlő gombok elrejtése + A szüneteltetett videóvezérlő gombok el vannak rejtve. + A szüneteltetett fedő gombok láthatóak. Trend gomb elrejtése A Trend gomb el van rejtve. A Trend gomb látható. Vásárlás gomb elrejtése A vásárlás gomb el van rejtve A vásárlás gomb látható. - Infó panel elrejtése - Az infó panel rejtett - Az infó panel megjelenik + Matricák elrejtése + A matricák el vannak rejtve. + A matricák láthatóak. + Fizetett promóciós címke elrejtése + A fizetett promóciós címke el van rejtve. + A fizetett promóciós címke látható. + Infó panelek elrejtése + Az info panelek el vannak rejtve. + Az infó panelek láthatóak. Élő csevegés fejléc elrejtése Az élő csevegés fejléce el van rejtve.\n\nA fejlécben található Vissza gomb nem lesz elrejtve. Az élő csevegés fejléce látható.\n\nA fejlécben található Vissza gomb nem lesz elrejtve. Csatornasáv elrejtése - A csatornasáv el van rejtve - A csatornasáv megjelenik + A csatornasáv el van rejtve. + A csatornasáv látható. Videó címének elrejtése - A cím el van rejtve - A cím megjelenik - Hang metaadatcímke elrejtése - A hang metaadatcímke el van rejtve - A hang metaadatcímke megjelenik + A cím el van rejtve. + A cím látható. + Hang metadata címke elrejtése + A metaadat címke el van rejtve. + A metaadat címke látható. Teljes videólink címke elrejtése - A teljes videólink címke el van rejtve - A teljes videólink címke megjelenik + A videólink címke el van rejtve. + A videólink címke látható. - Hang mentése a lejátszási listára gomb elrejtése - A hang mentése a lejátszási listára gomb el van rejtve - A hang mentése a lejátszási listára gomb megjelenik + Javasolt intézkedések + Zöld képernyő gomb elrejtése + A zöld képernyő gomb el van rejtve. + A zöld képernyő gomb látható. + Zene mentés gomb elrejtése + A zene mentés gomb el van rejtve. + A zene mentés gomb látható. Vásárlás gomb elrejtése - A vásárlás gomb el van rejtve - A vásárlás gomb látható + A vásárlás gomb el van rejtve. + A vásárlás gomb látható. Szuper köszönet gomb elrejtése A Szuper köszönet gomb el van rejtve. A Szuper köszönet gomb látható. @@ -1082,16 +1149,16 @@ Korlát: A hivatalos fejlécek a keresési eredményekben el lesznek rejtve."A keresési javaslatok gomb el van rejtve. A keresési javaslatok gomb látható. Címkézett termékek elrejtése - A címkézett termékek el vannak rejtve - A címkézett termékek megjelennek + A címkézett termékek el vannak rejtve. + A címkézett termékek láthatóak. Akció gombok Tetszik gomb elrejtése - A tetszik gomb elrejtve - A tetszik gomb megjelenik + A tetszik gomb el van rejtve. + A tetszik gomb látható. Nem tetszik gomb elrejtése - A nem tetszik gomb elrejtve - A nem tetszik gomb látható + A nem tetszik gomb el van rejtve. + A nem tetszik gomb látható. Megjegyzések gomb elrejtése A megjegyzések gomb el van rejtve A megjegyzések gomb megjelenik @@ -1106,6 +1173,9 @@ Korlát: A hivatalos fejlécek a keresési eredményekben el lesznek rejtve."A hang gomb megjelenik Animáció / Visszajelzés + Like gomb animáció elrejtése + A szökőkút animáció le van tiltva a Like gombon. + A szökőkút animáció engedélyezve van a Like gombon. Lejátszás & Szünet gomb hátterének elrejtése A gomb háttere elrejtve. A gomb háttere látható. @@ -1536,6 +1606,7 @@ Egy másik kodek kerül alkalmazásra kb. 20 másodperc pufferezés után."Alapértelmezett kliens iOS Android + Android Creator Android beágyazott lejátszó Android tesztcsomag Android TV @@ -1545,7 +1616,7 @@ Egy másik kodek kerül alkalmazásra kb. 20 másodperc pufferezés után."Hamisítás mellékhatásai "• Előfordulhat, hogy a filmeket vagy a fizetős videókat nem lehet lejátszani. • Az élő közvetítések az elejétől kezdődnek." - • Az audiosáv menü hiányzik. + "• Az audiosáv menü hiányzik." "• Az audiosáv menü hiányzik." • A videó esetleg nem játszódik le. Kényszerített iOS AVC (H.264) @@ -1586,7 +1657,6 @@ Egy másik kodek kerül alkalmazásra kb. 20 másodperc pufferezés után."Revancify Kék Revancify Piros YouTube - YouTube (minimalista fejléc) Alap Kizárva Befoglalt diff --git a/src/main/resources/youtube/translations/it-rIT/strings.xml b/src/main/resources/youtube/translations/it-rIT/strings.xml index 2d8928d61..53bfd7b18 100644 --- a/src/main/resources/youtube/translations/it-rIT/strings.xml +++ b/src/main/resources/youtube/translations/it-rIT/strings.xml @@ -6,7 +6,7 @@ ReVanced Extended Cerca %s - Ripristina valori predefiniti. + Ripristina ai valori predefiniti. Opzioni sperimentali Desideri procedere? Riavvia per caricare l\'interfaccia normalmente @@ -73,7 +73,7 @@ Tocca qui per saperne di più su DeArrow." Notifica toast nascosta DeArrow non è disponibile. Endpoint API di DeArrow L\'URL dell\'endpoint della cache delle anteprime DeArrow. - Url API DeArrow Non Valido. + URL API DeArrow non valido. Catture statiche del video Le catture statiche sono prese dall\'inizio, da metà o alla fine di ogni video. Queste immagini sono integrate in YouTube e non viene usata nessuna API esterna. Attiva catture statiche veloci @@ -249,16 +249,16 @@ Limitazioni: • Video con frasi come 'Persone guardano anche' sotto." Nascondi video con poche visualizzazioni Nascondi video con meno di 1.000 visualizzazioni dalla home che sono stati caricati dai canali a cui non si è iscritti. - Nascondi video PROSSIMAMENTE - "Nascondi video con l'etichetta PROSSIMAMENTE. + Nascondi i video PROSSIMAMENTE + "Nascondi i video con l'etichetta PROSSIMAMENTE. -Nota: Abilitare questo nasconde anche il pulsante Notificarmi." +Nota: Abilitare questo nasconde anche il pulsante Notificami." Filtro sul numero di visualizzazioni - Nascondi video home per visualizzazioni - I video della scheda Home feed sono filtrati. - I video della scheda Home feed non sono filtrati. - Nascondi i risultati della ricerca da visualizzazioni + Nascondi video della scheda Home per visualizzazioni + I video della scheda Home sono filtrati. + I video della scheda Home non sono filtrati. + Nascondi i risultati della ricerca per visualizzazioni I risultati della ricerca sono filtrati. I risultati di ricerca non sono filtrati. Nascondi i video della scheda iscrizioni per visualizzazioni @@ -283,6 +283,7 @@ Limitazioni: "Questa impostazione limita il numero massimo di layout che possono essere caricati sulla schermata del player. Se il layout della schermata del player cambia a causa di modifiche lato server, i layout non intenzionali possono essere nascosti sullo schermo del giocatore." + Sfalsamento Generale Cambia la scheda iniziale @@ -331,10 +332,12 @@ Limitazione: Il pulsante indietro sulla barra degli strumenti potrebbe non funzi Rimuovi la finestra di discrezione del visualizzatore "Rimuove la finestra di discrezione del visualizzatore. Questo non aggira la restrizione di età. La accetta solamente in automatico." - Attiva l\'interfaccia da telefono - Camuffa i dpi per usare alcune interfacce da telefono. - Attiva l\'interfaccia da tablet - Camuffa i dpi per usare alcune interfacce da tablet. + Cambia layout + Originale + Telefono + Telefono (max 480 dp) + Tablet + Tablet (Min. 600 dp) Camuffa la versione dell\'app Versione camuffata Versione non camuffata @@ -475,13 +478,66 @@ Se questa impostazione non ha effetto, prova a passare alla modalità Incognito. Menu Impostazioni Nascondi gli elementi del menu delle impostazioni di YouTube. - Nascondi menu impostazioni di YouTube - Nascondi elementi nel menu delle impostazioni di YouTube. - Filtro sul menu delle impostazioni di YouTube - Elenco dei nomi dei menu delle impostazioni di YouTube da filtrare, separati da nuove righe. - "Account -Risparmio dati -Sottotitoli" + Nascondi menu Centro Famiglia + Il menu Centro Famiglia è nascosto. + Il menu Centro Famiglia è mostrato. + Nascondi menu Generale + Menu Generale è nascosto. + Il menu Generale è mostrato. + Nascondi menu Account + Il menu Account è nascosto. + Il menu Account è mostrato. + Nascondi il menu di Salvataggio dati + Il menu di Salvataggio dati è nascosto. + Il menu di Salvataggio dati è mostrato. + Nascondi il menu Riproduzione automatica + Il menu Riproduzione automatica è nascosto. + Il menu Riproduzione automatica è mostrato. + Nascondi il menu Preferenze qualità video + Il menu delle Preferenze di qualità video è nascosto. + Il menu delle Preferenze di qualità video è mostrato. + Nascondi il menu Sfondo + Il menu Sfondo è nascosto. + Il menu Sfondo è mostrato. + Nascondi il menu Guarda nella TV + Il menu Guarda nella TV è nascosto. + Il menu Guarda nella TV è mostrato. + Nascondi il menu Gestisci tutta la cronologia + Il menu Gestisci tutta la cronologia è nascosto. + Il menu Gestisci tutta la cronologia è mostrato. + Nascondi il menu I tuoi dati su YouTube + Il menu I tuoi dati su YouTube è nascosto. + Il menu I tuoi dati su YouTube è mostrato. + Nascondi il menu Privacy + Il menu Privacy è nascosto. + Il menu Privacy è mostrato. + Nascondi il menu Prova le nuove funzionalità sperimentali + Il menu Prova le nuove funzionalità sperimentali è nascosto. + Il menu Prova le nuove funzionalità sperimentali è mostrato. + Nascondi il menu Acquisti e abbonamenti + Il menu Acquisti e abbonamenti è nascosto. + Il menu Acquisti e abbonamenti è mostrato. + Nascondi il menu Fatturazione e pagamenti + Il menu di Fatturazione e pagamenti è nascosto. + Il menu di Fatturazione e pagamenti è mostrato. + Nascondi il menu Notifiche + Il menu delle Notifiche è nascosto. + Il menu delle Notifiche è mostrato. + Nascondi il menu delle App collegate + Il menu delle App collegate è nascosto. + Il menu delle App collegate è mostrato. + Nascondi il menu Chat live + Il menu Chat live è nascosto. + Il menu Chat Live è mostrato. + Nascondi il menu Sottotitoli + Il menu Sottotitoli è nascosto. + Il menu Sottotitoli è mostrato. + Nascondi il menu Accessibilità + Il menu di Accessibilità è nascosto. + Il menu Accessibilità è mostrato. + Nascondi il menu Informazioni + Il menu Informazioni è nascosto. + Il menu Informazioni è mostrato. Barra degli strumenti Nascondi o cambia i componenti situati sulla barra degli strumenti, come la barra di ricerca, i pulsanti della barra degli strumenti, e l\'intestazione. @@ -517,6 +573,12 @@ Scheda Tu → Visualizza canale → Menu → Impostazioni" Nascondi pulsante di ricerca vocale Il pulsante di ricerca vocale è nascosto. Il pulsante di ricerca vocale è visibile. + Nascondi i Doodle Di YouTube + I Doodle di YouTube sono nascosti. + I Doodle di YouTube sono mostrati. + "Il Doodle di YouTube si presenta un paio di giorni ogni anno. + +Se un Doodle di YouTube è attualmente mostrato nella tua regione e questa impostazione nascondi è attiva, poi la barra dei filtri sotto la barra di ricerca sarà anche nascosta." Sostituisci il pulsante Crea Sostituisce il pulsante Crea con il pulsante Impostazioni. Tipo di azione da assegnare al pulsante @@ -1039,15 +1101,18 @@ Effetto collaterale: il tema Cairo viene applicato anche ai punti di notifica."< Nascondi i pulsanti di sovrapposizione in pausa I pulsanti di sovrapposizione in pausa sono nascosti. I pulsanti di sovrapposizione in pausa sono mostrati. - Nascondi l\'etichetta della promozione a pagamento - L\'etichetta della promozione a pagamento è nascosta. - L\'etichetta della promozione a pagamento è mostrato. Nascondi pulsante Tendenze Il pulsante Tendenze è nascosto. Il pulsante Tendenze è mostrato. Nascondi pulsante Shopping Il pulsante shopping è nascosto. Il pulsante shopping è mostrato. + Nascondi adesivi + Gli adesivi sono nascosti. + Gli adesivi sono visibili. + Nascondi l\'etichetta della promozione a pagamento + L\'etichetta della promozione a pagamento è nascosta. + L\'etichetta della promozione a pagamento è mostrato. Nascondi i pannelli informativi I pannelli informativi sono nascosti. I pannelli informativi sono mostrati. @@ -1071,9 +1136,9 @@ Effetto collaterale: il tema Cairo viene applicato anche ai punti di notifica."< Nascondi pulsante schermo verde Il pulsante dello schermo verde è nascosto. Il pulsante schermo verde è mostrato. - Nascondi il pulsante Salva suono nella playlist - Il pulsante Salva suono nella playlist è nascosto. - Il pulsante Salva suono nella playlist è mostrato. + Nascondi il pulsante Salva musica + Il pulsante Salva musica è nascosto. + Il pulsante Salva musica è visibile. Nascondi il pulsante Negozio Il pulsante Negozio è nascosto. Il pulsante negozio è mostrato. @@ -1557,6 +1622,7 @@ Tocca il pulsante continua e disabilita le ottimizzazioni della batteria."Client predefinito iOS Android + Creatore Android Riproduttore Incorporato Android Suite di test Android Android TV @@ -1565,7 +1631,7 @@ Tocca il pulsante continua e disabilita le ottimizzazioni della batteria."Web Effetti collaterali del camuffamento "• I film o i video a pagamento potrebbero non essere riprodotti." - • il menu traccia audio è mancante. + "• il menu traccia audio è mancante." "• il menu traccia audio è mancante." • Il video potrebbe non essere riprodotto. Forza iOS AVC (H.264) @@ -1608,7 +1674,6 @@ AVC (H. 264) ha una risoluzione massima di 1080p e la riproduzione video utilizz Revancify Blu Revancify Rosso YouTube - YouTube (Intestazione minima) Inventario Escluso Incluso diff --git a/src/main/resources/youtube/translations/ja-rJP/strings.xml b/src/main/resources/youtube/translations/ja-rJP/strings.xml index dc572aeb8..622c98362 100644 --- a/src/main/resources/youtube/translations/ja-rJP/strings.xml +++ b/src/main/resources/youtube/translations/ja-rJP/strings.xml @@ -10,7 +10,7 @@ 実験的な機能 続行しますか? 再起動してレイアウトを正常に読み込みます - 再起動して更新 + 再起動して設定を適用します 通常 外部ダウンローダーのパッケージ名 NewPipe や YTDLnis などの、インストールされている外部ダウンローダーアプリのパッケージ名です。 @@ -56,26 +56,26 @@ [ホーム]タブ [登録チャンネル]タブ [マイページ]タブ - 再生リスト, おすすめ + 再生リスト、おすすめ 検索結果 オリジナルサムネイル DeArrow & オリジナルサムネイル DeArrow & 静止画サムネイル 静止画サムネイル DeArrow - "DeArrowは、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。 有効にすると、動画のURLが API サーバーに送信されますが、他のデータは送信されません。 動画にDeArrowサムネイルがない場合は、オリジナルまたは静止画サムネイルが表示されます。 + "DeArrow は、YouTube 動画のサムネイルをクラウドソーシングで提供する機能です。DeArrow のサムネイルは、YouTube が提供するサムネイルよりも適切なことが多いです。 これを有効にすると、動画のURLが API サーバーに送信されますが、他のデータは送信されません。 動画に DeArrow サムネイルがない場合は、オリジナルまたは静止画サムネイルが表示されます。 -DeArrowの詳細については、ここをタップしてください。" +DeArrow の詳細については、ここをタップしてください。" API が利用できない場合にトーストを表示 DeArrow が利用できない場合、トーストを表示します。 DeArrow が利用できない場合、トーストを表示します。 DeArrow API エンドポイント - DeArrowサムネイルキャッシュエンドポイントのURL + DeArrow サムネイルキャッシュエンドポイントの URLです。 無効な DeArrow API の URL です。 静止画サムネイルについて 静止画サムネイルは、各動画の最初/中間/最後の部分から取得されます。これらの画像は YouTube に直接組み込まれており、外部 API は使用されません。 高速な静止画サムネイル - 現在の設定: 中画質の静止画サムネイルを使用します。読み込みは速くなりますが、ライブ、公開予定、非常に古い動画は、サムネイルが空白になることがあります。 + 現在の設定: 中画質の静止画サムネイルを使用します。\n\n注意: 読み込みは速くなりますが、ライブ、公開予定、非常に古い動画は、サムネイルが空白になることがあります。 現在の設定: 高画質の静止画サムネイルを使用します。 取得する静止画のサムネイルの位置 動画の最初 @@ -111,14 +111,14 @@ DeArrowの詳細については、ここをタップしてください。"検索結果に表示される、展開可能な棚を非表示にします。 検索結果に表示される、展開可能な棚を非表示にします。 字幕ボタンを非表示 - フィードで字幕ボタンを非表示にします。 - フィードで字幕ボタンを非表示にします。 - フィードの検索バーを非表示 - フィードの検索バーを非表示にします。 - フィードの検索バーを非表示にします。 - フィードのアンケートを非表示 - ホームページと登録チャンネルフィードのアンケートを非表示にします。 - ホームページと登録チャンネルフィードのアンケートを非表示にします。 + フィードから字幕ボタンを非表示にします。 + フィードから字幕ボタンを非表示にします。 + 検索バーを非表示 + フィードから検索バーを非表示にします。 + フィードから検索バーを非表示にします。 + アンケートを非表示 + ホームページと登録チャンネルフィードからアンケートを非表示にします。 + ホームページと登録チャンネルフィードからアンケートを非表示にします。 画像欄を非表示 画像欄を非表示にします。 画像欄を非表示にします。 @@ -151,7 +151,7 @@ DeArrowの詳細については、ここをタップしてください。"検索結果/関連動画からチケット欄を非表示にします。 カテゴリーバー - フィード、検索、関連動画でカテゴリバーを非表示または表示します。 + フィード、検索、関連動画からカテゴリバーを非表示または表示します。 フィードから非表示 フィードから非表示にします。 フィードから非表示にします。 @@ -168,7 +168,7 @@ DeArrowの詳細については、ここをタップしてください。"チャンネルタブのフィルターを有効化します。 チャンネルタブのフィルターを有効化します。 チャンネルタブのフィルター - フィルタリングする「チャンネルタブ名」のリスト。(改行区切り) + フィルタリングする「チャンネルタブ名」のリスト(改行区切り) "ショート プレイリスト ストア" @@ -222,8 +222,11 @@ DeArrowの詳細については、ここをタップしてください。"キーワードでコメントをフィルタリングします。 キーワードでコメントをフィルタリングします。 キーワードでフィルタリング - "非表示にするキーワードやフレーズを入力します。(改行区切り) -真ん中に大文字がある単語は、大文字と小文字を区別して入力する必要があります 。(例: iPhone、TikTok、LeBlanc)" + "非表示にするキーワードやフレーズを入力します。(改行区切り) + +キーワードには、チャンネル名や動画のタイトルに表示されるテキストを使用できます。 + +真ん中に大文字がある単語は、大文字と小文字を区別して入力する必要があります。(例: iPhone、TikTok、LeBlanc)" キーワードフィルタリングについて "ホーム / 登録チャンネル / 検索結果 は、キーワードやフレーズに一致するコンテンツを非表示にするようにフィルタリングされます。 注意: @@ -281,6 +284,7 @@ DeArrowの詳細については、ここをタップしてください。""これを有効にすると、プレーヤー画面に読み込まれるレイアウトの最大数を制限します。 注意: サーバー側の変更によりプレーヤー画面のレイアウトが変更された場合、意図しないレイアウトがプレーヤー画面上から非表示になる可能性があります。" + オフセット 全般 起動時のページを変更 @@ -313,8 +317,8 @@ DeArrowの詳細については、ここをタップしてください。" 字幕の強制を無効化 - 字幕の自動的な強制を無効化します。 - 字幕の自動的な強制を無効化します。 + 投稿者が設定している字幕の強制を無効にします。 + 投稿者が設定している字幕の強制を無効にします。 スプラッシュアニメーションを無効化 YouTube 起動時のスプラッシュアニメーションを無効にします。 YouTube 起動時のスプラッシュアニメーションを無効にします。 @@ -333,10 +337,12 @@ DeArrowの詳細については、ここをタップしてください。"年齢制限ダイアログを削除 "年齢制限ダイアログを削除します。 これにより年齢制限を回避することはできませんが、自動的に同意します。" - スマートフォン用のレイアウトを有効化 - スマートフォン用レイアウトの一部を使用できるように、dpi を偽装します。 - タブレット用のレイアウトを有効化 - タブレット用レイアウトの一部を使用できるように、dpi を偽装します。 + レイアウトを変更 + オリジナル + スマホ + スマホ(最大 480 dp) + タブレット + タブレット(最小 600 dp) アプリのバージョンを偽装 アプリのバージョンは偽装されています。 アプリのバージョンは偽装されていません。 @@ -477,13 +483,66 @@ DeArrowの詳細については、ここをタップしてください。" 設定メニュー 「YouTube 設定」メニューの要素を非表示にします。 - YouTube 設定メニューを非表示 - 「YouTube 設定」メニューの要素を非表示にします。 - YouTube 設定メニューフィルター - フィルタリングするYouTube設定メニュー名のリスト(改行区切り) - "アカウント -データの節約 -字幕" + ファミリーセンターメニューを非表示 + 「ファミリーセンター」メニューを非表示にします。 + 「ファミリーセンター」メニューを非表示にします。 + 全般メニューを非表示 + 「全般」メニューを非表示にします。 + 「全般」メニューを非表示にします。 + アカウントメニューを非表示 + 「アカウント」メニューを非表示にします。 + 「アカウント」メニューを非表示にします。 + データの節約メニューを非表示 + 「データの節約」メニューを非表示にします。 + 「データの節約」メニューを非表示にします。 + 自動再生メニューを非表示 + 「自動再生」メニューを非表示にします。 + 「自動再生」メニューを非表示にします。 + 動画の画質設定メニューを非表示 + 「動画の画質設定」メニューを非表示にします。 + 「動画の画質設定」メニューを非表示にします。 + バックグラウンドメニューを非表示 + 「バックグラウンド」メニューを非表示にします。 + 「バックグラウンド」メニューを非表示にします。 + テレビで見るメニューを非表示 + 「テレビで見る」メニューを非表示にします。 + 「テレビで見る」メニューを非表示にします。 + すべての履歴を管理メニューを非表示 + 「すべての履歴を管理」メニューを非表示にします。 + 「すべての履歴を管理」メニューを非表示にします。 + YouTube でのデータメニューを非表示 + 「YouTube でのデータ」メニューを非表示にします。 + 「YouTube でのデータ」メニューを非表示にします。 + プライバシーメニューを非表示 + 「プライバシー」メニューを非表示にします。 + 「プライバシー」メニューを非表示にします。 + 試験運用版の新機能を試すメニューを非表示 + 「試験運用版の新機能を試す」メニューを非表示にします。 + 「試験運用版の新機能を試す」メニューを非表示にします。 + 購入とメンバーシップメニューを非表示 + 「購入とメンバーシップ」メニューを非表示にします。 + 「購入とメンバーシップ」メニューを非表示にします。 + 請求とお支払いメニューを非表示 + 「請求とお支払い」メニューを非表示にします。 + 「請求とお支払い」メニューを非表示にします。 + 通知メニューを非表示 + 「通知」メニューを非表示にします。 + 「通知」メニューを非表示にします。 + 接続済みのアプリメニューを非表示 + 「接続済みのアプリ」メニューを非表示にします。 + 「接続済みのアプリ」メニューを非表示にします。 + チャットメニューを非表示 + 「チャット」メニューを非表示にします。 + 「チャット」メニューを非表示にします。 + 字幕メニューを非表示 + 「字幕」メニューを非表示にします。 + 「字幕」メニューを非表示にします。 + ユーザー補助メニューを非表示 + 「ユーザー補助」メニューを非表示にします。 + 「ユーザー補助」メニューを非表示にします。 + アプリに関する情報メニューを非表示 + 「アプリに関する情報」メニューを非表示にします。 + 「アプリに関する情報」メニューを非表示にします。 ツールバー ツールバーのボタン、検索バー、ヘッダーなどのツールバーにあるコンポーネントを非表示または変更できます。 @@ -519,6 +578,12 @@ DeArrowの詳細については、ここをタップしてください。"音声検索ボタンを非表示 「音声検索」ボタンを非表示にします。 「音声検索」ボタンを非表示にします。 + YouTube Doodle を非表示 + YouTube Doodle を非表示にします。 + YouTube Doodle を非表示にします。 + "YouTube Doodle とは、左上の YouTube ロゴが祝日や記念日などにその日にあわせたデザインに変更されるロゴのことです。 + +注意: 現在お住まいの地域で YouTube Doodle が表示されていて、この設定がオンの場合、検索欄の下のフィルターバーも非表示になります。" 「作成」ボタンを置換 「作成」ボタンを「設定」ボタンに置き換えます。 ボタンに割り当てるアクションの種類 @@ -1031,15 +1096,18 @@ DeArrowの詳細については、ここをタップしてください。"一時停止中のオーバーレイボタンを非表示 一時停止中に表示されるオーバーレイボタンを非表示にします。 一時停止中に表示されるオーバーレイボタンを非表示にします。 - 有料プロモーションラベルを非表示 - プレーヤー左上の「プロモーションを含みます」を非表示にします。 - プレーヤー左上の「プロモーションを含みます」を非表示にします。 「トレンド」ボタンを非表示 「トレンド」ボタンを非表示にします。 「トレンド」ボタンを非表示にします。 「購入」ボタンを非表示 ショートで左下に表示される「購入」ボタンを非表示にします。 ショートで左下に表示される「購入」ボタンを非表示にします。 + ステッカーを非表示 + ステッカーを非表示にします。 + ステッカーを非表示にします。 + 有料プロモーションラベルを非表示 + プレーヤー左上の「プロモーションを含みます」を非表示にします。 + プレーヤー左上の「プロモーションを含みます」を非表示にします。 情報パネルを非表示 情報パネルを非表示にします。 情報パネルを非表示にします。 @@ -1063,9 +1131,9 @@ DeArrowの詳細については、ここをタップしてください。"グリーンスクリーンボタンを非表示 プレーヤーの下部に表示される「グリーンスクリーン」ボタンを非表示にします。 プレーヤーの下部に表示される「グリーンスクリーン」ボタンを非表示にします。 - 「保存」ボタンを非表示 - 音楽の「保存」ボタンを非表示にします。 - 音楽の「保存」ボタンを非表示にします。 + 保存ボタンを非表示 + 楽曲の「保存」ボタンを非表示にします。 + 楽曲の「保存」ボタンを非表示にします。 「ショップ」ボタンを非表示 「ショップ」ボタンを非表示にします。 「ショップ」ボタンを非表示にします。 @@ -1554,6 +1622,7 @@ DeArrowの詳細については、ここをタップしてください。"偽装するクライアントの種類 iOS Android + Android Creator Android 埋め込みプレーヤー Android Testsuite Android TV @@ -1565,9 +1634,10 @@ DeArrowの詳細については、ここをタップしてください。" - ・「音声トラック」メニューは表示されません。 - "・「音声トラック」メニューは表示されません。 -• 「一定音量」は使用できません。" + "・「音声トラック」メニューは表示されません。 +・「一定音量」は使用できません。" + "•「音声トラック」メニューは表示されません。 +•「一定音量」は使用できません。" • 動画が再生できない可能性があります。 iOS クライアントで AVC (H.264) を強制 iOS クライアントで AVC コーデック (H.264) を強制します。 @@ -1609,7 +1679,6 @@ DeArrowの詳細については、ここをタップしてください。"Revancify Blue Revancify Red YouTube - YouTube (ロゴのみ) オリジナル 除外されています 適用されています diff --git a/src/main/resources/youtube/translations/ko-rKR/strings.xml b/src/main/resources/youtube/translations/ko-rKR/strings.xml index 79c3a1181..9757f1370 100644 --- a/src/main/resources/youtube/translations/ko-rKR/strings.xml +++ b/src/main/resources/youtube/translations/ko-rKR/strings.xml @@ -7,7 +7,7 @@ ReVanced Extended 설정 %s 검색 기본값으로 초기화합니다. - 실험적인 기능 + 실험 기능 계속하시겠습니까? 레이아웃을 정상적으로 불러오기 위해 다시 시작합니다. 새로고침 및 다시 시작 @@ -191,13 +191,13 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 추천 선반이 표시됩니다. 커뮤니티 게시물 - 피드와 채널에서 커뮤니티 게시물을 숨기거나 표시할 수 있습니다. + 피드 및 채널에서 커뮤니티 게시물을 숨기거나 표시할 수 있습니다. 채널에서 커뮤니티 게시물 숨기기 채널에서 커뮤니티 게시물이 숨겨집니다. 채널에서 커뮤니티 게시물이 표시됩니다. - 홈 피드와 관련 동영상에서 커뮤니티 게시물 숨기기 - 홈 피드와 관련 동영상에서 커뮤니티 게시물이 숨겨집니다. - 홈 피드와 관련 동영상에서 커뮤니티 게시물이 표시됩니다. + 홈 피드 및 관련 동영상에서 커뮤니티 게시물 숨기기 + 홈 피드 및 관련 동영상에서 커뮤니티 게시물이 숨겨집니다. + 홈 피드 및 관련 동영상에서 커뮤니티 게시물이 표시됩니다. 구독 피드에서 커뮤니티 게시물 숨기기 구독 피드에서 커뮤니티 게시물이 숨겨집니다. 구독 피드에서 커뮤니티 게시물이 표시됩니다. @@ -307,7 +307,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 구독 인기 급상승 나중에 볼 동영상 - 앱 시작 페이지 타입 변경하기 + 앱 시작 페이지 유형 변경하기 "앱 시작 페이지가 항상 변경됩니다. 알려진 문제점: 툴바에서 '뒤로 가기' 버튼이 작동되지 않을 수 있습니다." @@ -335,10 +335,12 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 스낵바(팝업 메시지바)가 표시됩니다. 시청 경고 다이얼로그 제거하기 "시청 경고 다이얼로그를 제거합니다.\n\n• 이 설정은 다이얼로그를 자동으로 허용하기만 하며 연령 제한(성인인증 절차)을 우회할 수 없습니다.\n• 즉, 성인인증이 필요한 동영상에서 인증을 하려 할 때, 휴대폰 번호가 필요하다고 알려주는 소형 팝업창(다이얼로그) 없이 바로 휴대폰 번호 인증 페이지가 표시됩니다." - 휴대폰 레이아웃 활성화하기 - dpi를 변경하여 일부 레이아웃을 휴대폰 레이아웃으로 활성화합니다.\n\n• \'태블릿 레이아웃으로 활성화하면 잠겨지는 RVX 설정\'이 태블릿 또는 폴더블 폰에서는 기본적으로 잠겨져 있으므로, 이 설정을 사용하고 싶으면 휴대폰 레이아웃으로 활성화해야 합니다. - 태블릿 레이아웃 활성화하기 - dpi를 변경하여 일부 레이아웃을 태블릿 레이아웃으로 활성화합니다.\n\n이 설정을 활성화하면 다음 RVX 설정이 잠겨질 수 있습니다:\n• 커뮤니티 게시물 숨기기\n• 믹스 재생목록 숨기기\n• 최신 동영상 버튼 숨기기\n• 관련 동영상 오버레이 숨기기 + 레이아웃 변경하기 + 기기 기본값 사용 + + 폰 (최대 너비: 480 dp) + 태블릿 + 태블릿 (최소 너비: 600 dp) 앱 버전 변경하기 앱 버전을 변경합니다. 앱 버전을 변경하지 않습니다. @@ -355,9 +357,9 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 18.48.39 - \'조회수\' & \'좋아요\'의 실시간 업데이트를 비활성화합니다. 계정 메뉴 - 계정 메뉴와 내 페이지 탭에서 구성요소를 숨기거나 표시할 수 있습니다. + 계정 메뉴 및 내 페이지에서 구성요소를 숨기거나 표시할 수 있습니다. 계정 메뉴 숨기기 - "계정 메뉴 및 나 탭에서 구성요소가 숨겨집니다. + "계정 메뉴 및 내 페이지에서 구성요소가 숨겨집니다. 일부 구성요소는 숨겨지지 않을 수 있습니다." 계정 메뉴 필터 편집하기 필터링할 계정 메뉴 이름을 줄바꿈으로 구분하여 설정합니다. @@ -401,7 +403,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 미니 플레이어 앱 내에서 최소화된 플레이어의 스타일을 변경할 수 있습니다. - 미니 플레이어 타입 설정 + 미니 플레이어 유형 설정 기기 기본값 사용 태블릿 @@ -475,13 +477,66 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 설정 메뉴 YouTube 설정 메뉴에서 구성요소를 숨길 수 있습니다. - YouTube 설정 메뉴 숨기기 - YouTube 설정 메뉴에서 구성요소를 숨깁니다. - YouTube 설정 메뉴 필터 - 필터링할 YouTube 설정 메뉴 이름을 줄바꿈으로 구분하여 설정합니다. - "계정 -데이터 절약 -자막" + 가족 센터 메뉴 숨기기 + 가족 센터 메뉴가 숨겨집니다. + 가족 센터 메뉴가 표시됩니다. + 일반 메뉴 숨기기 + 일반 메뉴가 숨겨집니다. + 일반 메뉴가 표시됩니다. + 계정 메뉴 숨기기 + 계정 메뉴가 숨겨집니다. + 계정 메뉴가 표시됩니다. + 데이터 절약 메뉴 숨기기 + 데이터 절약 메뉴가 숨겨집니다. + 데이터 절약 메뉴가 표시됩니다. + 자동재생 메뉴 숨기기 + 자동재생 메뉴가 숨겨집니다. + 자동재생 메뉴가 표시됩니다. + 동영상 화질 환경설정 메뉴 숨기기 + 동영상 화질 환경설정 메뉴가 숨겨집니다. + 동영상 화질 환경설정 메뉴가 표시됩니다. + 백그라운드 메뉴 숨기기 + 백그라운드 메뉴가 숨겨집니다. + 백그라운드 메뉴가 표시됩니다. + \'TV로 시청하기\' 메뉴 숨기기 + \'TV로 시청하기\' 메뉴가 숨겨집니다. + \'TV로 시청하기\' 메뉴가 표시됩니다. + 전체 기록 관리 메뉴 숨기기 + 전체 기록 관리 메뉴가 숨겨집니다. + 전체 기록 관리 메뉴가 표시됩니다. + YouTube의 내 데이터 메뉴 숨기기 + YouTube의 내 데이터 메뉴가 숨겨집니다. + YouTube의 내 데이터 메뉴가 표시됩니다. + 공개 설정 메뉴 숨기기 + 공개 설정 메뉴가 숨겨집니다. + 공개 설정 메뉴가 표시됩니다. + \'새 실험 기능 사용해 보기\' 메뉴 숨기기 + \'새 실험 기능 사용해 보기\' 메뉴가 숨겨집니다. + \'새 실험 기능 사용해 보기\' 메뉴가 표시됩니다. + 구매 항목 및 멤버십 메뉴 숨기기 + 구매 항목 및 멤버십 메뉴가 숨겨집니다. + 구매 항목 및 멤버십 메뉴가 표시됩니다. + 청구 및 결제 메뉴 숨기기 + 청구 및 결제 메뉴가 숨겨집니다. + 청구 및 결제 메뉴가 표시됩니다. + 알림 메뉴 숨기기 + 알림 메뉴가 숨겨집니다. + 알림 메뉴가 표시됩니다. + 연결된 앱 메뉴 숨기기 + 연결된 앱 메뉴가 숨겨집니다. + 연결된 앱 메뉴가 표시됩니다. + 실시간 채팅 메뉴 숨기기 + 실시간 채팅 메뉴가 숨겨집니다. + 실시간 채팅 메뉴가 표시됩니다. + 자막 메뉴 숨기기 + 자막 메뉴가 숨겨집니다. + 자막 메뉴가 표시됩니다. + 접근성 메뉴 숨기기 + 접근성 메뉴가 숨겨집니다. + 접근성 메뉴가 표시됩니다. + 정보 메뉴 숨기기 + 정보 메뉴가 숨겨집니다. + 정보 메뉴가 표시됩니다. 툴바 툴바에서 버튼, 검색창, 헤더와 같은 구성요소를 숨기거나 변경할 수 있습니다. @@ -494,11 +549,11 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 헤더가 있는 넓은 검색창 활성화하기 YouTube 헤더가 있는 넓은 검색창 YouTube 헤더가 없는 넓은 검색창 - 나 탭에서 넓은 검색창 활성화하기 - "이 설정을 활성화하면 나 탭의 설정 버튼이 비활성화됩니다. + 내 페이지에서 넓은 검색창 활성화하기 + "이 설정을 활성화하면 내 페이지에서 설정 버튼이 비활성화됩니다. 이 경우에 설정 메뉴를 보려면 다음 경로를 사용하세요: -나 탭 → 채널 보기 → 메뉴 더보기 (툴바) → 설정" +내 페이지 → 채널 보기 → 메뉴 더보기 (툴바) → 설정" 크롬캐스트 버튼 숨기기 크롬캐스트 버튼이 숨겨집니다. 크롬캐스트 버튼이 표시됩니다. @@ -517,6 +572,12 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 음성 검색 버튼 숨기기 음성 검색 버튼이 숨겨집니다. 음성 검색 버튼이 표시됩니다. + YouTube Doodles 숨기기 + YouTube Doodles가 숨겨집니다.\n• 이벤트성 YouTube 헤더 + YouTube Doodles가 표시됩니다.\n• 이벤트성 YouTube 헤더 + "YouTube Doodles는 공휴일이나 기념일 등, 그날에 맞춘 디자인으로 변경되는 왼쪽 상단의 YouTube 헤더를 말합니다. + +현재 거주하는 지역에서 YouTube Doodles가 표시되어 있는데 이 설정이 활성화되어 있는 경우에는 검색창 아래에 표시되는 카테고리 바도 숨겨집니다." 만들기 버튼 변경하기 만들기 버튼을 설정 버튼으로 변경합니다. 버튼에 설정할 동작 유형 @@ -675,7 +736,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 댓글 미리보기 숨기기 댓글 미리보기가 숨겨집니다. 댓글 미리보기가 표시됩니다. - 댓글 미리보기 타입 숨기기 + 댓글 미리보기 유형 숨기기 댓글 섹션의 크기가 변경되지 않으므로 댓글 섹션에서 실시간 채팅 다시보기를 열 수 있습니다. 댓글 섹션의 크기가 변경되므로 댓글 섹션에서 실시간 채팅 다시보기를 열 수 없습니다. Shorts 만들기 버튼 숨기기 @@ -690,7 +751,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 메뉴 구성요소 플레이어에서 메뉴 구성요소를 숨기거나 변경할 수 있습니다. - 토글 타입 변경하기 + 토글 유형 변경하기 텍스트 토글으로 표시합니다. 스위치 토글으로 표시합니다. 오디오 트랙 메뉴 숨기기 @@ -1011,9 +1072,9 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." • 이전에 시청한 동영상 • 관련 검색어의 검색결과 • 새로운 맞춤 채널 ..." - 홈 피드와 관련 동영상에서 Shorts 선반 숨기기 - 홈 피드와 관련 동영상에서 Shorts 선반이 숨겨집니다. - 홈 피드와 관련 동영상에서 Shorts 선반이 표시됩니다. + 홈 피드 및 관련 동영상에서 Shorts 선반 숨기기 + 홈 피드 및 관련 동영상에서 Shorts 선반이 숨겨집니다. + 홈 피드 및 관련 동영상에서 Shorts 선반이 표시됩니다. 구독 피드에서 Shorts 선반 숨기기 구독 피드에서 Shorts 선반이 숨겨집니다. 구독 피드에서 Shorts 선반이 표시됩니다. @@ -1044,15 +1105,18 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 일시 정지 오버레이 버튼 숨기기 플레이어 왼쪽 상단에서 다음 버튼들이 숨겨집니다.\n• 구독 & 라이브 & 트렌드 & 쇼핑 플레이어 왼쪽 상단에서 다음 버튼들이 표시됩니다.\n• 구독 & 라이브 & 트렌드 & 쇼핑 - 유료 광고 포함 라벨 숨기기 - 유료 광고 포함 라벨이 숨겨집니다. - 유료 광고 포함 라벨이 표시됩니다. 트렌드 버튼 숨기기 트렌드 버튼이 숨겨집니다. 트렌드 버튼이 숨겨집니다. 쇼핑 버튼 숨기기 일시 정지 오버레이에서 쇼핑 버튼이 숨겨집니다. 일시 정지 오버레이에서 쇼핑 버튼이 표시됩니다. + 스티커 숨기기 + 스티커가 숨겨집니다. + 스티커가 표시됩니다. + 유료 광고 포함 라벨 숨기기 + 유료 광고 포함 라벨이 숨겨집니다. + 유료 광고 포함 라벨이 표시됩니다. 정보 패널 숨기기 정보 패널이 숨겨집니다. 정보 패널이 표시됩니다. @@ -1076,9 +1140,9 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 그린 스크린 버튼 숨기기 그린 스크린 버튼이 숨겨집니다. 그린 스크린 버튼이 표시됩니다. - (재생목록에) 음악 저장 버튼 숨기기 - (재생목록에) 음악 저장 버튼이 숨겨집니다. - (재생목록에) 음악 저장 버튼이 표시됩니다. + (재생목록에) 음악 저장 버튼 숨기기 + (재생목록에) 음악 저장 버튼이 숨겨집니다. + (재생목록에) 음악 저장 버튼이 표시됩니다. 쇼핑 버튼 숨기기 플레이어 하단 정보에서 쇼핑 버튼이 숨겨집니다. 플레이어 하단 정보에서 쇼핑 버튼이 표시됩니다. @@ -1122,9 +1186,9 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 사운드 버튼이 표시됩니다. 애니메이션 / 피드백 - 좋아요 버튼 애니메이션 비활성화하기 - 좋아요 버튼 위에 있는 애니메이션을 비활성화합니다. - 좋아요 버튼 위에 있는 애니메이션을 활성화합니다. + 좋아요 상단 애니메이션 비활성화하기 + 좋아요 버튼 상단에 표시되는 애니메이션을 비활성화합니다. + 좋아요 버튼 상단에 표시되는 애니메이션을 활성화합니다. 재생 & 일시 정지 버튼 배경 숨기기 버튼 배경이 숨겨집니다. 버튼 배경이 표시됩니다. @@ -1218,7 +1282,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 사용자 정의 동영상 재생 속도 활성화하기 사용자 정의 동영상 재생 속도를 활성화합니다. 사용자 정의 동영상 재생 속도를 비활성화합니다. - 사용자 정의 동영상 재생 속도 메뉴 타입 설정 + 사용자 정의 동영상 재생 속도 메뉴 유형 설정 사용자 정의 다이얼로그를 활성화합니다. 이전 메뉴 구성요소를 활성화합니다. 사용자 정의 동영상 재생 속도 편집하기 @@ -1563,6 +1627,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." 기본 클라이언트 iOS Android + Android Creator Android Embedded Player Android TestSuite Android TV @@ -1571,7 +1636,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요." Web 알려진 문제점 "• 영화 또는 유료 동영상이 재생되지 않을 수 있습니다.\n• 되감기가 가능한 실시간 스트림이 라이브 중인 시점이 아닌 처음부터 재생될 수 있습니다.\n• 동영상이 1초 일찍 종료될 수 있습니다.\n• OPUS 오디오 코덱이 지원되지 않습니다." - • 오디오 트랙 메뉴가 표시되지 않습니다.\n• 안정적인 볼륨 메뉴가 비활성화된 채로 잠겨있습니다. + "• 오디오 트랙 메뉴가 표시되지 않습니다.\n• 안정적인 볼륨 메뉴가 비활성화된 채로 잠겨있습니다." "• 오디오 트랙 메뉴가 표시되지 않습니다.\n• 안정적인 볼륨 메뉴가 비활성화된 채로 잠겨있습니다." • 동영상이 재생되지 않을 수 있습니다. iOS AVC (H.264) 강제로 활성화하기 @@ -1588,7 +1653,7 @@ AVC (H.264)의 최대 화질 값은 1080p이며 동영상을 재생하면 VP9 시청 기록과 관련된 설정을 변경할 수 있습니다. 전체 기록 관리 YouTube 시청 기록을 관리하려면 여기를 누르세요. - 시청 기록 타입 설정 + 시청 기록 유형 설정 기본값 도메인 변경 시청 기록 차단 @@ -1614,7 +1679,6 @@ AVC (H.264)의 최대 화질 값은 1080p이며 동영상을 재생하면 VP9 Revancify Blue Revancify Red YouTube - YouTube (최소화된 헤더) YouTube 제외된 패치 포함된 패치 diff --git a/src/main/resources/youtube/translations/pl-rPL/strings.xml b/src/main/resources/youtube/translations/pl-rPL/strings.xml index 8d77a12ee..a0940efba 100644 --- a/src/main/resources/youtube/translations/pl-rPL/strings.xml +++ b/src/main/resources/youtube/translations/pl-rPL/strings.xml @@ -284,6 +284,7 @@ Ograniczenia: "Ustawienie te ogranicza maksymalną ilość układów aplikacji, jakie mogą być załadowane na ekranie odtwarzacza. Jeśli układ ekranu odtwarzacza zmieni się w skutek zmian po stronie serwera, niepożądane układy mogą być ukryte na ekranie odtwarzacza." + Przesunięcie Ogólne Strona startowa @@ -332,10 +333,12 @@ Ograniczenie: Przycisk wstecz na pasku narzędzi może nie działać." Usuń okno dialogowe treści ograniczonej do oglądania "Usuwa okno dialogowe treści ograniczonej do oglądania. Nie pomija to ograniczeń wiekowych, lecz akceptuje je automatycznie." - Układ telefonu - Oszukuje dpi, aby używać układu telefonu - Układ tabletu - Oszukuje dpi, aby używać układu tabletu + Układ aplikacji + Oryginalny + Telefonowy + Telefonowy (max. 480 dpi) + Tabletowy + Tabletowy (max. 600 dpi) Oszukiwanie wersji aplikacji Włączone Wyłączone @@ -477,13 +480,66 @@ Jeśli opcja nie przynosi skutku, spróbuj przełączyć się na tryb incognito. Menu ustawień Ukryj elementy menu ustawień YouTube - Menu ustawień YouTube - Ukryj elementy menu ustawień YouTube - Filtr ustawień YouTube - Lista nazw ustawień YouTube do filtrowania, która musi być oddzielona nowymi liniami. - "Konto -Oszczędzanie danych -Napisy" + Centrum rodziny + Ukryte + Widoczne + Ogólne + Ukryte + Widoczne + Konto + Ukryte + Widoczne + Oszczędzanie danych + Ukryte + Widoczne + Autoodtwarzanie + Ukryte + Widoczne + Preferencje dotyczące jakości filmu + Ukryte + Widoczne + Tło + Ukryte + Widoczne + Oglądaj na telewizorze + Ukryte + Widoczne + Zarządzaj całą historią + Ukryte + Widoczne + Twoje dane w YouTube + Ukryte + Widoczne + Prywatność + Ukryta + Widoczna + Wypróbuj eksperymentalne funkcje + Ukryte + Widoczne + Zakupy i subskrypcje + Ukryte + Widoczne + Rozliczenia i płatności + Ukryte + Widoczne + Powiadomienia + Ukryte + Widoczne + Połączone aplikacje + Ukryte + Widoczne + Czat na żywo + Ukryty + Widoczny + Napisy + Ukryte + Widoczne + Ułatwienia dostępu + Ukryte + Widoczne + Informacje + Ukryte + Widoczne Pasek narzędzi Ukryj lub pokazuj przyciski na pasku narzędzi, takie jak pasek wyszukiwania, nagłówek i inne @@ -519,6 +575,12 @@ Zakładka Ty → Zobacz kanał → Menu → Ustawienia" Przycisk od wyszukiwania głosowego Ukryty Widoczny + YouTube Doodles + Ukryte + Widoczne + "YouTube Doodles pojawiają się przez kilka dni w ciągu roku. + +Jeśli YouTube Doodles pojawiają się obecnie w Twoim regionie, a opcja ukrywania jest włączona, to pasek filtrowania poniżej paska wyszukiwania również zostanie ukryty." Zastąp przycisk od przesyłania Zamienia przycisk od przesyłania z przyciskiem do ustawień Działanie przycisku @@ -1037,15 +1099,18 @@ Ograniczenie: Nagłówki z tytułami będą ukryte w wynikach wyszukiwania."Zatrzymane przyciski w odtwarzaczu Ukryte Widoczne - Etykiety oznaczające płatne promocje - Ukryte - Widoczne Przycisk od trendów Ukryty Widoczny Przycisk od kupowania Ukryty Widoczny + Naklejki + Ukryte + Widoczne + Etykiety oznaczające płatne promocje + Ukryte + Widoczne Panele z informacjami Ukryte Widoczne @@ -1069,9 +1134,9 @@ Ograniczenie: Nagłówki z tytułami będą ukryte w wynikach wyszukiwania."Przycisk od greenscreena Ukryty Widoczny - Przycisk od zapisywania dźwięku - Ukryty - Widoczny + Przycisk od zapisywania muzyki + Ukryty + Widoczny Przycisk do sklepu Ukryty Widoczny @@ -1558,6 +1623,7 @@ Kontynuuj i wyłącz optymalizację baterii." Domyślny klient iOS Android + Android Creator Wbudowany odtwarzacz Androida Klient Testowy Androida Android TV @@ -1569,7 +1635,8 @@ Kontynuuj i wyłącz optymalizację baterii." • Transmisje na żywo rozpoczynają się od początku • Filmy mogą kończyć się o 1 sekundę wcześniej • Kodek opus jest niedostępny" - • Brakuje menu od ścieżki dźwiękowej + "• Brakuje menu od ścieżki dźwiękowej +• Stabilna głośność jest niedostępna" "• Brakuje menu od ścieżki dźwiękowej • Stabilna głośność jest niedostępna" • Filmy mogą się nie odtwarzać @@ -1613,7 +1680,6 @@ Kodek AVC (H.264) obsługuje maksymalnie rozdzielczość 1080p, a odtwarzanie fi Niebieska od Revancify Czerwona od Revancify YouTube - YouTube (Minimalny nagłówek) Domyślne Wykluczone Zawarte diff --git a/src/main/resources/youtube/translations/pt-rBR/strings.xml b/src/main/resources/youtube/translations/pt-rBR/strings.xml index 0047b192a..e7806b76d 100644 --- a/src/main/resources/youtube/translations/pt-rBR/strings.xml +++ b/src/main/resources/youtube/translations/pt-rBR/strings.xml @@ -284,6 +284,7 @@ Limitações: "Esta configuração limita o número máximo de layouts que podem ser carregados na tela do reprodutor. Se o layout da tela do reprodutor mudar devido a alterações no lado do servidor, layouts não intencionais podem ficar ocultos na tela do reprodutor." + Desvio Geral Alterar a página inicial @@ -332,10 +333,12 @@ Limitação: O botão voltar na barra de ferramentas pode não funcionar."Remover o diálogo discricionário do visualizador "Remover o diálogo discricionário de visualização. Isso não ignora a restrição de idade, apenas aceita isso automaticamente." - Ativar layout de telefone - Engana o dpi para usar alguns layouts para telefone. - Ativar layout de tablet - Engana o dpi para usar alguns layouts para tablets. + Alterar layout + Original + Telefone + Telefone (Máximo 480 dp) + Tablet + Tablet (Min 600 dp) Falsificar versão do aplicativo Versão falsificada Versão não falsificada @@ -476,13 +479,66 @@ Se essa configuração não surtir efeito, tente alternar para o modo anônimo." Menu de configurações Ocultar elementos no menu de configurações do YouTube. - Ocultar menu de configurações do YouTube - Ocultar elementos no menu de configurações do YouTube. - Filtro do menu de configurações do YouTube - Lista de nomes de menu de configurações do YouTube para filtrar separados por uma nova linha. - "Conta -Economia de dados -Legendas" + Ocultar menu Central da família + O menu do Central da família está oculto. + O menu do Central da família será exibido. + Ocultar menu Geral + O menu Geral está oculto. + O menu Geral será exibido. + Ocultar menu Conta + O menu Conta está oculto. + O menu Conta será exibido. + Ocultar menu Economia de dados + O menu Economia de dados está oculto. + O menu Economia de dados será exibido. + Ocultar menu Reprodução automática + O menu Reprodução automática está oculto. + O menu Reprodução automática será exibido. + Ocultar menu Preferências de qualidade de vídeo + O menu Preferências de qualidade de vídeo está oculto. + O menu Preferências de qualidade de vídeo será exibido. + Ocultar menu Segundo plano + O menu Segundo plano está oculto. + O menu Segundo plano será exibido. + Ocultar menu Assistir na TV + O menu Assistir na TV está oculto. + O menu Assistir na TV será exibido. + Ocultar menu Gerencie todo o histórico + O menu Gerencie todo o histórico está oculto. + O menu Gerencie todo o histórico será exibido. + Ocultar menu Seus dados no YouTube + O menu Seus dados no YouTube está oculto. + O menu Seus dados no YouTube será exibido. + Ocultar menu Privacidade + O menu Privacidade está oculto. + O menu Privacidade será exibido. + Ocultar menu Testar os novos recursos experimentais + O menu Testar os novos recursos experimentais está oculto. + O menu Testar os novos recursos experimentais será exibido. + Ocultar menu Compras e assinaturas + O menu Compras e assinaturas está oculto. + O menu Compras e assinaturas será exibido. + Ocultar menu Faturamento e pagamentos + O menu de Faturamento e pagamentos está oculto. + O menu de Faturamento e pagamentos será exibido. + Ocultar Menu Notificações + O menu Notificações está oculto. + O menu Notificações será exibido. + Ocultar menu Apps conectados + O menu Apps conectados está oculto. + O menu Apps conectados será exibido. + Ocultar menu Chat ao vivo + O menu Chat o vivo está oculto. + O menu Chat o vivo será exibido. + Ocultar menu Legendas + O menu Legendas está oculto. + O menu Legendas será exibido. + Ocultar menu Acessibilidade + O menu Acessibilidade está oculto. + O menu Acessibilidade será exibido. + Ocultar menu Sobre + O menu Sobre está oculto. + O menu Sobre será exibido. Barra de ferramentas Ocultar ou alterar componentes localizados na barra de ferramentas, como botões da barra de ferramentas, barra de pesquisa, cabeçalho. @@ -518,6 +574,12 @@ Aba Você > Visualizar canal > Menu > Configurações." Ocultar botão de pesquisa por voz O botão de pesquisa por voz está oculto. O botão de pesquisa por voz será exibido. + Ocultar Doodles do YouTube + Os Doodles do YouTube estão ocultos. + Os Doodles do YouTube serão exibidos. + "Os Doodles do YouTube aparecem alguns dias por ano. + +Se um Doodle do YouTube estiver sendo exibido na sua região e essa configuração de ocultação estiver ativada, a barra de filtro abaixo da barra de pesquisa também ficará oculta." Substituir botão criar Substitui o botão criar com o botão de configurações. Tipo de ação a ser atribuída ao botão @@ -1038,15 +1100,18 @@ Limitação: Os cabeçalhos oficiais nos resultados da pesquisa serão ocultados Ocultar botões de sobreposição pausados Os botões de sobreposição pausados estão ocultos. Os botões de sobreposição pausados serão exibidos. - Ocultar rótulo de promoção paga - O rótulo de promoção pago está oculto. - O rótulo de promoção pago será exibido. Ocultar botão Tendências O botão de tendências está oculto. O botão de tendências será exibido. Ocultar botão de Compras O botão de compras está oculto. O botão de compras será exibido. + Ocultar stickers + Os stickers estão ocultos. + Os stickers serão exibidos. + Ocultar rótulo de promoção paga + O rótulo de promoção pago está oculto. + O rótulo de promoção pago será exibido. Ocultar painéis de informações Os painéis de informação estão ocultos. Os painéis de informação serão exibidos. @@ -1066,9 +1131,13 @@ Limitação: Os cabeçalhos oficiais nos resultados da pesquisa serão ocultados O rótulo de link de vídeo está oculto. O rótulo de link de vídeo será exibido. - Ocultar botão salvar música na lista de reprodução - Salvar música na lista de reprodução está oculta. - Salvar música na lista de reprodução será exibida. + Ações sugeridas + Ocultar botão de tela verde + O botão de tela verde está oculto. + O botão de tela verde será exibido. + Ocultar botão Salvar música + O botão Salvar música está oculto. + O botão Salvar música será exibido. Ocultar botão comprar O botão comprar está oculto. O botão comprar será exibido. @@ -1112,6 +1181,9 @@ Limitação: Os cabeçalhos oficiais nos resultados da pesquisa serão ocultados O botão som será exibido. Animação / Feedback + Desativar animação do botão Curtir + A animação da fonte está desativada acima do botão Curtir. + A animação da fonte está ativada acima do botão Curtir. Ocultar fundo do botão Play & Pause O fundo do botão está oculto. O fundo do botão será exibido. @@ -1549,6 +1621,7 @@ Toque no botão continuar e desative as otimizações da bateria." Cliente padrão iOS Android + Criador Android Reprodutor Incorporado Android Suite de teste Android Android TV @@ -1557,7 +1630,7 @@ Toque no botão continuar e desative as otimizações da bateria." Web Efeitos colaterais da falsificação "• Filmes ou vídeos pagos podem não reproduzir." - • O menu de faixa de áudio está faltando. + "• O menu de faixa de áudio está faltando." "• O menu de faixa de áudio está faltando." • O vídeo pode não reproduzir. Forçar iOS AVC (H.264) @@ -1600,7 +1673,6 @@ AVC (H. 64) tem uma resolução máxima de 1080p, e a reprodução de vídeo usa Revancify Blue Revancify Red YouTube - YouTube (Cabeçalho Mínimo) Padrão Excluído Incluído diff --git a/src/main/resources/youtube/translations/ru-rRU/strings.xml b/src/main/resources/youtube/translations/ru-rRU/strings.xml index 29ac9bce8..c5337858c 100644 --- a/src/main/resources/youtube/translations/ru-rRU/strings.xml +++ b/src/main/resources/youtube/translations/ru-rRU/strings.xml @@ -293,9 +293,10 @@ Shorts Похожие видео Похожие видео скрыты. Похожие видео отображены. - "Этот параметр ограничивает максимальное количество макетов, которые могут быть загружены на экране плеера. + "Этот параметр ограничивает количество контейнеров по умолчанию, которые влияют на отображение похожих видео. -Если макет экрана проигрывателя меняется из-за изменений на стороне сервера, незапланированные макеты могут быть скрыты на экране плеера." +Если параметр изменен на стороне сервера, не запрошенные, контейнеры могут быть не доступны." + Оффсет - Алгоритм выдачи похожих видео Основные настройки Начальная страница @@ -342,10 +343,12 @@ Shorts Виджет коротких уведомлений отображен. Скрыть диалог возрастного ограничения "Возрастные ограничения будут приниматься автоматически." - Телефонный интерфейс - Подмена DPI для телефонного интерфейса. - Планшетный интерфейс - Подмена DPI для планшетного интерфейса. + Изменить макет + Оригинал + Телефон + Телефон (Макс. 480 dip) + Планшет + Планшет (Мин. 600 dip) Подмена версии приложения Версия приложения подменена Версия приложения не подменена @@ -488,14 +491,66 @@ Shorts Меню настроек Настройка меню YouTube. - Меню настроек YouTube - Скрытие элементов в меню настроек YouTube. - Фильтр меню настроек YouTube - Список меню настроек YouTube для скрытия.\nРазделять новой строкой. - "Подсказка: -Аккаунт -Сохранение данных -Субтитры" + Семейный центр + Семейный центр скрыт. + Семейный центр отображен. + Общее + Общее скрыто. + Общее отображено. + Аккаунт + Аккаунт скрыт. + Аккаунт отображен. + Экономия трафика + Экономия трафика скрыта. + Экономия трафика отображена. + Автовоспроизведение + Автовоспроизведение скрыто. + Автовоспроизведение отображено. + Качество видео + Качество видео скрыто. + Качество видео отображено. + Фоновый и офлайн режим + Фоновый и офлайн режим скрыт. + Фоновый и офлайн режим отображен. + Просмотр на телевизоре + Просмотр на телевизоре скрыт. + Просмотр на телевизоре отображен. + Управлять историей просмотра + Управлять историей просмотра скрыто. + Управлять историей просмотра отображено. + Ваши данные на YouTube + Ваши данные на YouTube скрыто. + Ваши данные на YouTube отображено. + Конфиденциальность + Конфиденциальность скрыта. + Конфиденциальность отображена. + Экспериментальные функции + Экспериментальные функции скрыты. + Экспериментальные функции отображены. + Покупки и платные подписки + Покупки и платные подписки скрыты. + Покупки и платные подписки отображены. + Счета и платежи + Счета и платежи скрыты. + Счета и платежи отображены. + Уведомления + Уведомления скрыты. + Уведомления отображены. + Связанные приложения + Связанные приложения скрыты. + Связанные приложения отображены. + Чат + Чат скрыт. + Чат отображен. + Субтитры + Субтитры скрыты. + Субтитры отображены. + Специальные возможности + Специальные возможности скрыты. + Специальные возможности отображены. + О приложении + О приложении скрыто. + О приложении отображено. Панель инструментов Скрыть или изменить компоненты на панели инструментов - строка поиска, кнопки и заголовок. @@ -530,6 +585,12 @@ Shorts Кнопка \"Голосовой поиск\" Кнопка \"Голосовой поиск\" скрыта. Кнопка \"Голосовой поиск\" отображена. + YouTube Doodles + YouTube Doodles скрыты. + YouTube Doodles отображены. + "YouTube Doodles появляются несколько дней в году. + +Если YouTube Doodles отображаются в вашем регионе и они скрыты, то панель фильтров под строкой поиска будет также скрыта." Заменить кнопку \"Создать\" Заменить \"Создать\" кнопкой настройки. Тип действия для назначения кнопке @@ -1051,15 +1112,18 @@ Shorts Фоновые кнопки во время паузы Фоновые кнопки во время паузы скрыты. Фоновые кнопки во время паузы отображены. - Метка \"Содержит прямую рекламу\" - Метка \"Содержит прямую рекламу\" скрыта. - Метка \"Содержит прямую рекламу\" отображена. Кнопка \"В тренде\" Кнопка \"В тренде\" скрыта. Кнопка \"В тренде\" отображена. Кнопка \"Покупки\" Кнопка \"Покупки\" скрыта. Кнопка \"Покупки\" отображена. + Стикеры + Стикеры скрыты. + Стикеры отображены. + Метка \"Содержит прямую рекламу\" + Метка \"Содержит прямую рекламу\" скрыта. + Метка \"Содержит прямую рекламу\" отображена. Информационные панели Информационные панели скрыты. Информационные панели отображены. @@ -1083,9 +1147,13 @@ Shorts Метка видео ссылки скрыта. Метка видео ссылки отображена. - Кнопка \"Сохранить звук в плейлист\" - Кнопка \"Сохранить звук в плейлист\" скрыта. - Кнопка \"Сохранить звук в плейлист\" отображена. + Предложенные действия + Кнопка зеленого экрана + Кнопка зеленого экрана скрыта. + Кнопка зеленого экрана отображена. + Кнопка \"Сохранить музыку\" + Кнопка \"Сохранить музыку\" скрыта. + Кнопка \"Сохранить музыку\" отображена. Кнопка \"Магазин\" Кнопка \"Магазин\" скрыта. Кнопка \"Магазин\" отображена. @@ -1129,6 +1197,9 @@ Shorts Кнопка \"Трек\" отображена. Анимация / Обратная связь + Анимация кнопки \"Лайк\" + Анимация кнопки \"Лайк\" отключена. + Анимация кнопки \"Лайк\" включена. Фон кнопки \"Воспроизведение\" - \"Пауза\" Фон скрыт. Фон отображен. @@ -1572,6 +1643,7 @@ Shorts Клиент по умолчанию iOS Android + Android Создатель Встроенный Android плеер Android Тестовый набор Android TV @@ -1580,7 +1652,7 @@ Shorts Веб Эффекты от подмены "• Фильмы или платные видео могут не проигрываться." - • Меню \"Звуковая дорожка\" не доступно. + "• Меню \"Звуковая дорожка\" не доступно." "• Меню \"Звуковая дорожка\" VR не доступно." • Видео может не воспроизводиться. Принудительно подмена как iOS, AVC (H.264) @@ -1623,7 +1695,6 @@ AVC (H.264) имеет максимальное разрешение 1080p, и Revancify синяя Revancify красная Иконка YouTube - YouTube (мин. заголовок) По умолчанию Не применён Применён diff --git a/src/main/resources/youtube/translations/tr-rTR/strings.xml b/src/main/resources/youtube/translations/tr-rTR/strings.xml index 681d8c181..c16e4f01d 100644 --- a/src/main/resources/youtube/translations/tr-rTR/strings.xml +++ b/src/main/resources/youtube/translations/tr-rTR/strings.xml @@ -6,6 +6,7 @@ ReVanced Extended Arama %s + Varsayılan değerlere sıfırla. Deneysel Parametreler Devam etmek istiyor musunuz? Düzeni normal şekilde yüklemek için yeniden başlatın @@ -70,6 +71,7 @@ DeArrow hakkında daha fazla bilgi edinmek için buraya dokunun." DeArrow\'un mevcut olmaması durumunda uyarı gösterilmez. DeArrow API uç noktası DeArrow kapak fotoğraf önbellek uç noktasının URL\'si. Ne yaptığınızı bilmiyorsanız bunu değiştirmeyin. + Geçersiz DeArrow API URL. Hareketsiz video çekimleri hakkında Her videonun başlangıcı, ortası, ve sonundan fotoğraflar alınır. Bu fotoğraflar, YouTube içindedir ve dışarıdan bir API kullanılmamaktadır. Hızlı hareketsiz çekimler kullan @@ -221,6 +223,7 @@ Kısıtlamalar: • Bazı Short videolar gizlenemeyebilir • Bazı arayüz bileşenleri gizlenemeyebilir • Anahtar kelime aratmak hiçbir sonuç göstermeyebilir" + Bütün kelimeyi eşle Geçersiz anahtar kelime. \'%s\' kullanılamaz \'%1$s\' anahtar kelimesi tüm videoları gizleyecek. @@ -283,10 +286,6 @@ Kısıtlamalar: Gizlenmiyor İzleyicinin takdirine bağlı iletişim kutusunu kaldır "Görüntüleyicinin takdirine ilişkin iletişim kutusunu kaldırır. Bu yaş sınırlamasını atlamaz. Sadece otomatik olarak kabul ediyor." - Telefon düzenini kullan - Bazı telefon arayüzlerini kullanabilmek için dpi\'ı kandırır. - Tablet düzenini kullan - Bazı tablet arayüzlerini kullanabilmek için dpi\'ı kandırır. Uygulama Versiyonunu taklit et Sürüm taklit ediliyor Sürüm taklit edilmiyor @@ -395,13 +394,6 @@ Daha sonra kapatılırsa kullanıcı arayüzü hatalarını önlemek için uygul Ayarlar menüsü YouTube ayarlar menüsünde elementleri gizle. - YouTube ayarlar menüsünü gizle - YouTube ayarlar menüsünde elementleri gizle. - YouTube ayarlar menüsü filtresi - Yeni bir satırla ayrılmış olarak filtrelenecek YouTube ayarlar menüsü adlarının listesi. - "Hesap -Veri tasarrufu -Altyazılar" Araç Çubuğu Araç çubuğu düğmeleri, arama çubuğu, başlık gibi araç çubuğunda bulunan bileşenleri gizleyin veya değiştirin. @@ -943,14 +935,14 @@ Bilinen sorun: Arama sonuçlarındaki resmi başlıklar da gizlenebiliyor."Duraklama katmanı düğmelerini gizle Duraklama katmanı düğmeleri gizli. Duraklama katmanı düğmeleri görünür. - Ücretli tanıtım etiketini gizle - Ücretli tanıtım etiketi gizli. - Ücretli tanıtım etiketi gösteriliyor. Trends butonunu gizle Trend butonu gizli. Trend butonu görünür. Alışveriş butonunu gizle Alışveriş butonu gizli. + Ücretli tanıtım etiketini gizle + Ücretli tanıtım etiketi gizli. + Ücretli tanıtım etiketi gösteriliyor. Bilgi panellerini gizle Bilgi panelleri gizleniyor. Bilgi panelleri gizlenmiyor. @@ -970,9 +962,6 @@ Bilinen sorun: Arama sonuçlarındaki resmi başlıklar da gizlenebiliyor."Video bağlantı etiketi gizlendi. Video bağlantı etiketi gösteriliyor - Sesi oynatma listesine kaydetme butonunu gizle - Sesi oynatma listesine kaydetme butonu gizleniyor - Sesi oynatma listesine kaydetme butonu gösteriliyor. Mağaza düğmesini gizle Mağaza düğmesi gizli. Mağaza düğmesi görünür. diff --git a/src/main/resources/youtube/translations/uk-rUA/strings.xml b/src/main/resources/youtube/translations/uk-rUA/strings.xml index adb0bee6b..ecaecf264 100644 --- a/src/main/resources/youtube/translations/uk-rUA/strings.xml +++ b/src/main/resources/youtube/translations/uk-rUA/strings.xml @@ -284,6 +284,7 @@ "Це налаштування обмежує максимальну кількість, які можуть вантажитися на екран плеєра. Якщо екран плеєра змінюється через зміни на стороні сервера, можуть бути приховані ненавмисно на екрані плеєра." + Зміщення Загальне Змінити початкову сторінку @@ -332,10 +333,12 @@ Вилучати діалогове вікно "Вилучається діалогове вікно. Це не обходить вікові обмеження, а просто приймається автоматично." - Увімкнути телефонний інтерфейс - Підміняє DPI для використання інтерфейсу деяких телефонів - Увімкнути Планшетний інтерфейс - Підміняє DPI для використання інтерфейсу деяких планшетів + Змінити макет + Оригінал + Телефонний + Телефонний (Макс 480 dp) + Планшетний + Планшетний (Мін 600 dp) Підробити версію програми Версію підроблено Версію не підроблено @@ -476,13 +479,66 @@ Меню налаштувань Приховати елементи в меню налаштувань YouTube. - Приховати меню налаштувань YouTube - Приховати елементи в меню налаштувань YouTube. - Фільтр меню налаштувань YouTube - Список назв меню налаштувань YouTube для фільтрування, розділених новим рядком. - "Обліковий запис -Заощадження трафіку -Субтитри" + Приховати меню Сімейний Центр + Меню Сімейний Центр приховано. + Меню Сімейний Центр показується. + Приховати меню Загальні + Меню Загальні приховано. + Меню Загальні показується. + Приховати меню Акаунт + Меню Акаунт приховано. + Меню Акаунт показується. + Приховати меню Заощадження трафіку + Меню Заощадження трафіку приховано. + Меню Заощадження трафіку показується. + Приховати меню Автоматичне відтворення + Меню Автоматичне відтворення приховано. + Меню Автоматичне відтворення показується. + Приховати меню Параметри якості відео + Меню Параметри якості відео приховано. + Меню Параметри якості відео показується. + Приховати меню Фоновий і офлайн-режим + Меню Фоновий і офлайн-режим приховано. + Меню Фоновий і офлайн-режим показується. + Приховати меню Дивитись на телевізорі + Меню Дивитись на телевізорі приховано. + Меню Дивитись на телевізорі показується. + Приховати меню Керувати всією історією пошуків + Меню Керувати всією історією пошуків приховано. + Меню Керувати всією історією пошуків показується. + Приховати меню Ваші дані на YouTube + Меню Ваші дані на YouTube приховано. + Меню Ваші дані на YouTube показується. + Приховати меню Конфіденційність + Меню Конфіденційність приховано. + Меню Конфіденційність показується. + Приховати меню Спробуйте нові експериментальні функції + Меню Спробуйте нові експериментальні функції приховано. + Меню Спробуйте нові експериментальні функції показується. + Приховати меню Покупки й платні підписки + Меню Покупки й платні підписки приховано. + Меню Покупки й платні підписки показується. + Приховати меню Платежі + Меню Платежі приховано. + Меню Платежі показується. + Приховати меню Сповіщення + Меню Сповіщення приховано. + Меню Сповіщення показується. + Приховати меню Підключені додатки + Меню Підключені додатки приховано. + Меню Підключені додатки показується. + Приховати меню Чат + Меню Чат приховано. + Меню Чат показується. + Приховати меню Субтитри + Меню Субтитри приховано. + Меню Субтитри показується. + Приховати меню Доступність + Меню Доступність приховано. + Меню Доступність показується. + Приховати меню Про додаток + Меню Про додаток приховано. + Меню Про додаток показується. Панель інструментів Приховати або змінити компоненти, розташовані на панелі інструментів, такі як кнопки панелі інструментів, панель пошуку, заголовок. @@ -518,6 +574,12 @@ Приховати кнопку голосового пошуку Кнопку голосового пошуку приховано. Кнопку голосового пошуку показується. + Приховати Yoodles + Yoodles приховано. + Yoodles показується. + "Yoodles з'являються на декілька днів щороку. + +Якщо Yoodles наразі зображаються у вашому регіоні й це налаштування приховування увімкнено, то панель фільтрів під рядком пошуку також приховуватиметься." Замінити кнопку створення Замінює кнопку створення кнопкою налаштувань. Тип дії для призначення кнопці @@ -1037,15 +1099,18 @@ Приховати кнопки накладені при паузі Кнопки накладені при паузі приховано. Кнопки накладені при паузі показується. - Приховати мітку Містить пряму рекламу - Мітку Містить пряму рекламу приховано. - Мітку Містить пряму рекламу показується. Приховати кнопку Тренди Кнопку Тренди приховано. Кнопку Тренди показується. Приховати кнопку Магазин Кнопку Магазин приховано. Кнопку Магазин показується. + Приховати стікери + Стікери приховано. + Стікери показується. + Приховати мітку Містить пряму рекламу + Мітку Містить пряму рекламу приховано. + Мітку Містить пряму рекламу показується. Приховати інформаційні панелі Інформаційні панелі приховано. Інформаційні панелі показується. @@ -1069,9 +1134,9 @@ Приховати кнопку Зелений екран Кнопку Зелений екран приховано. Кнопку Зелений екран показується. - Приховати кнопку Зберегти звук - Кнопку Зберегти звук приховано. - Кнопку Зберегти звук показується. + Приховати кнопку Зберегти звук + Кнопку Зберегти звук приховано. + Кнопку Зберегти звук показується. Приховати кнопку Магазин Кнопку Магазин приховано. Кнопка Магазин показується. @@ -1551,6 +1616,7 @@ Основний клієнт iOS Android + Розробник Android Вбудований плеєр Android Тестовий Android Android TV @@ -1562,7 +1628,8 @@ • Прямі трансляції починаються з початку. • Відео можуть закінчуватися на 1 секунду раніше. • Немає аудіокодека opus." - • Меню звукової доріжки відсутнє. + "• Меню звукової доріжки відсутнє. +• Стабілізація гучності недоступна." "• Меню звукової доріжки відсутнє. • Стабілізація гучності недоступна." • Відео може не відтворюватися. @@ -1606,7 +1673,6 @@ AVC (H.264) має максимальну роздільну здатність Revancify синя Revancify червона YouTube - YouTube (Мінімальний заголовок) Стандартна Виключено Включено diff --git a/src/main/resources/youtube/translations/vi-rVN/strings.xml b/src/main/resources/youtube/translations/vi-rVN/strings.xml index 16d550d5c..63a61968c 100644 --- a/src/main/resources/youtube/translations/vi-rVN/strings.xml +++ b/src/main/resources/youtube/translations/vi-rVN/strings.xml @@ -87,7 +87,7 @@ Nhấn vào đây để tìm hiểu thêm về DeArrow." DeArrow tạm thời không khả dụng. Hạn chế về hình ảnh do khu vực - Vượt qua hạn chế về hình ảnh do khu vực + Vượt qua hạn chế Sử dụng máy chủ hình ảnh yt4.ggpht.com. Sử dụng máy chủ lưu trữ hình ảnh gốc.\n\nBật tính năng này có thể khắc phục tình trạng hình ảnh bị chặn ở một số khu vực. @@ -130,9 +130,9 @@ Nhấn vào đây để tìm hiểu thêm về DeArrow." Ẩn nút Video mới nhất Nút Video mới nhất đã ẩn. Nút Video mới nhất được hiển thị. - Ẩn Danh sách phát kết hợp - Danh sách phát kết hợp đã ẩn. - Danh sách phát kết hợp được hiển thị. + Ẩn Danh sách kết hợp + Danh sách kết hợp đã ẩn. + Danh sách kết hợp được hiển thị. Ẩn phim và chương trình truyền hình Phim và chương trình truyền hình đã ẩn. Phim và chương trình truyền hình được hiển thị. @@ -323,9 +323,9 @@ Hạn chế: Nút Quay lại trên thanh công cụ có thể không hoạt đ Màn hình tải màu gradient Màn hình tải màu gradient đã bật. Màn hình tải màu gradient đã tắt. - Ẩn nút Tìm kiếm bằng giọng nói nổi - Nút Tìm kiếm bằng giọng nói nổi đã ẩn khi tìm kiếm. - Nút Tìm kiếm bằng giọng nói nổi được hiển thị khi tìm kiếm. + Ẩn nút Tìm kiếm bằng giọng nói + Nút Tìm kiếm bằng giọng nói đã ẩn khi tìm kiếm. + Nút Tìm kiếm bằng giọng nói được hiển thị khi tìm kiếm. Ẩn dải phân cách màu xám Dải phân cách màu xám đã ẩn. Dải phân cách màu xám được hiển thị. @@ -334,11 +334,14 @@ Hạn chế: Nút Quay lại trên thanh công cụ có thể không hoạt đ Thanh thông báo nhanh được hiển thị. Đóng hộp thoại cảnh báo trước khi xem "Đóng hộp thoại cảnh báo nội dung cần cân nhắc trước khi xem. + Tuỳ chọn này chỉ tự động chấp nhận hộp thoại cảnh báo, không thể bỏ qua giới hạn về độ tuổi." - Bố cục điện thoại - Thay đổi DPI để sử dụng một số bố cục điện thoại. - Bố cục máy tính bảng - Thay đổi DPI để sử dụng một số bố cục máy tính bảng. + Thay đổi bố cục + Gốc + Điện thoại + Điện thoại (Tối đa 480 dpi) + Máy tính bảng + Máy tính bảng (Tối thiểu 600 dpi) Giả mạo phiên bản ứng dụng Phiên bản đã được giả mạo Phiên bản không được giả mạo @@ -479,13 +482,66 @@ Nếu cài đặt này không có hiệu lực, hãy thử chuyển sang chế Trình đơn Cài đặt Ẩn các thành phần của trình đơn Cài đặt YouTube. - Ẩn trình đơn Cài đặt YouTube - Ẩn các thành phần trong trình đơn Cài đặt YouTube. - Bộ lọc trình đơn Cài đặt YouTube - Nhập tên các mục thành phần của trình đơn Cài đặt YouTube mà bạn muốn lọc được phân cách bằng dòng. - "Tài khoản -Tiết kiệm dữ liệu -Phụ đề" + Ẩn mục Trung tâm dành cho gia đình + Đã ẩn mục Trung tâm dành cho gia đình. + Đã hiện mục Trung tâm dành cho gia đình. + Ẩn mục Chung + Đã ẩn mục Chung. + Đã hiện mục Chung. + Ẩn mục Tài khoản + Đã ẩn mục Tài khoản. + Đã hiện mục Tài khoản. + Ẩn mục Tiết kiệm dữ liệu + Đã ẩn mục Tiết kiệm dữ liệu. + Đã hiện mục Tiết kiệm dữ liệu. + Ẩn mục Tự động phát + Đã ẩn mục Tự động phát. + Đã hiện mục Tự động phát. + Ẩn mục Lựa chọn ưu tiên về chất lượng video + Đã ẩn mục Lựa chọn ưu tiên về chất lượng video. + Đã hiện mục Lựa chọn ưu tiên về chất lượng video. + Ẩn mục Phát trong nên và nội dung tải xuống + Đã ẩn mục Phát trong nên và nội dung tải xuống. + Đã hiện mục Phát trong nên và nội dung tải xuống. + Ẩn mục xem trên TV + Đã ẩn mục xem trên TV. + Đã hiện mục xem trên TV. + Ẩn mục Quản lý toàn bộ nhật ký hoạt động + Đã ẩn mục Quản lý toàn bộ nhật ký hoạt động. + Đã hiện mục Quản lý toàn bộ nhật ký hoạt động. + Ẩn mục Dữ liệu của bạn trong Youtube + Đã ẩn mục Dữ liệu của bạn trong Youtube. + Đã hiện mục Dữ liệu của bạn trong Youtube. + Ẩn mục Quyền riêng tư + Đã ẩn mục Quyền riêng tư. + Đã hiện mục Quyền riêng tư. + Ẩn mục Thử nghiệm các tính năng mới + Đã ẩn mục Thử nghiệm các tính năng mới. + Đã hiện mục Thử nghiệm các tính năng mới. + Ẩn mục Giao dịch mua và gói thành viên + Đã ẩn mục Giao dịch mua và gói thành viên. + Đã hiện mục Giao dịch mua và gói thành viên. + Ẩn mục Lập hoá đơn và thanh toán + Đã ẩn mục Lập hoá đơn và thanh toán. + Đã hiện mục Lập hoá đơn và thanh toán. + Ẩn mục Thông báo + Đã ẩn mục Thông báo. + Đã hiện mục Thông báo. + Ẩn mục Ứng dụng đã kết nối + Đã ẩn mục Ứng dụng đã kết nối. + Đã hiện mục Ứng dụng đã kết nối. + Ẩn mục Trò chuyện trực tiếp + Đã ẩn mục Trò chuyện trực tiếp. + Đã hiện mục Trò chuyện trực tiếp. + Ẩn mục Phụ đề + Đã ẩn mục Phụ đề. + Đã hiện mục Phụ đề. + Ẩn mục Hỗ trợ tiếp cận + Đã ẩn mục Hỗ trợ tiếp cận. + Đã hiện mục Hỗ trợ tiếp cận. + Ẩn mục Giới thiệu + Đã ẩn mục Giới thiệu. + Đã hiện mục Hỗ trợ tiếp cận. Thanh công cụ Ẩn hoặc thay đổi các thành phần trên thanh công cụ, chẳng hạn như thanh tìm kiếm, các nút trên thanh công cụ và tiêu đề YouTube. @@ -521,6 +577,12 @@ Thẻ Bạn → Xem kênh → Trình đơn → Cài đặt." Ẩn nút Tìm kiếm bằng giọng nói Nút Tìm kiếm bằng giọng nói đã ẩn. Nút Tìm kiếm bằng giọng nói được hiển thị. + Ẩn YouTube Doodles + Đã ẩn YouTube Doodles. + Đã hiện YouTube Doodles. + "YouTube Doodles là những hình ảnh hoặc thiết kế cách điệu được YouTube sử dụng tạm thời trên logo của mình trong một số dịp đặc biệt, tương tự như Google Doodles trên trang chủ của Google. Và chúng thường chỉ xuất hiện trong một khoảng thời gian ngắn, có thể là vài ngày mỗi năm. + +Nếu YouTube Doodle đang hiển thị đồng thời tuỳ chọn ẩn này cũng đang bật, thì bộ lọc tìm kiếm cũng sẽ bị ẩn." Thay thế nút Tạo Thay thế nút Tạo bằng nút Cài đặt. Thao tác kích hoạt nút @@ -536,18 +598,19 @@ Nhấn và giữ để mở cài đặt RVX." Tắt bảng tự động bật lên khi phát Bảng tự động bật lên khi phát video (Danh sách phát, Trò chuyện trực tiếp,...) đã tắt. Bảng tự động bật lên khi phát video (Danh sách phát, Trò chuyện trực tiếp,...) đã bật. - Tắt chuyển đổi danh sách phát kết hợp + Vô hiệu hoá chuyển sang danh sách kết hợp Tự động chuyển sang danh sách phát kết hợp đã bị vô hiệu hóa. - "Tự động chuyển sang danh sách phát kết hợp đã được kích hoạt khi bật tính năng Tự động phát. + "Tự động chuyển sang danh sách kết hợp đã được kích hoạt khi bật tính năng Tự động phát. Tính năng Tự động phát có thể thay đổi trong Cài đặt YouTube: Cài đặt → Tự động phát → Tự động phát video tiếp theo" Việc bật tính năng này sẽ vô hiệu hóa việc tự động chuyển sang YouTube Mix khi phát nhạc đồng thời chế độ phát tự động cũng được bật. Tắt nhấn và giữ để phát nhanh 2x - "Tắt tính năng Nhấn và giữ trong trình phát để xem ở tốc độ nhanh gấp 2 lần. + "Tắt tính năng nhấn và giữ để \"2x>>\". -• Bật tuỳ chọn này sẽ khôi phục tính năng Trượt để tua của bố cục cũ. -• Tắt tuỳ chọn này không đồng nghĩa với việc buộc tính năng Nhấn và giữ trong trình phát để xem ở tốc độ nhanh gấp 2 lần được bật." +Lưu ý: +• Vô hiệu hoá lớp phủ tốc độ phát sẽ khôi phục lại thao tác trượt để tua giống bố cục cũ. +• Tắt cài đặt này có thể không cưỡng ép bật lại lớp phủ tốc độ phát." Tốc độ phát khi nhấn và giữ Nhập tốc độ phát khi nhấn và giữ trong khoảng từ 0 đến 8.0. Tốc độ phát khi nhấn và giữ phải nằm trong khoảng 0 - 8.0. @@ -603,8 +666,8 @@ Cài đặt → Tự động phát → Tự động phát video tiếp theo."Lớp phủ khi chụm để thu phóng đã bị ẩn. Lớp phủ khi chụm để thu phóng đã được hiển thị. - Nút Hành động - Ẩn hoặc hiển thị các nút hành động bên dưới video. + Các nút thao tác + Ẩn hoặc hiển thị các nút thao tác bên dưới video. Tắt hoạt ảnh các nút Thích và Không thích Các nút Thích và Không thích sẽ không sáng lên khi được nhắc đến. Các nút Thích và Không thích sẽ sáng lên khi được nhắc đến. @@ -790,12 +853,12 @@ Hạn chế: Tiêu đề video sẽ biến mất khi nhấn vào." Ẩn nút Trò chuyện trực tiếp Nút trò chuyện trực tiếp đã ẩn. Nút trò chuyện trực tiếp được hiển thị. - Ẩn nút Thêm - Các nút chức năng khác (Remix, Tạo đoạn video,...) đã ẩn. - Các nút chức năng khác (Remix, Tạo đoạn video,...) được hiển thị. - Ẩn nút Danh sách phát kết hợp - Nút Danh sách phát kết hợp đã ẩn. - Nút Danh sách phát kết hợp được hiển thị. + Ẩn nút thêm + Nút thêm (...) đã ẩn. + Nút thêm (...) đã hiển thị. + Ẩn nút Danh sách kết hợp + Nút Danh sách kết hợp đã ẩn. + Nút Danh sách kết hợp được hiển thị. Ẩn nút Danh sách phát Nút Danh sách phát đã ẩn. Nút Danh sách phát được hiển thị. @@ -993,7 +1056,7 @@ Mở rộng mô tả video có thể không hoạt động nếu bạn lưu chu Mô tả Shorts - Tắt tiếp tục trình phát Shorts + Tắt tính năng tiếp tục trình phát Trinh phát Shorts sẽ không tiếp tục khi ứng dụng khởi chạy. Trinh phát Shorts sẽ tiếp tục khi ứng dụng khởi chạy. Ẩn nút nổi @@ -1002,9 +1065,7 @@ Mở rộng mô tả video có thể không hoạt động nếu bạn lưu chu Kệ Shorts Ẩn kệ Shorts - "Ẩn kệ Shorts. - -Hạn chế: Tiêu đề chính thức trong kết quả tìm kiếm sẽ được ẩn." + "\nHạn chế: Tiêu đề chính thức trong kết quả tìm kiếm sẽ được ẩn." Ẩn trên thẻ Trang chủ và các video liên quan Ẩn trên thẻ Trang chủ và các video liên quan. Hiển thị trong thẻ Trang chủ và các video có liên quan. @@ -1038,15 +1099,18 @@ Hạn chế: Tiêu đề chính thức trong kết quả tìm kiếm sẽ đư Ẩn các nút phủ lên khi tạm dừng Đã ẩn các nút phủ lên khi tạm dừng. Đã hiện các nút phủ lên khi tạm dừng. - Ẩn nhãn quảng cáo được tài trợ - Đã ẩn Nhãn quảng cáo được tài trợ. - Đã hiện Nhãn quảng cáo được tài trợ. Ẩn nút Thịnh hành Đã ẩn nút Thịnh hành. Đã hiện nút Thịnh hành. Ẩn nút Mua sắm Đã ẩn nút Mua sắm. Đã hiện nút Mua sắm. + Ẩn nhãn dán + Đã ẩn nhãn dán. + Đã hiện nhãn dán. + Ẩn nhãn quảng cáo được tài trợ + Đã ẩn Nhãn quảng cáo được tài trợ. + Đã hiện Nhãn quảng cáo được tài trợ. Ẩn Bảng thông tin Đã ẩn Bảng thông tin. Đã hiện Bảng thông tin. @@ -1070,9 +1134,9 @@ Hạn chế: Tiêu đề chính thức trong kết quả tìm kiếm sẽ đư Ẩn nút Phông xanh Đã ẩn nút Phông xanh. Đã hiện nút Phông xanh. - Ẩn nút Lưu âm thanh - Đã ẩn nút Lưu âm thanh. - Đã hiện nút Lưu âm thanh. + Ẩn nút Lưu nhạc + Đã ẩn nút Lưu nhạc. + Đã hiện nút lưu nhạc. Nút Cửa hàng Đã ẩn nút Cửa hàng. Đã hiện nút Cửa hàng. @@ -1095,7 +1159,7 @@ Hạn chế: Tiêu đề chính thức trong kết quả tìm kiếm sẽ đư Đã ẩn Sản phẩm được gắn thẻ. Đã hiện Sản phẩm được gắn thẻ. - Nút hành động + Nút thao tác Ẩn nút Thích Đã ẩn nút Thích. Đã hiện nút Thích. @@ -1123,9 +1187,9 @@ Hạn chế: Tiêu đề chính thức trong kết quả tìm kiếm sẽ đư Đã ẩn nền của nút. Đã hiển thị nền của nút. Hoạt ảnh nhấn đúp - Nguyên bản - Thumbs up - Thumbs up (Cairo) + Gốc + Thích + Thích (Cairo) Trái tim Trái tim (Đỏ) Ẩn @@ -1304,7 +1368,7 @@ Hạn chế: Lượt không thích có thể không hiển thị nếu người Tải lại video để bình chọn sử dụng Return YouTube Dislike SponsorBlock - Bật SponsorBlock + Kích hoạt SponsorBlock SponsorBlock là một tiện ích được đóng góp bởi cộng đồng giúp bỏ qua các phần gây khó chịu trong video trên YouTube. Giao diện @@ -1317,7 +1381,7 @@ Hạn chế: Lượt không thích có thể không hiển thị nếu người Tự động ẩn nút Bỏ qua Nút Bỏ qua sẽ ẩn sau vài giây. Nút Bỏ qua được hiển thị cho toàn bộ phân đoạn. - Hiện thông báo ngắn khi tự động bỏ qua + Hiện thông báo ngắn Hiện thông báo ngắn mỗi khi tự động bỏ qua phân đoạn. Nhấn vào đây để xem ví dụ. Thông báo không được hiển thị. Nhấn vào đây để xem ví dụ. Hiển thị thời lượng video không có phân đoạn @@ -1388,11 +1452,11 @@ Hạn chế: Lượt không thích có thể không hiển thị nếu người Đã sao chép cài đặt vào bảng nhớ tạm. Tạo phân đoạn mới - Hiển thị nút tạo phân đoạn mới - Nút tạo phân đoạn mới được hiển thị. - Nút tạo phân đoạn mới không được hiển thị. + Nút tạo phân đoạn mới + Đã hiện nút Tạo phân đoạn mới. + Đã ẩn nút Tạo phân đoạn mới. Điều chỉnh phân đoạn mới - Số mili giây mà các nút điều chỉnh thời gian di chuyển khi tạo phân đoạn mới. + Số mili giây bạn có thể tua đi và tua lại khi sử dụng các nút điều chỉnh thời gian trong lúc tạo phân đoạn mới. Giá trị nhập vào phải là một số dương. Xem hướng dẫn Hướng dẫn bao gồm các quy tắc và mẹo về cách tạo phân đoạn mới. @@ -1412,7 +1476,7 @@ Hạn chế: Lượt không thích có thể không hiển thị nếu người Các đoạn ngắn hơn giá trị này (tính bằng giây) sẽ không được hiển thị hoặc bị bỏ qua. Thời lượng không hợp lệ. Id người dùng riêng tư của bạn - Bạn nên giữ bí mật mã này. Nó như mật khẩu vậy, do đó không nên chia sẻ với người khác. Nếu ai đó có mã này, họ có thể giả mạo bạn. + Mã Id này giống như mật khẩu của bạn vậy, do đó không nên chia sẻ với bất kỳ ai. Nếu ai đó có được nó, họ có thể mạo danh bạn. ID người dùng riêng tư phải dài ít nhất 30 ký tự. Thay đổi URL API Địa chỉ SponsorBlock sử dụng để liên lạc đến máy chủ. @@ -1466,7 +1530,7 @@ Hạn chế: Lượt không thích có thể không hiển thị nếu người Thống kê Số liệu thống kê tạm thời không khả dụng (API ngừng hoạt động). Đang tải... - SponsorBlock đã vô hiệu hóa + Đã vô hiệu hoá SponsorBlock. Tên người dùng của bạn: <b>%s</b> Nhấn vào đây để thay đổi tên người dùng của bạn Không thể thay đổi tên người dùng: Trạng thái: %1$d %2$s. @@ -1559,6 +1623,7 @@ Nhấn vào Tiếp tục và tắt tối ưu hóa pin." Máy khách mặc định iOS Android + Android Creator Trình phát nhúng Android Thử nghiệm Android Android TV @@ -1570,7 +1635,8 @@ Nhấn vào Tiếp tục và tắt tối ưu hóa pin." • Video phát trực tiếp sẽ khởi chạy từ đầu. • Video có thể kết thúc sớm 1 giây. • Không có bộ giải mã âm thanh opus." - • Mục Bản âm thanh bị thiếu. + "• Mục Bản âm thanh bị thiếu. +• Mục 'Âm lượng ổn định' không khả dụng." "• Mục Bản âm thanh bị thiếu. • Mục 'Âm lượng ổn định' không khả dụng." • Video có thể không phát được. @@ -1614,7 +1680,6 @@ AVC (H.264) có độ phân giải tối đa 1080p, và phát video sẽ dùng n Revancify Xanh Revancify Đỏ YouTube - YouTube (Tiêu đề tối giản) Nguyên gốc Không bao gồm Đã bao gồm diff --git a/src/main/resources/youtube/translations/zh-rCN/strings.xml b/src/main/resources/youtube/translations/zh-rCN/strings.xml index e2af6703b..a6f050fac 100644 --- a/src/main/resources/youtube/translations/zh-rCN/strings.xml +++ b/src/main/resources/youtube/translations/zh-rCN/strings.xml @@ -5,7 +5,8 @@ 由于无障碍服务已启用,您的控制被修改 ReVanced Extended - 搜索设置 + 搜索 %s + 重置为默认值 实验性功能 你想继续吗? 重启应用以正常加载界面布局 @@ -17,7 +18,7 @@ 警告 "%1$s 未安装 请从网站下载 %2$s" - %s未安装,请先安装 + %s 未安装,请先安装它。 广告 隐藏全屏广告 @@ -72,6 +73,7 @@ 如果 DeArrow 不可用,不显示 Toast DeArrow API 端点 DeArrow 缩略图缓存端点 URL。除非您知道自己在做什么,否则请勿更改 + 无效的 DeArrow API URL 关于静态视频捕捉 静态捕捉是从每个视频的开头/中间/结尾处截取的。这些图像内置于 YouTube 中,不使用外部 API 使用快速静态捕捉 @@ -182,8 +184,8 @@ 频道简介顶部的连结已隐藏 频道简介顶部的连结已显示 隐藏”个性化“功能架 - ”个性化“功能架已隐藏 - ”个性化“功能架已显示 + “个性化” 功能架已隐藏 + “个性化” 功能架已显示 社区帖子 在首页和频道中隐藏或显示社区帖子 @@ -237,7 +239,7 @@ 添加引号以使用关键词: %s 关键词有冲突声明: %s 关键词太短,需要引号: %s - 关键词 \'%1$s\' 太宽,这将隐藏所有视频 + 关键字将隐藏所有视频: %s 推荐视频 隐藏推荐视频 @@ -248,8 +250,21 @@ • 来自未订阅频道且观看次数少于1,000次的视频" 隐藏低播放量的视频 从主页隐藏未订阅的频道上传的且播放量少于 1,000 的推荐视频 + 隐藏 UPCOMING 视频 + "隐藏带有 UPCOMING 标签的视频 + +注意:启用此选项也隐藏通知按钮" 观看次数过滤器 + 启用首页播放量过滤器 + 首页订阅内容的关键词过滤已启用 + 首页订阅内容的关键词过滤已禁用 + 启用搜索播放量过滤 + 搜索结果过滤器已启用 + 搜索结果过滤器已禁用 + 启用订阅视频播放量过滤器 + 订阅视频的关键词过滤器已启用 + 订阅视频的关键词过滤器已禁用 高于播放量 播放量大于此数字的视频将被隐藏。 低于播放量 @@ -257,6 +272,19 @@ 播放量的值 指定你的语言模板来修饰用户界面中每个视频下显示的播放量。每个关键字(在你的语言中的一个字/词) -> 值(关键字的含义) 必须单独一行。在“->”符号之前是关键字。如果更改应用程序或系统语言,则需要重置此设置。\n\n示例:\n英语:10K views = K -> 1000,views -> views\n西班牙语:10 K vistas = K -> 1000,vistas -> views 千 -> 1 000\n百万 -> 1 000 000\n十亿 -> 1 000 000 000\n播放量 -> views + 关于播放量过滤 + "主页/订阅/搜索结果被过滤以隐藏视图小于或大于指定数字的视频 + +限制: +• 不能隐藏短视频 +• 不能过滤 0 播放量的视频" + 在相关视频中隐藏 + 相关视频已隐藏 + 相关视频已显示 + "该设置限制了播放器屏幕上可以加载的最大布局数量 + +如果由于服务器端的更改导致播放器屏幕的布局发生变化,未预期的布局可能会被隐藏在播放器屏幕上" + 偏移 常规设置 更改起始页 @@ -276,6 +304,11 @@ 订阅 热门 稍后观看 + 更改首页类型 + "开始页面总是更改 + +限制:工具栏上的返回按钮可能无法工作" + 开始页面只更改一次 禁用强制自动音轨 强制自动音轨已禁用 强制自动音轨已启用 @@ -300,10 +333,12 @@ 移除查看器的自由裁量对话框 "移除查看器的自由裁量对话框 这不会绕过年龄限制它只会自动同意" - 启用手机布局 - 伪装 DPI 以使用一些手机布局 - 启用平板布局 - 伪装 DPI 以使用一些平板布局 + 调整布局 + 原版 + 手机 + 手机 (最大 480 dip) + 平板 + 平板 (最小 600 dip) 伪装应用版本 客户端版本已伪装 客户端版本未伪装 @@ -344,7 +379,10 @@ 按行分隔的名称筛选组件 自定义过滤器无效: %s + 挂钩按钮 + 覆盖应用内按钮的点击动作 + 下载按钮 覆盖视频下载按钮 视频下载按钮打开外部下载器 视频下载按钮打开应用内下载器 @@ -354,6 +392,16 @@ 播放列表下载器名称 已安装的外部下载器应用包名,例如 YTDLnis + 覆盖 YouTube Music 按钮 + YouTube Music 按钮会打开 RVX Music + YouTube Music 按钮会打开原生应用 + RVX Music 包名 + 已安装的 RVX Music 包名 + RVX Music + 警告 + %s 未安装,请先安装 + 前提条件 + 需要 YouTube Music 来覆盖按钮操作,点击此处下载 YouTube Music 迷你播放器 更改应用最小化播放器样式 @@ -386,6 +434,8 @@ 不透明度值介于 0-100 之间,0 为透明 迷你播放器的叠加层不透明度必须介于 0-100 之间 重置为默认值 + 导航栏 + 隐藏或显示导航栏区域的组件 启用窄间距导航按钮 导航按钮之间的间距变窄 导航按钮之间的间距不会变窄 @@ -423,16 +473,45 @@ 启用半透明导航栏 导航栏半透明 导航栏不透明 + 隐藏导航栏 + 导航栏已隐藏 + 导航栏已显示 设置菜单 隐藏 YouTube 设置菜单中的元素 - YouTube 设置菜单 - 隐藏 YouTube 设置菜单中的元素 - YouTube 设置菜单过滤器 - 要过滤的 YouTube 设置菜单名称列表,以新行分隔 - "账户 -节省数据 -字幕" + 隐藏家庭中心菜单 + 家庭中心菜单已隐藏 + 家庭中心菜单已显示 + 隐藏常规菜单 + 常规菜单已隐藏 + 常规菜单已显示 + 隐藏账户菜单 + 账户菜单已隐藏 + 账户菜单已显示 + 隐藏数据保存菜单 + 数据保存菜单已隐藏 + 数据保存菜单已显示 + 隐藏自动播放菜单 + 自动播放菜单已隐藏 + 自动播放菜单已显示 + 隐藏视频质量偏好菜单 + 视频质量偏好菜单已隐藏 + 视频质量首选项菜单已显示 + 隐藏背景菜单 + 背景菜单已隐藏 + 背景菜单已显示 + 隐藏在 TV 中观看菜单 + 在 TV 中观看菜单已隐藏 + 在 TV 中观看菜单已显示 + 隐藏管理全部历史记录菜单 + 管理全部历史记录菜单已隐藏 + 管理全部历史记录菜单已显示 + 在 YouTube 菜单中隐藏您的数据 + 您在 YouTube 菜单中的数据已隐藏 + 您在 YouTube 菜单中的数据已显示 + 隐藏隐私菜单 + 隐私菜单已隐藏 + 隐私菜单已显示 工具栏 隐藏或更改工具栏上的组件,如工具栏按钮、搜索栏、标题 @@ -984,15 +1063,18 @@ 隐藏暂停时叠加按钮 暂停时叠加按钮已隐藏 暂停时叠加按钮已显示 - 隐藏付费推广横幅 - 付费推广横幅已隐藏 - 付费推广横幅标签已显示 隐藏趋势按钮 趋势按钮已隐藏 趋势按钮已显示 隐藏商店按钮 商店按钮已隐藏 商店按钮已显示 + 隐藏贴纸 + 贴纸已隐藏 + 贴纸已显示 + 隐藏付费推广横幅 + 付费推广横幅已隐藏 + 付费推广横幅标签已显示 隐藏信息面板 信息面板已隐藏 信息面板已显示 @@ -1012,9 +1094,13 @@ 视频链接标签已隐藏 视频链接标签已显示 - 隐藏保存声音到播放列表按钮 - 保存声音到播放列表按钮已隐藏 - 保存声音到播放列表按钮已显示 + 操作建议 + 隐藏绿幕按钮 + 绿幕按钮已隐藏 + 绿幕按钮已显示 + 隐藏保存音乐按钮 + 保存音乐按钮已隐藏 + 保存音乐按钮已显示 隐藏商店按钮 商店按钮已隐藏 商店按钮已显示 @@ -1058,13 +1144,16 @@ 声音按钮已显示 动画/反馈 + 禁用点赞按钮动画 + 点赞按钮动画已禁用 + 点赞按钮动画已启用 隐藏播放 & 暂停按钮背景 按钮背景已隐藏 按钮背景已显示 双击动画 原版 - Cairo + 缩略图 (Cairo) 心形 心形(着色) 隐藏 @@ -1085,6 +1174,9 @@ 隐藏导航栏 导航栏已隐藏 导航栏已显示 + 空白空间的高度百分比 + 配置隐藏导航栏时空白空间的高度百分比,介于0至100之间(%) + 高度百分比必须介于0-100之间(%) 替换频道标识 频道名称已使用 频道标识已使用 @@ -1490,6 +1582,7 @@ 默认客户端 iOS Android + Android 创建者 Android 嵌入式播放器 Android 测试套件 Android TV @@ -1498,7 +1591,7 @@ 网址 伪装副作用 "• 电影或付费视频可能无法播放" - • 音轨菜单缺失 + "• 音轨菜单缺失" "• 音轨菜单缺失" • 视频可能无法播放 强制使用 iOS AVC (H.264) diff --git a/src/main/resources/youtube/translations/zh-rTW/strings.xml b/src/main/resources/youtube/translations/zh-rTW/strings.xml index e1dcd4034..b858d2452 100644 --- a/src/main/resources/youtube/translations/zh-rTW/strings.xml +++ b/src/main/resources/youtube/translations/zh-rTW/strings.xml @@ -283,6 +283,7 @@ "此設定限制播放器螢幕上可以載入佈局的最大數量。 如果由於伺服器端變更而導致播放器螢幕佈局發生變化,則播放器螢幕上可能會隱藏非預期的佈局。" + 偏移 一般設定 更改起始頁 @@ -331,10 +332,12 @@ 移除查看器的自由裁量對話框 "移除觀眾酌情觀看對話方塊。 這項選項不會繞過年齡限制,它只會自動接受。" - 啟用手機版面配置 - 以 DPI 欺騙系統使用手機版面配置 - 啟用平板版面配置 - 偽裝 DPI 以使用一些平板電腦版面配置 + 變更佈局 + 原始 + 手機 + 手機 (最大 480 dip) + 平板電腦 + 平板電腦 (最少 600 dip) 偽裝應用程式版本 已偽裝版本 未偽裝版本 @@ -475,13 +478,66 @@ 設定選單 隱藏 YouTube 設定選單中的元素 - YouTube 設定選單 - 隱藏 YouTube 設定選單中的元素 - YouTube 設定選單過濾器 - 要過濾的 YouTube 設定選單名稱列表,以新行分隔 - "帳戶 -節省數據用量 -字幕" + 隱藏家庭中心選單 + 家庭中心選單已隱藏。 + 家庭中心選單已顯示。 + 隱藏一般選單 + 一般選單已隱藏。 + 一般選單已顯示。 + 隱藏帳戶選單 + 帳戶選單已隱藏。 + 帳戶選單已顯示。 + 隱藏資料保存選單 + 資料保存選單已隱藏。 + 資料保存選單已顯示。 + 隱藏自動播放選單 + 自動播放選單已隱藏。 + 自動播放選單已顯示。 + 隱藏影片品質選項選單 + 影片品質選項選單已隱藏。 + 影片品質選項選單已顯示。 + 隱藏背景選單 + 背景選單已隱藏。 + 背景選單已顯示。 + 隱藏在電視上觀看選單 + 在電視上觀看選單已隱藏。 + 在電視上觀看選單已顯示。 + 隱藏管理所有歷史選單 + 管理所有歷史選單已隱藏。 + 管理所有歷史選單已顯示。 + 在 YouTube 選單中隱藏您的資料 + 您在 YouTube 選單中的資料已隱藏。 + YouTube 選單中您的資料已顯示。 + 隱藏隱私選單 + 隱私選單已隱藏。 + 隱私選單已顯示。 + 隱藏嘗試實驗性新功能選單 + 嘗試實驗性新功能選單已隱藏。 + 嘗試實驗性新功能選單已顯示。 + 隱藏購買和會員選單 + 購買和會員選單已隱藏。 + 購買和會員選單已顯示。 + 隱藏帳單和付款選單 + 帳單和付款選單已隱藏。 + 帳單和付款選單已顯示。 + 隱藏通知選單 + 通知選單已隱藏。 + 通知選單已顯示。 + 隱藏已連接的應用程式選單 + 已連接的應用程式選單已隱藏。 + 已連接的應用程式選單已顯示。 + 隱藏即時聊天選單 + 即時聊天選單已隱藏。 + 即時聊天選單已顯示。 + 隱藏字幕選單 + 字幕選單已隱藏。 + 字幕選單已顯示。 + 隱藏輔助使用選單 + 輔助使用選單已隱藏。 + 輔助使用功能選單已顯示。 + 隱藏關於選單 + 關於選單已隱藏。 + 關於選單已顯示。 工具欄 隱藏或變更工具欄上的元件,例如工具欄按鈕、搜尋欄、標題 @@ -517,6 +573,12 @@ 隱藏語音搜尋按鈕 語音搜尋按鈕已隱藏 語音搜尋按鈕已顯示 + 隱藏 YouTube 塗鴉 + YouTube 塗鴉已隱藏。 + YouTube 塗鴉已顯示。 + "YouTube 塗鴉每年都會出現幾天。 + +如果您所在的地區目前正在顯示 YouTube 塗鴉,且此隱藏設定處於啟用狀態,則搜尋列下方的篩選列也會被隱藏。" 替換創作按鈕 將創作按鈕替換成設定按鈕 分配給按鈕的操作類型 @@ -1034,15 +1096,18 @@ 隱藏暫停時疊加按鈕 暫停時疊加按鈕已隱藏 暫停時疊加按鈕已顯示 - 隱藏付費促銷標籤 - 付費促銷標籤被隱藏 - 付費推廣橫幅標簽已顯示 隱藏按鈕 按鈕被隱藏。 按鈕已顯示。 隱藏購物按鈕 購物按鈕已隱藏。 顯示購物按鈕。 + 隱藏貼圖 + 貼圖已隱藏。 + 貼圖已顯示。 + 隱藏付費促銷標籤 + 付費促銷標籤被隱藏 + 付費推廣橫幅標簽已顯示 隱藏訊息面板 訊息面板已隱藏 訊息面板已顯示 @@ -1062,9 +1127,13 @@ 影片連結標簽已隱藏 影片連結標簽已顯示 - 隱藏儲存音效到播放清單按鈕 - 儲存音效到播放清單按鈕已隱藏。 - 儲存音效到播放清單按鈕已顯示。 + 建議採取的行動 + 隱藏綠幕按鈕 + 綠幕按鈕已隱藏。 + 綠幕按鈕已顯示。 + 隱藏儲存音樂按鈕 + 儲存音樂按鈕已隱藏。 + 儲存音樂按鈕已顯示。 隱藏商店按鈕 商店按鈕已隱藏 商店按鈕已顯示 @@ -1108,6 +1177,9 @@ 聲音按鈕已顯示 動畫 / 回饋 + 停用讚按鈕動畫 + 點讚按鈕上方的噴泉動畫已停用。 + 點讚按鈕上方的噴泉動畫已啟用。 隱藏播放 & 暫停按鈕背景 按鈕背景被隱藏。 按鈕背景被顯示。 @@ -1549,7 +1621,8 @@ 關閉此設定可能會導致影片播放問題。 預設客戶端 iOS - Android + 安卓 + 安卓創作者 Android 嵌入式播放器 Android 測試套件 Android 電視 @@ -1558,7 +1631,7 @@ Web 偽裝副作用 "• 電影或付費影片可能無法播放。" - • 音軌選單遺失。 + "• 音軌選單遺失。" "• 音軌選單遺失。" • 影片可能無法播放。 強制 iOS AVC (H.264) @@ -1601,7 +1674,6 @@ AVC (H.264) 的最大解析度為 1080p,影片播放將比 VP9 或 AV1 使用 復興藍 復興紅 YouTube - YouTube (最小標題) 預設 排除 包括