mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-09 19:03:55 +01:00
Compare commits
23 Commits
v2.148.0
...
v2.152.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
370067266c | ||
|
|
62a8ac4f9b | ||
|
|
37cfb6900c | ||
|
|
c0bc6fe658 | ||
|
|
ec64b8d1ff | ||
|
|
a52a692062 | ||
|
|
c372d7823c | ||
|
|
47dce0d01e | ||
|
|
b777d2e230 | ||
|
|
c98baf93fc | ||
|
|
4e4b0ecb0d | ||
|
|
e8391b3e93 | ||
|
|
1db7eebeaa | ||
|
|
50e210d94f | ||
|
|
ad6fab930d | ||
|
|
7966be827f | ||
|
|
6a6f05e2cb | ||
|
|
752b12b66d | ||
|
|
623a9bce98 | ||
|
|
6441b031e3 | ||
|
|
4227ffa40f | ||
|
|
9158fd5054 | ||
|
|
7f529d1038 |
2
.github/workflows/pull_request.yml
vendored
2
.github/workflows/pull_request.yml
vendored
@@ -7,7 +7,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
MESSAGE: merge branch \`${{ github.head_ref || github.ref_name }}\` to \`main\`
|
MESSAGE: merge branch `${{ github.head_ref || github.ref_name }}` to `main`
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pull-request:
|
pull-request:
|
||||||
|
|||||||
@@ -32,7 +32,8 @@
|
|||||||
{
|
{
|
||||||
"path": "patches.json"
|
"path": "patches.json"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
successComment: false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
82
CHANGELOG.md
82
CHANGELOG.md
@@ -1,3 +1,85 @@
|
|||||||
|
# [2.152.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.151.0...v2.152.0-dev.1) (2023-01-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/copy-video-url:** match icon style with native icon ([#1419](https://github.com/revanced/revanced-patches/issues/1419)) ([e89e54c](https://github.com/revanced/revanced-patches/commit/e89e54c316a2d99195d2b79e9176d34f6de0113c))
|
||||||
|
|
||||||
|
# [2.151.0](https://github.com/revanced/revanced-patches/compare/v2.150.0...v2.151.0) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** restore swipe back to exit gesture ([#1405](https://github.com/revanced/revanced-patches/issues/1405)) ([2440587](https://github.com/revanced/revanced-patches/commit/24405877dd935a757fa61c7580887c1a47a25ea9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** `copy-video-url` patch ([#1402](https://github.com/revanced/revanced-patches/issues/1402)) ([bf982e8](https://github.com/revanced/revanced-patches/commit/bf982e8d7765c2a89a5475b6db8b203a3ac4ddf9))
|
||||||
|
|
||||||
|
# [2.151.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.150.0...v2.151.0-dev.1) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** restore swipe back to exit gesture ([#1405](https://github.com/revanced/revanced-patches/issues/1405)) ([2440587](https://github.com/revanced/revanced-patches/commit/24405877dd935a757fa61c7580887c1a47a25ea9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** `copy-video-url` patch ([#1402](https://github.com/revanced/revanced-patches/issues/1402)) ([bf982e8](https://github.com/revanced/revanced-patches/commit/bf982e8d7765c2a89a5475b6db8b203a3ac4ddf9))
|
||||||
|
|
||||||
|
# [2.150.0](https://github.com/revanced/revanced-patches/compare/v2.149.0...v2.150.0) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/bottom-controls-resource-patch:** use correct length for `nameSpaceLength` ([#1401](https://github.com/revanced/revanced-patches/issues/1401)) ([7190066](https://github.com/revanced/revanced-patches/commit/7190066a8ded8b59970483a81d7902526d552093))
|
||||||
|
* **youtube/general-ads:** resolve fingerprint to correct method ([#1404](https://github.com/revanced/revanced-patches/issues/1404)) ([e135485](https://github.com/revanced/revanced-patches/commit/e1354852501cb582549cbf0634b1a15e1d0012d9))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/return-youtube-dislike:** better formatting and LTR support ([#1370](https://github.com/revanced/revanced-patches/issues/1370)) ([fd0fe1c](https://github.com/revanced/revanced-patches/commit/fd0fe1c86ca99e395d340e85f4f1eb7b221e90ea))
|
||||||
|
|
||||||
|
## [2.149.1-dev.2](https://github.com/revanced/revanced-patches/compare/v2.149.1-dev.1...v2.149.1-dev.2) (2022-12-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/general-ads:** resolve fingerprint to correct method ([#1404](https://github.com/revanced/revanced-patches/issues/1404)) ([e135485](https://github.com/revanced/revanced-patches/commit/e1354852501cb582549cbf0634b1a15e1d0012d9))
|
||||||
|
|
||||||
|
## [2.149.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.149.0...v2.149.1-dev.1) (2022-12-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/bottom-controls-resource-patch:** use correct length for `nameSpaceLength` ([#1401](https://github.com/revanced/revanced-patches/issues/1401)) ([7190066](https://github.com/revanced/revanced-patches/commit/7190066a8ded8b59970483a81d7902526d552093))
|
||||||
|
|
||||||
|
# [2.149.0](https://github.com/revanced/revanced-patches/compare/v2.148.0...v2.149.0) (2022-12-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **tasker/unlock-license:** resolve fingerprint correctly ([92d7857](https://github.com/revanced/revanced-patches/commit/92d78576f033dd7155c80cb08d5911048b06c36c))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/general-ads-patch:** hide channel member shelf ([#1380](https://github.com/revanced/revanced-patches/issues/1380)) ([ce2b104](https://github.com/revanced/revanced-patches/commit/ce2b104f508f1581ec531446d60bd3d41dafbd2c))
|
||||||
|
|
||||||
|
# [2.149.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.148.0...v2.149.0-dev.1) (2022-12-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **tasker/unlock-license:** resolve fingerprint correctly ([92d7857](https://github.com/revanced/revanced-patches/commit/92d78576f033dd7155c80cb08d5911048b06c36c))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube/general-ads-patch:** hide channel member shelf ([#1380](https://github.com/revanced/revanced-patches/issues/1380)) ([ce2b104](https://github.com/revanced/revanced-patches/commit/ce2b104f508f1581ec531446d60bd3d41dafbd2c))
|
||||||
|
|
||||||
# [2.148.0](https://github.com/revanced/revanced-patches/compare/v2.147.0...v2.148.0) (2022-12-29)
|
# [2.148.0](https://github.com/revanced/revanced-patches/compare/v2.147.0...v2.148.0) (2022-12-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -12,6 +12,7 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `always-autorepeat` | Always repeats the playing video again. | 17.49.37 |
|
| `always-autorepeat` | Always repeats the playing video again. | 17.49.37 |
|
||||||
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
|
||||||
| `comments` | Hides components related to comments. | 17.49.37 |
|
| `comments` | Hides components related to comments. | 17.49.37 |
|
||||||
|
| `copy-video-url` | Adds buttons in player to copy video links. | 17.49.37 |
|
||||||
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
|
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
|
||||||
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.49.37 |
|
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.49.37 |
|
||||||
| `custom-video-speed` | Adds more video speed options. | 17.49.37 |
|
| `custom-video-speed` | Adds more video speed options. | 17.49.37 |
|
||||||
@@ -199,14 +200,6 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
|
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `net.dinglisch.android.taskerm`](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `unlock-license` | Unlocks the trial version. | all |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
|
### [📦 `co.windyapp.android`](https://play.google.com/store/apps/details?id=co.windyapp.android)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -255,6 +248,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-themes` | Unlocks all themes. | all |
|
| `unlock-themes` | Unlocks all themes. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### [📦 `net.dinglisch.android.taskerm`](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-trial` | Unlocks the trial version. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 📝 JSON Format
|
## 📝 JSON Format
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("app.revanced:revanced-patcher:6.3.2")
|
implementation("app.revanced:revanced-patcher:6.4.0")
|
||||||
implementation("app.revanced:multidexlib2:2.5.2.r2")
|
implementation("app.revanced:multidexlib2:2.5.2.r2")
|
||||||
// Required for meta
|
// Required for meta
|
||||||
implementation("com.google.code.gson:gson:2.10")
|
implementation("com.google.code.gson:gson:2.10")
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 2.148.0
|
version = 2.152.0-dev.1
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,14 +0,0 @@
|
|||||||
package app.revanced.patches.tasker.license.unlock.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
|
||||||
import org.jf.dexlib2.Opcode
|
|
||||||
|
|
||||||
object CheckLicenseFingerprint : MethodFingerprint(
|
|
||||||
strings = listOf("just(IsLicensedResult(true))"),
|
|
||||||
opcodes = listOf(
|
|
||||||
Opcode.GOTO,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.INVOKE_VIRTUAL
|
|
||||||
)
|
|
||||||
)
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package app.revanced.patches.tasker.license.unlock.patch
|
|
||||||
|
|
||||||
import app.revanced.extensions.toErrorResult
|
|
||||||
import app.revanced.patcher.annotation.Description
|
|
||||||
import app.revanced.patcher.annotation.Name
|
|
||||||
import app.revanced.patcher.annotation.Version
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
|
||||||
import app.revanced.patcher.extensions.instruction
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
|
||||||
import app.revanced.patcher.patch.PatchResultSuccess
|
|
||||||
import app.revanced.patcher.patch.annotations.Patch
|
|
||||||
import app.revanced.patches.tasker.license.unlock.annotations.UnlockLicenseCompatibility
|
|
||||||
import app.revanced.patches.tasker.license.unlock.fingerprints.CheckLicenseFingerprint
|
|
||||||
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
|
||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
|
||||||
import org.jf.dexlib2.iface.reference.MethodReference
|
|
||||||
import org.jf.dexlib2.immutable.instruction.ImmutableInstruction35c
|
|
||||||
|
|
||||||
@Patch
|
|
||||||
@Name("unlock-license")
|
|
||||||
@Description("Unlocks the trial version.")
|
|
||||||
@UnlockLicenseCompatibility
|
|
||||||
@Version("0.0.1")
|
|
||||||
class UnlockLicensePatch : BytecodePatch(
|
|
||||||
listOf(
|
|
||||||
CheckLicenseFingerprint
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
override fun execute(context: BytecodeContext) = CheckLicenseFingerprint.result?.let { result ->
|
|
||||||
val patchIndex = result.scanResult.patternScanResult!!.endIndex
|
|
||||||
|
|
||||||
with(result.mutableMethod.instruction(patchIndex) as FiveRegisterInstruction) {
|
|
||||||
ImmutableInstruction35c(
|
|
||||||
opcode,
|
|
||||||
registerCount,
|
|
||||||
registerC,
|
|
||||||
0, // registerE is 1, registerD is now 0 instead of 1 bypassing the license verification
|
|
||||||
registerE,
|
|
||||||
registerF,
|
|
||||||
registerG,
|
|
||||||
(this as ReferenceInstruction).reference as MethodReference
|
|
||||||
)
|
|
||||||
}
|
|
||||||
PatchResultSuccess()
|
|
||||||
} ?: CheckLicenseFingerprint.toErrorResult()
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.revanced.patches.tasker.license.unlock.annotations
|
package app.revanced.patches.tasker.trial.unlock.annotations
|
||||||
|
|
||||||
import app.revanced.patcher.annotation.Compatibility
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
import app.revanced.patcher.annotation.Package
|
import app.revanced.patcher.annotation.Package
|
||||||
@@ -6,4 +6,4 @@ import app.revanced.patcher.annotation.Package
|
|||||||
@Compatibility([Package("net.dinglisch.android.taskerm")])
|
@Compatibility([Package("net.dinglisch.android.taskerm")])
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
internal annotation class UnlockLicenseCompatibility
|
internal annotation class UnlockTrialCompatibility
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package app.revanced.patches.tasker.trial.unlock.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
|
object CheckLicenseFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("Can't check license")
|
||||||
|
)
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package app.revanced.patches.tasker.trial.unlock.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.annotations.Patch
|
||||||
|
import app.revanced.patches.tasker.trial.unlock.annotations.UnlockTrialCompatibility
|
||||||
|
import app.revanced.patches.tasker.trial.unlock.fingerprints.CheckLicenseFingerprint
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("unlock-trial")
|
||||||
|
@Description("Unlocks the trial version.")
|
||||||
|
@UnlockTrialCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class UnlockLicensePatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
CheckLicenseFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) = CheckLicenseFingerprint
|
||||||
|
.result
|
||||||
|
?.mutableMethod
|
||||||
|
// Return the method early, which prompts the user with a non dismissible dialog, when the trial period is over.
|
||||||
|
?.addInstruction(0, "return-void")
|
||||||
|
?.let { PatchResultSuccess() }
|
||||||
|
?: CheckLicenseFingerprint.toErrorResult()
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
|||||||
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
|
import app.revanced.patches.youtube.ad.general.annotation.GeneralAdsCompatibility
|
||||||
import app.revanced.patches.youtube.ad.general.bytecode.fingerprints.ReelConstructorFingerprint
|
import app.revanced.patches.youtube.ad.general.bytecode.fingerprints.ReelConstructorFingerprint
|
||||||
import app.revanced.patches.youtube.ad.general.resource.patch.GeneralAdsResourcePatch
|
import app.revanced.patches.youtube.ad.general.resource.patch.GeneralAdsResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch.FixBackToExitGesturePatch
|
||||||
import app.revanced.patches.youtube.misc.fix.verticalscroll.patch.VerticalScrollPatch
|
import app.revanced.patches.youtube.misc.fix.verticalscroll.patch.VerticalScrollPatch
|
||||||
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
|
import org.jf.dexlib2.iface.instruction.formats.Instruction31i
|
||||||
@@ -24,7 +25,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
|
|||||||
|
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class])
|
@DependsOn([GeneralAdsResourcePatch::class, VerticalScrollPatch::class, FixBackToExitGesturePatch::class])
|
||||||
@Name("general-ads")
|
@Name("general-ads")
|
||||||
@Description("Removes general ads.")
|
@Description("Removes general ads.")
|
||||||
@GeneralAdsCompatibility
|
@GeneralAdsCompatibility
|
||||||
|
|||||||
@@ -109,6 +109,13 @@ class GeneralAdsResourcePatch : ResourcePatch {
|
|||||||
StringResource("revanced_adremover_subscribers_community_guidelines_enabled_summary_on", "Subscribers community guidelines are hidden"),
|
StringResource("revanced_adremover_subscribers_community_guidelines_enabled_summary_on", "Subscribers community guidelines are hidden"),
|
||||||
StringResource("revanced_adremover_subscribers_community_guidelines_enabled_summary_off", "Subscribers community guidelines are shown")
|
StringResource("revanced_adremover_subscribers_community_guidelines_enabled_summary_off", "Subscribers community guidelines are shown")
|
||||||
),
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_adremover_channel_member_shelf_removal",
|
||||||
|
StringResource("revanced_adremover_channel_member_shelf_enabled_title", "Hide channel member shelf"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_adremover_channel_member_shelf_enabled_summary_on", "Channel member shelf is hidden"),
|
||||||
|
StringResource("revanced_adremover_channel_member_shelf_enabled_summary_off", "Channel member shelf is shown")
|
||||||
|
),
|
||||||
SwitchPreference(
|
SwitchPreference(
|
||||||
"revanced_adremover_emergency_box_removal",
|
"revanced_adremover_emergency_box_removal",
|
||||||
StringResource("revanced_adremover_emergency_box_enabled_title", "Hide emergency boxes"),
|
StringResource("revanced_adremover_emergency_box_enabled_title", "Hide emergency boxes"),
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.interaction.copyvideourl.annotation
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility(
|
||||||
|
[
|
||||||
|
Package("com.google.android.youtube", arrayOf("17.49.37"))
|
||||||
|
]
|
||||||
|
)
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class CopyVideoUrlCompatibility
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package app.revanced.patches.youtube.interaction.copyvideourl.bytecode.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
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.patches.youtube.interaction.copyvideourl.annotation.CopyVideoUrlCompatibility
|
||||||
|
import app.revanced.patches.youtube.interaction.copyvideourl.resource.patch.CopyVideoUrlResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
||||||
|
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("copy-video-url")
|
||||||
|
@Description("Adds buttons in player to copy video links.")
|
||||||
|
@DependsOn([
|
||||||
|
CopyVideoUrlResourcePatch::class,
|
||||||
|
PlayerControlsBytecodePatch::class,
|
||||||
|
VideoInformationPatch::class
|
||||||
|
])
|
||||||
|
@CopyVideoUrlCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class CopyVideoUrlBytecodePatch : BytecodePatch() {
|
||||||
|
private companion object {
|
||||||
|
const val INTEGRATIONS_PACKAGE = "Lapp/revanced/integrations"
|
||||||
|
const val INTEGRATIONS_PLAYER_PACKAGE = "$INTEGRATIONS_PACKAGE/videoplayer"
|
||||||
|
val BUTTONS_DESCRIPTORS = listOf(
|
||||||
|
"$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlButton;",
|
||||||
|
"$INTEGRATIONS_PLAYER_PACKAGE/CopyVideoUrlTimestampButton;"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
|
||||||
|
// Initialize buttons and inject visibility control
|
||||||
|
BUTTONS_DESCRIPTORS.forEach { descriptor ->
|
||||||
|
val initializeButtonDescriptor = "$descriptor->initializeButton(Ljava/lang/Object;)V"
|
||||||
|
val visibilityDescriptor = "$descriptor->changeVisibility(Z)V"
|
||||||
|
PlayerControlsBytecodePatch.initializeControl(initializeButtonDescriptor)
|
||||||
|
PlayerControlsBytecodePatch.injectVisibilityCheckCall(visibilityDescriptor)
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package app.revanced.patches.youtube.interaction.copyvideourl.resource.patch
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Name
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.ResourceContext
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
|
import app.revanced.patcher.patch.annotations.DependsOn
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.PreferenceScreen
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
|
import app.revanced.patches.youtube.interaction.copyvideourl.annotation.CopyVideoUrlCompatibility
|
||||||
|
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
|
||||||
|
import app.revanced.patches.youtube.misc.playercontrols.resource.patch.BottomControlsResourcePatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
import app.revanced.util.resources.ResourceUtils
|
||||||
|
import app.revanced.util.resources.ResourceUtils.copyResources
|
||||||
|
|
||||||
|
@Name("copy-video-url-resource")
|
||||||
|
@Description("Makes necessary changes to resources for copy video link buttons.")
|
||||||
|
@DependsOn([BottomControlsResourcePatch::class, FixLocaleConfigErrorPatch::class, SettingsPatch::class])
|
||||||
|
@CopyVideoUrlCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class CopyVideoUrlResourcePatch : ResourcePatch {
|
||||||
|
override fun execute(context: ResourceContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.INTERACTIONS.addPreferences(
|
||||||
|
PreferenceScreen(
|
||||||
|
"revanced_copy_video_url",
|
||||||
|
StringResource("revanced_copy_video_url_title", "Copy video URL settings"),
|
||||||
|
listOf(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_copy_video_url",
|
||||||
|
StringResource("revanced_copy_video_url_enabled_title", "Show copy video URL button"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_copy_video_url_enabled_summary_on", "Button is shown, click to copy video URL without timestamp"),
|
||||||
|
StringResource("revanced_copy_video_url_enabled_summary_off", "Button is not shown")
|
||||||
|
),
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_copy_video_url_timestamp",
|
||||||
|
StringResource("revanced_copy_video_url_timestamp_enabled_title", "Show copy timestamp URL button"),
|
||||||
|
true,
|
||||||
|
StringResource("revanced_copy_video_url_timestamp_enabled_summary_on", "Button is shown, click to copy video URL with timestamp"),
|
||||||
|
StringResource("revanced_copy_video_url_timestamp_enabled_summary_off", "Button is not shown")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
StringResource("revanced_copy_video_url_summary", "Settings related to copy URL buttons in video player")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
context.copyResources("copyvideourl", ResourceUtils.ResourceGroup(
|
||||||
|
resourceDirectoryName = "drawable",
|
||||||
|
"revanced_yt_copy.xml",
|
||||||
|
"revanced_yt_copy_timestamp.xml"
|
||||||
|
))
|
||||||
|
|
||||||
|
BottomControlsResourcePatch.addControls("copyvideourl/host/layout/${BottomControlsResourcePatch.TARGET_RESOURCE_NAME}")
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,11 +12,11 @@ import app.revanced.patcher.patch.annotations.Patch
|
|||||||
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
|
import app.revanced.patches.youtube.interaction.downloads.annotation.DownloadsCompatibility
|
||||||
import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch
|
import app.revanced.patches.youtube.interaction.downloads.resource.patch.DownloadsResourcePatch
|
||||||
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
import app.revanced.patches.youtube.misc.playercontrols.bytecode.patch.PlayerControlsBytecodePatch
|
||||||
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
import app.revanced.patches.youtube.misc.video.information.patch.VideoInformationPatch
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("downloads")
|
@Name("downloads")
|
||||||
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoIdPatch::class])
|
@DependsOn([DownloadsResourcePatch::class, PlayerControlsBytecodePatch::class, VideoInformationPatch::class])
|
||||||
@Description("Enables downloading music and videos from YouTube.")
|
@Description("Enables downloading music and videos from YouTube.")
|
||||||
@DownloadsCompatibility
|
@DownloadsCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
@@ -29,7 +29,7 @@ class DownloadsBytecodePatch : BytecodePatch() {
|
|||||||
initialize the control
|
initialize the control
|
||||||
*/
|
*/
|
||||||
|
|
||||||
val initializeDownloadsDescriptor = "$classDescriptor->initializeDownloadButton(Ljava/lang/Object;)V"
|
val initializeDownloadsDescriptor = "$classDescriptor->initializeButton(Ljava/lang/Object;)V"
|
||||||
PlayerControlsBytecodePatch.initializeControl(initializeDownloadsDescriptor)
|
PlayerControlsBytecodePatch.initializeControl(initializeDownloadsDescriptor)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -39,14 +39,6 @@ class DownloadsBytecodePatch : BytecodePatch() {
|
|||||||
val changeVisibilityDescriptor = "$classDescriptor->changeVisibility(Z)V"
|
val changeVisibilityDescriptor = "$classDescriptor->changeVisibility(Z)V"
|
||||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(changeVisibilityDescriptor)
|
PlayerControlsBytecodePatch.injectVisibilityCheckCall(changeVisibilityDescriptor)
|
||||||
|
|
||||||
/*
|
|
||||||
add code to change to update the video id
|
|
||||||
*/
|
|
||||||
|
|
||||||
val setVideoIdDescriptor =
|
|
||||||
"L$integrationsPackage/patches/downloads/DownloadsPatch;->setVideoId(Ljava/lang/String;)V"
|
|
||||||
VideoIdPatch.injectCall(setVideoIdDescriptor)
|
|
||||||
|
|
||||||
return PatchResultSuccess()
|
return PatchResultSuccess()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.annotation
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility(
|
||||||
|
[Package(
|
||||||
|
"com.google.android.youtube", arrayOf("17.49.37")
|
||||||
|
)]
|
||||||
|
)
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
|
internal annotation class FixBackToExitGestureCompatibility
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object OnBackPressedFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.RETURN_VOID
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.definingClass.endsWith("WatchWhileActivity;")
|
||||||
|
&& methodDef.name == "onBackPressed"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object RecyclerViewScrollingFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.CHECK_CAST,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.IF_LEZ,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.AccessFlags
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object RecyclerViewTopScrollingFingerprint : MethodFingerprint(
|
||||||
|
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.IF_EQZ,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.CHECK_CAST,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.GOTO,
|
||||||
|
Opcode.IGET_OBJECT,
|
||||||
|
Opcode.INVOKE_INTERFACE,
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object RecyclerViewTopScrollingParentFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.INVOKE_DIRECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.CONST_16,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.NEW_INSTANCE
|
||||||
|
),
|
||||||
|
customFingerprint = { methodDef ->
|
||||||
|
methodDef.name == "<init>"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.backtoexitgesture.patch
|
||||||
|
|
||||||
|
import app.revanced.extensions.toErrorResult
|
||||||
|
import app.revanced.patcher.annotation.Description
|
||||||
|
import app.revanced.patcher.annotation.Version
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.addInstruction
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.PatchResult
|
||||||
|
import app.revanced.patcher.patch.PatchResultError
|
||||||
|
import app.revanced.patcher.patch.PatchResultSuccess
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.annotation.FixBackToExitGestureCompatibility
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.OnBackPressedFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewScrollingFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fingerprints.RecyclerViewTopScrollingParentFingerprint
|
||||||
|
|
||||||
|
@Description("Fixes the swipe back to exit gesture.")
|
||||||
|
@FixBackToExitGestureCompatibility
|
||||||
|
@Version("0.0.1")
|
||||||
|
class FixBackToExitGesturePatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
RecyclerViewTopScrollingParentFingerprint,
|
||||||
|
RecyclerViewScrollingFingerprint,
|
||||||
|
OnBackPressedFingerprint,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
RecyclerViewTopScrollingFingerprint.apply {
|
||||||
|
resolve(
|
||||||
|
context,
|
||||||
|
RecyclerViewTopScrollingParentFingerprint.result?.classDef
|
||||||
|
?: return RecyclerViewTopScrollingParentFingerprint.toErrorResult()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
mapOf(
|
||||||
|
RecyclerViewTopScrollingFingerprint to IntegrationsMethod(
|
||||||
|
methodName = "onTopView"
|
||||||
|
),
|
||||||
|
RecyclerViewScrollingFingerprint to IntegrationsMethod(
|
||||||
|
methodName = "onScrollingViews"
|
||||||
|
),
|
||||||
|
OnBackPressedFingerprint to IntegrationsMethod(
|
||||||
|
"p0", "onBackPressed", "Lcom/google/android/apps/youtube/app/watchwhile/WatchWhileActivity;"
|
||||||
|
)
|
||||||
|
).forEach { (fingerprint, target) ->
|
||||||
|
try {
|
||||||
|
fingerprint.injectCall(target)
|
||||||
|
} catch (error: PatchResultError) {
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
/**
|
||||||
|
* A reference to a method from the integrations for [FixBackToExitGesturePatch].
|
||||||
|
*
|
||||||
|
* @param register The method registers.
|
||||||
|
* @param methodName The method name.
|
||||||
|
* @param parameterTypes The parameters of the method.
|
||||||
|
*/
|
||||||
|
data class IntegrationsMethod(
|
||||||
|
val register: String = "", val methodName: String, val parameterTypes: String = ""
|
||||||
|
) {
|
||||||
|
override fun toString() =
|
||||||
|
"invoke-static {$register}, Lapp/revanced/integrations/patches/FixBackToExitGesturePatch;->$methodName($parameterTypes)V"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inject a call to a method from the integrations.
|
||||||
|
*
|
||||||
|
* @param targetMethod The target method to call.
|
||||||
|
*/
|
||||||
|
fun MethodFingerprint.injectCall(targetMethod: IntegrationsMethod) = result?.apply {
|
||||||
|
mutableMethod.addInstruction(
|
||||||
|
scanResult.patternScanResult!!.endIndex, targetMethod.toString()
|
||||||
|
)
|
||||||
|
} ?: throw this.toErrorResult()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,8 @@ object CanScrollVerticallyFingerprint : MethodFingerprint(
|
|||||||
"Z",
|
"Z",
|
||||||
parameters = emptyList(),
|
parameters = emptyList(),
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.RETURN,
|
||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.MOVE_RESULT,
|
Opcode.MOVE_RESULT,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class BottomControlsResourcePatch : ResourcePatch {
|
|||||||
"$namespace/$lastLeftOf"
|
"$namespace/$lastLeftOf"
|
||||||
|
|
||||||
// set lastLeftOf attribute to the the current element
|
// set lastLeftOf attribute to the the current element
|
||||||
val nameSpaceLength = 4
|
val nameSpaceLength = 5
|
||||||
lastLeftOf = element.attributes.getNamedItem("android:id").nodeValue.substring(nameSpaceLength)
|
lastLeftOf = element.attributes.getNamedItem("android:id").nodeValue.substring(nameSpaceLength)
|
||||||
|
|
||||||
// copy the element
|
// copy the element
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu
|
|||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.video.information.annotation.VideoInformationCompatibility
|
import app.revanced.patches.youtube.misc.video.information.annotation.VideoInformationCompatibility
|
||||||
import app.revanced.patches.youtube.misc.video.information.fingerprints.*
|
import app.revanced.patches.youtube.misc.video.information.fingerprints.*
|
||||||
|
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
||||||
import org.jf.dexlib2.AccessFlags
|
import org.jf.dexlib2.AccessFlags
|
||||||
import org.jf.dexlib2.builder.MutableMethodImplementation
|
import org.jf.dexlib2.builder.MutableMethodImplementation
|
||||||
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
@@ -31,7 +32,7 @@ import org.jf.dexlib2.util.MethodUtil
|
|||||||
@Description("Hooks YouTube to get information about the current playing video.")
|
@Description("Hooks YouTube to get information about the current playing video.")
|
||||||
@VideoInformationCompatibility
|
@VideoInformationCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
@DependsOn([IntegrationsPatch::class])
|
@DependsOn([IntegrationsPatch::class, VideoIdPatch::class])
|
||||||
class VideoInformationPatch : BytecodePatch(
|
class VideoInformationPatch : BytecodePatch(
|
||||||
listOf(
|
listOf(
|
||||||
PlayerInitFingerprint,
|
PlayerInitFingerprint,
|
||||||
@@ -94,6 +95,11 @@ class VideoInformationPatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Inject call for video id
|
||||||
|
*/
|
||||||
|
VideoIdPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->setVideoId(Ljava/lang/String;)V")
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set the video time method
|
Set the video time method
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:pathData="M 6.8 19.5 C 6.5 19.5 6.2 19.399 6 19.199 C 5.8 19 5.7 18.699 5.7 18.399 L 5.7 7.099 L 6.8 7.099 L 6.8 18.399 L 15.7 18.399 L 15.7 19.5 L 6.8 19.5 Z M 9 17.2 C 8.7 17.2 8.4 17.1 8.2 16.9 C 8 16.7 7.9 16.4 7.9 16.1 L 7.9 5.6 C 7.9 5.3 8 5 8.2 4.8 C 8.4 4.6 8.7 4.5 9 4.5 L 17.2 4.5 C 17.5 4.5 17.8 4.6 18 4.8 C 18.2 5 18.3 5.3 18.3 5.6 L 18.3 16.1 C 18.3 16.4 18.2 16.7 18 16.9 C 17.8 17.1 17.5 17.2 17.2 17.2 L 9 17.2 Z M 9 16.1 L 17.2 16.1 L 17.2 5.6 L 9 5.6 L 9 16.1 Z M 9 16.1 L 9 5.6 L 9 16.1 Z"
|
||||||
|
android:fillColor="#ffffffff"/>
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<vector
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:name="path"
|
||||||
|
android:pathData="M 6.8 19.5 C 6.5 19.5 6.2 19.4 6 19.2 C 5.8 19 5.7 18.7 5.7 18.4 L 5.7 7.1 L 6.8 7.1 L 6.8 18.4 L 15.7 18.4 L 15.7 19.5 L 6.8 19.5 Z M 9 17.2 C 8.7 17.2 8.4 17.1 8.2 16.9 C 8 16.7 7.9 16.4 7.9 16.1 L 7.9 5.6 C 7.9 5.3 8 5 8.2 4.8 C 8.4 4.6 8.7 4.5 9 4.5 L 17.2 4.5 C 17.5 4.5 17.8 4.6 18 4.8 C 18.2 5 18.3 5.3 18.3 5.6 L 18.3 16.1 C 18.3 16.4 18.2 16.7 18 16.9 C 17.8 17.1 17.5 17.2 17.2 17.2 L 9 17.2 Z M 9 16.1 L 17.2 16.1 L 17.2 5.6 L 9 5.6 L 9 16.1 Z M 9 16.1 L 9 5.6 L 9 16.1 Z M 13.1 8 C 11.5 8 10.2 9.3 10.2 10.9 C 10.2 12.5 11.5 13.8 13.1 13.8 C 14.7 13.8 16 12.5 16 10.9 C 16 9.3 14.7 8 13.1 8 Z M 13.1 13.3 C 11.8 13.3 10.7 12.2 10.7 10.9 C 10.7 9.6 11.8 8.5 13.1 8.5 C 14.4 8.5 15.5 9.6 15.5 10.9 C 15.5 12.2 14.5 13.3 13.1 13.3 Z M 14.5 12 L 14.2 12.3 L 12.9 11 L 12.9 9.4 L 13.3 9.4 L 13.3 10.8 L 14.5 12 Z"
|
||||||
|
android:fillColor="#ffffffff" />
|
||||||
|
</vector>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:yt="http://schemas.android.com/apk/res-auto" android:id="@+id/youtube_controls_bottom_ui_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutDirection="ltr">
|
||||||
|
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_timestamp_button" android:paddingLeft="12dp" android:paddingTop="22dp" android:paddingRight="12dp" android:paddingBottom="16dp" android:longClickable="false" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/revanced_yt_copy_timestamp" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
|
||||||
|
<com.google.android.libraries.youtube.common.ui.TouchImageView android:id="@+id/copy_video_url_button" android:paddingLeft="12dp" android:paddingTop="22dp" android:paddingRight="12dp" android:paddingBottom="16dp" android:longClickable="false" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/revanced_yt_copy" android:scaleType="center" yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" style="@style/YouTubePlayerButton"/>
|
||||||
|
</android.support.constraint.ConstraintLayout>
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Hidden</string>
|
||||||
|
|
||||||
<string name="revanced_ryd_failure_connection_timeout">Dislikes temporarily not available (API timed out)</string>
|
<string name="revanced_ryd_failure_connection_timeout">Dislikes temporarily not available (API timed out)</string>
|
||||||
<string name="revanced_ryd_failure_client_rate_limit_requested">Dislikes not available (client API limit reached)</string>
|
<string name="revanced_ryd_failure_client_rate_limit_requested">Dislikes not available (client API limit reached)</string>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user