mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-26 20:21:04 +00:00
Compare commits
13 Commits
v5.36.0
...
v5.37.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a582eced8 | ||
|
|
2db0948bea | ||
|
|
a3ba92e742 | ||
|
|
2a85a3b290 | ||
|
|
eee72208dd | ||
|
|
dcd42454bd | ||
|
|
782353c18a | ||
|
|
b53b870e8f | ||
|
|
09b941abf0 | ||
|
|
678ef4052e | ||
|
|
0abfab79d7 | ||
|
|
61cadf72cd | ||
|
|
e12359b94f |
35
CHANGELOG.md
35
CHANGELOG.md
@@ -1,3 +1,38 @@
|
|||||||
|
# [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)
|
# [5.36.0](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0) (2025-09-14)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
dependencies {
|
||||||
|
compileOnly(project(":extensions:shared:library"))
|
||||||
|
compileOnly(project(":extensions:youtube:stub"))
|
||||||
|
compileOnly(libs.annotation)
|
||||||
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk = 26
|
minSdk = 26
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,
|
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());
|
"revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new SpoofiOSAvailability());
|
||||||
// Client type must be last spoof setting due to cyclic references.
|
// Client type must be last spoof setting due to cyclic references.
|
||||||
public static final EnumSetting<ClientType> 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<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import app.revanced.extension.shared.settings.BaseSettings;
|
|||||||
|
|
||||||
public enum ClientType {
|
public enum ClientType {
|
||||||
// https://dumps.tadiphone.dev/dumps/oculus/eureka
|
// https://dumps.tadiphone.dev/dumps/oculus/eureka
|
||||||
ANDROID_VR_NO_AUTH(
|
ANDROID_VR_1_61_48(
|
||||||
28,
|
28,
|
||||||
"ANDROID_VR",
|
"ANDROID_VR",
|
||||||
"com.google.android.apps.youtube.vr.oculus",
|
"com.google.android.apps.youtube.vr.oculus",
|
||||||
@@ -27,7 +27,7 @@ public enum ClientType {
|
|||||||
"1.61.48",
|
"1.61.48",
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
"Android VR No auth"
|
"Android VR 1.61"
|
||||||
),
|
),
|
||||||
// Chromecast with Google TV 4K.
|
// Chromecast with Google TV 4K.
|
||||||
// https://dumps.tadiphone.dev/dumps/google/kirkwood
|
// https://dumps.tadiphone.dev/dumps/google/kirkwood
|
||||||
@@ -96,6 +96,26 @@ public enum ClientType {
|
|||||||
forceAVC()
|
forceAVC()
|
||||||
? "iOS TV Force AVC"
|
? "iOS TV Force AVC"
|
||||||
: "iOS TV"
|
: "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() {
|
private static boolean forceAVC() {
|
||||||
|
|||||||
@@ -252,8 +252,9 @@ public class SpoofVideoStreamsPatch {
|
|||||||
public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability {
|
public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability {
|
||||||
@Override
|
@Override
|
||||||
public boolean isAvailable() {
|
public boolean isAvailable() {
|
||||||
|
ClientType clientType = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
||||||
return BaseSettings.SPOOF_VIDEO_STREAMS.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ final class PlayerRoutes {
|
|||||||
// but if this is a fall over client it will set the language even though
|
// but if this is a fall over client it will set the language even though
|
||||||
// the audio language is not selectable in the UI.
|
// the audio language is not selectable in the UI.
|
||||||
ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
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()
|
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get().getLocale()
|
||||||
: Locale.getDefault();
|
: Locale.getDefault();
|
||||||
|
|
||||||
|
|||||||
@@ -35,21 +35,22 @@ import app.revanced.extension.shared.spoof.ClientType;
|
|||||||
*/
|
*/
|
||||||
public class StreamingDataRequest {
|
public class StreamingDataRequest {
|
||||||
|
|
||||||
private static final ClientType[] CLIENT_ORDER_TO_USE;
|
private static volatile ClientType[] clientOrderToUse = ClientType.values();
|
||||||
|
|
||||||
static {
|
public static void setClientOrderToUse(ClientType[] availableClients, ClientType preferredClient) {
|
||||||
ClientType[] allClientTypes = ClientType.values();
|
Objects.requireNonNull(availableClients);
|
||||||
ClientType preferredClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
|
|
||||||
|
|
||||||
CLIENT_ORDER_TO_USE = new ClientType[allClientTypes.length];
|
clientOrderToUse = new ClientType[availableClients.length];
|
||||||
CLIENT_ORDER_TO_USE[0] = preferredClient;
|
clientOrderToUse[0] = preferredClient;
|
||||||
|
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (ClientType c : allClientTypes) {
|
for (ClientType c : availableClients) {
|
||||||
if (c != preferredClient) {
|
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";
|
private static final String AUTHORIZATION_HEADER = "Authorization";
|
||||||
@@ -193,9 +194,9 @@ public class StreamingDataRequest {
|
|||||||
|
|
||||||
// Retry with different client if empty response body is received.
|
// Retry with different client if empty response body is received.
|
||||||
int i = 0;
|
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.
|
// 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);
|
HttpURLConnection connection = send(clientType, videoId, playerHeaders, showErrorToast);
|
||||||
if (connection != null) {
|
if (connection != null) {
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -86,7 +86,8 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
|
|||||||
String summary = str(key + "_summary");
|
String summary = str(key + "_summary");
|
||||||
|
|
||||||
// Android VR supports AV1 but all other clients do not.
|
// 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");
|
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
android.useAndroidX = true
|
android.useAndroidX = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 5.36.0
|
version = 5.37.0-dev.5
|
||||||
|
|||||||
@@ -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 getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
|
||||||
public static final fun is_7_33_or_greater ()Z
|
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_11_or_greater ()Z
|
||||||
|
public static final fun is_8_15_or_greater ()Z
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatchKt {
|
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 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 final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt {
|
||||||
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,20 @@
|
|||||||
package app.revanced.patches.music.misc.spoof
|
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_7_33_or_greater
|
||||||
import app.revanced.patches.music.playservice.is_8_11_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.music.playservice.versionCheckPatch
|
||||||
import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch
|
import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch
|
||||||
|
|
||||||
|
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;"
|
||||||
|
|
||||||
val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
|
val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
|
||||||
|
fixMediaFetchHotConfigChanges = { true },
|
||||||
|
fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater },
|
||||||
|
fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater },
|
||||||
block = {
|
block = {
|
||||||
compatibleWith(
|
compatibleWith(
|
||||||
"com.google.android.apps.youtube.music"(
|
"com.google.android.apps.youtube.music"(
|
||||||
@@ -13,9 +22,12 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
dependsOn(versionCheckPatch, userAgentClientSpoofPatch)
|
dependsOn(sharedExtensionPatch, versionCheckPatch, userAgentClientSpoofPatch)
|
||||||
},
|
},
|
||||||
fixMediaFetchHotConfigChanges = { true },
|
executeBlock = {
|
||||||
fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater },
|
musicActivityOnCreateFingerprint.method.addInstruction(
|
||||||
fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }
|
1, // Must use 1 index so context is set by extension patch.
|
||||||
|
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V"
|
||||||
|
)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
@@ -9,6 +9,8 @@ var is_7_33_or_greater = false
|
|||||||
private set
|
private set
|
||||||
var is_8_11_or_greater = false
|
var is_8_11_or_greater = false
|
||||||
private set
|
private set
|
||||||
|
var is_8_15_or_greater = false
|
||||||
|
private set
|
||||||
|
|
||||||
val versionCheckPatch = resourcePatch(
|
val versionCheckPatch = resourcePatch(
|
||||||
description = "Uses the Play Store service version to find the major/minor version of the YouTube Music target app.",
|
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.
|
// 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_7_33_or_greater = 245199000 <= playStoreServicesVersion
|
||||||
is_8_11_or_greater = 251199000 <= playStoreServicesVersion
|
is_8_11_or_greater = 251199000 <= playStoreServicesVersion
|
||||||
|
is_8_15_or_greater = 251530000 <= playStoreServicesVersion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package app.revanced.patches.shared.misc.spoof
|
package app.revanced.patches.shared.misc.spoof
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint
|
import app.revanced.patcher.fingerprint
|
||||||
|
import app.revanced.util.getReference
|
||||||
|
import app.revanced.util.indexOfFirstInstruction
|
||||||
import app.revanced.util.literal
|
import app.revanced.util.literal
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
internal val buildInitPlaybackRequestFingerprint = fingerprint {
|
internal val buildInitPlaybackRequestFingerprint = fingerprint {
|
||||||
returns("Lorg/chromium/net/UrlRequest\$Builder;")
|
returns("Lorg/chromium/net/UrlRequest\$Builder;")
|
||||||
@@ -35,8 +38,15 @@ internal val buildPlayerRequestURIFingerprint = fingerprint {
|
|||||||
|
|
||||||
internal val buildRequestFingerprint = fingerprint {
|
internal val buildRequestFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
|
||||||
returns("Lorg/chromium/net/UrlRequest;")
|
returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder;
|
||||||
custom { methodDef, _ ->
|
custom { methodDef, _ ->
|
||||||
|
if (methodDef.indexOfFirstInstruction {
|
||||||
|
val reference = getReference<MethodReference>()
|
||||||
|
reference?.name == "newUrlRequestBuilder"
|
||||||
|
} < 0) {
|
||||||
|
return@custom false
|
||||||
|
}
|
||||||
|
|
||||||
// Different targets have slightly different parameters
|
// Different targets have slightly different parameters
|
||||||
|
|
||||||
// Earlier targets have parameters:
|
// Earlier targets have parameters:
|
||||||
@@ -58,12 +68,22 @@ internal val buildRequestFingerprint = fingerprint {
|
|||||||
// Lorg/chromium/net/UrlRequest\$Callback;
|
// Lorg/chromium/net/UrlRequest\$Callback;
|
||||||
// L
|
// 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
|
val parameterTypes = methodDef.parameterTypes
|
||||||
(parameterTypes.size == 7 || parameterTypes.size == 8) &&
|
val parameterTypesSize = parameterTypes.size
|
||||||
parameterTypes[1] == "Ljava/util/Map;" // URL headers.
|
(parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) &&
|
||||||
|
parameterTypes[1] == "Ljava/util/Map;" // URL headers.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal val protobufClassParseByteBufferFingerprint = fingerprint {
|
internal val protobufClassParseByteBufferFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC)
|
accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC)
|
||||||
returns("L")
|
returns("L")
|
||||||
@@ -148,7 +168,8 @@ internal val mediaFetchHotConfigFingerprint = fingerprint {
|
|||||||
literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG }
|
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 const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L
|
||||||
|
|
||||||
internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint {
|
internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import app.revanced.patcher.patch.BytecodePatchContext
|
|||||||
import app.revanced.patcher.patch.bytecodePatch
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||||
import app.revanced.patches.all.misc.resources.addResourcesPatch
|
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.findFreeRegister
|
||||||
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
import app.revanced.util.findInstructionIndicesReversedOrThrow
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
|
|||||||
@@ -187,11 +187,16 @@ val customThemePatch = resourcePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Login screen gradient.
|
// Login screen gradient.
|
||||||
document("res/drawable/start_screen_gradient.xml").use { document ->
|
try {
|
||||||
val gradientNode = document.getElementsByTagName("gradient").item(0) as Element
|
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:startColor", "@color/gray_7")
|
||||||
gradientNode.setAttribute("android:endColor", "@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.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ import app.revanced.util.returnEarly
|
|||||||
|
|
||||||
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;"
|
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;"
|
||||||
|
|
||||||
|
@Deprecated("Patch no longer functions")
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
val spoofClientPatch = bytecodePatch(
|
val spoofClientPatch = bytecodePatch(
|
||||||
name = "Spoof client",
|
|
||||||
description = "Spoofs the client to fix various functions of the app.",
|
description = "Spoofs the client to fix various functions of the app.",
|
||||||
) {
|
) {
|
||||||
val requestListenerPort by intOption(
|
val requestListenerPort by intOption(
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.revanced.patches.youtube.misc.spoof
|
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.all.misc.resources.addResources
|
||||||
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
||||||
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
|
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.playservice.versionCheckPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
|
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
|
||||||
|
|
||||||
val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
|
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;"
|
||||||
compatibleWith(
|
|
||||||
"com.google.android.youtube"(
|
val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
|
||||||
"19.34.42",
|
block = {
|
||||||
"19.43.41",
|
compatibleWith(
|
||||||
"19.47.53",
|
"com.google.android.youtube"(
|
||||||
"20.07.39",
|
"19.34.42",
|
||||||
"20.12.46",
|
"19.43.41",
|
||||||
"20.13.41",
|
"19.47.53",
|
||||||
|
"20.07.39",
|
||||||
|
"20.12.46",
|
||||||
|
"20.13.41",
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
dependsOn(
|
dependsOn(
|
||||||
userAgentClientSpoofPatch,
|
userAgentClientSpoofPatch,
|
||||||
settingsPatch,
|
settingsPatch,
|
||||||
versionCheckPatch
|
versionCheckPatch
|
||||||
)
|
)
|
||||||
}, {
|
},
|
||||||
is_19_34_or_greater
|
fixMediaFetchHotConfigChanges = {
|
||||||
}, {
|
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
|
fixMediaFetchHotConfigAlternativeChanges = {
|
||||||
}, {
|
// In 20.14 the flag was merged with 20.03 start playback flag.
|
||||||
is_20_03_or_greater
|
is_20_10_or_greater && !is_20_14_or_greater
|
||||||
}, {
|
},
|
||||||
addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch")
|
fixParsePlaybackResponseFeatureFlag = {
|
||||||
|
is_20_03_or_greater
|
||||||
|
},
|
||||||
|
executeBlock = {
|
||||||
|
addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch")
|
||||||
|
|
||||||
PreferenceScreen.MISC.addPreferences(
|
PreferenceScreen.MISC.addPreferences(
|
||||||
PreferenceScreenPreference(
|
PreferenceScreenPreference(
|
||||||
key = "revanced_spoof_video_streams_screen",
|
key = "revanced_spoof_video_streams_screen",
|
||||||
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
|
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
|
||||||
preferences = setOf(
|
preferences = setOf(
|
||||||
SwitchPreference("revanced_spoof_video_streams"),
|
SwitchPreference("revanced_spoof_video_streams"),
|
||||||
ListPreference("revanced_spoof_video_streams_client_type"),
|
ListPreference("revanced_spoof_video_streams_client_type"),
|
||||||
NonInteractivePreference(
|
NonInteractivePreference(
|
||||||
// Requires a key and title but the actual text is chosen at runtime.
|
// Requires a key and title but the actual text is chosen at runtime.
|
||||||
key = "revanced_spoof_video_streams_about_android",
|
key = "revanced_spoof_video_streams_about_android",
|
||||||
tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference"
|
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"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|||||||
@@ -1074,9 +1074,12 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
|
|||||||
<string name="revanced_sb_segments_intro_sum">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</string>
|
<string name="revanced_sb_segments_intro_sum">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</string>
|
||||||
<string name="revanced_sb_segments_outro">Son kartlar / Zaminlər</string>
|
<string name="revanced_sb_segments_outro">Son kartlar / Zaminlər</string>
|
||||||
<string name="revanced_sb_segments_outro_sum">Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil</string>
|
<string name="revanced_sb_segments_outro_sum">Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil</string>
|
||||||
<string name="revanced_sb_segments_preview">Önizləmə/Anons/Qısa</string>
|
<string name="revanced_sb_segments_hook">Giriş / Salamlar</string>
|
||||||
<string name="revanced_sb_segments_preview_sum">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</string><string name="revanced_sb_segments_filler">Əlaqəsiz/Zarafatlar</string>
|
<string name="revanced_sb_segments_hook_sum">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</string>
|
||||||
<string name="revanced_sb_segments_filler_sum">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</string>
|
<string name="revanced_sb_segments_preview">Önizləmə / Anons</string>
|
||||||
|
<string name="revanced_sb_segments_preview_sum">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</string>
|
||||||
|
<string name="revanced_sb_segments_filler">Əlaqəsiz / Zarafatlar</string>
|
||||||
|
<string name="revanced_sb_segments_filler_sum">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</string>
|
||||||
<string name="revanced_sb_segments_nomusic">Musiqi: Musiqi olmayan bölmə</string>
|
<string name="revanced_sb_segments_nomusic">Musiqi: Musiqi olmayan bölmə</string>
|
||||||
<string name="revanced_sb_segments_nomusic_sum">Yalnız musiqi videolarında istifadə üçün. Artıq başqa kateqoriyaya aid edilməyən musiqisiz musiqi videoları bölmələri</string>
|
<string name="revanced_sb_segments_nomusic_sum">Yalnız musiqi videolarında istifadə üçün. Artıq başqa kateqoriyaya aid edilməyən musiqisiz musiqi videoları bölmələri</string>
|
||||||
<string name="revanced_sb_skip_button_compact">Ötür</string>
|
<string name="revanced_sb_skip_button_compact">Ötür</string>
|
||||||
@@ -1089,10 +1092,11 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
|
|||||||
<string name="revanced_sb_skip_button_intro_middle">Fasiləni ötür</string>
|
<string name="revanced_sb_skip_button_intro_middle">Fasiləni ötür</string>
|
||||||
<string name="revanced_sb_skip_button_intro_end">Fasiləni ötür</string>
|
<string name="revanced_sb_skip_button_intro_end">Fasiləni ötür</string>
|
||||||
<string name="revanced_sb_skip_button_outro">Bitişi ötür</string>
|
<string name="revanced_sb_skip_button_outro">Bitişi ötür</string>
|
||||||
|
<string name="revanced_sb_skip_button_hook">Girişi ötür</string>
|
||||||
<string name="revanced_sb_skip_button_preview_beginning">Önizləməni ötür</string>
|
<string name="revanced_sb_skip_button_preview_beginning">Önizləməni ötür</string>
|
||||||
<string name="revanced_sb_skip_button_preview_middle">Önizləməni ötür</string>
|
<string name="revanced_sb_skip_button_preview_middle">Önizləməni ötür</string>
|
||||||
<string name="revanced_sb_skip_button_preview_end">Anonsu ötür</string>
|
<string name="revanced_sb_skip_button_preview_end">Anonsu ötür</string>
|
||||||
<string name="revanced_sb_skip_button_filler">Əlaqəsiz hissəni ötür</string>
|
<string name="revanced_sb_skip_button_filler">Əlaqəsiz olanı ötür</string>
|
||||||
<string name="revanced_sb_skip_button_nomusic">Musiqisiz hissəni ötür</string>
|
<string name="revanced_sb_skip_button_nomusic">Musiqisiz hissəni ötür</string>
|
||||||
<string name="revanced_sb_skip_button_unsubmitted">Bölümü ötür</string>
|
<string name="revanced_sb_skip_button_unsubmitted">Bölümü ötür</string>
|
||||||
<string name="revanced_sb_skipped_sponsor">Sponsorlu hissə ötürüldü</string>
|
<string name="revanced_sb_skipped_sponsor">Sponsorlu hissə ötürüldü</string>
|
||||||
@@ -1103,10 +1107,11 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
|
|||||||
<string name="revanced_sb_skipped_intro_middle">Fasilə ötürüldü</string>
|
<string name="revanced_sb_skipped_intro_middle">Fasilə ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_intro_end">Fasilə ötürüldü</string>
|
<string name="revanced_sb_skipped_intro_end">Fasilə ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_outro">Bitiş ötürüldü</string>
|
<string name="revanced_sb_skipped_outro">Bitiş ötürüldü</string>
|
||||||
|
<string name="revanced_sb_skipped_hook">Giriş ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_preview_beginning">Önbaxış ötürüldü</string>
|
<string name="revanced_sb_skipped_preview_beginning">Önbaxış ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_preview_middle">Önbaxış ötürüldü</string>
|
<string name="revanced_sb_skipped_preview_middle">Önbaxış ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_preview_end">Anons ötürüldü</string>
|
<string name="revanced_sb_skipped_preview_end">Anons ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_filler">Əlaqəsiz hissə ötürüldü</string>
|
<string name="revanced_sb_skipped_filler">Əlaqəsiz ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_nomusic">Musiqi olmayan bölmə ötürüldü</string>
|
<string name="revanced_sb_skipped_nomusic">Musiqi olmayan bölmə ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_unsubmitted">Göndərilməmiş bölüm ötürüldü</string>
|
<string name="revanced_sb_skipped_unsubmitted">Göndərilməmiş bölüm ötürüldü</string>
|
||||||
<string name="revanced_sb_skipped_multiple_segments">Çoxlu bölümlər ötürüldü</string>
|
<string name="revanced_sb_skipped_multiple_segments">Çoxlu bölümlər ötürüldü</string>
|
||||||
|
|||||||
@@ -1078,11 +1078,11 @@ Kullanıcı kimliğiniz bir parola gibidir ve asla paylaşılmamalıdır.
|
|||||||
<string name="revanced_sb_segments_outro">Bitiş Ekranı / Jenerik</string>
|
<string name="revanced_sb_segments_outro">Bitiş Ekranı / Jenerik</string>
|
||||||
<string name="revanced_sb_segments_outro_sum">Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil</string>
|
<string name="revanced_sb_segments_outro_sum">Jenerik veya YouTube bitiş kartlarının göründüğü zaman. Bilgi içeren çıkarımlar için değil</string>
|
||||||
<string name="revanced_sb_segments_hook">Giriş / Selamlama</string>
|
<string name="revanced_sb_segments_hook">Giriş / Selamlama</string>
|
||||||
<string name="revanced_sb_segments_hook_sum">Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen bölümler dahil değildir</string>
|
<string name="revanced_sb_segments_hook_sum">Gelecek video için anlatımlı fragmanlar, selamlamalar ve vedalar. Ek içerik ekleyen kısımları içermez</string>
|
||||||
<string name="revanced_sb_segments_preview">Ön İzleme / Özet</string>
|
<string name="revanced_sb_segments_preview">Ön İzleme / Özet</string>
|
||||||
<string name="revanced_sb_segments_preview_sum">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</string>
|
<string name="revanced_sb_segments_preview_sum">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</string>
|
||||||
<string name="revanced_sb_segments_filler">Konuyla Alakasız / Şakalar</string>
|
<string name="revanced_sb_segments_filler">Konuyla Alakasız / Şakalar</string>
|
||||||
<string name="revanced_sb_segments_filler_sum">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</string>
|
<string name="revanced_sb_segments_filler_sum">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</string>
|
||||||
<string name="revanced_sb_segments_nomusic">Müzik: Müzik Olmayan Kısım</string>
|
<string name="revanced_sb_segments_nomusic">Müzik: Müzik Olmayan Kısım</string>
|
||||||
<string name="revanced_sb_segments_nomusic_sum">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</string>
|
<string name="revanced_sb_segments_nomusic_sum">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</string>
|
||||||
<string name="revanced_sb_skip_button_compact">Atla</string>
|
<string name="revanced_sb_skip_button_compact">Atla</string>
|
||||||
|
|||||||
@@ -1075,10 +1075,12 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_sb_segments_intro_sum">指影片中沒有實際內容的片段。可能為暫停、靜態畫面或重複動畫。不包含含有資訊的轉場。</string>
|
<string name="revanced_sb_segments_intro_sum">指影片中沒有實際內容的片段。可能為暫停、靜態畫面或重複動畫。不包含含有資訊的轉場。</string>
|
||||||
<string name="revanced_sb_segments_outro">片尾資訊卡/鳴謝</string>
|
<string name="revanced_sb_segments_outro">片尾資訊卡/鳴謝</string>
|
||||||
<string name="revanced_sb_segments_outro_sum">鳴謝或 YouTube 片尾資訊卡出現時。不適用於含有資訊的結論。</string>
|
<string name="revanced_sb_segments_outro_sum">鳴謝或 YouTube 片尾資訊卡出現時。不適用於含有資訊的結論。</string>
|
||||||
<string name="revanced_sb_segments_preview">預告/回顧/前情提要</string>
|
<string name="revanced_sb_segments_hook">開場白 / 問候</string>
|
||||||
|
<string name="revanced_sb_segments_hook_sum">即將推出的影片的旁白預告片、問候語和告別語。不包含增加額外內容的部分</string>
|
||||||
|
<string name="revanced_sb_segments_preview">預覽 / 回顧</string>
|
||||||
<string name="revanced_sb_segments_preview_sum">展示影片或系列影片中即將到來或已發生的內容片段合輯,且所有資訊在其他地方重複出現。</string>
|
<string name="revanced_sb_segments_preview_sum">展示影片或系列影片中即將到來或已發生的內容片段合輯,且所有資訊在其他地方重複出現。</string>
|
||||||
<string name="revanced_sb_segments_filler">填充閒聊/笑話</string>
|
<string name="revanced_sb_segments_filler">離題 / 笑話</string>
|
||||||
<string name="revanced_sb_segments_filler_sum">指為了填充時間或增添幽默感而加入的旁支情節,並非理解影片主要內容所必需。不包含提供背景資訊或脈絡的片段。</string>
|
<string name="revanced_sb_segments_filler_sum">離題的場景或笑話,這些內容並非理解影片主要內容所必需的。不包括提供背景或詳細資訊的部分</string>
|
||||||
<string name="revanced_sb_segments_nomusic">音樂:非音樂片段</string>
|
<string name="revanced_sb_segments_nomusic">音樂:非音樂片段</string>
|
||||||
<string name="revanced_sb_segments_nomusic_sum">僅適用於音樂影片。音樂影片中沒有音樂,且不屬於其他類別的段落。</string>
|
<string name="revanced_sb_segments_nomusic_sum">僅適用於音樂影片。音樂影片中沒有音樂,且不屬於其他類別的段落。</string>
|
||||||
<string name="revanced_sb_skip_button_compact">跳過</string>
|
<string name="revanced_sb_skip_button_compact">跳過</string>
|
||||||
@@ -1091,10 +1093,11 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_sb_skip_button_intro_middle">跳過中場休息</string>
|
<string name="revanced_sb_skip_button_intro_middle">跳過中場休息</string>
|
||||||
<string name="revanced_sb_skip_button_intro_end">跳過中場休息</string>
|
<string name="revanced_sb_skip_button_intro_end">跳過中場休息</string>
|
||||||
<string name="revanced_sb_skip_button_outro">跳過片尾</string>
|
<string name="revanced_sb_skip_button_outro">跳過片尾</string>
|
||||||
|
<string name="revanced_sb_skip_button_hook">跳過掛鉤</string>
|
||||||
<string name="revanced_sb_skip_button_preview_beginning">跳過預覽</string>
|
<string name="revanced_sb_skip_button_preview_beginning">跳過預覽</string>
|
||||||
<string name="revanced_sb_skip_button_preview_middle">跳過預覽</string>
|
<string name="revanced_sb_skip_button_preview_middle">跳過預覽</string>
|
||||||
<string name="revanced_sb_skip_button_preview_end">跳過回顧</string>
|
<string name="revanced_sb_skip_button_preview_end">跳過回顧</string>
|
||||||
<string name="revanced_sb_skip_button_filler">跳過閒聊</string>
|
<string name="revanced_sb_skip_button_filler">跳過離題</string>
|
||||||
<string name="revanced_sb_skip_button_nomusic">跳過非音樂</string>
|
<string name="revanced_sb_skip_button_nomusic">跳過非音樂</string>
|
||||||
<string name="revanced_sb_skip_button_unsubmitted">跳過片段</string>
|
<string name="revanced_sb_skip_button_unsubmitted">跳過片段</string>
|
||||||
<string name="revanced_sb_skipped_sponsor">已跳過贊助商廣告</string>
|
<string name="revanced_sb_skipped_sponsor">已跳過贊助商廣告</string>
|
||||||
@@ -1105,10 +1108,11 @@ Second \"item\" text"</string>
|
|||||||
<string name="revanced_sb_skipped_intro_middle">已跳過中場休息</string>
|
<string name="revanced_sb_skipped_intro_middle">已跳過中場休息</string>
|
||||||
<string name="revanced_sb_skipped_intro_end">已跳過中場休息</string>
|
<string name="revanced_sb_skipped_intro_end">已跳過中場休息</string>
|
||||||
<string name="revanced_sb_skipped_outro">已跳過結尾</string>
|
<string name="revanced_sb_skipped_outro">已跳過結尾</string>
|
||||||
|
<string name="revanced_sb_skipped_hook">已跳過掛鉤</string>
|
||||||
<string name="revanced_sb_skipped_preview_beginning">已跳過預覽</string>
|
<string name="revanced_sb_skipped_preview_beginning">已跳過預覽</string>
|
||||||
<string name="revanced_sb_skipped_preview_middle">已跳過預覽</string>
|
<string name="revanced_sb_skipped_preview_middle">已跳過預覽</string>
|
||||||
<string name="revanced_sb_skipped_preview_end">已跳過回顧</string>
|
<string name="revanced_sb_skipped_preview_end">已跳過回顧</string>
|
||||||
<string name="revanced_sb_skipped_filler">已跳過閒聊</string>
|
<string name="revanced_sb_skipped_filler">已跳過不相關內容</string>
|
||||||
<string name="revanced_sb_skipped_nomusic">已跳過非音樂部分</string>
|
<string name="revanced_sb_skipped_nomusic">已跳過非音樂部分</string>
|
||||||
<string name="revanced_sb_skipped_unsubmitted">跳過了未提交的片段</string>
|
<string name="revanced_sb_skipped_unsubmitted">跳過了未提交的片段</string>
|
||||||
<string name="revanced_sb_skipped_multiple_segments">已跳過多個片段</string>
|
<string name="revanced_sb_skipped_multiple_segments">已跳過多個片段</string>
|
||||||
|
|||||||
@@ -131,7 +131,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
<string-array name="revanced_spoof_video_streams_client_type_entry_values">
|
<string-array name="revanced_spoof_video_streams_client_type_entry_values">
|
||||||
<item>ANDROID_UNPLUGGED</item>
|
<item>ANDROID_UNPLUGGED</item>
|
||||||
<item>ANDROID_VR_NO_AUTH</item>
|
<item>ANDROID_VR_1_61_48</item>
|
||||||
<item>IOS_UNPLUGGED</item>
|
<item>IOS_UNPLUGGED</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
</patch>
|
</patch>
|
||||||
|
|||||||
Reference in New Issue
Block a user