1
mirror of https://github.com/revanced/revanced-integrations synced 2025-11-19 03:23:27 +01:00

Compare commits

...

117 Commits

Author SHA1 Message Date
semantic-release-bot
a87e366035 chore(release): 0.77.0 [skip ci]
# [0.77.0](https://github.com/revanced/revanced-integrations/compare/v0.76.0...v0.77.0) (2022-11-24)

### Bug Fixes

* invalid syntax error ([d4a23ed](d4a23ed5c9))

### Features

* **youtube/general-ads:** hide movie ad from search ([767201c](767201ce05))
2022-11-24 16:10:29 +00:00
oSumAtrIX
d4a23ed5c9 fix: invalid syntax error 2022-11-24 17:06:53 +01:00
oSumAtrIX
767201ce05 feat(youtube/general-ads): hide movie ad from search 2022-11-24 16:45:25 +01:00
semantic-release-bot
64cfe9c579 chore(release): 0.76.0 [skip ci]
# [0.76.0](https://github.com/revanced/revanced-integrations/compare/v0.75.0...v0.76.0) (2022-11-22)

### Bug Fixes

* **youtube/general-ads:** hide reels shelf ([1f48749](1f48749958))
* **youtube/general-ads:** make restarting mandatory when toggling shorts ([25978ae](25978ae4a4))

### Features

* **youtube/debugging:** do not require restarting on toggle ([ee1f895](ee1f895e87))
2022-11-22 22:46:21 +00:00
oSumAtrIX
25978ae4a4 fix(youtube/general-ads): make restarting mandatory when toggling shorts 2022-11-22 23:41:41 +01:00
oSumAtrIX
1f48749958 fix(youtube/general-ads): hide reels shelf 2022-11-22 23:40:36 +01:00
oSumAtrIX
ee1f895e87 feat(youtube/debugging): do not require restarting on toggle 2022-11-22 19:45:16 +01:00
semantic-release-bot
645669bbc0 chore(release): 0.75.0 [skip ci]
# [0.75.0](https://github.com/revanced/revanced-integrations/compare/v0.74.1...v0.75.0) (2022-11-21)

### Features

* **twitch:** integrations code for patches ([#216](https://github.com/revanced/revanced-integrations/issues/216)) ([d4c3b74](d4c3b74a9a))
2022-11-21 21:57:35 +00:00
Tim Schneeberger
d4c3b74a9a feat(twitch): integrations code for patches (#216)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-11-21 22:53:12 +01:00
semantic-release-bot
24367cea3f chore(release): 0.74.1 [skip ci]
## [0.74.1](https://github.com/revanced/revanced-integrations/compare/v0.74.0...v0.74.1) (2022-11-20)

### Bug Fixes

* **youtube/general-ads:** hide bytecode home ad view ([c3e88c7](c3e88c79e9))
2022-11-20 23:30:14 +00:00
oSumAtrIX
1e3970c3f2 refactor(youtube/general-ads): remove comment 2022-11-21 00:25:42 +01:00
oSumAtrIX
c3e88c79e9 fix(youtube/general-ads): hide bytecode home ad view 2022-11-21 00:25:41 +01:00
oSumAtrIX
b8f0e632c1 refactor(youtube/litho-filter): move classes to their respective file 2022-11-21 00:25:41 +01:00
semantic-release-bot
c0c778b3e6 chore(release): 0.74.0 [skip ci]
# [0.74.0](https://github.com/revanced/revanced-integrations/compare/v0.73.0...v0.74.0) (2022-11-20)

### Features

* **youtube:** `disable-zoom-haptics` patch ([#217](https://github.com/revanced/revanced-integrations/issues/217)) ([fe74f6d](fe74f6d8a6))
2022-11-20 14:05:44 +00:00
aliernfrog
fe74f6d8a6 feat(youtube): disable-zoom-haptics patch (#217) 2022-11-20 15:02:08 +01:00
semantic-release-bot
5f1e35ae36 chore(release): 0.73.0 [skip ci]
# [0.73.0](https://github.com/revanced/revanced-integrations/compare/v0.72.0...v0.73.0) (2022-11-20)

### Features

* **youtube/general-ads:** block the separator by its identifier ([6ceff7c](6ceff7c9b3))
2022-11-20 01:53:33 +00:00
oSumAtrIX
6ceff7c9b3 feat(youtube/general-ads): block the separator by its identifier 2022-11-20 02:49:14 +01:00
semantic-release-bot
d9349d4e88 chore(release): 0.72.0 [skip ci]
# [0.72.0](https://github.com/revanced/revanced-integrations/compare/v0.71.0...v0.72.0) (2022-11-19)

### Bug Fixes

* check if filter string is empty ([6604030](66040302a9))
* **youtube/general-ads:** hide ads with buttons ([2c8b234](2c8b23426f))

### Features

* block rule of type `CustomBlockRule` ([571cf12](571cf12dca))
* **youtube/general-ads:** custom component filter ([72a3cd0](72a3cd0fac))
* **youtube/general-ads:** do not require to reload on general ads switch ([6272e4b](6272e4b467))
* **youtube/general-ads:** hide gray separators ([cf892de](cf892de4bb))
2022-11-19 22:36:35 +00:00
oSumAtrIX
b59ee31d57 refactor(youtube/general-ads): restructure class GeneralAdsPatch 2022-11-19 23:32:33 +01:00
oSumAtrIX
2c8b23426f fix(youtube/general-ads): hide ads with buttons 2022-11-19 23:30:48 +01:00
oSumAtrIX
72a3cd0fac feat(youtube/general-ads): custom component filter 2022-11-19 23:30:01 +01:00
oSumAtrIX
6272e4b467 feat(youtube/general-ads): do not require to reload on general ads switch 2022-11-19 23:29:09 +01:00
oSumAtrIX
cf892de4bb feat(youtube/general-ads): hide gray separators 2022-11-19 23:28:45 +01:00
oSumAtrIX
e978ed2c14 refactor: move Extensions.any to BlockRule.contains 2022-11-19 23:25:58 +01:00
oSumAtrIX
570f9eaba1 refactor: protect fields of Filter 2022-11-19 23:25:14 +01:00
oSumAtrIX
571cf12dca feat: block rule of type CustomBlockRule 2022-11-19 23:24:25 +01:00
oSumAtrIX
09c7605f1f refactor: omit unnecessary String.valueOf call 2022-11-19 23:23:09 +01:00
oSumAtrIX
66040302a9 fix: check if filter string is empty 2022-11-19 23:22:34 +01:00
oSumAtrIX
98b31c17b9 refactor(youtube/general-ads): remove unused imports 2022-11-19 22:41:30 +01:00
oSumAtrIX
c517c03e6f refactor(youtube/general-ads): remove unused class 2022-11-18 02:37:38 +01:00
semantic-release-bot
f10b202c93 chore(release): 0.71.0 [skip ci]
# [0.71.0](https://github.com/revanced/revanced-integrations/compare/v0.70.0...v0.71.0) (2022-11-15)

### Bug Fixes

* **youtube/general-ads:** do not force to restart on general ads switches ([0a90289](0a90289dc5))

### Features

* **youtube/general-ads:** hide chapter teaser under videos ([3fb337b](3fb337b856))
* **youtube/general-ads:** hide shorts in search ([d82b989](d82b9898a8))
2022-11-15 01:39:12 +00:00
oSumAtrIX
3fb337b856 feat(youtube/general-ads): hide chapter teaser under videos 2022-11-15 02:35:05 +01:00
oSumAtrIX
d82b9898a8 feat(youtube/general-ads): hide shorts in search 2022-11-15 02:35:05 +01:00
oSumAtrIX
0a90289dc5 fix(youtube/general-ads): do not force to restart on general ads switches 2022-11-15 02:35:04 +01:00
semantic-release-bot
dfd6e7fcce chore(release): 0.70.0 [skip ci]
# [0.70.0](https://github.com/revanced/revanced-integrations/compare/v0.69.2...v0.70.0) (2022-11-14)

### Bug Fixes

* **youtube/general-ads:** do not force to restart on general ads switches ([7f18520](7f18520646))

### Features

* **youtube/general-ads:** hide self sponsored cards ([e93ce3e](e93ce3eaa9))
2022-11-14 23:59:04 +00:00
oSumAtrIX
e93ce3eaa9 feat(youtube/general-ads): hide self sponsored cards 2022-11-15 00:53:12 +01:00
oSumAtrIX
695c59efd4 refactor(youtube): properly separate litho filter patches 2022-11-15 00:46:12 +01:00
oSumAtrIX
22bc4405cf refactor(youtube/general-ads): reformat code 2022-11-15 00:27:22 +01:00
oSumAtrIX
63ee425050 refactor(youtube/general-ads): remove unused setting 2022-11-15 00:27:01 +01:00
oSumAtrIX
7f18520646 fix(youtube/general-ads): do not force to restart on general ads switches 2022-11-15 00:26:41 +01:00
semantic-release-bot
d18bc1856b chore(release): 0.69.2 [skip ci]
## [0.69.2](https://github.com/revanced/revanced-integrations/compare/v0.69.1...v0.69.2) (2022-11-14)

### Bug Fixes

* **youtube/general-ads-patch:** revert reducing filter exclusions ([af86dd8](af86dd8ec6))
2022-11-14 21:05:21 +00:00
oSumAtrIX
af86dd8ec6 fix(youtube/general-ads-patch): revert reducing filter exclusions 2022-11-14 22:00:45 +01:00
semantic-release-bot
2ebadaf07f chore(release): 0.69.1 [skip ci]
## [0.69.1](https://github.com/revanced/revanced-integrations/compare/v0.69.0...v0.69.1) (2022-11-14)

### Bug Fixes

* **youtube/theme:** revert comment box background color hook ([#210](https://github.com/revanced/revanced-integrations/issues/210)) ([197f003](197f0034a1))
2022-11-14 15:13:51 +00:00
oSumAtrIX
197f0034a1 fix(youtube/theme): revert comment box background color hook (#210)
This reverts commit f8cb38e57a.
2022-11-14 16:10:15 +01:00
semantic-release-bot
06c5a9b2b8 chore(release): 0.69.0 [skip ci]
# [0.69.0](https://github.com/revanced/revanced-integrations/compare/v0.68.3...v0.69.0) (2022-11-14)

### Features

* **youtube/theme:** color explore drawer background ([#203](https://github.com/revanced/revanced-integrations/issues/203)) ([cb40408](cb404086ad))
2022-11-14 14:56:06 +00:00
OxrxL
cb404086ad feat(youtube/theme): color explore drawer background (#203)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-11-14 15:51:51 +01:00
semantic-release-bot
18192ac73e chore(release): 0.68.3 [skip ci]
## [0.68.3](https://github.com/revanced/revanced-integrations/compare/v0.68.2...v0.68.3) (2022-11-13)

### Bug Fixes

* **youtube/general-ads-patch:** exclude playlists wrapper from filtering ([#206](https://github.com/revanced/revanced-integrations/issues/206)) ([e357ac6](e357ac664b))
2022-11-13 22:20:39 +00:00
OxrxL
e357ac664b fix(youtube/general-ads-patch): exclude playlists wrapper from filtering (#206) 2022-11-13 23:17:00 +01:00
semantic-release-bot
2f2a595c89 chore(release): 0.68.2 [skip ci]
## [0.68.2](https://github.com/revanced/revanced-integrations/compare/v0.68.1...v0.68.2) (2022-11-13)

### Performance Improvements

* **youtube/general-ads-patch:** reduce amount of components to filter ([#204](https://github.com/revanced/revanced-integrations/issues/204)) ([502feaf](502feaf444))
2022-11-13 19:19:12 +00:00
OxrxL
502feaf444 perf(youtube/general-ads-patch): reduce amount of components to filter (#204) 2022-11-13 20:15:49 +01:00
semantic-release-bot
b4e03412ee chore(release): 0.68.1 [skip ci]
## [0.68.1](https://github.com/revanced/revanced-integrations/compare/v0.68.0...v0.68.1) (2022-11-13)

### Bug Fixes

* **youtube/theme:** return correct color value ([#202](https://github.com/revanced/revanced-integrations/issues/202)) ([f8cb38e](f8cb38e57a))
2022-11-13 03:50:43 +00:00
OxrxL
f8cb38e57a fix(youtube/theme): return correct color value (#202) 2022-11-13 04:46:57 +01:00
semantic-release-bot
9e5e81875a chore(release): 0.68.0 [skip ci]
# [0.68.0](https://github.com/revanced/revanced-integrations/compare/v0.67.2...v0.68.0) (2022-11-09)

### Features

* **youtube:** `open-links-directly` patch ([#201](https://github.com/revanced/revanced-integrations/issues/201)) ([c3c1656](c3c16563ea))
2022-11-09 20:46:31 +00:00
johnconner122
c3c16563ea feat(youtube): open-links-directly patch (#201) 2022-11-09 21:42:24 +01:00
semantic-release-bot
302b57d8f0 chore(release): 0.67.2 [skip ci]
## [0.67.2](https://github.com/revanced/revanced-integrations/compare/v0.67.1...v0.67.2) (2022-11-08)

### Bug Fixes

* **youtube/hide-endscreen-cards:** restore functionality ([#200](https://github.com/revanced/revanced-integrations/issues/200)) ([d866558](d86655874b))
2022-11-08 17:11:07 +00:00
OxrxL
d86655874b fix(youtube/hide-endscreen-cards): restore functionality (#200)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-11-08 18:07:30 +01:00
semantic-release-bot
cc2bab4e39 chore(release): 0.67.1 [skip ci]
## [0.67.1](https://github.com/revanced/revanced-integrations/compare/v0.67.0...v0.67.1) (2022-11-07)

### Bug Fixes

* **youtube/hide-info-cards:** remove initial popup of info-cards ([#199](https://github.com/revanced/revanced-integrations/issues/199)) ([85971bc](85971bcd5e))
2022-11-07 23:15:52 +00:00
OxrxL
85971bcd5e fix(youtube/hide-info-cards): remove initial popup of info-cards (#199)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-11-08 00:11:49 +01:00
semantic-release-bot
f475c28f3d chore(release): 0.67.0 [skip ci]
# [0.67.0](https://github.com/revanced/revanced-integrations/compare/v0.66.0...v0.67.0) (2022-11-05)

### Bug Fixes

* **fix-playback:** seek to maximum end ([fd69010](fd69010def))
* remove left over not existing code references ([ac81695](ac81695747))

### Features

* **video-information:** hook video time ([6aa0ca9](6aa0ca9556))
2022-11-05 23:04:19 +00:00
oSumAtrIX
ac81695747 fix: remove left over not existing code references 2022-11-06 00:00:54 +01:00
Nico Mexis
3427f885fb build: update workflow actions (#198) [skip ci] 2022-11-05 15:25:38 +01:00
oSumAtrIX
9bdac3356d refactor: move classes to correct packages & name them properly 2022-11-05 06:25:19 +01:00
oSumAtrIX
fd69010def fix(fix-playback): seek to maximum end 2022-11-05 06:24:32 +01:00
oSumAtrIX
6aa0ca9556 feat(video-information): hook video time 2022-11-05 06:24:07 +01:00
oSumAtrIX
98eaf9c3f2 refactor: remove unused classes 2022-11-05 03:19:09 +01:00
oSumAtrIX
8e36da0b19 refactor(youtube/general-ads): fix settings enum name 2022-11-05 02:53:33 +01:00
semantic-release-bot
1433b34c7e chore(release): 0.66.0 [skip ci]
# [0.66.0](https://github.com/revanced/revanced-integrations/compare/v0.65.0...v0.66.0) (2022-11-01)

### Features

* **youtube:** bump patches compatibility to v17.43.36 ([#194](https://github.com/revanced/revanced-integrations/issues/194)) ([6da66be](6da66be067))
2022-11-01 17:47:41 +00:00
OxrxL
6da66be067 feat(youtube): bump patches compatibility to v17.43.36 (#194) 2022-11-01 18:44:13 +01:00
semantic-release-bot
b5a93a0cd9 chore(release): 0.65.0 [skip ci]
# [0.65.0](https://github.com/revanced/revanced-integrations/compare/v0.64.1...v0.65.0) (2022-11-01)

### Features

* **youtube/fix-playback:** check faster for video length ([ac69b36](ac69b36773))
2022-11-01 06:32:11 +00:00
oSumAtrIX
ac69b36773 feat(youtube/fix-playback): check faster for video length 2022-11-01 07:28:34 +01:00
semantic-release-bot
81d3afd065 chore(release): 0.64.1 [skip ci]
## [0.64.1](https://github.com/revanced/revanced-integrations/compare/v0.64.0...v0.64.1) (2022-11-01)

### Bug Fixes

* **youtube/video-ads:** add switch to temporarily fix buffering issues ([8b4bed8](8b4bed8ab3))
2022-11-01 06:14:56 +00:00
oSumAtrIX
8b4bed8ab3 fix(youtube/video-ads): add switch to temporarily fix buffering issues 2022-11-01 07:11:14 +01:00
semantic-release-bot
b13d692ef1 chore(release): 0.64.0 [skip ci]
# [0.64.0](https://github.com/revanced/revanced-integrations/compare/v0.63.1...v0.64.0) (2022-10-30)

### Features

* `hide-watch-in-vr` patch ([#191](https://github.com/revanced/revanced-integrations/issues/191)) ([fb20ae1](fb20ae19e8))
2022-10-30 12:05:49 +00:00
inotia00
fb20ae19e8 feat: hide-watch-in-vr patch (#191) 2022-10-30 13:02:22 +01:00
semantic-release-bot
889a7d8460 chore(release): 0.63.1 [skip ci]
## [0.63.1](https://github.com/revanced/revanced-integrations/compare/v0.63.0...v0.63.1) (2022-10-30)

### Bug Fixes

* **youtube/general-ads-patch:** `BlockRule` for comments on old and new layout ([#192](https://github.com/revanced/revanced-integrations/issues/192)) ([d28d657](d28d65734e))
2022-10-30 11:56:02 +00:00
OxrxL
d28d65734e fix(youtube/general-ads-patch): BlockRule for comments on old and new layout (#192)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-30 12:51:41 +01:00
semantic-release-bot
1c021b1a50 chore(release): 0.63.0 [skip ci]
# [0.63.0](https://github.com/revanced/revanced-integrations/compare/v0.62.0...v0.63.0) (2022-10-29)

### Features

* **youtube/sponsorblock:** skip segments once automatically ([#190](https://github.com/revanced/revanced-integrations/issues/190)) ([06bebd7](06bebd7017))
2022-10-29 21:18:41 +00:00
thebestnom
06bebd7017 feat(youtube/sponsorblock): skip segments once automatically (#190) 2022-10-29 23:14:20 +02:00
semantic-release-bot
d745e29395 chore(release): 0.62.0 [skip ci]
# [0.62.0](https://github.com/revanced/revanced-integrations/compare/v0.61.0...v0.62.0) (2022-10-29)

### Features

* **youtube/comments:** hide shorts comments button ([#188](https://github.com/revanced/revanced-integrations/issues/188)) ([69a585d](69a585da6f))
2022-10-29 14:06:18 +00:00
OxrxL
69a585da6f feat(youtube/comments): hide shorts comments button (#188) 2022-10-29 16:02:14 +02:00
semantic-release-bot
7050cefe10 chore(release): 0.61.0 [skip ci]
# [0.61.0](https://github.com/revanced/revanced-integrations/compare/v0.60.0...v0.61.0) (2022-10-29)

### Features

* **youtube/microg-support:** handle availability of Vanced MicroG ([afa9d3c](afa9d3cbb1))
2022-10-29 01:07:10 +00:00
oSumAtrIX
afa9d3cbb1 feat(youtube/microg-support): handle availability of Vanced MicroG 2022-10-29 03:03:43 +02:00
semantic-release-bot
6762ea4178 chore(release): 0.60.0 [skip ci]
# [0.60.0](https://github.com/revanced/revanced-integrations/compare/v0.59.0...v0.60.0) (2022-10-28)

### Features

* **youtube/return-youtube-dislike:** compatibility for old and new button layout ([a92c932](a92c932a20))
2022-10-28 23:58:59 +00:00
oSumAtrIX
a92c932a20 feat(youtube/return-youtube-dislike): compatibility for old and new button layout 2022-10-29 01:54:03 +02:00
semantic-release-bot
3698a502c3 chore(release): 0.59.0 [skip ci]
# [0.59.0](https://github.com/revanced/revanced-integrations/compare/v0.58.0...v0.59.0) (2022-10-25)

### Bug Fixes

* add missing list separator ([5566cfd](5566cfdda9))

### Features

* `comment` patch ([#185](https://github.com/revanced/revanced-integrations/issues/185)) ([97efc17](97efc17da7))
2022-10-25 21:45:42 +00:00
oSumAtrIX
5566cfdda9 fix: add missing list separator 2022-10-25 23:41:30 +02:00
OxrxL
97efc17da7 feat: comment patch (#185)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-25 23:34:57 +02:00
semantic-release-bot
8fdde7046d chore(release): 0.58.0 [skip ci]
# [0.58.0](https://github.com/revanced/revanced-integrations/compare/v0.57.0...v0.58.0) (2022-10-25)

### Features

* `hide-album-cards` patch ([#184](https://github.com/revanced/revanced-integrations/issues/184)) ([74c96be](74c96beb20))
2022-10-25 18:47:56 +00:00
OxrxL
74c96beb20 feat: hide-album-cards patch (#184)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-25 20:44:26 +02:00
semantic-release-bot
7014518673 chore(release): 0.57.0 [skip ci]
# [0.57.0](https://github.com/revanced/revanced-integrations/compare/v0.56.0...v0.57.0) (2022-10-25)

### Features

* `hide-artist-card` patch ([#186](https://github.com/revanced/revanced-integrations/issues/186)) ([ac3a835](ac3a835215))
2022-10-25 18:21:14 +00:00
OxrxL
ac3a835215 feat: hide-artist-card patch (#186) 2022-10-25 20:17:46 +02:00
semantic-release-bot
39450109ab chore(release): 0.56.0 [skip ci]
# [0.56.0](https://github.com/revanced/revanced-integrations/compare/v0.55.1...v0.56.0) (2022-10-25)

### Features

* `hide-crowdfunding-box` patch ([#183](https://github.com/revanced/revanced-integrations/issues/183)) ([db71824](db718242e7))
2022-10-25 16:25:11 +00:00
OxrxL
db718242e7 feat: hide-crowdfunding-box patch (#183)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-25 18:20:45 +02:00
semantic-release-bot
59c2459353 chore(release): 0.55.1 [skip ci]
## [0.55.1](https://github.com/revanced/revanced-integrations/compare/v0.55.0...v0.55.1) (2022-10-25)

### Bug Fixes

* **youtube/theme:** theme litho UI components ([#176](https://github.com/revanced/revanced-integrations/issues/176)) ([f06935d](f06935ddac))
2022-10-25 08:00:22 +00:00
OxrxL
f06935ddac fix(youtube/theme): theme litho UI components (#176)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-25 09:56:39 +02:00
semantic-release-bot
8127f8b390 chore(release): 0.55.0 [skip ci]
# [0.55.0](https://github.com/revanced/revanced-integrations/compare/v0.54.1...v0.55.0) (2022-10-22)

### Bug Fixes

* revert removing getAppContext() ([0be0ffd](0be0ffd42a))

### Features

* remove getAppContext() ([#182](https://github.com/revanced/revanced-integrations/issues/182)) ([f4650b1](f4650b1139))
2022-10-22 14:44:57 +00:00
oSumAtrIX
f4650b1139 feat: remove getAppContext() (#182)
This reverts commit 0be0ffd42a.
2022-10-22 16:40:16 +02:00
oSumAtrIX
0be0ffd42a fix: revert removing getAppContext()
This reverts commit a061614d86.
2022-10-22 16:38:56 +02:00
Canny
a061614d86 refactor: remove getAppContext() (#180) 2022-10-22 12:44:26 +02:00
semantic-release-bot
486019802c chore(release): 0.54.1 [skip ci]
## [0.54.1](https://github.com/revanced/revanced-integrations/compare/v0.54.0...v0.54.1) (2022-10-22)

### Bug Fixes

* **youtube/general-ads:** remove leftover ad banner ([#179](https://github.com/revanced/revanced-integrations/issues/179)) ([0253fef](0253fef2aa))
2022-10-22 10:00:56 +00:00
inotia00
0253fef2aa fix(youtube/general-ads): remove leftover ad banner (#179) 2022-10-22 11:57:17 +02:00
semantic-release-bot
8483a225fb chore(release): 0.54.0 [skip ci]
# [0.54.0](https://github.com/revanced/revanced-integrations/compare/v0.53.0...v0.54.0) (2022-10-20)

### Features

* **youtube:** `hide-captions-button` patch ([#175](https://github.com/revanced/revanced-integrations/issues/175)) ([867645e](867645ea5b))
2022-10-20 20:11:43 +00:00
OxrxL
867645ea5b feat(youtube): hide-captions-button patch (#175)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-20 22:08:14 +02:00
semantic-release-bot
52a2073175 chore(release): 0.53.0 [skip ci]
# [0.53.0](https://github.com/revanced/revanced-integrations/compare/v0.52.1...v0.53.0) (2022-10-20)

### Features

* **youtube:** `hide-mix-playlists` patch ([#177](https://github.com/revanced/revanced-integrations/issues/177)) ([0e6a92f](0e6a92fb33))
2022-10-20 17:11:56 +00:00
johnconner122
0e6a92fb33 feat(youtube): hide-mix-playlists patch (#177)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2022-10-20 19:08:18 +02:00
semantic-release-bot
658e11ac12 chore(release): 0.52.1 [skip ci]
## [0.52.1](https://github.com/revanced/revanced-integrations/compare/v0.52.0...v0.52.1) (2022-10-16)

### Performance Improvements

* remove obsolete SDK checks ([#174](https://github.com/revanced/revanced-integrations/issues/174)) ([1755662](1755662a7a))
2022-10-16 11:18:36 +00:00
Patryk Miś
1755662a7a perf: remove obsolete SDK checks (#174) 2022-10-16 13:15:10 +02:00
semantic-release-bot
8bd84031d4 chore(release): 0.52.0 [skip ci]
# [0.52.0](https://github.com/revanced/revanced-integrations/compare/v0.51.1...v0.52.0) (2022-10-13)

### Features

* **youtube/remember-video-quality:** remember the quality until changed by default ([c5ca35e](c5ca35e42c))
2022-10-13 04:06:07 +00:00
oSumAtrIX
c5ca35e42c feat(youtube/remember-video-quality): remember the quality until changed by default 2022-10-13 06:02:44 +02:00
semantic-release-bot
c266fdbf44 chore(release): 0.51.1 [skip ci]
## [0.51.1](https://github.com/revanced/revanced-integrations/compare/v0.51.0...v0.51.1) (2022-10-11)
2022-10-11 13:51:42 +00:00
Patryk Miś
07acc4dc1f build: update Kotlin and SDKs (#173) 2022-10-11 15:47:14 +02:00
semantic-release-bot
34a6829aaf chore(release): 0.51.0 [skip ci]
# [0.51.0](https://github.com/revanced/revanced-integrations/compare/v0.50.0...v0.51.0) (2022-10-06)

### Features

* **youtube/return-youtube-dislike:** decrease request timeout ([#171](https://github.com/revanced/revanced-integrations/issues/171)) ([c372e0e](c372e0e9bd))
2022-10-06 17:42:32 +00:00
oSumAtrIX
c372e0e9bd feat(youtube/return-youtube-dislike): decrease request timeout (#171) 2022-10-06 19:39:12 +02:00
semantic-release-bot
f5a4e6f3bf chore(release): 0.50.0 [skip ci]
# [0.50.0](https://github.com/revanced/revanced-integrations/compare/v0.49.1...v0.50.0) (2022-10-06)

### Features

* **youtube/general-ads:** do not hide community posts by default ([576991a](576991a7df))
2022-10-06 08:13:25 +00:00
oSumAtrIX
576991a7df feat(youtube/general-ads): do not hide community posts by default 2022-10-06 10:09:53 +02:00
semantic-release-bot
ab88a1f3d7 chore(release): 0.49.1 [skip ci]
## [0.49.1](https://github.com/revanced/revanced-integrations/compare/v0.49.0...v0.49.1) (2022-10-04)

### Bug Fixes

* **youtube/sponsorblock:** parse the error response on code 400 ([#169](https://github.com/revanced/revanced-integrations/issues/169)) ([5ab26a4](5ab26a427b))
2022-10-04 18:46:59 +00:00
caneleex
5ab26a427b fix(youtube/sponsorblock): parse the error response on code 400 (#169) 2022-10-04 20:43:29 +02:00
76 changed files with 1783 additions and 1723 deletions

View File

@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
uses: styfle/cancel-workflow-action@0.11.0
with:
access_token: ${{ secrets.GITHUB_TOKEN }}
- name: Checkout Repo
@@ -27,7 +27,7 @@ jobs:
java-version: '11'
distribution: 'zulu'
- name: Setup Node.js
uses: actions/setup-node@v2
uses: actions/setup-node@v3
with:
node-version: "lts/*"
- name: Build with Gradle

File diff suppressed because it is too large Load Diff

View File

@@ -7,14 +7,14 @@ plugins {
}
android {
compileSdk = 32
buildToolsVersion = "32.0.0"
compileSdk = 33
buildToolsVersion = "33.0.0"
namespace = "app.revanced.integrations"
defaultConfig {
applicationId = "app.revanced.integrations"
minSdk = 23
targetSdk = 32
targetSdk = 33
versionCode = 1
versionName = "1.0"
multiDexEnabled = false
@@ -45,4 +45,5 @@ android {
dependencies {
compileOnly(project(mapOf("path" to ":dummy")))
compileOnly("androidx.annotation:annotation:1.5.0")
compileOnly("androidx.appcompat:appcompat:1.5.1")
}

View File

@@ -8,8 +8,6 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toolbar;
import app.revanced.integrations.patches.HideShortsButtonPatch;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
public class AdRemoverAPI {

View File

@@ -0,0 +1,60 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
final class ButtonsPatch extends Filter {
private final BlockRule actionButtonsRule;
private final BlockRule dislikeRule;
private final BlockRule actionBarRule;
private final BlockRule[] rules;
public ButtonsPatch() {
BlockRule like = new BlockRule(SettingsEnum.HIDE_LIKE_BUTTON, "|like_button");
dislikeRule = new BlockRule(SettingsEnum.HIDE_DISLIKE_BUTTON, "dislike_button");
BlockRule download = new BlockRule(SettingsEnum.HIDE_DOWNLOAD_BUTTON, "download_button");
actionButtonsRule = new BlockRule(SettingsEnum.HIDE_ACTION_BUTTON, "ContainerType|video_action_button");
BlockRule playlist = new BlockRule(SettingsEnum.HIDE_PLAYLIST_BUTTON, "save_to_playlist_button");
rules = new BlockRule[]{like, dislikeRule, download, actionButtonsRule, playlist};
actionBarRule = new BlockRule(null, "video_action_bar");
this.pathRegister.registerAll(
like,
dislikeRule,
download,
playlist
);
}
private boolean hideActionBar() {
for (BlockRule rule : rules) if (!rule.isEnabled()) return false;
return true;
}
@Override
public boolean filter(final String path, final String identifier) {
if (hideActionBar() && actionBarRule.check(identifier).isBlocked()) return true;
var currentIsActionButton = actionButtonsRule.check(path).isBlocked();
if (dislikeRule.check(path).isBlocked()) ActionButton.doNotBlockCounter = 4;
if (currentIsActionButton && ActionButton.doNotBlockCounter-- > 0) {
if (SettingsEnum.HIDE_SHARE_BUTTON.getBoolean()) {
LogHelper.debug(ButtonsPatch.class, "Hiding share button");
return true;
} else return false;
}
if ((currentIsActionButton && ActionButton.doNotBlockCounter <= 0 && actionButtonsRule.isEnabled()) || pathRegister.contains(path)) {
LogHelper.debug(ButtonsPatch.class, "Blocked: " + path);
return true;
} else return false;
}
static class ActionButton {
public static int doNotBlockCounter = 4;
}
}

View File

@@ -0,0 +1,31 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
final class CommentsPatch extends Filter {
public CommentsPatch() {
var comments = new BlockRule(SettingsEnum.HIDE_COMMENTS_SECTION, "video_metadata_carousel", "_comments");
var previewComment = new BlockRule(
SettingsEnum.HIDE_PREVIEW_COMMENT,
"carousel_item",
"comments_entry_point_teaser",
"comments_entry_point_simplebox"
);
this.pathRegister.registerAll(
comments,
previewComment
);
}
@Override
boolean filter(String path, String _identifier) {
if (!pathRegister.contains(path)) return false;
LogHelper.debug(CommentsPatch.class, "Blocked: " + path);
return true;
}
}

View File

@@ -0,0 +1,40 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
public final class FixPlaybackPatch {
private static Thread currentThread = null;
private static String videoId;
public static void newVideoLoaded(final String videoId) {
if (!SettingsEnum.FIX_PLAYBACK.getBoolean()) return;
if (videoId.equals(FixPlaybackPatch.videoId)) return;
else FixPlaybackPatch.videoId = videoId;
if (currentThread != null) {
currentThread.interrupt();
}
currentThread = new Thread(() -> {
try {
while (true) {
var currentVideoTime = VideoInformation.getVideoTime();
if (currentVideoTime > -1) {
VideoInformation.seekTo(Integer.MAX_VALUE);
VideoInformation.seekTo(currentVideoTime);
return;
}
Thread.sleep(10);
}
} catch (InterruptedException e) {
LogHelper.debug(FixPlaybackPatch.class, "Thread was interrupted");
}
});
currentThread.start();
}
}

View File

@@ -0,0 +1,173 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.adremover.AdRemoverAPI;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public final class GeneralAdsPatch extends Filter {
private final String[] IGNORE = {
"home_video_with_context",
"related_video_with_context",
"comment_thread", // skip blocking anything in the comments
"download_",
"library_recent_shelf",
"menu",
"root",
"-count",
"-space",
"-button",
"playlist_add_to_option_wrapper" // do not block on "add to playlist" flyout menu
};
private final BlockRule custom = new CustomBlockRule(
SettingsEnum.ADREMOVER_CUSTOM_ENABLED,
SettingsEnum.ADREMOVER_CUSTOM_REMOVAL
);
public GeneralAdsPatch() {
var communityPosts = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_POSTS_REMOVAL, "post_base_wrapper");
var communityGuidelines = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_GUIDELINES_REMOVAL, "community_guidelines");
var compactBanner = new BlockRule(SettingsEnum.ADREMOVER_COMPACT_BANNER_REMOVAL, "compact_banner");
var inFeedSurvey = new BlockRule(SettingsEnum.ADREMOVER_FEED_SURVEY_REMOVAL, "in_feed_survey");
var medicalPanel = new BlockRule(SettingsEnum.ADREMOVER_MEDICAL_PANEL_REMOVAL, "medical_panel");
var paidContent = new BlockRule(SettingsEnum.ADREMOVER_PAID_CONTENT_REMOVAL, "paid_content_overlay");
var merchandise = new BlockRule(SettingsEnum.ADREMOVER_MERCHANDISE_REMOVAL, "product_carousel");
var infoPanel = new BlockRule(SettingsEnum.ADREMOVER_INFO_PANEL_REMOVAL, "publisher_transparency_panel", "single_item_information_panel");
var suggestions = new BlockRule(SettingsEnum.ADREMOVER_SUGGESTIONS_REMOVAL, "horizontal_video_shelf");
var latestPosts = new BlockRule(SettingsEnum.ADREMOVER_HIDE_LATEST_POSTS, "post_shelf");
var channelGuidelines = new BlockRule(SettingsEnum.ADREMOVER_HIDE_CHANNEL_GUIDELINES, "channel_guidelines_entry_banner");
var artistCard = new BlockRule(SettingsEnum.HIDE_ARTIST_CARD, "official_card");
var selfSponsor = new BlockRule(SettingsEnum.ADREMOVER_SELF_SPONSOR_REMOVAL, "cta_shelf_card");
var chapterTeaser = new BlockRule(SettingsEnum.ADREMOVER_CHAPTER_TEASER_REMOVAL, "expandable_metadata");
var graySeparator = new BlockRule(SettingsEnum.ADREMOVER_GRAY_SEPARATOR,
"cell_divider" // layout residue (gray line above the buttoned ad),
);
var buttonedAd = new BlockRule(SettingsEnum.ADREMOVER_BUTTONED_REMOVAL,
"video_display_full_buttoned_layout",
"full_width_square_image_layout",
"_ad_with",
"landscape_image_wide_button_layout"
);
var generalAds = new BlockRule(
SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL,
"ads_video_with_context",
"banner_text_icon",
"watch_metadata_app_promo",
"video_display_full_layout"
);
var movieAds = new BlockRule(
SettingsEnum.ADREMOVER_MOVIE_REMOVAL,
"browsy_bar",
"compact_movie",
"horizontal_movie_shelf",
"movie_and_show_upsell_card",
"compact_tvfilm_item"
);
this.pathRegister.registerAll(
generalAds,
buttonedAd,
communityPosts,
paidContent,
suggestions,
latestPosts,
movieAds,
chapterTeaser,
communityGuidelines,
compactBanner,
inFeedSurvey,
medicalPanel,
merchandise,
infoPanel,
channelGuidelines,
artistCard,
selfSponsor
);
var carouselAd = new BlockRule(SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL,
"carousel_ad"
);
var shorts = new BlockRule(SettingsEnum.ADREMOVER_SHORTS_REMOVAL,
"reels_player_overlay",
"shorts_shelf",
"inline_shorts"
);
this.identifierRegister.registerAll(
shorts,
graySeparator,
carouselAd
);
}
public boolean filter(final String path, final String identifier) {
BlockResult result;
if (custom.isEnabled() && custom.check(path).isBlocked())
result = BlockResult.CUSTOM;
else if (ReVancedUtils.containsAny(path, IGNORE))
result = BlockResult.IGNORED;
else if (pathRegister.contains(path) || identifierRegister.contains(identifier))
result = BlockResult.DEFINED;
else
result = BlockResult.UNBLOCKED;
log(String.format("%s (ID: %s): %s", result.message, identifier, path));
return result.filter;
}
private enum BlockResult {
UNBLOCKED(false, "Unblocked"),
IGNORED(false, "Ignored"),
DEFINED(true, "Blocked"),
CUSTOM(true, "Custom");
final Boolean filter;
final String message;
BlockResult(boolean filter, String message) {
this.filter = filter;
this.message = message;
}
}
/**
* Hide a view.
*
* @param condition The setting to check for hiding the view.
* @param view The view to hide.
*/
private static void hideView(SettingsEnum condition, View view) {
if (!condition.getBoolean()) return;
log("Hiding view with setting: " + condition);
AdRemoverAPI.HideViewWithLayout1dp(view);
}
/**
* Hide the view, which shows ads in the homepage.
*
* @param view The view, which shows ads.
*/
public static void hideAdAttributionView(View view) {
hideView(SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL, view);
}
/**
* Hide the view, which shows reels in the homepage.
*
* @param view The view, which shows reels.
*/
public static void hideReelView(View view) {
hideView(SettingsEnum.ADREMOVER_SHORTS_REMOVAL, view);
}
private static void log(String message) {
LogHelper.debug(GeneralAdsPatch.class, message);
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.adremover.AdRemoverAPI;
import app.revanced.integrations.settings.SettingsEnum;
public class HideAlbumCardsPatch {
//Used by app.revanced.patches.youtube.layout.hidealbumcards.patch.HideAlbumCardsPatch
public static void hideAlbumCards(View view) {
if (!SettingsEnum.HIDE_ALBUM_CARDS.getBoolean()) return;
AdRemoverAPI.HideViewWithLayout1dp(view);
}
}

View File

@@ -0,0 +1,13 @@
package app.revanced.integrations.patches;
import android.widget.ImageView;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
public class HideCaptionsButtonPatch {
//Used by app.revanced.patches.youtube.layout.hidecaptionsbutton.patch.HideCaptionsButtonPatch
public static void hideCaptionsButton(ImageView imageView) {
imageView.setVisibility(SettingsEnum.HIDE_CAPTIONS_BUTTON.getBoolean() ? ImageView.GONE : ImageView.VISIBLE);
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.adremover.AdRemoverAPI;
import app.revanced.integrations.settings.SettingsEnum;
public class HideCrowdfundingBoxPatch {
//Used by app.revanced.patches.youtube.layout.hidecrowdfundingbox.patch.HideCrowdfundingBoxPatch
public static void hideCrowdfundingBox(View view) {
if (!SettingsEnum.HIDE_CROWDFUNDING_BOX.getBoolean()) return;
AdRemoverAPI.HideViewWithLayout1dp(view);
}
}

View File

@@ -4,7 +4,9 @@ import app.revanced.integrations.settings.SettingsEnum;
public class HideEmailAddressPatch {
//Used by app.revanced.patches.youtube.layout.personalinformation.patch.HideEmailAddressPatch
public static boolean hideEmailAddress() {
return SettingsEnum.HIDE_EMAIL_ADDRESS.getBoolean();
public static int hideEmailAddress(int originalValue) {
if (SettingsEnum.HIDE_EMAIL_ADDRESS.getBoolean())
return 8;
return originalValue;
}
}

View File

@@ -0,0 +1,13 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.settings.SettingsEnum;
public class HideEndscreenCardsPatch {
//Used by app.revanced.patches.youtube.layout.hideendscreencards.bytecode.patch.HideEndscreenCardsPatch
public static void hideEndscreen(View view) {
if (!SettingsEnum.HIDE_ENDSCREEN_CARDS.getBoolean()) return;
view.setVisibility(View.GONE);
}
}

View File

@@ -1,20 +0,0 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.adremover.AdRemoverAPI;
import app.revanced.integrations.settings.SettingsEnum;
public class HideHomeAdsPatch {
/**
* Used by package app.revanced.extensions.Extensions
*
* @param view
*/
public static void HideHomeAds(View view) {
if (!SettingsEnum.HOME_ADS_REMOVAL.getBoolean()) return;
AdRemoverAPI.HideViewWithLayout1dp(view);
}
}

View File

@@ -1,14 +0,0 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.settings.SettingsEnum;
public class HideInfoCardSuggestionsPatch {
public static void hideInfoCardSuggestions(View view) {
if (!SettingsEnum.INFO_CARDS_SHOWN.getBoolean()) {
view.setVisibility(View.GONE);
}
}
}

View File

@@ -0,0 +1,16 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.settings.SettingsEnum;
public class HideInfocardsPatch {
public static void hideInfocardsIncognito(View view) {
if (!SettingsEnum.HIDE_INFO_CARDS.getBoolean()) return;
view.setVisibility(View.GONE);
}
public static boolean hideInfocardsMethodCall() {
return SettingsEnum.HIDE_INFO_CARDS.getBoolean();
}
}

View File

@@ -0,0 +1,14 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.adremover.AdRemoverAPI;
import app.revanced.integrations.settings.SettingsEnum;
public class HideMixPlaylistsPatch {
public static void hideMixPlaylists(View view) {
if (!SettingsEnum.HIDE_MIX_PLAYLISTS.getBoolean()) return;
AdRemoverAPI.HideViewWithLayout1dp(view);
}
}

View File

@@ -0,0 +1,13 @@
package app.revanced.integrations.patches;
import android.view.View;
import app.revanced.integrations.settings.SettingsEnum;
public class HideShortsCommentsButtonPatch {
//Used by app.revanced.patches.youtube.layout.comments.patch.CommentsPatch
public static void hideShortsCommentsButton(View view) {
if (!SettingsEnum.HIDE_SHORTS_COMMENTS_BUTTON.getBoolean()) return;
view.setVisibility(View.GONE);
}
}

View File

@@ -0,0 +1,10 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class HideWatchinVRPatch {
//Used by app.revanced.patches.youtube.layout.watchinvr.patch.HideWatchinVRPatch
public static boolean hideWatchinVR() {
return SettingsEnum.HIDE_WATCH_IN_VR.getBoolean();
}
}

View File

@@ -13,32 +13,9 @@ import java.util.function.Consumer;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
/**
* Helper functions.
*/
final class Extensions {
static boolean containsAny(final String value, final String... targets) {
for (String string : targets)
if (value.contains(string)) return true;
return false;
}
static boolean any(LithoBlockRegister register, String path) {
for (var rule : register) {
if (!rule.isEnabled()) continue;
var result = rule.check(path);
if (result.isBlocked()) {
return true;
}
}
return false;
}
}
final class BlockRule {
class BlockRule {
final static class BlockResult {
private final boolean blocked;
private final SettingsEnum setting;
@@ -57,7 +34,7 @@ final class BlockRule {
}
}
private final SettingsEnum setting;
protected final SettingsEnum setting;
private final String[] blocks;
/**
@@ -76,12 +53,26 @@ final class BlockRule {
}
public BlockResult check(final String string) {
return new BlockResult(setting, string != null && Extensions.containsAny(string, blocks));
return new BlockResult(setting, string != null && ReVancedUtils.containsAny(string, blocks));
}
}
final class CustomBlockRule extends BlockRule {
/**
* Initialize a new rule for components.
*
* @param setting The setting which controls the blocking of the components.
* @param filter The setting which contains the list of component names.
*/
public CustomBlockRule(final SettingsEnum setting, final SettingsEnum filter) {
super(setting, filter.getString().split(","));
}
}
abstract class Filter {
final LithoBlockRegister register = new LithoBlockRegister();
final protected LithoBlockRegister pathRegister = new LithoBlockRegister();
final protected LithoBlockRegister identifierRegister = new LithoBlockRegister();
abstract boolean filter(final String path, final String identifier);
}
@@ -111,12 +102,26 @@ final class LithoBlockRegister implements Iterable<BlockRule> {
public Spliterator<BlockRule> spliterator() {
return blocks.spliterator();
}
public boolean contains(String path) {
for (var rule : this) {
if (!rule.isEnabled()) continue;
var result = rule.check(path);
if (result.isBlocked()) {
return true;
}
}
return false;
}
}
public final class LithoFilterPatch {
private static final Filter[] filters = new Filter[]{
new GeneralBytecodeAdsPatch(),
new ButtonsPatch()
new GeneralAdsPatch(),
new ButtonsPatch(),
new CommentsPatch(),
};
public static boolean filter(final StringBuilder pathBuilder, final String identifier) {
@@ -133,152 +138,3 @@ public final class LithoFilterPatch {
}
}
final class ButtonsPatch extends Filter {
private final BlockRule actionButtonsRule;
private final BlockRule dislikeRule;
private final BlockRule actionBarRule;
private final BlockRule[] rules;
public ButtonsPatch() {
BlockRule like = new BlockRule(SettingsEnum.HIDE_LIKE_BUTTON, "|like_button");
dislikeRule = new BlockRule(SettingsEnum.HIDE_DISLIKE_BUTTON, "dislike_button");
BlockRule download = new BlockRule(SettingsEnum.HIDE_DOWNLOAD_BUTTON, "download_button");
actionButtonsRule = new BlockRule(SettingsEnum.HIDE_ACTION_BUTTON, "ContainerType|video_action_button");
BlockRule playlist = new BlockRule(SettingsEnum.HIDE_PLAYLIST_BUTTON, "save_to_playlist_button");
rules = new BlockRule[]{like, dislikeRule, download, actionButtonsRule, playlist};
actionBarRule = new BlockRule(null, "video_action_bar");
this.register.registerAll(
like,
dislikeRule,
download,
playlist
);
}
private boolean hideActionBar() {
for (BlockRule rule : rules) if (!rule.isEnabled()) return false;
return true;
}
@Override
public boolean filter(final String path, final String identifier) {
if (hideActionBar() && actionBarRule.check(identifier).isBlocked()) return true;
var currentIsActionButton = actionButtonsRule.check(path).isBlocked();
if (dislikeRule.check(path).isBlocked()) ActionButton.doNotBlockCounter = 4;
if (currentIsActionButton && ActionButton.doNotBlockCounter-- > 0) {
if (SettingsEnum.HIDE_SHARE_BUTTON.getBoolean()) {
LogHelper.debug(ButtonsPatch.class, "Hiding share button");
return true;
} else return false;
}
if ((currentIsActionButton && ActionButton.doNotBlockCounter <= 0 && actionButtonsRule.isEnabled()) || Extensions.any(register, path)) {
LogHelper.debug(ButtonsPatch.class, "Blocked: " + path);
return true;
} else return false;
}
static class ActionButton {
public static int doNotBlockCounter = 4;
}
}
class GeneralBytecodeAdsPatch extends Filter {
private final BlockRule identifierBlock;
public GeneralBytecodeAdsPatch() {
var comments = new BlockRule(SettingsEnum.ADREMOVER_COMMENTS_REMOVAL, "comments_");
var communityPosts = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_POSTS_REMOVAL, "post_base_wrapper");
var communityGuidelines = new BlockRule(SettingsEnum.ADREMOVER_COMMUNITY_GUIDELINES_REMOVAL, "community_guidelines");
var compactBanner = new BlockRule(SettingsEnum.ADREMOVER_COMPACT_BANNER_REMOVAL, "compact_banner");
var inFeedSurvey = new BlockRule(SettingsEnum.ADREMOVER_FEED_SURVEY_REMOVAL, "in_feed_survey");
var medicalPanel = new BlockRule(SettingsEnum.ADREMOVER_MEDICAL_PANEL_REMOVAL, "medical_panel");
var paidContent = new BlockRule(SettingsEnum.ADREMOVER_PAID_CONTECT_REMOVAL, "paid_content_overlay");
var merchandise = new BlockRule(SettingsEnum.ADREMOVER_MERCHANDISE_REMOVAL, "product_carousel");
var shorts = new BlockRule(SettingsEnum.ADREMOVER_SHORTS_SHELF_REMOVAL, "shorts_shelf");
var infoPanel = new BlockRule(SettingsEnum.ADREMOVER_INFO_PANEL_REMOVAL, "publisher_transparency_panel", "single_item_information_panel");
var suggestions = new BlockRule(SettingsEnum.ADREMOVER_SUGGESTIONS_REMOVAL, "horizontal_video_shelf");
var latestPosts = new BlockRule(SettingsEnum.ADREMOVER_HIDE_LATEST_POSTS, "post_shelf");
var channelGuidelines = new BlockRule(SettingsEnum.ADREMOVER_HIDE_CHANNEL_GUIDELINES, "channel_guidelines_entry_banner");
var generalAds = new BlockRule(
SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL,
// could be required
//"full_width_square_image_layout",
"video_display_full_buttoned_layout",
"_ad",
"ad_",
"ads_video_with_context",
"cell_divider",
"reels_player_overlay",
"shelf_header",
"watch_metadata_app_promo",
"video_display_full_layout"
);
var movieAds = new BlockRule(
SettingsEnum.ADREMOVER_MOVIE_REMOVAL,
"browsy_bar",
"compact_movie",
"horizontal_movie_shelf",
"movie_and_show_upsell_card"
);
this.register.registerAll(
generalAds,
communityPosts,
paidContent,
shorts,
suggestions,
latestPosts,
movieAds,
comments,
communityGuidelines,
compactBanner,
inFeedSurvey,
medicalPanel,
merchandise,
infoPanel,
channelGuidelines
);
// Block for the ComponentContext.identifier field
identifierBlock = new BlockRule(SettingsEnum.ADREMOVER_GENERAL_ADS_REMOVAL, "carousel_ad");
}
public boolean filter(final String path, final String identifier) {
// Do not block on these
if (Extensions.containsAny(path,
"home_video_with_context",
"related_video_with_context",
"search_video_with_context",
"download_",
"library_recent_shelf",
"menu",
"root",
"-count",
"-space",
"-button"
)) return false;
for (var rule : register) {
if (!rule.isEnabled()) continue;
var result = rule.check(path);
if (result.isBlocked()) {
LogHelper.debug(GeneralBytecodeAdsPatch.class, "Blocked: " + path);
return true;
}
}
if (identifierBlock.check(identifier).isBlocked()) {
LogHelper.debug(GeneralBytecodeAdsPatch.class, "Blocked: " + identifier);
return true;
}
return false;
}
}

View File

@@ -0,0 +1,36 @@
package app.revanced.integrations.patches;
import android.util.Log;
import app.revanced.integrations.utils.ThemeHelper;
public class LithoThemePatch {
// color constants used in relation with litho components
private static final int[] WHITECONSTANTS = {
-1, // comments chip background
-394759, // music related results panel background
-83886081, // video chapters list background
};
private static final int[] DARKCONSTANTS = {
-14145496, // explore drawer background
-14606047, // comments chip background
-15198184, // music related results panel background
-15790321, // comments chip background (new layout)
-98492127 // video chapters list background
};
// Used by app.revanced.patches.youtube.layout.theme.patch.LithoThemePatch
public static int applyLithoTheme(int originalValue) {
var isDarkTheme = ThemeHelper.isDarkTheme();
if ((isDarkTheme && anyEquals(originalValue, DARKCONSTANTS)) || (!isDarkTheme && anyEquals(originalValue, WHITECONSTANTS)))
return 0;
return originalValue;
}
private static boolean anyEquals(int value, int... of) {
for (int v : of) if (value == v) return true;
return false;
}
}

View File

@@ -0,0 +1,33 @@
package app.revanced.integrations.patches;
import static app.revanced.integrations.sponsorblock.StringRef.str;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.widget.Toast;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public class MicroGSupport {
private static final String MICROG_VENDOR = "com.mgoogle";
private static final String MICROG_PACKAGE_NAME = "com.mgoogle.android.gms";
private static final String VANCED_MICROG_DOWNLOAD_LINK = "https://github.com/TeamVanced/VancedMicroG/releases/latest";
public static void checkAvailability() {
var context = ReVancedUtils.getContext();
assert context != null;
try {
context.getPackageManager().getPackageInfo(MICROG_PACKAGE_NAME, PackageManager.GET_ACTIVITIES);
LogHelper.debug(ReVancedUtils.class, "MicroG is installed on the device");
} catch (PackageManager.NameNotFoundException exception) {
LogHelper.printException(ReVancedUtils.class, "MicroG was not found", exception);
Toast.makeText(context, str("microg_not_installed_warning"), Toast.LENGTH_LONG).show();
var intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(VANCED_MICROG_DOWNLOAD_LINK));
context.startActivity(intent);
}
}
}

View File

@@ -0,0 +1,18 @@
package app.revanced.integrations.patches;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import app.revanced.integrations.settings.SettingsEnum;
public class OpenLinksDirectlyPatch {
public static String parseRedirectUri(String uri) {
if (SettingsEnum.OPEN_LINKS_DIRECTLY.getBoolean()) {
Matcher matcher = Pattern.compile("&q=(http.+?)&v=").matcher(uri);
return matcher.find() ? URLDecoder.decode(matcher.group(1)) : uri;
}
return uri;
}
}

View File

@@ -25,9 +25,15 @@ public class ReturnYouTubeDislikePatch {
/**
* Called when the like/dislike button is clicked
*
* @param vote -1 (dislike), 0 (none) or 1 (like)
*/
public static void sendVote(int vote) {
ReturnYouTubeDislike.sendVote(vote);
for (ReturnYouTubeDislike.Vote v : ReturnYouTubeDislike.Vote.values()) {
if (v.value == vote) {
ReturnYouTubeDislike.sendVote(v);
return;
}
}
}
}

View File

@@ -0,0 +1,100 @@
package app.revanced.integrations.patches;
import android.os.Handler;
import android.os.Looper;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import app.revanced.integrations.utils.LogHelper;
/**
* Hooking class for the current playing video.
*/
public final class VideoInformation {
private static final String SEEK_METHOD_NAME = "seekTo";
private static WeakReference<Object> playerController;
private static Method seekMethod;
private static long videoLength = 1;
private static long videoTime = -1;
/**
* Hook into PlayerController.onCreate() method.
*
* @param thisRef Reference to the player controller object.
*/
public static void playerController_onCreateHook(final Object thisRef) {
playerController = new WeakReference<>(thisRef);
videoLength = 1;
videoTime = -1;
try {
seekMethod = thisRef.getClass().getMethod(SEEK_METHOD_NAME, Long.TYPE);
seekMethod.setAccessible(true);
} catch (NoSuchMethodException ex) {
LogHelper.debug(VideoInformation.class, "Failed to initialize: " + ex.getMessage());
}
}
/**
* Set the video length.
*
* @param length The length of the video in milliseconds.
*/
public static void setVideoLength(final long length) {
LogHelper.debug(VideoInformation.class, "Setting current video length to " + length);
videoLength = length;
}
/**
* Set the video time.
*
* @param time The time of the video in milliseconds.
*/
public static void setVideoTime(final long time) {
LogHelper.debug(VideoInformation.class, "Current video time " + time);
videoTime = time;
}
/**
* Seek on the current video.
*
* @param millisecond The millisecond to seek the video to.
*/
public static void seekTo(final long millisecond) {
new Handler(Looper.getMainLooper()).post(() -> {
if (seekMethod == null) {
LogHelper.debug(VideoInformation.class, "seekMethod was null");
return;
}
try {
LogHelper.debug(VideoInformation.class, "Seeking to " + millisecond);
seekMethod.invoke(playerController.get(), millisecond);
} catch (Exception ex) {
LogHelper.debug(VideoInformation.class, "Failed to seek: " + ex.getMessage());
}
});
}
/**
* Get the length of the current video playing.
*
* @return The length of the video in milliseconds. 1 if not set yet.
*/
public static long getCurrentVideoLength() {
return videoLength;
}
/**
* Get the time of the current video playing.
*
* @return The time of the video in milliseconds. -1 if not set yet.
*/
public static long getVideoTime() {
return videoTime;
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class ZoomHapticsPatch {
public static boolean shouldVibrate() {
return !SettingsEnum.DISABLE_ZOOM_HAPTICS.getBoolean();
}
}

View File

@@ -1,4 +1,4 @@
package app.revanced.integrations.patches;
package app.revanced.integrations.patches.playback.quality;
import android.view.View;
import android.view.ViewGroup;

View File

@@ -1,4 +1,4 @@
package app.revanced.integrations.patches;
package app.revanced.integrations.patches.playback.quality;
import android.content.Context;
import android.net.ConnectivityManager;
@@ -15,7 +15,7 @@ import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.SharedPrefHelper;
public class VideoQualityPatch {
public class RememberVideoQualityPatch {
public static int selectedQuality1 = -2;
private static Boolean newVideo = false;
@@ -27,22 +27,22 @@ public class VideoQualityPatch {
try {
SharedPrefHelper.saveString(context, SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "wifi_quality", defaultQuality + "");
} catch (Exception ex) {
LogHelper.printException(VideoQualityPatch.class, "Failed to change default WI-FI quality:" + ex);
LogHelper.printException(RememberVideoQualityPatch.class, "Failed to change default WI-FI quality:" + ex);
Toast.makeText(context, "Failed to change default WI-FI quality:", Toast.LENGTH_SHORT).show();
}
LogHelper.debug(VideoQualityPatch.class, "Changing default Wi-Fi quality to: " + defaultQuality);
LogHelper.debug(RememberVideoQualityPatch.class, "Changing default Wi-Fi quality to: " + defaultQuality);
Toast.makeText(context, "Changing default Wi-Fi quality to: " + defaultQuality, Toast.LENGTH_SHORT).show();
} else if (isConnectedMobile(context)) {
try {
SharedPrefHelper.saveString(context, SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "mobile_quality", defaultQuality + "");
} catch (Exception ex) {
LogHelper.debug(VideoQualityPatch.class, "Failed to change default mobile data quality" + ex);
LogHelper.debug(RememberVideoQualityPatch.class, "Failed to change default mobile data quality" + ex);
Toast.makeText(context, "Failed to change default mobile data quality", Toast.LENGTH_SHORT).show();
}
LogHelper.debug(VideoQualityPatch.class, "Changing default mobile data quality to:" + defaultQuality);
LogHelper.debug(RememberVideoQualityPatch.class, "Changing default mobile data quality to:" + defaultQuality);
Toast.makeText(context, "Changing default mobile data quality to:" + defaultQuality, Toast.LENGTH_SHORT).show();
} else {
LogHelper.debug(VideoQualityPatch.class, "No internet connection.");
LogHelper.debug(RememberVideoQualityPatch.class, "No internet connection.");
Toast.makeText(context, "No internet connection.", Toast.LENGTH_SHORT).show();
}
userChangedQuality = false;
@@ -76,34 +76,34 @@ public class VideoQualityPatch {
int selectedQuality2 = qualities.length - selectedQuality1 + 1;
index++;
if (selectedQuality2 == index) {
LogHelper.debug(VideoQualityPatch.class, "Quality index is: " + index + " and corresponding value is: " + convertedQuality);
LogHelper.debug(RememberVideoQualityPatch.class, "Quality index is: " + index + " and corresponding value is: " + convertedQuality);
changeDefaultQuality(convertedQuality);
return selectedQuality2;
}
}
}
newVideo = false;
LogHelper.debug(VideoQualityPatch.class, "Quality: " + quality);
LogHelper.debug(RememberVideoQualityPatch.class, "Quality: " + quality);
Context context = ReVancedUtils.getContext();
if (context == null) {
LogHelper.printException(VideoQualityPatch.class, "Context is null or settings not initialized, returning quality: " + quality);
LogHelper.printException(RememberVideoQualityPatch.class, "Context is null or settings not initialized, returning quality: " + quality);
return quality;
}
if (isConnectedWifi(context)) {
preferredQuality = SharedPrefHelper.getInt(context, SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "wifi_quality", -2);
LogHelper.debug(VideoQualityPatch.class, "Wi-Fi connection detected, preferred quality: " + preferredQuality);
LogHelper.debug(RememberVideoQualityPatch.class, "Wi-Fi connection detected, preferred quality: " + preferredQuality);
} else if (isConnectedMobile(context)) {
preferredQuality = SharedPrefHelper.getInt(context, SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "mobile_quality", -2);
LogHelper.debug(VideoQualityPatch.class, "Mobile data connection detected, preferred quality: " + preferredQuality);
LogHelper.debug(RememberVideoQualityPatch.class, "Mobile data connection detected, preferred quality: " + preferredQuality);
} else {
LogHelper.debug(VideoQualityPatch.class, "No Internet connection!");
LogHelper.debug(RememberVideoQualityPatch.class, "No Internet connection!");
return quality;
}
if (preferredQuality == -2) {
return quality;
}
for (int streamQuality2 : iStreamQualities) {
LogHelper.debug(VideoQualityPatch.class, "Quality at index " + index + ": " + streamQuality2);
LogHelper.debug(RememberVideoQualityPatch.class, "Quality at index " + index + ": " + streamQuality2);
index++;
}
for (Integer iStreamQuality : iStreamQualities) {
@@ -116,16 +116,16 @@ public class VideoQualityPatch {
return quality;
}
int qualityIndex = iStreamQualities.indexOf(quality);
LogHelper.debug(VideoQualityPatch.class, "Index of quality " + quality + " is " + qualityIndex);
LogHelper.debug(RememberVideoQualityPatch.class, "Index of quality " + quality + " is " + qualityIndex);
try {
Class<?> cl = qInterface.getClass();
Method m = cl.getMethod(qIndexMethod, Integer.TYPE);
LogHelper.debug(VideoQualityPatch.class, "Method is: " + qIndexMethod);
LogHelper.debug(RememberVideoQualityPatch.class, "Method is: " + qIndexMethod);
m.invoke(qInterface, iStreamQualities.get(qualityIndex));
LogHelper.debug(VideoQualityPatch.class, "Quality changed to: " + qualityIndex);
LogHelper.debug(RememberVideoQualityPatch.class, "Quality changed to: " + qualityIndex);
return qualityIndex;
} catch (Exception ex) {
LogHelper.printException(VideoQualityPatch.class, "Failed to set quality", ex);
LogHelper.printException(RememberVideoQualityPatch.class, "Failed to set quality", ex);
Toast.makeText(context, "Failed to set quality", Toast.LENGTH_SHORT).show();
return qualityIndex;
}

View File

@@ -0,0 +1,5 @@
package app.revanced.integrations.patches.playback.speed;
public class CustomVideoSpeedPatch {
public static final float[] videoSpeeds = { 0, 0 }; // Values are useless as they are being overridden by the respective patch
}

View File

@@ -1,4 +1,4 @@
package app.revanced.integrations.whitelist.requests;
package app.revanced.integrations.requests;
import org.json.JSONArray;
import org.json.JSONObject;
@@ -18,9 +18,9 @@ public class Requester {
String url = apiUrl + route.compile(params).getCompiledRoute();
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod(route.getMethod().name());
if (route != WhitelistRoutes.GET_CHANNEL_DETAILS) {
connection.setRequestProperty("User-agent", System.getProperty("http.agent") + ";vanced");
}
// TODO: change the user agent string
connection.setRequestProperty("User-agent", System.getProperty("http.agent") + ";vanced");
return connection;
}

View File

@@ -1,4 +1,4 @@
package app.revanced.integrations.whitelist.requests;
package app.revanced.integrations.requests;
public class Route {
private final String route;

View File

@@ -1,8 +1,5 @@
package app.revanced.integrations.returnyoutubedislike;
import static app.revanced.integrations.videoplayer.VideoInformation.currentVideoId;
import static app.revanced.integrations.videoplayer.VideoInformation.dislikeCount;
import android.content.Context;
import android.icu.text.CompactDecimalFormat;
import android.os.Build;
@@ -19,7 +16,24 @@ import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.SharedPrefHelper;
public class ReturnYouTubeDislike {
private static String currentVideoId;
public static Integer dislikeCount;
private static boolean isEnabled;
private static boolean segmentedButton;
public enum Vote {
LIKE(1),
DISLIKE(-1),
LIKE_REMOVE(0);
public int value;
Vote(int value) {
this.value = value;
}
}
private static Thread _dislikeFetchThread = null;
private static Thread _votingThread = null;
private static Registration registration;
@@ -60,6 +74,8 @@ public class ReturnYouTubeDislike {
dislikeCount = null;
if (!isEnabled) return;
currentVideoId = videoId;
try {
if (_dislikeFetchThread != null && _dislikeFetchThread.getState() != Thread.State.TERMINATED) {
LogHelper.debug(ReturnYouTubeDislike.class, "Interrupting the thread. Current state " + _dislikeFetchThread.getState());
@@ -77,31 +93,29 @@ public class ReturnYouTubeDislike {
if (!isEnabled) return;
try {
// Contains a pathBuilder string, used to distinguish from other litho components:
// video_action_bar.eml|27b56b54d5dcba20|video_action_bar_unwrapper.eml|c5a1d399b660e52e|CellType
// |ScrollableContainerType|ContainerType|ContainerType|dislike_button.eml|966ee2cd7db5e29f
// |video_actipathBuilder=video_action_bar.eml|27b56b54d5dcba20|video_action_bar_unwrapper.eml
// |c5a1d399b660e52e|CellType|ScrollableContainerType|ContainerType|ContainerType|dislike_button.eml
// |966ee2cd7db5e29f|video_action_toggle_button.eml|8fd9d44a8e3c9162|video_action_button.eml
// |9dd3b4b44979c3af|ContainerType|TextType|on_toggle_button.eml|8fd9d44a8e3c9162|video_action_button.eml
// |9dd3b4b44979c3af|ContainerType|TextType|
if (!conversionContext.toString().contains("|dislike_button.eml|")) return;
var conversionContextString = conversionContext.toString();
// Check for new component
if (conversionContextString.contains("|segmented_like_dislike_button.eml|"))
segmentedButton = true;
else if (!conversionContextString.contains("|dislike_button.eml|"))
return;
LogHelper.debug(ReturnYouTubeDislike.class, "dislike button was created");
// Have to block the current thread until fetching is done
// There's no known way to edit the text after creation yet
if (_dislikeFetchThread != null) _dislikeFetchThread.join();
if (dislikeCount != null) {
updateDislikeText(textRef, formatDislikes(dislikeCount));
}
if (dislikeCount == null) return;
updateDislike(textRef, dislikeCount);
LogHelper.debug(ReturnYouTubeDislike.class, "Updated text on component" + conversionContextString);
} catch (Exception ex) {
LogHelper.printException(ReturnYouTubeDislike.class, "Error while trying to set dislikes text", ex);
}
}
public static void sendVote(int vote) {
public static void sendVote(Vote vote) {
if (!isEnabled) return;
Context context = ReVancedUtils.getContext();
@@ -129,16 +143,23 @@ public class ReturnYouTubeDislike {
_votingThread.start();
}
private static void updateDislikeText(AtomicReference<Object> textRef, String text) {
SpannableString oldString = (SpannableString) textRef.get();
SpannableString newString = new SpannableString(text);
private static void updateDislike(AtomicReference<Object> textRef, Integer dislikeCount) {
SpannableString oldSpannableString = (SpannableString) textRef.get();
// parse the buttons string
// if the button is segmented, only get the like count as a string
var oldButtonString = oldSpannableString.toString();
if (segmentedButton) oldButtonString = oldButtonString.split(" \\| ")[0];
var dislikeString = formatDislikes(dislikeCount);
SpannableString newString = new SpannableString(
segmentedButton ? (oldButtonString + " | " + dislikeString) : dislikeString
);
// Copy style (foreground color, etc) to new string
Object[] spans = oldString.getSpans(0, oldString.length(), Object.class);
for (Object span : spans) {
int flags = oldString.getSpanFlags(span);
newString.setSpan(span, 0, newString.length(), flags);
}
Object[] spans = oldSpannableString.getSpans(0, oldSpannableString.length(), Object.class);
for (Object span : spans)
newString.setSpan(span, 0, newString.length(), oldSpannableString.getSpanFlags(span));
textRef.set(newString);
}

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