1
mirror of https://github.com/revanced/revanced-integrations synced 2025-11-21 18:35:37 +01:00

Compare commits

...

119 Commits

Author SHA1 Message Date
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
semantic-release-bot
4b052b19a3 chore(release): 0.99.0-dev.1 [skip ci]
# [0.99.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.98.0...v0.99.0-dev.1) (2023-02-22)

### Features

* **youtube:** remove patch `open-links-directly` ([dce882b](dce882b128))
2023-02-22 15:37:04 +00:00
oSumAtrIX
dce882b128 feat(youtube): remove patch open-links-directly
The patch did not serve any real purpose

Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 16:23:06 +01:00
semantic-release-bot
ccb5d81d46 chore(release): 0.98.0 [skip ci]
# [0.98.0](https://github.com/revanced/revanced-integrations/compare/v0.97.0...v0.98.0) (2023-02-22)

### Bug Fixes

* remove nullable annotation in Kotlin code ([b5a29fd](b5a29fdce1))
* **twitter:** make `hide-ads` patch compatible with any version ([6655988](665598836a))
* **youtube/hide-watch-in-vr:** fix descriptions ([96fcc0b](96fcc0b1c7))

### Features

* **twitter:** `hide-recommended-users` patch ([96eea3d](96eea3d4fc))
* **youtube/general-ads:** hide channel bar ([35c4266](35c4266e8b))
* **youtube/general-ads:** hide full-screen feed banner ([da1572c](da1572c28d))
* **youtube/general-ads:** hide horizontal video shelf ([fd975ec](fd975ecd2a))
* **youtube/open-links-directly:** skip every redirect url ([2d73b8b](2d73b8b29b))
2023-02-22 05:51:41 +00:00
oSumAtrIX
5ed7170018 chore: merge branch dev to main (#321) 2023-02-22 06:49:37 +01:00
oSumAtrIX
621ef63d86 ci: add backmerge target branch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 06:45:15 +01:00
semantic-release-bot
37c0cc04c4 chore(release): 0.98.0-dev.5 [skip ci]
# [0.98.0-dev.5](https://github.com/revanced/revanced-integrations/compare/v0.98.0-dev.4...v0.98.0-dev.5) (2023-02-22)

### Features

* **youtube/open-links-directly:** skip every redirect url ([2d73b8b](2d73b8b29b))
2023-02-22 05:11:24 +00:00
oSumAtrIX
5749a1dd65 refactor(youtube/hide-info-cards): fix casing
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 06:09:37 +01:00
oSumAtrIX
2d73b8b29b feat(youtube/open-links-directly): skip every redirect url
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 06:09:36 +01:00
semantic-release-bot
85cae1e5d6 chore(release): 0.98.0-dev.4 [skip ci]
# [0.98.0-dev.4](https://github.com/revanced/revanced-integrations/compare/v0.98.0-dev.3...v0.98.0-dev.4) (2023-02-22)

### Bug Fixes

* remove nullable annotation in Kotlin code ([b5a29fd](b5a29fdce1))
2023-02-22 04:44:49 +00:00
oSumAtrIX
b5a29fdce1 fix: remove nullable annotation in Kotlin code
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 05:42:37 +01:00
semantic-release-bot
1809d1bbf9 chore(release): 0.98.0-dev.3 [skip ci]
# [0.98.0-dev.3](https://github.com/revanced/revanced-integrations/compare/v0.98.0-dev.2...v0.98.0-dev.3) (2023-02-22)

### Bug Fixes

* **twitter:** make `hide-ads` patch compatible with any version ([6655988](665598836a))

### Features

* **twitter:** `hide-recommended-users` patch ([96eea3d](96eea3d4fc))
2023-02-22 04:40:57 +00:00
oSumAtrIX
96eea3d4fc feat(twitter): hide-recommended-users patch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 05:38:27 +01:00
oSumAtrIX
665598836a fix(twitter): make hide-ads patch compatible with any version
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 05:38:26 +01:00
oSumAtrIX
f1e6cbcdf1 chore: update dependencies
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-22 05:33:42 +01:00
oSumAtrIX
24d7e47844 ci: use new semantic-release-backmerge option
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:25:02 +01:00
semantic-release-bot
f6573521ba chore(release): 0.98.0-dev.2 [skip ci]
# [0.98.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.98.0-dev.1...v0.98.0-dev.2) (2023-02-20)

### Bug Fixes

* **youtube/hide-watch-in-vr:** fix descriptions ([96fcc0b](96fcc0b1c7))

### Features

* **youtube/general-ads:** hide channel bar ([35c4266](35c4266e8b))
* **youtube/general-ads:** hide horizontal video shelf ([fd975ec](fd975ecd2a))
2023-02-20 04:18:21 +00:00
oSumAtrIX
c320384066 refactor(youtube): remove dead code
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:16:20 +01:00
oSumAtrIX
45c3f6e774 refactor(youtube): separate patches into two
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:16:20 +01:00
oSumAtrIX
e040b7de2f refactor(youtube/general-ads): correct settings name
Syncing with 1a96d79356e0432cfcf6287cdebbad8227eef6d1 from revanced-patches

Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:16:19 +01:00
oSumAtrIX
96fcc0b1c7 fix(youtube/hide-watch-in-vr): fix descriptions
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:16:19 +01:00
oSumAtrIX
35c4266e8b feat(youtube/general-ads): hide channel bar
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:16:19 +01:00
oSumAtrIX
fd975ecd2a feat(youtube/general-ads): hide horizontal video shelf
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-20 05:16:18 +01:00
semantic-release-bot
a857b9db6f chore(release): 0.98.0-dev.1 [skip ci]
# [0.98.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.97.0...v0.98.0-dev.1) (2023-02-18)

### Features

* **youtube/general-ads:** hide full-screen feed banner ([da1572c](da1572c28d))
2023-02-18 21:09:33 +00:00
oSumAtrIX
39e3d046f3 chore: merge branch main to dev 2023-02-18 22:06:55 +01:00
oSumAtrIX
da1572c28d feat(youtube/general-ads): hide full-screen feed banner
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-18 22:00:44 +01:00
semantic-release-bot
3f5e27d6b1 chore(release): 0.97.0 [skip ci]
# [0.97.0](https://github.com/revanced/revanced-integrations/compare/v0.96.2...v0.97.0) (2023-02-14)

### Bug Fixes

* **youtube/general-ads:** block other kind of survey ([cdf43ef](cdf43efcf2))

### Features

* **youtube/general-ads:** hide web search results ([9df1e46](9df1e460c5))
2023-02-14 14:02:41 +00:00
oSumAtrIX
3e113b6ab0 chore: merge branch dev to main (#320) 2023-02-14 15:00:30 +01:00
semantic-release-bot
0904f3c78a chore(release): 0.97.0-dev.1 [skip ci]
# [0.97.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.96.2...v0.97.0-dev.1) (2023-02-14)

### Bug Fixes

* **youtube/general-ads:** block other kind of survey ([cdf43ef](cdf43efcf2))

### Features

* **youtube/general-ads:** hide web search results ([9df1e46](9df1e460c5))
2023-02-14 13:59:04 +00:00
oSumAtrIX
9df1e460c5 feat(youtube/general-ads): hide web search results
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-14 14:56:47 +01:00
oSumAtrIX
cdf43efcf2 fix(youtube/general-ads): block other kind of survey 2023-02-14 14:56:47 +01:00
semantic-release-bot
370f331330 chore(release): 0.96.2 [skip ci]
## [0.96.2](https://github.com/revanced/revanced-integrations/compare/v0.96.1...v0.96.2) (2023-02-13)

### Bug Fixes

* **youtube/general-ads:** do not hide chapters when hiding preview comments ([cfb7aab](cfb7aab779))
* **youtube/general-ads:** use correct setting for `BlockRule` ([#316](https://github.com/revanced/revanced-integrations/issues/316)) ([7225bc3](7225bc3c48))
2023-02-13 21:44:11 +00:00
oSumAtrIX
622aa1dcaa chore: merge branch dev to main (#319) 2023-02-13 22:41:31 +01:00
semantic-release-bot
5071082fde chore(release): 0.96.2-dev.2 [skip ci]
## [0.96.2-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.96.2-dev.1...v0.96.2-dev.2) (2023-02-13)

### Bug Fixes

* **youtube/general-ads:** do not hide chapters when hiding preview comments ([cfb7aab](cfb7aab779))
2023-02-13 21:35:24 +00:00
oSumAtrIX
71b558ba6a ci: update dependencies and target node version (#318) 2023-02-13 22:32:29 +01:00
Palm
9cea77ac59 ci: fix step name typo 2023-02-13 20:56:56 +07:00
Palm
b47b7cbc22 ci: target specific node version 2023-02-13 10:45:17 +07:00
Palm
25d51179cc ci: update dependencies 2023-02-13 10:44:45 +07:00
Palm
2e0758b3c8 ci: do not override dependency versions on install 2023-02-13 10:44:07 +07:00
oSumAtrIX
85bf637078 chore: merge branch dev to main (#317) 2023-02-13 03:36:08 +01:00
oSumAtrIX
cfb7aab779 fix(youtube/general-ads): do not hide chapters when hiding preview comments
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-13 03:31:01 +01:00
semantic-release-bot
0def31b2dd chore(release): 0.96.2-dev.1 [skip ci]
## [0.96.2-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.96.1...v0.96.2-dev.1) (2023-02-11)

### Bug Fixes

* **youtube/general-ads:** use correct setting for `BlockRule` ([#316](https://github.com/revanced/revanced-integrations/issues/316)) ([7225bc3](7225bc3c48))
2023-02-11 13:51:25 +00:00
johnconner122
7225bc3c48 fix(youtube/general-ads): use correct setting for BlockRule (#316) 2023-02-11 14:49:33 +01:00
semantic-release-bot
7d136e550c chore(release): 0.96.1 [skip ci]
## [0.96.1](https://github.com/revanced/revanced-integrations/compare/v0.96.0...v0.96.1) (2023-02-11)

### Bug Fixes

* **youtube/minimized-playback:** disable when playing shorts ([1dd84a3](1dd84a3785))
2023-02-11 00:36:55 +00:00
oSumAtrIX
70170e24ce chore: merge branch dev to main (#315) 2023-02-11 01:34:48 +01:00
semantic-release-bot
1864372298 chore(release): 0.96.1-dev.1 [skip ci]
## [0.96.1-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.96.0...v0.96.1-dev.1) (2023-02-11)

### Bug Fixes

* **youtube/minimized-playback:** disable when playing shorts ([1dd84a3](1dd84a3785))
2023-02-11 00:27:39 +00:00
oSumAtrIX
1dd84a3785 fix(youtube/minimized-playback): disable when playing shorts
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-11 01:25:48 +01:00
semantic-release-bot
512d747ec8 chore(release): 0.96.0 [skip ci]
# [0.96.0](https://github.com/revanced/revanced-integrations/compare/v0.95.0...v0.96.0) (2023-02-10)

### Features

* **youtube/general-ads:** hide pill to view products ([43e419e](43e419e6a6))
2023-02-10 22:28:00 +00:00
oSumAtrIX
e16d3a7284 chore: merge branch dev to main (#314) 2023-02-10 23:26:15 +01:00
semantic-release-bot
4469d1f3c4 chore(release): 0.96.0-dev.1 [skip ci]
# [0.96.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.95.0...v0.96.0-dev.1) (2023-02-10)

### Features

* **youtube/general-ads:** hide pill to view products ([43e419e](43e419e6a6))
2023-02-10 18:43:43 +00:00
oSumAtrIX
43e419e6a6 feat(youtube/general-ads): hide pill to view products
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-10 19:41:21 +01:00
oSumAtrIX
f67216ad9d chore: merge branch dev to main (#313) 2023-02-10 05:59:18 +01:00
oSumAtrIX
2e9d3fc63f refactor(youtube/microg-support): make use of MICROG_VENDOR field
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-06 23:07:19 +01:00
semantic-release-bot
d16153408c chore(release): 0.95.0 [skip ci]
# [0.95.0](https://github.com/revanced/revanced-integrations/compare/v0.94.1...v0.95.0) (2023-02-03)

### Features

* `spoof-wifi-connection` patch ([#297](https://github.com/revanced/revanced-integrations/issues/297)) ([293eae4](293eae4a46))
* spoof-wifi-connection patch ([6679e6e](6679e6ee45))
* **youtube:** `hide-player-buttons` patch ([d5bcef2](d5bcef2cdb))
2023-02-03 03:54:09 +00:00
oSumAtrIX
73d5400486 chore: merge branch dev to main (#310) 2023-02-03 04:52:05 +01:00
semantic-release-bot
e698e8c524 chore(release): 0.95.0-dev.2 [skip ci]
# [0.95.0-dev.2](https://github.com/revanced/revanced-integrations/compare/v0.95.0-dev.1...v0.95.0-dev.2) (2023-02-03)

### Features

* **youtube:** `hide-player-buttons` patch ([d5bcef2](d5bcef2cdb))
2023-02-03 03:43:13 +00:00
oSumAtrIX
d5bcef2cdb feat(youtube): hide-player-buttons patch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-03 04:39:38 +01:00
oSumAtrIX
5ca042a602 refactor(youtube): remove obsolete fix-playback patch
Signed-off-by: oSumAtrIX <johan.melkonyan1@web.de>
2023-02-01 20:57:48 +01:00
semantic-release-bot
319a234df6 chore(release): 0.95.0-dev.1 [skip ci]
# [0.95.0-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.94.1...v0.95.0-dev.1) (2023-02-01)

### Features

* `spoof-wifi-connection` patch ([#297](https://github.com/revanced/revanced-integrations/issues/297)) ([293eae4](293eae4a46))
* spoof-wifi-connection patch ([6679e6e](6679e6ee45))
2023-02-01 19:55:36 +00:00
oSumAtrIX
293eae4a46 feat: spoof-wifi-connection patch (#297) 2023-02-01 20:52:40 +01:00
Linus789
dc1faa94e0 fix unregisterNetworkCallback throwing exception when the callback has not been registered
todo: squash
2023-01-31 15:04:14 +01:00
semantic-release-bot
2e6c73e4b5 chore(release): 0.94.1 [skip ci]
## [0.94.1](https://github.com/revanced/revanced-integrations/compare/v0.94.0...v0.94.1) (2023-01-29)

### Bug Fixes

* **youtube/sponsorblock:** fix saving and loading settings ([#304](https://github.com/revanced/revanced-integrations/issues/304)) ([49aedae](49aedae3fc))
* **youtube:** resolve duplicate preference keys ([#307](https://github.com/revanced/revanced-integrations/issues/307)) ([27d1392](27d1392a73))
2023-01-29 10:14:32 +00:00
oSumAtrIX
f50346aff2 chore: merge branch dev to main (#309) 2023-01-29 11:12:08 +01:00
github-actions[bot]
530260e248 chore: merge branch dev to main (#306)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
Co-authored-by: semantic-release-bot <semantic-release-bot@martynus.net>
2023-01-28 20:07:01 +01:00
semantic-release-bot
db2e5eec71 chore(release): 0.94.1-dev.1 [skip ci]
## [0.94.1-dev.1](https://github.com/revanced/revanced-integrations/compare/v0.94.0...v0.94.1-dev.1) (2023-01-28)

### Bug Fixes

* **youtube/sponsorblock:** fix saving and loading settings ([#304](https://github.com/revanced/revanced-integrations/issues/304)) ([49aedae](49aedae3fc))
* **youtube:** resolve duplicate preference keys ([#307](https://github.com/revanced/revanced-integrations/issues/307)) ([27d1392](27d1392a73))
2023-01-28 19:04:41 +00:00
LisoUseInAIKyrios
27d1392a73 fix(youtube): resolve duplicate preference keys (#307) 2023-01-28 20:02:22 +01:00
LisoUseInAIKyrios
49aedae3fc fix(youtube/sponsorblock): fix saving and loading settings (#304) 2023-01-28 20:02:22 +01:00
oSumAtrIX
84257a7348 Apply suggestions from code review [skip ci] 2023-01-23 02:46:27 +01:00
Linus789
6679e6ee45 feat: spoof-wifi-connection patch 2023-01-21 23:20:57 +01:00
50 changed files with 2899 additions and 945 deletions

View File

@@ -3,7 +3,7 @@ name: Release
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
branches: branches:
- main - main
- dev - dev
pull_request: pull_request:
@@ -16,7 +16,7 @@ jobs:
name: Release name: Release
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Cancel previou runs - name: Cancel previous runs
uses: styfle/cancel-workflow-action@0.11.0 uses: styfle/cancel-workflow-action@0.11.0
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
@@ -33,11 +33,11 @@ jobs:
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: "latest" node-version: "18"
cache: 'npm' cache: 'npm'
- name: Setup semantic-release - name: Setup semantic-release
run: npm install semantic-release@19.0.5 @saithodev/semantic-release-backmerge @semantic-release/git @semantic-release/changelog gradle-semantic-release-plugin@1.7.4 -D run: npm install
- name: Release - name: Release
env: env:
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }} GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
run: npx semantic-release run: npm exec semantic-release

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,3 @@
import java.io.FileInputStream
import java.util.Properties
plugins { plugins {
id("com.android.application") id("com.android.application")
id("org.jetbrains.kotlin.android") id("org.jetbrains.kotlin.android")
@@ -47,7 +44,7 @@ android {
dependencies { dependencies {
compileOnly(project(mapOf("path" to ":dummy"))) compileOnly(project(mapOf("path" to ":dummy")))
compileOnly("androidx.annotation:annotation:1.5.0") compileOnly("androidx.annotation:annotation:1.5.0")
compileOnly("androidx.appcompat:appcompat:1.5.1") compileOnly("androidx.appcompat:appcompat:1.6.1")
compileOnly("com.squareup.okhttp3:okhttp:5.0.0-alpha.11") compileOnly("com.squareup.okhttp3:okhttp:5.0.0-alpha.11")
compileOnly("com.squareup.retrofit2:retrofit:2.9.0") compileOnly("com.squareup.retrofit2:retrofit:2.9.0")
} }

File diff suppressed because it is too large Load Diff

View File

@@ -9,7 +9,7 @@ final class CommentsPatch extends Filter {
var comments = new BlockRule(SettingsEnum.HIDE_COMMENTS_SECTION, "video_metadata_carousel", "_comments"); var comments = new BlockRule(SettingsEnum.HIDE_COMMENTS_SECTION, "video_metadata_carousel", "_comments");
var previewComment = new BlockRule( var previewComment = new BlockRule(
SettingsEnum.HIDE_PREVIEW_COMMENT, SettingsEnum.HIDE_PREVIEW_COMMENT,
"carousel_item", "|carousel_item",
"comments_entry_point_teaser", "comments_entry_point_teaser",
"comments_entry_point_simplebox" "comments_entry_point_simplebox"
); );

View File

@@ -1,40 +0,0 @@
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.printDebug(() -> "Thread was interrupted");
}
});
currentThread.start();
}
}

View File

@@ -1,13 +1,10 @@
package app.revanced.integrations.patches; package app.revanced.integrations.patches;
import android.view.View; import android.view.View;
import app.revanced.integrations.settings.SettingsEnum; import app.revanced.integrations.settings.SettingsEnum;
public class FullscreenPanelsRemoverPatch { public class FullscreenPanelsRemoverPatch {
public static int getFullscreenPanelsVisibility() { public static int getFullscreenPanelsVisibility() {
return SettingsEnum.HIDE_FULLSCREEN_PANELS.getBoolean() ? View.GONE : View.VISIBLE; return SettingsEnum.HIDE_FULLSCREEN_PANELS.getBoolean() ? View.GONE : View.VISIBLE;
} }
} }

View File

@@ -26,21 +26,27 @@ public final class GeneralAdsPatch extends Filter {
var subscribersCommunityGuidelines = new BlockRule(SettingsEnum.ADREMOVER_SUBSCRIBERS_COMMUNITY_GUIDELINES_REMOVAL, "sponsorships_comments_upsell"); var subscribersCommunityGuidelines = new BlockRule(SettingsEnum.ADREMOVER_SUBSCRIBERS_COMMUNITY_GUIDELINES_REMOVAL, "sponsorships_comments_upsell");
var channelMemberShelf = new BlockRule(SettingsEnum.ADREMOVER_CHANNEL_MEMBER_SHELF_REMOVAL, "member_recognition_shelf"); var channelMemberShelf = new BlockRule(SettingsEnum.ADREMOVER_CHANNEL_MEMBER_SHELF_REMOVAL, "member_recognition_shelf");
var compactBanner = new BlockRule(SettingsEnum.ADREMOVER_COMPACT_BANNER_REMOVAL, "compact_banner"); var compactBanner = new BlockRule(SettingsEnum.ADREMOVER_COMPACT_BANNER_REMOVAL, "compact_banner");
var inFeedSurvey = new BlockRule(SettingsEnum.ADREMOVER_FEED_SURVEY_REMOVAL, "in_feed_survey"); var inFeedSurvey = new BlockRule(SettingsEnum.ADREMOVER_FEED_SURVEY_REMOVAL, "in_feed_survey", "slimline_survey");
var medicalPanel = new BlockRule(SettingsEnum.ADREMOVER_MEDICAL_PANEL_REMOVAL, "medical_panel"); var medicalPanel = new BlockRule(SettingsEnum.ADREMOVER_MEDICAL_PANEL_REMOVAL, "medical_panel");
var paidContent = new BlockRule(SettingsEnum.ADREMOVER_PAID_CONTENT_REMOVAL, "paid_content_overlay"); var paidContent = new BlockRule(SettingsEnum.ADREMOVER_PAID_CONTENT_REMOVAL, "paid_content_overlay");
var merchandise = new BlockRule(SettingsEnum.ADREMOVER_MERCHANDISE_REMOVAL, "product_carousel"); 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 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 latestPosts = new BlockRule(SettingsEnum.ADREMOVER_HIDE_LATEST_POSTS, "post_shelf");
var channelGuidelines = new BlockRule(SettingsEnum.ADREMOVER_HIDE_CHANNEL_GUIDELINES, "channel_guidelines_entry_banner"); var channelGuidelines = new BlockRule(SettingsEnum.ADREMOVER_HIDE_CHANNEL_GUIDELINES, "channel_guidelines_entry_banner");
var artistCard = new BlockRule(SettingsEnum.HIDE_ARTIST_CARD, "official_card"); var artistCard = new BlockRule(SettingsEnum.HIDE_ARTIST_CARDS, "official_card");
var selfSponsor = new BlockRule(SettingsEnum.ADREMOVER_SELF_SPONSOR_REMOVAL, "cta_shelf_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 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, var graySeparator = new BlockRule(SettingsEnum.ADREMOVER_GRAY_SEPARATOR,
"cell_divider" // layout residue (gray line above the buttoned ad), "cell_divider" // layout residue (gray line above the buttoned ad),
); );
var buttonedAd = new BlockRule(SettingsEnum.ADREMOVER_BUTTONED_REMOVAL, var buttonedAd = new BlockRule(SettingsEnum.ADREMOVER_BUTTONED_REMOVAL,
"video_display_full_buttoned_layout", "_buttoned_layout",
"full_width_square_image_layout", "full_width_square_image_layout",
"_ad_with", "_ad_with",
"landscape_image_wide_button_layout" "landscape_image_wide_button_layout"
@@ -51,7 +57,11 @@ public final class GeneralAdsPatch extends Filter {
"banner_text_icon", "banner_text_icon",
"square_image_layout", "square_image_layout",
"watch_metadata_app_promo", "watch_metadata_app_promo",
"video_display_full_layout" "video_display_full_layout",
"hero_promo_image",
"statement_banner",
"carousel_footered_layout",
"text_image_button_layout"
); );
var movieAds = new BlockRule( var movieAds = new BlockRule(
SettingsEnum.ADREMOVER_MOVIE_REMOVAL, SettingsEnum.ADREMOVER_MOVIE_REMOVAL,
@@ -65,20 +75,26 @@ public final class GeneralAdsPatch extends Filter {
this.pathRegister.registerAll( this.pathRegister.registerAll(
generalAds, generalAds,
buttonedAd, buttonedAd,
channelBar,
communityPosts, communityPosts,
paidContent, paidContent,
latestPosts, latestPosts,
movieAds, movieAds,
chapterTeaser, chapterTeaser,
communityGuidelines, communityGuidelines,
quickActions,
relatedVideos,
compactBanner, compactBanner,
inFeedSurvey, inFeedSurvey,
viewProducts,
medicalPanel, medicalPanel,
merchandise, merchandise,
infoPanel, infoPanel,
channelGuidelines, channelGuidelines,
artistCard, artistCard,
selfSponsor, selfSponsor,
webLinkPanel,
imageShelf,
subscribersCommunityGuidelines, subscribersCommunityGuidelines,
channelMemberShelf channelMemberShelf
); );

View File

@@ -3,8 +3,7 @@ package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum; import app.revanced.integrations.settings.SettingsEnum;
public class HideAutoplayButtonPatch { public class HideAutoplayButtonPatch {
public static boolean isButtonShown() { 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

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

View File

@@ -0,0 +1,11 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public final class HidePlayerButtonsPatch {
public static boolean hideButtons() {
return SettingsEnum.HIDE_PLAYER_BUTTONS.getBoolean();
}
}

View File

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

View File

@@ -1,10 +0,0 @@
package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum;
public class HideTimeAndSeekbarPatch {
//Used by app.revanced.patches.youtube.layout.hidetimeandseekbar.patch.HideTimeAndSeekbarPatch
public static boolean hideTimeAndSeekbar() {
return SettingsEnum.HIDE_TIME_AND_SEEKBAR.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

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

View File

@@ -1,24 +1,23 @@
package app.revanced.integrations.patches; package app.revanced.integrations.patches;
import static app.revanced.integrations.sponsorblock.StringRef.str;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.widget.Toast; import android.widget.Toast;
import java.util.Objects;
import app.revanced.integrations.utils.LogHelper; import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils; import app.revanced.integrations.utils.ReVancedUtils;
import java.util.Objects;
import static app.revanced.integrations.sponsorblock.StringRef.str;
public class MicroGSupport { public class MicroGSupport {
private static final String MICROG_VENDOR = "com.mgoogle"; private static final String MICROG_VENDOR = "com.mgoogle";
private static final String MICROG_PACKAGE_NAME = "com.mgoogle.android.gms"; private static final String MICROG_PACKAGE_NAME = MICROG_VENDOR + ".android.gms";
private static final String VANCED_MICROG_DOWNLOAD_LINK = "https://github.com/TeamVanced/VancedMicroG/releases/latest"; private static final String VANCED_MICROG_DOWNLOAD_LINK = "https://github.com/TeamVanced/VancedMicroG/releases/latest";
private static final String DONT_KILL_MY_APP_LINK = "https://dontkillmyapp.com"; private static final String DONT_KILL_MY_APP_LINK = "https://dontkillmyapp.com";
private static final Uri VANCED_MICROG_PROVIDER = Uri.parse("content://com.mgoogle.android.gsf.gservices/prefix"); 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) { private static void startIntent(Context context, String uriString, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show(); Toast.makeText(context, message, Toast.LENGTH_LONG).show();

View File

@@ -1,9 +1,14 @@
package app.revanced.integrations.patches; package app.revanced.integrations.patches;
import app.revanced.integrations.settings.SettingsEnum; import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.shared.PlayerType;
public class MinimizedPlaybackPatch { public class MinimizedPlaybackPatch {
public static boolean isNotPlayingShorts(boolean isPipEnabled) {
return !PlayerType.getCurrent().isNoneOrHidden() && isPipEnabled;
}
public static boolean isMinimizedPlaybackEnabled() { public static boolean isMinimizedPlaybackEnabled() {
return SettingsEnum.ENABLE_MINIMIZED_PLAYBACK.getBoolean(); return SettingsEnum.ENABLE_MINIMIZED_PLAYBACK.getBoolean();
} }

View File

@@ -1,18 +0,0 @@
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

@@ -1,22 +1,25 @@
package app.revanced.integrations.patches; package app.revanced.integrations.patches;
import java.util.concurrent.atomic.AtomicReference; import android.text.Spanned;
import app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike; import app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike;
import java.util.concurrent.atomic.AtomicReference;
/** /**
* Used by app.revanced.patches.youtube.layout.returnyoutubedislike.patch.ReturnYouTubeDislikePatch * Used by app.revanced.patches.youtube.layout.returnyoutubedislike.patch.ReturnYouTubeDislikePatch
*/ */
public class ReturnYouTubeDislikePatch { public class ReturnYouTubeDislikePatch {
/** /**
* Called when the video id changes * Injection point
*/ */
public static void newVideoLoaded(String videoId) { public static void newVideoLoaded(String videoId) {
ReturnYouTubeDislike.newVideoLoaded(videoId); ReturnYouTubeDislike.newVideoLoaded(videoId);
} }
/** /**
* Injection point
*
* Called when a litho text component is created * Called when a litho text component is created
*/ */
public static void onComponentCreated(Object conversionContext, AtomicReference<Object> textRef) { public static void onComponentCreated(Object conversionContext, AtomicReference<Object> textRef) {
@@ -24,16 +27,22 @@ public class ReturnYouTubeDislikePatch {
} }
/** /**
* Injection point
*
* Called when a Shorts dislike Spannable is created
*/
public static Spanned onShortsComponentCreated(Spanned dislike) {
return ReturnYouTubeDislike.onShortsComponentCreated(dislike);
}
/**
* Injection point
*
* Called when the like/dislike button is clicked * Called when the like/dislike button is clicked
* *
* @param vote -1 (dislike), 0 (none) or 1 (like) * @param vote -1 (dislike), 0 (none) or 1 (like)
*/ */
public static void sendVote(int vote) { public static void sendVote(int vote) {
for (ReturnYouTubeDislike.Vote v : ReturnYouTubeDislike.Vote.values()) { ReturnYouTubeDislike.sendVote(vote);
if (v.value == vote) {
ReturnYouTubeDislike.sendVote(v);
return;
}
}
} }
} }

View File

@@ -0,0 +1,83 @@
package app.revanced.integrations.patches;
import android.widget.Toast;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public class SpoofSignatureVerificationPatch {
/**
* Protobuf parameters used by the player.
* Known issue: video preview not showing when using the seekbar.
*/
private static final String PROTOBUF_PARAMETER_GENERAL = "CgIQBg";
/**
* 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.
* Used by the generic player.
*/
private static final String PROTOBUF_PARAMETER_TARGET = "YADI";
/**
* 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);
if (originalValue.startsWith(PROTOBUF_PARAMETER_TARGET) || originalValue.isEmpty()) {
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.runOnMainThread(() -> {
Toast.makeText(
ReVancedUtils.getContext(),
"Spoofing app signature to prevent playback issues", Toast.LENGTH_LONG
).show();
// 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);
}
}
}

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,21 +1,18 @@
package app.revanced.integrations.patches.playback.quality; package app.revanced.integrations.patches.playback.quality;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast; import android.widget.Toast;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.SharedPrefHelper;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import app.revanced.integrations.settings.SettingsEnum;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
import app.revanced.integrations.utils.SharedPrefHelper;
public class RememberVideoQualityPatch { public class RememberVideoQualityPatch {
public static int selectedQuality1 = -2; public static int selectedQuality1 = -2;
@@ -24,38 +21,37 @@ public class RememberVideoQualityPatch {
public static void changeDefaultQuality(int defaultQuality) { public static void changeDefaultQuality(int defaultQuality) {
Context context = ReVancedUtils.getContext(); Context context = ReVancedUtils.getContext();
if (isConnectedWifi(context)) {
try { var networkType = getNetworType(context);
SharedPrefHelper.saveString(SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "wifi_quality", defaultQuality + "");
String message = "Changing default Wi-Fi quality to: " + defaultQuality; if (networkType == NetworkType.NONE) {
LogHelper.printDebug(() -> message);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to change default WI-FI quality", ex);
}
} else if (isConnectedMobile(context)) {
try {
SharedPrefHelper.saveString(SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "mobile_quality", defaultQuality + "");
String message = "Changing default mobile data quality to:" + defaultQuality;
LogHelper.printDebug(() -> message);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to change default mobile data quality", ex);
}
} else {
String message = "No internet connection."; String message = "No internet connection.";
LogHelper.printDebug(() -> message); LogHelper.printDebug(() -> message);
Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
} else {
var preferenceKey = "wifi_quality";
var networkTypeMessage = "WIFI";
if (networkType == NetworkType.MOBILE) {
networkTypeMessage = "mobile";
preferenceKey = "mobile_quality";
}
SharedPrefHelper.saveString(SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, preferenceKey, defaultQuality + "");
String message = "Changing default " + networkTypeMessage + " quality to: " + defaultQuality;
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
} }
userChangedQuality = false; userChangedQuality = false;
} }
public static int setVideoQuality(Object[] qualities, int quality, Object qInterface, String qIndexMethod) { public static int setVideoQuality(Object[] qualities, int quality, Object qInterface, String qIndexMethod) {
int preferredQuality;
Field[] fields; Field[] fields;
if (!(newVideo || userChangedQuality) || qInterface == null) { if (!(newVideo || userChangedQuality) || qInterface == null) {
return quality; return quality;
} }
Class<?> intType = Integer.TYPE; Class<?> intType = Integer.TYPE;
ArrayList<Integer> iStreamQualities = new ArrayList<>(); ArrayList<Integer> iStreamQualities = new ArrayList<>();
try { try {
@@ -93,51 +89,48 @@ public class RememberVideoQualityPatch {
LogHelper.printException(() -> "Context is null or settings not initialized, returning quality: " + qualityToLog); LogHelper.printException(() -> "Context is null or settings not initialized, returning quality: " + qualityToLog);
return quality; return quality;
} }
if (isConnectedWifi(context)) { var networkType = getNetworType(context);
preferredQuality = SharedPrefHelper.getInt(SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "wifi_quality", -2); if (networkType == NetworkType.NONE) {
LogHelper.printDebug(() -> "Wi-Fi connection detected, preferred quality: " + preferredQuality);
} else if (isConnectedMobile(context)) {
preferredQuality = SharedPrefHelper.getInt(SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, "mobile_quality", -2);
LogHelper.printDebug(() -> "Mobile data connection detected, preferred quality: " + preferredQuality);
} else {
LogHelper.printDebug(() -> "No Internet connection!"); LogHelper.printDebug(() -> "No Internet connection!");
return quality; return quality;
} } else {
if (preferredQuality == -2) { var preferenceKey = "wifi_quality";
return quality; if (networkType == NetworkType.MOBILE) preferenceKey = "mobile_quality";
}
for (int streamQuality2 : iStreamQualities) { int preferredQuality = SharedPrefHelper.getInt(SharedPrefHelper.SharedPrefNames.REVANCED_PREFS, preferenceKey, -2);
final int indexToLog = index; if (preferredQuality == -2) return quality;
LogHelper.printDebug(() -> "Quality at index " + indexToLog + ": " + streamQuality2);
index++; for (int streamQuality2 : iStreamQualities) {
} final int indexToLog = index;
for (Integer iStreamQuality : iStreamQualities) { LogHelper.printDebug(() -> "Quality at index " + indexToLog + ": " + streamQuality2);
int streamQuality3 = iStreamQuality; index++;
if (streamQuality3 <= preferredQuality) { }
quality = streamQuality3; for (Integer iStreamQuality : iStreamQualities) {
int streamQuality3 = iStreamQuality;
if (streamQuality3 <= preferredQuality) {
quality = streamQuality3;
}
}
if (quality == -2) return quality;
int qualityIndex = iStreamQualities.indexOf(quality);
final int qualityToLog2 = quality;
LogHelper.printDebug(() -> "Index of quality " + qualityToLog2 + " is " + qualityIndex);
try {
Class<?> cl = qInterface.getClass();
Method m = cl.getMethod(qIndexMethod, Integer.TYPE);
LogHelper.printDebug(() -> "Method is: " + qIndexMethod);
m.invoke(qInterface, iStreamQualities.get(qualityIndex));
LogHelper.printDebug(() -> "Quality changed to: " + qualityIndex);
return qualityIndex;
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to set quality", ex);
return qualityIndex;
} }
}
if (quality == -2) {
return quality;
}
int qualityIndex = iStreamQualities.indexOf(quality);
final int qualityToLog2 = quality;
LogHelper.printDebug(() -> "Index of quality " + qualityToLog2 + " is " + qualityIndex);
try {
Class<?> cl = qInterface.getClass();
Method m = cl.getMethod(qIndexMethod, Integer.TYPE);
LogHelper.printDebug(() -> "Method is: " + qIndexMethod);
m.invoke(qInterface, iStreamQualities.get(qualityIndex));
LogHelper.printDebug(() -> "Quality changed to: " + qualityIndex);
return qualityIndex;
} catch (Exception ex) {
LogHelper.printException(() -> "Failed to set quality", ex);
return qualityIndex;
} }
} }
public static void userChangedQuality(int selectedQuality) { public static void userChangedQuality(int selectedQuality) {
// Do not remember a **new** quality if REMEMBER_VIDEO_QUALITY is false
if (!SettingsEnum.REMEMBER_VIDEO_QUALITY_LAST_SELECTED.getBoolean()) return; if (!SettingsEnum.REMEMBER_VIDEO_QUALITY_LAST_SELECTED.getBoolean()) return;
selectedQuality1 = selectedQuality; selectedQuality1 = selectedQuality;
@@ -148,20 +141,23 @@ public class RememberVideoQualityPatch {
newVideo = true; newVideo = true;
} }
@SuppressLint("MissingPermission") private static NetworkType getNetworType(Context context) {
private static NetworkInfo getNetworkInfo(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo(); var networkInfo = cm.getActiveNetworkInfo();
if (networkInfo == null || !networkInfo.isConnected()) {
return NetworkType.NONE;
} else {
var type = networkInfo.getType();
return type == ConnectivityManager.TYPE_MOBILE || type == ConnectivityManager.TYPE_BLUETOOTH ? NetworkType.MOBILE : NetworkType.OTHER;
}
} }
private static boolean isConnectedWifi(Context context) { enum NetworkType {
NetworkInfo info = getNetworkInfo(context); MOBILE,
return info != null && info.isConnected() && info.getType() == 1; OTHER,
} NONE
private static boolean isConnectedMobile(Context context) {
NetworkInfo info = getNetworkInfo(context);
return info != null && info.isConnected() && info.getType() == 0;
} }
} }

View File

@@ -1,9 +1,13 @@
package app.revanced.integrations.returnyoutubedislike.requests; package app.revanced.integrations.returnyoutubedislike.requests;
import static app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike.Vote;
import androidx.annotation.NonNull;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.Objects; import app.revanced.integrations.utils.LogHelper;
/** /**
* ReturnYouTubeDislike API estimated like/dislike/view counts. * ReturnYouTubeDislike API estimated like/dislike/view counts.
@@ -12,7 +16,7 @@ import java.util.Objects;
* So these values may lag behind what YouTube shows. * So these values may lag behind what YouTube shows.
*/ */
public final class RYDVoteData { public final class RYDVoteData {
@NonNull
public final String videoId; public final String videoId;
/** /**
@@ -20,46 +24,87 @@ public final class RYDVoteData {
*/ */
public final long viewCount; public final long viewCount;
private final long fetchedLikeCount;
private volatile long likeCount; // read/write from different threads
private volatile float likePercentage;
private final long fetchedDislikeCount;
private volatile long dislikeCount; // read/write from different threads
private volatile float dislikePercentage;
/**
* @throws JSONException if JSON parse error occurs, or if the values make no sense (ie: negative values)
*/
public RYDVoteData(@NonNull JSONObject json) throws JSONException {
videoId = json.getString("id");
viewCount = json.getLong("viewCount");
fetchedLikeCount = json.getLong("likes");
fetchedDislikeCount = json.getLong("dislikes");
if (viewCount < 0 || fetchedLikeCount < 0 || fetchedDislikeCount < 0) {
throw new JSONException("Unexpected JSON values: " + json);
}
likeCount = fetchedLikeCount;
dislikeCount = fetchedDislikeCount;
updatePercentages();
}
/** /**
* Estimated like count * Estimated like count
*/ */
public final long likeCount; public long getLikeCount() {
return likeCount;
}
/** /**
* Estimated dislike count * Estimated dislike count
*/ */
public final long dislikeCount; public long getDislikeCount() {
return dislikeCount;
}
/** /**
* Estimated percentage of likes for all votes. Value has range of [0, 1] * Estimated percentage of likes for all votes. Value has range of [0, 1]
* *
* A video with 400 positive votes, and 100 negative votes, has a likePercentage of 0.8 * A video with 400 positive votes, and 100 negative votes, has a likePercentage of 0.8
*/ */
public final float likePercentage; public float getLikePercentage() {
return likePercentage;
}
/** /**
* Estimated percentage of dislikes for all votes. Value has range of [0, 1] * Estimated percentage of dislikes for all votes. Value has range of [0, 1]
* *
* A video with 400 positive votes, and 100 negative votes, has a dislikePercentage of 0.2 * A video with 400 positive votes, and 100 negative votes, has a dislikePercentage of 0.2
*/ */
public final float dislikePercentage; public float getDislikePercentage() {
return dislikePercentage;
/**
* @throws JSONException if JSON parse error occurs, or if the values make no sense (ie: negative values)
*/
public RYDVoteData(JSONObject json) throws JSONException {
Objects.requireNonNull(json);
videoId = json.getString("id");
viewCount = json.getLong("viewCount");
likeCount = json.getLong("likes");
dislikeCount = json.getLong("dislikes");
if (likeCount < 0 || dislikeCount < 0 || viewCount < 0) {
throw new JSONException("Unexpected JSON values: " + json);
}
likePercentage = (likeCount == 0 ? 0 : (float)likeCount / (likeCount + dislikeCount));
dislikePercentage = (dislikeCount == 0 ? 0 : (float)dislikeCount / (likeCount + dislikeCount));
} }
public void updateUsingVote(Vote vote) {
if (vote == Vote.LIKE) {
LogHelper.printDebug(() -> "Increasing like count");
likeCount = fetchedLikeCount + 1;
dislikeCount = fetchedDislikeCount;
} else if (vote == Vote.DISLIKE) {
LogHelper.printDebug(() -> "Increasing dislike count");
likeCount = fetchedLikeCount;
dislikeCount = fetchedDislikeCount + 1;
} else if (vote == Vote.LIKE_REMOVE) {
LogHelper.printDebug(() -> "Resetting like/dislike to fetched values");
likeCount = fetchedLikeCount;
dislikeCount = fetchedDislikeCount;
} else {
throw new IllegalStateException();
}
updatePercentages();
}
private void updatePercentages() {
likePercentage = (likeCount == 0 ? 0 : (float) likeCount / (likeCount + dislikeCount));
dislikePercentage = (dislikeCount == 0 ? 0 : (float) dislikeCount / (likeCount + dislikeCount));
}
@NonNull
@Override @Override
public String toString() { public String toString() {
return "RYDVoteData{" return "RYDVoteData{"
@@ -73,4 +118,5 @@ public final class RYDVoteData {
} }
// equals and hashcode is not implemented (currently not needed) // equals and hashcode is not implemented (currently not needed)
} }

View File

@@ -1,29 +1,27 @@
package app.revanced.integrations.returnyoutubedislike.requests; package app.revanced.integrations.returnyoutubedislike.requests;
import static app.revanced.integrations.returnyoutubedislike.requests.ReturnYouTubeDislikeRoutes.getRYDConnectionFromRoute;
import static app.revanced.integrations.sponsorblock.StringRef.str;
import android.util.Base64; import android.util.Base64;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import app.revanced.integrations.requests.Requester;
import app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.ProtocolException; import java.net.ProtocolException;
import java.net.SocketTimeoutException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.Objects; import java.util.Objects;
import app.revanced.integrations.requests.Requester; import static app.revanced.integrations.returnyoutubedislike.requests.ReturnYouTubeDislikeRoutes.getRYDConnectionFromRoute;
import app.revanced.integrations.returnyoutubedislike.ReturnYouTubeDislike; import static app.revanced.integrations.sponsorblock.StringRef.str;
import app.revanced.integrations.utils.LogHelper;
import app.revanced.integrations.utils.ReVancedUtils;
public class ReturnYouTubeDislikeApi { public class ReturnYouTubeDislikeApi {
/** /**
@@ -48,7 +46,13 @@ public class ReturnYouTubeDislikeApi {
/** /**
* Response code of a successful API call * Response code of a successful API call
*/ */
private static final int SUCCESS_HTTP_STATUS_CODE = 200; private static final int HTTP_STATUS_CODE_SUCCESS = 200;
/**
* Response code indicating the video id is not for a video that can be voted for.
* (it's not a Short or a regular video, and it's likely a YouTube Story)
*/
private static final int HTTP_STATUS_CODE_NOT_FOUND = 404;
/** /**
* Indicates a client rate limit has been reached * Indicates a client rate limit has been reached
@@ -57,9 +61,9 @@ public class ReturnYouTubeDislikeApi {
/** /**
* How long to wait until API calls are resumed, if a rate limit is hit. * How long to wait until API calls are resumed, if a rate limit is hit.
* No clear guideline of how long to backoff. Using 60 seconds for now. * No clear guideline of how long to backoff. Using 2 minutes for now.
*/ */
private static final int RATE_LIMIT_BACKOFF_SECONDS = 60; private static final int RATE_LIMIT_BACKOFF_SECONDS = 120;
/** /**
* Last time a {@link #RATE_LIMIT_HTTP_STATUS_CODE} was reached. * Last time a {@link #RATE_LIMIT_HTTP_STATUS_CODE} was reached.
@@ -133,6 +137,7 @@ public class ReturnYouTubeDislikeApi {
* *
* @param maximumTimeToWait maximum time to wait * @param maximumTimeToWait maximum time to wait
*/ */
@SuppressWarnings("UnusedReturnValue")
private static long randomlyWaitIfLocallyDebugging(long maximumTimeToWait) { private static long randomlyWaitIfLocallyDebugging(long maximumTimeToWait) {
final boolean DEBUG_RANDOMLY_DELAY_NETWORK_CALLS = false; // set true to debug UI final boolean DEBUG_RANDOMLY_DELAY_NETWORK_CALLS = false; // set true to debug UI
if (DEBUG_RANDOMLY_DELAY_NETWORK_CALLS) { if (DEBUG_RANDOMLY_DELAY_NETWORK_CALLS) {
@@ -183,6 +188,8 @@ public class ReturnYouTubeDislikeApi {
if (httpResponseCode == RATE_LIMIT_HTTP_STATUS_CODE) { if (httpResponseCode == RATE_LIMIT_HTTP_STATUS_CODE) {
lastTimeRateLimitWasHit = System.currentTimeMillis(); lastTimeRateLimitWasHit = System.currentTimeMillis();
//noinspection NonAtomicOperationOnVolatileField // don't care, field is used only as an estimate
numberOfRateLimitRequestsEncountered++;
LogHelper.printDebug(() -> "API rate limit was hit. Stopping API calls for the next " LogHelper.printDebug(() -> "API rate limit was hit. Stopping API calls for the next "
+ RATE_LIMIT_BACKOFF_SECONDS + " seconds"); + RATE_LIMIT_BACKOFF_SECONDS + " seconds");
ReVancedUtils.runOnMainThread(() -> { // must show toasts on main thread ReVancedUtils.runOnMainThread(() -> { // must show toasts on main thread
@@ -208,7 +215,6 @@ public class ReturnYouTubeDislikeApi {
fetchCallNumberOfFailures++; fetchCallNumberOfFailures++;
} else if (rateLimitHit) { } else if (rateLimitHit) {
fetchCallResponseTimeLast = FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT; fetchCallResponseTimeLast = FETCH_CALL_RESPONSE_TIME_VALUE_RATE_LIMIT;
numberOfRateLimitRequestsEncountered++;
} else { } else {
fetchCallResponseTimeLast = responseTimeOfFetchCall; fetchCallResponseTimeLast = responseTimeOfFetchCall;
} }
@@ -228,7 +234,6 @@ public class ReturnYouTubeDislikeApi {
LogHelper.printDebug(() -> "Fetching votes for: " + videoId); LogHelper.printDebug(() -> "Fetching votes for: " + videoId);
final long timeNetworkCallStarted = System.currentTimeMillis(); final long timeNetworkCallStarted = System.currentTimeMillis();
String connectionErrorMessageStringKey = "revanced_ryd_failure_connection_timeout";
try { try {
HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.GET_DISLIKES, videoId); HttpURLConnection connection = getRYDConnectionFromRoute(ReturnYouTubeDislikeRoutes.GET_DISLIKES, videoId);
// request headers, as per https://returnyoutubedislike.com/docs/fetching // request headers, as per https://returnyoutubedislike.com/docs/fetching
@@ -250,7 +255,7 @@ public class ReturnYouTubeDislikeApi {
return null; return null;
} }
if (responseCode == SUCCESS_HTTP_STATUS_CODE) { if (responseCode == HTTP_STATUS_CODE_SUCCESS) {
final long timeNetworkCallEnded = System.currentTimeMillis(); // record end time before parsing final long timeNetworkCallEnded = System.currentTimeMillis(); // record end time before parsing
// do not disconnect, the same server connection will likely be used again soon // do not disconnect, the same server connection will likely be used again soon
JSONObject json = Requester.parseJSONObject(connection); JSONObject json = Requester.parseJSONObject(connection);
@@ -263,13 +268,20 @@ public class ReturnYouTubeDislikeApi {
LogHelper.printException(() -> "Failed to parse video: " + videoId + " json: " + json, ex); LogHelper.printException(() -> "Failed to parse video: " + videoId + " json: " + json, ex);
// fall thru to update statistics // fall thru to update statistics
} }
} else if (responseCode == HTTP_STATUS_CODE_NOT_FOUND) {
// normal response when viewing YouTube Stories (cannot vote for these)
LogHelper.printDebug(() -> "Video has no like/dislikes (video is a YouTube Story?): " + videoId);
return null; // do not updated connection statistics
} else { } else {
LogHelper.printException(() -> "Failed to fetch votes for video: " + videoId LogHelper.printException(() -> "Failed to fetch votes for video: " + videoId + " response code was: " + responseCode,
+ " response code was: " + responseCode, null, str(connectionErrorMessageStringKey)); null, str("revanced_ryd_failure_connection_status_code", responseCode));
connection.disconnect(); // something went wrong, might as well disconnect connection.disconnect(); // something went wrong, might as well disconnect
} }
} catch (Exception ex) { // connection timed out, response timeout, or some other network error } catch (SocketTimeoutException ex) { // connection timed out, response timeout, or some other network error
LogHelper.printException(() -> "Failed to fetch votes", ex, str(connectionErrorMessageStringKey)); LogHelper.printException(() -> "Failed to fetch votes", ex, str("revanced_ryd_failure_connection_timeout"));
} catch (Exception ex) {
// should never happen
LogHelper.printException(() -> "Failed to fetch votes", ex, str("revanced_ryd_failure_generic", ex.getMessage()));
} }
updateStatistics(timeNetworkCallStarted, System.currentTimeMillis(), true, false); updateStatistics(timeNetworkCallStarted, System.currentTimeMillis(), true, false);
@@ -299,7 +311,7 @@ public class ReturnYouTubeDislikeApi {
connection.disconnect(); // disconnect, as no more connections will be made for a little while connection.disconnect(); // disconnect, as no more connections will be made for a little while
return null; return null;
} }
if (responseCode == SUCCESS_HTTP_STATUS_CODE) { if (responseCode == HTTP_STATUS_CODE_SUCCESS) {
JSONObject json = Requester.parseJSONObject(connection); JSONObject json = Requester.parseJSONObject(connection);
String challenge = json.getString("challenge"); String challenge = json.getString("challenge");
int difficulty = json.getInt("difficulty"); int difficulty = json.getInt("difficulty");
@@ -340,7 +352,7 @@ public class ReturnYouTubeDislikeApi {
connection.disconnect(); // disconnect, as no more connections will be made for a little while connection.disconnect(); // disconnect, as no more connections will be made for a little while
return null; return null;
} }
if (responseCode == SUCCESS_HTTP_STATUS_CODE) { if (responseCode == HTTP_STATUS_CODE_SUCCESS) {
String result = Requester.parseJson(connection); String result = Requester.parseJson(connection);
if (result.equalsIgnoreCase("true")) { if (result.equalsIgnoreCase("true")) {
LogHelper.printDebug(() -> "Registration confirmation successful for user: " + userId); LogHelper.printDebug(() -> "Registration confirmation successful for user: " + userId);
@@ -387,7 +399,7 @@ public class ReturnYouTubeDislikeApi {
connection.disconnect(); // disconnect, as no more connections will be made for a little while connection.disconnect(); // disconnect, as no more connections will be made for a little while
return false; return false;
} }
if (responseCode == SUCCESS_HTTP_STATUS_CODE) { if (responseCode == HTTP_STATUS_CODE_SUCCESS) {
JSONObject json = Requester.parseJSONObject(connection); JSONObject json = Requester.parseJSONObject(connection);
String challenge = json.getString("challenge"); String challenge = json.getString("challenge");
int difficulty = json.getInt("difficulty"); int difficulty = json.getInt("difficulty");
@@ -431,7 +443,7 @@ public class ReturnYouTubeDislikeApi {
return false; return false;
} }
if (responseCode == SUCCESS_HTTP_STATUS_CODE) { if (responseCode == HTTP_STATUS_CODE_SUCCESS) {
String result = Requester.parseJson(connection); String result = Requester.parseJson(connection);
if (result.equalsIgnoreCase("true")) { if (result.equalsIgnoreCase("true")) {
LogHelper.printDebug(() -> "Vote confirm successful for video: " + videoId); LogHelper.printDebug(() -> "Vote confirm successful for video: " + videoId);
@@ -469,9 +481,7 @@ public class ReturnYouTubeDislikeApi {
byte[] decodedChallenge = Base64.decode(challenge, Base64.NO_WRAP); byte[] decodedChallenge = Base64.decode(challenge, Base64.NO_WRAP);
byte[] buffer = new byte[20]; byte[] buffer = new byte[20];
for (int i = 4; i < 20; i++) { // FIXME replace with System.arrayCopy System.arraycopy(decodedChallenge, 0, buffer, 4, 16);
buffer[i] = decodedChallenge[i - 4];
}
MessageDigest md; MessageDigest md;
try { try {
@@ -513,9 +523,9 @@ public class ReturnYouTubeDislikeApi {
private static int countLeadingZeroes(byte[] uInt8View) { private static int countLeadingZeroes(byte[] uInt8View) {
int zeroes = 0; int zeroes = 0;
int value = 0; int value;
for (int i = 0; i < uInt8View.length; i++) { for (byte b : uInt8View) {
value = uInt8View[i] & 0xFF; value = b & 0xFF;
if (value == 0) { if (value == 0) {
zeroes += 8; zeroes += 8;
} else { } else {

View File

@@ -62,8 +62,6 @@ public class ReturnYouTubeDislikeSettingsFragment extends PreferenceFragment {
setPreferenceScreen(preferenceScreen); setPreferenceScreen(preferenceScreen);
enabledPreference = new SwitchPreference(context); enabledPreference = new SwitchPreference(context);
enabledPreference.setKey(SettingsEnum.RYD_ENABLED.getPath());
enabledPreference.setDefaultValue(SettingsEnum.RYD_ENABLED.getDefaultValue());
enabledPreference.setChecked(SettingsEnum.RYD_ENABLED.getBoolean()); enabledPreference.setChecked(SettingsEnum.RYD_ENABLED.getBoolean());
enabledPreference.setTitle(str("revanced_ryd_enable_title")); enabledPreference.setTitle(str("revanced_ryd_enable_title"));
enabledPreference.setOnPreferenceChangeListener((pref, newValue) -> { enabledPreference.setOnPreferenceChangeListener((pref, newValue) -> {
@@ -77,8 +75,6 @@ public class ReturnYouTubeDislikeSettingsFragment extends PreferenceFragment {
preferenceScreen.addPreference(enabledPreference); preferenceScreen.addPreference(enabledPreference);
percentagePreference = new SwitchPreference(context); percentagePreference = new SwitchPreference(context);
percentagePreference.setKey(SettingsEnum.RYD_SHOW_DISLIKE_PERCENTAGE.getPath());
percentagePreference.setDefaultValue(SettingsEnum.RYD_SHOW_DISLIKE_PERCENTAGE.getDefaultValue());
percentagePreference.setChecked(SettingsEnum.RYD_SHOW_DISLIKE_PERCENTAGE.getBoolean()); percentagePreference.setChecked(SettingsEnum.RYD_SHOW_DISLIKE_PERCENTAGE.getBoolean());
percentagePreference.setTitle(str("revanced_ryd_dislike_percentage_title")); percentagePreference.setTitle(str("revanced_ryd_dislike_percentage_title"));
percentagePreference.setOnPreferenceChangeListener((pref, newValue) -> { percentagePreference.setOnPreferenceChangeListener((pref, newValue) -> {
@@ -90,8 +86,6 @@ public class ReturnYouTubeDislikeSettingsFragment extends PreferenceFragment {
preferenceScreen.addPreference(percentagePreference); preferenceScreen.addPreference(percentagePreference);
compactLayoutPreference = new SwitchPreference(context); compactLayoutPreference = new SwitchPreference(context);
compactLayoutPreference.setKey(SettingsEnum.RYD_USE_COMPACT_LAYOUT.getPath());
compactLayoutPreference.setDefaultValue(SettingsEnum.RYD_USE_COMPACT_LAYOUT.getDefaultValue());
compactLayoutPreference.setChecked(SettingsEnum.RYD_USE_COMPACT_LAYOUT.getBoolean()); compactLayoutPreference.setChecked(SettingsEnum.RYD_USE_COMPACT_LAYOUT.getBoolean());
compactLayoutPreference.setTitle(str("revanced_ryd_compact_layout_title")); compactLayoutPreference.setTitle(str("revanced_ryd_compact_layout_title"));
compactLayoutPreference.setOnPreferenceChangeListener((pref, newValue) -> { compactLayoutPreference.setOnPreferenceChangeListener((pref, newValue) -> {

View File

@@ -171,6 +171,7 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
screen.addPreference(colorPreference); screen.addPreference(colorPreference);
colorPreference.setTitle(str("color_change")); colorPreference.setTitle(str("color_change"));
colorPreference.setSummary(str("color_change_sum")); colorPreference.setSummary(str("color_change_sum"));
colorPreference.setSelectable(false);
preferencesToDisableWhenSBDisabled.add(colorPreference); preferencesToDisableWhenSBDisabled.add(colorPreference);
} }
@@ -184,6 +185,7 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
Preference preference = new Preference(context); Preference preference = new Preference(context);
category.addPreference(preference); category.addPreference(preference);
preference.setTitle(str("stats_loading")); preference.setTitle(str("stats_loading"));
preference.setSelectable(false);
SBRequester.retrieveUserStats(category, preference); SBRequester.retrieveUserStats(category, preference);
} }
@@ -211,6 +213,7 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
Preference preference = new Preference(context); Preference preference = new Preference(context);
screen.addPreference(preference); screen.addPreference(preference);
preference.setTitle(str("about_madeby")); preference.setTitle(str("about_madeby"));
preference.setSelectable(false);
} }
} }
@@ -233,11 +236,14 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
} }
{ {
Preference preference = new SwitchPreference(context); SwitchPreference preference = new SwitchPreference(context);
preference.setTitle(str("general_skiptoast")); preference.setTitle(str("general_skiptoast"));
preference.setSummary(str("general_skiptoast_sum")); preference.setSummary(str("general_skiptoast_sum"));
preference.setKey(SettingsEnum.SB_SHOW_TOAST_WHEN_SKIP.getPath()); preference.setChecked(SettingsEnum.SB_SHOW_TOAST_WHEN_SKIP.getBoolean());
preference.setDefaultValue(SettingsEnum.SB_SHOW_TOAST_WHEN_SKIP.getDefaultValue()); preference.setOnPreferenceChangeListener((preference1, newValue) -> {
SettingsEnum.SB_SHOW_TOAST_WHEN_SKIP.saveValue(newValue);
return true;
});
preference.setOnPreferenceClickListener(preference12 -> { preference.setOnPreferenceClickListener(preference12 -> {
Toast.makeText(preference12.getContext(), str("skipped_sponsor"), Toast.LENGTH_SHORT).show(); Toast.makeText(preference12.getContext(), str("skipped_sponsor"), Toast.LENGTH_SHORT).show();
return false; return false;
@@ -247,21 +253,28 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
} }
{ {
Preference preference = new SwitchPreference(context); SwitchPreference preference = new SwitchPreference(context);
preference.setTitle(str("general_skipcount")); preference.setTitle(str("general_skipcount"));
preference.setSummary(str("general_skipcount_sum")); preference.setSummary(str("general_skipcount_sum"));
preference.setKey(SettingsEnum.SB_COUNT_SKIPS.getPath()); preference.setChecked(SettingsEnum.SB_COUNT_SKIPS.getBoolean());
preference.setDefaultValue(SettingsEnum.SB_COUNT_SKIPS.getDefaultValue()); preference.setOnPreferenceChangeListener((preference1, newValue) -> {
SettingsEnum.SB_COUNT_SKIPS.saveValue(newValue);
return true;
});
preferencesToDisableWhenSBDisabled.add(preference); preferencesToDisableWhenSBDisabled.add(preference);
screen.addPreference(preference); screen.addPreference(preference);
} }
{ {
Preference preference = new SwitchPreference(context); SwitchPreference preference = new SwitchPreference(context);
preference.setTitle(str("general_time_without_sb")); preference.setTitle(str("general_time_without_sb"));
preference.setSummary(str("general_time_without_sb_sum")); preference.setSummary(str("general_time_without_sb_sum"));
preference.setKey(SettingsEnum.SB_SHOW_TIME_WITHOUT_SEGMENTS.getPath()); preference.setChecked(SettingsEnum.SB_SHOW_TIME_WITHOUT_SEGMENTS.getBoolean());
preference.setDefaultValue(SettingsEnum.SB_SHOW_TIME_WITHOUT_SEGMENTS.getDefaultValue()); preference.setOnPreferenceChangeListener((preference1, newValue) -> {
SettingsEnum.SB_SHOW_TIME_WITHOUT_SEGMENTS.saveValue(newValue);
return true;
});
preferencesToDisableWhenSBDisabled.add(preference); preferencesToDisableWhenSBDisabled.add(preference);
screen.addPreference(preference); screen.addPreference(preference);
} }
@@ -271,8 +284,11 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
preference.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER); preference.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
preference.setTitle(str("general_adjusting")); preference.setTitle(str("general_adjusting"));
preference.setSummary(str("general_adjusting_sum")); preference.setSummary(str("general_adjusting_sum"));
preference.setKey(SettingsEnum.SB_ADJUST_NEW_SEGMENT_STEP.getPath()); preference.setText(String.valueOf(SettingsEnum.SB_ADJUST_NEW_SEGMENT_STEP.getInt()));
preference.setDefaultValue(SettingsEnum.SB_ADJUST_NEW_SEGMENT_STEP.getDefaultValue() + ""); preference.setOnPreferenceChangeListener((preference1, newValue) -> {
SettingsEnum.SB_ADJUST_NEW_SEGMENT_STEP.saveValue(Integer.valueOf(newValue.toString()));
return true;
});
screen.addPreference(preference); screen.addPreference(preference);
preferencesToDisableWhenSBDisabled.add(preference); preferencesToDisableWhenSBDisabled.add(preference);
} }
@@ -282,18 +298,25 @@ public class SponsorBlockSettingsFragment extends PreferenceFragment implements
preference.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); preference.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
preference.setTitle(str("general_min_duration")); preference.setTitle(str("general_min_duration"));
preference.setSummary(str("general_min_duration_sum")); preference.setSummary(str("general_min_duration_sum"));
preference.setKey(SettingsEnum.SB_MIN_DURATION.getPath()); preference.setText(String.valueOf(SettingsEnum.SB_MIN_DURATION.getFloat()));
preference.setDefaultValue(SettingsEnum.SB_MIN_DURATION.getDefaultValue() + ""); preference.setOnPreferenceChangeListener((preference1, newValue) -> {
SettingsEnum.SB_MIN_DURATION.saveValue(Float.valueOf(newValue.toString()));
return true;
});
screen.addPreference(preference); screen.addPreference(preference);
preferencesToDisableWhenSBDisabled.add(preference); preferencesToDisableWhenSBDisabled.add(preference);
} }
{ {
Preference preference = new EditTextPreference(context); EditTextPreference preference = new EditTextPreference(context);
preference.setTitle(str("general_uuid")); preference.setTitle(str("general_uuid"));
preference.setSummary(str("general_uuid_sum")); preference.setSummary(str("general_uuid_sum"));
preference.setKey(SettingsEnum.SB_UUID.getPath()); preference.setText(SettingsEnum.SB_UUID.getString());
preference.setDefaultValue(SettingsEnum.SB_UUID.getDefaultValue() + ""); preference.setOnPreferenceChangeListener((preference1, newValue) -> {
SettingsEnum.SB_UUID.saveValue(newValue.toString());
return true;
});
screen.addPreference(preference); screen.addPreference(preference);
preferencesToDisableWhenSBDisabled.add(preference); preferencesToDisableWhenSBDisabled.add(preference);
} }

View File

@@ -7,8 +7,8 @@ import app.revanced.integrations.utils.Event
*/ */
@Suppress("unused") @Suppress("unused")
enum class PlayerType { enum class PlayerType {
NONE, // this also includes when shorts are playing NONE, // includes Shorts playback
HIDDEN, HIDDEN, // also includes YouTube Shorts and Stories, if a regular video is minimized and a Short/Story is then opened
WATCH_WHILE_MINIMIZED, WATCH_WHILE_MINIMIZED,
WATCH_WHILE_MAXIMIZED, WATCH_WHILE_MAXIMIZED,
WATCH_WHILE_FULLSCREEN, WATCH_WHILE_FULLSCREEN,
@@ -42,6 +42,7 @@ enum class PlayerType {
currentPlayerType = value currentPlayerType = value
onChange(currentPlayerType) onChange(currentPlayerType)
} }
@Volatile // value is read/write from different threads
private var currentPlayerType = NONE private var currentPlayerType = NONE
/** /**
@@ -49,4 +50,13 @@ enum class PlayerType {
*/ */
val onChange = Event<PlayerType>() val onChange = Event<PlayerType>()
} }
/**
* Check if the current player type is [NONE] or [HIDDEN]
*
* @return True, if nothing, a Short, or a Story is playing.
*/
fun isNoneOrHidden(): Boolean {
return this == NONE || this == HIDDEN
}
} }

View File

@@ -193,14 +193,13 @@ public class PlayerController {
SettingsEnum.SB_SKIPPED_SEGMENTS_TIME.saveValue(newSkippedTime); SettingsEnum.SB_SKIPPED_SEGMENTS_TIME.saveValue(newSkippedTime);
} }
} }
new Thread(() -> { // fixme: use ReVancedUtils#runOnBackgroundThread if (SettingsEnum.SB_COUNT_SKIPS.getBoolean()
if (SettingsEnum.SB_COUNT_SKIPS.getBoolean() && && segment.category != SponsorBlockSettings.SegmentInfo.UNSUBMITTED
segment.category != SponsorBlockSettings.SegmentInfo.UNSUBMITTED && && millis - segment.start < 2000) { // Only skips from the start should count as a view
millis - segment.start < 2000) { ReVancedUtils.runOnBackgroundThread(() -> {
// Only skips from the start should count as a view
SBRequester.sendViewCountRequest(segment); SBRequester.sendViewCountRequest(segment);
} });
}).start(); }
} }
public static void setHighPrecisionVideoTime(final long millis) { public static void setHighPrecisionVideoTime(final long millis) {

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