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

Compare commits

...

137 Commits

Author SHA1 Message Date
semantic-release-bot
2ee18fce69 chore(release): 0.106.0 [skip ci]
# [0.106.0](https://github.com/revanced/revanced-integrations/compare/v0.105.0...v0.106.0) (2023-05-01)

### Bug Fixes

* **youtube/general-ads:** remove broken ad filter ([#355](https://github.com/revanced/revanced-integrations/issues/355)) ([061ebc6](061ebc6546))
* **youtube/return-youtube-dislike:** support old UI layouts ([#378](https://github.com/revanced/revanced-integrations/issues/378)) ([d3f8fb9](d3f8fb9739))
* **youtube/spoof-signature-verification:** more fixes for subtitle window positions  ([#374](https://github.com/revanced/revanced-integrations/issues/374)) ([8cc1b6e](8cc1b6ea4a))
* **youtube:** no longer need to restart the app after changing `copy-video-url` or `downloads` patch ([#372](https://github.com/revanced/revanced-integrations/issues/372)) ([6b15514](6b15514885))

### Features

* add appreciation message for new contributors ([78d56d4](78d56d4fe1))
* **youtube/general-ads:** hide multiple audio track button on video player overlay ([#377](https://github.com/revanced/revanced-integrations/issues/377)) ([7fc7336](7fc73368f1))
* **youtube/general-ads:** hide new type of ad ([15f9c90](15f9c90941))
* **youtube/hide-get-premium:** hide get premium advertisements under video player ([#376](https://github.com/revanced/revanced-integrations/issues/376)) ([36fd284](36fd2844c4))
* **youtube/spoof-app-version:** user selectable version to spoof ([#375](https://github.com/revanced/revanced-integrations/issues/375)) ([f6f6c93](f6f6c93c57))
2023-05-01 17:05:55 +00:00
oSumAtrIX
e774be0f05 chore: merge branch dev to main (#373) 2023-05-01 19:03:55 +02:00
LisoUseInAIKyrios
8a7098cce4 refactor(youtube/return-youtube-dislike): simplify branching (#379) 2023-05-01 15:12:31 +04:00
semantic-release-bot
a93a704c22 chore(release): 0.106.0-dev.7 [skip ci]
# [0.106.0-dev.7](https://github.com/revanced/revanced-integrations/compare/v0.106.0-dev.6...v0.106.0-dev.7) (2023-05-01)

### Bug Fixes

* **youtube/general-ads:** remove broken ad filter ([#355](https://github.com/revanced/revanced-integrations/issues/355)) ([061ebc6](061ebc6546))
2023-05-01 04:31:35 +00:00
johnconner122
061ebc6546 fix(youtube/general-ads): remove broken ad filter (#355) 2023-05-01 06:29:44 +02:00
semantic-release-bot
0c6b22e929 chore(release): 0.106.0-dev.6 [skip ci]
# [0.106.0-dev.6](https://github.com/revanced/revanced-integrations/compare/v0.106.0-dev.5...v0.106.0-dev.6) (2023-05-01)

### Features

* **youtube/general-ads:** hide multiple audio track button on video player overlay ([#377](https://github.com/revanced/revanced-integrations/issues/377)) ([7fc7336](7fc73368f1))
2023-05-01 04:28:19 +00:00
LisoUseInAIKyrios
7fc73368f1 feat(youtube/general-ads): hide multiple audio track button on video player overlay (#377) 2023-05-01 06:26:12 +02:00
semantic-release-bot
8923fa9fd6 chore(release): 0.106.0-dev.5 [skip ci]
# [0.106.0-dev.5](https://github.com/revanced/revanced-integrations/compare/v0.106.0-dev.4...v0.106.0-dev.5) (2023-04-30)

### Features

* **youtube/general-ads:** hide new type of ad ([15f9c90](15f9c90941))
2023-04-30 21:16:57 +00:00
oSumAtrIX
15f9c90941 feat(youtube/general-ads): hide new type of ad 2023-04-30 23:13:39 +02:00
semantic-release-bot
c8784a5966 chore(release): 0.106.0-dev.4 [skip ci]
# [0.106.0-dev.4](https://github.com/revanced/revanced-integrations/compare/v0.106.0-dev.3...v0.106.0-dev.4) (2023-04-30)

### Bug Fixes

* **youtube/return-youtube-dislike:** support old UI layouts ([#378](https://github.com/revanced/revanced-integrations/issues/378)) ([d3f8fb9](d3f8fb9739))
2023-04-30 19:43:40 +00:00
LisoUseInAIKyrios
d3f8fb9739 fix(youtube/return-youtube-dislike): support old UI layouts (#378) 2023-04-30 23:41:13 +04:00
semantic-release-bot
ff0d64287c chore(release): 0.106.0-dev.3 [skip ci]
# [0.106.0-dev.3](https://github.com/revanced/revanced-integrations/compare/v0.106.0-dev.2...v0.106.0-dev.3) (2023-04-30)

### Features

* **youtube/hide-get-premium:** hide get premium advertisements under video player ([#376](https://github.com/revanced/revanced-integrations/issues/376)) ([36fd284](36fd2844c4))
2023-04-30 18:36:38 +00:00
LisoUseInAIKyrios
36fd2844c4 feat(youtube/hide-get-premium): hide get premium advertisements under video player (#376) 2023-04-30 22:34:37 +04:00
oSumAtrIX
0de83fff0e chore: update gradle and dependencies 2023-04-30 05:27:21 +02:00
semantic-release-bot
24a609288f chore(release): 0.106.0-dev.2 [skip ci]
# [0.106.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.106.0-dev.1...v0.106.0-dev.2) (2023-04-30)

### Features

* add appreciation message for new contributors ([78d56d4](78d56d4fe1))
2023-04-30 01:17:18 +00:00
oSumAtrIX
78d56d4fe1 feat: add appreciation message for new contributors 2023-04-30 03:15:36 +02:00
semantic-release-bot
27fdcfff08 chore(release): 0.106.0-dev.1 [skip ci]
# [0.106.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.105.1-dev.2...v0.106.0-dev.1) (2023-04-28)

### Features

* **youtube/spoof-app-version:** user selectable version to spoof ([#375](https://github.com/revanced/revanced-integrations/issues/375)) ([f6f6c93](f6f6c93c57))
2023-04-28 17:53:58 +00:00
LisoUseInAIKyrios
f6f6c93c57 feat(youtube/spoof-app-version): user selectable version to spoof (#375) 2023-04-28 21:52:09 +04:00
semantic-release-bot
a661dac623 chore(release): 0.105.1-dev.2 [skip ci]
## [0.105.1-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.105.1-dev.1...v0.105.1-dev.2) (2023-04-28)

### Bug Fixes

* **youtube/spoof-signature-verification:** more fixes for subtitle window positions  ([#374](https://github.com/revanced/revanced-integrations/issues/374)) ([8cc1b6e](8cc1b6ea4a))
2023-04-28 08:51:38 +00:00
LisoUseInAIKyrios
8cc1b6ea4a fix(youtube/spoof-signature-verification): more fixes for subtitle window positions (#374) 2023-04-28 12:49:41 +04:00
semantic-release-bot
829895874b chore(release): 0.105.1-dev.1 [skip ci]
## [0.105.1-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.105.0...v0.105.1-dev.1) (2023-04-28)

### Bug Fixes

* **youtube:** no longer need to restart the app after changing `copy-video-url` or `downloads` patch ([#372](https://github.com/revanced/revanced-integrations/issues/372)) ([6b15514](6b15514885))
2023-04-28 06:18:05 +00:00
LisoUseInAIKyrios
6b15514885 fix(youtube): no longer need to restart the app after changing copy-video-url or downloads patch (#372)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-28 10:16:08 +04:00
semantic-release-bot
5b53e02613 chore(release): 0.105.0 [skip ci]
# [0.105.0](https://github.com/revanced/revanced-integrations/compare/v0.104.0...v0.105.0) (2023-04-27)

### Bug Fixes

* **youtube/minimized-playback:** disable minimized playback for shorts ([#371](https://github.com/revanced/revanced-integrations/issues/371)) ([df4b03f](df4b03fed5))
* **youtube/return-youtube-dislike:** fix dislikes using wrong font if dark mode is enabled during video playback ([#368](https://github.com/revanced/revanced-integrations/issues/368)) ([3b37a3b](3b37a3b41f))
* **youtube/spoof-signature-verification:** additional fixes for subtitle window positions ([#369](https://github.com/revanced/revanced-integrations/issues/369)) ([6f2ae31](6f2ae313cf))

### Features

* **youtube/sponsorblock:** automatically hide skip button ([#365](https://github.com/revanced/revanced-integrations/issues/365)) ([75dad2f](75dad2f307))
2023-04-27 21:37:45 +00:00
oSumAtrIX
2deacc5035 chore: merge branch dev to main (#370) 2023-04-27 23:35:22 +02:00
oSumAtrIX
46d70a3e00 refactor: use better method name 2023-04-27 21:08:32 +02:00
semantic-release-bot
91ce39378a chore(release): 0.105.0-dev.2 [skip ci]
# [0.105.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.105.0-dev.1...v0.105.0-dev.2) (2023-04-27)

### Bug Fixes

* **youtube/minimized-playback:** disable minimized playback for shorts ([#371](https://github.com/revanced/revanced-integrations/issues/371)) ([df4b03f](df4b03fed5))
2023-04-27 13:40:41 +00:00
LisoUseInAIKyrios
df4b03fed5 fix(youtube/minimized-playback): disable minimized playback for shorts (#371) 2023-04-27 17:38:52 +04:00
semantic-release-bot
9f8063880c chore(release): 0.105.0-dev.1 [skip ci]
# [0.105.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.104.1-dev.2...v0.105.0-dev.1) (2023-04-26)

### Features

* **youtube/sponsorblock:** automatically hide skip button ([#365](https://github.com/revanced/revanced-integrations/issues/365)) ([75dad2f](75dad2f307))
2023-04-26 08:33:11 +00:00
LisoUseInAIKyrios
75dad2f307 feat(youtube/sponsorblock): automatically hide skip button (#365)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-26 12:31:27 +04:00
semantic-release-bot
80dc8f0421 chore(release): 0.104.1-dev.2 [skip ci]
## [0.104.1-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.104.1-dev.1...v0.104.1-dev.2) (2023-04-25)

### Bug Fixes

* **youtube/spoof-signature-verification:** additional fixes for subtitle window positions ([#369](https://github.com/revanced/revanced-integrations/issues/369)) ([6f2ae31](6f2ae313cf))
2023-04-25 13:24:36 +00:00
LisoUseInAIKyrios
6f2ae313cf fix(youtube/spoof-signature-verification): additional fixes for subtitle window positions (#369) 2023-04-25 17:22:52 +04:00
semantic-release-bot
cb7063b2b3 chore(release): 0.104.1-dev.1 [skip ci]
## [0.104.1-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.104.0...v0.104.1-dev.1) (2023-04-25)

### Bug Fixes

* **youtube/return-youtube-dislike:** fix dislikes using wrong font if dark mode is enabled during video playback ([#368](https://github.com/revanced/revanced-integrations/issues/368)) ([3b37a3b](3b37a3b41f))
2023-04-25 12:50:21 +00:00
LisoUseInAIKyrios
3b37a3b41f fix(youtube/return-youtube-dislike): fix dislikes using wrong font if dark mode is enabled during video playback (#368) 2023-04-25 16:48:01 +04:00
semantic-release-bot
13e4be8567 chore(release): 0.104.0 [skip ci]
# [0.104.0](https://github.com/revanced/revanced-integrations/compare/v0.103.0...v0.104.0) (2023-04-24)

### Bug Fixes

* **spoof-wifi-connection:** fixed crash when wifi is disabled ([#363](https://github.com/revanced/revanced-integrations/issues/363)) ([7fc8e88](7fc8e882d8))
* **youtube/hide-video-action-buttons:** fix hide action buttons not working for some users ([#366](https://github.com/revanced/revanced-integrations/issues/366)) ([246deb1](246deb1602))
* **youtube/sponsorblock:** Include milliseconds in the voting menu ([#362](https://github.com/revanced/revanced-integrations/issues/362)) ([6952c50](6952c50595))

### Features

* **youtube/wide-searchbar:** rename patch ([8493f57](8493f57879))
* **youtube:** remove non working patch `hide-my-mix` ([436a84e](436a84ee07))
2023-04-24 15:37:05 +00:00
oSumAtrIX
be7b6f2a20 chore: merge branch dev to main (#364) 2023-04-24 17:35:18 +02:00
semantic-release-bot
b9f6c62060 chore(release): 0.104.0-dev.1 [skip ci]
# [0.104.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.103.1-dev.2...v0.104.0-dev.1) (2023-04-24)

### Features

* **youtube/wide-searchbar:** rename patch ([2320880](2320880a42))
* **youtube:** bump compatibility to `18.15.40` ([#367](https://github.com/revanced/revanced-integrations/issues/367)) ([52a3193](52a3193087))
* **youtube:** remove non working patch `hide-my-mix` ([98edcdd](98edcdd589))
2023-04-24 17:33:46 +02:00
oSumAtrIX
8493f57879 feat(youtube/wide-searchbar): rename patch 2023-04-24 17:33:45 +02:00
oSumAtrIX
436a84ee07 feat(youtube): remove non working patch hide-my-mix 2023-04-24 17:33:45 +02:00
semantic-release-bot
f2603d3d79 chore(release): 0.103.1-dev.2 [skip ci]
## [0.103.1-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.103.1-dev.1...v0.103.1-dev.2) (2023-04-23)

### Bug Fixes

* **youtube/hide-video-action-buttons:** fix hide action buttons not working for some users ([#366](https://github.com/revanced/revanced-integrations/issues/366)) ([afd9b6e](afd9b6e305))
2023-04-24 17:33:45 +02:00
LisoUseInAIKyrios
246deb1602 fix(youtube/hide-video-action-buttons): fix hide action buttons not working for some users (#366) 2023-04-24 17:33:45 +02:00
semantic-release-bot
050766de1d chore(release): 0.103.1-dev.1 [skip ci]
## [0.103.1-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.103.0...v0.103.1-dev.1) (2023-04-22)

### Bug Fixes

* **youtube/sponsorblock:** Include milliseconds in the voting menu ([#362](https://github.com/revanced/revanced-integrations/issues/362)) ([1ada30d](1ada30d5c9))
2023-04-24 17:33:44 +02:00
cane
6952c50595 fix(youtube/sponsorblock): Include milliseconds in the voting menu (#362) 2023-04-24 17:33:44 +02:00
LisoUseInAIKyrios
7fc8e882d8 fix(spoof-wifi-connection): fixed crash when wifi is disabled (#363) 2023-04-24 17:33:43 +02:00
semantic-release-bot
a61148cac2 chore(release): 0.103.0 [skip ci]
# [0.103.0](https://github.com/revanced/revanced-integrations/compare/v0.102.0...v0.103.0) (2023-04-21)

### Bug Fixes

* minor syntax error ([8797765](8797765efa))
* **youtube/general-ads:** hide new types of ads ([#339](https://github.com/revanced/revanced-integrations/issues/339)) ([6528d44](6528d444b4))
* **youtube/hide-video-action-buttons:** fix 'hide share button' ([#360](https://github.com/revanced/revanced-integrations/issues/360)) ([a2af2c0](a2af2c0c9f))
* **youtube/return-youtube-dislike:** fix error toast when voting ([#349](https://github.com/revanced/revanced-integrations/issues/349)) ([e3d923d](e3d923d564))
* **youtube/return-youtube-dislike:** render dislikes when scrolling into the screen ([#350](https://github.com/revanced/revanced-integrations/issues/350)) ([41c07f7](41c07f77f4))
* **youtube/return-youtube-dislike:** stale dislike data shown after opening / closing the app during shorts playback ([#356](https://github.com/revanced/revanced-integrations/issues/356)) ([212e4f2](212e4f2ce4))
* **youtube/settings:** fix dialog not shown if dismissed with back button ([584de16](584de16236))
* **youtube/sponsorblock:** always show the video time without segments using left to right layout ([#359](https://github.com/revanced/revanced-integrations/issues/359)) ([86c2789](86c27890ad))
* **youtube/sponsorblock:** change default behavior to better match the browser ([#353](https://github.com/revanced/revanced-integrations/issues/353)) ([b959c8e](b959c8ef98))
* **youtube/sponsorblock:** settings do not show default behavior ([#351](https://github.com/revanced/revanced-integrations/issues/351)) ([6dbccfd](6dbccfd472))
* **youtube/sponsorblock:** update HTTP user agent ([#344](https://github.com/revanced/revanced-integrations/issues/344)) ([3025103](3025103014))

### Features

* **youtube/general-ads:** block new type of ad ([6265a91](6265a91841))
* **youtube/general-ads:** hide new type of ad ([5ba4cbd](5ba4cbd4e0))
* **youtube/general-ads:** hide new type of ad ([f818490](f8184905bd))
* **youtube/general-ads:** hide new type of movie offer ad ([da7b669](da7b669c97))
* **youtube/settings:** disable preference control if the feature is turned off.  show a dialog explaining side effects of some patches ([#328](https://github.com/revanced/revanced-integrations/issues/328)) ([a0ad968](a0ad968aaa))
* **youtube/sponsorblock:** skip to video highlight ([#352](https://github.com/revanced/revanced-integrations/issues/352)) ([03f09cf](03f09cf7bc))
* **youtube:** user selectable default video speed and quality ([#354](https://github.com/revanced/revanced-integrations/issues/354)) ([14223f4](14223f40b5))
2023-04-21 13:49:05 +00:00
oSumAtrIX
c2ff0c45ab chore: merge branch dev to main (#361) 2023-04-21 15:47:23 +02:00
semantic-release-bot
587689ed7b chore(release): 0.103.0-dev.7 [skip ci]
# [0.103.0-dev.7](https://github.com/revanced/revanced-integrations/compare/v0.103.0-dev.6...v0.103.0-dev.7) (2023-04-20)

### Bug Fixes

* **youtube/hide-video-action-buttons:** fix 'hide share button' ([#360](https://github.com/revanced/revanced-integrations/issues/360)) ([a2af2c0](a2af2c0c9f))
2023-04-20 06:43:27 +00:00
LisoUseInAIKyrios
a2af2c0c9f fix(youtube/hide-video-action-buttons): fix 'hide share button' (#360) 2023-04-20 10:41:36 +04:00
semantic-release-bot
f7c3543d4f chore(release): 0.103.0-dev.6 [skip ci]
# [0.103.0-dev.6](https://github.com/revanced/revanced-integrations/compare/v0.103.0-dev.5...v0.103.0-dev.6) (2023-04-19)

### Bug Fixes

* **youtube/sponsorblock:** always show the video time without segments using left to right layout ([#359](https://github.com/revanced/revanced-integrations/issues/359)) ([86c2789](86c27890ad))
2023-04-19 09:32:27 +00:00
LisoUseInAIKyrios
86c27890ad fix(youtube/sponsorblock): always show the video time without segments using left to right layout (#359) 2023-04-19 13:30:46 +04:00
semantic-release-bot
2ea55af9ce chore(release): 0.103.0-dev.5 [skip ci]
# [0.103.0-dev.5](https://github.com/revanced/revanced-integrations/compare/v0.103.0-dev.4...v0.103.0-dev.5) (2023-04-19)

### Bug Fixes

* **youtube/return-youtube-dislike:** render dislikes when scrolling into the screen ([#350](https://github.com/revanced/revanced-integrations/issues/350)) ([41c07f7](41c07f77f4))
2023-04-19 06:37:56 +00:00
LisoUseInAIKyrios
41c07f77f4 fix(youtube/return-youtube-dislike): render dislikes when scrolling into the screen (#350)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-19 10:36:10 +04:00
semantic-release-bot
48050c1c50 chore(release): 0.103.0-dev.4 [skip ci]
# [0.103.0-dev.4](https://github.com/revanced/revanced-integrations/compare/v0.103.0-dev.3...v0.103.0-dev.4) (2023-04-18)

### Bug Fixes

* minor syntax error ([8797765](8797765efa))
2023-04-18 00:01:33 +00:00
oSumAtrIX
8797765efa fix: minor syntax error 2023-04-18 01:59:32 +02:00
semantic-release-bot
fb8442823e chore(release): 0.103.0-dev.3 [skip ci]
# [0.103.0-dev.3](https://github.com/revanced/revanced-integrations/compare/v0.103.0-dev.2...v0.103.0-dev.3) (2023-04-17)

### Features

* **youtube/general-ads:** hide new type of movie offer ad ([da7b669](da7b669c97))
2023-04-17 23:57:37 +00:00
oSumAtrIX
da7b669c97 feat(youtube/general-ads): hide new type of movie offer ad 2023-04-18 01:55:33 +02:00
semantic-release-bot
4d9b41ca3a chore(release): 0.103.0-dev.2 [skip ci]
# [0.103.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.103.0-dev.1...v0.103.0-dev.2) (2023-04-16)

### Features

* **youtube/sponsorblock:** skip to video highlight ([#352](https://github.com/revanced/revanced-integrations/issues/352)) ([03f09cf](03f09cf7bc))
2023-04-16 18:20:16 +00:00
LisoUseInAIKyrios
03f09cf7bc feat(youtube/sponsorblock): skip to video highlight (#352) 2023-04-16 22:18:32 +04:00
semantic-release-bot
76a01d1b7c chore(release): 0.103.0-dev.1 [skip ci]
# [0.103.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.102.0...v0.103.0-dev.1) (2023-04-16)

### Bug Fixes

* **youtube/general-ads:** hide new types of ads ([#339](https://github.com/revanced/revanced-integrations/issues/339)) ([6528d44](6528d444b4))
* **youtube/return-youtube-dislike:** fix error toast when voting ([#349](https://github.com/revanced/revanced-integrations/issues/349)) ([e3d923d](e3d923d564))
* **youtube/return-youtube-dislike:** stale dislike data shown after opening / closing the app during shorts playback ([#356](https://github.com/revanced/revanced-integrations/issues/356)) ([212e4f2](212e4f2ce4))
* **youtube/settings:** fix dialog not shown if dismissed with back button ([584de16](584de16236))
* **youtube/sponsorblock:** change default behavior to better match the browser ([#353](https://github.com/revanced/revanced-integrations/issues/353)) ([b959c8e](b959c8ef98))
* **youtube/sponsorblock:** settings do not show default behavior ([#351](https://github.com/revanced/revanced-integrations/issues/351)) ([6dbccfd](6dbccfd472))
* **youtube/sponsorblock:** update HTTP user agent ([#344](https://github.com/revanced/revanced-integrations/issues/344)) ([3025103](3025103014))

### Features

* **youtube/general-ads:** block new type of ad ([6265a91](6265a91841))
* **youtube/general-ads:** hide new type of ad ([5ba4cbd](5ba4cbd4e0))
* **youtube/general-ads:** hide new type of ad ([f818490](f8184905bd))
* **youtube/settings:** disable preference control if the feature is turned off.  show a dialog explaining side effects of some patches ([#328](https://github.com/revanced/revanced-integrations/issues/328)) ([a0ad968](a0ad968aaa))
* **youtube:** user selectable default video speed and quality ([#354](https://github.com/revanced/revanced-integrations/issues/354)) ([14223f4](14223f40b5))
2023-04-16 17:32:01 +00:00
LisoUseInAIKyrios
14223f40b5 feat(youtube): user selectable default video speed and quality (#354)
Co-authored-by: johnconner122 <107796137+johnconner122@users.noreply.github.com>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-16 19:27:39 +02:00
oSumAtrIX
5ba4cbd4e0 feat(youtube/general-ads): hide new type of ad 2023-04-16 19:27:39 +02:00
LisoUseInAIKyrios
212e4f2ce4 fix(youtube/return-youtube-dislike): stale dislike data shown after opening / closing the app during shorts playback (#356) 2023-04-16 19:27:38 +02:00
LisoUseInAIKyrios
b959c8ef98 fix(youtube/sponsorblock): change default behavior to better match the browser (#353) 2023-04-16 19:27:38 +02:00
oSumAtrIX
6265a91841 feat(youtube/general-ads): block new type of ad 2023-04-16 19:27:37 +02:00
LisoUseInAIKyrios
6dbccfd472 fix(youtube/sponsorblock): settings do not show default behavior (#351) 2023-04-16 19:27:37 +02:00
LisoUseInAIKyrios
e3d923d564 fix(youtube/return-youtube-dislike): fix error toast when voting (#349) 2023-04-16 19:27:36 +02:00
LisoUseInAIKyrios
80ae9ebbd2 refactor(youtube/settings): remove code that is no longer needed 2023-04-16 19:27:36 +02:00
LisoUseInAIKyrios
584de16236 fix(youtube/settings): fix dialog not shown if dismissed with back button 2023-04-16 19:27:35 +02:00
LisoUseInAIKyrios
a0ad968aaa feat(youtube/settings): disable preference control if the feature is turned off. show a dialog explaining side effects of some patches (#328)
Co-authored-by: semantic-release-bot <semantic-release-bot@martynus.net>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-16 19:27:31 +02:00
LisoUseInAIKyrios
d4de3f6819 refactor(youtube/video-information): include video speed (#345) 2023-04-16 19:26:53 +02:00
oSumAtrIX
22e453706d chore: bump dependencies 2023-04-16 19:26:53 +02:00
oSumAtrIX
bbb07ec9c8 ci: use correct checkmark syntax in PR body 2023-04-16 19:26:52 +02:00
LisoUseInAIKyrios
3025103014 fix(youtube/sponsorblock): update HTTP user agent (#344) 2023-04-16 19:26:52 +02:00
LisoUseInAIKyrios
e3529cfcec refactor(youtube/sponsorblock): improve various implementations (#308)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-16 19:26:52 +02:00
johnconner122
6528d444b4 fix(youtube/general-ads): hide new types of ads (#339) 2023-04-16 19:26:51 +02:00
oSumAtrIX
f8184905bd feat(youtube/general-ads): hide new type of ad 2023-04-16 19:26:51 +02:00
semantic-release-bot
5981e99e56 chore(release): 0.102.0 [skip ci]
# [0.102.0](https://github.com/revanced/revanced-integrations/compare/v0.101.1...v0.102.0) (2023-04-13)

### Features

* **youtube/spoof-signature-verification:** enable by default ([#357](https://github.com/revanced/revanced-integrations/issues/357)) ([214f2c8](214f2c89c2))
2023-04-13 19:30:49 +00:00
Robert
214f2c89c2 feat(youtube/spoof-signature-verification): enable by default (#357) 2023-04-13 21:28:57 +02:00
semantic-release-bot
a7ae215bf7 chore(release): 0.101.1 [skip ci]
## [0.101.1](https://github.com/revanced/revanced-integrations/compare/v0.101.0...v0.101.1) (2023-04-13)

### Bug Fixes

* **youtube/spoof-signature-verification:** additional fixes for subtitle locations ([#346](https://github.com/revanced/revanced-integrations/issues/346)) ([eeddb59](eeddb59b08))
* **youtube/spoof-signature-verification:** fixed subtitles in wrong location ([#343](https://github.com/revanced/revanced-integrations/issues/343)) ([1a0a6ee](1a0a6ee90b))
* **youtube/spoof-signature-verification:** spoof videos in playlists ([86bedb2](86bedb2183))
2023-04-13 04:14:47 +00:00
LisoUseInAIKyrios
eeddb59b08 fix(youtube/spoof-signature-verification): additional fixes for subtitle locations (#346)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-04-13 06:10:52 +02:00
LisoUseInAIKyrios
1a0a6ee90b fix(youtube/spoof-signature-verification): fixed subtitles in wrong location (#343) 2023-04-13 06:10:51 +02:00
oSumAtrIX
86bedb2183 fix(youtube/spoof-signature-verification): spoof videos in playlists 2023-04-13 06:10:50 +02:00
semantic-release-bot
5b9682522e chore(release): 0.101.0 [skip ci]
# [0.101.0](https://github.com/revanced/revanced-integrations/compare/v0.100.1...v0.101.0) (2023-03-29)

### Bug Fixes

* **youtube/remember-playback-speed:**  allow to not remember playback speed ([#338](https://github.com/revanced/revanced-integrations/issues/338)) ([7627e5d](7627e5d057))
* **youtube/return-youtube-dislike:** fix right to left text layout ([#333](https://github.com/revanced/revanced-integrations/issues/333)) ([2dd1431](2dd14313a6))
* **youtube/return-youtube-dislike:** layout fix for low dpi devices ([#335](https://github.com/revanced/revanced-integrations/issues/335)) ([46e0272](46e0272f9e))
* **youtube/spoof-signature-verification:** fix audio during home feed video playback ([#336](https://github.com/revanced/revanced-integrations/issues/336)) ([68d0930](68d09305b9))

### Features

* **youtube/spoof-signature-verification:** automatic signature spoofing ([d16980e](d16980ef2f))
2023-03-29 04:28:34 +00:00
oSumAtrIX
6d32dff400 chore: merge branch dev to main (#334) 2023-03-29 06:26:45 +02:00
semantic-release-bot
5cb5656324 chore(release): 0.101.0-dev.2 [skip ci]
# [0.101.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.101.0-dev.1...v0.101.0-dev.2) (2023-03-19)

### Bug Fixes

* **youtube/remember-playback-speed:**  allow to not remember playback speed ([#338](https://github.com/revanced/revanced-integrations/issues/338)) ([7627e5d](7627e5d057))
2023-03-19 22:02:40 +00:00
LisoUseInAIKyrios
7627e5d057 fix(youtube/remember-playback-speed): allow to not remember playback speed (#338)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-03-19 23:00:34 +01:00
oSumAtrIX
0810f84c4c ci: add dependency section when opening a PR 2023-03-19 22:58:15 +01:00
semantic-release-bot
8301fa07fd chore(release): 0.101.0-dev.1 [skip ci]
# [0.101.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.100.2-dev.3...v0.101.0-dev.1) (2023-03-17)

### Features

* **youtube/spoof-signature-verification:** automatic signature spoofing ([d16980e](d16980ef2f))
2023-03-17 18:00:46 +00:00
LisoUseInAIKyrios
d16980ef2f feat(youtube/spoof-signature-verification): automatic signature spoofing
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-03-17 21:59:04 +04:00
semantic-release-bot
83510e51b3 chore(release): 0.100.2-dev.3 [skip ci]
## [0.100.2-dev.3](https://github.com/revanced/revanced-integrations/compare/v0.100.2-dev.2...v0.100.2-dev.3) (2023-03-15)

### Bug Fixes

* **youtube/spoof-signature-verification:** fix audio during home feed video playback ([#336](https://github.com/revanced/revanced-integrations/issues/336)) ([68d0930](68d09305b9))
2023-03-15 17:41:14 +00:00
LisoUseInAIKyrios
68d09305b9 fix(youtube/spoof-signature-verification): fix audio during home feed video playback (#336)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-03-15 21:39:18 +04:00
semantic-release-bot
dc5c1b45ba chore(release): 0.100.2-dev.2 [skip ci]
## [0.100.2-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.100.2-dev.1...v0.100.2-dev.2) (2023-03-14)

### Bug Fixes

* **youtube/return-youtube-dislike:** layout fix for low dpi devices ([#335](https://github.com/revanced/revanced-integrations/issues/335)) ([46e0272](46e0272f9e))
2023-03-14 22:46:09 +00:00
LisoUseInAIKyrios
46e0272f9e fix(youtube/return-youtube-dislike): layout fix for low dpi devices (#335) 2023-03-15 02:44:05 +04:00
semantic-release-bot
69ccb5fc05 chore(release): 0.100.2-dev.1 [skip ci]
## [0.100.2-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.100.1...v0.100.2-dev.1) (2023-03-14)

### Bug Fixes

* **youtube/return-youtube-dislike:** fix right to left text layout ([#333](https://github.com/revanced/revanced-integrations/issues/333)) ([2dd1431](2dd14313a6))
2023-03-14 18:54:35 +00:00
LisoUseInAIKyrios
2dd14313a6 fix(youtube/return-youtube-dislike): fix right to left text layout (#333) 2023-03-14 22:52:45 +04:00
LisoUseInAIKyrios
5e518855d1 fixing LTR layout 2023-03-14 22:40:05 +04:00
semantic-release-bot
52ac4acff3 chore(release): 0.100.1 [skip ci]
## [0.100.1](https://github.com/revanced/revanced-integrations/compare/v0.100.0...v0.100.1) (2023-03-14)

### Bug Fixes

* minor syntax issue ([1e1504d](1e1504d118))
2023-03-14 15:28:44 +00:00
oSumAtrIX
a08bc53828 chore: merge branch dev to main (#332) 2023-03-14 16:26:48 +01:00
semantic-release-bot
5d7dc94d8d chore(release): 0.100.1-dev.1 [skip ci]
## [0.100.1-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.100.0...v0.100.1-dev.1) (2023-03-14)

### Bug Fixes

* minor syntax issue ([1e1504d](1e1504d118))
2023-03-14 15:25:08 +00:00
oSumAtrIX
1e1504d118 fix: minor syntax issue 2023-03-14 16:23:20 +01:00
semantic-release-bot
393d6e62f2 chore(release): 0.100.0 [skip ci]
# [0.100.0](https://github.com/revanced/revanced-integrations/compare/v0.99.0...v0.100.0) (2023-03-14)

### Bug Fixes

* **youtube/general-ads:** hide any kind of buttoned ad ([0b3508b](0b3508bd8d))
* **youtube/general-ads:** hide chapters in video description ([#326](https://github.com/revanced/revanced-integrations/issues/326)) ([f31e3a0](f31e3a02a0))
* **youtube/hide-floating-microphone-button:** reboot when changing settings ([919f285](919f2855ed))
* **youtube/remember-video-quality:** treat any connection as wifi except mobile and bluetooth ([1f90f7b](1f90f7b9cc))
* **youtube/return-youtube-dislike:** improve segmented like/dislike layout ([416c695](416c695837))

### Features

* **youtube/general-ads:** do not hide components in library tab ([3c00e58](3c00e58c13))
* **youtube/general-ads:** hide image shelf from search results ([db6ce55](db6ce55477))
* **youtube/general-ads:** hide new type of ad ([844bc3b](844bc3b24f))
* **youtube/general-ads:** hide new type of ad ([#331](https://github.com/revanced/revanced-integrations/issues/331)) ([7e64e05](7e64e05709))
* **youtube/hide-autoplay-button:** do not disable autoplay button when hidden ([519c2bd](519c2bd511))
* **youtube:** `hide-floating-microphone-button` patch ([cb77e96](cb77e96da9))
* **youtube:** remove `custom-video-buffer` patch ([#1718](https://github.com/revanced/revanced-integrations/issues/1718)) ([d5919a8](d5919a8a2c))
2023-03-14 15:01:22 +00:00
oSumAtrIX
1361595076 chore: merge branch dev to main (#324) 2023-03-14 15:59:09 +01:00
semantic-release-bot
2f5c839613 chore(release): 0.100.0-dev.6 [skip ci]
# [0.100.0-dev.6](https://github.com/revanced/revanced-integrations/compare/v0.100.0-dev.5...v0.100.0-dev.6) (2023-03-14)

### Bug Fixes

* **youtube/hide-floating-microphone-button:** reboot when changing settings ([919f285](919f2855ed))
* **youtube/remember-video-quality:** treat any connection as wifi except mobile and bluetooth ([1f90f7b](1f90f7b9cc))
* **youtube/return-youtube-dislike:** improve segmented like/dislike layout ([416c695](416c695837))

### Features

* **youtube/general-ads:** hide new type of ad ([844bc3b](844bc3b24f))
* **youtube/general-ads:** hide new type of ad ([#331](https://github.com/revanced/revanced-integrations/issues/331)) ([7e64e05](7e64e05709))
* **youtube:** remove `custom-video-buffer` patch ([#1718](https://github.com/revanced/revanced-integrations/issues/1718)) ([d5919a8](d5919a8a2c))
2023-03-14 14:30:11 +00:00
johnconner122
7e64e05709 feat(youtube/general-ads): hide new type of ad (#331)
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-03-14 15:26:31 +01:00
oSumAtrIX
d5919a8a2c feat(youtube): remove custom-video-buffer patch (#1718) 2023-03-14 15:26:30 +01:00
oSumAtrIX
844bc3b24f feat(youtube/general-ads): hide new type of ad 2023-03-14 15:26:30 +01:00
oSumAtrIX
67fa87051f chore: fix logging message 2023-03-14 15:26:30 +01:00
oSumAtrIX
1f90f7b9cc fix(youtube/remember-video-quality): treat any connection as wifi except mobile and bluetooth 2023-03-14 15:26:29 +01:00
semantic-release-bot
0c725218fd chore(release): 0.100.0-dev.6 [skip ci]
# [0.100.0-dev.6](https://github.com/revanced/revanced-integrations/compare/v0.100.0-dev.5...v0.100.0-dev.6) (2023-02-26)

### Bug Fixes

* **youtube/hide-floating-microphone-button:** reboot when changing settings ([919f285](919f2855ed))
2023-03-14 15:26:00 +01:00
LisousEinaiKyrios
416c695837 fix(youtube/return-youtube-dislike): improve segmented like/dislike layout 2023-03-14 15:26:00 +01:00
oSumAtrIX
919f2855ed fix(youtube/hide-floating-microphone-button): reboot when changing settings
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-27 00:23:59 +01:00
semantic-release-bot
040ba24640 chore(release): 0.100.0-dev.5 [skip ci]
# [0.100.0-dev.5](https://github.com/revanced/revanced-integrations/compare/v0.100.0-dev.4...v0.100.0-dev.5) (2023-02-26)

### Features

* **youtube/hide-autoplay-button:** do not disable autoplay button when hidden ([519c2bd](519c2bd511))
* **youtube:** `hide-floating-microphone-button` patch ([cb77e96](cb77e96da9))
2023-02-26 22:17:18 +00:00
oSumAtrIX
a1d4fabaaf refactor(youtube/settings): remove unused code
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 23:15:36 +01:00
oSumAtrIX
66bcf12dc6 refactor(youtube/settings): remove deprecated settings
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 23:15:35 +01:00
oSumAtrIX
7dc6bb4428 refactor(youtube/settings): use default parameter
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 23:15:35 +01:00
oSumAtrIX
24162934ba refactor(youtube/hide-timestamp): use better descriptions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 23:15:35 +01:00
oSumAtrIX
cb77e96da9 feat(youtube): hide-floating-microphone-button patch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 23:15:34 +01:00
oSumAtrIX
519c2bd511 feat(youtube/hide-autoplay-button): do not disable autoplay button when hidden
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 23:15:34 +01:00
semantic-release-bot
8a8924ab09 chore(release): 0.100.0-dev.4 [skip ci]
# [0.100.0-dev.4](https://github.com/revanced/revanced-integrations/compare/v0.100.0-dev.3...v0.100.0-dev.4) (2023-02-26)

### Bug Fixes

* **youtube/general-ads:** hide any kind of buttoned ad ([0b3508b](0b3508bd8d))
2023-02-26 21:19:20 +00:00
oSumAtrIX
0b3508bd8d fix(youtube/general-ads): hide any kind of buttoned ad
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-26 22:17:31 +01:00
semantic-release-bot
db60d983e5 chore(release): 0.100.0-dev.3 [skip ci]
# [0.100.0-dev.3](https://github.com/revanced/revanced-integrations/compare/v0.100.0-dev.2...v0.100.0-dev.3) (2023-02-25)

### Bug Fixes

* **youtube/general-ads:** hide chapters in video description ([#326](https://github.com/revanced/revanced-integrations/issues/326)) ([f31e3a0](f31e3a02a0))
2023-02-25 15:26:37 +00:00
johnconner122
f31e3a02a0 fix(youtube/general-ads): hide chapters in video description (#326) 2023-02-25 16:24:45 +01:00
semantic-release-bot
f758b09676 chore(release): 0.100.0-dev.2 [skip ci]
# [0.100.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.100.0-dev.1...v0.100.0-dev.2) (2023-02-24)

### Features

* **youtube/general-ads:** do not hide components in library tab ([3c00e58](3c00e58c13))
2023-02-24 23:13:28 +00:00
oSumAtrIX
3c00e58c13 feat(youtube/general-ads): do not hide components in library tab
This reverts commit fd975ecd

Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-25 00:09:48 +01:00
semantic-release-bot
0b83be989b chore(release): 0.100.0-dev.1 [skip ci]
# [0.100.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.99.0...v0.100.0-dev.1) (2023-02-24)

### Features

* **youtube/general-ads:** hide image shelf from search results ([db6ce55](db6ce55477))
2023-02-24 03:16:12 +00:00
oSumAtrIX
db6ce55477 feat(youtube/general-ads): hide image shelf from search results
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-24 04:14:08 +01:00
semantic-release-bot
0b1b6b3682 chore(release): 0.99.0 [skip ci]
# [0.99.0](https://github.com/revanced/revanced-integrations/compare/v0.98.0...v0.99.0) (2023-02-24)

### Bug Fixes

* **youtube/general-ads:** check for quick actions in path instead of component identifier ([476902e](476902e9ce))
* **youtube/general-ads:** use correct setting to hide related videos in quick actions ([e626bd0](e626bd08c1))
* **youtube/general-ads:** use correct setting to hide related videos in quick actions ([05bfc68](05bfc68907))

### Features

* **youtube/general-ads:** hide quick actions in fullscreen ([ae862cb](ae862cbac6))
* **youtube/general-ads:** hide related videos in quick action ([cfc571c](cfc571c12c))
* **youtube/return-youtube-dislike:** support for shorts ([#312](https://github.com/revanced/revanced-integrations/issues/312)) ([0aef5e6](0aef5e60e2))
* **youtube:** remove patch `open-links-directly` ([dce882b](dce882b128))
2023-02-24 02:49:24 +00:00
oSumAtrIX
b612cbf2c0 chore: merge branch dev to main (#323) 2023-02-24 03:47:25 +01:00
semantic-release-bot
10fff6a0b8 chore(release): 0.99.0-dev.4 [skip ci]
# [0.99.0-dev.4](https://github.com/revanced/revanced-integrations/compare/v0.99.0-dev.3...v0.99.0-dev.4) (2023-02-24)

### Bug Fixes

* **youtube/general-ads:** check for quick actions in path instead of component identifier ([476902e](476902e9ce))
* **youtube/general-ads:** use correct setting to hide related videos in quick actions ([e626bd0](e626bd08c1))
* **youtube/general-ads:** use correct setting to hide related videos in quick actions ([05bfc68](05bfc68907))
2023-02-24 02:30:21 +00:00
oSumAtrIX
e626bd08c1 fix(youtube/general-ads): use correct setting to hide related videos in quick actions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-24 03:28:27 +01:00
oSumAtrIX
476902e9ce fix(youtube/general-ads): check for quick actions in path instead of component identifier
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-24 03:28:26 +01:00
oSumAtrIX
05bfc68907 fix(youtube/general-ads): use correct setting to hide related videos in quick actions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-24 03:28:26 +01:00
semantic-release-bot
c3364226b8 chore(release): 0.99.0-dev.3 [skip ci]
# [0.99.0-dev.3](https://github.com/revanced/revanced-integrations/compare/v0.99.0-dev.2...v0.99.0-dev.3) (2023-02-24)

### Features

* **youtube/return-youtube-dislike:** support for shorts ([#312](https://github.com/revanced/revanced-integrations/issues/312)) ([0aef5e6](0aef5e60e2))
2023-02-24 02:01:49 +00:00
LisoUseInAIKyrios
0aef5e60e2 feat(youtube/return-youtube-dislike): support for shorts (#312)
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
Co-authored-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-24 02:59:32 +01:00
semantic-release-bot
fb1a69a7ba chore(release): 0.99.0-dev.2 [skip ci]
# [0.99.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.99.0-dev.1...v0.99.0-dev.2) (2023-02-23)

### Features

* **youtube/general-ads:** hide quick actions in fullscreen ([ae862cb](ae862cbac6))
* **youtube/general-ads:** hide related videos in quick action ([cfc571c](cfc571c12c))
2023-02-23 12:33:42 +00:00
oSumAtrIX
cfc571c12c feat(youtube/general-ads): hide related videos in quick action
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-23 13:31:15 +01:00
oSumAtrIX
ae862cbac6 feat(youtube/general-ads): hide quick actions in fullscreen
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-23 13:30:49 +01:00
oSumAtrIX
178b90b490 ci: fix backmerge direction
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 16:40:05 +01:00
101 changed files with 6402 additions and 4778 deletions

2
.github/config.yml vendored Normal file
View File

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

View File

@@ -21,5 +21,10 @@ jobs:
with:
destination_branch: 'main'
pr_title: 'chore: ${{ env.MESSAGE }}'
pr_body: 'This pull request will ${{ env.MESSAGE }}.'
pr_draft: true
pr_body: |
This pull request will ${{ env.MESSAGE }}.
## Dependencies before merge
- [ ] https://github.com/revanced/revanced-patches
pr_draft: true

View File

@@ -34,7 +34,7 @@
[
"@saithodev/semantic-release-backmerge",
{
backmergeBranches: [{"from": "dev", "to": "main"}],
backmergeBranches: [{"from": "main", "to": "dev"}],
clearWorkspace: true
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -43,8 +43,8 @@ android {
dependencies {
compileOnly(project(mapOf("path" to ":dummy")))
compileOnly("androidx.annotation:annotation:1.5.0")
compileOnly("androidx.appcompat:appcompat:1.6.1")
compileOnly("androidx.annotation:annotation:1.6.0")
compileOnly("androidx.appcompat:appcompat:1.7.0-alpha02")
compileOnly("com.squareup.okhttp3:okhttp:5.0.0-alpha.11")
compileOnly("com.squareup.retrofit2:retrofit:2.9.0")
}

View File

@@ -20,6 +20,8 @@
# hide the original source file name.
#-renamesourcefileattribute SourceFile
-dontobfuscate
-dontoptimize
-keepattributes * # https://www.guardsquare.com/manual/configuration/attributes
-keep class app.revanced.** {
*;
}

View File

@@ -1,60 +1,31 @@
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
pathRegister.registerAll(
new BlockRule(SettingsEnum.HIDE_LIKE_DISLIKE_BUTTON, "|like_button", "dislike_button"),
new BlockRule(SettingsEnum.HIDE_DOWNLOAD_BUTTON, "download_button"),
new BlockRule(SettingsEnum.HIDE_PLAYLIST_BUTTON, "save_to_playlist_button"),
new BlockRule(SettingsEnum.HIDE_CLIP_BUTTON, "|clip_button.eml|"),
new BlockRule(SettingsEnum.HIDE_ACTION_BUTTONS, "ContainerType|video_action_button", "|CellType|CollectionType|CellType|ContainerType|button.eml|")
);
}
private boolean hideActionBar() {
for (BlockRule rule : rules) if (!rule.isEnabled()) return false;
private boolean canHideActionBar() {
for (BlockRule rule : pathRegister) 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;
// If everything is hidden, then also hide the video bar itself.
if (canHideActionBar() && 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.printDebug(() -> "Hiding share button");
return true;
} else return false;
}
if ((currentIsActionButton && ActionButton.doNotBlockCounter <= 0 && actionButtonsRule.isEnabled()) || pathRegister.contains(path)) {
LogHelper.printDebug(() -> "Blocked: " + path);
return true;
} else return false;
}
static class ActionButton {
public static int doNotBlockCounter = 4;
return pathRegister.contains(path);
}
}

View File

@@ -1,25 +1,21 @@
package app.revanced.integrations.patches;
import android.content.Context;
import android.widget.Toast;
import static app.revanced.integrations.utils.StringRef.str;
import app.revanced.integrations.sponsorblock.StringRef;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public class CopyVideoUrlPatch {
public static void copyUrl(Boolean withTimestamp) {
try {
String url = String.format("https://youtu.be/%s", VideoInformation.getCurrentVideoId());
String url = String.format("https://youtu.be/%s", VideoInformation.getVideoId());
if (withTimestamp) {
long seconds = VideoInformation.getVideoTime() / 1000;
url += String.format("?t=%s", seconds);
}
Context context = ReVancedUtils.getContext();
ReVancedUtils.setClipboard(url);
if (context != null) Toast.makeText(context, StringRef.str("share_copy_url_success"), Toast.LENGTH_SHORT).show();
ReVancedUtils.showToastShort(str("share_copy_url_success"));
} catch (Exception e) {
LogHelper.printException(() -> "Failed to generate video url", e);
}

View File

@@ -33,20 +33,24 @@ public final class GeneralAdsPatch extends Filter {
var infoPanel = new BlockRule(SettingsEnum.ADREMOVER_INFO_PANEL_REMOVAL, "publisher_transparency_panel", "single_item_information_panel");
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 audioTrackButton = new BlockRule(SettingsEnum.HIDE_AUDIO_TRACK_BUTTON, "multi_feed_icon_button");
var artistCard = new BlockRule(SettingsEnum.HIDE_ARTIST_CARDS, "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 chapterTeaser = new BlockRule(SettingsEnum.ADREMOVER_CHAPTER_TEASER_REMOVAL, "expandable_metadata", "macro_markers_carousel");
var viewProducts = new BlockRule(SettingsEnum.ADREMOVER_VIEW_PRODUCTS, "product_item", "products_in_video");
var webLinkPanel = new BlockRule(SettingsEnum.ADREMOVER_WEB_SEARCH_RESULTS, "web_link_panel");
var horizontalVideoShelf = new BlockRule(SettingsEnum.ADREMOVER_HORIZONTAL_VIDEO_SHELF, "horizontal_video_shelf");
var channelBar = new BlockRule(SettingsEnum.ADREMOVER_CHANNEL_BAR, "channel_bar");
var relatedVideos = new BlockRule(SettingsEnum.ADREMOVER_RELATED_VIDEOS, "fullscreen_related_videos");
var quickActions = new BlockRule(SettingsEnum.ADREMOVER_QUICK_ACTIONS, "quick_actions");
var imageShelf = new BlockRule(SettingsEnum.ADREMOVER_IMAGE_SHELF, "image_shelf");
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",
"_buttoned_layout",
"full_width_square_image_layout",
"_ad_with",
"video_display_button_group_layout",
"landscape_image_wide_button_layout"
);
var generalAds = new BlockRule(
@@ -57,7 +61,13 @@ public final class GeneralAdsPatch extends Filter {
"watch_metadata_app_promo",
"video_display_full_layout",
"hero_promo_image",
"statement_banner"
"statement_banner",
"carousel_footered_layout",
"text_image_button_layout",
"primetime_promo",
"product_details",
"full_width_portrait_image_layout",
"brand_video_shelf"
);
var movieAds = new BlockRule(
SettingsEnum.ADREMOVER_MOVIE_REMOVAL,
@@ -65,7 +75,8 @@ public final class GeneralAdsPatch extends Filter {
"compact_movie",
"horizontal_movie_shelf",
"movie_and_show_upsell_card",
"compact_tvfilm_item"
"compact_tvfilm_item",
"offer_module_root"
);
this.pathRegister.registerAll(
@@ -78,6 +89,8 @@ public final class GeneralAdsPatch extends Filter {
movieAds,
chapterTeaser,
communityGuidelines,
quickActions,
relatedVideos,
compactBanner,
inFeedSurvey,
viewProducts,
@@ -85,10 +98,11 @@ public final class GeneralAdsPatch extends Filter {
merchandise,
infoPanel,
channelGuidelines,
audioTrackButton,
artistCard,
selfSponsor,
webLinkPanel,
horizontalVideoShelf,
imageShelf,
subscribersCommunityGuidelines,
channelMemberShelf
);

View File

@@ -3,8 +3,7 @@ package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class HideAutoplayButtonPatch {
public static boolean isButtonShown() {
return SettingsEnum.HIDE_AUTOPLAY_BUTTON.getBoolean() == false;
return !SettingsEnum.HIDE_AUTOPLAY_BUTTON.getBoolean();
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public final class HideFloatingMicrophoneButtonPatch {
public static boolean hideFloatingMicrophoneButton(final boolean original) {
return SettingsEnum.HIDE_FLOATING_MICROPHONE_BUTTON.getBoolean() || original;
}
}

View File

@@ -0,0 +1,12 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class HideGetPremiumPatch {
/**
* Injection point.
*/
public static boolean hideGetPremiumView() {
return SettingsEnum.HIDE_GET_PREMIUM.getBoolean();
}
}

View File

@@ -1,14 +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 HideMixPlaylistsPatch {
public static void hideMixPlaylists(View view) {
if (!SettingsEnum.HIDE_MIX_PLAYLISTS.getBoolean()) return;
AdRemoverAPI.HideViewWithLayout1dp(view);
}
}

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 HideReelsPatch {
/**
* Used by app.revanced.patches.youtube.layout.reels.patch.HideReelsPatch
*
* @param view
*/
public static void HideReel(View view) {
if (SettingsEnum.HIDE_REEL_BUTTON.getBoolean()) {
AdRemoverAPI.HideViewWithLayout1dp(view);
}
}
}

View File

@@ -1,9 +0,0 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class HideTimePatch {
public static boolean hideTime() {
return SettingsEnum.HIDE_TIME.getBoolean();
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class HideTimestampPatch {
public static boolean hideTimestamp() {
return SettingsEnum.HIDE_TIMESTAMP.getBoolean();
}
}

View File

@@ -1,9 +1,6 @@
package app.revanced.integrations.patches;
import static app.revanced.integrations.utils.ReVancedUtils.getContext;
import android.content.Context;
import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.ThemeHelper;
public class LithoThemePatch {
@@ -44,29 +41,15 @@ public class LithoThemePatch {
}
private static int getBlackColor() {
if (blackColor == 0) blackColor = getColor("yt_black1");
if (blackColor == 0) blackColor = ReVancedUtils.getResourceColor("yt_black1");
return blackColor;
}
private static int getWhiteColor() {
if (whiteColor == 0) whiteColor = getColor("yt_white1");
if (whiteColor == 0) whiteColor = ReVancedUtils.getResourceColor("yt_white1");
return whiteColor;
}
/**
* Determines the color for a color resource.
*
* @param name The color resource name.
* @return The value of the color.
*/
private static int getColor(String name) {
Context context = getContext();
return context != null ? context.getColor(context.getResources()
.getIdentifier(name, "color", context.getPackageName())
) : 0;
}
private static boolean anyEquals(int value, int... of) {
for (int v : of) if (value == v) return true;
return false;

View File

@@ -1,16 +1,17 @@
package app.revanced.integrations.patches;
import static app.revanced.integrations.utils.StringRef.str;
import android.annotation.TargetApi;
import android.content.Context;
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;
import java.util.Objects;
import static app.revanced.integrations.sponsorblock.StringRef.str;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public class MicroGSupport {
private static final String MICROG_VENDOR = "com.mgoogle";
@@ -20,7 +21,7 @@ public class MicroGSupport {
private static final Uri VANCED_MICROG_PROVIDER = Uri.parse("content://" + MICROG_VENDOR + ".android.gsf.gservices/prefix");
private static void startIntent(Context context, String uriString, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
ReVancedUtils.showToastLong(message);
var intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
@@ -28,6 +29,7 @@ public class MicroGSupport {
context.startActivity(intent);
}
@TargetApi(26)
public static void checkAvailability() {
var context = Objects.requireNonNull(ReVancedUtils.getContext());
@@ -41,10 +43,11 @@ public class MicroGSupport {
System.exit(0);
}
try (var client = context.getContentResolver().acquireContentProviderClient(VANCED_MICROG_PROVIDER)) {
if (client != null) return;
LogHelper.printInfo(() -> "Vanced MicroG is not running in the background");
startIntent(context, DONT_KILL_MY_APP_LINK, str("microg_not_running_warning"));
}
}
}
}

View File

@@ -1,16 +1,17 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.shared.PlayerType;
public class MinimizedPlaybackPatch {
public static boolean isNotPlayingShorts(boolean isPipEnabled) {
return !PlayerType.getCurrent().isNoneOrHidden() && isPipEnabled;
public static boolean isPlaybackNotShort() {
return !PlayerType.getCurrent().isNoneOrHidden();
}
public static boolean isMinimizedPlaybackEnabled() {
return SettingsEnum.ENABLE_MINIMIZED_PLAYBACK.getBoolean();
public static boolean overrideMinimizedPlaybackAvailable() {
// This could be done entirely in the patch,
// but having a unique method to search for makes manually inspecting the patched apk much easier.
return true;
}
}

View File

@@ -1,12 +0,0 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class NewActionbarPatch {
//Used by app.revanced.patches.youtube.layout.widesearchbar.patch.WideSearchbarPatch
public static boolean getNewActionBar() {
return SettingsEnum.WIDE_SEARCHBAR.getBoolean(); // TODO: maybe this has to be inverted
}
}

View File

@@ -28,7 +28,7 @@ public class PlayerTypeHookPatch {
LogHelper.printException(() -> "Unknown PlayerType encountered: " + type);
} else {
PlayerType.setCurrent(newType);
LogHelper.printDebug(() -> "YouTubePlayerOverlaysLayout player type was updated to " + newType);
LogHelper.printDebug(() -> "PlayerType was updated to: " + newType);
}
}
}

View File

@@ -1,39 +1,202 @@
package app.revanced.integrations.patches;
import static app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike.Vote;
import android.text.Editable;
import android.text.Spannable;
import android.text.Spanned;
import android.text.TextWatcher;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicReference;
import app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.shared.PlayerType;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
/**
* Used by app.revanced.patches.youtube.layout.returnyoutubedislike.patch.ReturnYouTubeDislikePatch
*/
public class ReturnYouTubeDislikePatch {
/**
* Called when the video id changes
* Resource identifier of old UI dislike button.
*/
public static void newVideoLoaded(String videoId) {
ReturnYouTubeDislike.newVideoLoaded(videoId);
}
private static final int OLD_UI_DISLIKE_BUTTON_RESOURCE_ID
= ReVancedUtils.getResourceIdentifier("dislike_button", "id");
/**
* Called when a litho text component is created
* Dislikes text label used by old UI.
*/
public static void onComponentCreated(Object conversionContext, AtomicReference<Object> textRef) {
ReturnYouTubeDislike.onComponentCreated(conversionContext, textRef);
}
@NonNull
private static WeakReference<TextView> oldUITextViewRef = new WeakReference<>(null);
/**
* Called when the like/dislike button is clicked
*
* @param vote -1 (dislike), 0 (none) or 1 (like)
* Original old UI 'Dislikes' text before patch modifications.
* Required to reset the dislikes when changing videos and RYD is not available.
* Set only once during the first load.
*/
public static void sendVote(int vote) {
for (ReturnYouTubeDislike.Vote v : ReturnYouTubeDislike.Vote.values()) {
if (v.value == vote) {
ReturnYouTubeDislike.sendVote(v);
private static Spanned oldUIOriginalSpan;
/**
* Replacement span that contains dislike value. Used by {@link #oldUiTextWatcher}.
*/
@Nullable
private static Spanned oldUIReplacementSpan;
/**
* Old UI dislikes can be set multiple times by YouTube.
* To prevent it from reverting changes made here, this listener overrides any future changes YouTube makes.
*/
private static final TextWatcher oldUiTextWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
public void afterTextChanged(Editable s) {
if (oldUIReplacementSpan == null || oldUIReplacementSpan.toString().equals(s.toString())) {
return;
}
s.replace(0, s.length(), oldUIReplacementSpan);
}
};
private static void updateOldUIDislikesTextView() {
TextView oldUITextView = oldUITextViewRef.get();
if (oldUITextView == null) {
return;
}
oldUIReplacementSpan = ReturnYouTubeDislike.getDislikesSpanForRegularVideo(oldUIOriginalSpan, false);
if (!oldUIReplacementSpan.equals(oldUITextView.getText())) {
oldUITextView.setText(oldUIReplacementSpan);
}
}
/**
* Injection point. Called on main thread.
*
* Used when spoofing the older app versions of {@link SpoofAppVersionPatch}.
*/
public static void setOldUILayoutDislikes(int buttonViewResourceId, @NonNull TextView textView) {
try {
if (!SettingsEnum.RYD_ENABLED.getBoolean()
|| buttonViewResourceId != OLD_UI_DISLIKE_BUTTON_RESOURCE_ID) {
return;
}
if (oldUIOriginalSpan == null) {
// Use value of the first instance, as it appears TextViews can be recycled
// and might contain dislikes previously added by the patch.
oldUIOriginalSpan = (Spanned) textView.getText();
}
oldUITextViewRef = new WeakReference<>(textView);
// No way to check if a listener is already attached, so remove and add again.
textView.removeTextChangedListener(oldUiTextWatcher);
textView.addTextChangedListener(oldUiTextWatcher);
updateOldUIDislikesTextView();
} catch (Exception ex) {
LogHelper.printException(() -> "setOldUILayoutDislikes failure", ex);
}
}
/**
* Injection point.
*/
public static void newVideoLoaded(@NonNull String videoId) {
try {
if (!SettingsEnum.RYD_ENABLED.getBoolean()) return;
ReturnYouTubeDislike.newVideoLoaded(videoId);
} catch (Exception ex) {
LogHelper.printException(() -> "newVideoLoaded failure", ex);
}
}
/**
* Injection point.
*
* Called when a litho text component is initially created,
* and also when a Span is later reused again (such as scrolling off/on screen).
*
* This method is sometimes called on the main thread, but it usually is called _off_ the main thread.
* This method can be called multiple times for the same UI element (including after dislikes was added).
*
* @param textRef Cache reference to the like/dislike char sequence,
* which may or may not be the same as the original span parameter.
* If dislikes are added, the atomic reference must be set to the replacement span.
* @param original Original span that was created or reused by Litho.
* @return The original span (if nothing should change), or a replacement span that contains dislikes.
*/
@NonNull
public static CharSequence onLithoTextLoaded(@NonNull Object conversionContext,
@NonNull AtomicReference<CharSequence> textRef,
@NonNull CharSequence original) {
try {
if (!SettingsEnum.RYD_ENABLED.getBoolean() || PlayerType.getCurrent().isNoneOrHidden()) {
return original;
}
String conversionContextString = conversionContext.toString();
final boolean isSegmentedButton;
if (conversionContextString.contains("|segmented_like_dislike_button.eml|")) {
isSegmentedButton = true;
} else if (conversionContextString.contains("|dislike_button.eml|")) {
isSegmentedButton = false;
} else {
return original;
}
Spanned replacement = ReturnYouTubeDislike.getDislikesSpanForRegularVideo((Spannable) original, isSegmentedButton);
textRef.set(replacement);
return replacement;
} catch (Exception ex) {
LogHelper.printException(() -> "onLithoTextLoaded failure", ex);
}
return original;
}
/**
* Injection point.
*
* Called when a Shorts dislike Spanned is created.
*/
public static Spanned onShortsComponentCreated(Spanned original) {
try {
if (!SettingsEnum.RYD_ENABLED.getBoolean()) {
return original;
}
return ReturnYouTubeDislike.getDislikeSpanForShort(original);
} catch (Exception ex) {
LogHelper.printException(() -> "onShortsComponentCreated failure", ex);
}
return original;
}
/**
* Injection point.
*
* Called when the user likes or dislikes.
*
* @param vote int that matches {@link ReturnYouTubeDislike.Vote#value}
*/
public static void sendVote(int vote) {
try {
if (!SettingsEnum.RYD_ENABLED.getBoolean()) {
return;
}
for (Vote v : Vote.values()) {
if (v.value == vote) {
ReturnYouTubeDislike.sendVote(v);
updateOldUIDislikesTextView();
return;
}
}
LogHelper.printException(() -> "Unknown vote type: " + vote);
} catch (Exception ex) {
LogHelper.printException(() -> "sendVote failure", ex);
}
}
}

View File

@@ -5,10 +5,8 @@ import app.revanced.integrations.settings.SettingsEnum;
public class SpoofAppVersionPatch {
public static String getYouTubeVersionOverride(String version) {
if (SettingsEnum.SPOOF_APP_VERSION.getBoolean()){
// Override with the most recent version that does not show the new UI player layout.
// If the new UI shows up for some users, then change this to an older version (such as 17.29.34).
return "17.30.34";
if (SettingsEnum.SPOOF_APP_VERSION.getBoolean()) {
return SettingsEnum.SPOOF_APP_VERSION_TARGET.getString();
}
return version;
}

View File

@@ -0,0 +1,224 @@
package app.revanced.integrations.patches;
import static app.revanced.integrations.utils.ReVancedUtils.containsAny;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.shared.PlayerType;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public class SpoofSignatureVerificationPatch {
/**
* Protobuf parameters used for autoplay in scrim.
* Prepend this parameter to mute video playback (for autoplay in feed)
*/
private static final String PROTOBUF_PARAMETER_SCRIM = "SAFgAXgB";
/**
* Protobuf parameter of shorts and YouTube stories.
* Known issue: captions are positioned on upper area in the player.
*/
private static final String PROTOBUF_PARAMETER_SHORTS = "8AEB"; // "8AEByAMTuAQP"
/**
* Target Protobuf parameters.
*/
private static final String[] PROTOBUF_PARAMETER_TARGETS = {
"YAHI", // Autoplay in feed
"SAFg" // Autoplay in scrim
};
/**
* On app first start, the first video played usually contains a single non-default window setting value
* and all other subtitle settings for the video are (incorrect) default shorts window settings.
* For this situation, the shorts settings must be replaced.
*
* But some videos use multiple text positions on screen (such as https://youtu.be/3hW1rMNC89o),
* and by chance many of the subtitles uses window positions that match a default shorts position.
* To handle these videos, selectively allowing the shorts specific window settings to 'pass thru' unchanged,
* but only if the video contains multiple non-default subtitle window positions.
*
* Do not enable 'pass thru mode' until this many non default subtitle settings are observed for a single video.
*/
private static final int NUMBER_OF_NON_DEFAULT_SUBTITLES_BEFORE_ENABLING_PASSTHRU = 2;
/**
* The number of non default subtitle settings encountered for the current video.
*/
private static int numberOfNonDefaultSettingsObserved;
@Nullable
private static String currentVideoId;
/**
* Injection point.
*
* @param originalValue originalValue protobuf parameter
*/
public static String overrideProtobufParameter(String originalValue) {
try {
if (!SettingsEnum.SIGNATURE_SPOOFING.getBoolean()) {
return originalValue;
}
LogHelper.printDebug(() -> "Original protobuf parameter value: " + originalValue);
// Video is Short or Story.
var isPlayingShorts = originalValue.contains(PROTOBUF_PARAMETER_SHORTS);
if (isPlayingShorts) return originalValue;
boolean isPlayingFeed = containsAny(originalValue, PROTOBUF_PARAMETER_TARGETS) && PlayerType.getCurrent() == PlayerType.INLINE_MINIMAL;
if (isPlayingFeed) {
// Videos in feed won't autoplay with sound.
return PROTOBUF_PARAMETER_SCRIM + PROTOBUF_PARAMETER_SHORTS;
} else {
// Spoof the parameter to prevent playback issues.
return PROTOBUF_PARAMETER_SHORTS;
}
} catch (Exception ex) {
LogHelper.printException(() -> "overrideProtobufParameter failure", ex);
}
return originalValue;
}
/**
* Injection point. Runs off the main thread.
* <p>
* Used to check the response code of video playback requests made by YouTube.
* Response code of interest is 403 that indicate a signature verification failure for the current request
*
* @param responseCode HTTP status code of the completed YouTube connection
*/
public static void onResponse(int responseCode) {
try {
if (responseCode < 400 || responseCode >= 500) {
return; // everything normal
}
LogHelper.printDebug(() -> "YouTube HTTP status code: " + responseCode);
if (SettingsEnum.SIGNATURE_SPOOFING.getBoolean()) {
return; // already enabled
}
SettingsEnum.SIGNATURE_SPOOFING.saveValue(true);
ReVancedUtils.showToastLong("Spoofing app signature to prevent playback issues");
// it would be great if the video could be forcefully reloaded, but currently there is no code to do this
} catch (Exception ex) {
LogHelper.printException(() -> "onResponse failure", ex);
}
}
/**
* Last WindowsSetting constructor values. Values are checked for changes to reduce log spam.
*/
private static int lastAp, lastAh, lastAv;
private static boolean lastVs, lastSd;
/**
* Injection point. Overrides values passed into SubtitleWindowSettings constructor.
*
* @param ap anchor position. A bitmask with 6 bit fields, that appears to indicate the layout position on screen
* @param ah anchor horizontal. A percentage [0, 100], that appears to be a horizontal text anchor point
* @param av anchor vertical. A percentage [0, 100], that appears to be a vertical text anchor point
* @param vs appears to indicate if subtitles exist, and the value is always true.
* @param sd function is not entirely clear
*/
public static int[] getSubtitleWindowSettingsOverride(int ap, int ah, int av, boolean vs, boolean sd) {
final boolean signatureSpoofing = SettingsEnum.SIGNATURE_SPOOFING.getBoolean();
if (SettingsEnum.DEBUG.getBoolean()) {
if (ap != lastAp || ah != lastAh || av != lastAv || vs != lastVs || sd != lastSd) {
LogHelper.printDebug(() -> "video: " + VideoInformation.getVideoId() + " spoof: " + signatureSpoofing
+ " ap:" + ap + " ah:" + ah + " av:" + av + " vs:" + vs + " sd:" + sd);
lastAp = ap;
lastAh = ah;
lastAv = av;
lastVs = vs;
lastSd = sd;
}
}
// Videos with custom captions that specify screen positions appear to always have correct screen positions (even with spoofing).
// But for auto generated and most other captions, the spoof incorrectly gives various default Shorts caption settings.
// Check for these known default shorts captions parameters, and replace with the known correct values.
//
// If a regular video uses a custom subtitle setting that match a default short setting,
// then this will incorrectly replace the setting.
// But, if the video uses multiple subtitles in different screen locations, then detect the non-default values
// and do not replace any window settings for the video (regardless if they match a shorts default).
if (signatureSpoofing && !PlayerType.getCurrent().isNoneOrHidden()
&& numberOfNonDefaultSettingsObserved < NUMBER_OF_NON_DEFAULT_SUBTITLES_BEFORE_ENABLING_PASSTHRU) {
for (SubtitleWindowReplacementSettings setting : SubtitleWindowReplacementSettings.values()) {
if (setting.match(ap, ah, av, vs, sd)) {
return setting.replacementSetting();
}
}
numberOfNonDefaultSettingsObserved++;
LogHelper.printDebug(() ->
numberOfNonDefaultSettingsObserved < NUMBER_OF_NON_DEFAULT_SUBTITLES_BEFORE_ENABLING_PASSTHRU
? "Non default subtitle found."
: "Multiple non default subtitles found. Allowing all subtitles for this video to pass thru unchanged.");
}
return new int[]{ap, ah, av};
}
/**
* Injection point.
*/
public static void setCurrentVideoId(@NonNull String videoId) {
try {
if (videoId.equals(currentVideoId)) {
return;
}
currentVideoId = videoId;
numberOfNonDefaultSettingsObserved = 0;
} catch (Exception ex) {
LogHelper.printException(() -> "setCurrentVideoId failure", ex);
}
}
/**
* Known incorrect default Shorts subtitle parameters, and the corresponding correct (non-Shorts) values.
*/
private enum SubtitleWindowReplacementSettings {
DEFAULT_SHORTS_PARAMETERS_1(10, 50, 0, true, false,
34, 50, 95),
DEFAULT_SHORTS_PARAMETERS_2(9, 20, 0, true, false,
34, 50, 90),
DEFAULT_SHORTS_PARAMETERS_3(9, 20, 0, true, true,
33, 20, 100);
// original values
final int ap, ah, av;
final boolean vs, sd;
// replacement int values
final int[] replacement;
SubtitleWindowReplacementSettings(int ap, int ah, int av, boolean vs, boolean sd,
int replacementAp, int replacementAh, int replacementAv) {
this.ap = ap;
this.ah = ah;
this.av = av;
this.vs = vs;
this.sd = sd;
this.replacement = new int[]{replacementAp, replacementAh, replacementAv};
}
boolean match(int ap, int ah, int av, boolean vs, boolean sd) {
return this.ap == ap && this.ah == ah && this.av == av && this.vs == vs && this.sd == sd;
}
int[] replacementSetting() {
return replacement;
}
}
}

View File

@@ -1,26 +0,0 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class VideoBufferPatch {
public static int getMaxBuffer() {
int confVal = SettingsEnum.MAX_BUFFER.getInt();
if (confVal < 1) confVal = 1;
return confVal;
}
public static int getPlaybackBuffer() {
int confVal = SettingsEnum.PLAYBACK_MAX_BUFFER.getInt();
if (confVal < 1) confVal = 1;
return confVal;
}
public static int getReBuffer() {
int confVal = SettingsEnum.MAX_PLAYBACK_BUFFER_AFTER_REBUFFER.getInt();
if (confVal < 1) confVal = 1;
return confVal;
}
}

View File

@@ -1,121 +1,192 @@
package app.revanced.integrations.patches;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import app.revanced.integrations.patches.playback.speed.RememberPlaybackSpeedPatch;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
/**
* Hooking class for the current playing video.
*/
public final class VideoInformation {
private static final float DEFAULT_YOUTUBE_PLAYBACK_SPEED = 1.0f;
private static final String SEEK_METHOD_NAME = "seekTo";
private static WeakReference<Object> playerController;
private static Method seekMethod;
@NonNull
private static String videoId = "";
private static long videoLength = 1;
private static long videoTime = -1;
private static long videoLength = 0;
private static volatile long videoTime = -1; // must be volatile. Value is set off main thread from high precision patch hook
/**
* The current playback speed
*/
private static float playbackSpeed = DEFAULT_YOUTUBE_PLAYBACK_SPEED;
/**
* Hook into PlayerController.onCreate() method.
* Injection point.
* Sets a reference to the YouTube playback controller.
*
* @param thisRef Reference to the player controller object.
*/
public static void playerController_onCreateHook(final Object thisRef) {
playerController = new WeakReference<>(thisRef);
videoLength = 1;
videoLength = 0;
videoTime = -1;
try {
seekMethod = thisRef.getClass().getMethod(SEEK_METHOD_NAME, Long.TYPE);
seekMethod.setAccessible(true);
} catch (NoSuchMethodException ex) {
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to initialize", ex);
}
}
/**
* Set the video id.
* Injection point.
*
* @param videoId The id of the video.
* @param newlyLoadedVideoId id of the current video
*/
public static void setVideoId(String videoId) {
LogHelper.printDebug(() -> "Setting current video id to: " + videoId);
VideoInformation.videoId = videoId;
public static void setVideoId(@NonNull String newlyLoadedVideoId) {
if (!videoId.equals(newlyLoadedVideoId)) {
LogHelper.printDebug(() -> "New video id: " + newlyLoadedVideoId);
videoId = newlyLoadedVideoId;
playbackSpeed = DEFAULT_YOUTUBE_PLAYBACK_SPEED;
}
}
/**
* Set the video length.
* Injection point.
* Called when user selects a playback speed.
*
* @param userSelectedPlaybackSpeed The playback speed the user selected
*/
public static void userSelectedPlaybackSpeed(float userSelectedPlaybackSpeed) {
LogHelper.printDebug(() -> "User selected playback speed: " + userSelectedPlaybackSpeed);
playbackSpeed = userSelectedPlaybackSpeed;
}
/**
* Overrides the current playback speed.
*
* <b> Used exclusively by {@link RememberPlaybackSpeedPatch} </b>
*/
public static void overridePlaybackSpeed(float speedOverride) {
if (playbackSpeed != speedOverride) {
LogHelper.printDebug(() -> "Overriding playback speed to: " + speedOverride);
playbackSpeed = speedOverride;
}
}
/**
* Injection point.
*
* @param length The length of the video in milliseconds.
*/
public static void setVideoLength(final long length) {
LogHelper.printDebug(() -> "Setting current video length to " + length);
videoLength = length;
if (videoLength != length) {
LogHelper.printDebug(() -> "Current video length: " + length);
videoLength = length;
}
}
/**
* Set the video time.
* Injection point.
* Called off the main thread approximately every 50ms to 100ms
*
* @param time The time of the video in milliseconds.
* @param currentPlaybackTime The current playback time of the video in milliseconds.
*/
public static void setVideoTime(final long time) {
LogHelper.printDebug(() -> "Current video time " + time);
videoTime = time;
public static void setVideoTimeHighPrecision(final long currentPlaybackTime) {
videoTime = currentPlaybackTime;
}
/**
* Seek on the current video.
* Does not function for playback of Shorts or Stories.
*
* Caution: If called from a videoTimeHook() callback,
* this will cause a recursive call into the same videoTimeHook() callback.
*
* @param millisecond The millisecond to seek the video to.
* @return if the seek was successful
*/
public static void seekTo(final long millisecond) {
new Handler(Looper.getMainLooper()).post(() -> {
if (seekMethod == null) {
LogHelper.printDebug(() -> "seekMethod was null");
return;
}
public static boolean seekTo(final long millisecond) {
ReVancedUtils.verifyOnMainThread();
if (seekMethod == null) {
LogHelper.printException(() -> "seekMethod was null");
return false;
}
try {
LogHelper.printDebug(() -> "Seeking to " + millisecond);
seekMethod.invoke(playerController.get(), millisecond);
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to seek", ex);
}
});
try {
LogHelper.printDebug(() -> "Seeking to " + millisecond);
return (Boolean) seekMethod.invoke(playerController.get(), millisecond);
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to seek", ex);
return false;
}
}
public static boolean seekToRelative(long millisecondsRelative) {
return seekTo(videoTime + millisecondsRelative);
}
/**
* Get the id of the current video playing.
* Id of the current video playing. Includes Shorts and YouTube Stories.
*
* @return The id of the video. Empty string if not set yet.
*/
public static String getCurrentVideoId() {
@NonNull
public static String getVideoId() {
return videoId;
}
/**
* Get the length of the current video playing.
*
* @return The length of the video in milliseconds. 1 if not set yet.
* @return The current playback speed.
*/
public static long getCurrentVideoLength() {
public static float getPlaybackSpeed() {
return playbackSpeed;
}
/**
* Length of the current video playing. Includes Shorts and YouTube Stories.
*
* @return The length of the video in milliseconds.
* If the video is not yet loaded, or if the video is playing in the background with no video visible,
* then this returns zero.
*/
public static long getVideoLength() {
return videoLength;
}
/**
* Get the time of the current video playing.
* Playback time of the current video playing.
* Value can lag up to approximately 100ms behind the actual current video playback time.
*
* Note: Code inside a videoTimeHook patch callback
* should use the callback video time and avoid using this method
* (in situations of recursive hook callbacks, the value returned here may be outdated).
*
* Includes Shorts and YouTube Stories.
*
* @return The time of the video in milliseconds. -1 if not set yet.
*/
public static long getVideoTime() {
return videoTime;
}
/**
* @return If the playback is at the end of the video.
*
* If video is playing in the background with no video visible,
* this always returns false (even if the video is actually at the end)
*/
public static boolean isAtEndOfVideo() {
return videoTime > 0 && videoLength > 0 && videoTime >= videoLength;
}
}

View File

@@ -0,0 +1,9 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public final class WideSearchbarPatch {
public static boolean enableWideSearchbar() {
return SettingsEnum.WIDE_SEARCHBAR.getBoolean();
}
}

View File

@@ -1,4 +0,0 @@
package app.revanced.integrations.patches.downloads.views
class DownloadOptions {
}

View File

@@ -1,9 +1,12 @@
package app.revanced.integrations.patches.playback.speed;
public class CustomVideoSpeedPatch {
// Values are useless as they are being overridden by the respective patch.
// This generates a .array segment in Dalvik bytecode
// which the patch utilizes to store the video speeds in, only
// if it has two or more default values.
public static final float[] videoSpeeds = { 0, 0 };
/**
* Default playback speeds offered by YouTube.
* Values are also used by {@link RememberPlaybackSpeedPatch}.
*
* If custom video speed is applied,
* then this array is overwritten by the patch with custom speeds
*/
public static final float[] videoSpeeds = {0.25f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f};
}

View File

@@ -1,32 +0,0 @@
package app.revanced.integrations.patches.playback.speed;
import static app.revanced.integrations.utils.SharedPrefHelper.SharedPrefNames.REVANCED_PREFS;
import static app.revanced.integrations.utils.SharedPrefHelper.getFloat;
import static app.revanced.integrations.utils.SharedPrefHelper.saveFloat;
import android.widget.Toast;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public final class RememberPlaybackRatePatch {
private static final String REMEMBERED_PLAYBACK_RATE_PREFERENCE_KEY = "revanced_remember_playback_rate_last_value";
public static void rememberPlaybackRate(final float selectedPlaybackRate) {
if (!SettingsEnum.REMEMBER_PLAYBACK_RATE_SELECTED.getBoolean()) return;
Toast.makeText(ReVancedUtils.getContext(), "Playback rate will be remembered", Toast.LENGTH_SHORT).show();
LogHelper.printDebug(() -> "Remembering playback rate: " + selectedPlaybackRate);
saveFloat(REVANCED_PREFS, REMEMBERED_PLAYBACK_RATE_PREFERENCE_KEY, selectedPlaybackRate);
}
public static float getRememberedPlaybackRate() {
final var playbackRateOverride = getFloat(REVANCED_PREFS, REMEMBERED_PLAYBACK_RATE_PREFERENCE_KEY, -2f);
LogHelper.printDebug(() -> "Overriding playback rate: " + playbackRateOverride);
return playbackRateOverride;
}
}

View File

@@ -0,0 +1,77 @@
package app.revanced.integrations.patches.playback.speed;
import android.preference.ListPreference;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import app.revanced.integrations.patches.VideoInformation;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.ReVancedUtils;
public final class RememberPlaybackSpeedPatch {
/**
* PreferenceList entries and values, of all available playback speeds.
*/
private static String[] preferenceListEntries, preferenceListEntryValues;
@Nullable
private static String currentVideoId;
/**
* Injection point.
* Called when a new video loads.
*/
public static void newVideoLoaded(@NonNull String videoId) {
if (videoId.equals(currentVideoId)) {
return;
}
currentVideoId = videoId;
VideoInformation.overridePlaybackSpeed(SettingsEnum.PLAYBACK_SPEED_DEFAULT.getFloat());
}
/**
* Injection point.
* Called when user selects a playback speed.
*
* @param playbackSpeed The playback speed the user selected
*/
public static void userSelectedPlaybackSpeed(float playbackSpeed) {
if (SettingsEnum.PLAYBACK_SPEED_REMEMBER_LAST_SELECTED.getBoolean()) {
SettingsEnum.PLAYBACK_SPEED_DEFAULT.saveValue(playbackSpeed);
ReVancedUtils.showToastLong("Changed default speed to: " + playbackSpeed + "x");
}
}
/**
* Injection point.
* Overrides the video speed. Called after video loads, and immediately after user selects a different playback speed
*/
public static float getPlaybackSpeedOverride() {
return VideoInformation.getPlaybackSpeed();
}
/**
* Initialize a settings preference list.
*
* Normally this is done during patching by creating a static xml preference list,
* but the available playback speeds differ depending if {@link CustomVideoSpeedPatch} is applied or not.
*/
public static void initializeListPreference(ListPreference preference) {
if (preferenceListEntries == null) {
float[] videoSpeeds = CustomVideoSpeedPatch.videoSpeeds;
preferenceListEntries = new String[videoSpeeds.length];
preferenceListEntryValues = new String[videoSpeeds.length];
int i = 0;
for (float speed : videoSpeeds) {
String speedString = String.valueOf(speed);
preferenceListEntries[i] = speedString + "x";
preferenceListEntryValues[i] = speedString;
i++;
}
}
preference.setEntries(preferenceListEntries);
preference.setEntryValues(preferenceListEntryValues);
}
}

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