Compare commits

..

2 Commits

Author SHA1 Message Date
semantic-release-bot
85a32e833e chore(release): 2.169.1-dev.2 [skip ci]
## [2.169.1-dev.2](https://github.com/revanced/revanced-patches/compare/v2.169.1-dev.1...v2.169.1-dev.2) (2023-04-21)

### Bug Fixes

* **"enable-android-debugging:** don't include by default ([5614651](5614651d34))
2023-04-21 16:50:56 +00:00
oSumAtrIX
5614651d34 fix("enable-android-debugging): don't include by default 2023-04-21 18:49:10 +02:00
99 changed files with 840 additions and 1398 deletions

2
.github/config.yml vendored
View File

@@ -1,2 +0,0 @@
firstPRMergeComment: >
Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) if you want to receive a contributor role.

View File

@@ -1,203 +1,3 @@
# [2.173.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.172.0...v2.173.0-dev.1) (2023-05-02)
### Features
* **youtube:** bump compatibility to `18.16.37` ([fe3fdd5](https://github.com/revanced/revanced-patches/commit/fe3fdd5c6cb186bcebc2f86b1d5b597109b25cb6))
* **youtube:** support version `18.16.37` ([8beb5ea](https://github.com/revanced/revanced-patches/commit/8beb5ea860284be915c0ef0c6039821a50c14fa8))
# [2.172.0](https://github.com/revanced/revanced-patches/compare/v2.171.0...v2.172.0) (2023-05-01)
### Bug Fixes
* **change-package-name:** use `null` as default value for option `packageName` ([#1998](https://github.com/revanced/revanced-patches/issues/1998)) ([8128e6b](https://github.com/revanced/revanced-patches/commit/8128e6ba57ec4e4e01a0923a0d353cc934b93899))
* **youtube/minimized-playback:** fix background play of kids videos ([#2016](https://github.com/revanced/revanced-patches/issues/2016)) ([89b1484](https://github.com/revanced/revanced-patches/commit/89b1484d1d8c1419ba8020d0571b25071d43e926))
* **youtube/return-youtube-dislike:** support older UI layouts ([#2031](https://github.com/revanced/revanced-patches/issues/2031)) ([c82ccb5](https://github.com/revanced/revanced-patches/commit/c82ccb59955d7663a5be20338b4b5c9b7601195c))
* **youtube/spoof-app-version:** adjust available app targets ([#2030](https://github.com/revanced/revanced-patches/issues/2030)) ([a16cb0d](https://github.com/revanced/revanced-patches/commit/a16cb0d32f40694f237cb1820b965cee26663fdd))
### Features
* **youtube/general-ads:** hide multiple audio track button on video player overlay ([#2021](https://github.com/revanced/revanced-patches/issues/2021)) ([8d7f305](https://github.com/revanced/revanced-patches/commit/8d7f305aa2d8f86a9232a6a9577a87f58b53d51c))
* **youtube/hide-get-premium:** hide get premium advertisements under video player ([#2020](https://github.com/revanced/revanced-patches/issues/2020)) ([05904a2](https://github.com/revanced/revanced-patches/commit/05904a2569cf9b82e3731692b93bc3a6bb005b03))
* **youtube/hide-player-overlay:** exclude by default ([1c6fb94](https://github.com/revanced/revanced-patches/commit/1c6fb941f59599e2fe4a7d6f96babb6b0edac054))
* **youtube/spoof-app-version:** user selectable version to spoof ([#2013](https://github.com/revanced/revanced-patches/issues/2013)) ([fd66417](https://github.com/revanced/revanced-patches/commit/fd6641747bd60bdd8b967db7cceaed454fb891a1))
* **youtube/spoof-signature-verification:** list known spoofing side effects in revanced settings ([#2011](https://github.com/revanced/revanced-patches/issues/2011)) ([dc6e9b2](https://github.com/revanced/revanced-patches/commit/dc6e9b2268efe8a1bb72b80e5285d7002f448f4d))
# [2.172.0-dev.9](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.8...v2.172.0-dev.9) (2023-05-01)
### Features
* **youtube/general-ads:** hide multiple audio track button on video player overlay ([#2021](https://github.com/revanced/revanced-patches/issues/2021)) ([8d7f305](https://github.com/revanced/revanced-patches/commit/8d7f305aa2d8f86a9232a6a9577a87f58b53d51c))
# [2.172.0-dev.8](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.7...v2.172.0-dev.8) (2023-05-01)
### Bug Fixes
* **change-package-name:** use `null` as default value for option `packageName` ([#1998](https://github.com/revanced/revanced-patches/issues/1998)) ([8128e6b](https://github.com/revanced/revanced-patches/commit/8128e6ba57ec4e4e01a0923a0d353cc934b93899))
# [2.172.0-dev.7](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.6...v2.172.0-dev.7) (2023-04-30)
### Bug Fixes
* **youtube/return-youtube-dislike:** support older UI layouts ([#2031](https://github.com/revanced/revanced-patches/issues/2031)) ([c82ccb5](https://github.com/revanced/revanced-patches/commit/c82ccb59955d7663a5be20338b4b5c9b7601195c))
# [2.172.0-dev.6](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.5...v2.172.0-dev.6) (2023-04-30)
### Features
* **youtube/hide-get-premium:** hide get premium advertisements under video player ([#2020](https://github.com/revanced/revanced-patches/issues/2020)) ([05904a2](https://github.com/revanced/revanced-patches/commit/05904a2569cf9b82e3731692b93bc3a6bb005b03))
# [2.172.0-dev.5](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.4...v2.172.0-dev.5) (2023-04-30)
### Bug Fixes
* **youtube/spoof-app-version:** adjust available app targets ([#2030](https://github.com/revanced/revanced-patches/issues/2030)) ([a16cb0d](https://github.com/revanced/revanced-patches/commit/a16cb0d32f40694f237cb1820b965cee26663fdd))
# [2.172.0-dev.4](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.3...v2.172.0-dev.4) (2023-04-30)
### Features
* **youtube/hide-player-overlay:** exclude by default ([1c6fb94](https://github.com/revanced/revanced-patches/commit/1c6fb941f59599e2fe4a7d6f96babb6b0edac054))
# [2.172.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.2...v2.172.0-dev.3) (2023-04-29)
### Features
* **youtube/spoof-signature-verification:** list known spoofing side effects in revanced settings ([#2011](https://github.com/revanced/revanced-patches/issues/2011)) ([dc6e9b2](https://github.com/revanced/revanced-patches/commit/dc6e9b2268efe8a1bb72b80e5285d7002f448f4d))
# [2.172.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.172.0-dev.1...v2.172.0-dev.2) (2023-04-29)
### Bug Fixes
* **youtube/minimized-playback:** fix background play of kids videos ([#2016](https://github.com/revanced/revanced-patches/issues/2016)) ([89b1484](https://github.com/revanced/revanced-patches/commit/89b1484d1d8c1419ba8020d0571b25071d43e926))
# [2.172.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.171.0...v2.172.0-dev.1) (2023-04-28)
### Features
* **youtube/spoof-app-version:** user selectable version to spoof ([#2013](https://github.com/revanced/revanced-patches/issues/2013)) ([fd66417](https://github.com/revanced/revanced-patches/commit/fd6641747bd60bdd8b967db7cceaed454fb891a1))
# [2.171.0](https://github.com/revanced/revanced-patches/compare/v2.170.0...v2.171.0) (2023-04-27)
### Bug Fixes
* **enable-android-debugging:** make option `debuggable` false by default ([e717e26](https://github.com/revanced/revanced-patches/commit/e717e260fd0449a97929c3c82da577362586c5e1))
* **youtube/minimized-playback:** disable minimized playback for shorts ([#1990](https://github.com/revanced/revanced-patches/issues/1990)) ([b91d18d](https://github.com/revanced/revanced-patches/commit/b91d18d24f332a9aa8721dc053e395d352b5796d))
* **youtube/spoof-signature-verification:** additional fixes for subtitle window positions ([#1975](https://github.com/revanced/revanced-patches/issues/1975)) ([08584e6](https://github.com/revanced/revanced-patches/commit/08584e680fc658f37e8730499fa5197a08370776))
### Features
* **id-austria:** remove compatibility version constraint ([#1952](https://github.com/revanced/revanced-patches/issues/1952)) ([94ffd5a](https://github.com/revanced/revanced-patches/commit/94ffd5a26fe42f223a09ad6bd7f34f1fac0986ad))
* **youtube/sponsorblock:** automatically hide skip button ([#1956](https://github.com/revanced/revanced-patches/issues/1956)) ([c3c8ae6](https://github.com/revanced/revanced-patches/commit/c3c8ae6b4377b12838971cedc32779e12c07363c))
* **youtube:** `hide-player-overlay` patch ([#1965](https://github.com/revanced/revanced-patches/issues/1965)) ([d233d96](https://github.com/revanced/revanced-patches/commit/d233d96faf838b22f4c458ad445af048362e7421))
# [2.171.0-dev.5](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.4...v2.171.0-dev.5) (2023-04-27)
### Bug Fixes
* **enable-android-debugging:** make option `debuggable` false by default ([e717e26](https://github.com/revanced/revanced-patches/commit/e717e260fd0449a97929c3c82da577362586c5e1))
# [2.171.0-dev.4](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.3...v2.171.0-dev.4) (2023-04-27)
### Bug Fixes
* **youtube/minimized-playback:** disable minimized playback for shorts ([#1990](https://github.com/revanced/revanced-patches/issues/1990)) ([b91d18d](https://github.com/revanced/revanced-patches/commit/b91d18d24f332a9aa8721dc053e395d352b5796d))
# [2.171.0-dev.3](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.2...v2.171.0-dev.3) (2023-04-26)
### Features
* **youtube/sponsorblock:** automatically hide skip button ([#1956](https://github.com/revanced/revanced-patches/issues/1956)) ([c3c8ae6](https://github.com/revanced/revanced-patches/commit/c3c8ae6b4377b12838971cedc32779e12c07363c))
# [2.171.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.171.0-dev.1...v2.171.0-dev.2) (2023-04-25)
### Features
* **youtube:** `hide-player-overlay` patch ([#1965](https://github.com/revanced/revanced-patches/issues/1965)) ([d233d96](https://github.com/revanced/revanced-patches/commit/d233d96faf838b22f4c458ad445af048362e7421))
# [2.171.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.170.1-dev.1...v2.171.0-dev.1) (2023-04-25)
### Features
* **id-austria:** remove compatibility version constraint ([#1952](https://github.com/revanced/revanced-patches/issues/1952)) ([94ffd5a](https://github.com/revanced/revanced-patches/commit/94ffd5a26fe42f223a09ad6bd7f34f1fac0986ad))
## [2.170.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.170.0...v2.170.1-dev.1) (2023-04-25)
### Bug Fixes
* **youtube/spoof-signature-verification:** additional fixes for subtitle window positions ([#1975](https://github.com/revanced/revanced-patches/issues/1975)) ([08584e6](https://github.com/revanced/revanced-patches/commit/08584e680fc658f37e8730499fa5197a08370776))
# [2.170.0](https://github.com/revanced/revanced-patches/compare/v2.169.0...v2.170.0) (2023-04-24)
### Bug Fixes
* **enable-android-debugging:** don't include by default ([b2856f7](https://github.com/revanced/revanced-patches/commit/b2856f7f71640f78dfc11b3dff90a58add48d605))
* **twitch/block-embedded-ads:** correct spelling mistake ([#1962](https://github.com/revanced/revanced-patches/issues/1962)) ([6138c2a](https://github.com/revanced/revanced-patches/commit/6138c2ac24f586137bc4ef974a6600d24ebdda3e))
* **youtube/hide-video-action-buttons:** fix hide action buttons not working for some users ([#1959](https://github.com/revanced/revanced-patches/issues/1959)) ([3ab5842](https://github.com/revanced/revanced-patches/commit/3ab5842ebbee3381604efcaa454ea5c49d3a5363))
* **youtube/sponsorblock:** correct spelling mistake ([#1941](https://github.com/revanced/revanced-patches/issues/1941)) ([d9d0fe7](https://github.com/revanced/revanced-patches/commit/d9d0fe7e236ccce348e8b3214454d29656a853c0))
* **youtube/sponsorblock:** use lowercase letters for URL string ([#1942](https://github.com/revanced/revanced-patches/issues/1942)) ([b58842a](https://github.com/revanced/revanced-patches/commit/b58842a5f6f3fbcf06e87821bbc1ad3be7ca2fc0))
* **youtube/tablet-mini-player:** throw if fingerprint fails to resolve ([642eef3](https://github.com/revanced/revanced-patches/commit/642eef39e8e8eeb1f95980f95b83e79faffe3a18))
### Features
* **youtube/wide-searchbar:** rename patch ([bb5885e](https://github.com/revanced/revanced-patches/commit/bb5885eca4b750f15776de9099fb4dd83f6d70f5))
* **youtube:** bump compatibility to `18.15.40` ([ad82fcd](https://github.com/revanced/revanced-patches/commit/ad82fcdb63c7cc77e7387b7f0da95b005c90ce31))
* **youtube:** constrain patches to `18.15.40` ([c0c10de](https://github.com/revanced/revanced-patches/commit/c0c10dec3446d35e20b17c25510cddcbe07b494f))
* **youtube:** remove non working patch `hide-my-mix` ([6ae0f0b](https://github.com/revanced/revanced-patches/commit/6ae0f0b466322c4d60feb20ed0e809783452b9d4))
* **youtube:** support version `18.15.40` ([c3614ab](https://github.com/revanced/revanced-patches/commit/c3614ab1d10a70fdb0813d7249866d696b28088f))
# [2.170.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.169.1-dev.4...v2.170.0-dev.1) (2023-04-24)
### Bug Fixes
* **youtube/tablet-mini-player:** throw if fingerprint fails to resolve ([c78ab33](https://github.com/revanced/revanced-patches/commit/c78ab33a8d41694aaee60d0a3d99c51c95085489))
### Features
* **youtube/wide-searchbar:** rename patch ([ac9ad79](https://github.com/revanced/revanced-patches/commit/ac9ad79f2ff4fbe4fa73b80bae88d12a03a287d7))
* **youtube:** bump compatibility to `18.15.40` ([72008da](https://github.com/revanced/revanced-patches/commit/72008da28637bb6b4bf6f0e0ae1b6bce584dd696))
* **youtube:** bump compatibility to `18.15.40` ([#1964](https://github.com/revanced/revanced-patches/issues/1964)) ([c4c6653](https://github.com/revanced/revanced-patches/commit/c4c6653c37b9675ff0f7b0f29470342c99caba34))
* **youtube:** constrain patches to `18.15.40` ([dfbf8ab](https://github.com/revanced/revanced-patches/commit/dfbf8ab206e779fe2624d5f62c5dab170d68fce5))
* **youtube:** remove non working patch `hide-my-mix` ([f8ea2cf](https://github.com/revanced/revanced-patches/commit/f8ea2cf3bcec3ec4bfb424ed8e4a640b505387d7))
* **youtube:** support version `18.15.40` ([b2916a3](https://github.com/revanced/revanced-patches/commit/b2916a379a631481c0750e312d04a4c9e82590d6))
## [2.169.1-dev.4](https://github.com/revanced/revanced-patches/compare/v2.169.1-dev.3...v2.169.1-dev.4) (2023-04-23)
### Bug Fixes
* **twitch/block-embedded-ads:** correct spelling mistake ([#1962](https://github.com/revanced/revanced-patches/issues/1962)) ([100d9dd](https://github.com/revanced/revanced-patches/commit/100d9dd7e0b9d83a96fb25c2ffda06fc018830e4))
## [2.169.1-dev.3](https://github.com/revanced/revanced-patches/compare/v2.169.1-dev.2...v2.169.1-dev.3) (2023-04-23)
### Bug Fixes
* **youtube/hide-video-action-buttons:** fix hide action buttons not working for some users ([#1959](https://github.com/revanced/revanced-patches/issues/1959)) ([3ff1489](https://github.com/revanced/revanced-patches/commit/3ff1489b32968e9bad3361f924b7079e7b6f29e2))
## [2.169.1-dev.2](https://github.com/revanced/revanced-patches/compare/v2.169.1-dev.1...v2.169.1-dev.2) (2023-04-21) ## [2.169.1-dev.2](https://github.com/revanced/revanced-patches/compare/v2.169.1-dev.1...v2.169.1-dev.2) (2023-04-21)

131
README.md
View File

@@ -9,61 +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.16.37 | | `always-autorepeat` | Always repeats the playing video again. | 18.08.37 |
| `client-spoof` | Spoofs a patched client to allow playback. | all | | `client-spoof` | Spoofs a patched client to allow playback. | all |
| `comments` | Hides components related to comments. | 18.16.37 | | `comments` | Hides components related to comments. | 18.08.37 |
| `copy-video-url` | Adds buttons in player to copy video links. | 18.16.37 | | `copy-video-url` | Adds buttons in player to copy video links. | 18.08.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. | 18.16.37 | | `custom-video-buffer` | Lets you change the buffers of videos. | 18.08.37 |
| `custom-video-speed` | Adds more video speed options. | 18.16.37 | | `custom-video-speed` | Adds more video speed options. | 18.08.37 |
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 18.16.37 | | `disable-auto-captions` | Disable forced captions from being automatically enabled. | 18.08.37 |
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 18.16.37 | | `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 18.08.37 |
| `disable-player-popup-panels` | Disables panels from appearing automatically when going into fullscreen (playlist or live chat). | 18.16.37 | | `disable-player-popup-panels` | Disables panels from appearing automatically when going into fullscreen (playlist or live chat). | 18.08.37 |
| `disable-shorts-on-startup` | Disables playing YouTube Shorts when launching YouTube. | 18.16.37 | | `disable-shorts-on-startup` | Disables playing YouTube Shorts when launching YouTube. | 18.08.37 |
| `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.16.37 | | `downloads` | Enables downloading music and videos from YouTube. | 18.08.37 |
| `enable-debugging` | Adds debugging options. | all | | `enable-debugging` | Adds debugging options. | all |
| `general-ads` | Removes general ads. | 18.16.37 | | `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 18.08.37 |
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 18.16.37 | | `general-ads` | Removes general ads. | 18.08.37 |
| `hide-album-cards` | Hides the album cards below the artist description. | 18.16.37 | | `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 18.08.37 |
| `hide-artist-card` | Hides the artist card below the searchbar. | 18.16.37 | | `hide-album-cards` | Hides the album cards below the artist description. | 18.08.37 |
| `hide-autoplay-button` | Hides the autoplay button in the video player. | 18.16.37 | | `hide-artist-card` | Hides the artist card below the searchbar. | 18.08.37 |
| `hide-breaking-news-shelf` | Hides the breaking news shelf on the homepage tab. | 18.16.37 | | `hide-autoplay-button` | Hides the autoplay button in the video player. | 18.08.37 |
| `hide-captions-button` | Hides the captions button on video player. | 18.16.37 | | `hide-breaking-news-shelf` | Hides the breaking news shelf on the homepage tab. | 18.08.37 |
| `hide-captions-button` | Hides the captions button on video player. | 18.08.37 |
| `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.16.37 | | `hide-create-button` | Hides the create button in the navigation bar. | 18.08.37 |
| `hide-crowdfunding-box` | Hides the crowdfunding box between the player and video description. | 18.16.37 | | `hide-crowdfunding-box` | Hides the crowdfunding box between the player and video description. | 18.08.37 |
| `hide-email-address` | Hides the email address in the account switcher. | 18.16.37 | | `hide-email-address` | Hides the email address in the account switcher. | 18.08.37 |
| `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 18.16.37 | | `hide-endscreen-cards` | Hides the suggested video cards at the end of a video in fullscreen. | 18.08.37 |
| `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.16.37 | | `hide-floating-microphone-button` | Hides the floating microphone button which appears in search. | 18.08.37 |
| `hide-get-premium` | Hides advertisement for YouTube Premium under the video player. | 18.16.37 | | `hide-info-cards` | Hides info cards in videos. | 18.08.37 |
| `hide-info-cards` | Hides info cards in videos. | 18.16.37 | | `hide-my-mix` | Hides mix playlists. | 18.08.37 |
| `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-player-overlay` | Hides the dark player overlay when player controls are visible. | all | | `hide-seekbar` | Hides the seekbar. | 18.08.37 |
| `hide-seekbar` | Hides the seekbar. | 18.16.37 | | `hide-shorts-button` | Hides the shorts button on the navigation bar. | 18.08.37 |
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 18.16.37 | | `hide-timestamp` | Hides timestamp in video player. | 18.08.37 |
| `hide-timestamp` | Hides timestamp in video player. | 18.16.37 | | `hide-video-action-buttons` | Adds the options to hide action buttons under a video. | 18.08.37 |
| `hide-video-action-buttons` | Adds the options to hide action buttons under a video. | 18.16.37 | | `hide-watch-in-vr` | Hides the option to watch in VR from the player settings flyout panel. | 18.08.37 |
| `hide-watch-in-vr` | Hides the option to watch in VR from the player settings flyout panel. | 18.16.37 | | `hide-watermark` | Hides creator's watermarks on videos. | 18.08.37 |
| `hide-watermark` | Hides creator's watermarks on videos. | 18.16.37 | | `minimized-playback` | Enables minimized and background playback. | 18.08.37 |
| `minimized-playback` | Enables minimized and background playback. | 18.16.37 | | `old-quality-layout` | Enables the original video quality flyout in the video player settings | 18.08.37 |
| `old-quality-layout` | Enables the original video quality flyout in the video player settings | 18.16.37 | | `open-links-externally` | Open links outside of the app directly in your browser. | 18.08.37 |
| `open-links-externally` | Open links outside of the app directly in your browser. | 18.16.37 |
| `premium-heading` | Shows premium branding on the home screen. | all | | `premium-heading` | Shows premium branding on the home screen. | all |
| `remember-playback-speed` | Adds the ability to remember the playback speed you chose in the video playback speed flyout. | 18.16.37 | | `remember-playback-speed` | Adds the ability to remember the playback speed you chose in the video playback speed flyout. | 18.08.37 |
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 18.16.37 | | `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 18.08.37 |
| `remove-player-button-background` | Removes the background from the video player buttons. | 18.16.37 | | `remove-player-button-background` | Removes the background from the video player buttons. | 18.08.37 |
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 18.16.37 | | `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 18.08.37 |
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 18.16.37 | | `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 18.08.37 |
| `sponsorblock` | Integrates SponsorBlock which allows skipping video segments such as sponsored content. | 18.16.37 | | `sponsorblock` | Integrates SponsorBlock which allows skipping video segments such as sponsored content. | 18.08.37 |
| `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.16.37 | | `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.08.37 |
| `spoof-signature-verification` | Spoofs a patched client to prevent playback issues. | 18.16.37 | | `spoof-signature-verification` | Spoofs a patched client to prevent playback issues. | 18.08.37 |
| `swipe-controls` | Adds volume and brightness swipe controls. | 18.16.37 | | `swipe-controls` | Adds volume and brightness swipe controls. | 18.08.37 |
| `tablet-mini-player` | Enables the tablet mini player layout. | 18.16.37 | | `tablet-mini-player` | Enables the tablet mini player layout. | 18.08.37 |
| `theme` | Applies a custom theme. | all | | `theme` | Applies a custom theme. | all |
| `vanced-microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 18.16.37 | | `vanced-microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 18.08.37 |
| `video-ads` | Removes ads in the video player. | 18.16.37 | | `video-ads` | Removes ads in the video player. | 18.08.37 |
| `wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 18.16.37 |
</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)
@@ -122,7 +121,7 @@ The official Patch bundle provided by ReVanced and the community.
| 💊 Patch | 📜 Description | 🏹 Target Version | | 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:| |:--------:|:--------------:|:-----------------:|
| `block-audio-ads` | Blocks audio ads in streams and VODs. | 14.6.1 | | `block-audio-ads` | Blocks audio ads in streams and VODs. | 14.6.1 |
| `block-embedded-ads` | Blocks embedded stream ads using services like TTV.lol or PurpleAdBlocker. | 14.6.1 | | `block-embedded-ads` | Blocks embedded steam ads using services like TTV.lol or PurpleAdBlocker. | 14.6.1 |
| `block-video-ads` | Blocks video ads in streams and VODs. | 14.6.1 | | `block-video-ads` | Blocks video ads in streams and VODs. | 14.6.1 |
| `debug-mode` | Enables Twitch's internal debugging mode. | all | | `debug-mode` | Enables Twitch's internal debugging mode. | all |
| `settings` | Adds settings menu to Twitch. | all | | `settings` | Adds settings menu to Twitch. | all |
@@ -183,8 +182,8 @@ The official Patch bundle provided by ReVanced and the community.
| 💊 Patch | 📜 Description | 🏹 Target Version | | 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:| |:--------:|:--------------:|:-----------------:|
| `remove-root-detection` | Removes the check for root permissions and unlocked bootloader. | all | | `remove-root-detection` | Removes the check for root permissions and unlocked bootloader. | 2.6.0 |
| `spoof-signature` | Spoofs the signature of the app. | all | | `spoof-signature` | Spoofs the signature of the app. | 2.6.0 |
</details> </details>
### [📦 `com.myprog.hexedit`](https://play.google.com/store/apps/details?id=com.myprog.hexedit) ### [📦 `com.myprog.hexedit`](https://play.google.com/store/apps/details?id=com.myprog.hexedit)
@@ -307,6 +306,14 @@ 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>
### [📦 `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>
### [📦 `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>
@@ -315,6 +322,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>
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `unlock-pro` | Unlocks pro features. | all |
</details>
### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses) ### [📦 `org.totschnig.myexpenses`](https://play.google.com/store/apps/details?id=org.totschnig.myexpenses)
<details> <details>
@@ -331,22 +346,6 @@ The official Patch bundle provided by ReVanced and the community.
| `unlock-pro` | Unlocks pro features. | 4.6364 | | `unlock-pro` | Unlocks pro features. | 4.6364 |
</details> </details>
### [📦 `com.ithebk.expensemanager`](https://play.google.com/store/apps/details?id=com.ithebk.expensemanager)
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `unlock-pro` | Unlocks pro features. | all |
</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) ### [📦 `com.awedea.nyx`](https://play.google.com/store/apps/details?id=com.awedea.nyx)
<details> <details>

View File

@@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 2.173.0-dev.1 version = 2.169.1-dev.2

Binary file not shown.

View File

@@ -1,7 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
networkTimeout=10000 networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

7
gradlew vendored
View File

@@ -85,6 +85,9 @@ done
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@@ -194,10 +197,6 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command; # Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in # shell script including quotes and variable substitutions, so put them in

870
package-lock.json generated

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@ import app.revanced.patcher.patch.Patch
import app.revanced.patcher.util.patch.PatchBundle import app.revanced.patcher.util.patch.PatchBundle
import java.io.File import java.io.File
internal typealias PatchBundlePatches = List<Class<out Patch<Context>>> typealias PatchBundlePatches = List<Class<out Patch<Context>>>
internal interface PatchesFileGenerator { internal interface PatchesFileGenerator {
fun generate(bundle: PatchBundlePatches) fun generate(bundle: PatchBundlePatches)

View File

@@ -5,6 +5,7 @@ import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.* import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import org.w3c.dom.Element import org.w3c.dom.Element
@@ -33,7 +34,7 @@ class EnableAndroidDebuggingPatch : ResourcePatch {
var debuggable: Boolean? by option( var debuggable: Boolean? by option(
PatchOption.BooleanOption( PatchOption.BooleanOption(
key = "debuggable", key = "debuggable",
default = false, default = true,
title = "App debugging", title = "App debugging",
description = "Whether to make the app debuggable on Android.", description = "Whether to make the app debuggable on Android.",
) )

View File

@@ -41,7 +41,7 @@ class ChangePackageNamePatch : ResourcePatch {
var packageName: String? by option( var packageName: String? by option(
PatchOption.StringOption( PatchOption.StringOption(
key = "packageName", key = "packageName",
default = null, default = "",
title = "Package name", title = "Package name",
description = "The name of the package to rename of the app.", description = "The name of the package to rename of the app.",
) )

View File

@@ -3,6 +3,6 @@ package app.revanced.patches.idaustria.detection.shared.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
@Compatibility([Package("at.gv.oe.app")]) @Compatibility([Package("at.gv.oe.app", arrayOf("2.5.2", "2.6.0"))])
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class DetectionCompatibility internal annotation class DetectionCompatibility

View File

@@ -24,7 +24,7 @@ import app.revanced.patches.twitch.misc.settings.bytecode.patch.SettingsPatch
@Patch @Patch
@DependsOn([VideoAdsPatch::class, IntegrationsPatch::class, SettingsPatch::class]) @DependsOn([VideoAdsPatch::class, IntegrationsPatch::class, SettingsPatch::class])
@Name("block-embedded-ads") @Name("block-embedded-ads")
@Description("Blocks embedded stream ads using services like TTV.lol or PurpleAdBlocker.") @Description("Blocks embedded steam ads using services like TTV.lol or PurpleAdBlocker.")
@EmbeddedAdsCompatibility @EmbeddedAdsCompatibility
@Version("0.0.1") @Version("0.0.1")
class EmbeddedAdsPatch : BytecodePatch( class EmbeddedAdsPatch : BytecodePatch(

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -212,13 +212,6 @@ class GeneralAdsResourcePatch : ResourcePatch {
true, true,
StringResource("revanced_hide_image_shelf_summary_on", "Image shelf is hidden"), StringResource("revanced_hide_image_shelf_summary_on", "Image shelf is hidden"),
StringResource("revanced_hide_image_shelf_summary_off", "Image shelf is shown") StringResource("revanced_hide_image_shelf_summary_off", "Image shelf is shown")
),
SwitchPreference(
"revanced_hide_audio_track_button",
StringResource("revanced_hide_audio_track_button_title", "Hide audio track button"),
false,
StringResource("revanced_hide_audio_track_button_on", "Audio track button is hidden"),
StringResource("revanced_hide_audio_track_button_off", "Audio track button is shown")
) )
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -51,21 +51,12 @@ class HideButtonsPatch : ResourcePatch {
StringResource("revanced_hide_playlist_button_summary_on", "Playlist button is hidden"), StringResource("revanced_hide_playlist_button_summary_on", "Playlist button is hidden"),
StringResource("revanced_hide_playlist_button_summary_off", "Playlist button is shown") StringResource("revanced_hide_playlist_button_summary_off", "Playlist button is shown")
), ),
SwitchPreference(
"revanced_hide_clip_button",
StringResource("revanced_hide_clip_button_title", "Hide clip button"),
false,
StringResource("revanced_hide_clip_button_summary_on", "Clip button is hidden"),
StringResource("revanced_hide_clip_button_summary_off", "Clip button is shown"),
StringResource("revanced_hide_clip_button_user_dialog_message",
"Hiding the clip button might not work reliably. In the case it does not work, it can only be hidden by enabling \\'Hide all other action buttons\\'")
),
SwitchPreference( SwitchPreference(
"revanced_hide_action_buttons", "revanced_hide_action_buttons",
StringResource("revanced_hide_action_buttons_title", "Hide all other action buttons"), StringResource("revanced_hide_action_buttons_title", "Hide all other action buttons"),
false, false,
StringResource("revanced_hide_action_buttons_summary_on", "Share, remix, thanks, shop, live chat buttons are hidden"), StringResource("revanced_hide_action_buttons_summary_on", "Share, remix, clip, thanks, shop, live chat buttons are hidden"),
StringResource("revanced_hide_action_buttons_summary_off", "Share, remix, thanks, shop, live chat buttons are shown") StringResource("revanced_hide_action_buttons_summary_off", "Share, remix, clip, thanks, shop, live chat buttons are shown")
) )
), ),
StringResource("revanced_hide_buttons_summary", "Hide or show buttons under videos") StringResource("revanced_hide_buttons_summary", "Hide or show buttons under videos")

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -13,9 +13,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -1,8 +0,0 @@
package app.revanced.patches.youtube.layout.hide.getpremium.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.google.android.youtube", arrayOf("18.15.40", "18.16.37"))])
@Target(AnnotationTarget.CLASS)
internal annotation class HideGetPremiumCompatibility

View File

@@ -1,17 +0,0 @@
package app.revanced.patches.youtube.layout.hide.getpremium.bytecode.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object GetPremiumViewFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.ADD_INT_2ADDR,
Opcode.ADD_INT_2ADDR,
Opcode.INVOKE_VIRTUAL,
Opcode.RETURN_VOID
),
customFingerprint = { methodDef ->
methodDef.definingClass == "Lcom/google/android/apps/youtube/app/red/presenter/CompactYpcOfferModuleView;"
&& methodDef.name == "onMeasure"
}
)

View File

@@ -1,77 +0,0 @@
package app.revanced.patches.youtube.layout.hide.getpremium.bytecode.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.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.patches.shared.settings.preference.impl.StringResource
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
import app.revanced.patches.youtube.layout.hide.getpremium.annotations.HideGetPremiumCompatibility
import app.revanced.patches.youtube.layout.hide.getpremium.bytecode.fingerprints.GetPremiumViewFingerprint
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.TwoRegisterInstruction
@Patch
@DependsOn([IntegrationsPatch::class, SettingsPatch::class])
@Name("hide-get-premium")
@Description("Hides advertisement for YouTube Premium under the video player.")
@HideGetPremiumCompatibility
@Version("0.0.1")
class HideGetPremiumPatch : BytecodePatch(
listOf(
GetPremiumViewFingerprint,
)
) {
override fun execute(context: BytecodeContext): PatchResult {
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
SwitchPreference(
"revanced_hide_get_premium",
StringResource("revanced_hide_get_premium_title", "Hide YouTube Premium advertisement"),
true,
StringResource("revanced_hide_get_premium_summary_on", "YouTube Premium advertisement are hidden"),
StringResource("revanced_hide_get_premium_summary_off", "YouTube Premium advertisement are shown")
)
)
GetPremiumViewFingerprint.result?.let {
it.mutableMethod.apply {
val startIndex = it.scanResult.patternScanResult!!.startIndex
val measuredWidthRegister = (instruction(startIndex) as TwoRegisterInstruction).registerA
val measuredHeightInstruction = instruction(startIndex + 1) as TwoRegisterInstruction
val measuredHeightRegister = measuredHeightInstruction.registerA
val tempRegister = measuredHeightInstruction.registerB
addInstructions(
startIndex + 2,
"""
# Override the internal measurement of the layout with zero values.
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->hideGetPremiumView()Z
move-result v$tempRegister
if-eqz v$tempRegister, :allow
const/4 v$measuredWidthRegister, 0x0
const/4 v$measuredHeightRegister, 0x0
:allow
nop
# Layout width/height is then passed to a protected class method.
"""
)
}
} ?: return GetPremiumViewFingerprint.toErrorResult()
return PatchResultSuccess()
}
private companion object {
const val INTEGRATIONS_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/patches/HideGetPremiumPatch;"
}
}

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.youtube.layout.hide.mixplaylists.annotations
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",
"18.08.37"
)
)]
)
@Target(AnnotationTarget.CLASS)
internal annotation class MixPlaylistsPatchCompatibility

View File

@@ -0,0 +1,24 @@
package app.revanced.patches.youtube.layout.hide.mixplaylists.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 CreateMixPlaylistFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L", "L", "L", "L", "L"), listOf(
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.INVOKE_VIRTUAL,
)
)

View File

@@ -0,0 +1,24 @@
package app.revanced.patches.youtube.layout.hide.mixplaylists.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 SecondCreateMixPlaylistFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L", "L", "L", "L"), listOf(
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.RETURN_VOID
)
)

View File

@@ -0,0 +1,64 @@
package app.revanced.patches.youtube.layout.hide.mixplaylists.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.extensions.addInstruction
import app.revanced.patcher.extensions.instruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
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.shared.settings.preference.impl.StringResource
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
import app.revanced.patches.youtube.layout.hide.mixplaylists.annotations.MixPlaylistsPatchCompatibility
import app.revanced.patches.youtube.layout.hide.mixplaylists.fingerprints.CreateMixPlaylistFingerprint
import app.revanced.patches.youtube.layout.hide.mixplaylists.fingerprints.SecondCreateMixPlaylistFingerprint
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
@DependsOn([IntegrationsPatch::class])
@Name("hide-my-mix")
@Description("Hides mix playlists.")
@MixPlaylistsPatchCompatibility
@Version("0.0.1")
class MixPlaylistsPatch : BytecodePatch(
listOf(
CreateMixPlaylistFingerprint, SecondCreateMixPlaylistFingerprint
)
) {
override fun execute(context: BytecodeContext): PatchResult {
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
SwitchPreference(
"revanced_hide_mix_playlists",
StringResource("revanced_hide_mix_playlists_title", "Hide mix playlists"),
false,
StringResource("revanced_hide_mix_playlists_summary_on", "Mix playlists are hidden"),
StringResource("revanced_hide_mix_playlists_summary_off", "Mix playlists are shown")
)
)
arrayOf(CreateMixPlaylistFingerprint, SecondCreateMixPlaylistFingerprint).forEach(::addHook)
return PatchResultSuccess()
}
private fun addHook(fingerprint: MethodFingerprint) {
with (fingerprint.result!!) {
val insertIndex = scanResult.patternScanResult!!.endIndex - 3
val register = (mutableMethod.instruction(insertIndex - 2) as OneRegisterInstruction).registerA
mutableMethod.addInstruction(
insertIndex,
"invoke-static {v$register}, Lapp/revanced/integrations/patches/HideMixPlaylistsPatch;->hideMixPlaylists(Landroid/view/View;)V"
)
}
}
}

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -1,8 +0,0 @@
package app.revanced.patches.youtube.layout.hide.player.overlay.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.google.android.youtube")])
@Target(AnnotationTarget.CLASS)
internal annotation class HidePlayerOverlayPatchCompatibility

View File

@@ -1,46 +0,0 @@
package app.revanced.patches.youtube.layout.hide.player.overlay.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.Patch
import app.revanced.patches.youtube.layout.hide.player.overlay.annotations.HidePlayerOverlayPatchCompatibility
@Patch(false)
@Name("hide-player-overlay")
@Description("Hides the dark player overlay when player controls are visible.")
@HidePlayerOverlayPatchCompatibility
@Version("0.0.1")
class HidePlayerOverlayPatch : ResourcePatch {
override fun execute(context: ResourceContext): PatchResult {
val attributes = arrayOf("height", "width")
context.xmlEditor[RESOURCE_FILE_PATH].use { editor ->
editor.file.getElementsByTagName("FrameLayout").item(0).childNodes.apply {
for (i in 1 until length) {
val view = item(i)
if (
view.attributes.getNamedItem("android:id")
?.nodeValue
?.endsWith("scrim_overlay") == true
) {
attributes.forEach {
view.attributes.getNamedItem("android:layout_$it").nodeValue = "0.0dip"
}
break
}
}
}
}
return PatchResultSuccess()
}
private companion object {
const val RESOURCE_FILE_PATH = "res/layout/youtube_controls_overlay.xml"
}
}

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike.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
@Compatibility([Package("com.google.android.youtube", arrayOf("18.15.40", "18.16.37"))]) @Compatibility([Package("com.google.android.youtube", arrayOf("18.08.37"))])
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class ReturnYouTubeDislikeCompatibility internal annotation class ReturnYouTubeDislikeCompatibility

View File

@@ -1,28 +0,0 @@
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.layout.returnyoutubedislike.resource.patch.ReturnYouTubeDislikeResourcePatch
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
object DislikesOldLayoutTextViewFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("L"),
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
opcodes = listOf(
Opcode.CONST, // resource identifier register
Opcode.INVOKE_VIRTUAL,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.IF_NEZ, // textview register
Opcode.GOTO,
),
customFingerprint = { methodDef ->
methodDef.implementation?.instructions?.any { instruction ->
instruction.opcode.ordinal == Opcode.CONST.ordinal &&
(instruction as? WideLiteralInstruction)?.wideLiteral == ReturnYouTubeDislikeResourcePatch.oldUIDislikeId
} == true
}
)

View File

@@ -1,8 +1,11 @@
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
@FuzzyPatternScanMethod(2)
object LikeFingerprint : MethodFingerprint( object LikeFingerprint : MethodFingerprint(
"V", "V",
strings = listOf("like/like") strings = listOf("like/like")
) )

View File

@@ -1,10 +1,13 @@
package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints package app.revanced.patches.youtube.layout.returnyoutubedislike.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode import org.jf.dexlib2.Opcode
object ShortsTextComponentParentFingerprint : MethodFingerprint( object ShortsTextComponentParentFingerprint : MethodFingerprint(
returnType = "V", returnType = "V",
access = AccessFlags.PROTECTED or AccessFlags.FINAL,
parameters = listOf("L", "L"), parameters = listOf("L", "L"),
opcodes = listOf( opcodes = listOf(
Opcode.INVOKE_STATIC, Opcode.INVOKE_STATIC,

View File

@@ -16,16 +16,15 @@ object TextComponentAtomicReferenceFingerprint : MethodFingerprint(
Opcode.MOVE_OBJECT, // available unused register Opcode.MOVE_OBJECT, // available unused register
Opcode.MOVE_OBJECT_FROM16, Opcode.MOVE_OBJECT_FROM16,
Opcode.MOVE_OBJECT_FROM16, Opcode.MOVE_OBJECT_FROM16,
Opcode.MOVE_OBJECT_FROM16, Opcode.MOVE_FROM16,
Opcode.MOVE_OBJECT_FROM16,
Opcode.INVOKE_VIRTUAL, // CharSequence atomic reference Opcode.INVOKE_VIRTUAL, // CharSequence atomic reference
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST, Opcode.CHECK_CAST,
Opcode.MOVE_OBJECT, // CharSequence reference, and control flow label. Insert code here. Opcode.MOVE_OBJECT, // CharSequence reference, and control flow label. Insert code here.
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL_RANGE,
Opcode.MOVE_RESULT, Opcode.MOVE_RESULT,
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL_RANGE,
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,
Opcode.GOTO, Opcode.GOTO,
Opcode.CONST_4, Opcode.CONST_4,

View File

@@ -7,7 +7,6 @@ import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.data.toMethodWalker import app.revanced.patcher.data.toMethodWalker
import app.revanced.patcher.extensions.MethodFingerprintExtensions.name import app.revanced.patcher.extensions.MethodFingerprintExtensions.name
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.instruction import app.revanced.patcher.extensions.instruction
import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.extensions.replaceInstruction
@@ -27,7 +26,6 @@ import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch import app.revanced.patches.youtube.misc.video.videoid.patch.VideoIdPatch
import org.jf.dexlib2.builder.instruction.BuilderInstruction35c import org.jf.dexlib2.builder.instruction.BuilderInstruction35c
import org.jf.dexlib2.iface.instruction.FiveRegisterInstruction
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
@@ -49,7 +47,6 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
listOf( listOf(
TextComponentConstructorFingerprint, TextComponentConstructorFingerprint,
ShortsTextComponentParentFingerprint, ShortsTextComponentParentFingerprint,
DislikesOldLayoutTextViewFingerprint,
LikeFingerprint, LikeFingerprint,
DislikeFingerprint, DislikeFingerprint,
RemoveLikeFingerprint, RemoveLikeFingerprint,
@@ -58,7 +55,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
// region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded.
VideoIdPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->newVideoLoaded(Ljava/lang/String;)V") VideoIdPatch.injectCall("$INTEGRATIONS_PATCH_CLASS_DESCRIPTOR->newVideoLoaded(Ljava/lang/String;)V")
// endregion // endregion
@@ -74,7 +71,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
0, 0,
""" """
const/4 v0, ${vote.value} const/4 v0, ${vote.value}
invoke-static {v0}, $INTEGRATIONS_CLASS_DESCRIPTOR->sendVote(I)V invoke-static {v0}, $INTEGRATIONS_PATCH_CLASS_DESCRIPTOR->sendVote(I)V
""" """
) )
} ?: return PatchResultError("Failed to find ${fingerprint.name} method.") } ?: return PatchResultError("Failed to find ${fingerprint.name} method.")
@@ -104,15 +101,14 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
textComponentContextFingerprintResult.mutableMethod.apply { textComponentContextFingerprintResult.mutableMethod.apply {
// Get the conversion context obfuscated field name, and the registers for the AtomicReference and CharSequence // Get the conversion context obfuscated field name, and the registers for the AtomicReference and CharSequence
val conversionContextFieldReference = val conversionContextFieldName =
(instruction(conversionContextIndex) as ReferenceInstruction).reference (instruction(conversionContextIndex) as ReferenceInstruction).reference.toString()
// any free register val contextRegister = // any free register
val contextRegister =
(instruction(atomicReferenceStartIndex) as TwoRegisterInstruction).registerB (instruction(atomicReferenceStartIndex) as TwoRegisterInstruction).registerB
val atomicReferenceRegister = val atomicReferenceRegister =
(instruction(atomicReferenceStartIndex + 5) as FiveRegisterInstruction).registerC (instruction(atomicReferenceStartIndex + 4) as BuilderInstruction35c).registerC
val insertIndex = atomicReferenceStartIndex + 8 val insertIndex = atomicReferenceStartIndex + 7
val moveCharSequenceInstruction = instruction(insertIndex) as TwoRegisterInstruction val moveCharSequenceInstruction = instruction(insertIndex) as TwoRegisterInstruction
val charSequenceRegister = moveCharSequenceInstruction.registerB val charSequenceRegister = moveCharSequenceInstruction.registerB
@@ -121,10 +117,10 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
replaceInstruction(insertIndex, "move-object/from16 v$contextRegister, p0") replaceInstruction(insertIndex, "move-object/from16 v$contextRegister, p0")
addInstructions( addInstructions(
insertIndex + 1, """ insertIndex + 1, """
iget-object v$contextRegister, v$contextRegister, $conversionContextFieldReference # copy obfuscated context field into free register iget-object v$contextRegister, v$contextRegister, $conversionContextFieldName # copy obfuscated context field into free register
invoke-static {v$contextRegister, v$atomicReferenceRegister, v$charSequenceRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; invoke-static {v$contextRegister, v$atomicReferenceRegister, v$charSequenceRegister}, $INTEGRATIONS_PATCH_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;
move-result-object v$charSequenceRegister move-result-object v$charSequenceRegister
move-object v${moveCharSequenceInstruction.registerA}, v${charSequenceRegister} # original instruction at the insertion point move-object v${moveCharSequenceInstruction.registerA}, v${moveCharSequenceInstruction.registerB} # original instruction at the insertion point
""" """
) )
} }
@@ -166,26 +162,11 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
// endregion // endregion
// region Hook old UI layout dislikes, for the older app spoofs used with spoof-app-version.
DislikesOldLayoutTextViewFingerprint.result?.let {
it.mutableMethod.apply {
val startIndex = it.scanResult.patternScanResult!!.startIndex
val resourceIdentifierRegister = (instruction(startIndex) as OneRegisterInstruction).registerA
val textViewRegister = (instruction(startIndex + 4) as OneRegisterInstruction).registerA
addInstruction(startIndex + 4,
"invoke-static {v$resourceIdentifierRegister, v$textViewRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->setOldUILayoutDislikes(ILandroid/widget/TextView;)V"
)
}
} ?: return DislikesOldLayoutTextViewFingerprint.toErrorResult()
// endregion
return PatchResultSuccess() return PatchResultSuccess()
} }
private companion object { private companion object {
const val INTEGRATIONS_CLASS_DESCRIPTOR = const val INTEGRATIONS_PATCH_CLASS_DESCRIPTOR =
"Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;" "Lapp/revanced/integrations/patches/ReturnYouTubeDislikePatch;"
private fun MethodFingerprint.toPatch(voteKind: Vote) = VotePatch(this, voteKind) private fun MethodFingerprint.toPatch(voteKind: Vote) = VotePatch(this, voteKind)
@@ -199,7 +180,7 @@ class ReturnYouTubeDislikePatch : BytecodePatch(
private fun MutableMethod.insertShorts(index: Int, register: Int) { private fun MutableMethod.insertShorts(index: Int, register: Int) {
addInstructions( addInstructions(
index, """ index, """
invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->onShortsComponentCreated(Landroid/text/Spanned;)Landroid/text/Spanned; invoke-static {v$register}, $INTEGRATIONS_PATCH_CLASS_DESCRIPTOR->onShortsComponentCreated(Landroid/text/Spanned;)Landroid/text/Spanned;
move-result-object v$register move-result-object v$register
""" """
) )

View File

@@ -8,7 +8,6 @@ import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
import app.revanced.patches.shared.settings.preference.impl.Preference import app.revanced.patches.shared.settings.preference.impl.Preference
import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.StringResource
import app.revanced.patches.youtube.layout.returnyoutubedislike.annotations.ReturnYouTubeDislikeCompatibility import app.revanced.patches.youtube.layout.returnyoutubedislike.annotations.ReturnYouTubeDislikeCompatibility
@@ -21,10 +20,6 @@ import app.revanced.util.resources.ResourceUtils.mergeStrings
@ReturnYouTubeDislikeCompatibility @ReturnYouTubeDislikeCompatibility
@Version("0.0.1") @Version("0.0.1")
class ReturnYouTubeDislikeResourcePatch : ResourcePatch { class ReturnYouTubeDislikeResourcePatch : ResourcePatch {
companion object {
internal var oldUIDislikeId: Long = -1
}
override fun execute(context: ResourceContext): PatchResult { override fun execute(context: ResourceContext): PatchResult {
val youtubePackage = "com.google.android.youtube" val youtubePackage = "com.google.android.youtube"
SettingsPatch.addPreference( SettingsPatch.addPreference(
@@ -41,10 +36,6 @@ class ReturnYouTubeDislikeResourcePatch : ResourcePatch {
// merge strings // merge strings
context.mergeStrings("returnyoutubedislike/host/values/strings.xml") context.mergeStrings("returnyoutubedislike/host/values/strings.xml")
oldUIDislikeId = ResourceMappingPatch.resourceMappings.single {
it.type == "id" && it.name == "dislike_button"
}.id
return PatchResultSuccess() return PatchResultSuccess()
} }
} }

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -1,13 +0,0 @@
package app.revanced.patches.youtube.layout.searchbar.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object CreateSearchSuggestionsFingerprint : MethodFingerprint(
opcodes = listOf(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.CONST_4
),
strings = listOf("ss_rds")
)

View File

@@ -0,0 +1,27 @@
package app.revanced.patches.youtube.layout.searchbar.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 DrawActionBarFingerprint : MethodFingerprint(
"V",
AccessFlags.PRIVATE or AccessFlags.FINAL,
listOf("I", "I"),
listOf(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.SGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.CONST,
Opcode.INVOKE_VIRTUAL,
Opcode.IGET_OBJECT,
Opcode.INVOKE_STATIC,
),
)

View File

@@ -17,46 +17,22 @@ 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.StringResource
import app.revanced.patches.shared.settings.preference.impl.SwitchPreference import app.revanced.patches.shared.settings.preference.impl.SwitchPreference
import app.revanced.patches.youtube.layout.searchbar.annotations.WideSearchbarCompatibility import app.revanced.patches.youtube.layout.searchbar.annotations.WideSearchbarCompatibility
import app.revanced.patches.youtube.layout.searchbar.fingerprints.CreateSearchSuggestionsFingerprint import app.revanced.patches.youtube.layout.searchbar.fingerprints.DrawActionBarFingerprint
import app.revanced.patches.youtube.layout.searchbar.fingerprints.SetWordmarkHeaderFingerprint import app.revanced.patches.youtube.layout.searchbar.fingerprints.SetWordmarkHeaderFingerprint
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
@Patch @Patch
@DependsOn([IntegrationsPatch::class, SettingsPatch::class]) @DependsOn([IntegrationsPatch::class, SettingsPatch::class])
@Name("wide-searchbar") @Name("enable-wide-searchbar")
@Description("Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.") @Description("Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.")
@WideSearchbarCompatibility @WideSearchbarCompatibility
@Version("0.0.1") @Version("0.0.1")
class WideSearchbarPatch : BytecodePatch( class WideSearchbarPatch : BytecodePatch(
listOf( listOf(
SetWordmarkHeaderFingerprint, CreateSearchSuggestionsFingerprint SetWordmarkHeaderFingerprint, DrawActionBarFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext): PatchResult {
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
SwitchPreference(
"revanced_wide_searchbar",
StringResource("revanced_wide_searchbar_enabled_title", "Enable wide search bar"),
false,
StringResource("revanced_wide_searchbar_summary_on", "Wide search bar is enabled"),
StringResource("revanced_wide_searchbar_summary_off", "Wide search bar is disabled")
)
)
val result = CreateSearchSuggestionsFingerprint.result ?: return CreateSearchSuggestionsFingerprint.toErrorResult()
// patch methods
mapOf(
SetWordmarkHeaderFingerprint to 1,
CreateSearchSuggestionsFingerprint to result.scanResult.patternScanResult!!.startIndex
).forEach { (fingerprint, callIndex) ->
context.walkMutable(callIndex, fingerprint).injectSearchBarHook()
}
return PatchResultSuccess()
}
private companion object { private companion object {
/** /**
* Walk a fingerprints method at a given index mutably. * Walk a fingerprints method at a given index mutably.
@@ -68,7 +44,7 @@ class WideSearchbarPatch : BytecodePatch(
fun BytecodeContext.walkMutable(index: Int, fromFingerprint: MethodFingerprint) = fun BytecodeContext.walkMutable(index: Int, fromFingerprint: MethodFingerprint) =
fromFingerprint.result?.let { fromFingerprint.result?.let {
toMethodWalker(it.method).nextMethod(index, true).getMethod() as MutableMethod toMethodWalker(it.method).nextMethod(index, true).getMethod() as MutableMethod
} ?: throw fromFingerprint.toErrorResult() } ?: throw SetWordmarkHeaderFingerprint.toErrorResult()
/** /**
@@ -79,10 +55,34 @@ class WideSearchbarPatch : BytecodePatch(
addInstructions( addInstructions(
implementation!!.instructions.size - 1, implementation!!.instructions.size - 1,
""" """
invoke-static {}, Lapp/revanced/integrations/patches/WideSearchbarPatch;->enableWideSearchbar()Z invoke-static {}, Lapp/revanced/integrations/patches/NewActionbarPatch;->getNewActionBar()Z
move-result p0 move-result p0
""" """
) )
} }
} }
override fun execute(context: BytecodeContext): PatchResult {
SettingsPatch.PreferenceScreen.LAYOUT.addPreferences(
SwitchPreference(
"revanced_wide_searchbar",
StringResource("revanced_wide_searchbar_enabled_title", "Enable wide search bar"),
false,
StringResource("revanced_wide_searchbar_summary_on", "Wide search bar is enabled"),
StringResource("revanced_wide_searchbar_summary_off", "Wide search bar is disabled")
)
)
val result = DrawActionBarFingerprint.result ?: return DrawActionBarFingerprint.toErrorResult()
// patch methods
mapOf(
SetWordmarkHeaderFingerprint to 1,
DrawActionBarFingerprint to result.scanResult.patternScanResult!!.endIndex
).forEach { (fingerprint, callIndex) ->
context.walkMutable(callIndex, fingerprint).injectSearchBarHook()
}
return PatchResultSuccess()
}
} }

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package("com.google.android.youtube", arrayOf("18.08.37", "18.15.40", "18.16.37"))] [Package("com.google.android.youtube", arrayOf("18.08.37"))]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class SponsorBlockCompatibility internal annotation class SponsorBlockCompatibility

View File

@@ -21,9 +21,7 @@ import app.revanced.patches.shared.fingerprints.SeekbarFingerprint
import app.revanced.patches.shared.fingerprints.SeekbarOnDrawFingerprint import app.revanced.patches.shared.fingerprints.SeekbarOnDrawFingerprint
import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch
import app.revanced.patches.youtube.layout.sponsorblock.annotations.SponsorBlockCompatibility import app.revanced.patches.youtube.layout.sponsorblock.annotations.SponsorBlockCompatibility
import app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints.AppendTimeFingerprint import app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints.*
import app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints.PlayerOverlaysLayoutInitFingerprint
import app.revanced.patches.youtube.layout.sponsorblock.bytecode.fingerprints.RectangleFieldInvalidatorFingerprint
import app.revanced.patches.youtube.layout.sponsorblock.resource.patch.SponsorBlockResourcePatch import app.revanced.patches.youtube.layout.sponsorblock.resource.patch.SponsorBlockResourcePatch
import app.revanced.patches.youtube.misc.autorepeat.fingerprints.AutoRepeatFingerprint import app.revanced.patches.youtube.misc.autorepeat.fingerprints.AutoRepeatFingerprint
import app.revanced.patches.youtube.misc.autorepeat.fingerprints.AutoRepeatParentFingerprint import app.revanced.patches.youtube.misc.autorepeat.fingerprints.AutoRepeatParentFingerprint
@@ -155,22 +153,14 @@ class SponsorBlockBytecodePatch : BytecodePatch(
/* /*
* Draw segment * Draw segment
*/ */
val drawSegmentInstructionInsertIndex = (seekbarMethodInstructions.size - 1 - 2)
// Find the drawCircle call and draw the segment before it val (canvasInstance, centerY) = (seekbarMethodInstructions[drawSegmentInstructionInsertIndex] as FiveRegisterInstruction).let {
for (i in seekbarMethodInstructions.size - 1 downTo 0) { it.registerC to it.registerE
val invokeInstruction = seekbarMethodInstructions[i] as? ReferenceInstruction ?: continue
if ((invokeInstruction.reference as MethodReference).name != "drawCircle") continue
val (canvasInstance, centerY) = (invokeInstruction as FiveRegisterInstruction).let {
it.registerC to it.registerE
}
seekbarMethod.addInstruction(
i,
"invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V"
)
break
} }
seekbarMethod.addInstruction(
drawSegmentInstructionInsertIndex,
"invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V"
)
/* /*
* Voting & Shield button * Voting & Shield button

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -11,8 +11,6 @@ import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.shared.settings.preference.impl.ArrayResource
import app.revanced.patches.shared.settings.preference.impl.ListPreference
import app.revanced.patches.shared.settings.preference.impl.StringResource 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.layout.spoofappversion.annotations.SpoofAppVersionCompatibility import app.revanced.patches.youtube.layout.spoofappversion.annotations.SpoofAppVersionCompatibility
@@ -38,36 +36,11 @@ class SpoofAppVersionPatch : BytecodePatch(
"revanced_spoof_app_version", "revanced_spoof_app_version",
StringResource("revanced_spoof_app_version_title", "Spoof app version"), StringResource("revanced_spoof_app_version_title", "Spoof app version"),
false, false,
StringResource("revanced_spoof_app_version_summary_on", "Version spoofed"), StringResource("revanced_spoof_app_version_summary_on", "Version spoofed to 17.30.34"),
StringResource("revanced_spoof_app_version_summary_off", "Version not spoofed"), StringResource("revanced_spoof_app_version_summary_off", "Version not spoofed"),
StringResource("revanced_spoof_app_version_user_dialog_message", StringResource("revanced_spoof_app_version_user_dialog_message",
"App version will be spoofed to an older version of YouTube. This will change the appearance of the app, but unknown side effects may occur." "App version will be spoofed to 17.30.34. This will give the old UI layout, but unknown side effects may occur."
+ " If later turned off, the old UI may remain until you log out or clear the app data.") + " If later turned off, the old UI layout may remain until you log out or clear the app data.")
),
ListPreference(
"revanced_spoof_app_version_target",
StringResource(
"revanced_spoof_app_version_target_title",
"Spoof app version target"
),
ArrayResource(
"revanced_spoof_app_version_target_entries",
listOf(
StringResource("revanced_spoof_app_version_target_entry_1", "17.30.35 - Restore old UI layout"),
StringResource("revanced_spoof_app_version_target_entry_2", "17.01.35 - Enable sorting videos by oldest"),
StringResource("revanced_spoof_app_version_target_entry_3", "16.08.35 - Restore explore tab"),
StringResource("revanced_spoof_app_version_target_entry_4", "16.01.35 - Restore old shorts player"),
)
),
ArrayResource(
"revanced_spoof_app_version_target_entry_values",
listOf(
StringResource("revanced_spoof_app_version_target_entry_value_1", "17.30.35"),
StringResource("revanced_spoof_app_version_target_entry_value_2", "17.01.35"),
StringResource("revanced_spoof_app_version_target_entry_value_3", "16.08.35"),
StringResource("revanced_spoof_app_version_target_entry_value_4", "16.01.35"),
)
)
) )
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -3,6 +3,6 @@ package app.revanced.patches.youtube.layout.tabletminiplayer.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
@Compatibility([Package("com.google.android.youtube", arrayOf("18.15.40", "18.16.37"))]) @Compatibility([Package("com.google.android.youtube", arrayOf("18.08.37"))])
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class TabletMiniPlayerCompatibility internal annotation class TabletMiniPlayerCompatibility

View File

@@ -7,17 +7,5 @@ import org.jf.dexlib2.Opcode
object MiniPlayerOverrideFingerprint : MethodFingerprint( object MiniPlayerOverrideFingerprint : MethodFingerprint(
"Z", AccessFlags.STATIC or AccessFlags.PUBLIC, "Z", AccessFlags.STATIC or AccessFlags.PUBLIC,
listOf("L"), opcodes = listOf(Opcode.RETURN), // anchor to insert the instruction
opcodes = listOf(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT,
Opcode.CONST_4,
Opcode.IF_EQ,
Opcode.CONST_4,
Opcode.IF_EQ,
Opcode.CONST_4, // override this value
Opcode.RETURN,
Opcode.CONST_4, // override this value
Opcode.RETURN
),
) )

View File

@@ -1,7 +1,13 @@
package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints package app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.AccessFlags
object MiniPlayerOverrideParentFingerprint : MethodFingerprint( object MiniPlayerOverrideParentFingerprint : MethodFingerprint(
strings = listOf("Possible Context wrapper loop - chain of wrappers larger than 10000") returnType = "L",
access = AccessFlags.PUBLIC or AccessFlags.STATIC,
parameters = listOf("L"),
strings = listOf("VIDEO_QUALITIES_QUICK_MENU_BOTTOM_SHEET_FRAGMENT")
) )

View File

@@ -10,7 +10,6 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
@@ -21,7 +20,6 @@ import app.revanced.patches.youtube.layout.tabletminiplayer.annotations.TabletMi
import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.* import app.revanced.patches.youtube.layout.tabletminiplayer.fingerprints.*
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 org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch @Patch
@@ -69,29 +67,12 @@ class TabletMiniPlayerPatch : BytecodePatch(
*/ */
MiniPlayerOverrideParentFingerprint.result?.let { MiniPlayerOverrideParentFingerprint.result?.let {
if (!MiniPlayerOverrideFingerprint.resolve(context, it.classDef)) if (!MiniPlayerOverrideFingerprint.resolve(context, it.classDef))
throw MiniPlayerOverrideFingerprint.toErrorResult() return MiniPlayerOverrideFingerprint.toErrorResult()
MiniPlayerOverrideFingerprint.addProxyCall()
} ?: return MiniPlayerOverrideParentFingerprint.toErrorResult() } ?: return MiniPlayerOverrideParentFingerprint.toErrorResult()
/*
* Override every return instruction with the proxy call.
*/
MiniPlayerOverrideFingerprint.result!!.mutableMethod.apply {
implementation!!.let { implementation ->
val returnIndices = implementation.instructions
.withIndex()
.filter { (_, instruction) -> instruction.opcode == Opcode.RETURN }
.map { (index, _) -> index }
if (returnIndices.isEmpty()) throw PatchResultError("No return instructions found.")
// This method clobbers register p0 to return the value, calculate to override.
val returnedRegister = implementation.registerCount - parameters.size
// Hook the returned register on every return instruction.
returnIndices.forEach { index -> insertOverride(index, returnedRegister) }
}
}
/* /*
* Size check return value override. * Size check return value override.
*/ */

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -4,17 +4,16 @@ import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.data.ResourceContext
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.*
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.ResourcePatch
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.all.misc.debugging.patch.EnableAndroidDebuggingPatch
import app.revanced.patches.shared.settings.preference.impl.StringResource 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.debugging.annotations.DebuggingCompatibility import app.revanced.patches.youtube.misc.debugging.annotations.DebuggingCompatibility
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.all.misc.debugging.patch.EnableAndroidDebuggingPatch
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
import org.w3c.dom.Element
@Patch @Patch
@Name("enable-debugging") @Name("enable-debugging")

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -24,7 +24,6 @@ import app.revanced.patches.youtube.misc.fix.playback.fingerprints.SubtitleWindo
import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch import app.revanced.patches.youtube.misc.integrations.patch.IntegrationsPatch
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
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.videoid.patch.VideoIdPatch
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch @Patch
@@ -35,8 +34,7 @@ import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
IntegrationsPatch::class, IntegrationsPatch::class,
SettingsPatch::class, SettingsPatch::class,
PlayerTypeHookPatch::class, PlayerTypeHookPatch::class,
ClientSpoofPatch::class, ClientSpoofPatch::class
VideoIdPatch::class
]) ])
@Version("0.0.1") @Version("0.0.1")
class SpoofSignatureVerificationPatch : BytecodePatch( class SpoofSignatureVerificationPatch : BytecodePatch(
@@ -52,20 +50,13 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
"revanced_spoof_signature_verification", "revanced_spoof_signature_verification",
StringResource("revanced_spoof_signature_verification_title", "Spoof app signature"), StringResource("revanced_spoof_signature_verification_title", "Spoof app signature"),
true, true,
StringResource("revanced_spoof_signature_verification_summary_on", StringResource("revanced_spoof_signature_verification_summary_on", "App signature spoofed"),
"App signature spoofed\\n\\n"
+ "Side effects include:\\n"
+ "• End screen cards are always hidden\\n"
+ "• Download button may be hidden"),
StringResource("revanced_spoof_signature_verification_summary_off", "App signature not spoofed"), StringResource("revanced_spoof_signature_verification_summary_off", "App signature not spoofed"),
StringResource("revanced_spoof_signature_verification_user_dialog_message", StringResource("revanced_spoof_signature_verification_user_dialog_message",
"Turning off this setting may cause playback issues.") "Signature spoofing can fix playback issues, but may causes side effects.")
) )
) )
// Hook video id, required for subtitle fix.
VideoIdPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->setCurrentVideoId(Ljava/lang/String;)V")
// hook parameter // hook parameter
ProtobufParameterBuilderFingerprint.result?.let { ProtobufParameterBuilderFingerprint.result?.let {
val setParamMethod = context val setParamMethod = context
@@ -111,7 +102,7 @@ class SpoofSignatureVerificationPatch : BytecodePatch(
invoke-static {p1, p2, p3, p4, p5}, $INTEGRATIONS_CLASS_DESCRIPTOR->getSubtitleWindowSettingsOverride(IIIZZ)[I invoke-static {p1, p2, p3, p4, p5}, $INTEGRATIONS_CLASS_DESCRIPTOR->getSubtitleWindowSettingsOverride(IIIZZ)[I
move-result-object v0 move-result-object v0
const/4 v1, 0x0 const/4 v1, 0x0
aget p1, v0, v1 # ap, anchor position aget p1, v0, v1 # ap, anchor configuration
const/4 v1, 0x1 const/4 v1, 0x1
aget p2, v0, v1 # ah, horizontal anchor aget p2, v0, v1 # ah, horizontal anchor
const/4 v1, 0x2 const/4 v1, 0x2

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -9,5 +9,5 @@ object ComponentContextParserFingerprint : MethodFingerprint(
Opcode.IPUT_OBJECT, Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE Opcode.NEW_INSTANCE
), ),
strings = listOf("Component was not found %s because it was removed due to duplicate converter bindings") strings = listOf("LoggingProperties are not in proto format")
) )

View File

@@ -10,6 +10,7 @@ import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patcher.util.smali.ExternalLabel
@@ -21,7 +22,6 @@ import app.revanced.patches.youtube.misc.litho.filter.fingerprints.ReadComponent
import org.jf.dexlib2.iface.instruction.Instruction import org.jf.dexlib2.iface.instruction.Instruction
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
@DependsOn([IntegrationsPatch::class]) @DependsOn([IntegrationsPatch::class])
@Description("Hooks the method which parses the bytes into a ComponentContext to filter components.") @Description("Hooks the method which parses the bytes into a ComponentContext to filter components.")
@@ -44,15 +44,15 @@ class LithoFilterPatch : BytecodePatch(
val insertHookIndex = result.scanResult.patternScanResult!!.endIndex val insertHookIndex = result.scanResult.patternScanResult!!.endIndex
val builderMethodDescriptor = instruction(builderMethodIndex).descriptor val builderMethodDescriptor = instruction(builderMethodIndex).descriptor
val emptyComponentFieldDescriptor = instruction(emptyComponentFieldIndex).descriptor val emptyComponentFieldDescriptor = instruction(emptyComponentFieldIndex).descriptor
// Register is overwritten right after it is used in this patch, therefore free to clobber. // Register is overwritten right after it is used for this patch, therefore free to clobber.
val clobberedRegister = instruction(insertHookIndex - 1).twoRegisterA val clobberedRegister = instruction(insertHookIndex).oneRegister
@Suppress("UnnecessaryVariable") @Suppress("UnnecessaryVariable")
// The register, this patch clobbers, is previously used for the StringBuilder, // The register, this patch clobbers, is previously used for the StringBuilder,
// later on a new StringBuilder is instantiated on it. // later on a new StringBuilder is instantiated on it.
val stringBuilderRegister = clobberedRegister val stringBuilderRegister = clobberedRegister
val identifierRegister = instruction(ReadComponentIdentifierFingerprint.patternScanEndIndex).oneRegisterA val identifierRegister = instruction(ReadComponentIdentifierFingerprint.patternScanEndIndex).oneRegister
addInstructions( addInstructions(
insertHookIndex, // right after setting the component.pathBuilder field, insertHookIndex, // right after setting the component.pathBuilder field,
@@ -69,7 +69,7 @@ class LithoFilterPatch : BytecodePatch(
listOf(ExternalLabel("not_an_ad", instruction(insertHookIndex))) listOf(ExternalLabel("not_an_ad", instruction(insertHookIndex)))
) )
} }
} ?: return ComponentContextParserFingerprint.toErrorResult() } ?: return PatchResultError("Could not find the method to hook.")
return PatchResultSuccess() return PatchResultSuccess()
} }
@@ -81,10 +81,8 @@ class LithoFilterPatch : BytecodePatch(
val Instruction.descriptor val Instruction.descriptor
get() = (this as ReferenceInstruction).reference.toString() get() = (this as ReferenceInstruction).reference.toString()
val Instruction.oneRegisterA val Instruction.oneRegister
get() = (this as OneRegisterInstruction).registerA get() = (this as OneRegisterInstruction).registerA
val Instruction.twoRegisterA
get() = (this as TwoRegisterInstruction).registerA
} }
} }

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -6,10 +6,10 @@ import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode import org.jf.dexlib2.Opcode
object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint( object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint(
returnType = "V", "V",
access = AccessFlags.PUBLIC or AccessFlags.FINAL, AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("I", "L", "L"), listOf("I", "L", "L"),
opcodes = listOf( listOf(
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.SGET_OBJECT, Opcode.SGET_OBJECT,
Opcode.IF_NE, Opcode.IF_NE,

View File

@@ -0,0 +1,16 @@
package app.revanced.patches.youtube.misc.minimizedplayback.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 PipControllerFingerprint : MethodFingerprint(
returnType = "L",
access = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = listOf("L"),
opcodes = listOf(
Opcode.IGET_BOOLEAN
),
customFingerprint = { it.definingClass.endsWith("DefaultPipController;") }
)

View File

@@ -6,26 +6,29 @@ import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.data.toMethodWalker import app.revanced.patcher.data.toMethodWalker
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.instruction
import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.shared.settings.preference.impl.NonInteractivePreference
import app.revanced.patches.shared.settings.preference.impl.StringResource import app.revanced.patches.shared.settings.preference.impl.StringResource
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.minimizedplayback.annotations.MinimizedPlaybackCompatibility import app.revanced.patches.youtube.misc.minimizedplayback.annotations.MinimizedPlaybackCompatibility
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.PipControllerFingerprint
import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.patch.PlayerTypeHookPatch
import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch import app.revanced.patches.youtube.misc.settings.bytecode.patch.SettingsPatch
import org.jf.dexlib2.iface.instruction.ReferenceInstruction import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
import org.jf.dexlib2.iface.reference.MethodReference import org.jf.dexlib2.iface.reference.MethodReference
@Patch @Patch
@Name("minimized-playback") @Name("minimized-playback")
@Description("Enables minimized and background playback.") @Description("Enables minimized and background playback.")
@@ -34,57 +37,75 @@ import org.jf.dexlib2.iface.reference.MethodReference
@Version("0.0.1") @Version("0.0.1")
class MinimizedPlaybackPatch : BytecodePatch( class MinimizedPlaybackPatch : BytecodePatch(
listOf( listOf(
KidsMinimizedPlaybackPolicyControllerFingerprint,
MinimizedPlaybackManagerFingerprint, MinimizedPlaybackManagerFingerprint,
MinimizedPlaybackSettingsFingerprint, MinimizedPlaybackSettingsFingerprint,
KidsMinimizedPlaybackPolicyControllerFingerprint PipControllerFingerprint
) )
) { ) {
override fun execute(context: BytecodeContext): PatchResult { override fun execute(context: BytecodeContext): PatchResult {
// TODO: remove this empty preference sometime after mid 2023
SettingsPatch.PreferenceScreen.MISC.addPreferences( SettingsPatch.PreferenceScreen.MISC.addPreferences(
NonInteractivePreference( SwitchPreference(
StringResource("revanced_minimized_playback_enabled_title", "Minimized playback"), "revanced_enable_minimized_playback",
StringResource("revanced_minimized_playback_summary_on", "This setting can be found in Settings -> General") StringResource("revanced_minimized_playback_enabled_title", "Enable minimized playback"),
true,
StringResource("revanced_minimized_playback_summary_on", "Minimized playback is enabled"),
StringResource("revanced_minimized_playback_summary_off", "Minimized playback is disabled")
) )
) )
MinimizedPlaybackManagerFingerprint.result?.apply { MinimizedPlaybackManagerFingerprint.result?.apply {
mutableMethod.addInstructions( mutableMethod.addInstructions(
0, """ 0, """
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isPlaybackNotShort()Z invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isMinimizedPlaybackEnabled()Z
move-result v0 move-result v0
return v0 return v0
""" """
) )
} ?: return MinimizedPlaybackManagerFingerprint.toErrorResult() } ?: return MinimizedPlaybackManagerFingerprint.toErrorResult()
// Enable minimized playback option in YouTube settings val method = MinimizedPlaybackSettingsFingerprint.result!!.mutableMethod
MinimizedPlaybackSettingsFingerprint.result?.apply { val booleanCalls = method.implementation!!.instructions.withIndex()
val booleanCalls = method.implementation!!.instructions.withIndex() .filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
val settingsBooleanIndex = booleanCalls.elementAt(1).index val settingsBooleanIndex = booleanCalls.elementAt(1).index
val settingsBooleanMethod = val settingsBooleanMethod =
context.toMethodWalker(method).nextMethod(settingsBooleanIndex, true).getMethod() as MutableMethod context.toMethodWalker(method).nextMethod(settingsBooleanIndex, true).getMethod() as MutableMethod
settingsBooleanMethod.addInstructions( settingsBooleanMethod.addInstructions(
0, """ 0, """
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideMinimizedPlaybackAvailable()Z invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isMinimizedPlaybackEnabled()Z
move-result v0 move-result v0
return v0 return v0
""" """
) )
} ?: return MinimizedPlaybackSettingsFingerprint.toErrorResult()
// Force allowing background play for videos labeled for kids.
// Some regions and YouTube accounts do not require this patch.
KidsMinimizedPlaybackPolicyControllerFingerprint.result?.apply { KidsMinimizedPlaybackPolicyControllerFingerprint.result?.apply {
mutableMethod.addInstruction( mutableMethod.addInstructions(
0, 0, """
"return-void" invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->isMinimizedPlaybackEnabled()Z
move-result v0
if-eqz v0, :enable
return-void
:enable
nop
"""
) )
} ?: return KidsMinimizedPlaybackPolicyControllerFingerprint.toErrorResult() } ?: return KidsMinimizedPlaybackPolicyControllerFingerprint.toErrorResult()
PipControllerFingerprint.result?.apply {
val insertIndex = scanResult.patternScanResult!!.endIndex + 1
val pipEnabledRegister = (mutableMethod.instruction(insertIndex - 1) as TwoRegisterInstruction).registerA
mutableMethod.addInstructions(
insertIndex,
"""
invoke-static {v$pipEnabledRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->isNotPlayingShorts(Z)Z
move-result v$pipEnabledRegister
"""
)
} ?: return PipControllerFingerprint.toErrorResult()
return PatchResultSuccess() return PatchResultSuccess()
} }

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package("com.google.android.youtube", arrayOf("18.08.37", "18.15.40", "18.16.37"))] [Package("com.google.android.youtube", arrayOf("18.08.37"))]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class VideoInformationCompatibility internal annotation class VideoInformationCompatibility

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package("com.google.android.youtube", arrayOf("18.08.37", "18.15.40", "18.16.37"))] [Package("com.google.android.youtube", arrayOf("18.08.37"))]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class RememberVideoQualityCompatibility internal annotation class RememberVideoQualityCompatibility

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package("com.google.android.youtube", arrayOf("18.08.37", "18.15.40", "18.16.37"))] [Package("com.google.android.youtube", arrayOf("18.08.37"))]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
internal annotation class RememberPlaybackSpeedCompatibility internal annotation class RememberPlaybackSpeedCompatibility

View File

@@ -14,9 +14,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -15,9 +15,7 @@ import app.revanced.patcher.annotation.Package
"18.05.32", "18.05.32",
"18.05.35", "18.05.35",
"18.05.40", "18.05.40",
"18.08.37", "18.08.37"
"18.15.40",
"18.16.37"
) )
)] )]
) )

View File

@@ -2,59 +2,42 @@
<resources> <resources>
<string name="sb_enable_sb">Enable SponsorBlock</string> <string name="sb_enable_sb">Enable SponsorBlock</string>
<string name="sb_enable_sb_sum">SponsorBlock is a crowd-sourced system for skipping annoying parts of YouTube videos</string> <string name="sb_enable_sb_sum">SponsorBlock is a crowd-sourced system for skipping annoying parts of YouTube videos</string>
<string name="sb_appearance_category">Appearance</string>
<string name="sb_enable_voting">Show voting button</string> <string name="sb_enable_voting">Show voting button</string>
<string name="sb_enable_voting_sum_on">Segment voting button is shown</string> <string name="sb_enable_voting_sum_on">Segment voting button is shown</string>
<string name="sb_enable_voting_sum_off">Segment voting button is not shown</string> <string name="sb_enable_voting_sum_off">Segment voting button is not shown</string>
<string name="sb_enable_compact_skip_button">Use compact skip button</string>
<string name="sb_enable_compact_skip_button_sum_on">Skip button styled for minimum width</string>
<string name="sb_enable_compact_skip_button_sum_off">Skip button styled for best appearance</string>
<string name="sb_enable_auto_hide_skip_segment_button">Automatically hide skip button</string>
<string name="sb_enable_auto_hide_skip_segment_button_sum_on">Skip button hides after a few seconds</string>
<string name="sb_enable_auto_hide_skip_segment_button_sum_off">Skip button displayed for entire segment</string>
<string name="sb_general_skiptoast">Show a toast when skipping automatically</string>
<string name="sb_general_skiptoast_sum_on">Toast shown when a segment is automatically skipped. Tap here to see an example</string>
<string name="sb_general_skiptoast_sum_off">Toast not shown. Tap here to see an example</string>
<string name="sb_general_time_without">Show video length without segments</string>
<string name="sb_general_time_without_sum_on">Video length minus all segments, shown in parentheses next to the full video length</string>
<string name="sb_general_time_without_sum_off">Full video length shown</string>
<string name="sb_create_segment_category">Creating new segments</string>
<string name="sb_enable_create_segment">Show create new segment button</string> <string name="sb_enable_create_segment">Show create new segment button</string>
<string name="sb_enable_create_segment_sum_on">Create new segment button is shown</string> <string name="sb_enable_create_segment_sum_on">Create new segment button is shown</string>
<string name="sb_enable_create_segment_sum_off">Create new segment button is not shown</string> <string name="sb_enable_create_segment_sum_off">Create new segment button is not shown</string>
<string name="sb_general_adjusting">Adjust new segment step</string> <string name="sb_enable_compact_skip_button">Use compact skip button</string>
<string name="sb_general_adjusting_sum">Number of milliseconds the time adjustment buttons move when creating new segments</string> <string name="sb_enable_compact_skip_button_sum_on">Skip button styled for minimum width</string>
<string name="sb_general_adjusting_invalid">Value must be a positive number</string> <string name="sb_enable_compact_skip_button_sum_off">Skip button styled for best appearance</string>
<string name="sb_guidelines_preference_title">View guidelines</string> <string name="sb_diff_segments">What to do with different segments</string>
<string name="sb_guidelines_preference_sum">Guidelines contain rules and tips for creating new segments</string>
<string name="sb_guidelines_popup_title">Follow the guidelines</string>
<string name="sb_guidelines_popup_content">Read the SponsorBlock guidelines before creating new segments</string>
<string name="sb_guidelines_popup_already_read">Already read</string>
<string name="sb_guidelines_popup_open">Show me</string>
<string name="sb_general">General</string> <string name="sb_general">General</string>
<string name="sb_general_skiptoast">Show a toast when skipping segment automatically</string>
<string name="sb_general_skiptoast_sum_on">Toast shown when a segment is automatically skipped. Tap here to see an example</string>
<string name="sb_general_skiptoast_sum_off">Toast not shown. Tap here to see an example</string>
<string name="sb_general_skipcount">Enable skip count tracking</string> <string name="sb_general_skipcount">Enable skip count tracking</string>
<string name="sb_general_skipcount_sum_on">Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped</string> <string name="sb_general_skipcount_sum_on">Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped</string>
<string name="sb_general_skipcount_sum_off">Skip count tracking is not enabled</string> <string name="sb_general_skipcount_sum_off">Skip count tracking is not enabled</string>
<string name="sb_general_time_without">Show video length without segments</string>
<string name="sb_general_time_without_sum_on">Video length minus all segments, shown in parentheses next to the full video length</string>
<string name="sb_general_time_without_sum_off">Full video length shown</string>
<string name="sb_general_adjusting">Adjust new segment step</string>
<string name="sb_general_adjusting_sum">Number of milliseconds the time adjustment buttons move when creating new segments</string>
<string name="sb_general_adjusting_invalid">Value must be a positive number</string>
<string name="sb_general_min_duration">Minimum segment duration</string> <string name="sb_general_min_duration">Minimum segment duration</string>
<string name="sb_general_min_duration_sum">Segments shorter than this value (in seconds) will not be shown or skipped</string> <string name="sb_general_min_duration_sum">Segments shorter than this value (in seconds) will not be shown or skipped</string>
<string name="sb_general_uuid">Your private user id</string> <string name="sb_general_uuid">Your private user id</string>
<string name="sb_general_uuid_sum">This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you</string> <string name="sb_general_uuid_sum">This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you</string>
<string name="sb_general_uuid_invalid">User id cannot be blank</string> <string name="sb_general_uuid_invalid">User id cannot be blank</string>
<string name="sb_general_api_url">Change API URL</string>
<string name="sb_general_api_url_sum">The address SponsorBlock uses to make calls to the server. Do not change this unless you know what you\'re doing</string>
<string name="sb_api_url_reset">API URL reset</string>
<string name="sb_api_url_invalid">API URL is invalid</string>
<string name="sb_api_url_changed">API URL changed</string>
<string name="sb_settings_ie">Import/Export settings</string> <string name="sb_settings_ie">Import/Export settings</string>
<string name="sb_settings_ie_sum">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms. This includes your private user id. Be sure to share this wisely</string> <string name="sb_settings_ie_sum">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms. This includes your private user id. Be sure to share this wisely</string>
<string name="sb_general_api_url">Change API URL</string>
<string name="sb_general_api_url_sum">The address SponsorBlock uses to make calls to the server. &lt;b>Don\'t change this unless you know what you\'re doing&lt;/b></string>
<string name="sb_settings_import_successful">Settings imported successfully</string> <string name="sb_settings_import_successful">Settings imported successfully</string>
<string name="sb_settings_import_failed">Failed to import: %s</string> <string name="sb_settings_import_failed">Failed to import: %s</string>
<string name="sb_settings_export_failed">Failed to export settings (try clearing app data)</string> <string name="sb_settings_export_failed">Failed to export settings (try clearing app data)</string>
<string name="sb_diff_segments">Change segment behavior</string>
<string name="sb_segments_sponsor">Sponsor</string> <string name="sb_segments_sponsor">Sponsor</string>
<string name="sb_segments_sponsor_sum">Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shout-outs to causes/creators/websites/products they like</string> <string name="sb_segments_sponsor_sum">Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shout-outs to causes/creators/websites/products they like</string>
<string name="sb_segments_selfpromo">Unpaid/Self Promotion</string> <string name="sb_segments_selfpromo">Unpaid/Self Promotion</string>
@@ -113,6 +96,11 @@
<string name="sb_skip_seekbaronly">Show in seek bar</string> <string name="sb_skip_seekbaronly">Show in seek bar</string>
<string name="sb_skip_ignore">Disable</string> <string name="sb_skip_ignore">Disable</string>
<string name="sb_about">About</string>
<string name="sb_about_api">sponsor.ajay.app</string>
<string name="sb_about_api_sum">Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms</string>
<string name="sb_about_made_by">ReVanced integration by JakubWeg,\nrecoded by oSumAtrIX</string>
<string name="sb_submit_failed_invalid" formatted="false">Can\'t submit the segment: %s</string> <string name="sb_submit_failed_invalid" formatted="false">Can\'t submit the segment: %s</string>
<string name="sb_submit_failed_timeout">Unable to submit segments (API timed out)</string> <string name="sb_submit_failed_timeout">Unable to submit segments (API timed out)</string>
<string name="sb_submit_failed_unknown_error" formatted="false">Unable to submit segments (status: %d %s)</string> <string name="sb_submit_failed_unknown_error" formatted="false">Unable to submit segments (status: %d %s)</string>
@@ -151,6 +139,13 @@
<string name="sb_new_segment_edit_by_hand_content">Do you want to edit the timing for the start or end of the segment?</string> <string name="sb_new_segment_edit_by_hand_content">Do you want to edit the timing for the start or end of the segment?</string>
<string name="sb_new_segment_edit_by_hand_parse_error">Invalid time given</string> <string name="sb_new_segment_edit_by_hand_parse_error">Invalid time given</string>
<string name="sb_guidelines_preference_title">View guidelines</string>
<string name="sb_guidelines_preference_sum">Guidelines contain rules and tips for creating new segments</string>
<string name="sb_guidelines_popup_title">Follow the guidelines</string>
<string name="sb_guidelines_popup_content">Read the SponsorBlock guidelines before creating new segments</string>
<string name="sb_guidelines_popup_already_read">Already read</string>
<string name="sb_guidelines_popup_open">Show me</string>
<string name="sb_stats">Stats</string> <string name="sb_stats">Stats</string>
<string name="sb_stats_connection_failure">Stats temporarily not available (API is down)</string> <string name="sb_stats_connection_failure">Stats temporarily not available (API is down)</string>
<string name="sb_stats_loading">Loading...</string> <string name="sb_stats_loading">Loading...</string>
@@ -171,7 +166,6 @@
<string name="sb_stats_saved_hour_format" formatted="false">%d hours %d minutes</string> <string name="sb_stats_saved_hour_format" formatted="false">%d hours %d minutes</string>
<string name="sb_stats_saved_minute_format" formatted="false">%d minutes %d seconds</string> <string name="sb_stats_saved_minute_format" formatted="false">%d minutes %d seconds</string>
<string name="sb_stats_saved_second_format" formatted="false">%d seconds</string> <string name="sb_stats_saved_second_format" formatted="false">%d seconds</string>
<string name="sb_color_dot_label">Color:</string> <string name="sb_color_dot_label">Color:</string>
<string name="sb_color_changed">Color changed</string> <string name="sb_color_changed">Color changed</string>
<string name="sb_color_reset">Color reset</string> <string name="sb_color_reset">Color reset</string>
@@ -179,9 +173,7 @@
<string name="sb_reset_color">Reset color</string> <string name="sb_reset_color">Reset color</string>
<string name="sb_reset">Reset</string> <string name="sb_reset">Reset</string>
<string name="sb_api_url_reset">API URL reset</string>
<string name="sb_about">About</string> <string name="sb_api_url_invalid">API URL is invalid</string>
<string name="sb_about_api">sponsor.ajay.app</string> <string name="sb_api_url_changed">API URL changed</string>
<string name="sb_about_api_sum">Data is provided by the SponsorBlock API. Tap here to learn more and see downloads for other platforms</string>
<string name="sb_about_made_by">ReVanced integration by JakubWeg,\nrecoded by oSumAtrIX</string>
</resources> </resources>