From e12359b94f19d5c7ffd7de577970dd488a2a7152 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:46:32 +0400
Subject: [PATCH 01/16] chore: Sync translations (#5829)
---
.../addresources/values-az-rAZ/strings.xml | 15 ++++++++++-----
.../addresources/values-tr-rTR/strings.xml | 4 ++--
.../addresources/values-zh-rTW/strings.xml | 14 +++++++++-----
3 files changed, 21 insertions(+), 12 deletions(-)
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-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"
已跳過中場休息
已跳過中場休息
已跳過結尾
+ 已跳過掛鉤
已跳過預覽
已跳過預覽
已跳過回顧
- 已跳過閒聊
+ 已跳過不相關內容
已跳過非音樂部分
跳過了未提交的片段
已跳過多個片段
From 61cadf72cda08c62919d6cebd633f82a95a82ab9 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:49:35 +0400
Subject: [PATCH 02/16] refactor(Spoof video streams): Back port code from v22
branch to support patching the latest YT Music. Using any target above
7.49.52 is untested and only recommended for experimental or development
purposes.
---
patches/api/patches.api | 1 +
.../music/misc/spoof/SpoofVideoStreams.kt | 3 +-
.../music/playservice/VersionCheckPatch.kt | 3 ++
.../patches/shared/misc/spoof/Fingerprints.kt | 29 ++++++++++++++++---
.../misc/spoof/SpoofVideoStreamsPatch.kt | 3 +-
5 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/patches/api/patches.api b/patches/api/patches.api
index b222e63bd..7c09b37e4 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 {
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..0dd9a4424 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
@@ -2,6 +2,7 @@ package app.revanced.patches.music.misc.spoof
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
@@ -16,6 +17,6 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
dependsOn(versionCheckPatch, userAgentClientSpoofPatch)
},
fixMediaFetchHotConfigChanges = { true },
- fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater },
+ fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater },
fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }
)
\ 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..e30651041 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
@@ -42,7 +43,7 @@ fun spoofVideoStreamsPatch(
) {
block()
- dependsOn(addResourcesPatch)
+ dependsOn(sharedExtensionPatch, addResourcesPatch)
execute {
// region Enable extension helper method used by other patches
From 0abfab79d7cda15bf17c53679fbfffb021662649 Mon Sep 17 00:00:00 2001
From: Samo Hribar <34912839+samolego@users.noreply.github.com>
Date: Sun, 14 Sep 2025 13:49:52 +0200
Subject: [PATCH 03/16] feat(Viber): Add `Hide ads` patch (#5826)
---
patches/api/patches.api | 4 ++++
.../revanced/patches/viber/ads/Fingerprints.kt | 13 +++++++++++++
.../revanced/patches/viber/ads/HideAdsPatch.kt | 17 +++++++++++++++++
3 files changed, 34 insertions(+)
create mode 100644 patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt
create mode 100644 patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt
diff --git a/patches/api/patches.api b/patches/api/patches.api
index 7c09b37e4..6d4c6e065 100644
--- a/patches/api/patches.api
+++ b/patches/api/patches.api
@@ -1242,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/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..683e750e1
--- /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")
+
+ execute {
+ // Return 1 (true) indicating ads should be disabled.
+ adsFreeFingerprint.method.returnEarly(1)
+ }
+}
From 678ef4052e6498a8c4669c74ebbe8de2d80cb773 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Sun, 14 Sep 2025 11:52:21 +0000
Subject: [PATCH 04/16] chore: Release v5.37.0-dev.1 [skip ci]
# [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))
---
CHANGELOG.md | 7 +++++++
gradle.properties | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1e7724480..81005901c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [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/gradle.properties b/gradle.properties
index 39ea23752..9c021a2fc 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.1
From 09b941abf0e8029999565082b02a88b5de507ec4 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Sun, 14 Sep 2025 15:58:05 +0400
Subject: [PATCH 05/16] fix: Resolve patching with dev branch
---
.../app/revanced/patches/music/misc/spoof/SpoofVideoStreams.kt | 3 ++-
.../patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
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 0dd9a4424..58940f061 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,5 +1,6 @@
package app.revanced.patches.music.misc.spoof
+import app.revanced.patches.music.misc.extension.sharedExtensionPatch
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
@@ -14,7 +15,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
)
)
- dependsOn(versionCheckPatch, userAgentClientSpoofPatch)
+ dependsOn(sharedExtensionPatch, versionCheckPatch, userAgentClientSpoofPatch)
},
fixMediaFetchHotConfigChanges = { true },
fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater },
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 e30651041..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
@@ -43,7 +43,7 @@ fun spoofVideoStreamsPatch(
) {
block()
- dependsOn(sharedExtensionPatch, addResourcesPatch)
+ dependsOn(addResourcesPatch)
execute {
// region Enable extension helper method used by other patches
From b53b870e8fd31a943d8ef5d738095cb63b77b3cb Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Sun, 14 Sep 2025 12:00:38 +0000
Subject: [PATCH 06/16] chore: Release v5.37.0-dev.2 [skip ci]
# [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))
---
CHANGELOG.md | 7 +++++++
gradle.properties | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 81005901c..d4eacf5e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [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)
diff --git a/gradle.properties b/gradle.properties
index 9c021a2fc..63cc17360 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.37.0-dev.1
+version = 5.37.0-dev.2
From 782353c18a285f0be329832f03abb686b6c4a477 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Sun, 14 Sep 2025 18:06:40 +0400
Subject: [PATCH 07/16] refactor(Spoof video streams): Handle migration of
default spoof client for users upgrading from very old patches
---
.../extension/shared/settings/BaseSettings.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
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..1fafec71c 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
@@ -6,6 +6,8 @@ import static app.revanced.extension.shared.settings.Setting.parent;
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.SpoofiOSAvailability;
+import app.revanced.extension.shared.Logger;
+import app.revanced.extension.shared.Utils;
import app.revanced.extension.shared.spoof.ClientType;
/**
@@ -36,4 +38,16 @@ public class BaseSettings {
// 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));
+ static {
+ // Data migration fix for YT Music users updating from very old patches that always
+ // stored default values in preference object, which requires manually updating
+ // the setting if the default changes. Package name may not contain "youtube.music"
+ // if the user has used change package name patch, but this will detect users
+ // with default installations.
+ if (!SPOOF_VIDEO_STREAMS_CLIENT_TYPE.isSetToDefault()
+ && Utils.getContext().getPackageName().contains("youtube.music")) {
+ Logger.printInfo(() -> "Resetting spoof client from: " + SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
+ SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault();
+ }
+ }
}
From dcd42454bd5f87dddd720534f6120c4ef90063a3 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Sun, 14 Sep 2025 21:11:15 +0400
Subject: [PATCH 08/16] fix(Spotify): Remove broken `Spoof client` patch
(#5833)
---
.../spotify/layout/theme/CustomThemePatch.kt | 13 +++++++++----
.../patches/spotify/misc/fix/SpoofClientPatch.kt | 2 +-
2 files changed, 10 insertions(+), 5 deletions(-)
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(
From eee72208dd7639c30dc292143873076b97a05cd5 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Sun, 14 Sep 2025 17:15:28 +0000
Subject: [PATCH 09/16] chore: Release v5.37.0-dev.3 [skip ci]
# [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))
---
CHANGELOG.md | 7 +++++++
gradle.properties | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d4eacf5e5..14786d158 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [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)
diff --git a/gradle.properties b/gradle.properties
index 63cc17360..21de3f247 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.37.0-dev.2
+version = 5.37.0-dev.3
From 2a85a3b29092729ae16d1fd93803634ce5f08e95 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Sun, 14 Sep 2025 22:19:13 +0400
Subject: [PATCH 10/16] fix(YouTube Music - Spoof streaming data): Fix audio
playback stuttering (#5839)
---
extensions/music/build.gradle.kts | 6 +
.../patches/spoof/SpoofVideoStreamsPatch.java | 23 ++++
.../shared/settings/BaseSettings.java | 17 +--
.../extension/shared/spoof/ClientType.java | 24 +++-
.../shared/spoof/SpoofVideoStreamsPatch.java | 3 +-
.../shared/spoof/requests/PlayerRoutes.java | 3 +-
.../spoof/requests/StreamingDataRequest.java | 21 ++--
.../patches/spoof/SpoofVideoStreamsPatch.java | 29 +++++
...oofStreamingDataSideEffectsPreference.java | 3 +-
.../music/misc/spoof/SpoofVideoStreams.kt | 16 ++-
.../misc/spoof/SpoofVideoStreamsPatch.kt | 109 ++++++++++--------
.../resources/addresources/values/arrays.xml | 2 +-
12 files changed, 174 insertions(+), 82 deletions(-)
create mode 100644 extensions/music/src/main/java/app/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch.java
create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java
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 1fafec71c..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
@@ -6,8 +6,6 @@ import static app.revanced.extension.shared.settings.Setting.parent;
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability;
import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.SpoofiOSAvailability;
-import app.revanced.extension.shared.Logger;
-import app.revanced.extension.shared.Utils;
import app.revanced.extension.shared.spoof.ClientType;
/**
@@ -36,18 +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));
-
- static {
- // Data migration fix for YT Music users updating from very old patches that always
- // stored default values in preference object, which requires manually updating
- // the setting if the default changes. Package name may not contain "youtube.music"
- // if the user has used change package name patch, but this will detect users
- // with default installations.
- if (!SPOOF_VIDEO_STREAMS_CLIENT_TYPE.isSetToDefault()
- && Utils.getContext().getPackageName().contains("youtube.music")) {
- Logger.printInfo(() -> "Resetting spoof client from: " + SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
- SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault();
- }
- }
+ 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/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 58940f061..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,13 +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"(
@@ -17,7 +24,10 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
dependsOn(sharedExtensionPatch, versionCheckPatch, userAgentClientSpoofPatch)
},
- fixMediaFetchHotConfigChanges = { true },
- fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_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/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/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
From a3ba92e74280746207d681fa1724144922306dee Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Sun, 14 Sep 2025 18:22:57 +0000
Subject: [PATCH 11/16] chore: Release v5.37.0-dev.4 [skip ci]
# [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))
---
CHANGELOG.md | 7 +++++++
gradle.properties | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 14786d158..90b57cd84 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [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)
diff --git a/gradle.properties b/gradle.properties
index 21de3f247..5089d1458 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.37.0-dev.3
+version = 5.37.0-dev.4
From 2db0948beaf2b68391a1fe7f21e92d31c7df61e7 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Mon, 15 Sep 2025 10:26:30 +0400
Subject: [PATCH 12/16] fix(Viber - Hide ads): Add constrain to known working
version
---
.../main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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
index 683e750e1..91bff02c6 100644
--- a/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt
+++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt
@@ -8,7 +8,7 @@ val hideAdsPatch = bytecodePatch(
name = "Hide Ads",
description = "Hides ad banners between chats.",
) {
- compatibleWith("com.viber.voip")
+ compatibleWith("com.viber.voip"("25.9.2.0"))
execute {
// Return 1 (true) indicating ads should be disabled.
From 2a582eced89d1e4d685631cf87e7afd5f1c195ef Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Mon, 15 Sep 2025 06:29:31 +0000
Subject: [PATCH 13/16] chore: Release v5.37.0-dev.5 [skip ci]
# [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))
---
CHANGELOG.md | 7 +++++++
gradle.properties | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 90b57cd84..dfb0fbfbb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [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)
diff --git a/gradle.properties b/gradle.properties
index 5089d1458..5f9943d4d 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.37.0-dev.4
+version = 5.37.0-dev.5
From e6c79f13834c83fef04e4dee5e628cb0b9a27765 Mon Sep 17 00:00:00 2001
From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Date: Mon, 15 Sep 2025 10:36:57 +0400
Subject: [PATCH 14/16] fix(Instagram - Hide navigation buttons): Add constrain
to known working version
---
.../patches/instagram/hide/navigation/HideNavigationButtons.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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",
From 9a5c102c0d434cfe2e9f8d3016019b5f0ae3fbe3 Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Mon, 15 Sep 2025 06:40:30 +0000
Subject: [PATCH 15/16] chore: Release v5.37.0-dev.6 [skip ci]
# [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))
---
CHANGELOG.md | 7 +++++++
gradle.properties | 2 +-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dfb0fbfbb..f4fef54a3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# [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)
diff --git a/gradle.properties b/gradle.properties
index 5f9943d4d..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.37.0-dev.5
+version = 5.37.0-dev.6
From 81ff5576b0ed400a16b484e6d160cee6824ad912 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 15 Sep 2025 10:41:42 +0400
Subject: [PATCH 16/16] chore: Sync translations (#5854)
---
.../addresources/values-es-rES/strings.xml | 186 +++++++++---------
.../addresources/values-in-rID/strings.xml | 10 +-
.../addresources/values-ru-rRU/strings.xml | 10 +-
3 files changed, 103 insertions(+), 103 deletions(-)
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
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
@@ -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"
Пауза пропущена
Пауза пропущена
Концовка пропущена
- Завязка пропущена
+ Вступление пропущено
Предпросмотр пропущен
Предпросмотр пропущен
Пересказ пропущен
- Отступление пропущено
+ Отвлеченные темы пропущены
Сегмент без музыки пропущен
Неподтвержденный сегмент пропущен
Несколько сегментов пропущены