From 754b71959a0155413eb33cf1bdc2c8976eaca634 Mon Sep 17 00:00:00 2001 From: Lassie111 <125142449+Lassie111@users.noreply.github.com> Date: Wed, 22 Oct 2025 19:50:10 +0300 Subject: [PATCH 01/18] fix(Google Photos - Spoof features): Add support for Pixel 10 devices (#6161) --- .../patches/googlephotos/misc/features/SpoofFeaturesPatch.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt index 4c0be2b77..db6158d27 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt @@ -47,6 +47,7 @@ val spoofFeaturesPatch = bytecodePatch( "com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE", "com.google.android.feature.PIXEL_2024_EXPERIENCE", "com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2025_EXPERIENCE", ), title = "Features to disable", description = "Google Pixel exclusive features to disable." + From 7283b93cead1f4d9f9ba2048d9f979412a8f3c57 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 22 Oct 2025 16:53:15 +0000 Subject: [PATCH 02/18] chore: Release v5.44.0-dev.2 [skip ci] # [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22) ### Bug Fixes * **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7b15246d..e67c43375 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22) + + +### Bug Fixes + +* **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634)) + # [5.44.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.3...v5.44.0-dev.1) (2025-10-22) diff --git a/gradle.properties b/gradle.properties index a5b833989..08bb2c7ce 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.44.0-dev.1 +version = 5.44.0-dev.2 From 08baa19b4a62e62bd103d177c3f4454de199cf16 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 Oct 2025 00:21:30 +0400 Subject: [PATCH 03/18] feat(Duolingo - Enable debug menu): Support latest app target (#6163) --- .../duolingo/debug/EnableDebugMenuPatch.kt | 31 ++++++++++------- .../patches/duolingo/debug/Fingerprints.kt | 33 ++++++++++++------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index 833f9dd7d..a507352e8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -1,26 +1,35 @@ package app.revanced.patches.duolingo.debug -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") val enableDebugMenuPatch = bytecodePatch( name = "Enable debug menu", - use = false, + use = false ) { - compatibleWith("com.duolingo"("5.158.4")) + compatibleWith("com.duolingo") execute { - initializeBuildConfigProviderFingerprint.method.apply { - val insertIndex = initializeBuildConfigProviderFingerprint.patternMatch!!.startIndex - val register = getInstruction(insertIndex).registerA + // It seems all categories are allowed on release. Force this on anyway. + debugCategoryAllowOnReleaseBuildsFingerprint.method.returnEarly(true) - addInstructions( - insertIndex, - "const/4 v$register, 0x1", - ) + // Change build config debug build flag. + buildConfigProviderConstructorFingerprint.match( + buildConfigProviderToStringFingerprint.classDef + ).let { + val index = it.patternMatch!!.startIndex + + it.method.apply { + val register = getInstruction(index).registerA + addInstruction( + index + 1, + "const/4 v$register, 0x1" + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index 543e40b43..c3d663c83 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -4,16 +4,25 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -/** - * The `BuildConfigProvider` class has two booleans: - * - * - `isChina`: (usually) compares "play" with "china"...except for builds in China - * - `isDebug`: compares "release" with "debug" <-- we want to force this to `true` - */ - -internal val initializeBuildConfigProviderFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - opcodes(Opcode.IPUT_BOOLEAN) - strings("debug", "release", "china") +internal val debugCategoryAllowOnReleaseBuildsFingerprint = fingerprint { + returns("Z") + parameters() + custom { method, classDef -> + method.name == "getAllowOnReleaseBuilds" && classDef.type == "Lcom/duolingo/debug/DebugCategory;" + } +} + +internal val buildConfigProviderConstructorFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters() + opcodes(Opcode.CONST_4) +} + +internal val buildConfigProviderToStringFingerprint = fingerprint { + parameters() + returns("Ljava/lang/String;") + strings("BuildConfigProvider(") // Partial string match. + custom { method, _ -> + method.name == "toString" + } } From a2aa9cac2739ccdcba54b849822ae9c99b6cb11b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 22 Oct 2025 20:24:37 +0000 Subject: [PATCH 04/18] chore: Release v5.44.0-dev.3 [skip ci] # [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22) ### Features * **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e67c43375..0d5a1a4ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22) + + +### Features + +* **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16)) + # [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22) diff --git a/gradle.properties b/gradle.properties index 08bb2c7ce..9f1b9a4dc 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.44.0-dev.2 +version = 5.44.0-dev.3 From 876d7a6b03a8efcef8a33035ac31bd0214f82b19 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:18:20 +0400 Subject: [PATCH 05/18] chore(X / Twitter - Change link sharing domain): Add disclaimer to description --- .../patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index 1a2c99f59..e69a44965 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -64,7 +64,7 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, - description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN, + description = "$PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN Including this patch can prevent making posts that quote other posts.", use = false ) { dependsOn( From 3466d9d210a7d2bf9e72d71d5e47eabf62dad51c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:19:08 +0400 Subject: [PATCH 06/18] chore: Sync translations (#6172) --- .../addresources/values-az-rAZ/strings.xml | 20 +- .../addresources/values-ga-rIE/strings.xml | 496 +++++++++--------- 2 files changed, 258 insertions(+), 258 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 5c3bd1b87..adf2063f5 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -218,9 +218,9 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum İcma elanların gizlət İcma elanları gizlədilib İcma elanları göstərilir - Yığcam etiketləri gizlət - Yığcam etiketlər gizlidir - Yığcam etiketlər göstərilir + Yığcam afişaları gizlət + Yığcam afişalar gizlidir + Yığcam afişalar görünür İanə qutusunu gizlət İanə qutusu gizlidir İanə qutusu göstərilir @@ -471,9 +471,9 @@ Məhdudiyyətlər Yaradıcı mağaza bölümün gizlət Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür - Son ekran mağaza etiketini gizlət - Son ekran alış-veriş etiketi gizlədilib - Son ekran alış-veriş etiketi görünür + Son ekran mağaza afişasın gizlət + Son ekran mağaza afişası gizlidir + Son ekran mağaza afişası görünür Tam ekran reklamlarını gizlət "Tam ekran reklamları gizlidir @@ -484,9 +484,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Ümumi reklamları gizlət Ümumi reklamlar gizlidir Ümumi reklamlar göstərilir - Məhsul etiketlərini gizlət - Məhsul etiketləri gizlədilir - Məhsul etiketləri göstərilir + Məhsul afişaların gizlət + Məhsul afişaları gizlədilir + Məhsul afişaları görünür Ödənişli tanıtım etiketini gizlət Ödənişli reklam etiketi gizlədilib Ödənişli reklam etiketi göstərilir @@ -496,7 +496,7 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Alış-veriş linklərini gizlət Alış-veriş linkləri video təsvirdə gizlidir Alış-veriş linkləri video təsvirdə görünür - “Məhsullara baxın” panelin gizlət + “Məhsullara baxın” afişasın gizlət Məhsullara baxış etiketi video örtüyündə gizlidir Məhsullara baxış etiketi video örtüyündə görünür Veb axtarış nəticələrini gizlət diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index bc3ebfd57..ff9a063ad 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -756,7 +756,7 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Taispeántar roghchlár físe lúb Folaigh modh comhthimpeallach - Tá roghchlár mód chomhthimpeallach + Tá roghchlár mód comhthimpeallach i bhfolach Taispeántar roghchlár mód comhthimpeallach Folaigh toirt cobhsaí Taispeántar roghchlár toirte cobhsaí @@ -764,7 +764,7 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Folaigh Cabhair & aiseolas Cabhair & Tá an roghchlár aiseolais i bhfolach - Cabhair & Taispeántar roghchlár aiseolais + Taispeántar roghchlár Cabhrach & Aiseolais Folaigh luas athsheinm Tá roghchlár luas athsheinm i bhfolach @@ -773,11 +773,11 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a This menu only appears for some videos. Translate the name normally if the menu cannot be found. --> Folaigh Tuilleadh eolais Tá tuilleadh eolais i bhfolach - Taispeántar roghchlár níos mó faisnéise + Taispeántar roghchlár tuilleadh eolais Folaigh scáileán Glas Tá roghchlár scáileán glas i bhfolach - Taispeántar roghchlár scáileáin glas + Taispeántar roghchlár an scáileáin ghlasála Folaigh Rian Fuaime Tá roghchlár rian fuaime i bhfolach @@ -788,32 +788,32 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhréige' go iPadOS" Folaigh Watch i VR - Tá faire i roghchlár VR i bhfolach - Taispeántar an faire sa roghchlár VR + Tá an roghchlár Féach i VR i bhfolach + Taispeántar an roghchlár Féach i VR Folaigh roghchlár cáilíocht físe Tá roghchlár cháilíocht na físeáin i bhfolach - Tá roghchlár cháilíocht na físeáin ar taispeáint + Taispeántar roghchlár cáilíochta físe Folaigh buntásc roghchlár cáilíochta físe - Tá buntásc an roghchláir cáilíochta físeáin folaithe + Tá buntásc roghchláir cáilíochta físe i bhfolach Taispeántar buntásc roghchlár cáilíochta físeáin - Folaigh cnaipe an Uathoimh - Tá cnaipe Autoplay i bhfolach + Folaigh an cnaipe Uath-imirt + Tá an cnaipe uath-sheinm i bhfolach Taispeántar cnaipe Autoplay - Folaigh cnaipe na dTeidil + Folaigh cnaipe fotheidil Tá cnaipe fotheidil i bhfolach Taispeántar cnaipe fotheidil - Folaigh cnaipe an Chasta - Tá cnaipe teilgthe i bhfolach - Taispeántar cnaipe teilgthe + Folaigh cnaipe Cast + Tá cnaipe Cast i bhfolach + Taispeántar cnaipe Cast Folaigh cúlra rialuithe an imreora Tá cúlra rialuithe an imreora i bhfolach Taispeántar cúlra rialuithe an imreora - Folaigh Cnaipí Roimhe & Ar Aghaidh - Tá cnaipí i bhfolach - Taispeántar cnaipí + Folaigh cnaipí Roimhe Seo & Ar Aghaidh + Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach + Taispeántar cnaipí Roimhe Seo & Ar Aghaidh Folaigh cártaí scáileáin deireadh @@ -821,7 +821,7 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Taispeántar cártaí scáileáin deireadh - Díchumasaigh mód Timpeallachta i scáileán iomlán + Díchumasaigh mód comhthimpeallach i lánscáileán Díchumasaíodh mód comhthimpeallach Mód comhthimpeallach cumasaithe @@ -831,8 +831,8 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Taispeántar cártaí faisnéise - Díchumasaigh beochan uimhreacha - Níl uimhreacha rollta beoite + Díchumasaigh beochana uimhreacha rollta + Ní bhíonn uimhreacha rollta beoite Tá uimhreacha rollta beoite @@ -840,9 +840,9 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Tá barra cuardaigh seinnteoir físe i bhfolach Taispeántar barra cuardaigh an t-imreoir físeán - Folaigh barra cuardaigh mionsamhlaí físeáin - Tá barra cuardaigh mionsamhlaí físeáin i bhfolach - Tá barra cuardaigh mionsamhlaí físeáin taispeánta + Folaigh barra cuardaigh mionsamhlacha físeáin + Tá barra cuardaigh mionsamhlacha físeáin i bhfolach + Taispeántar barra cuardaigh mionsamhlacha físe Shorts seinnteoir @@ -852,91 +852,91 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr I bhfolach sa fhotha Baile agus físeáin ghaolmhara Taispeánta sa fhotha Baile agus físeáin ghaolmhara Folaigh Shorts i dtorthaí cuardaigh - Folaithe i dtorthaí cuardaigh - Tá ar taispeáint sna torthaí cuardaigh + Folaigh i dtorthaí cuardaigh + Taispeáin i dtorthaí cuardaigh Folaigh Shorts sa fhotha Liostálaí I bhfolach sa fhotha Liostálaí Taispeánta sa fhotha Liostálaí Folaigh Shorts i stair féachana - Faolithe sa stair féachana + I bhfolach i stair féachana Taispeántar i stair féachana - Folaigh cnaipe \'Ceannaigh Super Thanks\' - Cnaipe \'Ceannaigh Super Thanks\' i bhfolach - Cnaipe \'Ceannaigh Super Thanks\' taispeánta - Folaigh cnaipe éifeachta - Tá an cnaipe Éifeacht i bhfolach - Tá an cnaipe Éifeacht taispeánta - Folaigh cnaipe \'Scáileán glas\' - Tá cnaipe an scáileáin glas i bhfolach - Taispeántar cnaipe an scáileáin glas - Folaigh an cnaipe hashtag - Tá cnaipe hashtag i bhfolach - Taispeántar an cnaipe hashtag + Folaigh cnaipe Ceannaigh Super Thanks + Cnaipe Ceannaigh Super Thanks i bhfolach + Taispeántar an cnaipe Ceannaigh Super Thanks + Folaigh cnaipe Éifeacht + Tá cnaipe Éifeacht i bhfolach + Taispeántar cnaipe Éifeacht + Folaigh cnaipe Scáileáin Ghlais + Tá cnaipe Scáileáin Ghlais i bhfolach + Taispeántar cnaipe Scáileáin Ghlais + Folaigh cnaipe Hashtag + Tá cnaipe Hashtag i bhfolach + Taispeántar cnaipe hashtag - Folaigh cnaipe \'Bí\' - Tá an cnaipe Bí i bhfolach - Taispeántar an cnaipe Bí isteach + Folaigh cnaipe Glac páirt + Tá cnaipe Glac páirt i bhfolach + Taispeántar cnaipe Glac páirt Folaigh lipéad suímh Tá lipéad suímh i bhfolach Taispeántar lipéad suímh - Folaigh cnaipe na bpostálacha nua - Tá cnaipe na bpostálacha nua i bhfolach - Taispeántar cnaipe na bpostálacha nua - Folaigh na cnaipí forleagan sosaithe - Tá cnaipí forleagtha sos i bhfolach - Taispeántar cnaipí forleagtha sos - Folaigh réamhamharc ar an nóta tráchta - Tá réamhamharc ar an nóta tráchta i bhfolach - Taispeántar réamhamharc ar an nóta tráchta - Folaigh cnaipe \'Sábháil ceol\' - Tá an cnaipe Sábháil ceoil i bhfolach - Taispeántar an cnaipe Sábháil ceoil + Folaigh Cnaipe Poist nua + Tá cnaipe Poist nua i bhfolach + Taispeántar cnaipe Poist nua + Folaigh cnaipí forleagan ar sos + Tá cnaipí forleagan ar sos i bhfolach + Taispeántar cnaipí forleagan ar sos + Folaigh trácht réamhamhairc + Tá an trácht réamhamhairc i bhfolach + Taispeántar réamhamharc tráchta + Folaigh an cnaipe Sábháil Ceoil + Tá an cnaipe sábháil ceoil i bhfolach + Taispeántar an cnaipe sábháil ceoil Folaigh moltaí cuardaigh Tá moltaí cuardaigh i bhfolach Taispeántar moltaí cuardaigh - Folaigh cnaipe an Siopa + Folaigh cnaipe Siopa Tá cnaipe siopa i bhfolach Taispeántar cnaipe siopa Folaigh greamáin Tá greamáin i bhfolach Taispeántar greamáin - Folaigh cnaipe \'Liostáil\' - Tá cnaipe liostáil i bhfolach - Taispeántar cnaipe liostáil + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil Folaigh táirgí clibeáilte - Tá táirgí clib i bhfolach + Tá táirgí clibeáilte i bhfolach Taispeántar táirgí clibeáilte - Folaigh cnaipe \'Le teacht\' - Tá cnaipe atá le teacht i bhfolach - Taispeántar an cnaipe atá le teacht - Folaigh an cnaipe \"Úsáid an fhuaim seo\" - Tá an cnaipe \"Úsáid an fhuaim seo\" folaithe - Tá an cnaipe \"Úsáid an fhuaim seo\" taispeánta - Folaigh an cnaipe Bain úsáid as an teimpléad seo - Tá an cnaipe \"Úsáid an teimpléad seo\" folaithe - Taispeántar an cnaipe Bain úsáid as an teimpléad seo - Folaigh an beochan fhoinse cnaipe Cosúil - Cosúil le beochan tobair cnaipe i bhfolach - Taispeántar beochan tobair cnaipe cosúil le cnaipe - Folaigh cnaipe Cosúil - Tá an cnaipe Cosúil i bhfolach - Taispeántar an cnaipe Cosúil - Folaigh cnaipe Mhíchlú - Taispeántar an cnaipe nach dtaitníonn leis - Taispeántar an cnaipe nach dtaitníonn leis + Folaigh cnaipe Ag Teacht + Tá cnaipe Ag Teacht i bhfolach + Taispeántar an cnaipe Ag Teacht + Folaigh Úsáid an cnaipe fuaime seo + Tá an cnaipe Úsáid an fhuaim seo i bhfolach + Taispeántar an cnaipe Úsáid an fhuaim seo + Folaigh an cnaipe Úsáid an teimpléad seo + Tá an cnaipe Úsáid an teimpléid seo i bhfolach + Taispeántar an cnaipe Úsáid an teimpléid seo + Folaigh an cnaipe Is maith liom \'beochan tobair\' + Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach + Taispeántar an cnaipe Is maith liom \'beochan tobair\' + Folaigh cnaipe Is maith liom + Tá an cnaipe Is maith liom i bhfolach + Taispeántar an cnaipe Is maith liom + Folaigh cnaipe Ní maith liom + Tá an cnaipe Ní maith liom i bhfolach + Taispeántar an cnaipe Ní maith liom Folaigh cnaipe na Tuairimí Tá an cnaipe tuairimí i bhfolach Taispeántar cnaipe tuairimí - Folaigh cnaipe \'Roinn\' - Tá cnaipe Comhroinn i bhfolach - Taispeántar an cnaipe Comhroinn + Folaigh cnaipe Roinn + Tá cnaipe Roinn i bhfolach + Taispeántar an cnaipe Roinn - Folaigh cnaipe an Athchóiriú - Tá cnaipe Remix i bhfolach - Taispeántar cnaipe Remix - Folaigh an cnaipe fuaime + Folaigh cnaipe Athmheasc + Tá cnaipe Athmheasc i bhfolach + Taispeántar cnaipe Athmheasc + Folaigh cnaipe Fuaime Tá cnaipe fuaime i bhfolach Taispeántar cnaipe fuaime Folaigh painéal faisnéise @@ -947,29 +947,29 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Taispeántar barra cainéal Folaigh teideal físeáin Teideal físeáin i bhfolach - Teideal físeáin taispeánta + Taispeántar teideal físeáin Folaigh lipéad meiteashonraí fuaime Lipéad meiteashonraí fuaime i bhfolach - Lipéad meiteashonraí fuaime taispeánta + Taispeántar Lipéad meiteashonraí fuaime Folaigh lipéad nasc físeáin - Tá lipéad nasc físe i bhfolach - Taispeántar lipéad nasc físe + Tá lipéad nasc físeáin i bhfolach + Taispeántar lipéad nasc físeáin Folaigh barra nascleanúna Tá barra nascleanúna i bhfolach Taispeántar barra nascleanúna Folaigh físeán molta deireadh scáileáin - "Folaítear físeán molta deireadh scáileáin nuair a bhíonn an uathshein múchta + "Bíonn an físeán molta don scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta -Is féidir an uathshein a athrú i socruithe YouTube: -Socruithe → Athsheinm → Uathshein físeán eile" +Is féidir an t-uathsheinm a athrú i socruithe YouTube: +Socruithe → Athsheinm → Uathsheinm an chéad fhíseán eile" Taispeántar físeán molta deireadh scáileáin Folaigh forleagan físeáin ghaolmhara - Forleagan físeáin ghaolmhara i scáileán iomlán i bhfolach - Forleagan físeáin ghaolmhara i scáileán iomlán taispeánta + Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach + Taispeántar forleagan físeáin ghaolmhara i lánscáileán Folaigh stampa ama an fhíseáin @@ -977,85 +977,85 @@ Socruithe → Athsheinm → Uathshein físeán eile" Taispeántar stampa ama - Folaigh painéil aníos imreoir - Tá painéil aníos imreoirí i bhfolach - Taispeántar painéil aníos imreoirí + Folaigh painéil preab aníos imreoir + Tá painéil preab aníos imreoir i bhfolach + Taispeántar painéil preab aníos imreoir - Baint á âmód éadaéin iomlán lán iomlán ar deireadh na físe - Déchumasaithe - Portait - Téacscaoileadh - Portait agus téacscaoileadh + Scoir an mód lánscáileáin ag deireadh an fhíseáin + Díchumasaithe + Portráid + Tírdhreach + Portráid agus tírdhreach - Oscail físeáin i módh scáileáin iomláin portráit - Osclaítear físeáin i scáileán iomlán - Ní osclaítear físeáin i scáileán iomlán + Oscail físeáin i bportráid lánscáileáin + Osclaítear físeáin i mód lánscáileáin + Ní osclaítear físeáin i mód lánscáileáin - Trédhearcacht forleagtha an imreoir - Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach - Caithfidh trédhearcacht forleagtha imreoirí a bheith idir 0-100 + Teimhneacht fhorleagan imreora + Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht + Teimhneacht fhorleagan an imreora idir 0-100 - Ní dtaitníonn sé ar fáil go sealadach (API amuigh amach) - Ní dtaitníonn sé ar fáil (stádas %d) - Níl easaontais ar fáil (teorainn API an chliaint) - Ní dtaitníonn sé ar fáil (%s) + Níl dí-mhaith ar fáil faoi láthair (API am istigh) + Níl \'Ní maith liom\' ar fáil (stádas %d) + Níl \'Ní maith liom\' ar fáil (teorainn API cliaint) + Níl \'Ní maith liom\' ar fáil (%s) - Athlódáil físeán chun vótáil ag baint úsáide as Return YouTube Dislike + Athlódáil físeán vótáil trí Return YouTube Dislike - I bhfolach ag úinéir - Taispeántar rudaí nach dtaitníonn leo - Ní thaispeántar nach dtaitníonn leat - Taispeáin neamhthaitníonn ar Shorts - "Taispeántar easaontais ar Shorts + I bhfolach ag an úinéir + Taispeántar \'Ní maith liom\' + Ní thaispeántar \'Ní maith liom\' + Taispeáin \'ní maith liom\' ar Shorts + "Taispeántar 'Ní thaitníonn' ar Shorts -Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito" - Ní thaispeántar easaontais ar Shorts - Ní dtaitníonn mar chéatadán - Taispeántar easaontais mar chéatadán - Taispeántar easaontais mar uimhir +Teorainn: B’fhéidir nach dtaispeánfar 'Ní thaitníonn' i mód incognito" + Ní thaispeántar \'Ní maith liom\' ar Shorts + \'Ní maith liom\' mar chéatadán + Taispeántar \'Ní thaitníonn\' mar chéatadán + Taispeántar \'Ní maith liom\' mar uimhir - Cnaipe Cosúil dlúth - Cosúil le cnaipe stíleáilte don leithead íosta - Cosúil le cnaipe stíleáilte don chuma is fearr - Taispeáin na rudaí is maith leis - Taispeánann físeáin le maith díchumasaithe comhaireamh measta maith - Ní thaispeántar maith measta + Cnaipe dlúth \'Is maith liom\' + Cnaipe \'Is maith liom\' stílithe don leithead íosta + Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr + Taispeáin \'is maith liom\' measta + Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo + Ní thaispeántar líon na \'is maith leis\' measta Taispeáin tósta mura bhfuil API ar fáil Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil - Ní thaispeántar tóst mura bhfuil Return YouTube Dislike ar fáil - Soláthraíonn an API Return YouTube Dislike sonraí. Tapáil anseo chun tuilleadh a fhoghlaim + Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil + Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil - Staitisticí API returnieYouTubeDislike den fheiste seo + Staitisticí API ReturnYouTubeDislike an ghléis seo Am freagartha API, meán Am freagartha API, íosmhéid Am freagartha API, uasmhéid Am freagartha API, físeán deireanach Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm - Vótaí a fháil API, líon na nglaonna - Ní dhéantar aon ghlaonna líonra + Vótaí aisghabhála API, líon na nglaonna + Níor rinneadh aon ghlaonna líonra %d glaonna líonra déanta - Vótaí a fháil API, líon na n-imeachtaí ama - Níor aimsíodh aon ghlaonna líonra - Chuaigh %d glaoch líonra thar am + Vótaí aisghabhála API, líon na sosanna ama + Níl aon ghlaonna líonra imithe in éag + %d glaonna líonra imithe thar an am Teorainneacha ráta cliant API - Níor tharla aon teorainneacha rátaí cliant - Bhí teorainn ráta cliant ag teacht %d uair + Níor aimsíodh aon teorainneacha ráta cliant + Teorainn ráta cliant a bhíonn le fáil %d uair %d milleasoicind Cumasaigh barra cuardaigh leathan Tá barra cuardaigh leathan cumasaithe - Tá barra cuardaigh leathan míchumasaithe + Tá an barra cuardaigh leathan díchumasaithe Cumasaigh mionsamhlacha ardchaighdeáin Tá mionsamhlacha Seekbar ardchaighdeáin - Tá mionsamhlacha barra cuardaigh de chaighdeán meánach + Tá mionsamhlacha Seekbar ar chaighdeán meánach "Cuirfidh sé seo na miontaispeántais ar ais ar shruth beo nach bhfuil miontaispeántais cuardaigh acu. Úsáidfidh miontaispeántais cuardaigh an caighdeán céanna leis an bhfíseán reatha. @@ -1069,65 +1069,65 @@ Oibríonn an ghné seo is fearr le caighdeán físeáin 720p nó níos ísle agu Cumasaigh SponsorBlock Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais Dealramh - Taispeáin cnaipe vótá - Taispeántar cnaipe vótála deigh - Ní thaispeántar cnaipe vótála deireadh - Úsáid leagan amach cearnógach + Taispeáin an cnaipe vótála + Taispeántar cnaipe vótála deighleog + Ní thaispeántar cnaipe vótála deighleog + Úsáid leagan amach cearnach Tá cnaipí agus rialtáin cearnach Tá cnaipí agus rialuithe cruinn - Úsáid cnaipe Dlúthscipeála - Sceip cnaipe stíleáilte don leithead íosta - Sceip cnaipe stíleáilte chun an chuma is fearr - Folaigh cnaipe Scipeála go huathoibríoch - Folaíonn cnaipe scipeáil tar éis cúpla soicindí - Taispeántar cnaipe Scipeála don deighleog iomlán - Fad an chnaipe scipeála - Cá fhad chun na cnaipí scipeála agus scipeála go dtí an aibhsigh a thaispeáint sula bhfolóidh siad go huathoibríoch - Taispeáin teast cealaigh scipeála - Taispeántar teast nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra teast chun an scipeáil a chealú - Ní thaispeántar an tóstas - Fad an tóstais scipeála - Cá fhad chun an fógra dísciption a thaispeáint + Úsáid an cnaipe Scipeáil dlúth + Cnaipe Scipeáil stílithe don leithead íosta + Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr + Folaigh an cnaipe Scipeáil go huathoibríoch + Folaítear an cnaipe Scipeáil tar éis cúpla soicind + Taispeántar an cnaipe Scipeáil don deighleog iomlán + Fad an chnaipe Scipeáil + Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad + Taispeáin an tósta cealaithe scipeáilte + Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú + Ní thaispeántar tósta + Scipeáil fad an tósta + Cá fhad a thaispeántar an tósta cealaithe scipeála 1 soicind 2 soicind 3 soicind 4 soicind 5 soicind 6 soicind - 7 soicindí - 8 soicindí - 9 soicindí - 10 soicindí - Taispeáin fad físeáin gan codanna + 7 soicind + 8 soicind + 9 soicind + 10 soicind + Taispeáin fad an fhíseáin gan deighleog Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh Taispeántar fad físe iomlán Deighleoga nua a chruthú Taispeáin cnaipe Cruthaigh deighleog nua - Taispeántar cnaipe deighleog nua Cruthaigh - Ní thaispeántar cnaipe deighleog nua Cruthaigh + Taispeántar an cnaipe cruthaigh deighleog nua + Ní thaispeántar an cnaipe cruthaigh deighleog nua Coigeartaigh céim deighleog nua Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú Caithfidh luach a bheith ina uimhir dheimhneach - Féach treoirlín + Féach ar threoirlínte Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua Lean na treoirlínte - Léigh na treoirlínte SponsorBlock sula gcruthóidh tú + Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua Léigh cheana féin Taispeáin dom Ginearálta Taispeáin tósta mura bhfuil API ar fáil Taispeántar tósta mura bhfuil SponsorBlock ar fáil Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil - Cumasaigh scip-rianú comhairimh - Ligeann sí do chlár ceannairí SponsorBlock cá mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannairí gach uair a fhágtar mírlíne + Cumasaigh rianú comhaireamh scipeála + Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog Níl rianú comhaireamh scipeála cumasaithe Fad íosta deighleog Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí) Fad ama neamhbhailí - Do id úsáideora príobháideach + D\'aitheantas úsáideora príobháideach Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort - Caithfidh id úsáideora príobháideach a bheith 30 carachtar ar a laghad + Caithfidh Id príobháideach a bheith ≥30 carachtar Athraigh URL API An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí Athshocrú URL API @@ -1148,75 +1148,75 @@ Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh Athraigh iompar deighleog Urraitheoir Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo - Neamhíocta/Féin-Chur Chun Cinn - Cosúil le Fear gnótha ach amháin le haghaidh cur chun cinn neamhíoctha nó féin-thacaíochta. Áirítear roinntí faoi earraí, bronntanais, nó faisnéis faoi cé a oibrigh siad le chéile + Neamhíoctha/Féin-chur chun cinn + Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad Meabhrúchán Idirghníomhaíochta (Liostáil) - Meabhrúchán gairid ar mhaith leat, liostáil leo nó iad a leanúint i lár an ábhair. Má tá sé fada nó thart ar rud éigin ar leith, ba chóir é a chur chun cinn féin + Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin Aibhsigh An chuid den fhíseán atá ag cuardach mórchuid na ndaoine - Beochan Idirmheán/Intro + Beochan Eatramh / Réamhrá Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis - Cártaí Deiridh / Creidiúintí + Cártaí Deiridh / Creidmheasanna Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis - Hook / Beannachtaí + Crúca / Beannachtaí Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis Réamhamharc / Achoimre Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile Seachrán / Scéalta Grinn Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra Ceol: Rannóg Neamh-Cheoil - Le húsáid amháin i bhfíseáin ceoil. Rannóga d\'fhíseáin ceoil gan ceol, nach bhfuil clúdaithe ag catagóir eile cheana féin - Scip + Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile + Scipeáil Aibhsigh - Scip urraitheoir - Scip réamhfhógrán - Scip idirghníomhú - Scip go dtí an buaicphointe - Scip intreoir - Scip idirghabháil - Scip idirghabháil - Scip an forchríoch + Scipeáil urraitheoir + Scipeáil promóisean + Scipeáil idirghníomhú + Scipeáil go dtí aird a tharraingt + Scipeáil réamhrá + Scipeáil briseadh + Scipeáil briseadh + Scipeáil an chuid deiridh Scipeáil crúca - Scip réamhamharc - Scip réamhamharc - Scip an achoimre - Scipeáil imeall - Scip neamh-cheol - Scip deighleog - Urra scipeáilte - Féin-chur chun cinn scipeáilte - Meabhrúchán ciapach scipeáilte - Scipeáilte chun aird a tharraingt - Réamhrá scipeáilte - Idirmheas scipeáilte - Idirmheas scipeáilte - Scipeáilte an forchríoch - Crúca scipeáilte - Scipeáilte an réamhléiriú - Scipeáilte an réamhléiriú - Athbhreithniú scipeáilte - Imeall scipeáilte - Scaoileadh rannán neamh-cheoil + Scipeáil réamhamharc + Scipeáil réamhamharc + Scipeáil achoimre + Scipeáil tadhlaí + Scipeáil neamh-cheol + Scipeáil deighleog + Scipeáilte urraitheoir + Scipeáilte féin-chur chun cinn + Scipeáilte meabhrúchán cráite + Scipeáilte aird a tharraingt + Scipeáilte réamhrá + Scipeáilte briseadh + Scipeáilte briseadh + Scipeáilte an chuid deiridh + Scipeáilte crúca + Scipeáilte réamhamharc + Scipeáilte réamhamharc + Achoimre scipeáilte + Tadhlaí scipeáilte + Scipeáladh cuid nach ceolmhar í Deighleog gan curtha isteach scipeáilte - Scipeáilte go leor deighleoga - Scip go huathoibríoch - Scip go huathoibríoch uair amháin - Taispeáin cnaipe Scipeála + Scipeáilte iomadúil deighleoga + Scipeáil go huathoibríoch + Scipeáil go huathoibríoch uair amháin + Taispeáin cnaipe Scipeáil Taispeáin i mbarra lorg Díchumasaigh Ní féidir deighleog a chur isteach: %s Tá SponsorBlock síos go sealadach Ní féidir deighleog a chur isteach (stádas: %1$d %2$s) - Ní féidir an chuid a chur isteach. Teoranta (ró-iomadú ó úsáideoir nó ó IP céanna) + Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna) Ní féidir an deighleog a chur isteach: %s - "Ní féidir an chuid a chur isteach. + "Ní féidir deighleog a chur isteach. Tá sé ann cheana féin" - Déileog curtha isteach go rathúil + Cuireadh an deighleog isteach go rathúil - Níl SponsorBlock ar fáil go sealadach (API amuigh amach) + Níl SponsorBlock ar fáil go sealadach (API am istigh) Níl SponsorBlock ar fáil go sealadach (stádas %d) Níl SponsorBlock ar fáil go sealadach - Ní féidir vótáil a dhéanamh don deighleog (API amuigh amach) + Ní féidir vótáil don deighleog (API am istigh) Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s) Ní féidir vótáil a dhéanamh don deighleog: %s Vótáil suas @@ -1226,7 +1226,7 @@ Tá sé ann cheana féin" %1$s go %2$s Roghnaigh catagóir deighleog - Tá catagóir díchumasaithe i socruithe. Cumasaigh catagóir a chur isteach. + Catagóir díchumasaithe. Cumasaigh í le cur isteach. Deighleog nua SponsorBlock Socraigh %s mar thús nó deireadh deighleog nua? Tosaigh @@ -1235,36 +1235,36 @@ Tá sé ann cheana féin" Am a thosaíonn an deighleog ag Am a chríochnaíonn an deighleog ag An bhfuil na hamanna ceart? - "Tagann an clipe + "Tá an deighleog ó %1$s -gu chuig +go %2$s (%3$s) -Maithe chun cur isteach?" +Réidh le cur isteach?" Caithfidh an tús a bheith roimh an deireadh Marcáil dhá shuíomh ar an mbarra ama ar dtús - Réamhamharc ar an deighleog, agus cinntigh go scipeánann sé - Cuir uainiú deighleog in eagar + Féach ar an deighleog agus cinntigh léim réidh + Cuir am an deighleog in eagar de láimh Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? Am neamhbhailí tugtha Staitisticí - Níl stats ar fáil go sealadach (tá API síos) - Á lódáil... - Tá SponsorBlock míchumasaithe + Níl staitisticí ar fáil faoi láthair (tá an API síos) + Ag lódáil... + Tá SponsorBlock díchumasaithe D\'ainm úsáideora: <b>%s</b> Tapáil anseo chun d\'ainm úsáideora a athrú Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s - Athraíodh ainm úsáideora - Tá do chlú <b>%.2f</b> + Athraíodh ainm úsáideora go rathúil + Is é do chlú <b>%.2f</b> Chruthaigh tú <b>%s</b> deighleoga - Tapáil anseo chun do mhíreanna a fheiceáil + Tapáil anseo chun do dheighleoga a fheiceáil Clár ceannairí SponsorBlock Tá daoine sábháilte agat ó <b>%s</b> deighleoga - Tapáil anseo chun na stats domhanda agus na rannpháirtithe is fearr a fheiceáil + Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil Rinne tú scipeáil ar <b>%s</b> deighleoga Sin é <b>%s</b> @@ -1275,36 +1275,36 @@ Maithe chun cur isteach?" Teimhneacht: Dath: Maidir - Soláthraíonn an API SponsorBlock sonraí. Tapáil anseo chun níos mó a fhoghlaim agus íoslódálacha a fheiceáil d\'ardáin eile + Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil - Fábos fóirmeanna foirmiúin - Réamhshocrúch - Fón - Táibhléad + Fachtóir foirme leagan amach + Réamhshocrú + Guthán + Táibléad Gluaisteán - "Áirítear ar na hathruithe: + "Áirítear leis na hathruithe: -Leagan amach an táibléid -• Tá postálacha pobail i bhfolach +Leagan amach táibléid +• Tá poist phobail i bhfolach -Leagan amach feithicleach -• Osclaítear Shorts sa ghnáthsheinnteoir -• Eagraítear an fotha de réir topaicí agus bealaí" +Leagan amach gluaisteán +• Gearrscannáin oscailte sa ghnáth-imreoir +• Tá an fotha eagraithe de réir topaicí agus bealaí" - Leagan aip spoof - Leagan spoofed - Leagan gan bhfoláiste - "Déanfar leagan an aip a spoofadh go leagan níos sine de YouTube. + Leagan aip bréige + Leagan bréagach + Leagan gan bréag + "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube. -Athróidh sé seo cuma agus gnéithe an aip, ach d'fhéadfadh fo-iarsmaí anaithnid a bheith ann. +Athróidh sé seo cuma agus gnéithe na haipe, ach d'fhéadfadh fo-iarsmaí anaithnide tarlú. -Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buganna UI a chosc." - Sprioc leagan aip spoof - 20.13.41 - Cuir an barra gníomhaíochta físe neamhchomhbhrúite ar ais - 20.05.46 - Athchóirigh feidhmiúlacht tras-scríbhinne - 19.35.36 - Athchóirigh sean-deilbhíní imreoir Shorts +Má mhúchtar é níos déanaí, moltar sonraí na haipe a ghlanadh chun fabhtanna UI a chosc." + Sprioc leagan aip bréagach + 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú + 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn + 19.35.36 - Athchóirigh deilbhíní sean-imreoir Shorts 19.01.34 - Athchóirigh deilbhíní nascleanúna sean From 7a53f8f62dce9dfbca07d1789c45c6a7f356495c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:25:44 +0400 Subject: [PATCH 07/18] chore(YouTube Music): Simplify fingerprint for upcoming app versions --- .../revanced/patches/shared/misc/audio/Fingerprints.kt | 9 +++------ .../patches/shared/misc/audio/ForceOriginalAudioPatch.kt | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index 78cf1f284..6d6b0b662 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.audio import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags internal val formatStreamModelToStringFingerprint = fingerprint { @@ -20,10 +20,7 @@ internal val formatStreamModelToStringFingerprint = fingerprint { internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L internal val selectAudioStreamFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - custom { method, _ -> - method.parameters.size > 2 // Method has a large number of parameters and may change. - && method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG) + literal { + AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt index 465ce8030..010a7143e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt @@ -34,7 +34,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = internal fun forceOriginalAudioPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, - fixUseLocalizedAudioTrackFlag: () -> Boolean, + fixUseLocalizedAudioTrackFlag: BytecodePatchContext.() -> Boolean, mainActivityOnCreateFingerprint: Fingerprint, subclassExtensionClassDescriptor: String, preferenceScreen: BasePreferenceScreen.Screen From e7336d2ef361cc5d6fe6e8442b36d9cf1f542931 Mon Sep 17 00:00:00 2001 From: Pawloland <59684145+Pawloland@users.noreply.github.com> Date: Fri, 24 Oct 2025 07:27:12 +0200 Subject: [PATCH 08/18] feat: Add `Custom network security` patch (#6151) --- .../CustomCertificatesPatch.kt | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt new file mode 100644 index 000000000..009758977 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt @@ -0,0 +1,182 @@ +package app.revanced.patches.all.misc.customcertificates + +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.booleanOption +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringsOption +import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.getNode +import org.w3c.dom.Element +import java.io.File + + + + +val customNetworkSecurityPatch = resourcePatch( + name = "Custom network security", + description = "Allows trusting custom certificate authorities for a specific domain.", + use = false +) { + + val targetDomains by stringsOption( + key = "targetDomains", + title = "Target domains", + description = "List of domains to which the custom trust configuration will be applied (one domain per entry).", + default = listOf("example.com"), + required = true + ) + + val includeSubdomains by booleanOption( + key = "includeSubdomains", + title = "Include subdomains", + description = "Applies the configuration to all subdomains of the target domains.", + default = false, + required = true + ) + + val customCAFilePaths by stringsOption( + key = "customCAFilePaths", + title = "Custom CA file paths", + description = """ + List of paths to files in PEM or DER format (one file path per entry). + + Makes an app trust the provided custom certificate authorities (CAs), + for the specified domains, and if the option "Include Subdomains" is enabled then also the subdomains. + + + CA files will be bundled in res/raw/ of resulting APK + """.trimIndentMultiline(), + default = null, + required = false + ) + + val allowUserCerts by booleanOption( + key = "allowUserCerts", + title = "Trust user added CAs", + description = "Makes an app trust certificates from the Android user store for the specified domains, and if the option \"Include Subdomains\" is enabled then also the subdomains.", + + default = false, + required = true + ) + + val allowSystemCerts by booleanOption( + key = "allowSystemCerts", + title = "Trust system CAs", + description = "Makes an app trust certificates from the Android system store for the specified domains, and and if the option \"Include Subdomains\" is enabled then also the subdomains.", + + default = true, + required = true + ) + + val allowCleartextTraffic by booleanOption( + key = "allowCleartextTraffic", + title = "Allow cleartext traffic (HTTP)", + description = "Allows unencrypted HTTP traffic for the specified domains, and if \"Include Subdomains\" is enabled then also the subdomains.", + + default = false, + required = true + ) + + val overridePins by booleanOption( + key = "overridePins", + title = "Override certificate pinning", + description = "Overrides certificate pinning for the specified domains and their subdomains if the option \"Include Subdomains\" is enabled to allow inspecting app traffic via a proxy.", + + default = false, + required = true + ) + + fun generateNetworkSecurityConfig(): String { + val targetDomains = targetDomains ?: emptyList() + val includeSubdomains = includeSubdomains ?: false + val customCAFilePaths = customCAFilePaths ?: emptyList() + val allowUserCerts = allowUserCerts ?: false + val allowSystemCerts = allowSystemCerts ?: true + val allowCleartextTraffic = allowCleartextTraffic ?: false + val overridePins = overridePins ?: false + + val domainsXML = buildString { + targetDomains.forEach { + appendLine(""" $it""") + } + }.trimEnd() + + val trustAnchorsXML = buildString { + if (allowSystemCerts) { + appendLine(""" """) + } + if (allowUserCerts) { + appendLine(""" """) + } + customCAFilePaths.forEach { path -> + val fileName = path.substringAfterLast('/').substringBeforeLast('.') + appendLine(""" """) + } + } + + if (trustAnchorsXML.isBlank()) { + throw PatchException("At least one trust anchor (System, User, or Custom CA) must be enabled.") + } + + return """ + + + +$domainsXML + +${trustAnchorsXML.trimEnd()} + + + + """.trimIndent() + } + + + execute { + val nscFileNameBare = "network_security_config" + val resXmlDir = "res/xml" + val resRawDir = "res/raw" + val nscFileNameWithSuffix = "$nscFileNameBare.xml" + + + document("AndroidManifest.xml").use { document -> + val applicationNode = document.getNode("application") as Element + applicationNode.setAttribute("android:networkSecurityConfig", "@xml/$nscFileNameBare") + } + + + File(get(resXmlDir), nscFileNameWithSuffix).apply { + writeText(generateNetworkSecurityConfig()) + } + + + + for (customCAFilePath in customCAFilePaths ?: emptyList()) { + val file = File(customCAFilePath) + if (!file.exists()) { + throw PatchException( + "The custom CA file path cannot be found: " + + file.absolutePath + ) + } + + if (!file.isFile) { + throw PatchException( + "The custom CA file path must be a file: " + + file.absolutePath + ) + } + val caFileNameWithoutSuffix = customCAFilePath.substringAfterLast('/').substringBefore('.') + val caFile = File(customCAFilePath) + File( + get(resRawDir), + caFileNameWithoutSuffix + ).writeText( + caFile.readText() + ) + + } + + + } +} From 591e106098c6eff431b8b7ac7d985ce7373d701e Mon Sep 17 00:00:00 2001 From: hckrman101 Date: Fri, 24 Oct 2025 01:28:34 -0400 Subject: [PATCH 09/18] feat(Duolingo): Add `Skip energy recharge ads` patch (#6167) --- patches/api/patches.api | 4 +++ .../patches/duolingo/energy/Fingerprints.kt | 21 +++++++++++++ .../energy/SkipEnergyRechargeAdsPatch.kt | 31 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 20f74169a..1341b5ff8 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -184,6 +184,10 @@ public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatchKt { public static final fun getEnableDebugMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatchKt { + public static final fun getSkipEnergyRechargeAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatchKt { public static final fun getHideSponsoredStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt new file mode 100644 index 000000000..73dbcf304 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt @@ -0,0 +1,21 @@ +package app.revanced.patches.duolingo.energy + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +/** + * Matches the class found in [energyConfigToStringFingerprint]. + */ +internal val initializeEnergyConfigFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + opcodes(Opcode.RETURN_VOID) +} + +// Class name currently is not obfuscated but it may be in the future. +internal val energyConfigToStringFingerprint = fingerprint { + parameters() + returns("Ljava/lang/String;") + strings("EnergyConfig(", "maxEnergy=") // Partial string matches. + custom { method, _ -> method.name == "toString" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt new file mode 100644 index 000000000..bec800f50 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.duolingo.energy + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.findFieldFromToString + +@Suppress("unused") +val skipEnergyRechargeAdsPatch = bytecodePatch( + name = "Skip energy recharge ads", + description = "Skips watching ads to recharge energy." +) { + compatibleWith("com.duolingo") + + execute { + initializeEnergyConfigFingerprint + .match(energyConfigToStringFingerprint.classDef) + .method.apply { + val energyField = energyConfigToStringFingerprint.method + .findFieldFromToString("energy=") + val insertIndex = initializeEnergyConfigFingerprint.patternMatch!!.startIndex + + addInstructions( + insertIndex, + """ + const/16 v0, 99 + iput v0, p0, $energyField + """ + ) + } + } +} From b8c2ede2bf2397f0920ed358593834e37517d8ab Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 24 Oct 2025 05:32:12 +0000 Subject: [PATCH 10/18] chore: Release v5.44.0-dev.4 [skip ci] # [5.44.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.3...v5.44.0-dev.4) (2025-10-24) ### Features * Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931)) * **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e)) --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d5a1a4ef..a4857ca84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [5.44.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.3...v5.44.0-dev.4) (2025-10-24) + + +### Features + +* Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931)) +* **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e)) + # [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22) diff --git a/gradle.properties b/gradle.properties index 9f1b9a4dc..0c351eeb4 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.44.0-dev.3 +version = 5.44.0-dev.4 From 1502bf752475e9fa67eb7e43796d4e55b43e90e0 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 24 Oct 2025 12:03:24 +0000 Subject: [PATCH 11/18] chore: Release v5.44.0 [skip ci] # [5.44.0](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.44.0) (2025-10-24) ### Bug Fixes * **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634)) * **X / Twitter - Change link sharing domain:** Use bytecode patching to resolve patching with Manager ([#6125](https://github.com/ReVanced/revanced-patches/issues/6125)) ([0af8c8a](https://github.com/ReVanced/revanced-patches/commit/0af8c8a766ae4ba6926404d59da2f14d649f91f7)) * **YouTube - Hide layout components:** Hide new kind of community post ([#6146](https://github.com/ReVanced/revanced-patches/issues/6146)) ([cfd244b](https://github.com/ReVanced/revanced-patches/commit/cfd244b4088daacd2788ec38357ac521e4b296d5)) * **YouTube Music:** Resolve patching 7.29 target ([2e4c6fd](https://github.com/ReVanced/revanced-patches/commit/2e4c6fdcadeef45a80733e374421d52e5e8af910)) ### Features * Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931)) * **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16)) * **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e)) * **Samsung Radio:** Add `Disable device checks` patch ([#6145](https://github.com/ReVanced/revanced-patches/issues/6145)) ([de97562](https://github.com/ReVanced/revanced-patches/commit/de97562c5ddc8ec707761c1e04e74c4e18f9c158)) --- CHANGELOG.md | 18 ++++++++++++++++++ gradle.properties | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4857ca84..069d20a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +# [5.44.0](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.44.0) (2025-10-24) + + +### Bug Fixes + +* **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634)) +* **X / Twitter - Change link sharing domain:** Use bytecode patching to resolve patching with Manager ([#6125](https://github.com/ReVanced/revanced-patches/issues/6125)) ([0af8c8a](https://github.com/ReVanced/revanced-patches/commit/0af8c8a766ae4ba6926404d59da2f14d649f91f7)) +* **YouTube - Hide layout components:** Hide new kind of community post ([#6146](https://github.com/ReVanced/revanced-patches/issues/6146)) ([cfd244b](https://github.com/ReVanced/revanced-patches/commit/cfd244b4088daacd2788ec38357ac521e4b296d5)) +* **YouTube Music:** Resolve patching 7.29 target ([2e4c6fd](https://github.com/ReVanced/revanced-patches/commit/2e4c6fdcadeef45a80733e374421d52e5e8af910)) + + +### Features + +* Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931)) +* **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16)) +* **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e)) +* **Samsung Radio:** Add `Disable device checks` patch ([#6145](https://github.com/ReVanced/revanced-patches/issues/6145)) ([de97562](https://github.com/ReVanced/revanced-patches/commit/de97562c5ddc8ec707761c1e04e74c4e18f9c158)) + # [5.44.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.3...v5.44.0-dev.4) (2025-10-24) diff --git a/gradle.properties b/gradle.properties index 0c351eeb4..0ec315418 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.44.0-dev.4 +version = 5.44.0 From c1681f982aaa3a05499b3b3f4ebfdd8b4e590560 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 25 Oct 2025 08:11:57 +0400 Subject: [PATCH 12/18] chore: Dump api --- patches/api/patches.api | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/patches/api/patches.api b/patches/api/patches.api index 1341b5ff8..14907b9d1 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -60,6 +60,10 @@ public final class app/revanced/patches/all/misc/connectivity/wifi/spoof/SpoofWi public static final fun getSpoofWifiPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatchKt { + public static final fun getCustomNetworkSecurityPatch ()Lapp/revanced/patcher/patch/ResourcePatch; +} + public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggingPatchKt { public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } From c73a03c9e18a12262939c974cdf16221221d1487 Mon Sep 17 00:00:00 2001 From: rospino74 <34315725+rospino74@users.noreply.github.com> Date: Sun, 26 Oct 2025 11:01:06 +0100 Subject: [PATCH 13/18] fix(Instagram): Update failing fingerprints on newer versions (#6181) --- .../revanced/patches/instagram/hide/navigation/Fingerprints.kt | 3 ++- .../patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt index efbdaf597..cc762c123 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -3,9 +3,10 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext +import com.android.tools.smali.dexlib2.AccessFlags internal val initializeNavigationButtonsListFingerprint = fingerprint { - strings("Nav3") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Lcom/instagram/common/session/UserSession;", "Z") returns("Ljava/util/List;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt index 4f594478d..e9577477a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt @@ -24,7 +24,7 @@ val enableDeveloperMenuPatch = bytecodePatch( with(clearNotificationReceiverFingerprint.method) { indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverFingerprint.stringMatches!!.first().index) { val reference = getReference() - Opcode.INVOKE_STATIC == opcode && + opcode in listOf(Opcode.INVOKE_STATIC, Opcode.INVOKE_STATIC_RANGE) && reference?.parameterTypes?.size == 1 && reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && reference.returnType == "Z" From ef44eaa119b9d6c5faec051e22d20f883d0da4f1 Mon Sep 17 00:00:00 2001 From: hxreborn <32096750+hxreborn@users.noreply.github.com> Date: Sun, 26 Oct 2025 11:01:32 +0100 Subject: [PATCH 14/18] feat(TikTok): Add `Sanitize sharing links` patch (#6176) --- .../shared/privacy/LinkSanitizer.java | 13 ++- .../ExtensionPreferenceCategory.java | 6 ++ .../tiktok/share/ShareUrlSanitizer.java | 29 +++++++ patches/api/patches.api | 4 + .../patches/tiktok/misc/share/Fingerprints.kt | 25 ++++++ .../misc/share/SanitizeShareUrlsPatch.kt | 85 +++++++++++++++++++ 6 files changed, 155 insertions(+), 7 deletions(-) create mode 100644 extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java index 9cfa05c1b..853ced003 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java @@ -17,9 +17,6 @@ public class LinkSanitizer { public LinkSanitizer(String ... parametersToRemove) { final int parameterCount = parametersToRemove.length; - if (parameterCount == 0) { - throw new IllegalArgumentException("No parameters specified"); - } // List is faster if only checking a few parameters. this.parametersToRemove = parameterCount > 4 @@ -40,10 +37,12 @@ public class LinkSanitizer { try { Uri.Builder builder = uri.buildUpon().clearQuery(); - for (String paramName : uri.getQueryParameterNames()) { - if (!parametersToRemove.contains(paramName)) { - for (String value : uri.getQueryParameters(paramName)) { - builder.appendQueryParameter(paramName, value); + if (!parametersToRemove.isEmpty()) { + for (String paramName : uri.getQueryParameterNames()) { + if (!parametersToRemove.contains(paramName)) { + for (String value : uri.getQueryParameters(paramName)) { + builder.appendQueryParameter(paramName, value); + } } } } diff --git a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java index 60d7983ea..7383a5582 100644 --- a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java +++ b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/preference/categories/ExtensionPreferenceCategory.java @@ -23,6 +23,12 @@ public class ExtensionPreferenceCategory extends ConditionalPreferenceCategory { public void addPreferences(Context context) { addPreference(new ReVancedTikTokAboutPreference(context)); + addPreference(new TogglePreference(context, + "Sanitize sharing links", + "Remove tracking parameters from shared links.", + BaseSettings.SANITIZE_SHARED_LINKS + )); + addPreference(new TogglePreference(context, "Enable debug log", "Show extension debug log.", diff --git a/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java new file mode 100644 index 000000000..5d09c10c0 --- /dev/null +++ b/extensions/tiktok/src/main/java/app/revanced/extension/tiktok/share/ShareUrlSanitizer.java @@ -0,0 +1,29 @@ +package app.revanced.extension.tiktok.share; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.privacy.LinkSanitizer; +import app.revanced.extension.shared.settings.BaseSettings; + +@SuppressWarnings("unused") +public final class ShareUrlSanitizer { + + private static final LinkSanitizer sanitizer = new LinkSanitizer(); + + /** + * Injection point for setting check. + */ + public static boolean shouldSanitize() { + return BaseSettings.SANITIZE_SHARED_LINKS.get(); + } + + /** + * Injection point for URL sanitization. + */ + public static String sanitizeShareUrl(final String url) { + if (url == null || url.isEmpty()) { + return url; + } + + return sanitizer.sanitizeUrlString(url); + } +} diff --git a/patches/api/patches.api b/patches/api/patches.api index 14907b9d1..9c3b806d3 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1188,6 +1188,10 @@ public final class app/revanced/patches/tiktok/misc/settings/SettingsPatchKt { public static final fun getSettingsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatchKt { + public static final fun getSanitizeShareUrlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatchKt { public static final fun getSpoofSimPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt new file mode 100644 index 000000000..836be8900 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt @@ -0,0 +1,25 @@ +package app.revanced.patches.tiktok.misc.share + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +internal val urlShorteningFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) + returns("LX/") + parameters( + "I", + "Ljava/lang/String;", + "Ljava/lang/String;", + "Ljava/lang/String;" + ) + opcodes(Opcode.RETURN_OBJECT) + + // Same Kotlin intrinsics literal on both variants. + strings("getShortShareUrlObservab\u2026ongUrl, subBizSceneValue)") + + custom { method, _ -> + // LIZLLL is obfuscated by ProGuard/R8, but stable across both TikTok and Musically. + method.name == "LIZLLL" + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt new file mode 100644 index 000000000..fd616141c --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/SanitizeShareUrlsPatch.kt @@ -0,0 +1,85 @@ +package app.revanced.patches.tiktok.misc.share + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS +import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch +import app.revanced.util.findFreeRegister +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/tiktok/share/ShareUrlSanitizer;" + +@Suppress("unused") +val sanitizeShareUrlsPatch = bytecodePatch( + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, +) { + dependsOn(sharedExtensionPatch) + + compatibleWith( + "com.ss.android.ugc.trill"("36.5.4"), + "com.zhiliaoapp.musically"("36.5.4"), + ) + + execute { + urlShorteningFingerprint.method.apply { + val invokeIndex = indexOfFirstInstructionOrThrow { + val ref = getReference() + ref?.name == "LIZ" && ref.definingClass.startsWith("LX/") + } + + val moveResultIndex = indexOfFirstInstructionOrThrow(invokeIndex, Opcode.MOVE_RESULT_OBJECT) + val urlRegister = getInstruction(moveResultIndex).registerA + + // Resolve Observable wrapper classes at runtime + val observableWrapperIndex = indexOfFirstInstructionOrThrow(Opcode.NEW_INSTANCE) + val observableWrapperClass = getInstruction(observableWrapperIndex) + .reference.toString() + + val observableFactoryIndex = indexOfFirstInstructionOrThrow { + val ref = getReference() + ref?.name == "LJ" && ref.definingClass.startsWith("LX/") + } + val observableFactoryRef = getInstruction(observableFactoryIndex) + .reference as MethodReference + + val observableFactoryClass = observableFactoryRef.definingClass + val observableInterfaceType = observableFactoryRef.parameterTypes.first() + val observableReturnType = observableFactoryRef.returnType + + val wrapperRegister = findFreeRegister(moveResultIndex + 1, urlRegister) + + // Check setting and conditionally sanitize share URL. + addInstructionsWithLabels( + moveResultIndex + 1, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldSanitize()Z + move-result v$wrapperRegister + if-eqz v$wrapperRegister, :skip_sanitization + + invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->sanitizeShareUrl(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$urlRegister + + # Wrap sanitized URL and return early to bypass ShareExtService + new-instance v$wrapperRegister, $observableWrapperClass + invoke-direct { v$wrapperRegister, v$urlRegister }, $observableWrapperClass->(Ljava/lang/String;)V + invoke-static { v$wrapperRegister }, $observableFactoryClass->LJ($observableInterfaceType)$observableReturnType + move-result-object v$urlRegister + return-object v$urlRegister + + :skip_sanitization + nop + """ + ) + } + } +} From a32ed30b4c5b0b1c9239b1cb1a7aeb06c1a2eb3c Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 26 Oct 2025 10:05:58 +0000 Subject: [PATCH 15/18] chore: Release v5.45.0-dev.1 [skip ci] # [5.45.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.44.0...v5.45.0-dev.1) (2025-10-26) ### Bug Fixes * **Instagram:** Update failing fingerprints on newer versions ([#6181](https://github.com/ReVanced/revanced-patches/issues/6181)) ([c73a03c](https://github.com/ReVanced/revanced-patches/commit/c73a03c9e18a12262939c974cdf16221221d1487)) ### Features * **TikTok:** Add `Sanitize sharing links` patch ([#6176](https://github.com/ReVanced/revanced-patches/issues/6176)) ([ef44eaa](https://github.com/ReVanced/revanced-patches/commit/ef44eaa119b9d6c5faec051e22d20f883d0da4f1)) --- CHANGELOG.md | 12 ++++++++++++ gradle.properties | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 069d20a74..7d8224d13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# [5.45.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.44.0...v5.45.0-dev.1) (2025-10-26) + + +### Bug Fixes + +* **Instagram:** Update failing fingerprints on newer versions ([#6181](https://github.com/ReVanced/revanced-patches/issues/6181)) ([c73a03c](https://github.com/ReVanced/revanced-patches/commit/c73a03c9e18a12262939c974cdf16221221d1487)) + + +### Features + +* **TikTok:** Add `Sanitize sharing links` patch ([#6176](https://github.com/ReVanced/revanced-patches/issues/6176)) ([ef44eaa](https://github.com/ReVanced/revanced-patches/commit/ef44eaa119b9d6c5faec051e22d20f883d0da4f1)) + # [5.44.0](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.44.0) (2025-10-24) diff --git a/gradle.properties b/gradle.properties index 0ec315418..71023d3f0 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.44.0 +version = 5.45.0-dev.1 From 6d01863ec70617d9abc864ce6686ed9764dd151d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 26 Oct 2025 19:23:04 +0400 Subject: [PATCH 16/18] fix(YouTube - Force original audio): Fall back to visionOS and not Android Studio if Android VR is not available --- .../extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index ef8069e85..30ef6c0b8 100644 --- 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 @@ -38,9 +38,9 @@ public class SpoofVideoStreamsPatch { } List availableClients = List.of( + VISIONOS, ANDROID_CREATOR, ANDROID_VR_1_43_32, - VISIONOS, IPADOS); app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse( From 13cf1724bf2f946c7129cab0db96721c90f9fe89 Mon Sep 17 00:00:00 2001 From: MarcaD <152095496+MarcaDian@users.noreply.github.com> Date: Sun, 26 Oct 2025 17:23:40 +0200 Subject: [PATCH 17/18] fix(YouTube Music - Hide category bar): Correctly hide the category bar in newer app targets (#6175) --- .../music/patches/HideCastButtonPatch.java | 2 +- .../music/patches/HideCategoryBarPatch.java | 7 +++-- .../layout/compactheader/Fingerprints.kt | 16 ++++------ .../layout/compactheader/HideCategoryBar.kt | 31 +++++++++---------- 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCastButtonPatch.java b/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCastButtonPatch.java index d694891ab..ab03ba8e4 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCastButtonPatch.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCastButtonPatch.java @@ -19,6 +19,6 @@ public class HideCastButtonPatch { * Injection point */ public static void hideCastButton(View view) { - hideViewBy0dpUnderCondition(Settings.HIDE_CAST_BUTTON.get(), view); + hideViewBy0dpUnderCondition(Settings.HIDE_CAST_BUTTON, view); } } diff --git a/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCategoryBarPatch.java b/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCategoryBarPatch.java index f0433ccb1..79d772096 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCategoryBarPatch.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/patches/HideCategoryBarPatch.java @@ -1,5 +1,8 @@ package app.revanced.extension.music.patches; +import static app.revanced.extension.shared.Utils.hideViewBy0dpUnderCondition; + +import android.view.View; import app.revanced.extension.music.settings.Settings; @SuppressWarnings("unused") @@ -8,7 +11,7 @@ public class HideCategoryBarPatch { /** * Injection point */ - public static boolean hideCategoryBar() { - return Settings.HIDE_CATEGORY_BAR.get(); + public static void hideCategoryBar(View view) { + hideViewBy0dpUnderCondition(Settings.HIDE_CATEGORY_BAR, view); } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt index 234078c2a..76e03d2c9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt @@ -1,20 +1,16 @@ package app.revanced.patches.music.layout.compactheader import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.util.literal -internal val constructCategoryBarFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) +internal val chipCloudFingerprint = fingerprint { returns("V") - parameters("Landroid/content/Context;", "L", "L", "L") opcodes( - Opcode.IPUT_OBJECT, Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.CONST, - Opcode.INVOKE_VIRTUAL + Opcode.CONST_4, + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT_OBJECT ) + literal { chipCloud } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt index 7668c9dc7..5a6270551 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt @@ -1,6 +1,6 @@ package app.revanced.patches.music.layout.compactheader -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources @@ -8,10 +8,14 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch +import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.util.findFreeRegister import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +internal var chipCloud = -1L + private set + private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCategoryBarPatch;" @Suppress("unused") @@ -33,28 +37,21 @@ val hideCategoryBar = bytecodePatch( ) execute { + chipCloud = resourceMappings["layout", "chip_cloud"] + addResources("music", "layout.compactheader.hideCategoryBar") PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_music_hide_category_bar"), ) - constructCategoryBarFingerprint.method.apply { - val insertIndex = constructCategoryBarFingerprint.patternMatch!!.startIndex - val register = getInstruction(insertIndex - 1).registerA - val freeRegister = findFreeRegister(insertIndex, register) + chipCloudFingerprint.method.apply { + val targetIndex = chipCloudFingerprint.patternMatch!!.endIndex + val targetRegister = getInstruction(targetIndex).registerA - addInstructionsWithLabels( - insertIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideCategoryBar()Z - move-result v$freeRegister - if-eqz v$freeRegister, :show - const/16 v$freeRegister, 0x8 - invoke-virtual { v$register, v$freeRegister }, Landroid/view/View;->setVisibility(I)V - :show - nop - """ + addInstruction( + targetIndex + 1, + "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideCategoryBar(Landroid/view/View;)V" ) } } From 1b38b1a3c85bc5230008a2819d907a241ac84fcc Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 26 Oct 2025 15:27:23 +0000 Subject: [PATCH 18/18] chore: Release v5.45.0-dev.2 [skip ci] # [5.45.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.1...v5.45.0-dev.2) (2025-10-26) ### Bug Fixes * **YouTube - Force original audio:** Fall back to visionOS and not Android Studio if Android VR is not available ([6d01863](https://github.com/ReVanced/revanced-patches/commit/6d01863ec70617d9abc864ce6686ed9764dd151d)) * **YouTube Music - Hide category bar:** Correctly hide the category bar in newer app targets ([#6175](https://github.com/ReVanced/revanced-patches/issues/6175)) ([13cf172](https://github.com/ReVanced/revanced-patches/commit/13cf1724bf2f946c7129cab0db96721c90f9fe89)) --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d8224d13..c8788c5aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [5.45.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.45.0-dev.1...v5.45.0-dev.2) (2025-10-26) + + +### Bug Fixes + +* **YouTube - Force original audio:** Fall back to visionOS and not Android Studio if Android VR is not available ([6d01863](https://github.com/ReVanced/revanced-patches/commit/6d01863ec70617d9abc864ce6686ed9764dd151d)) +* **YouTube Music - Hide category bar:** Correctly hide the category bar in newer app targets ([#6175](https://github.com/ReVanced/revanced-patches/issues/6175)) ([13cf172](https://github.com/ReVanced/revanced-patches/commit/13cf1724bf2f946c7129cab0db96721c90f9fe89)) + # [5.45.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.44.0...v5.45.0-dev.1) (2025-10-26) diff --git a/gradle.properties b/gradle.properties index 71023d3f0..16f71b818 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.45.0-dev.1 +version = 5.45.0-dev.2