diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ba994fda..1e7724480 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# [5.36.0](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0) (2025-09-14) + + +### Bug Fixes + +* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411)) +* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0)) +* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](https://github.com/ReVanced/revanced-patches/commit/a53b00dd514dbe2b3406f3c1013a4f58a7f481c5)) + + +### Features + +* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe)) + +# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13) + + +### Bug Fixes + +* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411)) +* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0)) +* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](https://github.com/ReVanced/revanced-patches/commit/a53b00dd514dbe2b3406f3c1013a4f58a7f481c5)) + + +### Features + +* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe)) + # [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13) diff --git a/gradle.properties b/gradle.properties index 6806f82b4..39ea23752 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-dev.1 +version = 5.36.0 diff --git a/patches/api/patches.api b/patches/api/patches.api index a236254ea..f69b86ef2 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -372,6 +372,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 { @@ -1216,6 +1217,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/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } 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 50c3cb17d..79f2ec7d8 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,11 +1,14 @@ 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.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.string 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 by fingerprint { returns("Lorg/chromium/net/UrlRequest\$Builder;") @@ -40,7 +43,7 @@ internal val buildRequestFingerprint by fingerprint { returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder; instructions( methodCall(name = "newUrlRequestBuilder") - ) + ) // UrlRequest; or UrlRequest$Builder; custom { methodDef, _ -> // Different targets have slightly different parameters @@ -74,10 +77,11 @@ internal val buildRequestFingerprint by fingerprint { val parameterTypes = methodDef.parameterTypes val parameterTypesSize = parameterTypes.size (parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) && - parameterTypes[1] == "Ljava/util/Map;" // URL headers. + parameterTypes[1] == "Ljava/util/Map;" // URL headers. } } + internal val protobufClassParseByteBufferFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) returns("L") @@ -160,7 +164,8 @@ internal val mediaFetchHotConfigFingerprint by fingerprint { ) } -// 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 val mediaFetchHotConfigAlternativeFingerprint by fingerprint { instructions( literal(45683169L) 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 2789c105d..6d08f88b0 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 @@ -41,7 +42,7 @@ fun spoofVideoStreamsPatch( ) { block() - dependsOn(addResourcesPatch) + dependsOn(sharedExtensionPatch, addResourcesPatch) execute { // region Enable extension helper method used by other patches 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..8d0efac12 --- /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 by 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) + } +} 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" 已跳過中場休息 已跳過中場休息 已跳過結尾 + 已跳過掛鉤 已跳過預覽 已跳過預覽 已跳過回顧 - 已跳過閒聊 + 已跳過不相關內容 已跳過非音樂部分 跳過了未提交的片段 已跳過多個片段