Compare commits

..

21 Commits

Author SHA1 Message Date
semantic-release-bot
543464f159 chore(release): 2.58.0 [skip ci]
# [2.58.0](https://github.com/oSumAtrIX/revanced-patches/compare/v2.57.0...v2.58.0) (2022-09-17)

### Features

* migrate to `osumatrix/revanced-patcher` dependency ([d20a2d9](331107288d))
2022-09-17 02:31:44 +00:00
oSumAtrIX
de2f9c9d83 build: bump patcher dependency version
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-17 04:28:44 +02:00
oSumAtrIX
b2bca0167a refactor(custom-branding): use getValue operator for options
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-17 04:26:29 +02:00
oSumAtrIX
2f1fef0449 Merge remote-tracking branch 'revanced/main'
# Conflicts:
#	src/main/kotlin/app/revanced/patches/youtube/layout/amoled/patch/AmoledPatch.kt
#	src/main/kotlin/app/revanced/patches/youtube/layout/customthemes/patch/CustomThemePatch.kt
2022-09-17 04:20:49 +02:00
semantic-release-bot
e8848171ac chore(release): 2.57.0 [skip ci]
# [2.57.0](https://github.com/revanced/revanced-patches/compare/v2.56.1...v2.57.0) (2022-09-16)

### Features

* **amoled:** remove in favour of `theme` patch ([0032301](47fbe3cb25))
* **theme:** arbitrary background color for dark theme ([afd5502](1791525b54))
2022-09-16 00:13:24 +00:00
oSumAtrIX
249288c8a5 docs(theme): proper wording in description
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-16 02:10:50 +02:00
oSumAtrIX
1791525b54 feat(theme): arbitrary background color for dark theme
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-16 02:10:19 +02:00
oSumAtrIX
47fbe3cb25 feat(amoled): remove in favour of theme patch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-16 02:09:19 +02:00
semantic-release-bot
89235ca7fa chore(release): 2.56.1 [skip ci]
## [2.56.1](https://github.com/revanced/revanced-patches/compare/v2.56.0...v2.56.1) (2022-09-15)

### Bug Fixes

* `auto-captions` patch switch description ([#488](https://github.com/revanced/revanced-patches/issues/488)) ([57824fb](f63abb8eb3))
2022-09-15 14:28:30 +00:00
OxrxL
f63abb8eb3 fix: auto-captions patch switch description (#488) 2022-09-15 16:25:57 +02:00
semantic-release-bot
b701f86fa1 chore(release): 2.56.0 [skip ci]
# [2.56.0](https://github.com/revanced/revanced-patches/compare/v2.55.0...v2.56.0) (2022-09-15)

### Features

* **tiktok-download:** custom download path ([#479](https://github.com/revanced/revanced-patches/issues/479)) ([944aa48](3117ee7ba4))
2022-09-15 14:06:07 +00:00
d4rkk3y
3117ee7ba4 feat(tiktok-download): custom download path (#479) 2022-09-15 16:04:20 +02:00
semantic-release-bot
b8e084b9e1 chore(release): 2.55.0 [skip ci]
# [2.55.0](https://github.com/revanced/revanced-patches/compare/v2.54.1...v2.55.0) (2022-09-15)

### Features

* `disable-auto-captions` patch ([#435](https://github.com/revanced/revanced-patches/issues/435)) ([8ee12d0](bafeff84c2))
2022-09-15 01:02:51 +00:00
OxrxL
bafeff84c2 feat: disable-auto-captions patch (#435) 2022-09-15 03:00:19 +02:00
semantic-release-bot
8d193786cb chore(release): 2.54.1 [skip ci]
## [2.54.1](https://github.com/revanced/revanced-patches/compare/v2.54.0...v2.54.1) (2022-09-14)

### Bug Fixes

* alignment of download button icon ([#477](https://github.com/revanced/revanced-patches/issues/477)) ([2093f11](d78d271967))
2022-09-14 16:03:59 +00:00
Ushie
d78d271967 fix: alignment of download button icon (#477) 2022-09-14 18:02:11 +02:00
semantic-release-bot
59ea2bc636 chore(release): 2.54.0 [skip ci]
# [2.54.0](https://github.com/revanced/revanced-patches/compare/v2.53.0...v2.54.0) (2022-09-14)

### Features

* bump YouTube Music patches to v5.23.50 ([#462](https://github.com/revanced/revanced-patches/issues/462)) ([15c10b1](e8b550f5aa))
2022-09-14 13:48:11 +00:00
Suraj Anil Yadav
e8b550f5aa feat: bump YouTube Music patches to v5.23.50 (#462) 2022-09-14 15:46:25 +02:00
oSumAtrIX
5a058ebcf1 docs: add missing section for patches [skip ci]
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-13 21:36:56 +02:00
oSumAtrIX
011f413088 docs: add differences section in README
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-13 21:36:56 +02:00
oSumAtrIX
331107288d feat: migrate to osumatrix/revanced-patcher dependency
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-13 21:36:44 +02:00
30 changed files with 465 additions and 156 deletions

View File

@@ -1,3 +1,53 @@
# [2.58.0](https://github.com/oSumAtrIX/revanced-patches/compare/v2.57.0...v2.58.0) (2022-09-17)
### Features
* migrate to `osumatrix/revanced-patcher` dependency ([d20a2d9](https://github.com/oSumAtrIX/revanced-patches/commit/d20a2d961896d84180d4573aae0aa8128cce5a22))
# [2.57.0](https://github.com/revanced/revanced-patches/compare/v2.56.1...v2.57.0) (2022-09-16)
### Features
* **amoled:** remove in favour of `theme` patch ([0032301](https://github.com/revanced/revanced-patches/commit/00323010ed7356a639e4e86916dcbae96a53f7f6))
* **theme:** arbitrary background color for dark theme ([afd5502](https://github.com/revanced/revanced-patches/commit/afd5502afdb207d5f52516653869b26fae7e5d21))
## [2.56.1](https://github.com/revanced/revanced-patches/compare/v2.56.0...v2.56.1) (2022-09-15)
### Bug Fixes
* `auto-captions` patch switch description ([#488](https://github.com/revanced/revanced-patches/issues/488)) ([57824fb](https://github.com/revanced/revanced-patches/commit/57824fb16c56889d8f18299e9bab2563bb13e5c2))
# [2.56.0](https://github.com/revanced/revanced-patches/compare/v2.55.0...v2.56.0) (2022-09-15)
### Features
* **tiktok-download:** custom download path ([#479](https://github.com/revanced/revanced-patches/issues/479)) ([944aa48](https://github.com/revanced/revanced-patches/commit/944aa485cec513faa30a21b91887dcacf9d70b45))
# [2.55.0](https://github.com/revanced/revanced-patches/compare/v2.54.1...v2.55.0) (2022-09-15)
### Features
* `disable-auto-captions` patch ([#435](https://github.com/revanced/revanced-patches/issues/435)) ([8ee12d0](https://github.com/revanced/revanced-patches/commit/8ee12d0beadfd0a8fdce0a331646e8786527e84d))
## [2.54.1](https://github.com/revanced/revanced-patches/compare/v2.54.0...v2.54.1) (2022-09-14)
### Bug Fixes
* alignment of download button icon ([#477](https://github.com/revanced/revanced-patches/issues/477)) ([2093f11](https://github.com/revanced/revanced-patches/commit/2093f11e762c471a0987fb57f03c7f48d565fdce))
# [2.54.0](https://github.com/revanced/revanced-patches/compare/v2.53.0...v2.54.0) (2022-09-14)
### Features
* bump YouTube Music patches to v5.23.50 ([#462](https://github.com/revanced/revanced-patches/issues/462)) ([15c10b1](https://github.com/revanced/revanced-patches/commit/15c10b1e0368a021b0f2ec46bc2e9ea84a5d5afd))
# [2.53.0](https://github.com/revanced/revanced-patches/compare/v2.52.3...v2.53.0) (2022-09-13)

View File

@@ -1,12 +1,18 @@
## 🧩 Patches
The official Patch bundle provided by ReVanced and the community.
Patch bundle provided by ReVanced and the community.
> Looking for the JSON variant of this? [Click here](patches.json).
### ⛏ Differences to [revanced/revanced-patches](https://github.com/revanced/revanced-patches)
- Based on [osumatrix/revanced-patcher](https://github.com/osumatrix/revanced-patcher)
- Minor QoL refactoring
- Several additional patches
### 💊 Patches
{{ table }}
## 📝 JSON Format
### 📝 JSON Format
This section explains the JSON format for the [patches.json](patches.json) file.

View File

@@ -1,8 +1,14 @@
## 🧩 Patches
The official Patch bundle provided by ReVanced and the community.
Patch bundle provided by ReVanced and the community.
> Looking for the JSON variant of this? [Click here](patches.json).
### ⛏ Differences to [revanced/revanced-patches](https://github.com/revanced/revanced-patches)
- Based on [osumatrix/revanced-patcher](https://github.com/osumatrix/revanced-patcher)
- Minor QoL refactoring
- Several additional patches
### 💊 Patches
### 📦 `com.twitter.android`
<details>
@@ -34,16 +40,16 @@ The official Patch bundle provided by ReVanced and the community.
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.22.54 |
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.22.54 |
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.22.54 |
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.22.54 |
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.22.54 |
| `background-play` | Enables playing music in the background. | 5.22.54 |
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.22.54 |
| `music-video-ads` | Removes ads in the music player. | 5.22.54 |
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.22.54 |
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.22.54 |
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.23.50 |
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.23.50 |
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.23.50 |
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.23.50 |
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.23.50 |
| `background-play` | Enables playing music in the background. | 5.23.50 |
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.23.50 |
| `music-video-ads` | Removes ads in the music player. | 5.23.50 |
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.23.50 |
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.23.50 |
</details>
### 📦 `de.dwd.warnapp`
@@ -59,7 +65,7 @@ The official Patch bundle provided by ReVanced and the community.
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `tiktok-download` | Remove restrictions on downloads video. | all |
| `tiktok-download` | Removes download restrictions and changes the default path to download to. | all |
| `tiktok-seekbar` | Show progress bar for all video. | all |
| `tiktok-ads` | Removes ads from TikTok. | all |
</details>
@@ -69,7 +75,7 @@ The official Patch bundle provided by ReVanced and the community.
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `tiktok-download` | Remove restrictions on downloads video. | all |
| `tiktok-download` | Removes download restrictions and changes the default path to download to. | all |
| `tiktok-seekbar` | Show progress bar for all video. | all |
| `tiktok-ads` | Removes ads from TikTok. | all |
</details>
@@ -82,7 +88,6 @@ The official Patch bundle provided by ReVanced and the community.
| `swipe-controls` | Adds volume and brightness swipe controls. | 17.33.42 |
| `downloads` | Enables downloading music and videos from YouTube. | 17.33.42 |
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 17.33.42 |
| `amoled` | Enables pure black theme. | all |
| `disable-create-button` | Hides the create button in the navigation bar. | 17.33.42 |
| `hide-cast-button` | Hides the cast button in the video player. | all |
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.33.42 |
@@ -91,12 +96,13 @@ The official Patch bundle provided by ReVanced and the community.
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 17.33.42 |
| `old-quality-layout` | Enables the original quality flyout menu. | 17.33.42 |
| `theme` | Enables a custom theme. | all |
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 17.33.42 |
| `hide-watermark` | Hides creator's watermarks on videos. | 17.33.42 |
| `sponsorblock` | Integrate SponsorBlock. | 17.33.42 |
| `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 17.33.42 |
| `custom-theme` | Applies a custom theme. | all |
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.33.42 |
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 17.33.42 |
| `minimized-playback` | Enables minimized and background playback. | 17.33.42 |
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.33.42 |
@@ -122,7 +128,7 @@ The official Patch bundle provided by ReVanced and the community.
## 📝 JSON Format
### 📝 JSON Format
This section explains the JSON format for the [patches.json](patches.json) file.

View File

@@ -11,7 +11,14 @@ repositories {
mavenCentral()
mavenLocal()
maven {
url = uri("https://maven.pkg.github.com/revanced/revanced-patcher")
url = uri("https://maven.pkg.github.com/osumatrix/revanced-patcher")
credentials {
username = githubUsername
password = githubPassword
}
}
maven {
url = uri("https://maven.pkg.github.com/revanced/multidexlib2")
credentials {
username = githubUsername
password = githubPassword
@@ -20,7 +27,7 @@ repositories {
}
dependencies {
implementation("app.revanced:revanced-patcher:4.2.3")
implementation("app.revanced:revanced-patcher:4.5.0")
implementation("app.revanced:multidexlib2:2.5.2.r2")
// Required for meta

View File

@@ -1,2 +1,2 @@
kotlin.code.style = official
version = 2.53.0
version = 2.58.0

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -10,7 +10,7 @@ import app.revanced.patcher.annotation.Package
*/
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54")
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50")
)]
)
@Target(AnnotationTarget.CLASS)

View File

@@ -0,0 +1,23 @@
package app.revanced.patches.tiktok.interaction.downloads.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.interaction.downloads.annotations.DownloadsCompatibility
import org.jf.dexlib2.AccessFlags
@Name("download-path-parent-fingerprint")
@MatchingMethod("LX/4bF;", "LIZ")
@DownloadsCompatibility
@Version("0.0.1")
object DownloadPathParentFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.FINAL,
strings = listOf(
"code",
"reason",
"params insufficient"
)
)

View File

@@ -4,24 +4,34 @@ import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.data.impl.toMethodWalker
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.extensions.replaceInstructions
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.tiktok.interaction.downloads.annotations.DownloadsCompatibility
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.*
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint2
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint3
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.DownloadPathParentFingerprint
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.reference.StringReference
@Patch
@Name("tiktok-download")
@Description("Remove restrictions on downloads video.")
@Description("Removes download restrictions and changes the default path to download to.")
@DownloadsCompatibility
@Version("0.0.1")
class DownloadsPatch : BytecodePatch(
listOf(
ACLCommonShareFingerprint,
ACLCommonShareFingerprint2,
ACLCommonShareFingerprint3
ACLCommonShareFingerprint3,
DownloadPathParentFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
@@ -50,7 +60,76 @@ class DownloadsPatch : BytecodePatch(
return v0
"""
)
//Change the download path patch
val method4 = DownloadPathParentFingerprint.result!!.mutableMethod
val implementation4 = method4.implementation
val instructions = implementation4!!.instructions
var targetOffset = -1
//Search for the target method called instruction offset.
for ((index, instruction) in instructions.withIndex()) {
if (instruction.opcode != Opcode.CONST_STRING) continue
val reference = (instruction as ReferenceInstruction).reference as StringReference
if (reference.string != "video/mp4") continue
val targetInstruction = instructions[index + 1]
if (targetInstruction.opcode != Opcode.INVOKE_STATIC) continue
targetOffset = index + 1
break
}
if (targetOffset == -1) return PatchResultError("Can not find download path uri method.")
//Change videos' download path.
val downloadPath = "$downloadPathParent/$downloadPathChild"
val downloadUriMethod = data
.toMethodWalker(DownloadPathParentFingerprint.result!!.method)
.nextMethod(targetOffset, true)
.getMethod() as MutableMethod
downloadUriMethod.implementation!!.instructions.forEachIndexed { index, instruction ->
if (instruction.opcode == Opcode.SGET_OBJECT) {
val overrideRegister = (instruction as OneRegisterInstruction).registerA
downloadUriMethod.replaceInstruction(
index,
"""
const-string v$overrideRegister, "$downloadPath"
"""
)
}
if (instruction.opcode == Opcode.CONST_STRING) {
val string = ((instruction as ReferenceInstruction).reference as StringReference).string
if (string.contains("/Camera")) {
val overrideRegister = (instruction as OneRegisterInstruction).registerA
val overrideString = string.replace("/Camera", "")
downloadUriMethod.replaceInstruction(
index,
"""
const-string v$overrideRegister, "$overrideString"
"""
)
}
}
}
return PatchResultSuccess()
}
companion object : OptionsContainer() {
private var downloadPathParent: String? by option(
PatchOption.StringListOption(
key = "mediaFolder",
default = "DCIM",
options = listOf(
"DCIM", "Movies", "Pictures"
),
title = "Media folder",
description = "The media root folder to download to.",
required = true
)
)
private var downloadPathChild: String? by option(
PatchOption.StringOption(
key = "downloadPath",
default = "TikTok",
title = "Download path",
description = "Download path relative to the media folder.",
required = true
)
)
}
}

View File

@@ -1,28 +0,0 @@
package app.revanced.patches.youtube.layout.amoled.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.PatchDeprecated
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.youtube.layout.amoled.annotations.AmoledCompatibility
import app.revanced.patches.youtube.layout.theme.patch.ThemePatch
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
@Patch
@DependsOn([FixLocaleConfigErrorPatch::class])
@Name("amoled")
@Description("Enables pure black theme.")
@AmoledCompatibility
@Version("0.0.1")
@PatchDeprecated("Theme patch already includes the Amoled theme.", ThemePatch::class)
class AmoledPatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult {
ThemePatch.theme = ThemePatch.Themes.Amoled.name
return ThemePatch().execute(data)
}
}

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.youtube.layout.autocaptions.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.youtube", arrayOf("17.25.34", "17.26.35", "17.27.39", "17.28.34", "17.29.34", "17.32.35", "17.33.42")
)]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class AutoCaptionsCompatibility

View File

@@ -0,0 +1,40 @@
package app.revanced.patches.youtube.layout.autocaptions.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.layout.autocaptions.annotations.AutoCaptionsCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("start-video-informer-fingerprint")
@MatchingMethod("Laaxf;", "d")
@FuzzyPatternScanMethod(3)
@AutoCaptionsCompatibility
@Version("0.0.1")
object StartVideoInformerFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L", "L", "L", "L"), listOf(
Opcode.INVOKE_STATIC,
Opcode.IGET_OBJECT,
Opcode.IGET_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.INVOKE_INTERFACE,
Opcode.IF_EQZ,
Opcode.CONST_STRING,
Opcode.INVOKE_INTERFACE,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.CONST_4,
Opcode.IF_EQ,
Opcode.GOTO,
)
)

View File

@@ -0,0 +1,28 @@
package app.revanced.patches.youtube.layout.autocaptions.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.layout.autocaptions.annotations.AutoCaptionsCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("subtitle-button-controller-fingerprint")
@MatchingMethod("Lcom/google/android/apps/youtube/app/player/overlay/SubtitleButtonController;", "E")
@AutoCaptionsCompatibility
@Version("0.0.1")
object SubtitleButtonControllerFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("L"), listOf(
Opcode.IGET_OBJECT,
Opcode.IF_NEZ,
Opcode.RETURN_VOID,
Opcode.IGET_BOOLEAN,
Opcode.CONST_4,
Opcode.IF_NEZ,
Opcode.CONST,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
)
)

View File

@@ -0,0 +1,26 @@
package app.revanced.patches.youtube.layout.autocaptions.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.layout.autocaptions.annotations.AutoCaptionsCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("subtitle-track-fingerprint")
@MatchingMethod("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;", "t")
@AutoCaptionsCompatibility
@Version("0.0.1")
object SubtitleTrackFingerprint : MethodFingerprint(
"Z", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
Opcode.CONST_STRING,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.RETURN,
),
strings = listOf("DISABLE_CAPTIONS_OPTION")
)

View File

@@ -0,0 +1,80 @@
package app.revanced.patches.youtube.layout.autocaptions.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.youtube.layout.autocaptions.annotations.AutoCaptionsCompatibility
import app.revanced.patches.youtube.layout.autocaptions.fingerprints.StartVideoInformerFingerprint
import app.revanced.patches.youtube.layout.autocaptions.fingerprints.SubtitleButtonControllerFingerprint
import app.revanced.patches.youtube.layout.autocaptions.fingerprints.SubtitleTrackFingerprint
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
import app.revanced.patches.youtube.misc.settings.framework.components.impl.StringResource
import app.revanced.patches.youtube.misc.settings.framework.components.impl.SwitchPreference
@Patch
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
@Name("disable-auto-captions")
@Description("Disable forced captions from being automatically enabled.")
@AutoCaptionsCompatibility
@Version("0.0.1")
class AutoCaptionsPatch : BytecodePatch(
listOf(
StartVideoInformerFingerprint, SubtitleButtonControllerFingerprint, SubtitleTrackFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
SwitchPreference(
"revanced_autocaptions_enabled",
StringResource("revanced_autocaptions_enabled_title", "Disable auto-captions"),
false,
StringResource("revanced_autocaptions_summary_on", "Auto-captions are disabled"),
StringResource("revanced_autocaptions_summary_off", "Auto-captions are enabled")
)
)
val startVideoInformerMethod = StartVideoInformerFingerprint.result!!.mutableMethod
startVideoInformerMethod.addInstructions(
0, """
const/4 v0, 0x0
sput-boolean v0, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z
"""
)
val subtitleButtonControllerMethod = SubtitleButtonControllerFingerprint.result!!.mutableMethod
subtitleButtonControllerMethod.addInstructions(
0, """
const/4 v0, 0x1
sput-boolean v0, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z
"""
)
val subtitleTrackMethod = SubtitleTrackFingerprint.result!!.mutableMethod
subtitleTrackMethod.addInstructions(
0, """
invoke-static {}, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->autoCaptionsEnabled()Z
move-result v0
if-eqz v0, :auto_captions_enabled
sget-boolean v0, Lapp/revanced/integrations/patches/DisableAutoCaptionsPatch;->captionsButtonDisabled:Z
if-nez v0, :auto_captions_enabled
const/4 v0, 0x1
return v0
:auto_captions_enabled
nop
"""
)
return PatchResultSuccess()
}
}

View File

@@ -10,10 +10,11 @@ import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.youtube.layout.branding.icon.annotations.CustomBrandingCompatibility
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import java.io.File
import java.io.FileInputStream
import java.io.InputStream
import java.nio.file.Files
import java.nio.file.Path
import kotlin.io.path.exists
import kotlin.io.path.inputStream
@Patch
@DependsOn([FixLocaleConfigErrorPatch::class])
@@ -66,21 +67,21 @@ class CustomBrandingPatch : ResourcePatch() {
}
private fun getIconStream(iconPath: String): InputStream? {
if (appIconPath == null) {
return this.javaClass.classLoader.getResourceAsStream(iconPath)
}
val file = File(appIconPath!!).resolve(iconPath)
if (!file.exists()) return null
return FileInputStream(file)
val path = Path.of(appIconPath ?: return this.javaClass.classLoader.getResourceAsStream(iconPath))
return if (path.exists())
path.inputStream()
else
null
}
companion object : OptionsContainer() {
private var appName: String? by option(
PatchOption.StringOption(
key = "appName",
default = "YouTube ReVanced",
title = "Application Name",
description = "The name of the application it will show on your home screen.",
default = "YouTube ReVanced",
required = true
)
)
@@ -88,7 +89,6 @@ class CustomBrandingPatch : ResourcePatch() {
private var appIconPath: String? by option(
PatchOption.StringOption(
key = "appIconPath",
default = null,
title = "Application Icon Path",
description = "A path to the icon of the application."
)

View File

@@ -1,4 +1,4 @@
package app.revanced.patches.youtube.layout.amoled.annotations
package app.revanced.patches.youtube.layout.customthemes.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@@ -6,4 +6,4 @@ import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.google.android.youtube")])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class AmoledCompatibility
internal annotation class CustomThemeCompatibility

View File

@@ -0,0 +1,55 @@
package app.revanced.patches.youtube.layout.customthemes.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.OptionsContainer
import app.revanced.patcher.patch.PatchOption
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.youtube.layout.customthemes.annotations.CustomThemeCompatibility
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import org.w3c.dom.Element
@Patch
@DependsOn([FixLocaleConfigErrorPatch::class])
@Name("custom-theme")
@Description("Applies a custom theme.")
@CustomThemeCompatibility
@Version("0.0.1")
class CustomThemePatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult {
val backgroundColor = backgroundColor!!
data.xmlEditor["res/values/colors.xml"].use { editor ->
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
for (i in 0 until resourcesNode.childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
node.textContent = when (node.getAttribute("name")) {
"yt_black1", "yt_black1_opacity95", "yt_black2", "yt_black3", "yt_black4",
"yt_status_bar_background_dark" -> backgroundColor
else -> continue
}
}
}
return PatchResultSuccess()
}
companion object : OptionsContainer() {
var backgroundColor: String? by option(
PatchOption.StringOption(
key = "darkThemeBackgroundColor",
default = "@android:color/black",
title = "Background color for the dark theme",
description = "The background color of the dark theme. Can be a hex color or a resource reference.",
)
)
}
}

View File

@@ -1,9 +0,0 @@
package app.revanced.patches.youtube.layout.theme.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.google.android.youtube")])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class ThemeCompatibility

View File

@@ -1,67 +0,0 @@
package app.revanced.patches.youtube.layout.theme.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.youtube.layout.theme.annotations.ThemeCompatibility
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import org.w3c.dom.Element
@Patch
@DependsOn([FixLocaleConfigErrorPatch::class])
@Name("theme")
@Description("Enables a custom theme.")
@ThemeCompatibility
@Version("0.0.1")
class ThemePatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult {
val theme = Themes.of(theme!!) ?: return PatchResultError("Theme '$theme' not found.")
data.xmlEditor["res/values/colors.xml"].use { editor ->
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
for (i in 0 until resourcesNode.childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
node.textContent = theme.apply(node.getAttribute("name")) ?: continue
}
}
return PatchResultSuccess()
}
companion object : OptionsContainer() {
var theme: String? by option(
PatchOption.StringListOption(
key = "theme",
default = Themes.Amoled.name,
options = Themes.names,
title = "Theme",
description = "Select a theme.",
required = true
)
)
}
enum class Themes(val apply: (String) -> String?) {
Amoled({ attr ->
when (attr) {
"yt_black1", "yt_black1_opacity95", "yt_black2", "yt_black3", "yt_black4",
"yt_status_bar_background_dark" -> "@android:color/black"
"yt_selected_nav_label_dark" -> "#ffdf0000"
else -> null
}
});
companion object {
val names = values().map { it.name }
fun of(name: String) = values().firstOrNull { it.name == name }
}
}
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:tint="#FFFFFF" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:fillColor="#FFFFFF" android:pathData="M5.5,9.3L5.5,0h1v9.3l3.6,-3.7 0.8,0.8 -4.9,4.8 -4.9,-4.8 0.8,-0.8L5.5,9.3ZM0,11h1v1.5h10L11,11h1v2.5L0,13.5L0,11Z"/>
<path android:fillColor="#FFFFFF" android:pathData="M 6.0050001,16.257111 h 0.916667 v 1.666667 H 16.088333 V 16.257111 H 17.005 v 2.777778 H 6.0050001 Z M 16.5,11.4 15.8,10.7 12,14.4 V 4 h -1 v 10.4 l -3.8,-3.8 -0.7,0.7 5,5 z"/>
</vector>