mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-19 09:03:58 +00:00
Compare commits
40 Commits
v2.165.0-d
...
v2.167.0-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86fe827c29 | ||
|
|
708582ff03 | ||
|
|
24133ea1bb | ||
|
|
d825b37559 | ||
|
|
ce5bc272bf | ||
|
|
7f0c9c40a6 | ||
|
|
bfcead18a5 | ||
|
|
025092a2ff | ||
|
|
685544e603 | ||
|
|
c2dd63e338 | ||
|
|
5e167d59e1 | ||
|
|
378a50fe0b | ||
|
|
b8f650232c | ||
|
|
98bd25044e | ||
|
|
4d97ead9b7 | ||
|
|
9ffcb97a90 | ||
|
|
3c4956c05a | ||
|
|
714070d860 | ||
|
|
5210bc65b1 | ||
|
|
6361d1f056 | ||
|
|
b6167ef1e0 | ||
|
|
92e0202d8d | ||
|
|
caa91de921 | ||
|
|
e9b5ffd615 | ||
|
|
03fffa7b91 | ||
|
|
c80d222730 | ||
|
|
dd324cd161 | ||
|
|
f8f085b822 | ||
|
|
ce75a98659 | ||
|
|
0aae1713f9 | ||
|
|
41da430e16 | ||
|
|
f81c7c77f9 | ||
|
|
ef8b06ea89 | ||
|
|
278926634b | ||
|
|
33a81fc7a3 | ||
|
|
31cfaa7bf9 | ||
|
|
c845b2878c | ||
|
|
e36902a530 | ||
|
|
452c8eea96 | ||
|
|
713f9db31c |
7
.github/workflows/pull_request.yml
vendored
7
.github/workflows/pull_request.yml
vendored
@@ -21,5 +21,10 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
destination_branch: 'main'
|
destination_branch: 'main'
|
||||||
pr_title: 'chore: ${{ env.MESSAGE }}'
|
pr_title: 'chore: ${{ env.MESSAGE }}'
|
||||||
pr_body: 'This pull request will ${{ env.MESSAGE }}.'
|
pr_body: |
|
||||||
|
This pull request will ${{ env.MESSAGE }}.
|
||||||
|
|
||||||
|
## Dependencies before merge
|
||||||
|
|
||||||
|
- [] https://github.com/revanced/revanced-integrations
|
||||||
pr_draft: true
|
pr_draft: true
|
||||||
|
|||||||
111
CHANGELOG.md
111
CHANGELOG.md
@@ -1,71 +1,100 @@
|
|||||||
# [2.165.0-dev.8](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.7...v2.165.0-dev.8) (2023-03-12)
|
# [2.167.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.167.0-dev.2...v2.167.0-dev.3) (2023-03-19)
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
* **twitch:** misspelling annotations ([7d6fe42](https://github.com/revanced/revanced-patches/commit/7d6fe421ff2f3e0a9a25c362e53d14033c03aa1e))
|
* **youtube/remember-playback-speed:** allow to not remember playback speed ([#1762](https://github.com/revanced/revanced-patches/issues/1762)) ([49ec3e8](https://github.com/revanced/revanced-patches/commit/49ec3e83f18ec4eb180d220c5a7015f8e4feb3a7))
|
||||||
* **youtube/return-youtube-dislike:** add missing strings ([a8c88e3](https://github.com/revanced/revanced-patches/commit/a8c88e3b5a4079b684150962a50c9afe14de8156))
|
|
||||||
|
# [2.167.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.167.0-dev.1...v2.167.0-dev.2) (2023-03-19)
|
||||||
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
* **myexpenses/unlock-pro:** constrain to last working version ([21fa036](https://github.com/revanced/revanced-patches/commit/21fa03681f6cf20d22cc794b49d373eef0a9ecd4))
|
* **youtube/microg-support:** do not depend on `spoof-signature-verification` patch ([af4e765](https://github.com/revanced/revanced-patches/commit/af4e765ca87c6c979e95bc274b32c764a0a32a88))
|
||||||
* **reddit:** add more compatibility constraints ([6a53e1a](https://github.com/revanced/revanced-patches/commit/6a53e1a2db25fc5f99cbd489b00347b237143d69))
|
|
||||||
* **reddit:** bump compatibility to `2023.09.1` ([#1729](https://github.com/revanced/revanced-patches/issues/1729)) ([8b725c3](https://github.com/revanced/revanced-patches/commit/8b725c307a34fd7f5245f5961594c35e99d22530))
|
|
||||||
* **twitch:** constraint compatibility to `14.6.1` ([#1736](https://github.com/revanced/revanced-patches/issues/1736)) ([65ce10c](https://github.com/revanced/revanced-patches/commit/65ce10c8a5c2df2ac9b74bba13db93334c789863))
|
|
||||||
* **youtube/custom-video-buffer:** replace patch with removal notice ([#1718](https://github.com/revanced/revanced-patches/issues/1718)) ([af53cd3](https://github.com/revanced/revanced-patches/commit/af53cd3ccf0f2585262e1c4ed82f155e7abda8b2))
|
|
||||||
* **youtube:** bump compatibility to `18.05.40` ([#1704](https://github.com/revanced/revanced-patches/issues/1704)) ([9fa0c7b](https://github.com/revanced/revanced-patches/commit/9fa0c7b657c1e8344c432ae8948e1ea8c2d3cbfd))
|
|
||||||
* **youtubevanced:** `general-ads` patch ([#1693](https://github.com/revanced/revanced-patches/issues/1693)) ([e0d8ef1](https://github.com/revanced/revanced-patches/commit/e0d8ef12afa447c9dc75ffb8f169f7c565214513))
|
|
||||||
|
|
||||||
# [2.165.0-dev.7](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.6...v2.165.0-dev.7) (2023-02-26)
|
# [2.167.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.166.1-dev.1...v2.167.0-dev.1) (2023-03-17)
|
||||||
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
* **youtube/hide-autoplay-button:** do not disable autoplay button when hidden ([7bc6a5b](https://github.com/revanced/revanced-patches/commit/7bc6a5ba2505e368e7590fe429b682ae435dba83))
|
* **youtube/spoof-signature-verification:** automatic signature spoofing ([f1395f4](https://github.com/revanced/revanced-patches/commit/f1395f49fae1c0a00de074d58fa7d81f562d3009))
|
||||||
* **youtube:** `hide-floating-microphone-button` patch ([c684bed](https://github.com/revanced/revanced-patches/commit/c684bed5054beb5361fed5fe404cf68033927a27))
|
|
||||||
|
|
||||||
# [2.165.0-dev.6](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.5...v2.165.0-dev.6) (2023-02-26)
|
## [2.166.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.166.0...v2.166.1-dev.1) (2023-03-15)
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
* **backdrops/pro-unlock:** constrain to most recent working app version ([#1677](https://github.com/revanced/revanced-patches/issues/1677)) ([331fe04](https://github.com/revanced/revanced-patches/commit/331fe04f142e3f1f7f6066271261a55d0bee33c4))
|
* **youtube/spoof-signature-verification:** fix audio during home feed video playback ([#1754](https://github.com/revanced/revanced-patches/issues/1754)) ([7dd067b](https://github.com/revanced/revanced-patches/commit/7dd067b0e96679fe653c9796bef31d743287b2d0))
|
||||||
|
|
||||||
# [2.165.0-dev.5](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.4...v2.165.0-dev.5) (2023-02-24)
|
# [2.166.0](https://github.com/revanced/revanced-patches/compare/v2.165.1...v2.166.0) (2023-03-14)
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **youtube/general-ads:** do not hide components in library tab ([a8b597a](https://github.com/revanced/revanced-patches/commit/a8b597a1ba2fa6f6e37d3792e85296c1f07da630))
|
|
||||||
|
|
||||||
# [2.165.0-dev.4](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.3...v2.165.0-dev.4) (2023-02-24)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **youtube/disable-player-popup-panels:** use better patch description ([eda4ed3](https://github.com/revanced/revanced-patches/commit/eda4ed3a3e83b5a0e97740547494708f4e6536c2))
|
|
||||||
|
|
||||||
# [2.165.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.2...v2.165.0-dev.3) (2023-02-24)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
* **instagram/hide-timeline-ads:** fix compatibility with newer versions ([#1672](https://github.com/revanced/revanced-patches/issues/1672)) ([9a295a9](https://github.com/revanced/revanced-patches/commit/9a295a9aa1ca40e2afde22ea199805e8fbe93832))
|
* **backdrops/pro-unlock:** constrain to most recent working app version ([#1677](https://github.com/revanced/revanced-patches/issues/1677)) ([7680838](https://github.com/revanced/revanced-patches/commit/768083882952f49b8c867043518ba888603b3049))
|
||||||
|
* **instagram/hide-timeline-ads:** fix compatibility with newer versions ([#1672](https://github.com/revanced/revanced-patches/issues/1672)) ([b803e3e](https://github.com/revanced/revanced-patches/commit/b803e3e1a743e32809195e8a358568572a59dac2))
|
||||||
# [2.165.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.165.0-dev.1...v2.165.0-dev.2) (2023-02-24)
|
* **twitch:** misspelling annotations ([675c970](https://github.com/revanced/revanced-patches/commit/675c970041abc30440533f763c5be709abd3f725))
|
||||||
|
* **youtube/general-ads:** remove duplicate preference ([89820c6](https://github.com/revanced/revanced-patches/commit/89820c60bb393a6a94bbc868a6fae0501c91d811))
|
||||||
|
* **youtube/return-youtube-dislike:** add missing strings ([19047b6](https://github.com/revanced/revanced-patches/commit/19047b6963ff578a70d3d327306e1050f7ce1c70))
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **youtube/general-ads:** remove duplicate preference ([cd7a728](https://github.com/revanced/revanced-patches/commit/cd7a728f52cd29c76a24b37c07c0e4d4c5485b07))
|
|
||||||
|
|
||||||
# [2.165.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.164.0...v2.165.0-dev.1) (2023-02-24)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
* **youtube/general-ads:** hide image shelf from search results ([e29230f](https://github.com/revanced/revanced-patches/commit/e29230f44930a9928c3f97222fe05b5493ef1710))
|
* **myexpenses/unlock-pro:** constrain to last working version ([f68c87b](https://github.com/revanced/revanced-patches/commit/f68c87b0edc88e80ef2f3110f75be86236dffdb7))
|
||||||
|
* **reddit:** add more compatibility constraints ([65e5c26](https://github.com/revanced/revanced-patches/commit/65e5c2639084f07e1f19b9933febcebc43ad12c4))
|
||||||
|
* **reddit:** bump compatibility to `2023.09.1` ([#1729](https://github.com/revanced/revanced-patches/issues/1729)) ([c8997e8](https://github.com/revanced/revanced-patches/commit/c8997e8ca587aedfa4318ace9fc119c262f00933))
|
||||||
|
* **twitch:** constraint compatibility to `14.6.1` ([#1736](https://github.com/revanced/revanced-patches/issues/1736)) ([7d4294f](https://github.com/revanced/revanced-patches/commit/7d4294f691e1e2e8a2679e2504a9fd5dc7e05201))
|
||||||
|
* **youtube/custom-video-buffer:** replace patch with removal notice ([#1718](https://github.com/revanced/revanced-patches/issues/1718)) ([29f952d](https://github.com/revanced/revanced-patches/commit/29f952d73e07f8f666d4744d6d97374bebfdc3c6))
|
||||||
|
* **youtube/disable-player-popup-panels:** use better patch description ([7150662](https://github.com/revanced/revanced-patches/commit/71506625aca42aa4901878c0f706793e17ca5607))
|
||||||
|
* **youtube/general-ads:** do not hide components in library tab ([d56d3bd](https://github.com/revanced/revanced-patches/commit/d56d3bd94b8f06ff9f915fe0b0ba3d5f484ea971))
|
||||||
|
* **youtube/general-ads:** hide image shelf from search results ([e4c2450](https://github.com/revanced/revanced-patches/commit/e4c2450ebac4cacae64a81060de8c146ba542e37))
|
||||||
|
* **youtube/hide-autoplay-button:** do not disable autoplay button when hidden ([98d0084](https://github.com/revanced/revanced-patches/commit/98d00848c9a0aa0247d77e9ae16450697a6c154c))
|
||||||
|
* **youtube:** `hide-floating-microphone-button` patch ([8f33b11](https://github.com/revanced/revanced-patches/commit/8f33b110facb8f8a04416459f3d715bc77002231))
|
||||||
|
* **youtube:** bump compatibility to `18.05.40` ([#1704](https://github.com/revanced/revanced-patches/issues/1704)) ([77fe23b](https://github.com/revanced/revanced-patches/commit/77fe23b53e27b7b6a1c48ba0cfeb182ae99f9ab8))
|
||||||
|
* **youtube:** bump compatibility to `18.05.40` ([#1743](https://github.com/revanced/revanced-patches/issues/1743)) ([1090388](https://github.com/revanced/revanced-patches/commit/109038839574f7ba07f91ef27b61d6a650f2ef34))
|
||||||
|
* **youtubevanced:** `general-ads` patch ([#1693](https://github.com/revanced/revanced-patches/issues/1693)) ([b6ca3b4](https://github.com/revanced/revanced-patches/commit/b6ca3b4491cc0a5c42b6a52ec48ad0ff8a54f0b2))
|
||||||
|
|
||||||
|
# [2.166.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.165.1...v2.166.0-dev.1) (2023-03-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **backdrops/pro-unlock:** constrain to most recent working app version ([#1677](https://github.com/revanced/revanced-patches/issues/1677)) ([7680838](https://github.com/revanced/revanced-patches/commit/768083882952f49b8c867043518ba888603b3049))
|
||||||
|
* **instagram/hide-timeline-ads:** fix compatibility with newer versions ([#1672](https://github.com/revanced/revanced-patches/issues/1672)) ([b803e3e](https://github.com/revanced/revanced-patches/commit/b803e3e1a743e32809195e8a358568572a59dac2))
|
||||||
|
* **twitch:** misspelling annotations ([675c970](https://github.com/revanced/revanced-patches/commit/675c970041abc30440533f763c5be709abd3f725))
|
||||||
|
* **youtube/general-ads:** remove duplicate preference ([89820c6](https://github.com/revanced/revanced-patches/commit/89820c60bb393a6a94bbc868a6fae0501c91d811))
|
||||||
|
* **youtube/return-youtube-dislike:** add missing strings ([19047b6](https://github.com/revanced/revanced-patches/commit/19047b6963ff578a70d3d327306e1050f7ce1c70))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **myexpenses/unlock-pro:** constrain to last working version ([f68c87b](https://github.com/revanced/revanced-patches/commit/f68c87b0edc88e80ef2f3110f75be86236dffdb7))
|
||||||
|
* **reddit:** add more compatibility constraints ([65e5c26](https://github.com/revanced/revanced-patches/commit/65e5c2639084f07e1f19b9933febcebc43ad12c4))
|
||||||
|
* **reddit:** bump compatibility to `2023.09.1` ([#1729](https://github.com/revanced/revanced-patches/issues/1729)) ([c8997e8](https://github.com/revanced/revanced-patches/commit/c8997e8ca587aedfa4318ace9fc119c262f00933))
|
||||||
|
* **twitch:** constraint compatibility to `14.6.1` ([#1736](https://github.com/revanced/revanced-patches/issues/1736)) ([7d4294f](https://github.com/revanced/revanced-patches/commit/7d4294f691e1e2e8a2679e2504a9fd5dc7e05201))
|
||||||
|
* **youtube/custom-video-buffer:** replace patch with removal notice ([#1718](https://github.com/revanced/revanced-patches/issues/1718)) ([29f952d](https://github.com/revanced/revanced-patches/commit/29f952d73e07f8f666d4744d6d97374bebfdc3c6))
|
||||||
|
* **youtube/disable-player-popup-panels:** use better patch description ([7150662](https://github.com/revanced/revanced-patches/commit/71506625aca42aa4901878c0f706793e17ca5607))
|
||||||
|
* **youtube/general-ads:** do not hide components in library tab ([d56d3bd](https://github.com/revanced/revanced-patches/commit/d56d3bd94b8f06ff9f915fe0b0ba3d5f484ea971))
|
||||||
|
* **youtube/general-ads:** hide image shelf from search results ([e4c2450](https://github.com/revanced/revanced-patches/commit/e4c2450ebac4cacae64a81060de8c146ba542e37))
|
||||||
|
* **youtube/hide-autoplay-button:** do not disable autoplay button when hidden ([98d0084](https://github.com/revanced/revanced-patches/commit/98d00848c9a0aa0247d77e9ae16450697a6c154c))
|
||||||
|
* **youtube:** `hide-floating-microphone-button` patch ([8f33b11](https://github.com/revanced/revanced-patches/commit/8f33b110facb8f8a04416459f3d715bc77002231))
|
||||||
|
* **youtube:** bump compatibility to `18.05.40` ([#1704](https://github.com/revanced/revanced-patches/issues/1704)) ([77fe23b](https://github.com/revanced/revanced-patches/commit/77fe23b53e27b7b6a1c48ba0cfeb182ae99f9ab8))
|
||||||
|
* **youtube:** bump compatibility to `18.05.40` ([#1743](https://github.com/revanced/revanced-patches/issues/1743)) ([1090388](https://github.com/revanced/revanced-patches/commit/109038839574f7ba07f91ef27b61d6a650f2ef34))
|
||||||
|
* **youtubevanced:** `general-ads` patch ([#1693](https://github.com/revanced/revanced-patches/issues/1693)) ([b6ca3b4](https://github.com/revanced/revanced-patches/commit/b6ca3b4491cc0a5c42b6a52ec48ad0ff8a54f0b2))
|
||||||
|
|
||||||
|
## [2.165.1](https://github.com/revanced/revanced-patches/compare/v2.165.0...v2.165.1) (2023-03-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **youtube/spoof-signature-verification:** use correct fingerprint ([13090ee](https://github.com/revanced/revanced-patches/commit/13090eeb47660980cec8dc5bbb80447de5047a1d))
|
||||||
|
|
||||||
|
# [2.165.0](https://github.com/revanced/revanced-patches/compare/v2.164.0...v2.165.0) (2023-03-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **youtube:** `spoof-signature-verification` patch ([#1745](https://github.com/revanced/revanced-patches/issues/1745)) ([4306f25](https://github.com/revanced/revanced-patches/commit/4306f25d3f3b1afdbc75f48485b3897c15aa49e9))
|
||||||
|
|
||||||
# [2.164.0](https://github.com/revanced/revanced-patches/compare/v2.163.0...v2.164.0) (2023-02-24)
|
# [2.164.0](https://github.com/revanced/revanced-patches/compare/v2.163.0...v2.164.0) (2023-02-24)
|
||||||
|
|
||||||
|
|||||||
139
README.md
139
README.md
@@ -9,59 +9,60 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|:--------:|:--------------:|:-----------------:|
|
||||||
| `always-autorepeat` | Always repeats the playing video again. | 18.03.36 |
|
| `always-autorepeat` | Always repeats the playing video again. | 18.05.40 |
|
||||||
| `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. | 18.03.36 |
|
| `comments` | Hides components related to comments. | 18.05.40 |
|
||||||
| `copy-video-url` | Adds buttons in player to copy video links. | 18.03.36 |
|
| `copy-video-url` | Adds buttons in player to copy video links. | 18.05.40 |
|
||||||
| `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. | 18.03.36 |
|
| `custom-video-buffer` | Lets you change the buffers of videos. | 18.05.40 |
|
||||||
| `custom-video-speed` | Adds more video speed options. | 18.03.36 |
|
| `custom-video-speed` | Adds more video speed options. | 18.05.40 |
|
||||||
| `debugging` | Adds debugging options. | all |
|
| `debugging` | Adds debugging options. | all |
|
||||||
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 18.03.36 |
|
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 18.05.40 |
|
||||||
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 18.03.36 |
|
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 18.05.40 |
|
||||||
| `disable-player-popup-panels` | Disables panels from appearing automatically when going into fullscreen (playlist or live chat). | 18.03.36 |
|
| `disable-player-popup-panels` | Disables panels from appearing automatically when going into fullscreen (playlist or live chat). | 18.05.40 |
|
||||||
| `disable-shorts-on-startup` | Disables playing YouTube Shorts when launching YouTube. | 18.03.36 |
|
| `disable-shorts-on-startup` | Disables playing YouTube Shorts when launching YouTube. | 18.05.40 |
|
||||||
| `disable-zoom-haptics` | Disables haptics when zooming. | all |
|
| `disable-zoom-haptics` | Disables haptics when zooming. | all |
|
||||||
| `downloads` | Enables downloading music and videos from YouTube. | 18.03.36 |
|
| `downloads` | Enables downloading music and videos from YouTube. | 18.05.40 |
|
||||||
| `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 18.03.36 |
|
| `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 18.05.40 |
|
||||||
| `general-ads` | Removes general ads. | 18.03.36 |
|
| `general-ads` | Removes general ads. | 18.05.40 |
|
||||||
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 18.03.36 |
|
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 18.05.40 |
|
||||||
| `hide-album-cards` | Hides the album cards below the artist description. | 18.03.36 |
|
| `hide-album-cards` | Hides the album cards below the artist description. | 18.05.40 |
|
||||||
| `hide-artist-card` | Hides the artist card below the searchbar. | 18.03.36 |
|
| `hide-artist-card` | Hides the artist card below the searchbar. | 18.05.40 |
|
||||||
| `hide-autoplay-button` | Hides the autoplay button in the video player. | 18.03.36 |
|
| `hide-autoplay-button` | Hides the autoplay button in the video player. | 18.05.40 |
|
||||||
| `hide-breaking-news-shelf` | Hides the breaking news shelf on the homepage tab. | 18.03.36 |
|
| `hide-breaking-news-shelf` | Hides the breaking news shelf on the homepage tab. | 18.05.40 |
|
||||||
| `hide-captions-button` | Hides the captions button on video player. | 18.03.36 |
|
| `hide-captions-button` | Hides the captions button on video player. | 18.05.40 |
|
||||||
| `hide-cast-button` | Hides the cast button in the video player. | all |
|
| `hide-cast-button` | Hides the cast button in the video player. | all |
|
||||||
| `hide-create-button` | Hides the create button in the navigation bar. | 18.03.36 |
|
| `hide-create-button` | Hides the create button in the navigation bar. | 18.05.40 |
|
||||||
| `hide-crowdfunding-box` | Hides the crowdfunding box between the player and video description. | 18.03.36 |
|
| `hide-crowdfunding-box` | Hides the crowdfunding box between the player and video description. | 18.05.40 |
|
||||||
| `hide-email-address` | Hides the email address in the account switcher. | 18.03.36 |
|
| `hide-email-address` | Hides the email address in the account switcher. | 18.05.40 |
|
||||||
| `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 18.03.36 |
|
| `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 18.05.40 |
|
||||||
| `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.03.36 |
|
| `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.05.40 |
|
||||||
| `hide-info-cards` | Hides info cards in videos. | 18.03.36 |
|
| `hide-info-cards` | Hides info cards in videos. | 18.05.40 |
|
||||||
| `hide-my-mix` | Hides mix playlists. | 18.03.36 |
|
| `hide-my-mix` | Hides mix playlists. | 18.05.40 |
|
||||||
| `hide-player-buttons` | Adds the option to hide video player previous and next buttons. | all |
|
| `hide-player-buttons` | Adds the option to hide video player previous and next buttons. | all |
|
||||||
| `hide-seekbar` | Hides the seekbar. | 18.03.36 |
|
| `hide-seekbar` | Hides the seekbar. | 18.05.40 |
|
||||||
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 18.03.36 |
|
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 18.05.40 |
|
||||||
| `hide-timestamp` | Hides timestamp in video player. | 18.03.36 |
|
| `hide-timestamp` | Hides timestamp in video player. | 18.05.40 |
|
||||||
| `hide-video-action-buttons` | Adds the options to hide action buttons under a video. | 18.03.36 |
|
| `hide-video-action-buttons` | Adds the options to hide action buttons under a video. | 18.05.40 |
|
||||||
| `hide-watch-in-vr` | Hides the option to watch in VR from the player settings flyout panel. | 18.03.36 |
|
| `hide-watch-in-vr` | Hides the option to watch in VR from the player settings flyout panel. | 18.05.40 |
|
||||||
| `hide-watermark` | Hides creator's watermarks on videos. | 18.03.36 |
|
| `hide-watermark` | Hides creator's watermarks on videos. | 18.05.40 |
|
||||||
| `microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 18.03.36 |
|
| `microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 18.05.40 |
|
||||||
| `minimized-playback` | Enables minimized and background playback. | 18.03.36 |
|
| `minimized-playback` | Enables minimized and background playback. | 18.05.40 |
|
||||||
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 18.03.36 |
|
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 18.05.40 |
|
||||||
| `open-links-externally` | Open links outside of the app directly in your browser. | 18.03.36 |
|
| `open-links-externally` | Open links outside of the app directly in your browser. | 18.05.40 |
|
||||||
| `premium-heading` | Shows premium branding on the home screen. | all |
|
| `premium-heading` | Shows premium branding on the home screen. | all |
|
||||||
| `remember-playback-rate` | Adds the ability to remember the playback rate you chose in the video playback rate flyout. | 18.03.36 |
|
| `remember-playback-speed` | Adds the ability to remember the playback speed you chose in the video playback speed flyout. | 18.05.40 |
|
||||||
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 18.03.36 |
|
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 18.05.40 |
|
||||||
| `remove-player-button-background` | Removes the background from the video player buttons. | 18.03.36 |
|
| `remove-player-button-background` | Removes the background from the video player buttons. | 18.05.40 |
|
||||||
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 18.03.36 |
|
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 18.05.40 |
|
||||||
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 18.03.36 |
|
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 18.05.40 |
|
||||||
| `sponsorblock` | Integrates SponsorBlock which allows skipping video segments such as sponsored content. | 18.03.36 |
|
| `sponsorblock` | Integrates SponsorBlock which allows skipping video segments such as sponsored content. | 18.05.40 |
|
||||||
| `spoof-app-version` | Tricks YouTube into thinking, you are running an older version of the app. One of the side effects also includes restoring the old UI. | 18.03.36 |
|
| `spoof-app-version` | Tricks YouTube into thinking, you are running an older version of the app. One of the side effects also includes restoring the old UI. | 18.05.40 |
|
||||||
| `swipe-controls` | Adds volume and brightness swipe controls. | 18.03.36 |
|
| `spoof-signature-verification` | Spoofs the client to prevent playback issues. | 18.05.40 |
|
||||||
| `tablet-mini-player` | Enables the tablet mini player layout. | 18.03.36 |
|
| `swipe-controls` | Adds volume and brightness swipe controls. | 18.05.40 |
|
||||||
|
| `tablet-mini-player` | Enables the tablet mini player layout. | 18.05.40 |
|
||||||
| `theme` | Applies a custom theme. | all |
|
| `theme` | Applies a custom theme. | all |
|
||||||
| `video-ads` | Removes ads in the video player. | 18.03.36 |
|
| `video-ads` | Removes ads in the video player. | 18.05.40 |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `com.google.android.apps.youtube.music`](https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music)
|
### [📦 `com.google.android.apps.youtube.music`](https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music)
|
||||||
@@ -289,6 +290,22 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-prime` | Unlocks Nova Prime and all functions of the app. | all |
|
| `unlock-prime` | Unlocks Nova Prime and all functions of the app. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-pro` | Unlocks all professional features. | 3.4.9 |
|
||||||
|
</details>
|
||||||
|
|
||||||
|
### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-pro` | Unlocks all pro features. | 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>
|
||||||
|
|
||||||
@@ -297,6 +314,14 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
| `unlock-pro` | Unlocks all pro features. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
|
||||||
|
<details>
|
||||||
|
|
||||||
|
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
||||||
|
|:--------:|:--------------:|:-----------------:|
|
||||||
|
| `unlock-pro` | Unlocks all pro features. | all |
|
||||||
|
</details>
|
||||||
|
|
||||||
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
|
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
@@ -305,30 +330,6 @@ The official Patch bundle provided by ReVanced and the community.
|
|||||||
| `unlock-pro` | Unlocks pro features. | all |
|
| `unlock-pro` | Unlocks pro features. | all |
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### [📦 `ginlemon.iconpackstudio`](https://play.google.com/store/apps/details?id=ginlemon.iconpackstudio)
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx)
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `unlock-pro` | Unlocks all pro features. | all |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
|
|
||||||
<details>
|
|
||||||
|
|
||||||
| 💊 Patch | 📜 Description | 🏹 Target Version |
|
|
||||||
|:--------:|:--------------:|:-----------------:|
|
|
||||||
| `unlock-pro` | Unlocks all professional features. | 3.4.9 |
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### [📦 `com.ticktick.task`](https://play.google.com/store/apps/details?id=com.ticktick.task)
|
### [📦 `com.ticktick.task`](https://play.google.com/store/apps/details?id=com.ticktick.task)
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 2.165.0-dev.8
|
version = 2.167.0-dev.3
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -5,7 +5,16 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.49.37", "18.03.36")
|
"com.google.android.youtube", arrayOf(
|
||||||
|
"17.49.37",
|
||||||
|
"18.03.36",
|
||||||
|
"18.03.42",
|
||||||
|
"18.04.35",
|
||||||
|
"18.04.41",
|
||||||
|
"18.05.32",
|
||||||
|
"18.05.35",
|
||||||
|
"18.05.40"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,16 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.49.37", "18.03.36")
|
"com.google.android.youtube", arrayOf(
|
||||||
|
"17.49.37",
|
||||||
|
"18.03.36",
|
||||||
|
"18.03.42",
|
||||||
|
"18.04.35",
|
||||||
|
"18.04.41",
|
||||||
|
"18.05.32",
|
||||||
|
"18.05.35",
|
||||||
|
"18.05.40"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,16 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.49.37", "18.03.36")
|
"com.google.android.youtube", arrayOf(
|
||||||
|
"17.49.37",
|
||||||
|
"18.03.36",
|
||||||
|
"18.03.42",
|
||||||
|
"18.04.35",
|
||||||
|
"18.04.41",
|
||||||
|
"18.05.32",
|
||||||
|
"18.05.35",
|
||||||
|
"18.05.40"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -5,7 +5,16 @@ import app.revanced.patcher.annotation.Package
|
|||||||
|
|
||||||
@Compatibility(
|
@Compatibility(
|
||||||
[Package(
|
[Package(
|
||||||
"com.google.android.youtube", arrayOf("17.49.37", "18.03.36")
|
"com.google.android.youtube", arrayOf(
|
||||||
|
"17.49.37",
|
||||||
|
"18.03.36",
|
||||||
|
"18.03.42",
|
||||||
|
"18.04.35",
|
||||||
|
"18.04.41",
|
||||||
|
"18.05.32",
|
||||||
|
"18.05.35",
|
||||||
|
"18.05.40"
|
||||||
|
)
|
||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.playback.annotation
|
||||||
|
|
||||||
|
import app.revanced.patcher.annotation.Compatibility
|
||||||
|
import app.revanced.patcher.annotation.Package
|
||||||
|
|
||||||
|
@Compatibility(
|
||||||
|
[Package(
|
||||||
|
"com.google.android.youtube", arrayOf(
|
||||||
|
"17.49.37",
|
||||||
|
"18.03.36",
|
||||||
|
"18.03.42",
|
||||||
|
"18.04.35",
|
||||||
|
"18.04.41",
|
||||||
|
"18.05.32",
|
||||||
|
"18.05.35",
|
||||||
|
"18.05.40"
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
)
|
||||||
|
@Target(AnnotationTarget.CLASS)
|
||||||
|
internal annotation class ProtobufSpoofCompatibility
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
// Resolves to the method CronetDataSource.open
|
||||||
|
// https://androidx.tech/artifacts/media3/media3-datasource-cronet/1.0.0-alpha03-source/androidx/media3/datasource/cronet/CronetDataSource.java.html
|
||||||
|
object OpenCronetDataSourceFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.MOVE_RESULT,
|
||||||
|
Opcode.INVOKE_VIRTUAL,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
),
|
||||||
|
strings = listOf(
|
||||||
|
"err_cleartext_not_permitted",
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.playback.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
|
object ProtobufParameterBuilderFingerprint : MethodFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.INVOKE_VIRTUAL_RANGE,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT,
|
||||||
|
Opcode.IPUT_OBJECT
|
||||||
|
),
|
||||||
|
strings = listOf("Unexpected empty videoId.", "Prefetch request are disabled.")
|
||||||
|
)
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.fix.playback.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.data.toMethodWalker
|
||||||
|
import app.revanced.patcher.extensions.addInstructions
|
||||||
|
import app.revanced.patcher.extensions.instruction
|
||||||
|
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.patcher.util.proxy.mutableTypes.MutableMethod
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.StringResource
|
||||||
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
|
import app.revanced.patches.youtube.misc.fix.playback.annotation.ProtobufSpoofCompatibility
|
||||||
|
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.OpenCronetDataSourceFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.fix.playback.fingerprints.ProtobufParameterBuilderFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
|
||||||
|
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
|
@Patch
|
||||||
|
@Name("spoof-signature-verification")
|
||||||
|
@Description("Spoofs the client to prevent playback issues.")
|
||||||
|
@ProtobufSpoofCompatibility
|
||||||
|
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
||||||
|
@Version("0.0.1")
|
||||||
|
class SpoofSignatureVerificationPatch : BytecodePatch(
|
||||||
|
listOf(
|
||||||
|
ProtobufParameterBuilderFingerprint,
|
||||||
|
OpenCronetDataSourceFingerprint,
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_spoof_signature_verification",
|
||||||
|
StringResource("revanced_spoof_signature_verification_title", "Spoof app signature"),
|
||||||
|
false,
|
||||||
|
StringResource("revanced_spoof_signature_verification_summary_on", "App signature spoofed"),
|
||||||
|
StringResource("revanced_spoof_signature_verification_summary_off", "App signature not spoofed")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
// hook parameter
|
||||||
|
ProtobufParameterBuilderFingerprint.result?.let {
|
||||||
|
val setParamMethod = context
|
||||||
|
.toMethodWalker(it.method)
|
||||||
|
.nextMethod(it.scanResult.patternScanResult!!.startIndex, true).getMethod() as MutableMethod
|
||||||
|
|
||||||
|
setParamMethod.apply {
|
||||||
|
val protobufParameterRegister = 3
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static {p$protobufParameterRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideProtobufParameter(Ljava/lang/String;)Ljava/lang/String;
|
||||||
|
move-result-object p$protobufParameterRegister
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} ?: return ProtobufParameterBuilderFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
// hook video playback result
|
||||||
|
OpenCronetDataSourceFingerprint.result?.let {
|
||||||
|
it.mutableMethod.apply {
|
||||||
|
val getHeadersInstructionIndex = it.scanResult.patternScanResult!!.endIndex
|
||||||
|
val responseCodeRegister =
|
||||||
|
(instruction(getHeadersInstructionIndex - 2) as OneRegisterInstruction).registerA
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
getHeadersInstructionIndex + 1,
|
||||||
|
"""
|
||||||
|
invoke-static {v$responseCodeRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onResponse(I)V
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
} ?: return OpenCronetDataSourceFingerprint.toErrorResult()
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val INTEGRATIONS_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/patches/SpoofSignatureVerificationPatch;"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ import app.revanced.patcher.patch.annotations.Patch
|
|||||||
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
import app.revanced.patches.shared.fingerprints.WatchWhileActivityFingerprint
|
||||||
import app.revanced.patches.youtube.layout.buttons.cast.patch.HideCastButtonPatch
|
import app.revanced.patches.youtube.layout.buttons.cast.patch.HideCastButtonPatch
|
||||||
import app.revanced.patches.shared.misc.fix.spoof.patch.ClientSpoofPatch
|
import app.revanced.patches.shared.misc.fix.spoof.patch.ClientSpoofPatch
|
||||||
|
import app.revanced.patches.youtube.misc.fix.playback.patch.SpoofSignatureVerificationPatch
|
||||||
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
|
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
|
||||||
import app.revanced.patches.youtube.misc.microg.fingerprints.*
|
import app.revanced.patches.youtube.misc.microg.fingerprints.*
|
||||||
import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePatch
|
import app.revanced.patches.youtube.misc.microg.patch.resource.MicroGResourcePatch
|
||||||
|
|||||||
@@ -18,4 +18,4 @@ import app.revanced.patcher.annotation.Package
|
|||||||
)]
|
)]
|
||||||
)
|
)
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
internal annotation class RememberPlaybackRateCompatibility
|
internal annotation class RememberPlaybackSpeedCompatibility
|
||||||
@@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
|
|||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
object ChangePlaybackRateFragmentStateFingerprint : MethodFingerprint(
|
object ChangePlaybackSpeedFragmentStateFingerprint : MethodFingerprint(
|
||||||
"V",
|
"V",
|
||||||
strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT")
|
strings = listOf("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT")
|
||||||
)
|
)
|
||||||
@@ -2,6 +2,6 @@ package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
|
|||||||
|
|
||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
|
|
||||||
object InitializePlaybackRateValuesFingerprint : MethodFingerprint(
|
object InitializePlaybackSpeedValuesFingerprint : MethodFingerprint(
|
||||||
parameters = listOf("[L", "I")
|
parameters = listOf("[L", "I")
|
||||||
)
|
)
|
||||||
@@ -3,7 +3,7 @@ package app.revanced.patches.youtube.misc.video.speed.remember.fingerprint
|
|||||||
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
|
|
||||||
object OnPlaybackRateItemClickFingerprint : MethodFingerprint(
|
object OnPlaybackSpeedItemClickFingerprint : MethodFingerprint(
|
||||||
customFingerprint = { it.name == "onItemClick" },
|
customFingerprint = { it.name == "onItemClick" },
|
||||||
opcodes = listOf(
|
opcodes = listOf(
|
||||||
Opcode.IGET_OBJECT,
|
Opcode.IGET_OBJECT,
|
||||||
@@ -18,26 +18,108 @@ import app.revanced.patches.shared.settings.preference.impl.StringResource
|
|||||||
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
|
||||||
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
|
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.bytecode.patch.SettingsPatch
|
||||||
import app.revanced.patches.youtube.misc.video.speed.remember.annotation.RememberPlaybackRateCompatibility
|
import app.revanced.patches.youtube.misc.video.speed.remember.annotation.RememberPlaybackSpeedCompatibility
|
||||||
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.ChangePlaybackRateFragmentStateFingerprint
|
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.ChangePlaybackSpeedFragmentStateFingerprint
|
||||||
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.InitializePlaybackRateValuesFingerprint
|
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.InitializePlaybackSpeedValuesFingerprint
|
||||||
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.OnPlaybackRateItemClickFingerprint
|
import app.revanced.patches.youtube.misc.video.speed.remember.fingerprint.OnPlaybackSpeedItemClickFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
|
||||||
import org.jf.dexlib2.Opcode
|
import org.jf.dexlib2.Opcode
|
||||||
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||||
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
|
|
||||||
@Patch
|
@Patch
|
||||||
@Name("remember-playback-rate")
|
@Name("remember-playback-speed")
|
||||||
@Description("Adds the ability to remember the playback rate you chose in the video playback rate flyout.")
|
@Description("Adds the ability to remember the playback speed you chose in the video playback speed flyout.")
|
||||||
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
|
@DependsOn([IntegrationsPatch::class, SettingsPatch::class, VideoIdPatch::class])
|
||||||
@RememberPlaybackRateCompatibility
|
@RememberPlaybackSpeedCompatibility
|
||||||
@Version("0.0.1")
|
@Version("0.0.1")
|
||||||
class RememberPlaybackRatePatch : BytecodePatch(
|
class RememberPlaybackSpeedPatch : BytecodePatch(
|
||||||
listOf(ChangePlaybackRateFragmentStateFingerprint)
|
listOf(ChangePlaybackSpeedFragmentStateFingerprint)
|
||||||
) {
|
) {
|
||||||
|
override fun execute(context: BytecodeContext): PatchResult {
|
||||||
|
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||||
|
SwitchPreference(
|
||||||
|
"revanced_remember_playback_speed_last_selected",
|
||||||
|
StringResource(
|
||||||
|
"revanced_remember_playback_speed_last_selected_title",
|
||||||
|
"Remember playback speed changes"
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
StringResource(
|
||||||
|
"revanced_remember_playback_speed_last_selected_summary_on",
|
||||||
|
"Playback speed changes apply to all videos"
|
||||||
|
),
|
||||||
|
StringResource(
|
||||||
|
"revanced_remember_playback_speed_last_selected_summary_off",
|
||||||
|
"Playback speed changes only apply to the current video"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
context.resolveFingerprints()
|
||||||
|
|
||||||
|
VideoIdPatch.injectCall("${INTEGRATIONS_CLASS_DESCRIPTOR}->newVideoLoaded(Ljava/lang/String;)V")
|
||||||
|
|
||||||
|
// Set the remembered playback speed.
|
||||||
|
InitializePlaybackSpeedValuesFingerprint.result!!.apply {
|
||||||
|
// Infer everything necessary for setPlaybackSate()
|
||||||
|
|
||||||
|
val playbackHandlerWrapperFieldReference =
|
||||||
|
(object : MethodFingerprint(opcodes = listOf(Opcode.IF_EQZ)) {}).apply {
|
||||||
|
OnPlaybackSpeedItemClickFingerprint.result!!.apply {
|
||||||
|
resolve(
|
||||||
|
context,
|
||||||
|
method,
|
||||||
|
classDef
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.getReference(-1)
|
||||||
|
val playbackHandlerWrapperImplementorClassReference = OnPlaybackSpeedItemClickFingerprint
|
||||||
|
.getReference(-1)
|
||||||
|
val playbackHandlerFieldReference = OnPlaybackSpeedItemClickFingerprint
|
||||||
|
.getReference()
|
||||||
|
val setPlaybackSpeedMethodReference = OnPlaybackSpeedItemClickFingerprint
|
||||||
|
.getReference(1)
|
||||||
|
|
||||||
|
mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getCurrentPlaybackSpeed()F
|
||||||
|
move-result v0
|
||||||
|
# check if the playback speed is not 1.0x
|
||||||
|
const/high16 v1, 0x3f800000 # 1.0f
|
||||||
|
cmpg-float v1, v0, v1
|
||||||
|
if-eqz v1, :do_not_override
|
||||||
|
|
||||||
|
# invoke setPlaybackSpeed
|
||||||
|
iget-object v1, p0, $playbackHandlerWrapperFieldReference
|
||||||
|
check-cast v1, $playbackHandlerWrapperImplementorClassReference
|
||||||
|
iget-object v2, v1, $playbackHandlerFieldReference
|
||||||
|
invoke-virtual {v2, v0}, $setPlaybackSpeedMethodReference
|
||||||
|
""".trimIndent(),
|
||||||
|
listOf(ExternalLabel("do_not_override", mutableMethod.instruction(0)))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remember the selected playback speed.
|
||||||
|
OnPlaybackSpeedItemClickFingerprint.result!!.apply {
|
||||||
|
val setPlaybackSpeedIndex = scanResult.patternScanResult!!.endIndex
|
||||||
|
val selectedPlaybackSpeedRegister =
|
||||||
|
(mutableMethod.instruction(setPlaybackSpeedIndex) as FiveRegisterInstruction).registerD
|
||||||
|
|
||||||
|
mutableMethod.addInstruction(
|
||||||
|
setPlaybackSpeedIndex,
|
||||||
|
"invoke-static { v$selectedPlaybackSpeedRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->setPlaybackSpeed(F)V"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return PatchResultSuccess()
|
||||||
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||||
"Lapp/revanced/integrations/patches/playback/speed/RememberPlaybackRatePatch;"
|
"Lapp/revanced/integrations/patches/playback/speed/RememberPlaybackSpeedPatch;"
|
||||||
|
|
||||||
fun MethodFingerprint.getReference(offsetFromPatternScanResultStartIndex: Int = 0) = this.result!!.let {
|
fun MethodFingerprint.getReference(offsetFromPatternScanResultStartIndex: Int = 0) = this.result!!.let {
|
||||||
val referenceInstruction = it.mutableMethod
|
val referenceInstruction = it.mutableMethod
|
||||||
@@ -46,92 +128,13 @@ class RememberPlaybackRatePatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun BytecodeContext.resolveFingerprints() {
|
fun BytecodeContext.resolveFingerprints() {
|
||||||
ChangePlaybackRateFragmentStateFingerprint.result?.also {
|
ChangePlaybackSpeedFragmentStateFingerprint.result?.also {
|
||||||
fun MethodFingerprint.resolve() = resolve(this@resolveFingerprints, it.classDef)
|
fun MethodFingerprint.resolve() = resolve(this@resolveFingerprints, it.classDef)
|
||||||
|
|
||||||
OnPlaybackRateItemClickFingerprint.resolve()
|
OnPlaybackSpeedItemClickFingerprint.resolve()
|
||||||
InitializePlaybackRateValuesFingerprint.resolve()
|
InitializePlaybackSpeedValuesFingerprint.resolve()
|
||||||
|
|
||||||
} ?: throw ChangePlaybackRateFragmentStateFingerprint.toErrorResult()
|
} ?: throw ChangePlaybackSpeedFragmentStateFingerprint.toErrorResult()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext): PatchResult {
|
|
||||||
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
|
||||||
SwitchPreference(
|
|
||||||
"revanced_remember_playback_rate_last_selected",
|
|
||||||
StringResource("revanced_remember_playback_rate_last_selected_title", "Remember playback rate changes"),
|
|
||||||
true,
|
|
||||||
StringResource(
|
|
||||||
"revanced_remember_playback_rate_last_selected_summary_on",
|
|
||||||
"Playback rate changes apply to all videos"
|
|
||||||
),
|
|
||||||
StringResource(
|
|
||||||
"revanced_remember_playback_rate_last_selected_summary_off",
|
|
||||||
"Playback rate changes only apply to the current video"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
context.resolveFingerprints()
|
|
||||||
|
|
||||||
// Set the remembered playback rate.
|
|
||||||
InitializePlaybackRateValuesFingerprint.result!!.apply {
|
|
||||||
// Infer everything necessary for setPlaybackRate()
|
|
||||||
|
|
||||||
val playbackHandlerWrapperFieldReference =
|
|
||||||
(object : MethodFingerprint(opcodes = listOf(Opcode.IF_EQZ)) {}).apply {
|
|
||||||
OnPlaybackRateItemClickFingerprint.result!!.apply {
|
|
||||||
resolve(
|
|
||||||
context,
|
|
||||||
method,
|
|
||||||
classDef
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}.getReference(-1)
|
|
||||||
val playbackHandlerWrapperImplementorClassReference = OnPlaybackRateItemClickFingerprint
|
|
||||||
.getReference(-1)
|
|
||||||
val playbackHandlerFieldReference = OnPlaybackRateItemClickFingerprint
|
|
||||||
.getReference()
|
|
||||||
val setPlaybackRateMethodReference = OnPlaybackRateItemClickFingerprint
|
|
||||||
.getReference(1)
|
|
||||||
|
|
||||||
mutableMethod.addInstructions(
|
|
||||||
0,
|
|
||||||
"""
|
|
||||||
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->getRememberedPlaybackRate()F
|
|
||||||
move-result v0
|
|
||||||
|
|
||||||
# check if the playback rate is below 0 (when a playback rate was never remembered)
|
|
||||||
|
|
||||||
const/4 v1, 0x0
|
|
||||||
cmpg-float v1, v0, v1
|
|
||||||
if-lez v1, :do_not_override
|
|
||||||
|
|
||||||
# invoke setPlaybackRate
|
|
||||||
|
|
||||||
iget-object v1, p0, $playbackHandlerWrapperFieldReference
|
|
||||||
check-cast v1, $playbackHandlerWrapperImplementorClassReference
|
|
||||||
iget-object v2, v1, $playbackHandlerFieldReference
|
|
||||||
invoke-virtual {v2, v0}, $setPlaybackRateMethodReference
|
|
||||||
""".trimIndent(),
|
|
||||||
listOf(ExternalLabel("do_not_override", mutableMethod.instruction(0)))
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remember the selected playback rate.
|
|
||||||
OnPlaybackRateItemClickFingerprint.result!!.apply {
|
|
||||||
val setPlaybackRateIndex = scanResult.patternScanResult!!.endIndex
|
|
||||||
val selectedPlaybackRateRegister =
|
|
||||||
(mutableMethod.instruction(setPlaybackRateIndex) as FiveRegisterInstruction).registerD
|
|
||||||
|
|
||||||
mutableMethod.addInstruction(
|
|
||||||
setPlaybackRateIndex,
|
|
||||||
"invoke-static { v$selectedPlaybackRateRegister }, $INTEGRATIONS_CLASS_DESCRIPTOR->rememberPlaybackRate(F)V"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return PatchResultSuccess()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -46,20 +46,20 @@ class VideoIdPatch : BytecodePatch(
|
|||||||
private lateinit var insertMethod: MutableMethod
|
private lateinit var insertMethod: MutableMethod
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an invoke-static instruction, called with the new id when the video changes
|
* Adds an invoke-static instruction, called with the new id when the video changes.
|
||||||
|
* Be aware, this can be called multiple times for the same video id.
|
||||||
|
*
|
||||||
* @param methodDescriptor which method to call. Params have to be `Ljava/lang/String;`
|
* @param methodDescriptor which method to call. Params have to be `Ljava/lang/String;`
|
||||||
*/
|
*/
|
||||||
fun injectCall(
|
fun injectCall(
|
||||||
methodDescriptor: String
|
methodDescriptor: String
|
||||||
) {
|
) = insertMethod.addInstructions(
|
||||||
insertMethod.addInstructions(
|
// Keep injection calls in the order they're added.
|
||||||
// TODO: The order has been proven to not be required, so remove the logic for keeping order.
|
// Order has been proven to be important for the same reason that order of patch execution is important
|
||||||
// Keep injection calls in the order they're added:
|
// such as for the VideoInformation patch.
|
||||||
// Increment index. So if additional injection calls are added, those calls run after this injection call.
|
insertIndex++,
|
||||||
insertIndex++,
|
"invoke-static {v$videoIdRegister}, $methodDescriptor"
|
||||||
"invoke-static {v$videoIdRegister}, $methodDescriptor"
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user