diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7724480..f4fef54a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,45 @@ +# [5.37.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.5...v5.37.0-dev.6) (2025-09-15) + + +### Bug Fixes + +* **Instagram - Hide navigation buttons:** Add constrain to known working version ([e6c79f1](https://github.com/ReVanced/revanced-patches/commit/e6c79f13834c83fef04e4dee5e628cb0b9a27765)) + +# [5.37.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.4...v5.37.0-dev.5) (2025-09-15) + + +### Bug Fixes + +* **Viber - Hide ads:** Add constrain to known working version ([2db0948](https://github.com/ReVanced/revanced-patches/commit/2db0948beaf2b68391a1fe7f21e92d31c7df61e7)) + +# [5.37.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.3...v5.37.0-dev.4) (2025-09-14) + + +### Bug Fixes + +* **YouTube Music - Spoof streaming data:** Fix audio playback stuttering ([#5839](https://github.com/ReVanced/revanced-patches/issues/5839)) ([2a85a3b](https://github.com/ReVanced/revanced-patches/commit/2a85a3b29092729ae16d1fd93803634ce5f08e95)) + +# [5.37.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.2...v5.37.0-dev.3) (2025-09-14) + + +### Bug Fixes + +* **Spotify:** Remove broken `Spoof client` patch ([#5833](https://github.com/ReVanced/revanced-patches/issues/5833)) ([dcd4245](https://github.com/ReVanced/revanced-patches/commit/dcd42454bd5f87dddd720534f6120c4ef90063a3)) + +# [5.37.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.1...v5.37.0-dev.2) (2025-09-14) + + +### Bug Fixes + +* Resolve patching with dev branch ([09b941a](https://github.com/ReVanced/revanced-patches/commit/09b941abf0e8029999565082b02a88b5de507ec4)) + +# [5.37.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.36.0...v5.37.0-dev.1) (2025-09-14) + + +### Features + +* **Viber:** Add `Hide ads` patch ([#5826](https://github.com/ReVanced/revanced-patches/issues/5826)) ([0abfab7](https://github.com/ReVanced/revanced-patches/commit/0abfab79d7cda15bf17c53679fbfffb021662649)) + # [5.36.0](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0) (2025-09-14) diff --git a/extensions/music/build.gradle.kts b/extensions/music/build.gradle.kts index 1e7be309c..f84a54a0d 100644 --- a/extensions/music/build.gradle.kts +++ b/extensions/music/build.gradle.kts @@ -1,3 +1,9 @@ +dependencies { + compileOnly(project(":extensions:shared:library")) + compileOnly(project(":extensions:youtube:stub")) + compileOnly(libs.annotation) +} + android { defaultConfig { minSdk = 26 diff --git a/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java b/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java new file mode 100644 index 000000000..5c60437b5 --- /dev/null +++ b/extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java @@ -0,0 +1,23 @@ +package app.revanced.extension.music.patches.spoof; + +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_43_32; +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48; + +import app.revanced.extension.shared.spoof.ClientType; +import app.revanced.extension.shared.spoof.requests.StreamingDataRequest; + +@SuppressWarnings("unused") +public class SpoofVideoStreamsPatch { + + /** + * Injection point. + */ + public static void setClientOrderToUse() { + ClientType[] availableClients = { + ANDROID_VR_1_43_32, + ANDROID_VR_1_61_48, + }; + + StreamingDataRequest.setClientOrderToUse(availableClients, ANDROID_VR_1_43_32); + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index 6a6c31113..e2c70f616 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -34,6 +34,5 @@ public class BaseSettings { public static final BooleanSetting SPOOF_VIDEO_STREAMS_IOS_FORCE_AVC = new BooleanSetting("revanced_spoof_video_streams_ios_force_avc", FALSE, true, "revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new SpoofiOSAvailability()); // Client type must be last spoof setting due to cyclic references. - public static final EnumSetting SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_NO_AUTH, true, parent(SPOOF_VIDEO_STREAMS)); - + public static final EnumSetting SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS)); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java index 39d6ad823..cc80cb924 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java @@ -12,7 +12,7 @@ import app.revanced.extension.shared.settings.BaseSettings; public enum ClientType { // https://dumps.tadiphone.dev/dumps/oculus/eureka - ANDROID_VR_NO_AUTH( + ANDROID_VR_1_61_48( 28, "ANDROID_VR", "com.google.android.apps.youtube.vr.oculus", @@ -27,7 +27,7 @@ public enum ClientType { "1.61.48", false, false, - "Android VR No auth" + "Android VR 1.61" ), // Chromecast with Google TV 4K. // https://dumps.tadiphone.dev/dumps/google/kirkwood @@ -96,6 +96,26 @@ public enum ClientType { forceAVC() ? "iOS TV Force AVC" : "iOS TV" + ), + /** + * Uses non adaptive bitrate, which fixes audio stuttering with YT Music. + * Uses VP9 and not AV1. + */ + ANDROID_VR_1_43_32( + ANDROID_VR_1_61_48.id, + ANDROID_VR_1_61_48.clientName, + ANDROID_VR_1_61_48.packageName, + ANDROID_VR_1_61_48.deviceMake, + ANDROID_VR_1_61_48.deviceModel, + ANDROID_VR_1_61_48.osName, + ANDROID_VR_1_61_48.osVersion, + ANDROID_VR_1_61_48.androidSdkVersion, + ANDROID_VR_1_61_48.buildId, + "107.0.5284.2", + "1.43.32", + ANDROID_VR_1_61_48.requiresAuth, + ANDROID_VR_1_61_48.useAuth, + "Android VR 1.43" ); private static boolean forceAVC() { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java index d999b9678..0980f816f 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java @@ -252,8 +252,9 @@ public class SpoofVideoStreamsPatch { public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability { @Override public boolean isAvailable() { + ClientType clientType = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get(); return BaseSettings.SPOOF_VIDEO_STREAMS.get() - && BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_NO_AUTH; + && (clientType == ClientType.ANDROID_VR_1_61_48 || clientType == ClientType.ANDROID_VR_1_43_32); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java index 5179b3e5f..6cc3ec1cd 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java @@ -42,7 +42,8 @@ final class PlayerRoutes { // but if this is a fall over client it will set the language even though // the audio language is not selectable in the UI. ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get(); - Locale streamLocale = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH + Locale streamLocale = (userSelectedClient == ClientType.ANDROID_VR_1_61_48 + || userSelectedClient == ClientType.ANDROID_VR_1_43_32) ? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get().getLocale() : Locale.getDefault(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java index eeab17d1f..d814ced88 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java @@ -35,21 +35,22 @@ import app.revanced.extension.shared.spoof.ClientType; */ public class StreamingDataRequest { - private static final ClientType[] CLIENT_ORDER_TO_USE; + private static volatile ClientType[] clientOrderToUse = ClientType.values(); - static { - ClientType[] allClientTypes = ClientType.values(); - ClientType preferredClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get(); + public static void setClientOrderToUse(ClientType[] availableClients, ClientType preferredClient) { + Objects.requireNonNull(availableClients); - CLIENT_ORDER_TO_USE = new ClientType[allClientTypes.length]; - CLIENT_ORDER_TO_USE[0] = preferredClient; + clientOrderToUse = new ClientType[availableClients.length]; + clientOrderToUse[0] = preferredClient; int i = 1; - for (ClientType c : allClientTypes) { + for (ClientType c : availableClients) { if (c != preferredClient) { - CLIENT_ORDER_TO_USE[i++] = c; + clientOrderToUse[i++] = c; } } + + Logger.printDebug(() -> "Available spoof clients: " + Arrays.toString(clientOrderToUse)); } private static final String AUTHORIZATION_HEADER = "Authorization"; @@ -193,9 +194,9 @@ public class StreamingDataRequest { // Retry with different client if empty response body is received. int i = 0; - for (ClientType clientType : CLIENT_ORDER_TO_USE) { + for (ClientType clientType : clientOrderToUse) { // Show an error if the last client type fails, or if debug is enabled then show for all attempts. - final boolean showErrorToast = (++i == CLIENT_ORDER_TO_USE.length) || debugEnabled; + final boolean showErrorToast = (++i == clientOrderToUse.length) || debugEnabled; HttpURLConnection connection = send(clientType, videoId, playerHeaders, showErrorToast); if (connection != null) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java new file mode 100644 index 000000000..23a415708 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java @@ -0,0 +1,29 @@ +package app.revanced.extension.youtube.patches.spoof; + +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_CREATOR; +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_UNPLUGGED; +import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48; +import static app.revanced.extension.shared.spoof.ClientType.IOS_UNPLUGGED; + +import app.revanced.extension.shared.settings.BaseSettings; +import app.revanced.extension.shared.spoof.ClientType; +import app.revanced.extension.shared.spoof.requests.StreamingDataRequest; + +@SuppressWarnings("unused") +public class SpoofVideoStreamsPatch { + + /** + * Injection point. + */ + public static void setClientOrderToUse() { + ClientType[] availableClients = { + ANDROID_VR_1_61_48, + ANDROID_UNPLUGGED, + ANDROID_CREATOR, + IOS_UNPLUGGED + }; + + StreamingDataRequest.setClientOrderToUse(availableClients, + BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get()); + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java index 6ea249a4f..33a69b6b0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java @@ -86,7 +86,8 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference { String summary = str(key + "_summary"); // Android VR supports AV1 but all other clients do not. - if (clientType != ClientType.ANDROID_VR_NO_AUTH) { + if (clientType != ClientType.ANDROID_VR_1_61_48 + && clientType != ClientType.ANDROID_VR_1_43_32) { summary += '\n' + str("revanced_spoof_video_streams_about_no_av1"); } diff --git a/gradle.properties b/gradle.properties index 39ea23752..3b9aeb25d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.36.0 +version = 5.37.0-dev.6 diff --git a/patches/api/patches.api b/patches/api/patches.api index b222e63bd..6d4c6e065 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -404,6 +404,7 @@ public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun is_7_33_or_greater ()Z public static final fun is_8_11_or_greater ()Z + public static final fun is_8_15_or_greater ()Z } public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatchKt { @@ -1241,6 +1242,10 @@ public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksP public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/viber/ads/HideAdsPatchKt { + public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt index b0f751d20..edca83e45 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt @@ -15,7 +15,7 @@ val hideNavigationButtonsPatch = bytecodePatch( description = "Hides navigation bar buttons, such as the Reels and Create button.", use = false ) { - compatibleWith("com.instagram.android") + compatibleWith("com.instagram.android"("396.0.0.46.242")) val hideReels by booleanOption( key = "hideReels", diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreams.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreams.kt index 10c65dae1..e50a70a49 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreams.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreams.kt @@ -1,11 +1,20 @@ package app.revanced.patches.music.misc.spoof +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patches.music.misc.extension.sharedExtensionPatch +import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint import app.revanced.patches.music.playservice.is_7_33_or_greater import app.revanced.patches.music.playservice.is_8_11_or_greater +import app.revanced.patches.music.playservice.is_8_15_or_greater import app.revanced.patches.music.playservice.versionCheckPatch import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;" + val spoofVideoStreamsPatch = spoofVideoStreamsPatch( + fixMediaFetchHotConfigChanges = { true }, + fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater }, + fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }, block = { compatibleWith( "com.google.android.apps.youtube.music"( @@ -13,9 +22,12 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) - dependsOn(versionCheckPatch, userAgentClientSpoofPatch) + dependsOn(sharedExtensionPatch, versionCheckPatch, userAgentClientSpoofPatch) }, - fixMediaFetchHotConfigChanges = { true }, - fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater }, - fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater } + executeBlock = { + musicActivityOnCreateFingerprint.method.addInstruction( + 1, // Must use 1 index so context is set by extension patch. + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V" + ) + } ) \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt index 86fbdc132..467498bf2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt @@ -9,6 +9,8 @@ var is_7_33_or_greater = false private set var is_8_11_or_greater = false private set +var is_8_15_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube Music target app.", @@ -21,5 +23,6 @@ val versionCheckPatch = resourcePatch( // All bug fix releases always seem to use the same play store version as the minor version. is_7_33_or_greater = 245199000 <= playStoreServicesVersion is_8_11_or_greater = 251199000 <= playStoreServicesVersion + is_8_15_or_greater = 251530000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index cbeea3f78..67ba7c80c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -1,9 +1,12 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.fingerprint +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal val buildInitPlaybackRequestFingerprint = fingerprint { returns("Lorg/chromium/net/UrlRequest\$Builder;") @@ -35,8 +38,15 @@ internal val buildPlayerRequestURIFingerprint = fingerprint { internal val buildRequestFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Lorg/chromium/net/UrlRequest;") + returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder; custom { methodDef, _ -> + if (methodDef.indexOfFirstInstruction { + val reference = getReference() + reference?.name == "newUrlRequestBuilder" + } < 0) { + return@custom false + } + // Different targets have slightly different parameters // Earlier targets have parameters: @@ -58,12 +68,22 @@ internal val buildRequestFingerprint = fingerprint { // Lorg/chromium/net/UrlRequest\$Callback; // L + // 20.16+ uses a refactored and extracted method: + // L + // Ljava/util/Map; + // [B + // L + // Lorg/chromium/net/UrlRequest$Callback; + // L + val parameterTypes = methodDef.parameterTypes - (parameterTypes.size == 7 || parameterTypes.size == 8) && - parameterTypes[1] == "Ljava/util/Map;" // URL headers. + val parameterTypesSize = parameterTypes.size + (parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) && + parameterTypes[1] == "Ljava/util/Map;" // URL headers. } } + internal val protobufClassParseByteBufferFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) returns("L") @@ -148,7 +168,8 @@ internal val mediaFetchHotConfigFingerprint = fingerprint { literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG } } -// YT 20.10+, YT Music 8.11+ +// YT 20.10+, YT Music 8.11 - 8.14. +// Flag is missing in YT Music 8.15+, and it is not known if a replacement flag/feature exists. internal const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index 4cb3ffac3..923089d01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -10,6 +10,7 @@ import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.util.findFreeRegister import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt index 4546d80f4..55325bc4d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt @@ -187,11 +187,16 @@ val customThemePatch = resourcePatch( } // Login screen gradient. - document("res/drawable/start_screen_gradient.xml").use { document -> - val gradientNode = document.getElementsByTagName("gradient").item(0) as Element + try { + document("res/drawable/start_screen_gradient.xml").use { document -> + val gradientNode = document.getElementsByTagName("gradient").item(0) as Element - gradientNode.setAttribute("android:startColor", "@color/gray_7") - gradientNode.setAttribute("android:endColor", "@color/gray_7") + gradientNode.setAttribute("android:startColor", "@color/gray_7") + gradientNode.setAttribute("android:endColor", "@color/gray_7") + } + } catch (_: Exception) { + // Fails for 9.0.66+ + // printWarn("Failed to locate start_screen_gradient.xml, skipping modification.") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt index b5d5bf22c..d57370b3f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt @@ -12,9 +12,9 @@ import app.revanced.util.returnEarly internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;" +@Deprecated("Patch no longer functions") @Suppress("unused") val spoofClientPatch = bytecodePatch( - name = "Spoof client", description = "Spoofs the client to fix various functions of the app.", ) { val requestListenerPort by intOption( diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt new file mode 100644 index 000000000..11ebe0d11 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.viber.ads + +import app.revanced.patcher.fingerprint + +internal val adsFreeFingerprint = fingerprint { + returns("I") + parameters() + custom { method, classDef -> + classDef.type.contains("com/viber/voip/feature/viberplus") && + classDef.superclass?.contains("com/viber/voip/core/feature") == true && // Must extend com.viber.voip.core.feature.? + classDef.methods.count() == 1 + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt new file mode 100644 index 000000000..91bff02c6 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt @@ -0,0 +1,17 @@ +package app.revanced.patches.viber.ads + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.returnEarly + +@Suppress("unused") +val hideAdsPatch = bytecodePatch( + name = "Hide Ads", + description = "Hides ad banners between chats.", +) { + compatibleWith("com.viber.voip"("25.9.2.0")) + + execute { + // Return 1 (true) indicating ads should be disabled. + adsFreeFingerprint.method.returnEarly(1) + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index aa03de71a..dbf055299 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.misc.spoof +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference @@ -13,56 +14,70 @@ import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint -val spoofVideoStreamsPatch = spoofVideoStreamsPatch({ - compatibleWith( - "com.google.android.youtube"( - "19.34.42", - "19.43.41", - "19.47.53", - "20.07.39", - "20.12.46", - "20.13.41", +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;" + +val spoofVideoStreamsPatch = spoofVideoStreamsPatch( + block = { + compatibleWith( + "com.google.android.youtube"( + "19.34.42", + "19.43.41", + "19.47.53", + "20.07.39", + "20.12.46", + "20.13.41", + ) ) - ) - dependsOn( - userAgentClientSpoofPatch, - settingsPatch, - versionCheckPatch - ) -}, { - is_19_34_or_greater -}, { - // In 20.14 the flag was merged with 20.03 start playback flag. - is_20_10_or_greater && !is_20_14_or_greater -}, { - is_20_03_or_greater -}, { - addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") + dependsOn( + userAgentClientSpoofPatch, + settingsPatch, + versionCheckPatch + ) + }, + fixMediaFetchHotConfigChanges = { + is_19_34_or_greater + }, + fixMediaFetchHotConfigAlternativeChanges = { + // In 20.14 the flag was merged with 20.03 start playback flag. + is_20_10_or_greater && !is_20_14_or_greater + }, + fixParsePlaybackResponseFeatureFlag = { + is_20_03_or_greater + }, + executeBlock = { + addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") - PreferenceScreen.MISC.addPreferences( - PreferenceScreenPreference( - key = "revanced_spoof_video_streams_screen", - sorting = PreferenceScreenPreference.Sorting.UNSORTED, - preferences = setOf( - SwitchPreference("revanced_spoof_video_streams"), - ListPreference("revanced_spoof_video_streams_client_type"), - NonInteractivePreference( - // Requires a key and title but the actual text is chosen at runtime. - key = "revanced_spoof_video_streams_about_android", - tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference" + PreferenceScreen.MISC.addPreferences( + PreferenceScreenPreference( + key = "revanced_spoof_video_streams_screen", + sorting = PreferenceScreenPreference.Sorting.UNSORTED, + preferences = setOf( + SwitchPreference("revanced_spoof_video_streams"), + ListPreference("revanced_spoof_video_streams_client_type"), + NonInteractivePreference( + // Requires a key and title but the actual text is chosen at runtime. + key = "revanced_spoof_video_streams_about_android", + tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference" + ), + ListPreference( + key = "revanced_spoof_video_streams_language", + // Language strings are declared in Setting patch. + entriesKey = "revanced_language_entries", + entryValuesKey = "revanced_language_entry_values", + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" + ), + SwitchPreference("revanced_spoof_video_streams_ios_force_avc"), + SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"), ), - ListPreference( - key = "revanced_spoof_video_streams_language", - // Language strings are declared in Setting patch. - entriesKey = "revanced_language_entries", - entryValuesKey = "revanced_language_entry_values", - tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" - ), - SwitchPreference("revanced_spoof_video_streams_ios_force_avc"), - SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"), ), - ), - ) -}) + ) + + mainActivityOnCreateFingerprint.method.addInstruction( + 1, // Must use 1 index so context is set by extension patch., + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V" + ) + } +) diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index 180779e53..5a651318d 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -1074,9 +1074,12 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz. Həqiqi məzmunu olmayan aralıq. Fasilə, statik kadr və ya təkrarlanan animasiya ola bilər. Məlumat ehtiva edən keçidlər daxil deyil Son kartlar / Zaminlər Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil - Önizləmə/Anons/Qısa - Videoda və ya seriyanın digər videolarında nə gözlənildiyini və ya baş verdiyini göstərən, bütün məlumatların başqa yerdə təkrarlandığı bölüm toplusuƏlaqəsiz/Zarafatlar - Videonun əsas məzmununu başa düşmək tələb olunmayan yalnız əlaqəsiz və ya yumor üçün əlavə edilmiş təsiredici səhnələr. Məzmun və ya arxa plan detallarını təqdim edən bölümlər daxil deyil + Giriş / Salamlar + Yaxınlaşan video üçün danışılan kadrlar, salamlama və sağollaşma. Əlavə məzmun əlavə edən bölmələr daxil deyil + Önizləmə / Anons + Videoda və ya seriyanın digər videolarında nə gözlənildiyini və ya baş verdiyini göstərən, bütün məlumatların başqa yerdə təkrarlandığı bölüm toplusu + Əlaqəsiz / Zarafatlar + Videonun əsas məzmunun başa düşmək tələb olunmayan əlaqəsiz səhnələr və ya zarafatlar. Məzmun və ya arxa plan təfərrüatlarını təmin edən bölmələr daxil deyil Musiqi: Musiqi olmayan bölmə Yalnız musiqi videolarında istifadə üçün. Artıq başqa kateqoriyaya aid edilməyən musiqisiz musiqi videoları bölmələri Ötür @@ -1089,10 +1092,11 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz. Fasiləni ötür Fasiləni ötür Bitişi ötür + Girişi ötür Önizləməni ötür Önizləməni ötür Anonsu ötür - Əlaqəsiz hissəni ötür + Əlaqəsiz olanı ötür Musiqisiz hissəni ötür Bölümü ötür Sponsorlu hissə ötürüldü @@ -1103,10 +1107,11 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz. Fasilə ötürüldü Fasilə ötürüldü Bitiş ötürüldü + Giriş ötürüldü Önbaxış ötürüldü Önbaxış ötürüldü Anons ötürüldü - Əlaqəsiz hissə ötürüldü + Əlaqəsiz ötürüldü Musiqi olmayan bölmə ötürüldü Göndərilməmiş bölüm ötürüldü Çoxlu bölümlər ötürüldü diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index 24f4573b3..5544dca79 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -96,13 +96,13 @@ Toca el botón continuar y permite los cambios de optimización." Barra de progreso Controles de deslizamiento Otros - Video + Vídeo Restaurar menús de configuración antiguos - Se muestran los menús de configuración antiguos - No se muestran los menús de configuración antiguos + Los menús de configuración antiguos son visibles + Los menús de configuración antiguos están ocultos Mostrar el historial de búsqueda de ajustes - El historial de búsqueda de los ajustes está visible - El historial de búsqueda de ajustes no se muestra + El historial de búsqueda de los ajustes es visible + El historial de búsqueda de ajustes está oculto Desactivar la reproducción en segundo plano de Shorts @@ -151,19 +151,19 @@ No se le notificará de ningún evento inesperado." Se muestran las tarjetas de artista Ocultar \"Más como esto\" \"Más como esto\" está oculto - \"Más como esto\" está habilitado + \"Más como esto\" es visible Ocultar publicaciones de comunidad Las publicaciones de la comunidad están ocultas - Se muestran las publicaciones de la comunidad + Las publicaciones de la comunidad se muestran Ocultar banners compactos Los banners compactos están ocultos Se muestran los banners compactos Ocultar caja de Crowdfunding La caja de Crowdfunding está oculta - La caja de Crowdfunding está visible + La caja de Crowdfunding es visible Ocultar tarjeta expandible - Tarjeta expandible debajo de los videos oculta - Tarjeta expandible debajo de los videos visible + La tarjeta expandible debajo de los vídeos está oculta + La tarjeta expandible debajo de los vídeos es visible Ocultar botón de micrófono flotante El botón flotante del micrófono en la búsqueda está oculto Se muestra el botón flotante del micrófono en la búsqueda @@ -175,42 +175,42 @@ No se le notificará de ningún evento inesperado." • Más relevantes • Compras • Ver de nuevo" - Los estantes horizontales están visibles + Los estantes horizontales son visibles Ocultar estantería de imágenes - Estantería de imágenes en los resultados de búsqueda oculta - Estantería de imágenes en los resultados de búsqueda visible + La estantería de imágenes en los resultados de búsqueda está oculta + La estantería de imágenes en los resultados de búsqueda es visible Ocultar últimas publicaciones Las últimas publicaciones están ocultas Se muestran las últimas publicaciones Ocultar lista de reproducción Mix - La lista de reproducción Mix está oculta - La lista de reproducción Mix está visible + Las listas de reproducción Mix están ocultas + La lista de reproducción Mix es visible Ocultar sección de películas La sección de películas está oculta - La sección de películas está visible + La sección de películas es visible - Ocultar el botón \'Notificarme\' + Ocultar el botón \"Notificarme\" El botón Notificarme está oculto - El botón Notificarme está visible + El botón Notificarme es visible Ocultar jugables Los jugables están ocultos - Los jugables están visibles + Los jugables son visibles Ocultar botón \'Mostrar más\' El botón Mostrar más en los resultados de búsqueda está oculto - El botón Mostrar más en los resultados de búsqueda está visible + El botón Mostrar más en los resultados de búsqueda es visible Ocultar encuestas Las encuestas están ocultas - Las encuestas están visibles + Las encuestas son visibles Ocultar estantes de tickets - El estante de tickets está oculto - El estante de boletos está visible + La estantería de tickets está oculta + La estantería de tickets es visible Ocultar etiquetas de recomendación de vídeo Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda están ocultas - Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda están visibles + Las etiquetas \"La gente también vio\" y \"También te puede gustar\" en los resultados de búsqueda son visibles Ocultar YouTube Doodles La animación de los Doodles de YouTube en el logotipo está oculta @@ -219,10 +219,10 @@ No se le notificará de ningún evento inesperado." Si un doodle se está mostrando actualmente en tu región y este ajuste de ocultación está activado, la barra de filtro situada debajo de la barra de búsqueda también estará oculta." Ocultar barra de canal - Barra de canales oculta + La barra de canales está oculta Barra de canales mostrada Ocultar marca de agua del canal - Marca de agua oculta + La marca de agua está oculta Marca de agua mostrada Ocultar cajas de emergencia Las cajas de emergencia están ocultas @@ -232,17 +232,17 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Los paneles de información se muestran - Ocultar el botón Unirse + Ocultar el botón \"Unirse\" El botón Unirse está oculto - El botón Unirse está visible + El botón Unirse es visible Ocultar paneles médicos Los paneles médicos están ocultos Se muestran paneles médicos Ocultar acciones rápidas - Acciones rápidas en pantalla completa ocultas + Las rápidas en pantalla completa están ocultas Acciones rápidas en pantalla completa visibles Ocultar videos relacionados - Videos relacionados en acciones rápidas ocultos + Los vídeos relacionados en acciones rápidas están ocultos Videos relacionados en acciones rápidas visibles Ocultar las directrices para suscriptores Las pautas comunitarias de los suscriptores están ocultas @@ -250,7 +250,7 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Ocultar reacciones temporizadas Las reacciones temporizadas están ocultas Se muestran reacciones temporizadas - Ocultar \"Resumen de video generado por IA\" + Ocultar \"Resumen de vídeo generado por IA\" La sección de resumen de vídeo generada por IA está oculta Sección de resumen de vídeo generada por IA está mostrada Ocultar pregunta @@ -285,7 +285,7 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Oculto en feeds Visible en feeds Ocultar en vídeos relacionados - Escondido en videos relacionados + Oculto en vídeos relacionados Mostrar en vídeos relacionados Ocultar en los resultados de búsqueda Oculto en los resultados de búsqueda @@ -298,29 +298,29 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Ocultar la sección \"Para ti\" La estantería \"Para ti\" está oculta - La estantería \"Para ti\" está visible + La estantería \"Para ti\" es visible Ocultar vista previa de enlaces - Vista previa de enlaces oculta + La vista previa de enlaces está oculta Vista previa de enlaces visible Ocultar estantería de miembros - Estantería de miembros oculta - El estante de miembros se muestra + La estantería de miembros está oculta + La estantería de miembros se muestra Ocultar el botón \"Visitar comunidad\" El botón Visitar comunidad está oculto - El botón \"Visitar comunidad\" está visible + El botón \"Visitar comunidad\" es visible Ocultar el botón \'Visitar tienda\' en las páginas del canal El botón \"Visitar tienda\" está oculto - El botón \"Visitar tienda\" está visible + El botón \"Visitar tienda\" es visible Comentarios Ocultar o mostrar los componentes de sección de comentarios Ocultar resumen de chat de IA El resumen del chat de IA está oculto - El resumen del chat de IA está visible + El resumen del chat de IA es visible Ocultar el resumen de los comentarios de la IA El resumen de comentarios de IA está oculto - El resumen de comentarios de IA está visible + El resumen de comentarios de IA es visible Ocultar directrices del canal Las directrices del canal están ocultas Las directrices del canal se muestran @@ -357,14 +357,14 @@ Si un doodle se está mostrando actualmente en tu región y este ajuste de ocult Ocultar contenido de palabra clave Ocultar videos de búsqueda y feed usando filtros de palabras clave Ocultar videos domésticos por palabras clave - Los videos en la pestaña \'Inicio\' son filtrados por palabras clave - Los videos en la pestaña \'Inicio\' no son filtrados por palabras clave + Los vídeos en la pestaña \'Inicio\' son filtrados por palabras clave + Los vídeos en la pestaña \'Inicio\' no son filtrados por palabras clave Ocultar resultados de búsqueda por palabras clave Los resultados de la búsqueda son filtrados por palabras clave Los resultados de la búsqueda no son filtrados por palabras clave Ocultar vídeos de suscripción por palabras clave - Los videos en la pestaña \'Suscripciones\' son filtrados por palabras clave - Los videos en la pestaña \'Suscripciones\' no son filtrados por palabras clave + Los vídeos en la pestaña \'Suscripciones\' son filtrados por palabras clave + Los vídeos en la pestaña \'Suscripciones\' no son filtrados por palabras clave Palabras clave a ocultar @@ -392,11 +392,11 @@ Limitaciones Ocultar estantería de la tienda del creador - El estante de la tienda del creador debajo del reproductor de vídeo está oculto - Se muestra el estante de la tienda del creador debajo del reproductor de video + La estantería de la tienda del creador debajo del reproductor de vídeo está oculta + La estantería de la tienda del creador debajo del reproductor de vídeo es visible Ocultar banner de la tienda en la pantalla final El banner de la tienda de la pantalla final está oculto - El banner de la tienda de la pantalla final está visible + El banner de la tienda de la pantalla final es visible Ocultar anuncios a pantalla completa "Los anuncios a pantalla completa están ocultos @@ -421,7 +421,7 @@ Esta función solo está disponible para dispositivos antiguos" Se muestran los enlaces de compras en la descripción del video Ocultar el banner \"Ver productos\" El banner \"Ver productos\" en la superposición de vídeo está oculto - El banner \"Ver productos\" en la superposición de vídeo está visible + El banner \"Ver productos\" en la superposición de vídeo es visible Ocultar resultados de búsqueda web Los resultados de búsqueda web están ocultos Se muestran los resultados de la búsqueda web @@ -432,7 +432,7 @@ Esta función solo está disponible para dispositivos antiguos" Se muestran las promociones de YouTube Premium en el reproductor de vídeo - Ocultar anuncios de video + Ocultar anuncios de vídeo Los anuncios de vídeo están ocultos Los anuncios de vídeo se muestran @@ -463,7 +463,7 @@ Esta función solo está disponible para dispositivos antiguos" El doble toque puede ocasionalmente activar un salto al capítulo siguiente/anterior - Descargas externa + Descargas externas Configuración para el uso de un descargador externo Mostrar botón externo de descarga Se muestra el botón de descarga en el reproductor @@ -486,7 +486,7 @@ Verifica que el nombre del paquete sea correcto y que la aplicación esté insta Desactivar gesto de búsqueda preciso El gesto está desactivado - Gesto habilitado + Gesto activado Habilitar tocar para buscar @@ -495,7 +495,7 @@ Verifica que el nombre del paquete sea correcto y que la aplicación esté insta Activar gesto de brillo - "El deslizamiento de brillo a pantalla completa está habilitado + "El deslizamiento de brillo a pantalla completa está activado Ajusta el brillo deslizando verticalmente en el lado izquierdo de la pantalla" El deslizamiento de brillo a pantalla completa está desactivado @@ -584,11 +584,11 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla" Ocultar Hype El botón Hype está oculto - El botón de hype está visible + El botón de hype es visible Ocultar pestaña \'Promocionar\' El botón de Promocionar está oculto - El botón de Promocionar está visible + El botón de Promocionar es visible Ocultar Gracias El botón de gracias está oculto @@ -633,14 +633,14 @@ Ajusta el volumen deslizando verticalmente en el lado derecho de la pantalla"Cambiar botón Crear con el de Notificaciones "El botón Crear se cambia por el botón Notificaciones -Nota: Habilitar esto también ocultará forzosamente los anuncios de video" +Nota: Habilitar esto también ocultará forzosamente los anuncios de vídeo" El botón Crear no se cambia con el botón de notificaciones "Deshabilitar este ajuste también deshabilitará el bloqueo de anuncios de Shorts. Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito." Ocultar etiquetas de navegación Las etiquetas están ocultas - Las etiquetas están visibles + Las etiquetas son visibles Desactivar la barra de estado translúcida La barra de estado es opaca La barra de estado es opaca o translúcida @@ -669,7 +669,7 @@ Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito."El menú de temporizador de sueño se muestra Ocultar video de bucle - El menú de video en bucle está oculto + El menú de vídeo en bucle está oculto El menú de vídeo en bucle se muestra Ocultar Modo ambiente @@ -702,14 +702,14 @@ Si cambiar este ajuste no tiene efecto, intenta cambiar al modo incógnito." "El menú de la pista de audio está oculto. -Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de video\" a iOS TV" +Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de vídeo\" a iOS TV" Ocultar reloj en VR Ver en el menú VR está oculto Ver en el menú VR se muestra Ocultar menú de calidad de vídeo - El menú de calidad de video está oculto - El menú de calidad de video está visible + El menú de calidad de vídeo está oculto + El menú de calidad de vídeo es visible Ocultar pie de página del menú de calidad de vídeo Pie de menú de calidad de vídeo oculto El pie del menú de calidad de vídeo se muestra @@ -745,7 +745,7 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de Ocultar tarjetas de información Las tarjetas de información están ocultas - Las tarjetas de información están visibles + Las tarjetas de información son visibles Desactivar animaciones de número de rodamiento @@ -759,7 +759,7 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de Ocultar barra de búsqueda de miniaturas de vídeo La barra de búsqueda de miniaturas de vídeo está oculta - La barra de búsqueda de miniaturas de vídeo está visible + La barra de búsqueda de miniaturas de vídeo es visible Reproductor de Shorts @@ -780,10 +780,10 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de Mostrado en el historial de visualización Ocultar el botón Comprar Súper Gracias El botón Comprar Super Thanks está oculto - El botón Comprar Super Thanks está visible + El botón Comprar Super Thanks es visible Ocultar botón de efecto El botón de efecto está oculto - El botón de efecto está visible + El botón de efecto es visible Ocultar el botón Pantalla verde El botón verde de pantalla está oculto Se muestra el botón verde de pantalla @@ -829,7 +829,7 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de Se muestra el botón próximo Ocultar el botón Usar este sonido El botón Usar este sonido está oculto - El botón Usar este sonido está visible + El botón Usar este sonido es visible Ocultar botón Usar esta plantilla El botón Usar esta plantilla está oculto El botón Usar esta plantilla se muestra @@ -864,16 +864,16 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de Barra de canales mostrada Ocultar título de vídeo El título del vídeo está oculto - El título del vídeo está visible + El título del vídeo es visible Ocultar etiqueta de metadatos de sonido La etiqueta de metadatos de sonido está oculta - La etiqueta de metadatos de sonido está visible + La etiqueta de metadatos de sonido es visible Ocultar la etiqueta del enlace del video Etiqueta de enlace de vídeo oculto Etiqueta de enlace de vídeo mostrada Ocultar barra de navegación La barra de navegación está oculta - La barra de navegación está visible + La barra de navegación es visible Ocultar el vídeo sugerido de la pantalla final @@ -886,7 +886,7 @@ Configuración → Reproducción → Reproducir el siguiente vídeo automáticam Ocultar la superposición de vídeos relacionados La superposición de vídeos relacionados en pantalla completa está oculta - La superposición de vídeos relacionados en pantalla completa está visible + La superposición de vídeos relacionados en pantalla completa es visible Ocultar fecha y hora de vídeo @@ -894,9 +894,9 @@ Configuración → Reproducción → Reproducir el siguiente vídeo automáticam Marca de tiempo mostrada - Ocultar paneles emergentes del jugador - Los paneles emergentes del jugador están ocultos - Se muestran paneles emergentes del jugador + Ocultar paneles emergentes del reproductor + Los paneles emergentes del reproductor están ocultos + Se muestran paneles emergentes del reproductor Salir del modo de pantalla completa al final del vídeo @@ -908,10 +908,10 @@ Configuración → Reproducción → Reproducir el siguiente vídeo automáticam Abrir vídeos en el retrato de pantalla completa Videos abiertos a pantalla completa - Los videos no se abren en pantalla completa + Los vídeos no se abren en pantalla completa - Opacidad de superposición del jugador + Opacidad de superposición del reproductor Valor de potencia entre 0-100, donde 0 es transparente Opacidad del reproductor debe estar entre 0 y 100 @@ -967,7 +967,7 @@ Limitación: Es posible que los Dislikes no aparezcan en el modo de incógnito"< Habilitar barra de búsqueda ancha Barra de búsqueda ancha habilitada - Barra de búsqueda ancha desactivada + La barra de búsqueda ancha está desactivada Habilitar miniaturas de alta calidad @@ -984,7 +984,7 @@ Esta función funciona mejor con una calidad de vídeo de 720p o inferior y cuan Activar SponsorBlock - SponsorBlock es un sistema de colaboración abierta para omitir partes molestas de los videos de YouTube + SponsorBlock es un sistema de colaboración abierta para omitir partes molestas de los vídeos de YouTube Apariencia Mostrar botón de voto Se muestra el botón de voto del segmento @@ -1038,7 +1038,7 @@ Esta función funciona mejor con una calidad de vídeo de 720p o inferior y cuan Toast no se muestra si SponsorBlock no está disponible Habilitar rastreo del conteo de saltos Permite que la tabla de clasificación de SponsorBlock sepa cuánto tiempo se ha ahorrado. Un mensaje se envía al tablero de clasificación cada vez que se omite un segmento - El rastreo del conteo de saltos no está habilitado + El rastreo del conteo de saltos no está activado Duración mínima del segmento Los segmentos más cortos que este valor (en segundos) no se mostrarán o se omitirán Duración de tiempo no válida @@ -1357,7 +1357,7 @@ Habilitar esto puede solucionar las imágenes que faltan que están bloqueadas e Sigue capturando "DeArrow proporciona miniaturas de vídeos de YouTube obtenidas mediante crowdsourcing. Estas miniaturas suelen ser más relevantes que las que proporciona YouTube -Si está habilitado, las URL de los vídeos se enviarán al servidor de la API y no se envían otros datos. Si un vídeo no tiene miniaturas de DeArrow, se mostrarán las originales o las capturas fijas +Si está activado, las URL de los vídeos se enviarán al servidor de la API y no se envían otros datos. Si un vídeo no tiene miniaturas de DeArrow, se mostrarán las originales o las capturas fijas Toca aquí para obtener más información sobre DeArrow" Mostrar un brindis si la API no está disponible @@ -1449,7 +1449,7 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Usar el idioma de audio original Utilizando audio predeterminado - Para usar esta función, cambia \"Suplantar transmisiones de video\" a iOS TV + Para usar esta función, cambia \"Suplantar transmisiones de vídeo\" a iOS TV @@ -1457,9 +1457,9 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Recordar cambios de calidad de vídeo Los cambios de calidad se aplican a todos los vídeos Los cambios de calidad sólo se aplican al vídeo actual - Mostrar notificación al cambiar la calidad de video - Se muestra una notificación cuando se cambia la calidad de video predeterminada - No se muestra una notificación cuando se cambia la calidad de video predeterminada + Mostrar notificación al cambiar la calidad de vídeo + Se muestra una notificación cuando se cambia la calidad de vídeo predeterminada + No se muestra una notificación cuando se cambia la calidad de vídeo predeterminada Calidad de vídeo predeterminada en la red Wi-Fi Calidad de vídeo predeterminada en la red móvil Recordar cambios en la calidad de Shorts @@ -1478,14 +1478,14 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" El botón no se muestra - Mostrar botón de calidad de video + Mostrar botón de calidad de vídeo Botón visible. Toca y mantén para restablecer la calidad a los valores predeterminados Botón no visible Menú de velocidad de reproducción personalizada - Menú de velocidad personalizado se muestra - Menú de velocidad personalizado no se muestra + El menú de velocidad personalizada se muestra + El menú de velocidad personalizada no se muestra Restaurar el menú de velocidad de reproducción antiguo Se muestra el menú de velocidad antiguo Se muestra el menú de velocidad moderno @@ -1520,7 +1520,7 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Habilitar diapositiva para buscar Deslizar para buscar está activado - Slide to seek no está habilitado + Slide to seek no está activado Falsificación del stream de vídeo @@ -1533,21 +1533,21 @@ Es posible que la reproducción de vídeo no funcione" Desactivar esta configuración puede causar problemas de reproducción de vídeo. Cliente por defecto Forzar iOS AVC (H.264) - El códec de video se fuerza a AVC (H.264) - El códec de video se determina automáticamente + El códec de vídeo se fuerza a AVC (H.264) + El códec de vídeo se determina automáticamente "Habilitar esto puede mejorar la duración de la batería y solucionar el tartamudeo de la reproducción. -AVC tiene una resolución máxima de 1080p, el códec de audio Opus no está disponible y la reproducción de video utilizará más datos de Internet que VP9 o AV1." +AVC tiene una resolución máxima de 1080p, el códec de audio Opus no está disponible y la reproducción de vídeo utilizará más datos de Internet que VP9 o AV1." Efectos secundarios de la suplantación de iOS - "• Es posible que las películas o los videos pagos no se reproduzcan + "• Es posible que las películas o los vídeos pagos no se reproduzcan • El volumen estable no está disponible -• Los videos terminan 1 segundo antes" +• Los vídeos terminan 1 segundo antes" Efectos secundarios de la suplantación de Android "• Falta el menú de la pista de audio • El volumen estable no está disponible • Forzar el audio original no está disponible" • No AV1 códec de vídeo - • Es posible que los videos infantiles no se reproduzcan cuando se cierra la sesión o se está en modo incógnito + • Es posible que los vídeos infantiles no se reproduzcan cuando se cierra la sesión o se está en modo incógnito Mostrar en Estadísticas para nerds El tipo de cliente se muestra en Estadísticas para nerds El cliente está oculto en Estadísticas para nerds @@ -1588,7 +1588,7 @@ AVC tiene una resolución máxima de 1080p, el códec de audio Opus no está dis Activar modo de depuración de Twitch - El modo de depuración de Twitch está habilitado (no recomendado) + El modo de depuración de Twitch está activado (no recomendado) El modo de depuración de Twitch está desactivado diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index aaca0530d..04b5bef2d 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -1078,7 +1078,7 @@ Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan." Trailer yang dinarasikan untuk video mendatang, sapaan, dan perpisahan. Tidak termasuk bagian yang menambahkan konten tambahan Pratinjau / Rekap Kumpulan klip yang menunjukkan apa yang akan datang atau apa yang terjadi di video atau di video lain dari sebuah seri, di mana semua informasi diulang di tempat lain - Penyimpangan / Lelucon + Singgungan / Lelucon Adegan atau lelucon sampingan yang tidak diperlukan untuk memahami konten utama video. Tidak termasuk bagian yang memberikan konteks atau detail latar belakang Musik: Bagian Non-Musik Hanya untuk digunakan pada video musik. Bagian video musik tanpa musiknya, yang belum tercakup dalam kategori lain @@ -1092,11 +1092,11 @@ Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan." Lewati jeda Lewati jeda Lewati outro - Lewati hook + Lewati pengantar Lewati pratinjau Lewati pratinjau Lewati rekap - Lewati penyimpangan + Lewati singgungan Lewati non-musik Lewati segmen Sponsor dilewati @@ -1107,11 +1107,11 @@ Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan." Jeda dilewati Jeda dilewati Outro dilewati - Hook dilewati + Sapaan dilewati Pratinjau dilewati Pratinjau dilewati Rekap dilewati - Penyimpangan dilewati + Singgungan dilewati Melewati bagian non-musik Melewati segmen yang belum dikirim Beberapa segmen dilewati diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index b5010bfa2..716b9a0cf 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -1077,7 +1077,7 @@ Second \"item\" text" Интервал без фактического содержания. Может быть паузой, статическим кадром или повторяющейся анимацией. Не включает переходы, содержащие информацию Конечные заставки / Титры Титры или время появления конечных заставок YouTube. Не для выводов с информацией - Вступление / Приветствия + Вступление / Приветствие Трейлеры с закадровым голосом для предстоящего видео, приветствия и прощания. Не включает разделы, добавляющие дополнительный контент Предпросмотр / Пересказ Фрагменты, повторяющие текущее видео или предыдущие серии @@ -1095,11 +1095,11 @@ Second \"item\" text" Пропустить паузу Пропустить паузу Пропустить концовку - Пропустить завязку + Пропустить вступление Пропустить предпросмотр Пропустить предпросмотр Пропустить пересказ - Пропустить отступление + Пропустить отвлеченные темы Пропустить сегмент без музыки Пропустить сегмент Спонсорская реклама пропущена @@ -1110,11 +1110,11 @@ Second \"item\" text" Пауза пропущена Пауза пропущена Концовка пропущена - Завязка пропущена + Вступление пропущено Предпросмотр пропущен Предпросмотр пропущен Пересказ пропущен - Отступление пропущено + Отвлеченные темы пропущены Сегмент без музыки пропущен Неподтвержденный сегмент пропущен Несколько сегментов пропущены diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index 79c5c8d26..4d116be1a 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -1078,11 +1078,11 @@ Kullanıcı kimliğiniz bir parola gibidir ve asla paylaşılmamalıdır. Bitiş Ekranı / Jenerik Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil Giriş / Selamlama - Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen bölümler dahil değildir + Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen kısımları içermez Ön İzleme / Özet Videoda veya bir dizinin diğer videolarında neler olduğunu ve nelerin geleceğini gösteren, tüm bilgilerin başka bir yerde tekrarlandığı klip koleksiyonu Konuyla Alakasız / Şakalar - Videonun ana içeriğini anlamak için gerekli olmayan alakasız sahneler veya şakalar. Bağlam veya arka plan detayları sağlayan bölümleri içermez + Videonun ana içeriğini anlamak için gerekli olmayan alakasız sahneler veya şakalar. Bağlam veya arka plan detayları sağlayan kısımları içermez Müzik: Müzik Olmayan Kısım Yalnızca müzik videolarında kullanım içindir. Müzik videolarının başka bir kategorinin kapsamadığı müziksiz bölümleri Atla diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index 8affb50f3..960a437de 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -1075,10 +1075,12 @@ Second \"item\" text" 指影片中沒有實際內容的片段。可能為暫停、靜態畫面或重複動畫。不包含含有資訊的轉場。 片尾資訊卡/鳴謝 鳴謝或 YouTube 片尾資訊卡出現時。不適用於含有資訊的結論。 - 預告/回顧/前情提要 + 開場白 / 問候 + 即將推出的影片的旁白預告片、問候語和告別語。不包含增加額外內容的部分 + 預覽 / 回顧 展示影片或系列影片中即將到來或已發生的內容片段合輯,且所有資訊在其他地方重複出現。 - 填充閒聊/笑話 - 指為了填充時間或增添幽默感而加入的旁支情節,並非理解影片主要內容所必需。不包含提供背景資訊或脈絡的片段。 + 離題 / 笑話 + 離題的場景或笑話,這些內容並非理解影片主要內容所必需的。不包括提供背景或詳細資訊的部分 音樂:非音樂片段 僅適用於音樂影片。音樂影片中沒有音樂,且不屬於其他類別的段落。 跳過 @@ -1091,10 +1093,11 @@ Second \"item\" text" 跳過中場休息 跳過中場休息 跳過片尾 + 跳過掛鉤 跳過預覽 跳過預覽 跳過回顧 - 跳過閒聊 + 跳過離題 跳過非音樂 跳過片段 已跳過贊助商廣告 @@ -1105,10 +1108,11 @@ Second \"item\" text" 已跳過中場休息 已跳過中場休息 已跳過結尾 + 已跳過掛鉤 已跳過預覽 已跳過預覽 已跳過回顧 - 已跳過閒聊 + 已跳過不相關內容 已跳過非音樂部分 跳過了未提交的片段 已跳過多個片段 diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 454ed0c1e..197680376 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -131,7 +131,7 @@ ANDROID_UNPLUGGED - ANDROID_VR_NO_AUTH + ANDROID_VR_1_61_48 IOS_UNPLUGGED