Compare commits

...

411 Commits

Author SHA1 Message Date
semantic-release-bot
2f932d697b chore(release): 2.73.0 [skip ci]
# [2.73.0](https://github.com/revanced/revanced-patches/compare/v2.72.1...v2.73.0) (2022-09-29)

### Features

* `dynamic-color` patch ([#652](https://github.com/revanced/revanced-patches/issues/652)) ([47d4b90](237129d327))
2022-09-29 20:09:46 +00:00
bennett-sh
237129d327 feat: dynamic-color patch (#652) 2022-09-29 22:08:00 +02:00
oSumAtrIX
e4d7dc0aa9 chore: bump patcher dependency version 2022-09-29 21:42:45 +02:00
semantic-release-bot
fed9e4aafa chore(release): 2.72.1 [skip ci]
## [2.72.1](https://github.com/revanced/revanced-patches/compare/v2.72.0...v2.72.1) (2022-09-29)

### Bug Fixes

* **hdr-brightness:** trim list of compatible versions ([#602](https://github.com/revanced/revanced-patches/issues/602)) ([eb900b1](85aa45d3f2))
2022-09-29 17:26:19 +00:00
OxrxL
85aa45d3f2 fix(hdr-brightness): trim list of compatible versions (#602) 2022-09-29 19:24:32 +02:00
semantic-release-bot
16df8d5ebc chore(release): 2.72.0 [skip ci]
# [2.72.0](https://github.com/revanced/revanced-patches/compare/v2.71.2...v2.72.0) (2022-09-29)

### Features

* `tiktok-speed` patch ([#668](https://github.com/revanced/revanced-patches/issues/668)) ([805d301](0f78f621c7))
* bump YouTube Music patches to v5.25.51 ([#669](https://github.com/revanced/revanced-patches/issues/669)) ([ca88b01](e89c3dad39))
2022-09-29 15:27:16 +00:00
sandip93291
e89c3dad39 feat: bump YouTube Music patches to v5.25.51 (#669) 2022-09-29 17:25:01 +02:00
d4rkk3y
0f78f621c7 feat: tiktok-speed patch (#668) 2022-09-29 17:23:58 +02:00
semantic-release-bot
fe30cea22d chore(release): 2.71.2 [skip ci]
## [2.71.2](https://github.com/revanced/revanced-patches/compare/v2.71.1...v2.71.2) (2022-09-28)

### Bug Fixes

* **hide-email-address:** invalid instruction offsets ([#654](https://github.com/revanced/revanced-patches/issues/654)) ([6c8f447](5a30d8564c))
2022-09-28 13:44:59 +00:00
OxrxL
5a30d8564c fix(hide-email-address): invalid instruction offsets (#654) 2022-09-28 15:42:35 +02:00
semantic-release-bot
34222d9f2c chore(release): 2.71.1 [skip ci]
## [2.71.1](https://github.com/revanced/revanced-patches/compare/v2.71.0...v2.71.1) (2022-09-28)

### Bug Fixes

* **disable-auto-player-popup-panels:** swap switch toggle state description ([#653](https://github.com/revanced/revanced-patches/issues/653)) ([632323a](f765af0929))
2022-09-28 13:24:22 +00:00
NRJ YDV
f765af0929 fix(disable-auto-player-popup-panels): swap switch toggle state description (#653) 2022-09-28 15:21:55 +02:00
semantic-release-bot
298c33deb6 chore(release): 2.71.0 [skip ci]
# [2.71.0](https://github.com/revanced/revanced-patches/compare/v2.70.0...v2.71.0) (2022-09-28)

### Features

* `hide-email-address` patch ([#578](https://github.com/revanced/revanced-patches/issues/578)) ([9ed8f94](111db2a499))
2022-09-28 11:29:51 +00:00
OxrxL
111db2a499 feat: hide-email-address patch (#578) 2022-09-28 13:28:07 +02:00
semantic-release-bot
fa536957cc chore(release): 2.70.0 [skip ci]
# [2.70.0](https://github.com/revanced/revanced-patches/compare/v2.69.4...v2.70.0) (2022-09-28)

### Features

* `monochrome-icon` patch ([#643](https://github.com/revanced/revanced-patches/issues/643)) ([b744c37](980deec6af))
2022-09-28 11:16:24 +00:00
bennett-sh
980deec6af feat: monochrome-icon patch (#643) 2022-09-28 13:14:39 +02:00
semantic-release-bot
658638bfad chore(release): 2.69.4 [skip ci]
## [2.69.4](https://github.com/revanced/revanced-patches/compare/v2.69.3...v2.69.4) (2022-09-27)

### Bug Fixes

* **sponsorblock:** dynamically insert `setSponsorBarRect` call ([#644](https://github.com/revanced/revanced-patches/issues/644)) ([88940dd](d5ee3b006d))
2022-09-27 20:02:25 +00:00
d4rkk3y
d5ee3b006d fix(sponsorblock): dynamically insert setSponsorBarRect call (#644) 2022-09-27 22:00:24 +02:00
semantic-release-bot
36ab007924 chore(release): 2.69.3 [skip ci]
## [2.69.3](https://github.com/revanced/revanced-patches/compare/v2.69.2...v2.69.3) (2022-09-27)

### Bug Fixes

* **sponsorblock:** correct class name for field reference ([#582](https://github.com/revanced/revanced-patches/issues/582)) ([c584092](31ae362d18))
2022-09-27 13:32:48 +00:00
semantic-release-bot
c46705f21a chore(release): 2.69.3 [skip ci]
## [2.69.3](https://github.com/revanced/revanced-patches/compare/v2.69.2...v2.69.3) (2022-09-27)

### Bug Fixes

* **sponsorblock:** correct class name for field reference ([#582](https://github.com/revanced/revanced-patches/issues/582)) ([c584092](31ae362d18))
2022-09-27 04:57:01 +00:00
inotia00
31ae362d18 fix(sponsorblock): correct class name for field reference (#582) 2022-09-27 06:55:15 +02:00
semantic-release-bot
b64f7bb400 chore(release): 2.69.2 [skip ci]
## [2.69.2](https://github.com/revanced/revanced-patches/compare/v2.69.1...v2.69.2) (2022-09-26)

### Performance Improvements

* **resource-mapping:** map resources with multiple threads ([81e86c4](64244ec476))
2022-09-26 02:33:00 +00:00
oSumAtrIX
64244ec476 perf(resource-mapping): map resources with multiple threads 2022-09-26 04:30:49 +02:00
oSumAtrIX
f005314358 chore: bump patcher dependency version 2022-09-26 04:30:49 +02:00
shadow578
ae1aeffc62 refactor(microg-support): share code between music-microg-support patch 2022-09-26 04:30:49 +02:00
semantic-release-bot
56768caa4c chore(release): 2.69.1 [skip ci]
## [2.69.1](https://github.com/revanced/revanced-patches/compare/v2.69.0...v2.69.1) (2022-09-24)

### Bug Fixes

* **sponsorblock:** reflect changes to strings ([#585](https://github.com/revanced/revanced-patches/issues/585)) ([ee3a9c5](19484ca2bc))
2022-09-24 21:46:59 +00:00
Michael M. Chang
19484ca2bc fix(sponsorblock): reflect changes to strings (#585) 2022-09-24 23:45:02 +02:00
semantic-release-bot
a8a98646e7 chore(release): 2.69.0 [skip ci]
# [2.69.0](https://github.com/revanced/revanced-patches/compare/v2.68.3...v2.69.0) (2022-09-24)

### Features

* `spotify-theme` patch ([#608](https://github.com/revanced/revanced-patches/issues/608)) ([468ec3e](4927bc7451))
2022-09-24 13:45:49 +00:00
bogadana
4927bc7451 feat: spotify-theme patch (#608) 2022-09-24 15:44:04 +02:00
semantic-release-bot
66a5ca3fa8 chore(release): 2.68.3 [skip ci]
## [2.68.3](https://github.com/revanced/revanced-patches/compare/v2.68.2...v2.68.3) (2022-09-23)

### Bug Fixes

* **seekbar-tapping:** do not disable seekbar when hiding it ([#600](https://github.com/revanced/revanced-patches/issues/600)) ([f251ae7](6c0b9213fe))
2022-09-23 19:11:44 +00:00
OxrxL
6c0b9213fe fix(seekbar-tapping): do not disable seekbar when hiding it (#600) 2022-09-23 21:09:47 +02:00
semantic-release-bot
70e21500cc chore(release): 2.68.2 [skip ci]
## [2.68.2](https://github.com/revanced/revanced-patches/compare/v2.68.1...v2.68.2) (2022-09-23)

### Bug Fixes

* **hide-time-and-seekbar:** don't draw the seekbar ([#594](https://github.com/revanced/revanced-patches/issues/594)) ([8b3ab04](784e97591a))
2022-09-23 10:53:30 +00:00
OxrxL
784e97591a fix(hide-time-and-seekbar): don't draw the seekbar (#594) 2022-09-23 12:51:58 +02:00
semantic-release-bot
26ff3b338e chore(release): 2.68.1 [skip ci]
## [2.68.1](https://github.com/revanced/revanced-patches/compare/v2.68.0...v2.68.1) (2022-09-23)

### Bug Fixes

* **sponsorblock:** resolve unresolved fingerprint ([986a396](28c864ae95))
2022-09-23 09:51:06 +00:00
oSumAtrIX
28c864ae95 fix(sponsorblock): resolve unresolved fingerprint 2022-09-23 11:49:08 +02:00
semantic-release-bot
deb829c791 chore(release): 2.68.0 [skip ci]
# [2.68.0](https://github.com/revanced/revanced-patches/compare/v2.67.1...v2.68.0) (2022-09-23)

### Bug Fixes

* **hide-premium-navbar:** remove the correct instructions ([#591](https://github.com/revanced/revanced-patches/issues/591)) ([d82a947](3c0f3ac968))

### Features

* **tiktok:** adapt `tiktok-download` with `tiktok-settings`. ([#586](https://github.com/revanced/revanced-patches/issues/586)) ([459963c](2f6da4ed27))
2022-09-23 05:42:52 +00:00
Tim Wüstenhagen
3c0f3ac968 fix(hide-premium-navbar): remove the correct instructions (#591) 2022-09-23 07:40:50 +02:00
d4rkk3y
2f6da4ed27 feat(tiktok): adapt tiktok-download with tiktok-settings. (#586) 2022-09-23 07:40:16 +02:00
semantic-release-bot
1b653c77c4 chore(release): 2.67.1 [skip ci]
## [2.67.1](https://github.com/revanced/revanced-patches/compare/v2.67.0...v2.67.1) (2022-09-23)
2022-09-23 04:47:01 +00:00
oSumAtrIX
82ea2d3498 build: update patcher dependency 2022-09-23 06:35:29 +02:00
semantic-release-bot
07dee5b87a chore(release): 2.67.0 [skip ci]
# [2.67.0](https://github.com/revanced/revanced-patches/compare/v2.66.2...v2.67.0) (2022-09-23)

### Bug Fixes

* **hide-premium-nav-bar:** invalid import ([#590](https://github.com/revanced/revanced-patches/issues/590)) ([78f0200](7713516ed8))

### Features

* `hide-premium-nav-bar` patch ([#589](https://github.com/revanced/revanced-patches/issues/589)) ([950f7e2](22fa09dc27))
2022-09-23 00:27:51 +00:00
Tim Wüstenhagen
7713516ed8 fix(hide-premium-nav-bar): invalid import (#590) 2022-09-23 02:26:06 +02:00
Tim Wüstenhagen
22fa09dc27 feat: hide-premium-nav-bar patch (#589) 2022-09-23 02:05:41 +02:00
semantic-release-bot
24d03387de chore(release): 2.66.2 [skip ci]
## [2.66.2](https://github.com/revanced/revanced-patches/compare/v2.66.1...v2.66.2) (2022-09-22)

### Bug Fixes

* **custom-playback-speed:** implement own method instead of `takeWhile` ([4070744](04310901b7))
2022-09-22 06:40:39 +00:00
oSumAtrIX
04310901b7 fix(custom-playback-speed): implement own method instead of takeWhile 2022-09-22 08:38:49 +02:00
semantic-release-bot
3011c1fa45 chore(release): 2.66.1 [skip ci]
## [2.66.1](https://github.com/revanced/revanced-patches/compare/v2.66.0...v2.66.1) (2022-09-22)

### Bug Fixes

* **sponsorblock:** broken fingerprint and invert setting `shorts_playing` ([#579](https://github.com/revanced/revanced-patches/issues/579)) ([0125b09](6b83fe572a))
2022-09-22 05:46:12 +00:00
OxrxL
6b83fe572a fix(sponsorblock): broken fingerprint and invert setting shorts_playing (#579)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-22 07:43:54 +02:00
semantic-release-bot
32d303f4b7 chore(release): 2.66.0 [skip ci]
# [2.66.0](https://github.com/revanced/revanced-patches/compare/v2.65.0...v2.66.0) (2022-09-22)

### Features

* **custom-playback-speed:** max, min, granularity option ([61df23c](837c381e19))
2022-09-22 05:21:14 +00:00
oSumAtrIX
837c381e19 feat(custom-playback-speed): max, min, granularity option 2022-09-22 07:17:10 +02:00
semantic-release-bot
09ae60bb28 chore(release): 2.65.0 [skip ci]
# [2.65.0](https://github.com/revanced/revanced-patches/compare/v2.64.2...v2.65.0) (2022-09-21)

### Features

* `tiktok-feed-filter` , `tiktok-settings` and `tiktok-force-login` patch ([#501](https://github.com/revanced/revanced-patches/issues/501)) ([f506bff](c40181140d))
* **theme:** arbitrary background color for light theme  ([#565](https://github.com/revanced/revanced-patches/issues/565)) ([741d005](f9d180aad4))
2022-09-21 21:03:06 +00:00
Pranshu Goyal
f9d180aad4 feat(theme): arbitrary background color for light theme (#565) 2022-09-21 23:01:23 +02:00
d4rkk3y
c40181140d feat: tiktok-feed-filter , tiktok-settings and tiktok-force-login patch (#501) 2022-09-21 23:00:03 +02:00
semantic-release-bot
c5e190a4d5 chore(release): 2.64.2 [skip ci]
## [2.64.2](https://github.com/revanced/revanced-patches/compare/v2.64.1...v2.64.2) (2022-09-21)

### Bug Fixes

* **custom-video-buffer:** use correct offset for `getMaxBuffer` call injection ([fa849b6](24e3f8b24e))
2022-09-21 14:46:28 +00:00
oSumAtrIX
24e3f8b24e fix(custom-video-buffer): use correct offset for getMaxBuffer call injection 2022-09-21 16:44:44 +02:00
semantic-release-bot
53b0485642 chore(release): 2.64.1 [skip ci]
## [2.64.1](https://github.com/revanced/revanced-patches/compare/v2.64.0...v2.64.1) (2022-09-21)
2022-09-21 02:17:40 +00:00
oSumAtrIX
b362b560b6 build: bump patcher dependency version to v5.0.0 2022-09-21 04:15:07 +02:00
semantic-release-bot
b285bf96bd chore(release): 2.64.0 [skip ci]
# [2.64.0](https://github.com/revanced/revanced-patches/compare/v2.63.0...v2.64.0) (2022-09-21)

### Features

* explicit support for YouTube v17.34.35 and v17.34.36 ([#527](https://github.com/revanced/revanced-patches/issues/527)) ([0620304](bfb47eb1c4))
2022-09-21 02:11:13 +00:00
Sourav Das
bfb47eb1c4 feat: explicit support for YouTube v17.34.35 and v17.34.36 (#527) 2022-09-21 04:09:26 +02:00
semantic-release-bot
4e2d30228a chore(release): 2.63.0 [skip ci]
# [2.63.0](https://github.com/revanced/revanced-patches/compare/v2.62.0...v2.63.0) (2022-09-21)

### Features

* `disable-auto-player-popup-panels` ([#543](https://github.com/revanced/revanced-patches/issues/543)) ([35f1323](68ec6d2258))
* disable sponsorblock on shorts ([#439](https://github.com/revanced/revanced-patches/issues/439)) ([5b0a6af](dce28760f5))
2022-09-21 01:06:10 +00:00
OxrxL
dce28760f5 feat: disable sponsorblock on shorts (#439) 2022-09-21 03:03:47 +02:00
OxrxL
68ec6d2258 feat: disable-auto-player-popup-panels (#543) 2022-09-21 03:02:20 +02:00
semantic-release-bot
83498fd29c chore(release): 2.62.0 [skip ci]
# [2.62.0](https://github.com/revanced/revanced-patches/compare/v2.61.1...v2.62.0) (2022-09-21)

### Features

* `hide-time-and-seekbar` patch ([#544](https://github.com/revanced/revanced-patches/issues/544)) ([9c86429](1ab35a1cfa))
2022-09-21 01:00:46 +00:00
OxrxL
1ab35a1cfa feat: hide-time-and-seekbar patch (#544) 2022-09-21 02:58:39 +02:00
semantic-release-bot
e0b45237bb chore(release): 2.61.1 [skip ci]
## [2.61.1](https://github.com/revanced/revanced-patches/compare/v2.61.0...v2.61.1) (2022-09-21)

### Bug Fixes

* **sponsorblock:** reflect strings from official guidelines ([#523](https://github.com/revanced/revanced-patches/issues/523)) ([8f8bcee](161a1b0af1))
2022-09-21 00:00:54 +00:00
Michael M. Chang
161a1b0af1 fix(sponsorblock): reflect strings from official guidelines (#523) 2022-09-21 01:58:29 +02:00
semantic-release-bot
7618376388 chore(release): 2.61.0 [skip ci]
# [2.61.0](https://github.com/revanced/revanced-patches/compare/v2.60.0...v2.61.0) (2022-09-20)

### Features

* section `acknowledgements` for issue templates ([8f4cdbb](2bdb857a9f))
2022-09-20 22:38:27 +00:00
oSumAtrIX
2bdb857a9f feat: section acknowledgements for issue templates
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-21 00:36:26 +02:00
semantic-release-bot
be02acecfc chore(release): 2.60.0 [skip ci]
# [2.60.0](https://github.com/revanced/revanced-patches/compare/v2.59.0...v2.60.0) (2022-09-19)

### Features

* **downloads:** missing package installation request ([ccb90e9](9e873329c6))
2022-09-19 22:39:17 +00:00
oSumAtrIX
9e873329c6 feat(downloads): missing package installation request 2022-09-20 00:37:30 +02:00
semantic-release-bot
8a2b79ec16 chore(release): 2.59.0 [skip ci]
# [2.59.0](https://github.com/revanced/revanced-patches/compare/v2.58.0...v2.59.0) (2022-09-18)

### Features

* **sponsorblock:** string for response error code 400 ([#512](https://github.com/revanced/revanced-patches/issues/512)) ([fd0a45f](9842f7ca0d))
2022-09-18 22:06:17 +00:00
Michael M. Chang
9842f7ca0d feat(sponsorblock): string for response error code 400 (#512) 2022-09-19 00:04:11 +02:00
semantic-release-bot
8a913c6a2a chore(release): 2.58.0 [skip ci]
# [2.58.0](https://github.com/revanced/revanced-patches/compare/v2.57.0...v2.58.0) (2022-09-18)

### Bug Fixes

* **hdr-auto-brightness:** increase patching compatibility across versions ([4933e58](886018d6fb))
* **hide-create-button:** increase patching compatibility across versions ([751fa45](c707dc8769))
* **hide-shorts-button:** increase patching compatibility across versions ([624215d](1bb93e3598))

### Features

* bump patches compatibility to v17.36.37 ([2a7222f](eb985942f0))
2022-09-18 06:28:04 +00:00
oSumAtrIX
84676ef33d build: bump patcher dependency version
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-18 08:25:37 +02:00
oSumAtrIX
eb985942f0 feat: bump patches compatibility to v17.36.37
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-18 08:10:53 +02:00
oSumAtrIX
886018d6fb fix(hdr-auto-brightness): increase patching compatibility across versions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-18 08:10:31 +02:00
oSumAtrIX
e7a17ccbc6 refactor: move InjectionUtils to utils subpackage
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-18 07:35:59 +02:00
oSumAtrIX
c707dc8769 fix(hide-create-button): increase patching compatibility across versions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-18 07:33:42 +02:00
oSumAtrIX
1bb93e3598 fix(hide-shorts-button): increase patching compatibility across versions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-18 07:33:11 +02:00
semantic-release-bot
e8848171ac chore(release): 2.57.0 [skip ci]
# [2.57.0](https://github.com/revanced/revanced-patches/compare/v2.56.1...v2.57.0) (2022-09-16)

### Features

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

### Bug Fixes

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

### Features

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

### Features

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

### Bug Fixes

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

### Features

* bump YouTube Music patches to v5.23.50 ([#462](https://github.com/revanced/revanced-patches/issues/462)) ([15c10b1](e8b550f5aa))
2022-09-14 13:48:11 +00:00
Suraj Anil Yadav
e8b550f5aa feat: bump YouTube Music patches to v5.23.50 (#462) 2022-09-14 15:46:25 +02:00
semantic-release-bot
e73c0e0a00 chore(release): 2.53.0 [skip ci]
# [2.53.0](https://github.com/revanced/revanced-patches/compare/v2.52.3...v2.53.0) (2022-09-13)

### Features

* patch requests issue template ([#467](https://github.com/revanced/revanced-patches/issues/467)) ([d8bb354](8c132be096)), closes [revanced/revanced-patches#463](https://github.com/revanced/revanced-patches/issues/463)
2022-09-13 20:32:58 +00:00
Sculas
8c132be096 feat: patch requests issue template (#467)
Closes: revanced/revanced-patches#463
2022-09-13 22:31:06 +02:00
semantic-release-bot
cb10ea1797 chore(release): 2.52.3 [skip ci]
## [2.52.3](https://github.com/revanced/revanced-patches/compare/v2.52.2...v2.52.3) (2022-09-11)

### Bug Fixes

* path for download icon ([#465](https://github.com/revanced/revanced-patches/issues/465)) ([bff22c3](6d6a0375c8))
2022-09-11 23:42:21 +00:00
afn
6d6a0375c8 fix: path for download icon (#465) 2022-09-12 01:40:36 +02:00
semantic-release-bot
8541ee0066 chore(release): 2.52.2 [skip ci]
## [2.52.2](https://github.com/revanced/revanced-patches/compare/v2.52.1...v2.52.2) (2022-09-11)

### Bug Fixes

* design language for download icon ([#464](https://github.com/revanced/revanced-patches/issues/464)) ([c24dc17](f7e0b46bc7))
2022-09-11 22:01:02 +00:00
afn
f7e0b46bc7 fix: design language for download icon (#464) 2022-09-11 23:58:23 +02:00
semantic-release-bot
59af825d0a chore(release): 2.52.1 [skip ci]
## [2.52.1](https://github.com/revanced/revanced-patches/compare/v2.52.0...v2.52.1) (2022-09-08)

### Bug Fixes

* multiple compatible pkgs on readme ([3f82a13](04ffffbdf2))
2022-09-08 20:05:20 +00:00
Sculas
04ffffbdf2 fix: multiple compatible pkgs on readme 2022-09-08 22:03:30 +02:00
semantic-release-bot
ecc131fa4f chore(release): 2.52.0 [skip ci]
# [2.52.0](https://github.com/revanced/revanced-patches/compare/v2.51.3...v2.52.0) (2022-09-08)

### Features

* add deprecated & options to patches.json ([759315b](a4f1d3558e))
2022-09-08 19:43:07 +00:00
Sculas
a4f1d3558e feat: add deprecated & options to patches.json 2022-09-08 21:40:59 +02:00
Sculas
4cbd58721d build: update patcher dependency 2022-09-08 21:10:41 +02:00
semantic-release-bot
7cfe43e666 chore(release): 2.51.3 [skip ci]
## [2.51.3](https://github.com/revanced/revanced-patches/compare/v2.51.2...v2.51.3) (2022-09-08)

### Bug Fixes

* cleanup & trigger release for ThemePatch ([8d25b21](c93d7bc212)), closes [#447](https://github.com/revanced/revanced-patches/issues/447) [revanced/revanced-patcher#99](https://github.com/revanced/revanced-patcher/issues/99)
2022-09-08 16:37:40 +00:00
Sculas
c93d7bc212 fix: cleanup & trigger release for ThemePatch
Closes #447
Closes revanced/revanced-patcher#99
2022-09-08 18:35:08 +02:00
Sculas
c28fd5cf20 Merge remote-tracking branch 'origin/main' into main 2022-09-08 17:06:32 +02:00
Sculas
069f754d51 refactor: set amoled theme default for ThemePatch 2022-09-08 17:06:16 +02:00
semantic-release-bot
cba04cf5a6 chore(release): 2.51.2 [skip ci]
## [2.51.2](https://github.com/revanced/revanced-patches/compare/v2.51.1...v2.51.2) (2022-09-08)
2022-09-08 15:03:32 +00:00
Sculas
5e358c7319 refactor: update to patcher 4.2.2 2022-09-08 17:01:28 +02:00
Sculas
ce69471684 build: update patcher dependency 2022-09-08 16:59:29 +02:00
semantic-release-bot
a0981dda9d chore(release): 2.51.1 [skip ci]
## [2.51.1](https://github.com/revanced/revanced-patches/compare/v2.51.0...v2.51.1) (2022-09-08)

### Bug Fixes

* wrap theme option ([150c173](6073181ee1))
2022-09-08 11:47:28 +00:00
Sculas
6073181ee1 fix: wrap theme option 2022-09-08 13:45:28 +02:00
Sculas
522587321c build: update patcher 2022-09-08 13:45:10 +02:00
semantic-release-bot
b16748794e chore(release): 2.51.0 [skip ci]
# [2.51.0](https://github.com/revanced/revanced-patches/compare/v2.50.8...v2.51.0) (2022-09-08)

### Features

* Theme Patch ([#440](https://github.com/revanced/revanced-patches/issues/440)) ([f3b92ca](01e9a396d6))
2022-09-08 09:57:04 +00:00
Sculas
01e9a396d6 feat: Theme Patch (#440)
* feat: Theme Patch

* refactor: deprecate AmoledPatch

* Update src/main/kotlin/app/revanced/patches/youtube/layout/theme/patch/ThemePatch.kt

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>

* refactor: apply requested changes

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-09-08 11:55:06 +02:00
semantic-release-bot
86fcd4d475 chore(release): 2.50.8 [skip ci]
## [2.50.8](https://github.com/revanced/revanced-patches/compare/v2.50.7...v2.50.8) (2022-09-08)
2022-09-08 09:34:38 +00:00
Sculas
8bbc744114 build: update patcher 2022-09-08 11:32:45 +02:00
semantic-release-bot
d7a4ad76ea chore(release): 2.50.7 [skip ci]
## [2.50.7](https://github.com/revanced/revanced-patches/compare/v2.50.6...v2.50.7) (2022-09-08)
2022-09-08 08:28:01 +00:00
E85Addict
7e6ee73908 build: bump patcher dependency version (#443) 2022-09-08 10:25:56 +02:00
semantic-release-bot
87954a1aaf chore(release): 2.50.6 [skip ci]
## [2.50.6](https://github.com/revanced/revanced-patches/compare/v2.50.5...v2.50.6) (2022-09-07)
2022-09-07 20:39:46 +00:00
Sculas
e5a2ed0f70 refactor: cleanup AmoledPatch 2022-09-07 22:37:53 +02:00
Sculas
2295aaebf4 chore: ignore kotlinc.xml 2022-09-07 22:37:38 +02:00
Sculas
a72bf150c2 build: update patcher 2022-09-07 22:34:36 +02:00
semantic-release-bot
0290cd3d36 chore(release): 2.50.5 [skip ci]
## [2.50.5](https://github.com/revanced/revanced-patches/compare/v2.50.4...v2.50.5) (2022-09-07)
2022-09-07 19:16:38 +00:00
Sculas
e8d61e0c0e refactor: adapt patcher 4.0.0 changes 2022-09-07 21:14:03 +02:00
Sculas
19769d80eb build: update patcher 2022-09-07 21:05:43 +02:00
Sculas
12c16d4644 refactor: cleanup CustomBrandingPatch 2022-09-07 21:03:03 +02:00
Sculas
75f4653c16 build: update patcher 2022-09-06 23:45:54 +02:00
semantic-release-bot
3286d26996 chore(release): 2.50.4 [skip ci]
## [2.50.4](https://github.com/revanced/revanced-patches/compare/v2.50.3...v2.50.4) (2022-09-03)

### Bug Fixes

* don't respect primary color for the download button icon ([#424](https://github.com/revanced/revanced-patches/issues/424)) ([3fa70f4](edbc36e90f))
2022-09-03 03:49:15 +00:00
Tititvoot Pangrit
edbc36e90f fix: don't respect primary color for the download button icon (#424) 2022-09-03 05:46:55 +02:00
semantic-release-bot
7ad2be7f27 chore(release): 2.50.3 [skip ci]
## [2.50.3](https://github.com/revanced/revanced-patches/compare/v2.50.2...v2.50.3) (2022-09-01)

### Bug Fixes

* partial ad blockage in `tiktok-ads` patch ([#420](https://github.com/revanced/revanced-patches/issues/420)) ([bc6d192](1702322671))
2022-09-01 17:13:54 +00:00
d4rkk3y
1702322671 fix: partial ad blockage in tiktok-ads patch (#420) 2022-09-01 19:12:16 +02:00
semantic-release-bot
9c9bfbd593 chore(release): 2.50.2 [skip ci]
## [2.50.2](https://github.com/revanced/revanced-patches/compare/v2.50.1...v2.50.2) (2022-08-31)

### Bug Fixes

* wrong dependency version ([1e63a57](3df662a39c))
2022-08-31 18:44:22 +00:00
oSumAtrIX
3df662a39c fix: wrong dependency version
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-08-31 20:42:18 +02:00
oSumAtrIX
572c110a6e refactor: make use of named arguments 2022-08-31 20:38:38 +02:00
oSumAtrIX
0be9f00915 build: bump patcher dependency version
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-08-31 20:36:57 +02:00
semantic-release-bot
0b6f643ff3 chore(release): 2.50.1 [skip ci]
## [2.50.1](https://github.com/revanced/revanced-patches/compare/v2.50.0...v2.50.1) (2022-08-31)

### Bug Fixes

* resolve fingerprint in `premium-icon-reddit` patch ([#413](https://github.com/revanced/revanced-patches/issues/413)) ([60ec2c6](1989d53938))
2022-08-31 16:04:43 +00:00
Technikte
1989d53938 fix: resolve fingerprint in premium-icon-reddit patch (#413) 2022-08-31 18:03:03 +02:00
semantic-release-bot
ac1acf10e6 chore(release): 2.50.0 [skip ci]
# [2.50.0](https://github.com/revanced/revanced-patches/compare/v2.49.0...v2.50.0) (2022-08-31)

### Features

* `tiktok-download` and `tiktok-seekbar` patch ([#405](https://github.com/revanced/revanced-patches/issues/405)) ([f36e000](0ad686da21))
2022-08-31 15:59:52 +00:00
d4rkk3y
0ad686da21 feat: tiktok-download and tiktok-seekbar patch (#405) 2022-08-31 17:57:51 +02:00
semantic-release-bot
e734b2231a chore(release): 2.49.0 [skip ci]
# [2.49.0](https://github.com/revanced/revanced-patches/compare/v2.48.2...v2.49.0) (2022-08-31)

### Features

* bump YouTube Music patches to v5.22.54 ([#409](https://github.com/revanced/revanced-patches/issues/409)) ([859176e](efe06d1cdc))
2022-08-31 00:06:04 +00:00
Ushie
efe06d1cdc feat: bump YouTube Music patches to v5.22.54 (#409) 2022-08-31 02:04:23 +02:00
semantic-release-bot
a0f9013fab chore(release): 2.48.2 [skip ci]
## [2.48.2](https://github.com/revanced/revanced-patches/compare/v2.48.1...v2.48.2) (2022-08-30)

### Bug Fixes

* do not constrain `amoled` patch to versions ([#408](https://github.com/revanced/revanced-patches/issues/408)) ([4af1714](93dcd542d5))
2022-08-30 23:37:08 +00:00
Ushie
93dcd542d5 fix: do not constrain amoled patch to versions (#408) 2022-08-31 01:35:26 +02:00
semantic-release-bot
3bac23f577 chore(release): 2.48.1 [skip ci]
## [2.48.1](https://github.com/revanced/revanced-patches/compare/v2.48.0...v2.48.1) (2022-08-30)

### Bug Fixes

* don't overwrite register in `compact-header` patch ([#406](https://github.com/revanced/revanced-patches/issues/406)) ([3da8ab5](febcf60efb))
2022-08-30 16:37:58 +00:00
Canny
febcf60efb fix: don't overwrite register in compact-header patch (#406) 2022-08-30 18:35:41 +02:00
semantic-release-bot
0d74a2dfa6 chore(release): 2.48.0 [skip ci]
# [2.48.0](https://github.com/revanced/revanced-patches/compare/v2.47.0...v2.48.0) (2022-08-30)

### Features

* bump YouTube Music patches to v5.21.52 ([#404](https://github.com/revanced/revanced-patches/issues/404)) ([0abb196](5b04fbb748))
2022-08-30 15:34:03 +00:00
Canny
5b04fbb748 feat: bump YouTube Music patches to v5.21.52 (#404) 2022-08-30 17:31:31 +02:00
semantic-release-bot
fbfa0ea3be chore(release): 2.47.0 [skip ci]
# [2.47.0](https://github.com/revanced/revanced-patches/compare/v2.46.0...v2.47.0) (2022-08-29)

### Features

* bump youtube version to v17.33.42 ([#398](https://github.com/revanced/revanced-patches/issues/398)) ([769aa25](4a30afe1e2))
2022-08-29 17:06:58 +00:00
Canny
4a30afe1e2 feat: bump youtube version to v17.33.42 (#398) 2022-08-29 19:05:19 +02:00
semantic-release-bot
dd1df32036 chore(release): 2.46.0 [skip ci]
# [2.46.0](https://github.com/revanced/revanced-patches/compare/v2.45.3...v2.46.0) (2022-08-29)

### Bug Fixes

* `seekbar-tapping` toggling ([#401](https://github.com/revanced/revanced-patches/issues/401)) ([5550244](67f6041bab))

### Features

* `premium-icon-reddit` patch ([#333](https://github.com/revanced/revanced-patches/issues/333)) ([6739e7b](6b3f8e46fd))
* blacklist `.vsc` folder in `.gitignore` ([#331](https://github.com/revanced/revanced-patches/issues/331)) ([1922253](a52d674cde))
2022-08-29 16:23:03 +00:00
Technikte
a52d674cde feat: blacklist .vsc folder in .gitignore (#331) 2022-08-29 18:21:24 +02:00
d4rkk3y
67f6041bab fix: seekbar-tapping toggling (#401) 2022-08-29 18:20:25 +02:00
Technikte
6b3f8e46fd feat: premium-icon-reddit patch (#333) 2022-08-29 18:19:15 +02:00
semantic-release-bot
b95058f20a chore(release): 2.45.3 [skip ci]
## [2.45.3](https://github.com/revanced/revanced-patches/compare/v2.45.2...v2.45.3) (2022-08-29)

### Bug Fixes

* release `patches.json` file ([#402](https://github.com/revanced/revanced-patches/issues/402)) ([17e351c](5b80ac1216))
2022-08-29 13:33:33 +00:00
reis
5b80ac1216 fix: release patches.json file (#402) 2022-08-29 15:31:37 +02:00
semantic-release-bot
6fe1bfb856 chore(release): 2.45.2 [skip ci]
## [2.45.2](https://github.com/revanced/revanced-patches/compare/v2.45.1...v2.45.2) (2022-08-28)

### Bug Fixes

* add `patches.json` as a release asset ([a0b2c89](589a7c01d1))
2022-08-28 20:26:45 +00:00
Sculas
589a7c01d1 fix: add patches.json as a release asset 2022-08-28 22:24:45 +02:00
semantic-release-bot
4cd6d4459a chore(release): 2.45.1 [skip ci]
## [2.45.1](https://github.com/revanced/revanced-patches/compare/v2.45.0...v2.45.1) (2022-08-28)

### Bug Fixes

* run meta generator ([70a2b45](89a92b2057))
2022-08-28 19:52:25 +00:00
Sculas
89a92b2057 fix: run meta generator 2022-08-28 21:50:38 +02:00
semantic-release-bot
9f265a46cf chore(release): 2.45.0 [skip ci]
# [2.45.0](https://github.com/revanced/revanced-patches/compare/v2.44.0...v2.45.0) (2022-08-28)

### Features

* Add JSON meta ([4c229d3](a740690a08))
2022-08-28 19:42:01 +00:00
Sculas
a740690a08 feat: Add JSON meta 2022-08-28 21:39:13 +02:00
oSumAtrIX
d722a64d3c refactor: remove integrations dependency 2022-08-27 04:59:04 +02:00
oSumAtrIX
abe2674290 refactor: addInstruction instead of addInstructions 2022-08-27 04:01:09 +02:00
semantic-release-bot
e5ec40f6fa chore(release): 2.44.0 [skip ci]
# [2.44.0](https://github.com/revanced/revanced-patches/compare/v2.43.2...v2.44.0) (2022-08-27)

### Features

* add debug switch ([#391](https://github.com/revanced/revanced-patches/issues/391)) ([ee4b776](96c43fc6f5))
2022-08-27 01:23:45 +00:00
Canny
96c43fc6f5 feat: add debug switch (#391) 2022-08-27 03:21:53 +02:00
semantic-release-bot
4e36d72c5c chore(release): 2.43.2 [skip ci]
## [2.43.2](https://github.com/revanced/revanced-patches/compare/v2.43.1...v2.43.2) (2022-08-26)

### Bug Fixes

* package name for Vanced ([#390](https://github.com/revanced/revanced-patches/issues/390)) ([85206b9](6197246e8e))
2022-08-26 23:32:49 +00:00
Robert
6197246e8e fix: package name for Vanced (#390) 2022-08-27 01:31:07 +02:00
semantic-release-bot
15a044cae1 chore(release): 2.43.1 [skip ci]
## [2.43.1](https://github.com/revanced/revanced-patches/compare/v2.43.0...v2.43.1) (2022-08-26)

### Bug Fixes

* `Patch` annotation for `client-spoof` patch ([6a8af47](ede60b994c))
2022-08-26 22:53:56 +00:00
oSumAtrIX
ede60b994c fix: Patch annotation for client-spoof patch 2022-08-27 00:52:10 +02:00
semantic-release-bot
c15cc431d6 chore(release): 2.43.0 [skip ci]
# [2.43.0](https://github.com/revanced/revanced-patches/compare/v2.42.1...v2.43.0) (2022-08-26)

### Features

* `client-spoof` patch ([5512c07](fb006f87ab))
2022-08-26 22:07:20 +00:00
epicsampler
fb006f87ab feat: client-spoof patch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-08-27 00:05:21 +02:00
semantic-release-bot
28206fd804 chore(release): 2.42.1 [skip ci]
## [2.42.1](https://github.com/revanced/revanced-patches/compare/v2.42.0...v2.42.1) (2022-08-26)

### Bug Fixes

* changed default value for autorepeat setting ([#386](https://github.com/revanced/revanced-patches/issues/386)) ([d43add7](e425e75152))
2022-08-26 01:14:13 +00:00
afn
e425e75152 fix: changed default value for autorepeat setting (#386) 2022-08-26 03:11:46 +02:00
Levente Ilyó-Kovács
69d6c55942 docs: punctuation in microg-support patch description (#377) 2022-08-23 00:51:02 +02:00
semantic-release-bot
f2b29351b4 chore(release): 2.42.0 [skip ci]
# [2.42.0](https://github.com/revanced/revanced-patches/compare/v2.41.0...v2.42.0) (2022-08-22)

### Bug Fixes

* default values for settings ([834c4ad](b75e759348))

### Features

* setting for downloader package name ([965d05c](db0b468e71))
* v17.29.34 compatibility for `downloads` patch ([#374](https://github.com/revanced/revanced-patches/issues/374)) ([d81f1af](83b41322c4))
2022-08-22 17:16:38 +00:00
oSumAtrIX
db0b468e71 feat: setting for downloader package name 2022-08-22 19:14:17 +02:00
oSumAtrIX
b75e759348 fix: default values for settings 2022-08-22 19:13:57 +02:00
Robert
83b41322c4 feat: v17.29.34 compatibility for downloads patch (#374) 2022-08-22 14:38:21 +02:00
semantic-release-bot
8d8878aa08 chore(release): 2.41.0 [skip ci]
# [2.41.0](https://github.com/revanced/revanced-patches/compare/v2.40.2...v2.41.0) (2022-08-22)

### Features

* `downloads` patch ([#215](https://github.com/revanced/revanced-patches/issues/215)) ([304fbac](d628674cdd))
2022-08-22 03:00:31 +00:00
oSumAtrIX
d628674cdd feat: downloads patch (#215) 2022-08-22 04:58:17 +02:00
semantic-release-bot
23b182ccbb chore(release): 2.40.2 [skip ci]
## [2.40.2](https://github.com/revanced/revanced-patches/compare/v2.40.1...v2.40.2) (2022-08-22)

### Bug Fixes

* correct title for `tablet-miniplayer` setting switch ([6af6c02](4a784ecd6e))
2022-08-22 02:42:29 +00:00
oSumAtrIX
4a784ecd6e fix: correct title for tablet-miniplayer setting switch 2022-08-22 04:40:49 +02:00
semantic-release-bot
0165b53c6d chore(release): 2.40.1 [skip ci]
## [2.40.1](https://github.com/revanced/revanced-patches/compare/v2.40.0...v2.40.1) (2022-08-22)

### Bug Fixes

* add missing switch for `tablet-mini-player` patch ([244a1b2](17a0e16087))
2022-08-22 02:00:11 +00:00
oSumAtrIX
17a0e16087 fix: add missing switch for tablet-mini-player patch 2022-08-22 03:58:15 +02:00
semantic-release-bot
8cf91f39a5 chore(release): 2.40.0 [skip ci]
# [2.40.0](https://github.com/revanced/revanced-patches/compare/v2.39.1...v2.40.0) (2022-08-22)

### Features

* `settings` patch framework ([#266](https://github.com/revanced/revanced-patches/issues/266)) ([084a99b](9ef93f6618))
2022-08-22 00:02:00 +00:00
oSumAtrIX
9ef93f6618 feat: settings patch framework (#266) 2022-08-22 01:59:43 +02:00
semantic-release-bot
8c3866f5e3 chore(release): 2.39.1 [skip ci]
## [2.39.1](https://github.com/revanced/revanced-patches/compare/v2.39.0...v2.39.1) (2022-08-21)

### Bug Fixes

* make `custom-branding` cross-platform ([#366](https://github.com/revanced/revanced-patches/issues/366)) ([02ac62b](d115d649f4))
2022-08-21 00:35:21 +00:00
Alberto Ponces
d115d649f4 fix: make custom-branding cross-platform (#366) 2022-08-21 02:33:04 +02:00
semantic-release-bot
ddc789395e chore(release): 2.39.0 [skip ci]
# [2.39.0](https://github.com/revanced/revanced-patches/compare/v2.38.0...v2.39.0) (2022-08-19)

### Features

* bundle `dex` file into `jar` file ([#359](https://github.com/revanced/revanced-patches/issues/359)) ([f419252](e1200d4e3f))
2022-08-19 23:29:17 +00:00
Alberto Ponces
e1200d4e3f feat: bundle dex file into jar file (#359) 2022-08-20 01:26:59 +02:00
semantic-release-bot
8276340d2b chore(release): 2.38.0 [skip ci]
# [2.38.0](https://github.com/revanced/revanced-patches/compare/v2.37.0...v2.38.0) (2022-08-17)

### Features

* bump YouTube patches to `v17.32.35` ([#347](https://github.com/revanced/revanced-patches/issues/347)) ([5292a0e](8f32af4de1))
2022-08-17 17:13:42 +00:00
inotia00
8f32af4de1 feat: bump YouTube patches to v17.32.35 (#347) 2022-08-17 19:11:53 +02:00
semantic-release-bot
a2bc9f0722 chore(release): 2.37.0 [skip ci]
# [2.37.0](https://github.com/revanced/revanced-patches/compare/v2.36.2...v2.37.0) (2022-08-15)

### Features

* ˋpflotsh-ecmwf-subscription-unlockˋ patch ([#332](https://github.com/revanced/revanced-patches/issues/332)) ([ae2a1d8](f94bb06996))
2022-08-15 18:56:22 +00:00
Technikte
f94bb06996 feat: ˋpflotsh-ecmwf-subscription-unlockˋ patch (#332) 2022-08-15 20:54:22 +02:00
semantic-release-bot
1023936a26 chore(release): 2.36.2 [skip ci]
## [2.36.2](https://github.com/revanced/revanced-patches/compare/v2.36.1...v2.36.2) (2022-08-14)

### Bug Fixes

* disable cast modules in YouTube Music ([#337](https://github.com/revanced/revanced-patches/issues/337)) ([98e5dbc](98e5dbcc73))
2022-08-14 21:15:11 +00:00
Canny
98e5dbcc73 fix: disable cast modules in YouTube Music (#337) 2022-08-14 23:13:16 +02:00
semantic-release-bot
353806828b chore(release): 2.36.1 [skip ci]
## [2.36.1](https://github.com/revanced/revanced-patches/compare/v2.36.0...v2.36.1) (2022-08-14)

### Bug Fixes

* add missing switch for tablet mini-player ([1ad69e3](1ad69e350c))
2022-08-14 20:36:40 +00:00
oSumAtrIX
1ad69e350c fix: add missing switch for tablet mini-player 2022-08-14 22:34:44 +02:00
semantic-release-bot
42c562cff7 chore(release): 2.36.0 [skip ci]
# [2.36.0](https://github.com/revanced/revanced-patches/compare/v2.35.0...v2.36.0) (2022-08-14)

### Features

* `swipe-controls` override volume button behaviour ([#285](https://github.com/revanced/revanced-patches/issues/285)) ([155121f](155121f891))
2022-08-14 20:22:07 +00:00
Chris
155121f891 feat: swipe-controls override volume button behaviour (#285) 2022-08-14 22:19:54 +02:00
semantic-release-bot
c684a1c846 chore(release): 2.35.0 [skip ci]
# [2.35.0](https://github.com/revanced/revanced-patches/compare/v2.34.0...v2.35.0) (2022-08-14)

### Features

* `tiktok-ads` patch ([#335](https://github.com/revanced/revanced-patches/issues/335)) ([49ddc0a](49ddc0a2ed))
2022-08-14 20:18:06 +00:00
oSumAtrIX
49ddc0a2ed feat: tiktok-ads patch (#335) 2022-08-14 22:16:25 +02:00
semantic-release-bot
221b61acc7 chore(release): 2.34.0 [skip ci]
# [2.34.0](https://github.com/revanced/revanced-patches/compare/v2.33.2...v2.34.0) (2022-08-14)

### Features

* `tablet-mini-player` patch ([aab39cb](aab39cbe93))
2022-08-14 15:35:33 +00:00
oSumAtrIX
c133d495c3 build: bump patcher dependency version 2022-08-14 17:33:13 +02:00
oSumAtrIX
aab39cbe93 feat: tablet-mini-player patch 2022-08-14 17:32:32 +02:00
semantic-release-bot
bdab92faf2 chore(release): 2.33.2 [skip ci]
## [2.33.2](https://github.com/revanced/revanced-patches/compare/v2.33.1...v2.33.2) (2022-08-07)
2022-08-07 20:42:34 +00:00
oSumAtrIX
50acd3d3b5 refactor: remove unused parameter 2022-08-07 22:40:07 +02:00
oSumAtrIX
49a369a340 refactor: un-shadow variable name 2022-08-07 22:39:53 +02:00
oSumAtrIX
be8620bf91 build: bump patcher dependency version 2022-08-07 22:36:02 +02:00
semantic-release-bot
32ed4c9f04 chore(release): 2.33.1 [skip ci]
## [2.33.1](https://github.com/revanced/revanced-patches/compare/v2.33.0...v2.33.1) (2022-08-07)

### Bug Fixes

* spoof `X-Android-Cert` of Firebase `authToken` api request ([#315](https://github.com/revanced/revanced-patches/issues/315)) ([9c44497](9c44497d40))
2022-08-07 10:44:47 +00:00
Itroublve
9c44497d40 fix: spoof X-Android-Cert of Firebase authToken api request (#315) 2022-08-07 12:42:39 +02:00
semantic-release-bot
8e604139e3 chore(release): 2.33.0 [skip ci]
# [2.33.0](https://github.com/revanced/revanced-patches/compare/v2.32.1...v2.33.0) (2022-08-06)

### Features

* bump music patches to 5.17.51 ([#307](https://github.com/revanced/revanced-patches/issues/307)) ([3de3a82](3de3a82afb))
2022-08-06 23:04:00 +00:00
epicsampler
3de3a82afb feat: bump music patches to 5.17.51 (#307) 2022-08-07 01:02:08 +02:00
oSumAtrIX
d39fb7ca03 refactor: use approriate description 2022-08-05 03:48:03 +02:00
semantic-release-bot
2d995d3757 chore(release): 2.32.1 [skip ci]
## [2.32.1](https://github.com/revanced/revanced-patches/compare/v2.32.0...v2.32.1) (2022-08-04)

### Bug Fixes

* incorrect compatibilty attribute ([#296](https://github.com/revanced/revanced-patches/issues/296)) ([464c980](464c98093a))
2022-08-04 19:55:13 +00:00
Itroublve
464c98093a fix: incorrect compatibilty attribute (#296) 2022-08-04 21:53:29 +02:00
semantic-release-bot
6ac5ed441f chore(release): 2.32.0 [skip ci]
# [2.32.0](https://github.com/revanced/revanced-patches/compare/v2.31.0...v2.32.0) (2022-08-04)

### Features

* `promo-code-unlock` patch ([#292](https://github.com/revanced/revanced-patches/issues/292)) ([7925ca9](7925ca97c4))
2022-08-04 17:05:39 +00:00
Technikte
7925ca97c4 feat: promo-code-unlock patch (#292) 2022-08-04 19:03:56 +02:00
semantic-release-bot
0c5f117d5d chore(release): 2.31.0 [skip ci]
# [2.31.0](https://github.com/revanced/revanced-patches/compare/v2.30.1...v2.31.0) (2022-08-03)

### Features

* remove `force-vp9-codec` patch ([#287](https://github.com/revanced/revanced-patches/issues/287)) ([6ab475c](6ab475c284))
2022-08-03 18:30:49 +00:00
epicsampler
6ab475c284 feat: remove force-vp9-codec patch (#287) 2022-08-03 20:28:39 +02:00
semantic-release-bot
75ac69455b chore(release): 2.30.1 [skip ci]
## [2.30.1](https://github.com/revanced/revanced-patches/compare/v2.30.0...v2.30.1) (2022-08-03)

### Bug Fixes

* migrate to new patcher api ([e42043b](e42043b939))
2022-08-03 01:56:55 +00:00
oSumAtrIX
e42043b939 fix: migrate to new patcher api 2022-08-03 03:53:35 +02:00
semantic-release-bot
5237c3a1a6 chore(release): 2.30.0 [skip ci]
# [2.30.0](https://github.com/revanced/revanced-patches/compare/v2.29.0...v2.30.0) (2022-08-03)

### Bug Fixes

* incorrect fingerprint version [skip ci] ([a9abab9](a9abab97d7))
* rollback to `Dependencies` annotation ([f82aae9](f82aae930b))

### Features

* set the correct theme of the settings screen ([7d6f205](7d6f205fd9))
2022-08-03 01:11:48 +00:00
oSumAtrIX
7d6f205fd9 feat: set the correct theme of the settings screen 2022-08-03 03:09:52 +02:00
oSumAtrIX
f82aae930b fix: rollback to Dependencies annotation 2022-08-03 03:09:39 +02:00
oSumAtrIX
83b11c92af refactor: remove unused annotation [skip ci] 2022-08-03 02:23:27 +02:00
oSumAtrIX
a9abab97d7 fix: incorrect fingerprint version [skip ci] 2022-08-03 02:01:56 +02:00
semantic-release-bot
a70da4f6c4 chore(release): 2.29.0 [skip ci]
# [2.29.0](https://github.com/revanced/revanced-patches/compare/v2.28.2...v2.29.0) (2022-08-02)

### Features

* add "Application Icon Path" option to branding ([e53b490](e53b490edf))
* add "Application Name" option to branding and move renaming to CustomBrandingPatch.kt ([19cc4a3](19cc4a3e91))
2022-08-02 21:51:01 +00:00
Sculas
e53b490edf feat: add "Application Icon Path" option to branding 2022-08-02 23:48:51 +02:00
Sculas
bfe995f635 build: update patcher lib to 3.3.0 2022-08-02 23:40:13 +02:00
Sculas
19cc4a3e91 feat: add "Application Name" option to branding and move renaming to CustomBrandingPatch.kt 2022-08-02 21:28:22 +02:00
Sculas
16f6486258 build: update patcher lib to 3.0.0 2022-08-02 21:15:43 +02:00
Sculas
47360ea3b7 refactor: migrate CustomBrandingPatch.kt to DependsOn 2022-08-02 20:24:19 +02:00
Sculas
5c5b3d562d refactor: migrate MicroGResourcePatch.kt to DependsOn 2022-08-02 20:22:57 +02:00
Sculas
a62316a8c8 refactor: cleanup MicroGResourcePatch.kt 2022-08-02 20:21:14 +02:00
semantic-release-bot
14f7d514d2 chore(release): 2.28.2 [skip ci]
## [2.28.2](https://github.com/revanced/revanced-patches/compare/v2.28.1...v2.28.2) (2022-08-02)

### Bug Fixes

* remove requirement for solution [skip ci] ([#271](https://github.com/revanced/revanced-patches/issues/271)) ([9ae3d05](9ae3d0546c))
2022-08-02 01:16:42 +00:00
oSumAtrIX
78d901338f build: bump patcher dependency version 2022-08-02 03:14:28 +02:00
Robert
9ae3d0546c fix: remove requirement for solution [skip ci] (#271) 2022-08-01 13:07:47 +02:00
oSumAtrIX
3076a16d14 refactor: use ResourceUtils.copyXmlNode 2022-08-01 04:13:51 +02:00
semantic-release-bot
f8e1f2fe18 chore(release): 2.28.1 [skip ci]
## [2.28.1](https://github.com/revanced/revanced-patches/compare/v2.28.0...v2.28.1) (2022-07-31)

### Bug Fixes

* add missing permission to reboot app ([#260](https://github.com/revanced/revanced-patches/issues/260)) ([a9611f3](a9611f304e))
2022-07-31 18:43:15 +00:00
Joey Peter
a9611f304e fix: add missing permission to reboot app (#260) 2022-07-31 20:41:35 +02:00
semantic-release-bot
7c0e183df5 chore(release): 2.28.0 [skip ci]
# [2.28.0](https://github.com/revanced/revanced-patches/compare/v2.27.0...v2.28.0) (2022-07-31)

### Features

* add `custom-video-buffer` patch ([15e1ced](15e1ced2c9))
2022-07-31 10:36:58 +00:00
Joey Peter
15e1ced2c9 feat: add custom-video-buffer patch 2022-07-31 12:34:49 +02:00
semantic-release-bot
bde7f99b5b chore(release): 2.27.0 [skip ci]
# [2.27.0](https://github.com/revanced/revanced-patches/compare/v2.26.0...v2.27.0) (2022-07-31)

### Features

* `settings` patch ([60866af](60866af97d))
2022-07-31 10:17:43 +00:00
oSumAtrIX
60866af97d feat: settings patch 2022-07-31 12:15:26 +02:00
semantic-release-bot
6580f71392 chore(release): 2.26.0 [skip ci]
# [2.26.0](https://github.com/revanced/revanced-patches/compare/v2.25.3...v2.26.0) (2022-07-31)

### Features

* `ResourceUtils` helper class ([9c57961](9c57961680))
2022-07-31 00:28:57 +00:00
oSumAtrIX
9c57961680 feat: ResourceUtils helper class 2022-07-31 02:27:09 +02:00
semantic-release-bot
1d7a9ac437 chore(release): 2.25.3 [skip ci]
## [2.25.3](https://github.com/revanced/revanced-patches/compare/v2.25.2...v2.25.3) (2022-07-29)

### Bug Fixes

* actually call `VideoInformation.setCurrentVideoId` first ([51e08fb](51e08fb0b6))
2022-07-29 01:34:59 +00:00
oSumAtrIX
51e08fb0b6 fix: actually call VideoInformation.setCurrentVideoId first 2022-07-29 03:32:28 +02:00
oSumAtrIX
91feea1c50 refactor: do not account for order in VideoIdPatch.injectCall (#246) 2022-07-29 03:20:55 +02:00
semantic-release-bot
fc8bfff427 chore(release): 2.25.2 [skip ci]
## [2.25.2](https://github.com/revanced/revanced-patches/compare/v2.25.1...v2.25.2) (2022-07-26)

### Bug Fixes

* rename `default-video-quality` to `remember-video-quality` ([9a3307c](9a3307c1b1))
2022-07-26 19:50:00 +00:00
oSumAtrIX
9a3307c1b1 fix: rename default-video-quality to remember-video-quality
This change describes the patch more clearly
2022-07-26 21:47:40 +02:00
oSumAtrIX
eff806c5e3 docs: add missing . to feature-issue.yml description 2022-07-26 19:38:00 +02:00
oSumAtrIX
b45a44ff3f docs: add missing . to issue description 2022-07-26 19:34:54 +02:00
semantic-release-bot
391e8fa8f6 chore(release): 2.25.1 [skip ci]
## [2.25.1](https://github.com/revanced/revanced-patches/compare/v2.25.0...v2.25.1) (2022-07-26)

### Bug Fixes

* `default-video-quality` patch crashing ([#227](https://github.com/revanced/revanced-patches/issues/227)) ([dbf0668](dbf0668f28))
2022-07-26 17:34:49 +00:00
Canny1913
dbf0668f28 fix: default-video-quality patch crashing (#227) 2022-07-26 19:33:02 +02:00
oSumAtrIX
b228640e4f docs: GitHub issue forms 2022-07-26 19:28:33 +02:00
semantic-release-bot
0ddb2df640 chore(release): 2.25.0 [skip ci]
# [2.25.0](https://github.com/revanced/revanced-patches/compare/v2.24.0...v2.25.0) (2022-07-26)

### Features

* `general-reddit-ads` patch ([#235](https://github.com/revanced/revanced-patches/issues/235)) ([c9525d0](c9525d0c26))
2022-07-26 16:13:10 +00:00
Alberto Ponces
c9525d0c26 feat: general-reddit-ads patch (#235) 2022-07-26 18:10:54 +02:00
oSumAtrIX
3c5832eda2 docs: normalize description of music-microg-support patch 2022-07-26 17:46:01 +02:00
semantic-release-bot
eef7e87bbf chore(release): 2.24.0 [skip ci]
# [2.24.0](https://github.com/revanced/revanced-patches/compare/v2.23.0...v2.24.0) (2022-07-26)

### Features

* `music-microg-support` patch ([#208](https://github.com/revanced/revanced-patches/issues/208)) ([535f621](535f621f20))
2022-07-26 15:38:02 +00:00
Canny1913
535f621f20 feat: music-microg-support patch (#208)
* Add files via upload

* feat: complete `music-microg-support` patch

* fix: delete unused patch

* oh no

* dedupelicate some stuff and remove nativelib

* Update src/main/kotlin/app/revanced/patches/music/misc/microg/patch/bytecode/MusicMicroGBytecodePatch.kt

style: formatting

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>

* refactor: remove listOf

* fix: typo

* refactor: switch to using direct pattern

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>

* refactor: constants

* fix: bump patch version

* refactor: use full brand name

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-07-26 17:36:17 +02:00
semantic-release-bot
695a0d14ad chore(release): 2.23.0 [skip ci]
# [2.23.0](https://github.com/revanced/revanced-patches/compare/v2.22.2...v2.23.0) (2022-07-26)

### Features

* bump compatibility of YouTube Music patches to v5.16.51 ([#238](https://github.com/revanced/revanced-patches/issues/238)) ([f70e545](f70e54545b))
2022-07-26 15:14:20 +00:00
Lacia~chan
f70e54545b feat: bump compatibility of YouTube Music patches to v5.16.51 (#238) 2022-07-26 17:12:27 +02:00
bogadana
353f036a72 docs: fix readme skipping first patch (#237) 2022-07-26 16:38:14 +02:00
semantic-release-bot
4d305775a0 chore(release): 2.22.2 [skip ci]
## [2.22.2](https://github.com/revanced/revanced-patches/compare/v2.22.1...v2.22.2) (2022-07-26)

### Bug Fixes

* bump youtube version to 17.29.34 ([#236](https://github.com/revanced/revanced-patches/issues/236)) ([d726443](d726443ca0))
2022-07-26 14:08:22 +00:00
Canny1913
d726443ca0 fix: bump youtube version to 17.29.34 (#236) 2022-07-26 16:06:31 +02:00
bogadana
c5046edf8d docs: better structuring (#230) 2022-07-25 20:31:07 +02:00
semantic-release-bot
e15d6afed1 chore(release): 2.22.1 [skip ci]
## [2.22.1](https://github.com/revanced/revanced-patches/compare/v2.22.0...v2.22.1) (2022-07-24)

### Bug Fixes

* remove broken video-quality patch ([f505599](f5055997c7))
2022-07-24 21:47:50 +00:00
Joey Peter
f5055997c7 fix: remove broken video-quality patch 2022-07-24 23:45:53 +02:00
semantic-release-bot
e6f41988dc chore(release): 2.22.0 [skip ci]
# [2.22.0](https://github.com/revanced/revanced-patches/compare/v2.21.3...v2.22.0) (2022-07-24)

### Features

* `default-video-quality` patch ([#141](https://github.com/revanced/revanced-patches/issues/141)) ([c8567d3](c8567d35ef))
2022-07-24 20:30:04 +00:00
Canny1913
c8567d35ef feat: default-video-quality patch (#141) 2022-07-24 22:28:13 +02:00
semantic-release-bot
cea92cacfd chore(release): 2.21.3 [skip ci]
## [2.21.3](https://github.com/revanced/revanced-patches/compare/v2.21.2...v2.21.3) (2022-07-24)

### Bug Fixes

* rename autorepeat-by-default patch to always-autorepeat ([8f83fc1](8f83fc1edf))
2022-07-24 09:48:44 +00:00
Joey Peter
8f83fc1edf fix: rename autorepeat-by-default patch to always-autorepeat 2022-07-24 11:46:18 +02:00
semantic-release-bot
b9e33d0d08 chore(release): 2.21.2 [skip ci]
## [2.21.2](https://github.com/revanced/revanced-patches/compare/v2.21.1...v2.21.2) (2022-07-23)

### Bug Fixes

* bump youtube version to 17.28.34 ([#225](https://github.com/revanced/revanced-patches/issues/225)) ([7df8f6b](7df8f6b42a))
2022-07-23 19:29:51 +00:00
Alberto Ponces
7df8f6b42a fix: bump youtube version to 17.28.34 (#225) 2022-07-23 21:27:50 +02:00
semantic-release-bot
ac117f04df chore(release): 2.21.1 [skip ci]
## [2.21.1](https://github.com/revanced/revanced-patches/compare/v2.21.0...v2.21.1) (2022-07-23)

### Bug Fixes

* add v17.28.34 compatiblity for the `hide-shorts-button` patch ([#224](https://github.com/revanced/revanced-patches/issues/224)) ([d3bb96d](d3bb96d8b3))
2022-07-23 16:50:54 +00:00
Alberto Ponces
d3bb96d8b3 fix: add v17.28.34 compatiblity for the hide-shorts-button patch (#224) 2022-07-23 18:49:03 +02:00
semantic-release-bot
a31e4b4df3 chore(release): 2.21.0 [skip ci]
# [2.21.0](https://github.com/revanced/revanced-patches/compare/v2.20.5...v2.21.0) (2022-07-23)

### Features

* twitter `timeline-ads` patch ([#222](https://github.com/revanced/revanced-patches/issues/222)) ([90144fc](90144fc55a))
2022-07-23 01:36:15 +00:00
oSumAtrIX
90144fc55a feat: twitter timeline-ads patch (#222) 2022-07-23 03:33:36 +02:00
semantic-release-bot
12d1c36a3f chore(release): 2.20.5 [skip ci]
## [2.20.5](https://github.com/revanced/revanced-patches/compare/v2.20.4...v2.20.5) (2022-07-22)

### Bug Fixes

* exclude `swipe-controls` by default due to instability ([a7fce11](a7fce11015))
2022-07-22 20:13:13 +00:00
oSumAtrIX
a7fce11015 fix: exclude swipe-controls by default due to instability 2022-07-22 22:10:26 +02:00
semantic-release-bot
60029da7a3 chore(release): 2.20.4 [skip ci]
## [2.20.4](https://github.com/revanced/revanced-patches/compare/v2.20.3...v2.20.4) (2022-07-21)

### Bug Fixes

* crash when using force-vp9-codec patch ([964b598](964b598ad9))
* use dependency in correct patch ([16d5010](16d50100e7))
2022-07-21 15:16:19 +00:00
TheJeterLP
46a586b2af build: trigger release 2022-07-21 17:13:59 +02:00
semantic-release-bot
8a86034728 chore(release): 2.20.4 [skip ci]
## [2.20.4](https://github.com/revanced/revanced-patches/compare/v2.20.3...v2.20.4) (2022-07-21)

### Bug Fixes

* crash when using force-vp9-codec patch ([964b598](964b598ad9))
* use dependency in correct patch ([16d5010](16d50100e7))
2022-07-21 15:09:38 +00:00
TheJeterLP
ba1abf9319 build: trigger release 2022-07-21 17:07:25 +02:00
semantic-release-bot
82810cca6b chore(release): 2.20.4 [skip ci]
## [2.20.4](https://github.com/revanced/revanced-patches/compare/v2.20.3...v2.20.4) (2022-07-21)

### Bug Fixes

* crash when using force-vp9-codec patch ([964b598](964b598ad9))
* use dependency in correct patch ([16d5010](16d50100e7))
2022-07-21 15:06:16 +00:00
TheJeterLP
964b598ad9 fix: crash when using force-vp9-codec patch 2022-07-21 17:04:30 +02:00
semantic-release-bot
16fbfe555f chore(release): 2.20.4 [skip ci]
## [2.20.4](https://github.com/revanced/revanced-patches/compare/v2.20.3...v2.20.4) (2022-07-21)

### Bug Fixes

* use dependency in correct patch ([16d5010](16d50100e7))
2022-07-21 00:14:24 +00:00
oSumAtrIX
16d50100e7 fix: use dependency in correct patch 2022-07-21 01:35:04 +02:00
semantic-release-bot
2397d6140b chore(release): 2.20.3 [skip ci]
## [2.20.3](https://github.com/revanced/revanced-patches/compare/v2.20.2...v2.20.3) (2022-07-20)

### Bug Fixes

* disable-fullscreen-panels patch not working ([#213](https://github.com/revanced/revanced-patches/issues/213)) ([513276e](513276e950))
2022-07-20 22:20:59 +00:00
TheJeterLP
513276e950 fix: disable-fullscreen-panels patch not working (#213) 2022-07-21 00:19:04 +02:00
TheJeterLP
2aab1a0c66 refactor: cleanup code 2022-07-20 22:58:48 +02:00
semantic-release-bot
cfb5d0908b chore(release): 2.20.2 [skip ci]
## [2.20.2](https://github.com/revanced/revanced-patches/compare/v2.20.1...v2.20.2) (2022-07-20)

### Bug Fixes

* autoplay not working. ([eddf520](eddf520626))
2022-07-20 20:51:45 +00:00
TheJeterLP
5e3eefe5dd build: trigger release 2022-07-20 22:49:33 +02:00
TheJeterLP
6ccee3ef68 Merge branch 'main' of https://github.com/revanced/revanced-patches 2022-07-20 22:47:39 +02:00
TheJeterLP
eddf520626 fix: autoplay not working. 2022-07-20 22:47:27 +02:00
semantic-release-bot
3613fb5409 chore(release): 2.20.1 [skip ci]
## [2.20.1](https://github.com/revanced/revanced-patches/compare/v2.20.0...v2.20.1) (2022-07-20)

### Bug Fixes

* autoplay still enabled when using patch ([97366cd](97366cdd4c))
2022-07-20 20:33:51 +00:00
TheJeterLP
97366cdd4c fix: autoplay still enabled when using patch 2022-07-20 22:31:58 +02:00
oSumAtrIX
ee55cf970e refactor: remove unused strings 2022-07-20 11:49:46 +02:00
semantic-release-bot
ad1ed56a71 chore(release): 2.20.0 [skip ci]
# [2.20.0](https://github.com/revanced/revanced-patches/compare/v2.19.0...v2.20.0) (2022-07-18)

### Features

* `minimize-playback-music` patch ([#200](https://github.com/revanced/revanced-patches/issues/200)) ([13ccea2](13ccea2e7c))
2022-07-18 23:43:01 +00:00
Alberto Ponces
13ccea2e7c feat: minimize-playback-music patch (#200)
* feat: `minimize-playback` - unblocks minimized playback on kids music

* refactor: add missing `;`

* fix: rename to `minimized-playback-music`

Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-07-19 01:40:56 +02:00
semantic-release-bot
02d4ba64d6 chore(release): 2.19.0 [skip ci]
# [2.19.0](https://github.com/revanced/revanced-patches/compare/v2.18.3...v2.19.0) (2022-07-18)

### Features

* `compact-header` patch ([891ac04](891ac04155))
2022-07-18 23:37:20 +00:00
Alberto Ponces
891ac04155 feat: compact-header patch 2022-07-19 01:35:34 +02:00
semantic-release-bot
c70c3de205 chore(release): 2.18.3 [skip ci]
## [2.18.3](https://github.com/revanced/revanced-patches/compare/v2.18.2...v2.18.3) (2022-07-18)

### Bug Fixes

* compatibility of `force-vp9-codec-parent-fingerprint` fingerprint with version `17.27.39` ([92dc97e](92dc97e2bf))
2022-07-18 23:18:30 +00:00
oSumAtrIX
92dc97e2bf fix: compatibility of force-vp9-codec-parent-fingerprint fingerprint with version 17.27.39 2022-07-19 01:16:45 +02:00
oSumAtrIX
cdf4313880 style: uppercase first letter in descriptions 2022-07-19 01:16:45 +02:00
semantic-release-bot
0e0763221c chore(release): 2.18.2 [skip ci]
## [2.18.2](https://github.com/revanced/revanced-patches/compare/v2.18.1...v2.18.2) (2022-07-18)

### Bug Fixes

* make all patches toggleable with settings ([#202](https://github.com/revanced/revanced-patches/issues/202)) ([6b515dd](6b515dd59e))
2022-07-18 21:01:38 +00:00
TheJeterLP
6b515dd59e fix: make all patches toggleable with settings (#202) 2022-07-18 22:59:21 +02:00
semantic-release-bot
4ee40a954f chore(release): 2.18.1 [skip ci]
## [2.18.1](https://github.com/revanced/revanced-patches/compare/v2.18.0...v2.18.1) (2022-07-18)

### Bug Fixes

* `minimized-playback` patch for YouTube Kids videos ([#201](https://github.com/revanced/revanced-patches/issues/201)) ([fb96c6e](fb96c6e4bc))
2022-07-18 14:31:50 +00:00
Alberto Ponces
fb96c6e4bc fix: minimized-playback patch for YouTube Kids videos (#201) 2022-07-18 16:29:51 +02:00
semantic-release-bot
c5156fa7e3 chore(release): 2.18.0 [skip ci]
# [2.18.0](https://github.com/revanced/revanced-patches/compare/v2.17.0...v2.18.0) (2022-07-18)

### Features

* `hide-get-premium` patch ([#195](https://github.com/revanced/revanced-patches/issues/195)) ([8b0622f](8b0622f0bf))
2022-07-18 14:25:54 +00:00
Alberto Ponces
8b0622f0bf feat: hide-get-premium patch (#195)
* feat: `hide-get-premium` patch

* fix: improve `hide-get-premium` fingerprints
2022-07-18 16:24:10 +02:00
semantic-release-bot
1e3eddd3f2 chore(release): 2.17.0 [skip ci]
# [2.17.0](https://github.com/revanced/revanced-patches/compare/v2.16.1...v2.17.0) (2022-07-17)

### Bug Fixes

* check if node has attributes before accessing them ([1d12a17](1d12a17999))

### Features

* `sponsorblock` patch ([#101](https://github.com/revanced/revanced-patches/issues/101)) ([db410e1](db410e1be6)), closes [#89](https://github.com/revanced/revanced-patches/issues/89) [#90](https://github.com/revanced/revanced-patches/issues/90)
2022-07-17 23:52:36 +00:00
oSumAtrIX
1d12a17999 fix: check if node has attributes before accessing them 2022-07-18 01:50:46 +02:00
oSumAtrIX
db410e1be6 feat: sponsorblock patch (#101)
* chore(release): 2.5.1-dev.1 [skip ci]

## [2.5.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.5.0...v2.5.1-dev.1) (2022-06-30)

### Bug Fixes

* freezing panels when watching video in fullscreen ([#89](https://github.com/revanced/revanced-patches/issues/89)) ([d3e1419](d3e1419d0e))
* invalid version in compatibility annotation ([#90](https://github.com/revanced/revanced-patches/issues/90)) ([c21e177](c21e177ed1))

* feat: migrate to breaking changes of patcher

* chore(release): 2.6.0-dev.1 [skip ci]

# [2.6.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.5.1-dev.1...v2.6.0-dev.1) (2022-07-02)

### Features

* migrate to breaking changes of patcher ([c95c241](c95c241887))

* refactor: add package for fingerprints

* feat: partial `sponsorblock` patch

* feat: add `Name` annotation to `sponsorblock-resource-patch`

* fix: `sponsorblock-resource-patch`

* refactor: remove unused resources

* refactor: remove `locale-config-fix` dependency

* fix: broken fingerprints

* feat: general fixes on `sponsorblock` patch

* feat: more fixes on `sponsorblock` patch

* feat: update `sponsorblock` patch to 17.26.35

* style: use better wording and fix spelling mistakes

* fix: finish `sponsorblock` patch

Co-authored-by: semantic-release-bot <semantic-release-bot@martynus.net>
2022-07-18 01:17:03 +02:00
semantic-release-bot
9969d03116 chore(release): 2.16.1 [skip ci]
## [2.16.1](https://github.com/revanced/revanced-patches/compare/v2.16.0...v2.16.1) (2022-07-17)

### Bug Fixes

* bump youtube version to 17.27.39 ([9d1fecc](9d1fecc2f5))
2022-07-17 15:04:31 +00:00
TheJeterLP
9d1fecc2f5 fix: bump youtube version to 17.27.39 2022-07-17 17:02:43 +02:00
semantic-release-bot
63df96d251 chore(release): 2.16.0 [skip ci]
# [2.16.0](https://github.com/revanced/revanced-patches/compare/v2.15.1...v2.16.0) (2022-07-17)

### Features

* `force-vp9-codec` patch ([#157](https://github.com/revanced/revanced-patches/issues/157)) ([d1266a2](d1266a252d))
2022-07-17 14:34:06 +00:00
TheJeterLP
d1266a252d feat: force-vp9-codec patch (#157) 2022-07-17 16:32:29 +02:00
semantic-release-bot
6ec6d16dbc chore(release): 2.15.1 [skip ci]
## [2.15.1](https://github.com/revanced/revanced-patches/compare/v2.15.0...v2.15.1) (2022-07-17)

### Bug Fixes

* `old-quality-layout` patch ([f940e46](f940e4647e))
* references to integrations in `return-youtube-dislike` patch ([9860658](986065858d))
2022-07-17 14:05:02 +00:00
oSumAtrIX
f940e4647e fix: old-quality-layout patch 2022-07-17 16:03:20 +02:00
oSumAtrIX
cc39b77b49 refactor: use .single for resourceMappings 2022-07-17 16:03:20 +02:00
oSumAtrIX
986065858d fix: references to integrations in return-youtube-dislike patch 2022-07-17 16:03:19 +02:00
TheJeterLP
56475e8f38 refactor: rename HDRAutoBrightnessPatch 2022-07-17 15:07:21 +02:00
Palm
2e0ff07d1a style: better patch descriptions (#193) 2022-07-17 12:36:46 +02:00
oSumAtrIX
a654e25000 refactor: simplify use of dependencies field in Dependencies annotations 2022-07-16 17:32:03 +02:00
oSumAtrIX
a8736a8f70 style: naming for ReturnYouTubeDislike patch 2022-07-16 17:31:40 +02:00
semantic-release-bot
b0d6cee4db chore(release): 2.15.0 [skip ci]
# [2.15.0](https://github.com/revanced/revanced-patches/compare/v2.14.1...v2.15.0) (2022-07-16)

### Features

* `return-youtube-dislikes` patch ([#175](https://github.com/revanced/revanced-patches/issues/175)) ([6bbcdf8](6bbcdf8ebd))
2022-07-16 14:52:58 +00:00
j4k0xb
6bbcdf8ebd feat: return-youtube-dislikes patch (#175)
* feat: ryd

* refactor: use ryd patches class

* feat: add video id dependency patch

* fix: compatibility with 17.26.35

* refactor: named param variable, simpler mutableClass access
2022-07-16 16:50:37 +02:00
semantic-release-bot
6fa8289ca6 chore(release): 2.14.1 [skip ci]
## [2.14.1](https://github.com/revanced/revanced-patches/compare/v2.14.0...v2.14.1) (2022-07-15)

### Bug Fixes

* `codecs-unlock` patch and update Music patches to `5.14.53` ([97dbb43](97dbb43caa))
2022-07-15 12:57:47 +00:00
Alberto Ponces
97dbb43caa fix: codecs-unlock patch and update Music patches to 5.14.53 2022-07-15 14:56:10 +02:00
semantic-release-bot
8cda5663ef chore(release): 2.14.0 [skip ci]
# [2.14.0](https://github.com/revanced/revanced-patches/compare/v2.13.6...v2.14.0) (2022-07-15)

### Features

* `music-video-ads` patch ([#172](https://github.com/revanced/revanced-patches/issues/172)) ([5587c91](5587c91899))
2022-07-15 11:20:04 +00:00
Alberto Ponces
5587c91899 feat: music-video-ads patch (#172) 2022-07-15 13:18:25 +02:00
semantic-release-bot
4e6d82a334 chore(release): 2.13.6 [skip ci]
## [2.13.6](https://github.com/revanced/revanced-patches/compare/v2.13.5...v2.13.6) (2022-07-14)
2022-07-14 16:48:23 +00:00
TheJeterLP
be7302689e build: trigger build 2022-07-14 18:46:33 +02:00
TheJeterLP
14d94d6a44 refactor: prepare for settings patch (#168) 2022-07-14 18:42:22 +02:00
genericness
8d598f5b82 style: casing in description (#174) 2022-07-14 18:40:21 +02:00
semantic-release-bot
918782908b chore(release): 2.13.5 [skip ci]
## [2.13.5](https://github.com/revanced/revanced-patches/compare/v2.13.4...v2.13.5) (2022-07-14)

### Bug Fixes

* `swipe-controls` with active engagement panel ([#177](https://github.com/revanced/revanced-patches/issues/177)) ([524fe19](524fe19840))
2022-07-14 15:23:07 +00:00
Chris
524fe19840 fix: swipe-controls with active engagement panel (#177) 2022-07-14 17:21:26 +02:00
semantic-release-bot
18aafb400b chore(release): 2.13.4 [skip ci]
## [2.13.4](https://github.com/revanced/revanced-patches/compare/v2.13.3...v2.13.4) (2022-07-13)

### Bug Fixes

* constrain `old-quality-layout` to older version ([83ac6b3](83ac6b3e34))
2022-07-13 11:38:21 +00:00
oSumAtrIX
83ac6b3e34 fix: constrain old-quality-layout to older version 2022-07-13 13:36:09 +02:00
oSumAtrIX
890ebf04df docs: change size of headings [skip ci] 2022-07-12 01:13:09 +02:00
oSumAtrIX
6838daf1c3 refactor: rename class and move to sub-package 2022-07-12 00:04:22 +02:00
bogadana
08f4e8532c docs: properly handle semantic versions (#156) [skip ci] 2022-07-11 21:08:47 +02:00
semantic-release-bot
30d25a87da chore(release): 2.13.3 [skip ci]
## [2.13.3](https://github.com/revanced/revanced-patches/compare/v2.13.2...v2.13.3) (2022-07-11)

### Bug Fixes

* `exclusive-audio-playback` patch ([#153](https://github.com/revanced/revanced-patches/issues/153)) ([af0523d](af0523df39))
2022-07-11 18:07:27 +00:00
Alberto Ponces
af0523df39 fix: exclusive-audio-playback patch (#153) 2022-07-11 20:05:03 +02:00
semantic-release-bot
18a3f8e80c chore(release): 2.13.2 [skip ci]
## [2.13.2](https://github.com/revanced/revanced-patches/compare/v2.13.1...v2.13.2) (2022-07-11)

### Bug Fixes

* `hrd-auto-brightness` ([#152](https://github.com/revanced/revanced-patches/issues/152)) ([ce32c6f](ce32c6f3f7))
2022-07-11 17:01:08 +00:00
Chris
ce32c6f3f7 fix: hrd-auto-brightness (#152) 2022-07-11 18:59:26 +02:00
semantic-release-bot
6b706bc93c chore(release): 2.13.1 [skip ci]
## [2.13.1](https://github.com/revanced/revanced-patches/compare/v2.13.0...v2.13.1) (2022-07-11)

### Bug Fixes

* bump youtube version for swipe-controls patch ([6838e25](6838e25764))
2022-07-11 12:41:09 +00:00
TheJeterLP
6838e25764 fix: bump youtube version for swipe-controls patch 2022-07-11 14:39:36 +02:00
semantic-release-bot
f6f8b0ee31 chore(release): 2.13.0 [skip ci]
# [2.13.0](https://github.com/revanced/revanced-patches/compare/v2.12.4...v2.13.0) (2022-07-11)

### Features

* `swipe-controls` rewrite ([#131](https://github.com/revanced/revanced-patches/issues/131)) ([8e26d09](8e26d0933d))
2022-07-11 12:31:53 +00:00
Chris
8e26d0933d feat: swipe-controls rewrite (#131)
* move patch 'fenster' to 'swipe-controls'

* remove 'injectIntoNamedMethod' function

* move updatePlayerType hook into its own patch

* refactor 'swipe-controls' patch

* add resources for new ui to patch

Co-authored-by: TheJeterLP <joey.peter1998@gmail.com>
2022-07-11 14:29:46 +02:00
semantic-release-bot
6f29325a85 chore(release): 2.12.4 [skip ci]
## [2.12.4](https://github.com/revanced/revanced-patches/compare/v2.12.3...v2.12.4) (2022-07-11)

### Bug Fixes

*  `autorepeat-by-default` patch ([#148](https://github.com/revanced/revanced-patches/issues/148)) ([46e163c](46e163caa9))
2022-07-11 06:58:15 +00:00
TheJeterLP
46e163caa9 fix: autorepeat-by-default patch (#148) 2022-07-11 08:56:33 +02:00
semantic-release-bot
af19363997 chore(release): 2.12.3 [skip ci]
## [2.12.3](https://github.com/revanced/revanced-patches/compare/v2.12.2...v2.12.3) (2022-07-11)

### Bug Fixes

* listing of wrong fingerprint class ([#147](https://github.com/revanced/revanced-patches/issues/147)) ([c578e21](c578e210bb))
2022-07-11 05:51:29 +00:00
Alberto Ponces
c578e210bb fix: listing of wrong fingerprint class (#147) 2022-07-11 07:49:40 +02:00
Sculas
980f7f04cc chore: remove assignees [skip ci] 2022-07-10 20:30:47 +02:00
Sculas
baeb0ad0d4 chore: remove assignees [skip ci] 2022-07-10 20:30:35 +02:00
semantic-release-bot
6c4a69fcfb chore(release): 2.12.2 [skip ci]
## [2.12.2](https://github.com/revanced/revanced-patches/compare/v2.12.1...v2.12.2) (2022-07-10)

### Bug Fixes

* display codename for patch names ([7107ee8](7107ee87d9))
* incorrect package name in gradle task ([8ce3a6b](8ce3a6b4e3))
* invalid regex ([b39d60f](b39d60f46c))
2022-07-10 18:00:21 +00:00
oSumAtrIX
4129fcf8a8 refactor: add missing space in generated string 2022-07-10 19:58:32 +02:00
oSumAtrIX
b39d60f46c fix: invalid regex 2022-07-10 19:58:32 +02:00
oSumAtrIX
8ce3a6b4e3 fix: incorrect package name in gradle task 2022-07-10 19:58:32 +02:00
oSumAtrIX
7107ee87d9 fix: display codename for patch names 2022-07-10 19:58:32 +02:00
semantic-release-bot
7ea5d87fa2 chore(release): 2.12.1 [skip ci]
## [2.12.1](https://github.com/revanced/revanced-patches/compare/v2.12.0...v2.12.1) (2022-07-10)
2022-07-10 16:14:45 +00:00
TheJeterLP
471a3d3263 build: fix readme autogeneration not working 2022-07-10 18:12:52 +02:00
bogadana
b95fe30c78 docs: templated readme (#138) 2022-07-10 15:28:18 +02:00
semantic-release-bot
cb0cf342c0 chore(release): 2.12.0 [skip ci]
# [2.12.0](https://github.com/revanced/revanced-patches/compare/v2.11.0...v2.12.0) (2022-07-10)

### Bug Fixes

* update patches to `17.26.35` ([#142](https://github.com/revanced/revanced-patches/issues/142)) ([11db0f4](11db0f49c9))
* wording [skip ci] ([017ef1f](017ef1fb88))

### Features

* issue templates ([0991fbc](0991fbc9e8))
2022-07-10 05:38:19 +00:00
bogadana
11db0f49c9 fix: update patches to 17.26.35 (#142) 2022-07-10 07:36:43 +02:00
oSumAtrIX
017ef1fb88 fix: wording [skip ci] 2022-07-10 00:31:01 +02:00
oSumAtrIX
0991fbc9e8 feat: issue templates 2022-07-10 00:27:29 +02:00
semantic-release-bot
e1eedc02ab chore(release): 2.11.0 [skip ci]
# [2.11.0](https://github.com/revanced/revanced-patches/compare/v2.10.2...v2.11.0) (2022-07-09)

### Features

* `autorepeat-by-default` patch ([#106](https://github.com/revanced/revanced-patches/issues/106)) ([9be32e1](9be32e10f6))
2022-07-09 13:55:53 +00:00
oSumAtrIX
9be32e10f6 feat: autorepeat-by-default patch (#106) 2022-07-09 15:53:33 +02:00
semantic-release-bot
87996f67a8 chore(release): 2.10.2 [skip ci]
## [2.10.2](https://github.com/revanced/revanced-patches/compare/v2.10.1...v2.10.2) (2022-07-08)

### Bug Fixes

* trigger release on `build` commits ([0822383](0822383271))
2022-07-08 22:19:09 +00:00
Sculas
0822383271 fix: trigger release on build commits 2022-07-09 00:17:31 +02:00
TheJeterLP
0934af1ccd refactor: remove unused imports and merge packages together (#136) 2022-07-08 21:17:50 +02:00
bogadana
b3ad6fb8af docs: auto generate list of patches in README.md (#133)
* feat: auto generate list of patches in `README.md`

* sample readme

* formatting

* add codeblocks

* sample readme

* run on publish

* make workflow commit readme

* update readme [skip ci]

* update gen [skip ci]

* update workflow [skip ci]

* add readme to release assets

* fix: spacing in title

Co-authored-by: Sculas <contact@sculas.xyz>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-07-08 21:17:39 +02:00
semantic-release-bot
87f5ebce9b chore(release): 2.10.1 [skip ci]
## [2.10.1](https://github.com/revanced/revanced-patches/compare/v2.10.0...v2.10.1) (2022-07-08)

### Bug Fixes

* patch description consistency ([#134](https://github.com/revanced/revanced-patches/issues/134)) ([a35d7c8](a35d7c8951))
2022-07-08 04:32:37 +00:00
bogadana
a35d7c8951 fix: patch description consistency (#134) 2022-07-08 06:30:59 +02:00
semantic-release-bot
3c8d3edff4 chore(release): 2.10.0 [skip ci]
# [2.10.0](https://github.com/revanced/revanced-patches/compare/v2.9.4...v2.10.0) (2022-07-07)

### Features

* implement `wide-searchbar` Patch ([#130](https://github.com/revanced/revanced-patches/issues/130)) ([c35734b](c35734bec2))
2022-07-07 23:42:01 +00:00
TheJeterLP
c35734bec2 feat: implement wide-searchbar Patch (#130) 2022-07-08 01:40:12 +02:00
semantic-release-bot
e2b634053b chore(release): 2.9.4 [skip ci]
## [2.9.4](https://github.com/revanced/revanced-patches/compare/v2.9.3...v2.9.4) (2022-07-06)

### Bug Fixes

* add 17.25.34 as supported version for swipe-controls patch ([3e6df0c](3e6df0c96d))
2022-07-06 18:34:04 +00:00
TheJeterLP
3e6df0c96d fix: add 17.25.34 as supported version for swipe-controls patch 2022-07-06 20:31:59 +02:00
semantic-release-bot
7a2ea95e55 chore(release): 2.9.3 [skip ci]
## [2.9.3](https://github.com/revanced/revanced-patches/compare/v2.9.2...v2.9.3) (2022-07-06)

### Bug Fixes

* Readd `swipe-controls` patch ([#123](https://github.com/revanced/revanced-patches/issues/123)) ([add3058](add3058d24))
2022-07-06 18:29:29 +00:00
TheJeterLP
add3058d24 fix: Readd swipe-controls patch (#123) 2022-07-06 20:27:28 +02:00
semantic-release-bot
ef888f6b59 chore(release): 2.9.2 [skip ci]
## [2.9.2](https://github.com/revanced/revanced-patches/compare/v2.9.1...v2.9.2) (2022-07-05)

### Bug Fixes

* revert `swipe-controls` patch  ([9b077d6](9b077d6ada))
2022-07-05 21:26:17 +00:00
oSumAtrIX
9b077d6ada fix: revert swipe-controls patch
This reverts commit cd66ee4e57.
2022-07-05 23:24:10 +02:00
semantic-release-bot
93d4cee16e chore(release): 2.9.1 [skip ci]
## [2.9.1](https://github.com/revanced/revanced-patches/compare/v2.9.0...v2.9.1) (2022-07-05)

### Bug Fixes

* make `minimized-playback-manager-fingerprint` unique ([#120](https://github.com/revanced/revanced-patches/issues/120)) ([bc3b654](bc3b654357))
2022-07-05 20:24:42 +00:00
bogadana
bc3b654357 fix: make minimized-playback-manager-fingerprint unique (#120) 2022-07-05 22:23:00 +02:00
semantic-release-bot
64b4c92ca0 chore(release): 2.9.0 [skip ci]
# [2.9.0](https://github.com/revanced/revanced-patches/compare/v2.8.2...v2.9.0) (2022-07-05)

### Features

* `swipe-controls` patch ([#115](https://github.com/revanced/revanced-patches/issues/115)) ([cd66ee4](cd66ee4e57))
2022-07-05 20:04:45 +00:00
Chris
cd66ee4e57 feat: swipe-controls patch (#115) 2022-07-05 22:03:07 +02:00
semantic-release-bot
f527226757 chore(release): 2.8.2 [skip ci]
## [2.8.2](https://github.com/revanced/revanced-patches/compare/v2.8.1...v2.8.2) (2022-07-05)

### Bug Fixes

* show minimized playback options in settings ([#118](https://github.com/revanced/revanced-patches/issues/118)) ([ec0b17a](ec0b17a4d8))
2022-07-05 17:47:26 +00:00
bogadana
ec0b17a4d8 fix: show minimized playback options in settings (#118) 2022-07-05 19:45:46 +02:00
bogadana
63598d0d42 build: bump patcher dependency version (#119) 2022-07-05 18:44:58 +02:00
semantic-release-bot
14f6b66135 chore(release): 2.8.1 [skip ci]
## [2.8.1](https://github.com/revanced/revanced-patches/compare/v2.8.0...v2.8.1) (2022-07-05)

### Bug Fixes

* remove unnecessary version constraints ([#117](https://github.com/revanced/revanced-patches/issues/117)) ([18893c0](18893c005e))
2022-07-05 13:04:01 +00:00
bogadana
18893c005e fix: remove unnecessary version constraints (#117) 2022-07-05 15:02:00 +02:00
semantic-release-bot
73b51a0687 chore(release): 2.8.0 [skip ci]
# [2.8.0](https://github.com/revanced/revanced-patches/compare/v2.7.0...v2.8.0) (2022-07-04)

### Features

* `enable-debugging` patch ([#116](https://github.com/revanced/revanced-patches/issues/116)) ([c4de003](c4de003fc1))
2022-07-04 16:12:27 +00:00
Chris
c4de003fc1 feat: enable-debugging patch (#116) 2022-07-04 18:10:49 +02:00
semantic-release-bot
45b8ad099e chore(release): 2.7.0 [skip ci]
# [2.7.0](https://github.com/revanced/revanced-patches/compare/v2.6.0...v2.7.0) (2022-07-03)

### Features

* `hdr-max-brightness` patch ([#105](https://github.com/revanced/revanced-patches/issues/105)) ([8c40ff4](8c40ff4852))
* `hide-infocard-suggestions` patch ([#107](https://github.com/revanced/revanced-patches/issues/107)) ([f304c86](f304c866f1))
2022-07-03 18:52:05 +00:00
oSumAtrIX
8c40ff4852 feat: hdr-max-brightness patch (#105) 2022-07-03 20:50:20 +02:00
oSumAtrIX
f304c866f1 feat: hide-infocard-suggestions patch (#107) 2022-07-03 20:50:09 +02:00
Robert
9adf42c308 Update description (#110) 2022-07-03 19:19:50 +02:00
semantic-release-bot
2391db0f53 chore(release): 2.6.0 [skip ci]
# [2.6.0](https://github.com/revanced/revanced-patches/compare/v2.5.0...v2.6.0) (2022-07-02)

### Bug Fixes

* freezing panels when watching video in fullscreen ([#89](https://github.com/revanced/revanced-patches/issues/89)) ([d3e1419](d3e1419d0e))
* invalid version in compatibility annotation ([#90](https://github.com/revanced/revanced-patches/issues/90)) ([c21e177](c21e177ed1))
* remove refreshing home screen not working ([c5ec801](c5ec801b90))

### Features

* migrate to breaking changes of patcher ([9395e08](9395e0835e))
2022-07-02 23:03:09 +00:00
oSumAtrIX
9809e4dfd0 build: bump patcher dependency version 2022-07-03 01:01:20 +02:00
semantic-release-bot
b191efea2d chore(release): 2.6.0-dev.2 [skip ci]
# [2.6.0-dev.2](https://github.com/revanced/revanced-patches/compare/v2.6.0-dev.1...v2.6.0-dev.2) (2022-07-02)

### Bug Fixes

* remove refreshing home screen not working ([42def27](42def27fa5))
2022-07-03 01:01:20 +02:00
oSumAtrIX
c5ec801b90 fix: remove refreshing home screen not working 2022-07-03 01:01:20 +02:00
oSumAtrIX
95f22bc2a1 refactor: add package for fingerprints 2022-07-03 01:01:20 +02:00
semantic-release-bot
0098f25bfb chore(release): 2.6.0-dev.1 [skip ci]
# [2.6.0-dev.1](https://github.com/revanced/revanced-patches/compare/v2.5.1-dev.1...v2.6.0-dev.1) (2022-07-02)

### Features

* migrate to breaking changes of patcher ([c95c241](c95c241887))
2022-07-03 01:01:20 +02:00
oSumAtrIX
9395e0835e feat: migrate to breaking changes of patcher 2022-07-03 01:01:20 +02:00
semantic-release-bot
d59d6b7022 chore(release): 2.5.1-dev.1 [skip ci]
## [2.5.1-dev.1](https://github.com/revanced/revanced-patches/compare/v2.5.0...v2.5.1-dev.1) (2022-06-30)

### Bug Fixes

* freezing panels when watching video in fullscreen ([#89](https://github.com/revanced/revanced-patches/issues/89)) ([d3e1419](d3e1419d0e))
* invalid version in compatibility annotation ([#90](https://github.com/revanced/revanced-patches/issues/90)) ([c21e177](c21e177ed1))
2022-07-03 01:01:20 +02:00
334 changed files with 11282 additions and 1334 deletions

73
.github/ISSUE_TEMPLATE/bug-issue.yml vendored Normal file
View File

@@ -0,0 +1,73 @@
name: 🐞 Bug report
description: Report a very clearly broken issue.
title: 'bug: <title>'
labels: [bug]
body:
- type: markdown
attributes:
value: |
# ReVanced bug report
Important to note that your issue may have already been reported before. Please check for existing issues [here](https://github.com/revanced/revanced-patches/labels/bug).
- type: dropdown
attributes:
label: Type
options:
- Error while patching
- Error at runtime
- Cosmetic
- Other
validations:
required: true
- type: textarea
attributes:
label: Bug description
description: How did you find the bug? Any additional details that might help?
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: Add the steps to reproduce this bug including your environment.
placeholder: Step 1. Download some files. Step 2. ...
validations:
required: true
- type: textarea
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
validations:
required: true
- type: textarea
attributes:
label: Screenshots or videos
description: Add screenshots or videos that show the bug here.
placeholder: Drag and drop the screenshots/videos into this box.
validations:
required: false
- type: textarea
attributes:
label: Solution
description: If applicable, add a possible solution.
validations:
required: false
- type: textarea
attributes:
label: Additional context
description: Add additional context here.
validations:
required: false
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- label: I have searched the existing issues and this is a new and no duplicate or related to another open issue.
required: true
- label: I have written a short but informative title.
required: true
- label: I filled out all of the requested information in this issue properly.
required: true

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 📃 Documentation
url: https://github.com/revanced/revanced-documentation/
about: Don't know how or where to start? Check out our documentation!
- name: 🗨 Discussions
url: https://github.com/revanced/revanced-suggestions/discussions
about: Got something you think should change or be added? Search for or start a new discussion!

View File

@@ -0,0 +1,41 @@
name: ⭐ Patch Request
description: Create a detailed patch request.
title: 'feat(patch): '
labels: [patch-request]
body:
- type: textarea
attributes:
label: Application
description: Which application is this patch for?
validations:
required: true
- type: textarea
attributes:
label: Issue
description: What is the issue this patch should solve?
validations:
required: true
- type: textarea
attributes:
label: Patch
description: "Describe the patch you'd like to see in detail."
validations:
required: true
- type: textarea
attributes:
label: Motivation
description: Why should your patch request should be considered? What makes it valuable to the community?
validations:
required: true
- type: checkboxes
id: acknowledgements
attributes:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- label: I have searched the existing issues and this is a new and no duplicate or related to another open issue.
required: true
- label: I have written a short but informative title.
required: true
- label: I filled out all of the requested information in this issue properly.
required: true

View File

@@ -24,16 +24,12 @@ jobs:
java-version: '17' java-version: '17'
distribution: 'adopt' distribution: 'adopt'
cache: gradle cache: gradle
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: "lts/*"
- name: Setup Android SDK - name: Setup Android SDK
uses: android-actions/setup-android@v2 uses: android-actions/setup-android@v2
- name: Build with Gradle - name: Build with Gradle
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew build clean run: ./gradlew build clean generateMeta
- name: Install Android build-tools - name: Install Android build-tools
run: sdkmanager "build-tools;32.0.0" run: sdkmanager "build-tools;32.0.0"
- name: Setup semantic-release - name: Setup semantic-release

5
.gitignore vendored
View File

@@ -114,4 +114,7 @@ gradle-app.setting
# gradle/wrapper/gradle-wrapper.properties # gradle/wrapper/gradle-wrapper.properties
# Potentially copyrighted test APK # Potentially copyrighted test APK
*.apk *.apk
# Ignore vscode config
.vscode/

1
.idea/.gitignore generated vendored
View File

@@ -6,3 +6,4 @@
/dataSources.local.xml /dataSources.local.xml
# Editor-based HTTP Client requests # Editor-based HTTP Client requests
/httpRequests/ /httpRequests/
/kotlinc.xml

View File

@@ -7,7 +7,11 @@
} }
], ],
"plugins": [ "plugins": [
"@semantic-release/commit-analyzer", ["@semantic-release/commit-analyzer", {
"releaseRules": [
{"type": "build", "release": "patch"}
]
}],
"@semantic-release/release-notes-generator", "@semantic-release/release-notes-generator",
"@semantic-release/changelog", "@semantic-release/changelog",
"gradle-semantic-release-plugin", "gradle-semantic-release-plugin",
@@ -15,8 +19,10 @@
"@semantic-release/git", "@semantic-release/git",
{ {
"assets": [ "assets": [
"README.md",
"CHANGELOG.md", "CHANGELOG.md",
"gradle.properties" "gradle.properties",
"patches.json"
] ]
} }
], ],
@@ -28,7 +34,7 @@
"path": "build/libs/*.jar" "path": "build/libs/*.jar"
}, },
{ {
"path": "build/libs/*.dex" "path": "patches.json"
} }
] ]
} }

File diff suppressed because it is too large Load Diff

124
README-template.md Normal file
View File

@@ -0,0 +1,124 @@
## 🧩 Patches
The official Patch bundle provided by ReVanced and the community.
> Looking for the JSON variant of this? [Click here](patches.json).
{{ table }}
## 📝 JSON Format
This section explains the JSON format for the [patches.json](patches.json) file.
The file contains an array of objects, each object representing a patch. The object contains the following properties:
| key | description |
|-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `name` | The name of the patch. |
| `description` | The description of the patch. |
| `version` | The version of the patch. |
| `excluded` | Whether the patch is excluded by default. If `true`, the patch must never be included by default. |
| `deprecated` | Whether the patch is deprecated. |
| `options` | An array of options for this patch. |
| `options.key` | The key of the option. |
| `options.title` | The title of the option. |
| `options.description` | The description of the option. |
| `options.required` | Whether the option is required. |
| `options.choices?` | An array of choices of the option. This may be `null` if this option has no choices. The element type of this array may be any type. It can be a `String`, `Int` or something else. |
| `dependencies` | An array of dependencies, which are patch names. |
| `compatiblePackages` | An array of packages compatible with this patch. |
| `compatiblePackages.name` | The name of the package. |
| `compatiblePackages.versions` | An array of versions of the package compatible with this patch. If empty, all versions are seemingly compatible. |
Example:
```json
[
{
"name": "remember-video-quality",
"description": "Adds the ability to remember the video quality you chose in the video quality flyout.",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [],
"dependencies": [
"integrations",
"video-id-hook"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": [
"17.22.36",
"17.24.35",
"17.26.35",
"17.27.39",
"17.28.34",
"17.29.34",
"17.32.35",
"17.33.42"
]
}
]
},
{
"name": "theme",
"description": "Enables a custom theme.",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [
{
"key": "theme",
"title": "Theme",
"description": "Select a theme.",
"required": true,
"choices": [
"Amoled"
]
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": []
}
]
},
{
"name": "custom-branding",
"description": "Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [
{
"key": "appName",
"title": "Application Name",
"description": "The name of the application it will show on your home screen.",
"required": true,
"choices": null
},
{
"key": "appIconPath",
"title": "Application Icon Path",
"description": "A path to the icon of the application.",
"required": false,
"choices": null
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": []
}
]
}
]
```

263
README.md
View File

@@ -1 +1,262 @@
Repo for all ReVanced patches ## 🧩 Patches
The official Patch bundle provided by ReVanced and the community.
> Looking for the JSON variant of this? [Click here](patches.json).
### 📦 `com.reddit.frontpage`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `general-reddit-ads` | Removes general ads from the Reddit frontpage and subreddits. | all |
| `premium-icon-reddit` | Unlocking Premium Icons in reddit app. | all |
</details>
### 📦 `com.spotify.music`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `hide-premium-navbar` | Removes the premium tab from the navbar. | all |
| `spotify-theme` | Applies a custom theme. | all |
</details>
### 📦 `de.dwd.warnapp`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `promo-code-unlock` | Disables the validation of promo code. Any code will work to unlock all features. | all |
</details>
### 📦 `com.garzotto.pflotsh.ecmwf_a`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `pflotsh-ecmwf-subscription-unlock` | Unlocks all subscription features. | 3.5.4 |
</details>
### 📦 `com.ss.android.ugc.trill`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `tiktok-speed` | Enables the playback speed option for all videos. | all |
| `tiktok-download` | Removes download restrictions and changes the default path to download to. | all |
| `tiktok-seekbar` | Show progress bar for all video. | all |
| `tiktok-force-login` | Do not force login. | all |
| `tiktok-settings` | Add settings menu to TikTok. | all |
| `tiktok-ads` | Removes ads from TikTok. | all |
| `tiktok-feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
</details>
### 📦 `com.zhiliaoapp.musically`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `tiktok-speed` | Enables the playback speed option for all videos. | all |
| `tiktok-download` | Removes download restrictions and changes the default path to download to. | all |
| `tiktok-seekbar` | Show progress bar for all video. | all |
| `tiktok-force-login` | Do not force login. | all |
| `tiktok-settings` | Add settings menu to TikTok. | all |
| `tiktok-ads` | Removes ads from TikTok. | all |
| `tiktok-feed-filter` | Filters tiktok videos: removing ads, removing livestreams. | all |
</details>
### 📦 `com.twitter.android`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `monochrome-icon` | Adds a monochrome icon. | all |
| `dynamic-color` | Replaces the default Twitter Blue with the users Material You palette. | all |
| `timeline-ads` | Removes ads from the Twitter timeline. | all |
</details>
### 📦 `com.google.android.apps.youtube.music`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `exclusive-audio-playback` | Enables the option to play music without video. | 5.25.51 |
| `codecs-unlock` | Adds more audio codec options. The new audio codecs usually result in better audio quality. | 5.25.51 |
| `music-microg-support` | Allows YouTube Music ReVanced to run without root and under a different package name. | 5.25.51 |
| `music-video-ads` | Removes ads in the music player. | 5.25.51 |
| `tasteBuilder-remover` | Removes the "Tell us which artists you like" card from the home screen. | 5.25.51 |
| `minimized-playback-music` | Enables minimized playback on Kids music. | 5.25.51 |
| `compact-header` | Hides the music category bar at the top of the homepage. | 5.25.51 |
| `upgrade-button-remover` | Removes the upgrade tab from the pivot bar. | 5.25.51 |
| `hide-get-premium` | Removes all "Get Premium" evidences from the avatar menu. | 5.25.51 |
| `background-play` | Enables playing music in the background. | 5.25.51 |
</details>
### 📦 `com.google.android.youtube`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `swipe-controls` | Adds volume and brightness swipe controls. | 17.36.37 |
| `downloads` | Enables downloading music and videos from YouTube. | 17.36.37 |
| `seekbar-tapping` | Enables tap-to-seek on the seekbar of the video player. | 17.36.37 |
| `remember-video-quality` | Adds the ability to remember the video quality you chose in the video quality flyout. | 17.36.37 |
| `enable-debugging` | Enables app debugging by patching the manifest file. | all |
| `custom-playback-speed` | Adds more video playback speed options. | 17.36.37 |
| `minimized-playback` | Enables minimized and background playback. | 17.36.37 |
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
| `custom-video-buffer` | Lets you change the buffers of videos. | 17.36.37 |
| `settings` | Adds settings for ReVanced to YouTube. | all |
| `microg-support` | Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG. | 17.36.37 |
| `hdr-auto-brightness` | Makes the brightness of HDR videos follow the system default. | 17.36.37 |
| `always-autorepeat` | Always repeats the playing video again. | 17.36.37 |
| `general-ads` | Removes general ads. | 17.36.37 |
| `hide-infocard-suggestions` | Hides infocards in videos. | 17.36.37 |
| `video-ads` | Removes ads in the video player. | 17.36.37 |
| `hide-time-and-seekbar` | Hides progress bar and time counter on videos. | 17.36.37 |
| `old-quality-layout` | Enables the original quality flyout menu. | 17.36.37 |
| `enable-wide-searchbar` | Replaces the search icon with a wide search bar. This will hide the YouTube logo when active. | 17.36.37 |
| `disable-fullscreen-panels` | Disables video description and comments panel in fullscreen view. | 17.36.37 |
| `hide-autoplay-button` | Hides the autoplay button in the video player. | 17.36.37 |
| `premium-heading` | Shows premium branding on the home screen. | all |
| `custom-branding` | Changes the YouTube launcher icon and name to your choice (defaults to ReVanced). | all |
| `hide-create-button` | Hides the create button in the navigation bar. | 17.36.37 |
| `hide-shorts-button` | Hides the shorts button on the navigation bar. | 17.36.37 |
| `theme` | Applies a custom theme. | all |
| `hide-email-address` | Hides the email address in the account switcher. | 17.36.37 |
| `sponsorblock` | Integrate SponsorBlock. | 17.36.37 |
| `hide-cast-button` | Hides the cast button in the video player. | all |
| `tablet-mini-player` | Enables the tablet mini player layout. | 17.36.37 |
| `return-youtube-dislike` | Shows the dislike count of videos using the Return YouTube Dislike API. | 17.36.37 |
| `hide-watermark` | Hides creator's watermarks on videos. | 17.36.37 |
| `disable-auto-player-popup-panels` | Disable automatic popup panels (playlist or live chat) on video player. | 17.36.37 |
| `disable-auto-captions` | Disable forced captions from being automatically enabled. | 17.36.37 |
</details>
### 📦 `com.vanced.android.youtube`
<details>
| 💊 Patch | 📜 Description | 🏹 Target Version |
|:--------:|:--------------:|:-----------------:|
| `client-spoof` | Spoofs the YouTube or Vanced client to prevent playback issues. | all |
</details>
## 📝 JSON Format
This section explains the JSON format for the [patches.json](patches.json) file.
The file contains an array of objects, each object representing a patch. The object contains the following properties:
| key | description |
|-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `name` | The name of the patch. |
| `description` | The description of the patch. |
| `version` | The version of the patch. |
| `excluded` | Whether the patch is excluded by default. If `true`, the patch must never be included by default. |
| `deprecated` | Whether the patch is deprecated. |
| `options` | An array of options for this patch. |
| `options.key` | The key of the option. |
| `options.title` | The title of the option. |
| `options.description` | The description of the option. |
| `options.required` | Whether the option is required. |
| `options.choices?` | An array of choices of the option. This may be `null` if this option has no choices. The element type of this array may be any type. It can be a `String`, `Int` or something else. |
| `dependencies` | An array of dependencies, which are patch names. |
| `compatiblePackages` | An array of packages compatible with this patch. |
| `compatiblePackages.name` | The name of the package. |
| `compatiblePackages.versions` | An array of versions of the package compatible with this patch. If empty, all versions are seemingly compatible. |
Example:
```json
[
{
"name": "remember-video-quality",
"description": "Adds the ability to remember the video quality you chose in the video quality flyout.",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [],
"dependencies": [
"integrations",
"video-id-hook"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": [
"17.22.36",
"17.24.35",
"17.26.35",
"17.27.39",
"17.28.34",
"17.29.34",
"17.32.35",
"17.33.42"
]
}
]
},
{
"name": "theme",
"description": "Enables a custom theme.",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [
{
"key": "theme",
"title": "Theme",
"description": "Select a theme.",
"required": true,
"choices": [
"Amoled"
]
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": []
}
]
},
{
"name": "custom-branding",
"description": "Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).",
"version": "0.0.1",
"excluded": false,
"deprecated": false,
"options": [
{
"key": "appName",
"title": "Application Name",
"description": "The name of the application it will show on your home screen.",
"required": true,
"choices": null
},
{
"key": "appIconPath",
"title": "Application Icon Path",
"description": "A path to the icon of the application.",
"required": false,
"choices": null
}
],
"dependencies": [
"locale-config-fix"
],
"compatiblePackages": [
{
"name": "com.google.android.youtube",
"versions": []
}
]
}
]
```

View File

@@ -20,22 +20,21 @@ repositories {
} }
dependencies { dependencies {
implementation(kotlin("stdlib")) implementation("app.revanced:revanced-patcher:5.1.2")
implementation("app.revanced:revanced-patcher:2.1.2")
implementation("app.revanced:multidexlib2:2.5.2.r2") implementation("app.revanced:multidexlib2:2.5.2.r2")
// Required for meta
implementation("com.google.code.gson:gson:2.9.1")
} }
tasks { tasks {
register<DefaultTask>("generateDex") { register<DefaultTask>("generateBundle") {
description = "Generate dex files from build" description = "Generate dex files from build and bundle them in the jar file"
dependsOn(build) dependsOn(build)
doLast { doLast {
val androidHome = System.getenv("ANDROID_HOME") ?: throw GradleException("ANDROID_HOME not found") val androidHome = System.getenv("ANDROID_HOME") ?: throw GradleException("ANDROID_HOME not found")
val d8 = "${androidHome}/build-tools/32.0.0/d8" val d8 = "${androidHome}/build-tools/32.0.0/d8"
val input = configurations.archives.get().allArtifacts.files.files.first().absolutePath val input = configurations.archives.get().allArtifacts.files.files.first().absolutePath
val output = input.replace(".jar", ".dex")
val work = File("${buildDir}/libs") val work = File("${buildDir}/libs")
exec { exec {
@@ -45,16 +44,23 @@ tasks {
exec { exec {
workingDir = work workingDir = work
commandLine = listOf("mv", "classes.dex", output) commandLine = listOf("zip", "-u", input, "classes.dex")
} }
} }
} }
register<JavaExec>("generateMeta") {
description = "Generate metadata for this bundle"
dependsOn(build)
classpath = sourceSets["main"].runtimeClasspath
mainClass.set("app.revanced.meta.Meta")
}
// Dummy task to fix the Gradle semantic-release plugin. // Dummy task to fix the Gradle semantic-release plugin.
// Remove this if you forked it to support building only. // Remove this if you forked it to support building only.
// Tracking issue: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435 // Tracking issue: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435
register<DefaultTask>("publish") { register<DefaultTask>("publish") {
group = "publish" group = "publish"
description = "Dummy task" description = "Dummy task"
dependsOn(named("generateDex")) dependsOn(named("generateBundle"), named("generateMeta"))
} }
} }

View File

@@ -1,2 +1,2 @@
kotlin.code.style = official kotlin.code.style = official
version = 2.5.0 version = 2.73.0

1
patches.json Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +1,24 @@
package app.revanced.extensions package app.revanced.extensions
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.util.proxy.mutableTypes.MutableClass
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patcher.util.smali.toInstruction import app.revanced.patcher.util.smali.toInstruction
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.builder.MutableMethodImplementation import org.jf.dexlib2.builder.MutableMethodImplementation
import org.jf.dexlib2.builder.instruction.BuilderInstruction11n
import org.jf.dexlib2.builder.instruction.BuilderInstruction11x
import org.jf.dexlib2.builder.instruction.BuilderInstruction21t
import org.jf.dexlib2.builder.instruction.BuilderInstruction35c
import org.jf.dexlib2.immutable.reference.ImmutableMethodReference
import org.w3c.dom.Node import org.w3c.dom.Node
import java.nio.file.Files
// TODO: this method does not make sense here
internal fun MutableMethodImplementation.injectHideCall( internal fun MutableMethodImplementation.injectHideCall(
index: Int, index: Int,
register: Int register: Int
@@ -14,6 +29,167 @@ internal fun MutableMethodImplementation.injectHideCall(
) )
} }
/**
* traverse the class hierarchy starting from the given root class
*
* @param targetClass the class to start traversing the class hierarchy from
* @param callback function that is called for every class in the hierarchy
*/
fun BytecodeData.traverseClassHierarchy(targetClass: MutableClass, callback: MutableClass.() -> Unit) {
callback(targetClass)
this.findClass(targetClass.superclass ?: return)?.resolve()?.let {
traverseClassHierarchy(it, callback)
}
}
/**
* apply a transform to all methods of the class
*
* @param transform the transformation function. original method goes in, transformed method goes out
*/
fun MutableClass.transformMethods(transform: MutableMethod.() -> MutableMethod) {
val transformedMethods = methods.map { it.transform() }
methods.clear()
methods.addAll(transformedMethods)
}
/**
* Insert an event hook at the top of the method. If the hook returns true, the event is consumed and the method will return with true
*
* the hook method MUST return a boolean and MUST take two parameters, like so:
* fun hook(thisRef: Object, eventData: Object): Boolean {}
*
* The final injected code will resemble the following logic:
* if( YouHook(this, event) ) { return true; }
* ...
*
* @param hookRef reference to the hook method
*/
internal fun MutableMethod.injectConsumableEventHook(hookRef: ImmutableMethodReference) {
val isStaticMethod = AccessFlags.STATIC.isSet(this.accessFlags)
this.implementation?.let { impl ->
// create label to index 0 to continue to the normal program flow
val lblContinueNormalFlow = impl.newLabelForIndex(0)
// define registers
/** V0 */
val regV0 = 0
/** this */
val regP0 = impl.registerCount - this.parameters.size - (if (isStaticMethod) 0 else 1)
/** motionEvent */
val regP1 = regP0 + 1
// insert instructions at the start of the method:
// if( Hook(this, event) ) { return true; }
impl.addInstructions(
0, listOf(
// invoke-static { p0, p1 } <hook>
BuilderInstruction35c(
Opcode.INVOKE_STATIC,
2,
regP0,
regP1,
0, 0, 0,
hookRef
),
// move-result v0
BuilderInstruction11x(
Opcode.MOVE_RESULT,
regV0
),
// if-eqz v0, :continue_normal_flow
BuilderInstruction21t(
Opcode.IF_EQZ,
regV0,
lblContinueNormalFlow
),
// const/4 v0, 0x1
BuilderInstruction11n(
Opcode.CONST_4,
regV0,
0x1
),
// return v0
BuilderInstruction11x(
Opcode.RETURN,
regV0
)
// :continue_normal_flow
)
)
}
}
/**
* inject resources into the patched app
*
* @param classLoader classloader to use for loading the resources
* @param patchDirectoryPath path to the files. this will be the directory you created under the 'resources' source folder
* @param resourceType the resource type, for example 'drawable'. this has to match both the source and the target
* @param resourceFileNames names of all resources of this type to inject
*/
fun ResourceData.injectResources(
classLoader: ClassLoader,
patchDirectoryPath: String,
resourceType: String,
resourceFileNames: List<String>
) {
resourceFileNames.forEach { name ->
val relativePath = "$resourceType/$name"
val sourceRes = classLoader.getResourceAsStream("$patchDirectoryPath/$relativePath")
?: throw PatchResultError("could not open resource '$patchDirectoryPath/$relativePath'")
Files.copy(
sourceRes,
this["res"].resolve(relativePath).toPath()
)
}
}
/**
* inject strings into the patched app
*
* @param classLoader classloader to use for loading the resources
* @param patchDirectoryPath path to the files. this will be the directory you created under the 'resources' source folder
* @param languageIdentifier ISO 639-2 two- letter language code identifier (aka the one android uses for values directory)
*/
fun ResourceData.injectStrings(
classLoader: ClassLoader,
patchDirectoryPath: String,
languageIdentifier: String? = null,
) {
val relativePath =
if (languageIdentifier.isNullOrBlank()) "values/strings.xml" else "values/strings-$languageIdentifier.xml"
// open source strings.xml
val sourceInputStream = classLoader.getResourceAsStream("$patchDirectoryPath/$relativePath")
?: throw PatchResultError("failed to open '$patchDirectoryPath/$relativePath'")
xmlEditor[sourceInputStream].use { sourceStringsXml ->
val strings = sourceStringsXml.file.getElementsByTagName("resources").item(0).childNodes
// open target strings.xml
xmlEditor["res/$relativePath"].use { targetStringsXml ->
val targetFile = targetStringsXml.file
val targetRootNode = targetFile.getElementsByTagName("resources").item(0)
// process all children strings in the source
for (i in 0 until strings.length) {
// clone the node from source to target
val node = strings.item(i).cloneNode(true)
targetFile.adoptNode(node)
targetRootNode.appendChild(node)
}
}
}
}
internal fun Node.doRecursively(action: (Node) -> Unit) { internal fun Node.doRecursively(action: (Node) -> Unit) {
action(this) action(this)
for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action) for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action)

View File

@@ -0,0 +1,27 @@
package app.revanced.meta
import app.revanced.meta.json.generateJson
import app.revanced.meta.readme.generateText
import app.revanced.patcher.data.Data
import app.revanced.patcher.patch.Patch
import app.revanced.patcher.util.patch.impl.JarPatchBundle
import java.io.File
typealias Bundle = List<Class<out Patch<Data>>>
object Meta {
@JvmStatic
fun main(args: Array<String>) {
val patches = accumulatePatches()
if (patches.isEmpty()) throw IllegalStateException("No patches found")
generateText(patches)
generateJson(patches)
}
}
fun accumulatePatches() = JarPatchBundle(
File("build/libs/").listFiles()!!.first {
it.name.startsWith("revanced-patches-") && it.name.endsWith(".jar")
}.absolutePath
).loadPatches()

View File

@@ -0,0 +1,50 @@
package app.revanced.meta.json
import app.revanced.meta.Bundle
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
import app.revanced.patcher.extensions.PatchExtensions.dependencies
import app.revanced.patcher.extensions.PatchExtensions.deprecated
import app.revanced.patcher.extensions.PatchExtensions.description
import app.revanced.patcher.extensions.PatchExtensions.include
import app.revanced.patcher.extensions.PatchExtensions.options
import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.extensions.PatchExtensions.version
import app.revanced.patcher.patch.PatchOption
import com.google.gson.GsonBuilder
import java.io.File
private val gson = GsonBuilder().serializeNulls().create()
fun generateJson(bundle: Bundle) {
val patches = bundle.map {
JsonPatch(
it.patchName,
it.description ?: "This patch has no description.",
it.version ?: "0.0.0",
!it.include,
it.deprecated != null,
it.options?.map { option ->
Option(
option.key,
option.title,
option.description,
option.required,
option.let { lo ->
if (lo is PatchOption.ListOption<*>) {
lo.options.toMutableList().toTypedArray()
} else null
}
)
}?.toTypedArray() ?: emptyArray(),
it.dependencies?.map { dep ->
dep.java.patchName
}?.toTypedArray() ?: emptyArray(),
it.compatiblePackages?.map { pkg ->
CompatiblePackage(pkg.name, pkg.versions)
}?.toTypedArray() ?: emptyArray()
)
}
val json = File("patches.json")
json.writeText(gson.toJson(patches))
}

View File

@@ -0,0 +1,27 @@
@file:Suppress("ArrayInDataClass") // We don't need it here.
package app.revanced.meta.json
data class JsonPatch(
val name: String,
val description: String,
val version: String,
val excluded: Boolean,
val deprecated: Boolean,
val options: Array<Option>,
val dependencies: Array<String>,
val compatiblePackages: Array<CompatiblePackage>,
)
data class CompatiblePackage(
val name: String,
val versions: Array<String>,
)
data class Option(
val key: String,
val title: String,
val description: String,
val required: Boolean,
val choices: Array<*>?,
)

View File

@@ -0,0 +1,10 @@
package app.revanced.meta.readme
import app.revanced.patcher.data.Data
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
import app.revanced.patcher.patch.Patch
internal fun Class<out Patch<Data>>.getLatestVersion() =
this.compatiblePackages?.first()?.versions?.map {
SemanticVersion.fromString(it)
}?.maxWithOrNull(SemanticVersionComparator)

View File

@@ -0,0 +1,42 @@
package app.revanced.meta.readme
import app.revanced.meta.Bundle
import app.revanced.patcher.data.Data
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
import app.revanced.patcher.extensions.PatchExtensions.description
import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.patch.Patch
import java.io.File
private const val TABLE_HEADER =
"| \uD83D\uDC8A Patch | \uD83D\uDCDC Description | \uD83C\uDFF9 Target Version |\n" + "|:--------:|:--------------:|:-----------------:|"
private val TABLE_REGEX = Regex("\\{\\{\\s?table\\s?}}")
fun generateText(bundle: Bundle) {
val output = StringBuilder()
val packages = mutableMapOf<String, MutableList<Class<out Patch<Data>>>>()
for (patch in bundle) {
patch.compatiblePackages?.forEach { pkg ->
if (!packages.contains(pkg.name)) packages[pkg.name] = mutableListOf()
packages[pkg.name]!!.add(patch)
}
}
for (pkg in packages) {
output.appendLine("### \uD83D\uDCE6 `${pkg.key}`")
output.appendLine("<details>\n")
output.appendLine(TABLE_HEADER)
pkg.value.forEach { output.appendLine("| `${it.patchName}` | ${it.description} | ${it.getLatestVersion() ?: "all"} |") }
output.appendLine("</details>\n")
}
val readmeTemplate = Template(File("README-template.md").readText())
readmeTemplate.replaceVariable(TABLE_REGEX, output.toString())
val readme = File("README.md")
readme.writeText(readmeTemplate.toString())
}

View File

@@ -0,0 +1,22 @@
package app.revanced.meta.readme
data class SemanticVersion(val major: Int, val minor: Int, val patch: Int) {
companion object {
fun fromString(version: String): SemanticVersion {
val parts = version.split(".")
if (parts.count() != 3) throw IllegalArgumentException("Invalid semantic version")
val versionNumbers = parts.map { it.toInt() }
return SemanticVersion(versionNumbers[0], versionNumbers[1], versionNumbers[2])
}
}
override fun toString(): String = "$major.$minor.$patch"
}
object SemanticVersionComparator : Comparator<SemanticVersion> {
override fun compare(a: SemanticVersion, b: SemanticVersion): Int = when {
a.major != b.major -> a.major - b.major
a.minor != b.minor -> a.minor - b.minor
else -> a.patch - b.patch
}
}

View File

@@ -0,0 +1,12 @@
package app.revanced.meta.readme
class Template(template: String) {
val result = StringBuilder(template)
fun replaceVariable(regex: Regex, value: String) {
val range = regex.find(result)!!.range
result.replace(range.first, range.last + 1, value)
}
override fun toString(): String = result.toString()
}

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.music.ad.video.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class MusicVideoAdsCompatibility

View File

@@ -0,0 +1,39 @@
package app.revanced.patches.music.ad.video.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patches.music.ad.video.annotations.MusicVideoAdsCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("show-video-ads-constructor-fingerprint")
@MatchingMethod(
"Laghd;",
"<init>",
)
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
@MusicVideoAdsCompatibility
@Version("0.0.1")
object ShowMusicVideoAdsConstructorFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L"), listOf(
Opcode.INVOKE_DIRECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.CONST_4,
Opcode.IPUT_BOOLEAN,
Opcode.RETURN_VOID
)
)

View File

@@ -0,0 +1,26 @@
package app.revanced.patches.music.ad.video.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.music.ad.video.annotations.MusicVideoAdsCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("show-video-ads-method-fingerprint")
@MatchingMethod(
"Laghd;", "d"
)
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
@MusicVideoAdsCompatibility
@Version("0.0.1")
object ShowMusicVideoAdsFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf("Z"), listOf(
Opcode.IPUT_BOOLEAN,
Opcode.INVOKE_VIRTUAL,
Opcode.RETURN_VOID
)
)

View File

@@ -0,0 +1,40 @@
package app.revanced.patches.music.ad.video.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.music.ad.video.annotations.MusicVideoAdsCompatibility
import app.revanced.patches.music.ad.video.fingerprints.ShowMusicVideoAdsConstructorFingerprint
import app.revanced.patches.music.ad.video.fingerprints.ShowMusicVideoAdsFingerprint
@Patch
@Name("music-video-ads")
@Description("Removes ads in the music player.")
@MusicVideoAdsCompatibility
@Version("0.0.1")
class MusicVideoAdsPatch : BytecodePatch(
listOf(
ShowMusicVideoAdsConstructorFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
ShowMusicVideoAdsFingerprint.resolve(data, ShowMusicVideoAdsConstructorFingerprint.result!!.classDef)
val result = ShowMusicVideoAdsFingerprint.result!!
result.mutableMethod.addInstructions(
result.scanResult.patternScanResult!!.startIndex, """
const/4 p1, 0x0
"""
)
return PatchResultSuccess()
}
}

View File

@@ -5,10 +5,9 @@ import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package( [Package(
"com.google.android.apps.youtube.music", arrayOf("5.03.50") "com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)] )]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME) @Retention(AnnotationRetention.RUNTIME)
internal annotation class CodecsUnlockCompatibility internal annotation class CodecsUnlockCompatibility

View File

@@ -3,25 +3,23 @@ package app.revanced.patches.music.audio.codecs.fingerprints
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.extensions.or import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.music.audio.codecs.annotations.CodecsUnlockCompatibility import app.revanced.patches.music.audio.codecs.annotations.CodecsUnlockCompatibility
import org.jf.dexlib2.AccessFlags import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode import org.jf.dexlib2.Opcode
@Name("codec-lock-fingerprint") @Name("codec-lock-fingerprint")
@MatchingMethod( @MatchingMethod(
"Labwj;", "Lacfr;",
"a", "a",
) )
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value. @FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
@CodecsUnlockCompatibility @CodecsUnlockCompatibility
@Version("0.0.1") @Version("0.0.1")
object CodecsLockFingerprint : MethodFingerprint( object CodecsLockFingerprint : MethodFingerprint(
"L", AccessFlags.PUBLIC or AccessFlags.STATIC, listOf("L", "L", "L", "L"), listOf( "L", AccessFlags.PUBLIC or AccessFlags.STATIC, opcodes = listOf(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_DIRECT, Opcode.INVOKE_DIRECT,
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT, Opcode.MOVE_RESULT,
@@ -29,19 +27,13 @@ object CodecsLockFingerprint : MethodFingerprint(
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT, Opcode.MOVE_RESULT,
Opcode.IF_NEZ, Opcode.IF_NEZ,
Opcode.SGET,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_INTERFACE,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT,
Opcode.IF_NEZ,
Opcode.SGET_OBJECT, Opcode.SGET_OBJECT,
Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.INVOKE_INTERFACE, Opcode.INVOKE_INTERFACE,
Opcode.INVOKE_DIRECT, Opcode.INVOKE_DIRECT,
Opcode.RETURN_OBJECT Opcode.RETURN_OBJECT
) ),
) strings = listOf("eac3_supported")
)

View File

@@ -13,10 +13,11 @@ import app.revanced.patcher.util.smali.toInstruction
import app.revanced.patches.music.audio.codecs.annotations.CodecsUnlockCompatibility import app.revanced.patches.music.audio.codecs.annotations.CodecsUnlockCompatibility
import app.revanced.patches.music.audio.codecs.fingerprints.AllCodecsReferenceFingerprint import app.revanced.patches.music.audio.codecs.fingerprints.AllCodecsReferenceFingerprint
import app.revanced.patches.music.audio.codecs.fingerprints.CodecsLockFingerprint import app.revanced.patches.music.audio.codecs.fingerprints.CodecsLockFingerprint
import org.jf.dexlib2.Opcode
@Patch @Patch
@Name("codecs-unlock") @Name("codecs-unlock")
@Description("Enables more audio codecs. Usually results in better audio quality but may depend on song and device.") @Description("Adds more audio codec options. The new audio codecs usually result in better audio quality.")
@CodecsUnlockCompatibility @CodecsUnlockCompatibility
@Version("0.0.1") @Version("0.0.1")
class CodecsUnlockPatch : BytecodePatch( class CodecsUnlockPatch : BytecodePatch(
@@ -25,19 +26,29 @@ class CodecsUnlockPatch : BytecodePatch(
) )
) { ) {
override fun execute(data: BytecodeData): PatchResult { override fun execute(data: BytecodeData): PatchResult {
var result = CodecsLockFingerprint.result!! val codecsLockResult = CodecsLockFingerprint.result!!
val implementation = result.mutableMethod.implementation!! val implementation = codecsLockResult.mutableMethod.implementation!!
val instructionIndex = result.patternScanResult!!.startIndex val scanResultStartIndex = codecsLockResult.scanResult.patternScanResult!!.startIndex
val instructionIndex = scanResultStartIndex +
if (implementation.instructions[scanResultStartIndex - 1].opcode == Opcode.CHECK_CAST) {
// for 5.16.xx and lower
-3
} else {
// since 5.17.xx
-2
}
result = AllCodecsReferenceFingerprint.result!! val allCodecsResult = AllCodecsReferenceFingerprint.result!!
val codecMethod = val allCodecsMethod =
data.toMethodWalker(result.method).nextMethod(result.patternScanResult!!.startIndex).getMethod() data.toMethodWalker(allCodecsResult.method)
.nextMethod(allCodecsResult.scanResult.patternScanResult!!.startIndex)
.getMethod()
implementation.replaceInstruction( implementation.replaceInstruction(
instructionIndex, instructionIndex,
"invoke-static {}, ${codecMethod.definingClass}->${codecMethod.name}()Ljava/util/Set;".toInstruction() "invoke-static {}, ${allCodecsMethod.definingClass}->${allCodecsMethod.name}()Ljava/util/Set;".toInstruction()
) )
return PatchResultSuccess() return PatchResultSuccess()

View File

@@ -5,10 +5,9 @@ import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package( [Package(
"com.google.android.apps.youtube.music", arrayOf("5.03.50") "com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)] )]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME) @Retention(AnnotationRetention.RUNTIME)
internal annotation class ExclusiveAudioCompatibility internal annotation class ExclusiveAudioCompatibility

View File

@@ -1,3 +1,5 @@
package app.revanced.patches.music.audio.exclusiveaudio.fingerprints
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.extensions.or import app.revanced.patcher.extensions.or

View File

@@ -1,34 +1,30 @@
package app.revanced.patches.music.audio.exclusiveaudio.patch package app.revanced.patches.music.audio.exclusiveaudio.patch
import AudioOnlyEnablerFingerprint
import app.revanced.patcher.annotation.Description 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.impl.BytecodeData import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.utils.MethodFingerprintUtils.resolve
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.Patch import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.music.audio.exclusiveaudio.annotations.ExclusiveAudioCompatibility import app.revanced.patches.music.audio.exclusiveaudio.annotations.ExclusiveAudioCompatibility
import app.revanced.patches.music.audio.exclusiveaudio.fingerprints.ExclusiveAudioFingerprint import app.revanced.patches.music.audio.exclusiveaudio.fingerprints.AudioOnlyEnablerFingerprint
@Patch @Patch
@Name("exclusive-audio-playback") @Name("exclusive-audio-playback")
@Description("Add the option to play music without video.") @Description("Enables the option to play music without video.")
@ExclusiveAudioCompatibility @ExclusiveAudioCompatibility
@Version("0.0.1") @Version("0.0.1")
class ExclusiveAudioPatch : BytecodePatch( class ExclusiveAudioPatch : BytecodePatch(
listOf( listOf(
ExclusiveAudioFingerprint AudioOnlyEnablerFingerprint
) )
) { ) {
override fun execute(data: BytecodeData): PatchResult { override fun execute(data: BytecodeData): PatchResult {
ExclusiveAudioFingerprint.resolve(data, AudioOnlyEnablerFingerprint.result!!.classDef) val method = AudioOnlyEnablerFingerprint.result!!.mutableMethod
val method = ExclusiveAudioFingerprint.result!!.mutableMethod
method.replaceInstruction(method.implementation!!.instructions.count() - 1, "const/4 v0, 0x1") method.replaceInstruction(method.implementation!!.instructions.count() - 1, "const/4 v0, 0x1")
method.addInstruction("return v0") method.addInstruction("return v0")

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.music.layout.compactheader.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class CompactHeaderCompatibility

View File

@@ -0,0 +1,33 @@
package app.revanced.patches.music.layout.compactheader.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patches.music.layout.compactheader.annotations.CompactHeaderCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("compact-header-constructor-fingerprint")
@MatchingMethod(
"Llcz;", "<init>"
)
@CompactHeaderCompatibility
@Version("0.0.1")
object CompactHeaderConstructorFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L", "L", "L"), listOf(
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT,
Opcode.CONST,
Opcode.CONST_4,
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST
)
)

View File

@@ -0,0 +1,41 @@
package app.revanced.patches.music.layout.compactheader.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.music.layout.compactheader.annotations.CompactHeaderCompatibility
import app.revanced.patches.music.layout.compactheader.fingerprints.CompactHeaderConstructorFingerprint
import org.jf.dexlib2.builder.instruction.BuilderInstruction11x
@Patch(false)
@Name("compact-header")
@Description("Hides the music category bar at the top of the homepage.")
@CompactHeaderCompatibility
@Version("0.0.1")
class CompactHeaderPatch : BytecodePatch(
listOf(
CompactHeaderConstructorFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val result = CompactHeaderConstructorFingerprint.result!!
val method = result.mutableMethod
val insertIndex = result.scanResult.patternScanResult!!.endIndex
val register = (method.implementation!!.instructions[insertIndex - 1] as BuilderInstruction11x).registerA
method.addInstructions(
insertIndex, """
const/16 v2, 0x8
invoke-virtual {v${register}, v2}, Landroid/view/View;->setVisibility(I)V
"""
)
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.music.layout.minimizedplayback.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class MinimizedPlaybackCompatibility

View File

@@ -0,0 +1,36 @@
package app.revanced.patches.music.layout.minimizedplayback.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patches.music.layout.minimizedplayback.annotations.MinimizedPlaybackCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("minimized-playback-manager-fingerprint")
@MatchingMethod(
"Llxw;", "c"
)
@MinimizedPlaybackCompatibility
@Version("0.0.1")
object MinimizedPlaybackManagerFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.FINAL,
listOf("I", "L", "Z"),
listOf(
Opcode.IGET,
Opcode.IF_NE,
Opcode.IGET_OBJECT,
Opcode.IF_NE,
Opcode.IGET_BOOLEAN,
Opcode.IF_EQ,
Opcode.GOTO,
Opcode.RETURN_VOID,
Opcode.SGET_OBJECT,
Opcode.CONST_4,
Opcode.IF_NE,
Opcode.IPUT_BOOLEAN,
)
)

View File

@@ -1,21 +1,24 @@
package app.revanced.patches.youtube.layout.minimizedplayback.patch package app.revanced.patches.music.layout.minimizedplayback.patch
import app.revanced.patcher.annotation.Description 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.extensions.addInstructions
import app.revanced.patcher.data.impl.BytecodeData import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.patch.annotations.Patch import app.revanced.patcher.data.impl.toMethodWalker
import app.revanced.patcher.patch.impl.BytecodePatch import app.revanced.patcher.extensions.addInstructions
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.patches.youtube.layout.minimizedplayback.annotations.MinimizedPlaybackCompatibility import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patches.youtube.layout.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.music.layout.minimizedplayback.annotations.MinimizedPlaybackCompatibility
import app.revanced.patches.music.layout.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.reference.MethodReference
@Patch @Patch
@Name("minimized-playback") @Name("minimized-playback-music")
@Description("Enable minimized and background playback.") @Description("Enables minimized playback on Kids music.")
@MinimizedPlaybackCompatibility @MinimizedPlaybackCompatibility
@Version("0.0.1") @Version("0.0.1")
class MinimizedPlaybackPatch : BytecodePatch( class MinimizedPlaybackPatch : BytecodePatch(
@@ -24,14 +27,12 @@ class MinimizedPlaybackPatch : BytecodePatch(
) )
) { ) {
override fun execute(data: BytecodeData): PatchResult { override fun execute(data: BytecodeData): PatchResult {
// Instead of removing all instructions like Vanced,
// we return the method at the beginning instead
MinimizedPlaybackManagerFingerprint.result!!.mutableMethod.addInstructions( MinimizedPlaybackManagerFingerprint.result!!.mutableMethod.addInstructions(
0, """ 0, """
const/4 v0, 0x1 return-void
return v0
""" """
) )
return PatchResultSuccess() return PatchResultSuccess()
} }
} }

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.music.layout.premium.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class HideGetPremiumCompatibility

View File

@@ -0,0 +1,26 @@
package app.revanced.patches.music.layout.premium.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patches.music.layout.premium.annotations.HideGetPremiumCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("hide-get-premium-fingerprint")
@MatchingMethod(
"Lktn;", "k"
)
@HideGetPremiumCompatibility
@Version("0.0.1")
object HideGetPremiumFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
Opcode.IF_NEZ,
Opcode.CONST_16,
Opcode.GOTO,
Opcode.NOP,
Opcode.INVOKE_VIRTUAL
)
)

View File

@@ -0,0 +1,29 @@
package app.revanced.patches.music.layout.premium.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patches.music.layout.premium.annotations.HideGetPremiumCompatibility
import org.jf.dexlib2.AccessFlags
import org.jf.dexlib2.Opcode
@Name("hide-get-premium-parent-fingerprint")
@MatchingMethod(
"Lktn;", "k"
)
@HideGetPremiumCompatibility
@Version("0.0.1")
object HideGetPremiumParentFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.FINAL, listOf(), listOf(
Opcode.IGET_BOOLEAN,
Opcode.CONST_4,
Opcode.IF_EQZ,
Opcode.IGET_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC
),
listOf("FEmusic_history"),
)

View File

@@ -0,0 +1,51 @@
package app.revanced.patches.music.layout.premium.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.music.layout.premium.annotations.HideGetPremiumCompatibility
import app.revanced.patches.music.layout.premium.fingerprints.HideGetPremiumFingerprint
import app.revanced.patches.music.layout.premium.fingerprints.HideGetPremiumParentFingerprint
@Patch
@Name("hide-get-premium")
@Description("Removes all \"Get Premium\" evidences from the avatar menu.")
@HideGetPremiumCompatibility
@Version("0.0.1")
class HideGetPremiumPatch : BytecodePatch(
listOf(
HideGetPremiumParentFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val parentResult = HideGetPremiumParentFingerprint.result!!
HideGetPremiumFingerprint.resolve(data, parentResult.classDef)
val startIndex = parentResult.scanResult.patternScanResult!!.startIndex
val parentMethod = parentResult.mutableMethod
parentMethod.replaceInstruction(
startIndex, """
const/4 v1, 0x0
"""
)
val result = HideGetPremiumFingerprint.result!!
val method = result.mutableMethod
method.addInstructions(
startIndex, """
const/16 v0, 0x8
"""
)
return PatchResultSuccess()
}
}

View File

@@ -3,12 +3,16 @@ package app.revanced.patches.music.layout.tastebuilder.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
/**
* -- Note 2022-08-05 --
* Since 5.17.xx the tastebuilder component is dismissible, so this patch is less useful
* also it is partly litho now
*/
@Compatibility( @Compatibility(
[Package( [Package(
"com.google.android.apps.youtube.music", arrayOf("5.03.50") "com.google.android.apps.youtube.music", arrayOf("5.21.52", "5.22.54", "5.23.50","5.25.51")
)] )]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME) @Retention(AnnotationRetention.RUNTIME)
internal annotation class RemoveTasteBuilderCompatibility internal annotation class RemoveTasteBuilderCompatibility

View File

@@ -18,7 +18,7 @@ import org.jf.dexlib2.Opcode
@RemoveTasteBuilderCompatibility @RemoveTasteBuilderCompatibility
@Version("0.0.1") @Version("0.0.1")
object TasteBuilderConstructorFingerprint : MethodFingerprint( object TasteBuilderConstructorFingerprint : MethodFingerprint(
"V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L", "L"), listOf( "V", AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, listOf("L", "L", "L"), listOf(
Opcode.INVOKE_DIRECT, Opcode.INVOKE_DIRECT,
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL,
Opcode.NEW_INSTANCE, Opcode.NEW_INSTANCE,
@@ -35,9 +35,9 @@ object TasteBuilderConstructorFingerprint : MethodFingerprint(
Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT, Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST, Opcode.CHECK_CAST,
Opcode.IPUT_OBJECT,
Opcode.NEW_INSTANCE, Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT, Opcode.INVOKE_DIRECT,
Opcode.IPUT_OBJECT Opcode.IPUT_OBJECT,
Opcode.CONST
) )
) )

View File

@@ -15,7 +15,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction22c
@Patch @Patch
@Name("tasteBuilder-remover") @Name("tasteBuilder-remover")
@Description("Removes the \"Tell us which artists you like\" card from the Home screen. The same functionality can be triggered from the settings anyway.") @Description("Removes the \"Tell us which artists you like\" card from the home screen.")
@RemoveTasteBuilderCompatibility @RemoveTasteBuilderCompatibility
@Version("0.0.1") @Version("0.0.1")
class RemoveTasteBuilderPatch : BytecodePatch( class RemoveTasteBuilderPatch : BytecodePatch(
@@ -27,7 +27,7 @@ class RemoveTasteBuilderPatch : BytecodePatch(
val result = TasteBuilderConstructorFingerprint.result!! val result = TasteBuilderConstructorFingerprint.result!!
val method = result.mutableMethod val method = result.mutableMethod
val insertIndex = result.patternScanResult!!.endIndex - 8 val insertIndex = result.scanResult.patternScanResult!!.endIndex - 8
val register = (method.implementation!!.instructions[insertIndex] as Instruction22c).registerA val register = (method.implementation!!.instructions[insertIndex] as Instruction22c).registerA
method.addInstructions( method.addInstructions(
insertIndex, """ insertIndex, """

View File

@@ -5,10 +5,9 @@ import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package( [Package(
"com.google.android.apps.youtube.music", arrayOf("5.03.50") "com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)] )]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME) @Retention(AnnotationRetention.RUNTIME)
internal annotation class RemoveUpgradeButtonCompatibility internal annotation class RemoveUpgradeButtonCompatibility

View File

@@ -20,7 +20,7 @@ import org.jf.dexlib2.iface.instruction.formats.Instruction35c
@Patch @Patch
@Name("upgrade-button-remover") @Name("upgrade-button-remover")
@Description("Remove the upgrade tab from the pivot bar in YouTube music.") @Description("Removes the upgrade tab from the pivot bar.")
@RemoveUpgradeButtonCompatibility @RemoveUpgradeButtonCompatibility
@Version("0.0.1") @Version("0.0.1")
class RemoveUpgradeButtonPatch : BytecodePatch( class RemoveUpgradeButtonPatch : BytecodePatch(
@@ -33,7 +33,7 @@ class RemoveUpgradeButtonPatch : BytecodePatch(
val implementation = result.mutableMethod.implementation!! val implementation = result.mutableMethod.implementation!!
val pivotBarElementFieldRef = val pivotBarElementFieldRef =
(implementation.instructions[result.patternScanResult!!.endIndex - 1] as Instruction22c).reference (implementation.instructions[result.scanResult.patternScanResult!!.endIndex - 1] as Instruction22c).reference
val register = (implementation.instructions.first() as Instruction35c).registerC val register = (implementation.instructions.first() as Instruction35c).registerC
// first compile all the needed instructions // first compile all the needed instructions
@@ -46,16 +46,18 @@ class RemoveUpgradeButtonPatch : BytecodePatch(
""".toInstructions().toMutableList() """.toInstructions().toMutableList()
val endIndex = result.scanResult.patternScanResult!!.endIndex
// replace the instruction to retain the label at given index // replace the instruction to retain the label at given index
implementation.replaceInstruction( implementation.replaceInstruction(
result.patternScanResult!!.endIndex - 1, instructionList[0] // invoke-interface endIndex - 1, instructionList[0] // invoke-interface
) )
// do not forget to remove this instruction since we added it already // do not forget to remove this instruction since we added it already
instructionList.removeFirst() instructionList.removeFirst()
val exitInstruction = instructionList.last() // iput-object val exitInstruction = instructionList.last() // iput-object
implementation.addInstruction( implementation.addInstruction(
result.patternScanResult!!.endIndex, exitInstruction endIndex, exitInstruction
) )
// do not forget to remove this instruction since we added it already // do not forget to remove this instruction since we added it already
instructionList.removeLast() instructionList.removeLast()
@@ -64,12 +66,12 @@ class RemoveUpgradeButtonPatch : BytecodePatch(
instructionList.add( instructionList.add(
2, // if-le 2, // if-le
BuilderInstruction22t( BuilderInstruction22t(
Opcode.IF_LE, 1, 2, implementation.newLabelForIndex(result.patternScanResult!!.endIndex) Opcode.IF_LE, 1, 2, implementation.newLabelForIndex(endIndex)
) )
) )
implementation.addInstructions( implementation.addInstructions(
result.patternScanResult!!.endIndex, instructionList endIndex, instructionList
) )
return PatchResultSuccess() return PatchResultSuccess()
} }

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.music.misc.microg.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[Package(
"com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class MusicMicroGPatchCompatibility

View File

@@ -0,0 +1,19 @@
package app.revanced.patches.music.misc.microg.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
@Name("cast-context-fetch-fingerprint")
@MatchingMethod(
"Lvvz;", "a"
)
@DirectPatternScanMethod
@MicroGPatchCompatibility
@Version("0.0.1")
object CastContextFetchFingerprint : MethodFingerprint(
strings = listOf("Error fetching CastContext.")
)

View File

@@ -0,0 +1,19 @@
package app.revanced.patches.music.misc.microg.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
@Name("cast-module-fingerprint")
@MatchingMethod(
"Llqh;", "c"
)
@DirectPatternScanMethod
@MicroGPatchCompatibility
@Version("0.0.1")
object CastDynamiteModuleFingerprint : MethodFingerprint(
strings = listOf("com.google.android.gms.cast.framework.internal.CastDynamiteModuleImpl")
)

View File

@@ -0,0 +1,19 @@
package app.revanced.patches.music.misc.microg.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.youtube.misc.microg.annotations.MicroGPatchCompatibility
@Name("cast-context-fetch-fingerprint")
@MatchingMethod(
"Lmcf;", "c"
)
@DirectPatternScanMethod
@MicroGPatchCompatibility
@Version("0.0.1")
object CastDynamiteModuleV2Fingerprint : MethodFingerprint(
strings = listOf("Failed to load module via V2: ")
)

View File

@@ -0,0 +1,30 @@
package app.revanced.patches.music.misc.microg.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.music.misc.microg.annotations.MusicMicroGPatchCompatibility
import org.jf.dexlib2.AccessFlags
@Name("google-play-utility-fingerprint")
@MatchingMethod(
"Lnuv;", "b"
)
@DirectPatternScanMethod
@MusicMicroGPatchCompatibility
@Version("0.0.1")
object GooglePlayUtilityFingerprint : MethodFingerprint(
"I",
AccessFlags.PUBLIC or AccessFlags.STATIC,
listOf("L", "I"),
strings = listOf(
"This should never happen.",
"MetadataValueReader",
"GooglePlayServicesUtil",
"com.android.vending",
"android.hardware.type.embedded"
)
)

View File

@@ -0,0 +1,19 @@
package app.revanced.patches.music.misc.microg.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.DirectPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.music.misc.microg.annotations.MusicMicroGPatchCompatibility
@Name("google-play-prime-fingerprint")
@MatchingMethod(
"Lrwi;", "a"
)
@DirectPatternScanMethod
@MusicMicroGPatchCompatibility
@Version("0.0.1")
object PrimeFingerprint : MethodFingerprint(
strings = listOf("com.google.android.GoogleCamera", "com.android.vending")
)

View File

@@ -0,0 +1,24 @@
package app.revanced.patches.music.misc.microg.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.FuzzyPatternScanMethod
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.music.misc.microg.annotations.MusicMicroGPatchCompatibility
import org.jf.dexlib2.AccessFlags
@Name("google-play-service-checker-fingerprint")
@MatchingMethod(
"Lnuv;", "d"
)
@FuzzyPatternScanMethod(2) // FIXME: Test this threshold and find the best value.
@MusicMicroGPatchCompatibility
@Version("0.0.1")
object ServiceCheckFingerprint : MethodFingerprint(
"V",
AccessFlags.PUBLIC or AccessFlags.STATIC,
listOf("L", "I"),
strings = listOf("Google Play Services not available")
)

View File

@@ -0,0 +1,65 @@
package app.revanced.patches.music.misc.microg.patch.bytecode
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.music.misc.microg.annotations.MusicMicroGPatchCompatibility
import app.revanced.patches.music.misc.microg.fingerprints.*
import app.revanced.patches.music.misc.microg.patch.resource.MusicMicroGResourcePatch
import app.revanced.patches.music.misc.microg.shared.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.microg.shared.Constants.REVANCED_MUSIC_PACKAGE_NAME
import app.revanced.patches.youtube.misc.microg.shared.Constants
import app.revanced.util.microg.MicroGBytecodeHelper
@Patch
@DependsOn([MusicMicroGResourcePatch::class])
@Name("music-microg-support")
@Description("Allows YouTube Music ReVanced to run without root and under a different package name.")
@MusicMicroGPatchCompatibility
@Version("0.0.2")
class MusicMicroGBytecodePatch : BytecodePatch(
listOf(
ServiceCheckFingerprint,
GooglePlayUtilityFingerprint,
CastDynamiteModuleFingerprint,
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint,
PrimeFingerprint,
)
) {
// NOTE: the previous patch also replaced the following strings, but it seems like they are not needed:
// - "com.google.android.gms.chimera.GmsIntentOperationService",
// - "com.google.android.gms.phenotype.internal.IPhenotypeCallbacks",
// - "com.google.android.gms.phenotype.internal.IPhenotypeService",
// - "com.google.android.gms.phenotype.PACKAGE_NAME",
// - "com.google.android.gms.phenotype.UPDATE",
// - "com.google.android.gms.phenotype",
override fun execute(data: BytecodeData) =
// apply common microG patch
MicroGBytecodeHelper.patchBytecode(
data,
arrayOf(
MicroGBytecodeHelper.packageNameTransform(
Constants.PACKAGE_NAME,
Constants.REVANCED_PACKAGE_NAME
)
),
MicroGBytecodeHelper.PrimeMethodTransformationData(
PrimeFingerprint,
MUSIC_PACKAGE_NAME,
REVANCED_MUSIC_PACKAGE_NAME
),
listOf(
ServiceCheckFingerprint,
GooglePlayUtilityFingerprint,
CastDynamiteModuleFingerprint,
CastDynamiteModuleV2Fingerprint,
CastContextFetchFingerprint
)
).let { PatchResultSuccess() }
}

View File

@@ -0,0 +1,41 @@
package app.revanced.patches.music.misc.microg.patch.resource
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.music.misc.microg.annotations.MusicMicroGPatchCompatibility
import app.revanced.patches.music.misc.microg.shared.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.microg.shared.Constants.REVANCED_MUSIC_APP_NAME
import app.revanced.patches.music.misc.microg.shared.Constants.REVANCED_MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.microg.shared.Constants.SPOOFED_PACKAGE_NAME
import app.revanced.patches.music.misc.microg.shared.Constants.SPOOFED_PACKAGE_SIGNATURE
import app.revanced.util.microg.MicroGManifestHelper
import app.revanced.util.microg.MicroGResourceHelper
@Name("music-microg-resource-patch")
@Description("Resource patch to allow YouTube Music ReVanced to run without root and under a different package name.")
@MusicMicroGPatchCompatibility
@Version("0.0.2")
class MusicMicroGResourcePatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult {
// update manifest
MicroGResourceHelper.patchManifest(
data,
MUSIC_PACKAGE_NAME,
REVANCED_MUSIC_PACKAGE_NAME,
REVANCED_MUSIC_APP_NAME
)
// add metadata to the manifest
MicroGManifestHelper.addSpoofingMetadata(
data,
SPOOFED_PACKAGE_NAME,
SPOOFED_PACKAGE_SIGNATURE
)
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.music.misc.microg.shared
object Constants {
internal const val REVANCED_MUSIC_APP_NAME = "YouTube Music ReVanced"
internal const val REVANCED_MUSIC_PACKAGE_NAME = "app.revanced.android.apps.youtube.music"
internal const val MUSIC_PACKAGE_NAME = "com.google.android.apps.youtube.music"
internal const val SPOOFED_PACKAGE_NAME = MUSIC_PACKAGE_NAME
internal const val SPOOFED_PACKAGE_SIGNATURE = "afb0fed5eeaebdd86f56a97742f4b6b33ef59875"
}

View File

@@ -5,10 +5,9 @@ import app.revanced.patcher.annotation.Package
@Compatibility( @Compatibility(
[Package( [Package(
"com.google.android.apps.youtube.music", arrayOf("5.03.50") "com.google.android.apps.youtube.music", arrayOf("5.14.53", "5.16.51", "5.17.51", "5.21.52", "5.22.54", "5.23.50","5.25.51")
)] )]
) )
@Target(AnnotationTarget.CLASS) @Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME) @Retention(AnnotationRetention.RUNTIME)
internal annotation class BackgroundPlayCompatibility internal annotation class BackgroundPlayCompatibility

View File

@@ -14,7 +14,7 @@ import app.revanced.patches.music.premium.backgroundplay.fingerprints.Background
@Patch @Patch
@Name("background-play") @Name("background-play")
@Description("Enable playing music in the background.") @Description("Enables playing music in the background.")
@BackgroundPlayCompatibility @BackgroundPlayCompatibility
@Version("0.0.1") @Version("0.0.1")
class BackgroundPlayPatch : BytecodePatch( class BackgroundPlayPatch : BytecodePatch(

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.reddit.ad.general.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.reddit.frontpage")])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class GeneralAdsCompatibility

View File

@@ -0,0 +1,55 @@
package app.revanced.patches.reddit.ad.general.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.ad.general.annotations.GeneralAdsCompatibility
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.builder.instruction.BuilderInstruction21c
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.reference.StringReference
import org.jf.dexlib2.immutable.reference.ImmutableStringReference
@Patch
@Name("general-reddit-ads")
@Description("Removes general ads from the Reddit frontpage and subreddits.")
@GeneralAdsCompatibility
@Version("0.0.1")
class GeneralAdsPatch : BytecodePatch() {
override fun execute(data: BytecodeData): PatchResult {
data.classes.forEach { classDef ->
classDef.methods.forEach methodLoop@{ method ->
val implementation = method.implementation ?: return@methodLoop
implementation.instructions.forEachIndexed { i, instruction ->
if (instruction.opcode != Opcode.CONST_STRING) return@forEachIndexed
if (((instruction as ReferenceInstruction).reference as StringReference).string != "AdPost") return@forEachIndexed
val proxiedClass = data.proxy(classDef).resolve()
val proxiedImplementation = proxiedClass.methods.first {
it.name == method.name && it.parameterTypes.containsAll(method.parameterTypes)
}.implementation!!
var newString = "AdPost1"
if (proxiedImplementation.instructions[i - 1].opcode == Opcode.CONST_STRING) {
newString = "SubredditPost"
}
proxiedImplementation.replaceInstruction(
i, BuilderInstruction21c(
Opcode.CONST_STRING, (proxiedImplementation.instructions[i] as BuilderInstruction21c).registerA, ImmutableStringReference(newString)
)
)
}
}
}
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.reddit.layout.premiumicon.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.reddit.frontpage")])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class PremiumIconCompatibility

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.reddit.layout.premiumicon.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.reddit.layout.premiumicon.annotations.PremiumIconCompatibility
@Name("premium-icon-fingerprint")
@MatchingMethod(
"Lcom/reddit/domain/model/MyAccount;", "isPremiumSubscriber"
)
@PremiumIconCompatibility
@Version("0.0.1")
object PremiumIconFingerprint : MethodFingerprint(
"Z",
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("MyAccount;") && methodDef.name == "isPremiumSubscriber"
}
)

View File

@@ -0,0 +1,36 @@
package app.revanced.patches.reddit.layout.premiumicon.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patches.reddit.layout.premiumicon.annotations.PremiumIconCompatibility
import app.revanced.patches.reddit.layout.premiumicon.fingerprints.PremiumIconFingerprint
@Patch
@Name("premium-icon-reddit")
@Description("Unlocking Premium Icons in reddit app.")
@PremiumIconCompatibility
@Version("0.0.1")
class PremiumIconPatch : BytecodePatch(
listOf(
PremiumIconFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val method = PremiumIconFingerprint.result!!.mutableMethod
method.addInstructions(
0,
"""
const/4 v0, 0x1
return v0
"""
)
return PatchResultSuccess()
}
}

View File

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

View File

@@ -0,0 +1,70 @@
package app.revanced.patches.spotify.layout.theme.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.ResourceData
import app.revanced.patcher.patch.OptionsContainer
import app.revanced.patcher.patch.PatchOption
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import app.revanced.patches.spotify.layout.theme.annotations.ThemeCompatibility
import app.revanced.patches.youtube.misc.manifest.patch.FixLocaleConfigErrorPatch
import org.w3c.dom.Element
@Patch
@DependsOn([FixLocaleConfigErrorPatch::class])
@Name("spotify-theme")
@Description("Applies a custom theme.")
@ThemeCompatibility
@Version("0.0.1")
class ThemePatch : ResourcePatch() {
override fun execute(data: ResourceData): PatchResult {
data.xmlEditor["res/values/colors.xml"].use { editor ->
val resourcesNode = editor.file.getElementsByTagName("resources").item(0) as Element
for (i in 0 until resourcesNode.childNodes.length) {
val node = resourcesNode.childNodes.item(i) as? Element ?: continue
node.textContent = when (node.getAttribute("name")) {
"gray_7" -> backgroundColor!!
"dark_brightaccent_background_base", "dark_base_text_brightaccent", "green_light" -> accentColor!!
"dark_brightaccent_background_press" -> accentPressedColor!!
else -> continue
}
}
}
return PatchResultSuccess()
}
companion object : OptionsContainer() {
var backgroundColor: String? by option(
PatchOption.StringOption(
key = "backgroundColor",
default = "@android:color/black",
title = "Background color",
description = "The background color. Can be a hex color or a resource reference.",
)
)
var accentColor: String? by option(
PatchOption.StringOption(
key = "accentColor",
default = "#ff1ed760",
title = "Accent color",
description = "The accent color ('spotify green' by default). Can be a hex color or a resource reference.",
)
)
var accentPressedColor: String? by option(
PatchOption.StringOption(
key = "accentPressedColor",
default = "#ff169c46",
title = "Pressed accent for the dark theme",
description = "The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.",
)
)
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.spotify.premium_navbar_tab.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility([Package("com.spotify.music")])
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class PremiumNavbarTabCompatibility

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.spotify.premium_navbar_tab.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.spotify.premium_navbar_tab.annotations.PremiumNavbarTabCompatibility
@Name("premium-navbar-fingerprint")
@Version("0.0.1")
@PremiumNavbarTabCompatibility
object AddPremiumNavbarTabFingerprint : MethodFingerprint(
parameters = listOf("L", "L", "L", "L", "L", "L")
)

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.spotify.premium_navbar_tab.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.spotify.premium_navbar_tab.annotations.PremiumNavbarTabCompatibility
@Name("add-premium-navbar-tab-parent-fingerprint")
@Version("0.0.1")
@PremiumNavbarTabCompatibility
object AddPremiumNavbarTabParentFingerprint : MethodFingerprint(
strings = listOf("com.samsung.android.samsungaccount.action.REQUEST_AUTHCODE")
)

View File

@@ -0,0 +1,62 @@
package app.revanced.patches.spotify.premium_navbar_tab.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.removeInstruction
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint.Companion.resolve
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.spotify.premium_navbar_tab.annotations.PremiumNavbarTabCompatibility
import app.revanced.patches.spotify.premium_navbar_tab.fingerprints.AddPremiumNavbarTabFingerprint
import app.revanced.patches.spotify.premium_navbar_tab.fingerprints.AddPremiumNavbarTabParentFingerprint
import app.revanced.patches.youtube.misc.mapping.patch.ResourceMappingResourcePatch
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.WideLiteralInstruction
@Patch
@Name("hide-premium-navbar")
@Description("Removes the premium tab from the navbar.")
@PremiumNavbarTabCompatibility
@Version("0.0.1")
@DependsOn([ResourceMappingResourcePatch::class])
class PremiumNavbarTabPatch : BytecodePatch(
listOf(
AddPremiumNavbarTabParentFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val parentResult = AddPremiumNavbarTabParentFingerprint.result!!
AddPremiumNavbarTabFingerprint.resolve(data, parentResult.classDef)
val result = AddPremiumNavbarTabFingerprint.result!!
val method = result.mutableMethod
val methodInstructions = method.implementation!!.instructions
val lastInstructionIdx = methodInstructions.size - 1
val premiumTabId = ResourceMappingResourcePatch.resourceMappings.single{it.type == "id" && it.name == "premium_tab"}.id
var removeAmount = 2
// 2nd const remove method
for ((i, instruction) in methodInstructions.asReversed().withIndex()) {
if (instruction.opcode.ordinal != Opcode.CONST.ordinal) continue
if ((instruction as WideLiteralInstruction).wideLiteral != premiumTabId) continue
val findThreshold = 10
val constIndex = lastInstructionIdx - i
val invokeInstruction = methodInstructions.subList(constIndex, constIndex + findThreshold).first {
it.opcode.ordinal == Opcode.INVOKE_VIRTUAL_RANGE.ordinal
}
method.removeInstruction(methodInstructions.indexOf(invokeInstruction))
if (--removeAmount == 0) break
}
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.ad.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class TiktokAdsCompatibility

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.tiktok.ad.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.ad.annotations.TiktokAdsCompatibility
@Name("convert-help-v2-feeditemlist-fingerprint")
@MatchingMethod(
"Lbeancopy/ConvertHelp;",
"com${'$'}ss${'$'}ugc${'$'}aweme${'$'}proto${'$'}aweme_v2_feed_response${'$'}${'$'}com${'$'}ss${'$'}android${'$'}ugc${'$'}aweme${'$'}feed${'$'}model${'$'}FeedItemList",
)
@TiktokAdsCompatibility
@Version("0.0.1")
object ConvertHelpFeedItemListFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/ConvertHelp;") &&
methodDef.name.endsWith("${'$'}FeedItemList")
}
)

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.tiktok.ad.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.ad.annotations.TiktokAdsCompatibility
@Name("feed-item-clone-fingerprint")
@MatchingMethod(
"Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;",
"clone",
)
@TiktokAdsCompatibility
@Version("0.0.1")
object FeedItemListCloneFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/FeedItemList;") && methodDef.name == "clone"
}
)

View File

@@ -0,0 +1,57 @@
package app.revanced.patches.tiktok.ad.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.tiktok.ad.annotations.TiktokAdsCompatibility
import app.revanced.patches.tiktok.ad.fingerprints.ConvertHelpFeedItemListFingerprint
import app.revanced.patches.tiktok.ad.fingerprints.FeedItemListCloneFingerprint
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.instruction.TwoRegisterInstruction
import org.jf.dexlib2.iface.reference.FieldReference
@Patch
@Name("tiktok-ads")
@Description("Removes ads from TikTok.")
@TiktokAdsCompatibility
@Version("0.0.1")
class TiktokAdsPatch : BytecodePatch(
listOf(
FeedItemListCloneFingerprint,
ConvertHelpFeedItemListFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
listOf(
FeedItemListCloneFingerprint,
ConvertHelpFeedItemListFingerprint
).forEach { fingerprint ->
val method = fingerprint.result!!.mutableMethod
// iterate all instructions in the clone method
for ((index, instruction) in method.implementation!!.instructions.withIndex()) {
// conditions for the instruction we need
if (instruction.opcode.ordinal != Opcode.IPUT_OBJECT.ordinal) continue
val preloadAdsFieldInstruction = (instruction as? ReferenceInstruction)
if ((preloadAdsFieldInstruction?.reference as? FieldReference)?.name != "preloadAds") continue
// set null instead of the field "preloadAds"
val overrideRegister = (preloadAdsFieldInstruction as TwoRegisterInstruction).registerA
method.addInstruction(
index,
"const/4 v$overrideRegister, 0x0"
)
return@forEach
}
return PatchResultError("Can not find required instruction.")
}
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.feedfilter.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class FeedFilterCompatibility

View File

@@ -0,0 +1,23 @@
package app.revanced.patches.tiktok.feedfilter.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.feedfilter.annotations.FeedFilterCompatibility
import org.jf.dexlib2.AccessFlags
@Name("feed-api-service-fingerprint")
@MatchingMethod(
"Lcom/ss/android/ugc/aweme/feed/FeedApiService;",
"LIZ",
)
@FeedFilterCompatibility
@Version("0.0.1")
object FeedApiServiceLIZFingerprint : MethodFingerprint(
access = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC,
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/FeedApiService;") && methodDef.name == "LIZ"
}
)

View File

@@ -0,0 +1,51 @@
package app.revanced.patches.tiktok.feedfilter.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.tiktok.feedfilter.annotations.FeedFilterCompatibility
import app.revanced.patches.tiktok.feedfilter.fingerprints.FeedApiServiceLIZFingerprint
import app.revanced.patches.tiktok.misc.integrations.patch.TikTokIntegrationsPatch
import app.revanced.patches.tiktok.misc.settings.fingerprints.SettingsStatusLoadFingerprint
import app.revanced.patches.tiktok.misc.settings.patch.TikTokSettingsPatch
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
@Patch
@DependsOn([TikTokIntegrationsPatch::class, TikTokSettingsPatch::class])
@Name("tiktok-feed-filter")
@Description("Filters tiktok videos: removing ads, removing livestreams.")
@FeedFilterCompatibility
@Version("0.0.1")
class TiktokFeedFilter : BytecodePatch(
listOf(
FeedApiServiceLIZFingerprint,
SettingsStatusLoadFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val method = FeedApiServiceLIZFingerprint.result!!.mutableMethod
for ((index, instruction) in method.implementation!!.instructions.withIndex()) {
if (instruction.opcode != Opcode.RETURN_OBJECT) continue
val feedItemsRegister = (instruction as OneRegisterInstruction).registerA
method.addInstruction(
index,
"invoke-static {v$feedItemsRegister}, Lapp/revanced/tiktok/feedfilter/FeedItemsFilter;->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V"
)
break
}
val method2 = SettingsStatusLoadFingerprint.result!!.mutableMethod
method2.addInstruction(
0,
"invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsStatus;->enableFeedFilter()V"
)
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.interaction.downloads.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class DownloadsCompatibility

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.tiktok.interaction.downloads.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.interaction.downloads.annotations.DownloadsCompatibility
import org.jf.dexlib2.AccessFlags
@Name("acl-common-share-get-code")
@MatchingMethod("ACLCommonShare", "getCode")
@DownloadsCompatibility
@Version("0.0.1")
object ACLCommonShareFingerprint : MethodFingerprint(
"I",
AccessFlags.PUBLIC or AccessFlags.FINAL,
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/ACLCommonShare;") &&
methodDef.name == "getCode"
}
)

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.tiktok.interaction.downloads.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.interaction.downloads.annotations.DownloadsCompatibility
import org.jf.dexlib2.AccessFlags
@Name("acl-common-share-get-show-type")
@MatchingMethod("ACLCommonShare", "getShowType")
@DownloadsCompatibility
@Version("0.0.1")
object ACLCommonShareFingerprint2 : MethodFingerprint(
"I",
AccessFlags.PUBLIC or AccessFlags.FINAL,
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/ACLCommonShare;") &&
methodDef.name == "getShowType"
}
)

View File

@@ -0,0 +1,22 @@
package app.revanced.patches.tiktok.interaction.downloads.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.interaction.downloads.annotations.DownloadsCompatibility
import org.jf.dexlib2.AccessFlags
@Name("acl-common-share-get-transcode")
@MatchingMethod("ACLCommonShare", "getTranscode")
@DownloadsCompatibility
@Version("0.0.1")
object ACLCommonShareFingerprint3 : MethodFingerprint(
"I",
AccessFlags.PUBLIC or AccessFlags.FINAL,
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/ACLCommonShare;") &&
methodDef.name == "getTranscode"
}
)

View File

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

View File

@@ -0,0 +1,127 @@
package app.revanced.patches.tiktok.interaction.downloads.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.data.impl.toMethodWalker
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.extensions.replaceInstructions
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.tiktok.interaction.downloads.annotations.DownloadsCompatibility
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint2
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint3
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.DownloadPathParentFingerprint
import app.revanced.patches.tiktok.misc.settings.fingerprints.SettingsStatusLoadFingerprint
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.reference.StringReference
@Patch
@Name("tiktok-download")
@Description("Removes download restrictions and changes the default path to download to.")
@DownloadsCompatibility
@Version("0.0.1")
class DownloadsPatch : BytecodePatch(
listOf(
ACLCommonShareFingerprint,
ACLCommonShareFingerprint2,
ACLCommonShareFingerprint3,
DownloadPathParentFingerprint,
SettingsStatusLoadFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val method1 = ACLCommonShareFingerprint.result!!.mutableMethod
method1.replaceInstructions(
0,
"""
const/4 v0, 0x0
return v0
"""
)
val method2 = ACLCommonShareFingerprint2.result!!.mutableMethod
method2.replaceInstructions(
0,
"""
const/4 v0, 0x2
return v0
"""
)
//Download videos without watermark.
val method3 = ACLCommonShareFingerprint3.result!!.mutableMethod
method3.addInstructions(
0,
"""
invoke-static {}, Lapp/revanced/tiktok/download/DownloadsPatch;->shouldRemoveWatermark()Z
move-result v0
if-eqz v0, :noremovewatermark
const/4 v0, 0x1
return v0
:noremovewatermark
nop
"""
)
//Change the download path patch
val method4 = DownloadPathParentFingerprint.result!!.mutableMethod
val implementation4 = method4.implementation
val instructions = implementation4!!.instructions
var targetOffset = -1
//Search for the target method called instruction offset.
for ((index, instruction) in instructions.withIndex()) {
if (instruction.opcode != Opcode.CONST_STRING) continue
val reference = (instruction as ReferenceInstruction).reference as StringReference
if (reference.string != "video/mp4") continue
val targetInstruction = instructions[index + 1]
if (targetInstruction.opcode != Opcode.INVOKE_STATIC) continue
targetOffset = index + 1
break
}
if (targetOffset == -1) return PatchResultError("Can not find download path uri method.")
//Change videos' download path.
val downloadUriMethod = data
.toMethodWalker(DownloadPathParentFingerprint.result!!.method)
.nextMethod(targetOffset, true)
.getMethod() as MutableMethod
downloadUriMethod.implementation!!.instructions.forEachIndexed { index, instruction ->
if (instruction.opcode == Opcode.SGET_OBJECT) {
val overrideRegister = (instruction as OneRegisterInstruction).registerA
downloadUriMethod.addInstructions(
index + 1,
"""
invoke-static {}, Lapp/revanced/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String;
move-result-object v$overrideRegister
"""
)
}
if (instruction.opcode == Opcode.CONST_STRING) {
val string = ((instruction as ReferenceInstruction).reference as StringReference).string
if (string.contains("/Camera")) {
val overrideRegister = (instruction as OneRegisterInstruction).registerA
val overrideString = string.replace("/Camera", "")
downloadUriMethod.replaceInstruction(
index,
"""
const-string v$overrideRegister, "$overrideString"
"""
)
}
}
}
val method5 = SettingsStatusLoadFingerprint.result!!.mutableMethod
method5.addInstruction(
0,
"invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsStatus;->enableDownload()V"
)
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.interaction.seekbar.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class SeekbarCompatibility

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.tiktok.interaction.seekbar.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.interaction.seekbar.annotations.SeekbarCompatibility
import org.jf.dexlib2.AccessFlags
@Name("aweme-get-video-control")
@MatchingMethod("Aweme", "getVideoControl")
@SeekbarCompatibility
@Version("0.0.1")
object AwemeGetVideoControlFingerprint : MethodFingerprint(
"L",
AccessFlags.PUBLIC.value,
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/Aweme;") && methodDef.name == "getVideoControl"
}
)

View File

@@ -0,0 +1,47 @@
package app.revanced.patches.tiktok.interaction.seekbar.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.tiktok.interaction.seekbar.annotations.SeekbarCompatibility
import app.revanced.patches.tiktok.interaction.seekbar.fingerprints.*
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.builder.instruction.BuilderInstruction11n
import org.jf.dexlib2.builder.instruction.BuilderInstruction22c
@Patch
@Name("tiktok-seekbar")
@Description("Show progress bar for all video.")
@SeekbarCompatibility
@Version("0.0.1")
class TiktokSeekbarPatch : BytecodePatch(
listOf(
AwemeGetVideoControlFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
//Get VideoControl FieldReference
val videoControl = data.findClass { it.type.endsWith("/VideoControl;") }
?: return PatchResultError("Can not find target class")
val fieldList = videoControl.immutableClass.fields.associateBy { field -> field.name }
val method = AwemeGetVideoControlFingerprint.result!!.mutableMethod
val implementation = method.implementation!!
implementation.addInstructions(
1, listOf(
BuilderInstruction11n(Opcode.CONST_4, 1, 1),
BuilderInstruction22c(Opcode.IPUT, 1, 0, fieldList["showProgressBar"]!!),
BuilderInstruction22c(Opcode.IPUT, 1, 0, fieldList["draftProgressBar"]!!)
)
)
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.interaction.speed.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class SpeedCompatibility

View File

@@ -0,0 +1,24 @@
package app.revanced.patches.tiktok.interaction.speed.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.interaction.speed.annotations.SpeedCompatibility
import org.jf.dexlib2.AccessFlags
@Name("speed-control-parent-fingerprint")
@MatchingMethod("LX/4cP;", "LJIILL")
@SpeedCompatibility
@Version("0.0.1")
object SpeedControlParentFingerprint : MethodFingerprint(
returnType = "L",
access = AccessFlags.PRIVATE or AccessFlags.FINAL,
parameters = listOf(
"L"
),
strings = listOf(
"playback_speed"
)
)

View File

@@ -0,0 +1,48 @@
package app.revanced.patches.tiktok.interaction.speed.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.data.impl.toMethodWalker
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.tiktok.interaction.speed.annotations.SpeedCompatibility
import app.revanced.patches.tiktok.interaction.speed.fingerprints.SpeedControlParentFingerprint
import org.jf.dexlib2.Opcode
@Patch
@Name("tiktok-speed")
@Description("Enables the playback speed option for all videos.")
@SpeedCompatibility
@Version("0.0.1")
class SpeedPatch : BytecodePatch(
listOf(
SpeedControlParentFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
val parentMethod = SpeedControlParentFingerprint.result!!.mutableMethod
val parentMethodInstructions = parentMethod.implementation!!.instructions
for ((index, instruction) in parentMethodInstructions.withIndex()) {
if (instruction.opcode != Opcode.INVOKE_VIRTUAL) continue
val isSpeedEnableMethod = data
.toMethodWalker(parentMethod)
.nextMethod(index, true)
.getMethod() as MutableMethod
isSpeedEnableMethod.addInstructions(
0,
"""
const/4 v0, 0x1
return v0
"""
)
break
}
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.misc.forcelogin.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class DisableForceLoginCompatibility

View File

@@ -0,0 +1,18 @@
package app.revanced.patches.tiktok.misc.forcelogin.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.misc.forcelogin.annotations.DisableForceLoginCompatibility
@Name("mandatory-login-service-fingerprint")
@MatchingMethod("/MandatoryLoginService;", "enableForcedLogin")
@DisableForceLoginCompatibility
@Version("0.0.1")
object MandatoryLoginServiceFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/MandatoryLoginService;") &&
methodDef.name == "enableForcedLogin"
}
)

View File

@@ -0,0 +1,18 @@
package app.revanced.patches.tiktok.misc.forcelogin.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.misc.forcelogin.annotations.DisableForceLoginCompatibility
@Name("mandatory-login-service-fingerprint2")
@MatchingMethod("/MandatoryLoginService;", "shouldShowForcedLogin")
@DisableForceLoginCompatibility
@Version("0.0.1")
object MandatoryLoginServiceFingerprint2 : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/MandatoryLoginService;") &&
methodDef.name == "shouldShowForcedLogin"
}
)

View File

@@ -0,0 +1,43 @@
package app.revanced.patches.tiktok.misc.forcelogin.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.tiktok.misc.forcelogin.annotations.DisableForceLoginCompatibility
import app.revanced.patches.tiktok.misc.forcelogin.fingerprints.MandatoryLoginServiceFingerprint
import app.revanced.patches.tiktok.misc.forcelogin.fingerprints.MandatoryLoginServiceFingerprint2
@Patch
@Name("tiktok-force-login")
@Description("Do not force login.")
@DisableForceLoginCompatibility
@Version("0.0.1")
class DisableForceLoginPatch : BytecodePatch(
listOf(
MandatoryLoginServiceFingerprint,
MandatoryLoginServiceFingerprint2
)
) {
override fun execute(data: BytecodeData): PatchResult {
listOf(
MandatoryLoginServiceFingerprint,
MandatoryLoginServiceFingerprint2
).forEach { fingerprint ->
val method = fingerprint.result!!.mutableMethod
method.addInstructions(
0,
"""
const/4 v0, 0x0
return v0
"""
)
}
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.misc.integrations.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class TikTokIntegrationsCompatibility

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.tiktok.misc.integrations.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.misc.integrations.annotations.TikTokIntegrationsCompatibility
@Name("init-fingerprint")
@MatchingMethod(
"Lcom/ss/android/ugc/aweme/app/host/AwemeHostApplication;", "onCreate"
)
@TikTokIntegrationsCompatibility
@Version("0.0.1")
object InitFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/AwemeHostApplication;") &&
methodDef.name == "onCreate"
}
)

View File

@@ -0,0 +1,38 @@
package app.revanced.patches.tiktok.misc.integrations.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.tiktok.misc.integrations.annotations.TikTokIntegrationsCompatibility
import app.revanced.patches.tiktok.misc.integrations.fingerprints.InitFingerprint
@Name("tiktok-integrations")
@Description("Applies mandatory patches to implement the ReVanced integrations into the application.")
@TikTokIntegrationsCompatibility
@Version("0.0.1")
class TikTokIntegrationsPatch : BytecodePatch(
listOf(
InitFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
if (data.findClass("Lapp/revanced/tiktok/utils/ReVancedUtils") == null)
return PatchResultError("Integrations have not been merged yet. This patch can not succeed without the integrations.")
val result = InitFingerprint.result!!
val method = result.mutableMethod
val implementation = method.implementation!!
val count = implementation.registerCount - 1
method.addInstruction(
0, "sput-object v$count, Lapp/revanced/tiktok/utils/ReVancedUtils;->context:Landroid/content/Context;"
)
return PatchResultSuccess()
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.patches.tiktok.misc.settings.annotations
import app.revanced.patcher.annotation.Compatibility
import app.revanced.patcher.annotation.Package
@Compatibility(
[
Package("com.ss.android.ugc.trill"),
Package("com.zhiliaoapp.musically")
]
)
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
internal annotation class TikTokSettingsCompatibility

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.tiktok.misc.settings.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.misc.settings.annotations.TikTokSettingsCompatibility
@Name("ad-personalization-activity-fingerprint")
@MatchingMethod(
"Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;",
"onCreate"
)
@TikTokSettingsCompatibility
@Version("0.0.1")
object AdPersonalizationActivityFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/AdPersonalizationActivity;") &&
methodDef.name == "onCreate"
}
)

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.tiktok.misc.settings.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.misc.settings.annotations.TikTokSettingsCompatibility
@Name("copyright-settings-string-fingerprint")
@MatchingMethod(
"Lcom/ss/android/ugc/aweme/setting/ui/SettingNewVersionFragment;",
"onViewCreated"
)
@TikTokSettingsCompatibility
@Version("0.0.1")
object CopyRightSettingsStringFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("/SettingNewVersionFragment;") &&
methodDef.name == "onViewCreated"
}
)

View File

@@ -0,0 +1,21 @@
package app.revanced.patches.tiktok.misc.settings.fingerprints
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.fingerprint.method.annotation.MatchingMethod
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import app.revanced.patches.tiktok.misc.settings.annotations.TikTokSettingsCompatibility
@Name("settings-status-load-fingerprint")
@MatchingMethod(
"Lapp/revanced/tiktok/settingsmenu/SettingsStatus;",
"load"
)
@TikTokSettingsCompatibility
@Version("0.0.1")
object SettingsStatusLoadFingerprint : MethodFingerprint(
customFingerprint = { methodDef ->
methodDef.definingClass.endsWith("Lapp/revanced/tiktok/settingsmenu/SettingsStatus;") &&
methodDef.name == "load"
}
)

View File

@@ -0,0 +1,98 @@
package app.revanced.patches.tiktok.misc.settings.patch
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.impl.BytecodeData
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultError
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.patch.impl.BytecodePatch
import app.revanced.patches.tiktok.misc.integrations.patch.TikTokIntegrationsPatch
import app.revanced.patches.tiktok.misc.settings.annotations.TikTokSettingsCompatibility
import app.revanced.patches.tiktok.misc.settings.fingerprints.AdPersonalizationActivityFingerprint
import app.revanced.patches.tiktok.misc.settings.fingerprints.CopyRightSettingsStringFingerprint
import org.jf.dexlib2.Opcode
import org.jf.dexlib2.iface.instruction.OneRegisterInstruction
import org.jf.dexlib2.iface.instruction.ReferenceInstruction
import org.jf.dexlib2.iface.instruction.formats.Instruction35c
import org.jf.dexlib2.iface.reference.MethodReference
import org.jf.dexlib2.iface.reference.StringReference
@Patch
@DependsOn([TikTokIntegrationsPatch::class])
@Name("tiktok-settings")
@Description("Add settings menu to TikTok.")
@TikTokSettingsCompatibility
@Version("0.0.1")
class TikTokSettingsPatch : BytecodePatch(
listOf(
AdPersonalizationActivityFingerprint,
CopyRightSettingsStringFingerprint
)
) {
override fun execute(data: BytecodeData): PatchResult {
//Replace string `Copyright Policy` to 'Revanced Settings` in TikTok settings.
val method1 = CopyRightSettingsStringFingerprint.result!!.mutableMethod
val implementation1 = method1.implementation!!
for ((index, instruction) in implementation1.instructions.withIndex()) {
if (instruction.opcode != Opcode.CONST_STRING) continue
val string = ((instruction as ReferenceInstruction).reference as StringReference).string
if (string != "copyright_policy") continue
var targetIndex = index
while (targetIndex >= 0) {
targetIndex--
val invokeInstruction = implementation1.instructions[targetIndex]
if (invokeInstruction.opcode != Opcode.INVOKE_VIRTUAL) continue
val methodName = ((invokeInstruction as Instruction35c).reference as MethodReference).name
if (methodName != "getString") continue
val resultInstruction = implementation1.instructions[targetIndex + 1]
if (resultInstruction.opcode != Opcode.MOVE_RESULT_OBJECT) continue
val overrideRegister = (resultInstruction as OneRegisterInstruction).registerA
method1.replaceInstruction(
targetIndex + 1,
"""
const-string v$overrideRegister, "Revanced Settings"
"""
)
break
}
//Change onClick to start settings activity.
val clickInstruction = implementation1.instructions[index - 1]
if (clickInstruction.opcode != Opcode.INVOKE_DIRECT)
return PatchResultError("Can not find click listener.")
val clickClass = ((clickInstruction as ReferenceInstruction).reference as MethodReference).definingClass
val mutableClickClass = data.findClass(clickClass)!!.resolve()
val mutableOnClickMethod = mutableClickClass.methods.first {
it.name == "onClick"
}
mutableOnClickMethod.addInstructions(
0,
"""
invoke-static {}, Lapp/revanced/tiktok/settingsmenu/SettingsMenu;->startSettingsActivity()V
return-void
"""
)
break
}
//Implement revanced settings screen in `AdPersonalizationActivity`
val method2 = AdPersonalizationActivityFingerprint.result!!.mutableMethod
for ((index, instruction) in method2.implementation!!.instructions.withIndex()) {
if (instruction.opcode != Opcode.INVOKE_SUPER) continue
val thisRegister = (instruction as Instruction35c).registerC
method2.addInstructions(
index + 1,
"""
invoke-static {v$thisRegister}, Lapp/revanced/tiktok/settingsmenu/SettingsMenu;->initializeSettings(Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;)V
return-void
"""
)
break
}
return PatchResultSuccess()
}
}

Some files were not shown because too many files have changed in this diff Show More