mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-17 16:23:56 +00:00
Compare commits
70 Commits
v4.14.0-de
...
v4.17.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
651e34b997 | ||
|
|
fc7644d3b7 | ||
|
|
061ebcb7c6 | ||
|
|
38e7884d17 | ||
|
|
64680c718b | ||
|
|
007702825b | ||
|
|
596c2b0f8d | ||
|
|
773fd81dfd | ||
|
|
68b61b4725 | ||
|
|
10efb20e35 | ||
|
|
d5a13684f6 | ||
|
|
e2dd1bdaf3 | ||
|
|
98c33f03dd | ||
|
|
d73e5b77df | ||
|
|
2f7e1f601a | ||
|
|
bcdc7a4589 | ||
|
|
0679a47b22 | ||
|
|
5a08620356 | ||
|
|
42ed29b4c0 | ||
|
|
8475cc2b09 | ||
|
|
d76f4c96a4 | ||
|
|
eebe82b2f4 | ||
|
|
59273999e9 | ||
|
|
c3d457d7de | ||
|
|
17dfc161c1 | ||
|
|
e3e1efea33 | ||
|
|
ef8aa22779 | ||
|
|
fb9db0eec4 | ||
|
|
33adf53ef1 | ||
|
|
9131e387b5 | ||
|
|
1928e89085 | ||
|
|
35973c721a | ||
|
|
31b18fec39 | ||
|
|
db15b68dc8 | ||
|
|
82d44f691d | ||
|
|
fee2218303 | ||
|
|
1f0b4cdcb4 | ||
|
|
1fd30c1b44 | ||
|
|
fa94ddd510 | ||
|
|
94cf815e4a | ||
|
|
8a3b0610b4 | ||
|
|
b920355d9c | ||
|
|
8b49012130 | ||
|
|
4c7b018878 | ||
|
|
5ddd957313 | ||
|
|
bb0dcbe83d | ||
|
|
163736fb26 | ||
|
|
0c6db43bde | ||
|
|
317e9a80eb | ||
|
|
464e6a3673 | ||
|
|
2e9142eda4 | ||
|
|
b4c6d0a7d2 | ||
|
|
c0ee85e12a | ||
|
|
2d326072e2 | ||
|
|
586770aa3a | ||
|
|
9f314c2425 | ||
|
|
c8b3456738 | ||
|
|
e8cb6ee028 | ||
|
|
3e796eb7c2 | ||
|
|
303d2de81d | ||
|
|
0ab7344295 | ||
|
|
ff8fe46685 | ||
|
|
a104eeaf68 | ||
|
|
18b09168cc | ||
|
|
f7209f0a53 | ||
|
|
1fb3fc4857 | ||
|
|
e03c14cc01 | ||
|
|
bed29d00dc | ||
|
|
d36982e245 | ||
|
|
13031f0534 |
5
.github/workflows/open_pull_request.yml
vendored
5
.github/workflows/open_pull_request.yml
vendored
@@ -25,7 +25,8 @@ jobs:
|
||||
pr_body: |
|
||||
This pull request will ${{ env.MESSAGE }}.
|
||||
|
||||
## Dependencies before merge
|
||||
## Before merging this PR
|
||||
|
||||
- [ ] https://github.com/revanced/revanced-integrations
|
||||
- [ ] Remember about https://github.com/revanced/revanced-integrations
|
||||
- [ ] Pull translations from Crowdin
|
||||
pr_draft: true
|
||||
|
||||
4
.github/workflows/pull_strings.yml
vendored
4
.github/workflows/pull_strings.yml
vendored
@@ -8,6 +8,8 @@ on:
|
||||
jobs:
|
||||
pull:
|
||||
name: Pull strings
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -30,6 +32,6 @@ jobs:
|
||||
github_user_name: revanced-bot
|
||||
github_user_email: github@revanced.app
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
||||
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
||||
|
||||
1
.github/workflows/push_strings.yml
vendored
1
.github/workflows/push_strings.yml
vendored
@@ -24,6 +24,5 @@ jobs:
|
||||
config: crowdin.yml
|
||||
upload_sources: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
||||
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
||||
|
||||
5
.github/workflows/release.yml
vendored
5
.github/workflows/release.yml
vendored
@@ -10,6 +10,9 @@ on:
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -46,5 +49,5 @@ jobs:
|
||||
|
||||
- name: Release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: npm exec semantic-release
|
||||
|
||||
@@ -21,11 +21,11 @@
|
||||
"@semantic-release/git",
|
||||
{
|
||||
"assets": [
|
||||
"README.md",
|
||||
"CHANGELOG.md",
|
||||
"gradle.properties",
|
||||
"patches.json"
|
||||
]
|
||||
],
|
||||
"message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
|
||||
}
|
||||
],
|
||||
[
|
||||
|
||||
236
CHANGELOG.md
236
CHANGELOG.md
@@ -1,3 +1,239 @@
|
||||
# [4.17.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.9...v4.17.0-dev.10) (2024-10-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Facebook:** Add `Hide sponsored stories` patch ([#3627](https://github.com/ReVanced/revanced-patches/issues/3627)) ([214c72b](https://github.com/ReVanced/revanced-patches/commit/214c72baeb7f87f21cd2ca34301ab11fa0ff1a4f))
|
||||
|
||||
# [4.17.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.8...v4.17.0-dev.9) (2024-10-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Sync for Reddit:** Add `Fix video downloads` patch ([#3739](https://github.com/ReVanced/revanced-patches/issues/3739)) ([a47ee38](https://github.com/ReVanced/revanced-patches/commit/a47ee38b1cdd974a959008006ecaf58917addc60))
|
||||
|
||||
# [4.17.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.7...v4.17.0-dev.8) (2024-10-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Twitter:** Add `Change link sharing domain` patch ([#3753](https://github.com/ReVanced/revanced-patches/issues/3753)) ([9269a07](https://github.com/ReVanced/revanced-patches/commit/9269a076b674ecdcf478bca842238f6e30869f44))
|
||||
|
||||
# [4.17.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.6...v4.17.0-dev.7) (2024-10-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Twitter - Unlock downloads:** Make it work with latest versions ([#3782](https://github.com/ReVanced/revanced-patches/issues/3782)) ([5189122](https://github.com/ReVanced/revanced-patches/commit/5189122006b0f72d5bfb50422021c3b0f3a9ae4a))
|
||||
* **YouTube - Spoof video streams:** Fix playback for Android VR by removing invalid body as well ([#3769](https://github.com/ReVanced/revanced-patches/issues/3769)) ([5150a15](https://github.com/ReVanced/revanced-patches/commit/5150a15ad4ca73a747f0a89f933db7f2d686ec2d))
|
||||
|
||||
# [4.17.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.5...v4.17.0-dev.6) (2024-10-14)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide Shorts components:** Add option to hide `Use template`, `Upcoming`, `Green screen` buttons ([#3752](https://github.com/ReVanced/revanced-patches/issues/3752)) ([f71c406](https://github.com/ReVanced/revanced-patches/commit/f71c4068bc646d02954b59fac4756f1419c55dbe))
|
||||
|
||||
# [4.17.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.4...v4.17.0-dev.5) (2024-10-07)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Backdrops - Pro unlock:** Support latest versions by removing version constraint ([a62b506](https://github.com/ReVanced/revanced-patches/commit/a62b50691c49d1ce529a7c9c4e49da0d0dd46df2))
|
||||
|
||||
# [4.17.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.3...v4.17.0-dev.4) (2024-10-06)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Hide layout components:** Adjust settings text ([#3745](https://github.com/ReVanced/revanced-patches/issues/3745)) ([13998bb](https://github.com/ReVanced/revanced-patches/commit/13998bbf95ac3cde8bf24754d60258d0ff9bc4f4))
|
||||
|
||||
# [4.17.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.2...v4.17.0-dev.3) (2024-10-06)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide layout components:** Add option to hide Yoodles (YouTube Doodles) ([#3743](https://github.com/ReVanced/revanced-patches/issues/3743)) ([b8c8916](https://github.com/ReVanced/revanced-patches/commit/b8c89164cf3911ac3842df9b0d2ec42b52213505))
|
||||
|
||||
# [4.17.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.17.0-dev.1...v4.17.0-dev.2) (2024-10-05)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Willhaben:** Add `Hide ads` patch ([#3740](https://github.com/ReVanced/revanced-patches/issues/3740)) ([1fe3a52](https://github.com/ReVanced/revanced-patches/commit/1fe3a523e99ccfe556d88800686e34ac6ed77b2c))
|
||||
|
||||
# [4.17.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.16.1-dev.1...v4.17.0-dev.1) (2024-10-02)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide Shorts components:** Add option to hide like fountain ([#3731](https://github.com/ReVanced/revanced-patches/issues/3731)) ([00a99dd](https://github.com/ReVanced/revanced-patches/commit/00a99dd13be6e5c44fa691d74c92b23ce6ba659d))
|
||||
|
||||
## [4.16.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.16.0...v4.16.1-dev.1) (2024-10-01)
|
||||
|
||||
# [4.16.0](https://github.com/ReVanced/revanced-patches/compare/v4.15.0...v4.16.0) (2024-09-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Soundcloud:** Support latest versions ([#3702](https://github.com/ReVanced/revanced-patches/issues/3702)) ([099ac5e](https://github.com/ReVanced/revanced-patches/commit/099ac5ea2cf55633a7c6a7e6f8e963599bcd5784))
|
||||
* **Twitter - Open links with app chooser:** Fix incorrect version in compatibility list ([#3683](https://github.com/ReVanced/revanced-patches/issues/3683)) ([adafe85](https://github.com/ReVanced/revanced-patches/commit/adafe85d77f6a0031a5523b9b7da69475959d78d))
|
||||
* **YouTube - SponsorBlock:** Fade out SB buttons without overlapping other buttons ([#3719](https://github.com/ReVanced/revanced-patches/issues/3719)) ([bf96108](https://github.com/ReVanced/revanced-patches/commit/bf9610894f0a9f9e751e2eed5b825c5d327a722c))
|
||||
* **YouTube:** Show video chapter titles without clipping when overlay buttons are enabled ([#3674](https://github.com/ReVanced/revanced-patches/issues/3674)) ([4b88c31](https://github.com/ReVanced/revanced-patches/commit/4b88c316ed90c56e83e2aee266561833b36fc37d))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Google Photos:** Restore hidden 'Back up while charging' toggle ([#3678](https://github.com/ReVanced/revanced-patches/issues/3678)) ([f9e19ce](https://github.com/ReVanced/revanced-patches/commit/f9e19ce6e9185fdf31b2b0d5f2934f6e8a544b8e))
|
||||
* **YouTube - Disable precise seeking gesture:** Hide "pull up" label that shows up when swiping ([#3668](https://github.com/ReVanced/revanced-patches/issues/3668)) ([3fa8af9](https://github.com/ReVanced/revanced-patches/commit/3fa8af9fe534b59ad093c36f1927f56f549a330d))
|
||||
* **YouTube - Hide Shorts components:** Add `Hide save music`, `Hide stickers` ([#3710](https://github.com/ReVanced/revanced-patches/issues/3710)) ([8c99321](https://github.com/ReVanced/revanced-patches/commit/8c99321df4db696156330fc90dd547c1345d880e))
|
||||
* **YouTube - Hide Shorts components:** Add patch option to hide Shorts app shortcut (long press app icon) ([#3699](https://github.com/ReVanced/revanced-patches/issues/3699)) ([0d4e1f5](https://github.com/ReVanced/revanced-patches/commit/0d4e1f5d03cf3dcc06fd41165e26a1ce901b976b))
|
||||
* **YouTube - Hide Shorts components:** Add patch option to hide Shorts from app launcher widget Beta ([#3707](https://github.com/ReVanced/revanced-patches/issues/3707)) ([838f183](https://github.com/ReVanced/revanced-patches/commit/838f1834a5df547ce2c3217b874c0594b6878a67))
|
||||
|
||||
# [4.16.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v4.16.0-dev.6...v4.16.0-dev.7) (2024-09-29)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - SponsorBlock:** Fade out SB buttons without overlapping other buttons ([#3719](https://github.com/ReVanced/revanced-patches/issues/3719)) ([bf96108](https://github.com/ReVanced/revanced-patches/commit/bf9610894f0a9f9e751e2eed5b825c5d327a722c))
|
||||
|
||||
# [4.16.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.16.0-dev.5...v4.16.0-dev.6) (2024-09-29)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide Shorts components:** Add `Hide save music`, `Hide stickers` ([#3710](https://github.com/ReVanced/revanced-patches/issues/3710)) ([8c99321](https://github.com/ReVanced/revanced-patches/commit/8c99321df4db696156330fc90dd547c1345d880e))
|
||||
|
||||
# [4.16.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.16.0-dev.4...v4.16.0-dev.5) (2024-09-29)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Disable precise seeking gesture:** Hide "pull up" label that shows up when swiping ([#3668](https://github.com/ReVanced/revanced-patches/issues/3668)) ([3fa8af9](https://github.com/ReVanced/revanced-patches/commit/3fa8af9fe534b59ad093c36f1927f56f549a330d))
|
||||
|
||||
# [4.16.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.16.0-dev.3...v4.16.0-dev.4) (2024-09-29)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Soundcloud:** Support latest versions ([#3702](https://github.com/ReVanced/revanced-patches/issues/3702)) ([099ac5e](https://github.com/ReVanced/revanced-patches/commit/099ac5ea2cf55633a7c6a7e6f8e963599bcd5784))
|
||||
|
||||
# [4.16.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.16.0-dev.2...v4.16.0-dev.3) (2024-09-29)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **Google Photos:** Restore hidden 'Back up while charging' toggle ([#3678](https://github.com/ReVanced/revanced-patches/issues/3678)) ([f9e19ce](https://github.com/ReVanced/revanced-patches/commit/f9e19ce6e9185fdf31b2b0d5f2934f6e8a544b8e))
|
||||
|
||||
# [4.16.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.16.0-dev.1...v4.16.0-dev.2) (2024-09-28)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide Shorts components:** Add patch option to hide Shorts from app launcher widget Beta ([#3707](https://github.com/ReVanced/revanced-patches/issues/3707)) ([838f183](https://github.com/ReVanced/revanced-patches/commit/838f1834a5df547ce2c3217b874c0594b6878a67))
|
||||
|
||||
# [4.16.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.15.1-dev.2...v4.16.0-dev.1) (2024-09-27)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **YouTube - Hide Shorts components:** Add patch option to hide Shorts app shortcut (long press app icon) ([#3699](https://github.com/ReVanced/revanced-patches/issues/3699)) ([0d4e1f5](https://github.com/ReVanced/revanced-patches/commit/0d4e1f5d03cf3dcc06fd41165e26a1ce901b976b))
|
||||
|
||||
## [4.15.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.15.1-dev.1...v4.15.1-dev.2) (2024-09-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube:** Show video chapter titles without clipping when overlay buttons are enabled ([#3674](https://github.com/ReVanced/revanced-patches/issues/3674)) ([4b88c31](https://github.com/ReVanced/revanced-patches/commit/4b88c316ed90c56e83e2aee266561833b36fc37d))
|
||||
|
||||
## [4.15.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.15.0...v4.15.1-dev.1) (2024-09-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Twitter - Open links with app chooser:** Fix incorrect version in compatibility list ([#3683](https://github.com/ReVanced/revanced-patches/issues/3683)) ([adafe85](https://github.com/ReVanced/revanced-patches/commit/adafe85d77f6a0031a5523b9b7da69475959d78d))
|
||||
|
||||
# [4.15.0](https://github.com/ReVanced/revanced-patches/compare/v4.14.1...v4.15.0) (2024-09-23)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **TikTok - Playback speed:** Prevent crash by fixing invalid patch ([82d53cb](https://github.com/ReVanced/revanced-patches/commit/82d53cbc3bbfa585ba4337fdfaec9f0f19c802e6))
|
||||
* **TikTok - Settings:** Prevent crash by fixing invalid patch ([8074032](https://github.com/ReVanced/revanced-patches/commit/8074032fad3eff1c03296a882d2e2820da99b592))
|
||||
* **Twitter - Open links with app chooser:** Constrain patch to last working version `10.48.0-release` ([b9955d5](https://github.com/ReVanced/revanced-patches/commit/b9955d5ff6e456593b01f0f25d80ff660d02082a))
|
||||
* **YouTube - Spoof video streams:** Change default client type to Android VR ([74c8637](https://github.com/ReVanced/revanced-patches/commit/74c8637943347078955f51325bc6af92a35d4463))
|
||||
* **YouTube - Spoof video streams:** Change default client type to Android VR ([#3672](https://github.com/ReVanced/revanced-patches/issues/3672)) ([a3306f6](https://github.com/ReVanced/revanced-patches/commit/a3306f6717a09b734354f00363a96abad0ae14e7))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **TikTok:** Bump patches to support the latest version 36.5.4 ([e5dcb72](https://github.com/ReVanced/revanced-patches/commit/e5dcb72597092fb32003f11fdf6f861ede4e7ff3))
|
||||
|
||||
# [4.15.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.14.2-dev.2...v4.15.0-dev.1) (2024-09-22)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **TikTok:** Bump patches to support the latest version 36.5.4 ([e5dcb72](https://github.com/ReVanced/revanced-patches/commit/e5dcb72597092fb32003f11fdf6f861ede4e7ff3))
|
||||
|
||||
## [4.14.2-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.14.2-dev.1...v4.14.2-dev.2) (2024-09-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Spoof video streams:** Change default client type to Android VR ([74c8637](https://github.com/ReVanced/revanced-patches/commit/74c8637943347078955f51325bc6af92a35d4463))
|
||||
* **YouTube - Spoof video streams:** Change default client type to Android VR ([#3672](https://github.com/ReVanced/revanced-patches/issues/3672)) ([a3306f6](https://github.com/ReVanced/revanced-patches/commit/a3306f6717a09b734354f00363a96abad0ae14e7))
|
||||
|
||||
## [4.14.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.14.1...v4.14.2-dev.1) (2024-09-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **TikTok - Playback speed:** Prevent crash by fixing invalid patch ([82d53cb](https://github.com/ReVanced/revanced-patches/commit/82d53cbc3bbfa585ba4337fdfaec9f0f19c802e6))
|
||||
* **TikTok - Settings:** Prevent crash by fixing invalid patch ([8074032](https://github.com/ReVanced/revanced-patches/commit/8074032fad3eff1c03296a882d2e2820da99b592))
|
||||
* **Twitter - Open links with app chooser:** Constrain patch to last working version `10.48.0-release` ([b9955d5](https://github.com/ReVanced/revanced-patches/commit/b9955d5ff6e456593b01f0f25d80ff660d02082a))
|
||||
|
||||
## [4.14.1](https://github.com/ReVanced/revanced-patches/compare/v4.14.0...v4.14.1) (2024-09-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Check environment:** Only use fields available since Android 8 ([#3655](https://github.com/ReVanced/revanced-patches/issues/3655)) ([4413533](https://github.com/ReVanced/revanced-patches/commit/441353306572340131030e1c4fee1ab6acb63cd9))
|
||||
|
||||
## [4.14.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.14.0...v4.14.1-dev.1) (2024-09-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **YouTube - Check environment:** Only use fields available since Android 8 ([#3655](https://github.com/ReVanced/revanced-patches/issues/3655)) ([4413533](https://github.com/ReVanced/revanced-patches/commit/441353306572340131030e1c4fee1ab6acb63cd9))
|
||||
|
||||
# [4.14.0](https://github.com/ReVanced/revanced-patches/compare/v4.13.3...v4.14.0) (2024-09-18)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **Pixiv - Hide ads:** Fix for latest version ([#3616](https://github.com/ReVanced/revanced-patches/issues/3616)) ([98956e8](https://github.com/ReVanced/revanced-patches/commit/98956e8f1a41347bb435720bbf984969469a7110))
|
||||
* **Soundcloud - Hide ads:** Support latest version ([#3628](https://github.com/ReVanced/revanced-patches/issues/3628)) ([66e7e33](https://github.com/ReVanced/revanced-patches/commit/66e7e33efce9b702fdfcc2b9803e9da8491c1f08))
|
||||
* **SwissID:** Rename `Remove Google Play Integrity Integrity check` to `Remove Google Play Integrity check` ([#3558](https://github.com/ReVanced/revanced-patches/issues/3558)) ([0f5a771](https://github.com/ReVanced/revanced-patches/commit/0f5a771a5cff5684b4a8fd317f4938fe2cf3cbbe))
|
||||
* **YouTube - ReturnYouTubeDislike:** Show estimated like count for videos with hidden likes ([#3601](https://github.com/ReVanced/revanced-patches/issues/3601)) ([005be82](https://github.com/ReVanced/revanced-patches/commit/005be82d71b2a42387b1b57035930b20f4663794))
|
||||
* **YouTube - SponsorBlock:** Add summary text to 'view my segments' button ([df80b9f](https://github.com/ReVanced/revanced-patches/commit/df80b9f92f0d981b9a40b7756d74f8ccc3dcb1e9))
|
||||
* **YouTube - SponsorBlock:** Handle if the user enters an invalid number into any SB settings ([37b3dd1](https://github.com/ReVanced/revanced-patches/commit/37b3dd1e789f8bb16fa1b9dd582e39c89dbe730c))
|
||||
* **YouTube:** Fix issues related to playback by replace streaming data ([#3582](https://github.com/ReVanced/revanced-patches/issues/3582)) ([dfa94d7](https://github.com/ReVanced/revanced-patches/commit/dfa94d70f65150d6ef24ea6378b8e6a317055186))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Add `Change data directory location` patch ([#3602](https://github.com/ReVanced/revanced-patches/issues/3602)) ([5998029](https://github.com/ReVanced/revanced-patches/commit/59980292809cc0626bf49a160eeb05a1523c4eda))
|
||||
* Add `Check environment` patch ([#3610](https://github.com/ReVanced/revanced-patches/issues/3610)) ([fbcbdaf](https://github.com/ReVanced/revanced-patches/commit/fbcbdafa4938a35b5fdec46aae7b250a84b9c139))
|
||||
* **Duolingo:** Add `Disable ads` and `Enable debug menu` patch ([#3422](https://github.com/ReVanced/revanced-patches/issues/3422)) ([d0a8599](https://github.com/ReVanced/revanced-patches/commit/d0a8599f76ce653e5d7c98069ad3c58b9ab9c5eb))
|
||||
* **Sync for Reddit:** Add `Fix /user/ endpoint` patch ([46d11f3](https://github.com/ReVanced/revanced-patches/commit/46d11f3530fcdae9ed08b7e93aac235638a92dff))
|
||||
* **Sync for Reddit:** Rename patch to `Use /user/ endpoint` ([98ead49](https://github.com/ReVanced/revanced-patches/commit/98ead493380932cb105530f4ba992673fd364d82))
|
||||
* **YouTube - Hide Shorts components:** Hide 'Use this sound' button ([#3647](https://github.com/ReVanced/revanced-patches/issues/3647)) ([33fc090](https://github.com/ReVanced/revanced-patches/commit/33fc09061431d4aa457d743c09a0de31ec566df1))
|
||||
* **YouTube - Keyword filter:** Add syntax to match whole keywords and not substrings ([#3592](https://github.com/ReVanced/revanced-patches/issues/3592)) ([f5fb351](https://github.com/ReVanced/revanced-patches/commit/f5fb3512cfafe214ba6a6d25ba0825ae1884a0ff))
|
||||
* **YouTube - Spoof client:** Allow forcing AVC codec with iOS ([#3570](https://github.com/ReVanced/revanced-patches/issues/3570)) ([1a49d1f](https://github.com/ReVanced/revanced-patches/commit/1a49d1f3c2a343d05d0abc07c143add486246fd0))
|
||||
* **YouTube Music:** Make working patches compatible with latest versions ([#3556](https://github.com/ReVanced/revanced-patches/issues/3556)) ([12f6f19](https://github.com/ReVanced/revanced-patches/commit/12f6f1966ad04631451940f7b64d785c3ef481a0))
|
||||
* **YouTube:** Add donation link to settings about screen ([#3626](https://github.com/ReVanced/revanced-patches/issues/3626)) ([0684ab5](https://github.com/ReVanced/revanced-patches/commit/0684ab5f183631de5720352049cfd293daa58eb0))
|
||||
|
||||
# [4.14.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v4.14.0-dev.14...v4.14.0-dev.15) (2024-09-17)
|
||||
|
||||
|
||||
|
||||
@@ -263,6 +263,12 @@ public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatch : ap
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/facebook/ads/story/HideStoryAdsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/facebook/ads/story/HideStoryAdsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -321,6 +327,12 @@ public final class app/revanced/patches/googlephotos/misc/integrations/Integrati
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/misc/integrations/IntegrationsPatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlephotos/preferences/RestoreHiddenBackUpWhileChargingTogglePatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlephotos/preferences/RestoreHiddenBackUpWhileChargingTogglePatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -834,6 +846,12 @@ public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/u
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/reddit/customclients/syncforreddit/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/misc/integrations/IntegrationsPatch;
|
||||
}
|
||||
@@ -1484,6 +1502,12 @@ public final class app/revanced/patches/twitter/misc/hook/patch/recommendation/H
|
||||
public static final field INSTANCE Lapp/revanced/patches/twitter/misc/hook/patch/recommendation/HideRecommendedUsersPatch;
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -1514,6 +1538,12 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/willhaben/ads/HideAdsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/willhaben/ads/HideAdsPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
@@ -2000,13 +2030,19 @@ public final class app/revanced/patches/youtube/misc/playercontrols/BottomContro
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsBytecodePatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/playercontrols/PlayerControlsBytecodePatch;
|
||||
public static field showPlayerControlsFingerprintResult Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
|
||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
public final fun getShowPlayerControlsFingerprintResult ()Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;
|
||||
public final fun initializeBottomControl (Ljava/lang/String;)V
|
||||
public final fun initializeControl (Ljava/lang/String;)V
|
||||
public final fun injectVisibilityCheckCall (Ljava/lang/String;)V
|
||||
public final fun setShowPlayerControlsFingerprintResult (Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsResourcePatch : app/revanced/patcher/patch/ResourcePatch, java/io/Closeable {
|
||||
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/playercontrols/PlayerControlsResourcePatch;
|
||||
public final fun addBottomControls (Ljava/lang/String;)V
|
||||
public fun close ()V
|
||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||
public fun execute (Lapp/revanced/patcher/data/ResourceContext;)V
|
||||
}
|
||||
|
||||
public final class app/revanced/patches/youtube/misc/playeroverlay/PlayerOverlaysHookPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||
@@ -2166,6 +2202,7 @@ public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static final fun containsWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)Z
|
||||
public static final fun findMutableMethodOf (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lcom/android/tools/smali/dexlib2/iface/Method;)Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;
|
||||
public static final fun findOpcodeIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lcom/android/tools/smali/dexlib2/Opcode;)Ljava/util/List;
|
||||
public static final fun findOpcodeIndicesReversed (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)Ljava/util/List;
|
||||
public static final fun getException (Lapp/revanced/patcher/fingerprint/MethodFingerprint;)Lapp/revanced/patcher/patch/PatchException;
|
||||
public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;)I
|
||||
public static final fun indexOfFirstInstruction (Lcom/android/tools/smali/dexlib2/iface/Method;Lkotlin/jvm/functions/Function1;)I
|
||||
@@ -2174,6 +2211,8 @@ public final class app/revanced/util/BytecodeUtilsKt {
|
||||
public static synthetic fun indexOfFirstInstructionOrThrow$default (Lcom/android/tools/smali/dexlib2/iface/Method;ILkotlin/jvm/functions/Function1;ILjava/lang/Object;)I
|
||||
public static final fun indexOfFirstWideLiteralInstructionValue (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
|
||||
public static final fun indexOfFirstWideLiteralInstructionValueOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
|
||||
public static final fun indexOfFirstWideLiteralInstructionValueReversed (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
|
||||
public static final fun indexOfFirstWideLiteralInstructionValueReversedOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;J)I
|
||||
public static final fun indexOfIdResource (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
||||
public static final fun indexOfIdResourceOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I
|
||||
public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V
|
||||
@@ -2201,6 +2240,7 @@ public final class app/revanced/util/ResourceUtilsKt {
|
||||
public static final fun copyXmlNode (Ljava/lang/String;Lapp/revanced/patcher/util/DomFileEditor;Lapp/revanced/patcher/util/DomFileEditor;)Ljava/lang/AutoCloseable;
|
||||
public static final fun doRecursively (Lorg/w3c/dom/Node;Lkotlin/jvm/functions/Function1;)V
|
||||
public static final fun forEachChildElement (Lorg/w3c/dom/Node;Lkotlin/jvm/functions/Function1;)V
|
||||
public static final fun insertFirst (Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V
|
||||
public static final fun iterateXmlNodeChildren (Lapp/revanced/patcher/data/ResourceContext;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
org.gradle.parallel = true
|
||||
org.gradle.caching = true
|
||||
kotlin.code.style = official
|
||||
version = 4.14.0-dev.15
|
||||
version = 4.17.0-dev.10
|
||||
|
||||
321
package-lock.json
generated
321
package-lock.json
generated
@@ -8,8 +8,8 @@
|
||||
"@saithodev/semantic-release-backmerge": "^4.0.1",
|
||||
"@semantic-release/changelog": "^6.0.3",
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"gradle-semantic-release-plugin": "^1.9.2",
|
||||
"semantic-release": "^24.0.0"
|
||||
"gradle-semantic-release-plugin": "^1.10.1",
|
||||
"semantic-release": "^24.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/code-frame": {
|
||||
@@ -235,13 +235,13 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@octokit/plugin-paginate-rest": {
|
||||
"version": "11.3.3",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.3.tgz",
|
||||
"integrity": "sha512-o4WRoOJZlKqEEgj+i9CpcmnByvtzoUYC6I8PD2SA95M+BJ2x8h7oLcVOg9qcowWXBOdcTRsMZiwvM3EyLm9AfA==",
|
||||
"version": "11.3.5",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz",
|
||||
"integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@octokit/types": "^13.5.0"
|
||||
"@octokit/types": "^13.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
@@ -251,9 +251,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/plugin-retry": {
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.1.tgz",
|
||||
"integrity": "sha512-G9Ue+x2odcb8E1XIPhaFBnTTIrrUDfXN05iFXiqhR+SeeeDMMILcAnysOsxUpEWcQp2e5Ft397FCXTcPkiPkLw==",
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.2.tgz",
|
||||
"integrity": "sha512-XOWnPpH2kJ5VTwozsxGurw+svB2e61aWlmk5EVIYZPwFK5F9h4cyPyj9CIKRyMXMHSwpIsI3mPOdpMmrRhe7UQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -302,9 +302,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/request-error": {
|
||||
"version": "6.1.4",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.4.tgz",
|
||||
"integrity": "sha512-VpAhIUxwhWZQImo/dWAN/NpPqqojR6PSLgLYAituLM6U+ddx9hCioFGwBr5Mi+oi5CLeJkcAs3gJ0PYYzU6wUg==",
|
||||
"version": "6.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz",
|
||||
"integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -315,9 +315,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@octokit/types": {
|
||||
"version": "13.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz",
|
||||
"integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==",
|
||||
"version": "13.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.0.tgz",
|
||||
"integrity": "sha512-CrooV/vKCXqwLa+osmHLIMUb87brpgUqlqkPGc6iE2wCkUvTrHiXFMhAKoDDaAAYJrtKtrFTgSQTg5nObBEaew==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -355,9 +355,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/@pnpm/npm-conf": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz",
|
||||
"integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==",
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz",
|
||||
"integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -977,6 +977,19 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@saithodev/semantic-release-backmerge/node_modules/hosted-git-info": {
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
|
||||
"integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"lru-cache": "^10.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.14.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@saithodev/semantic-release-backmerge/node_modules/human-signals": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
|
||||
@@ -1372,9 +1385,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/github": {
|
||||
"version": "10.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.1.1.tgz",
|
||||
"integrity": "sha512-sSmsBKGpAlTtXf9rUJf/si16p+FwPEsvsJRjl3KCwFP0WywaSpynvUhlYvE18n5rzkQNbGJnObAKIoo3xFMSjA==",
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.0.tgz",
|
||||
"integrity": "sha512-Uon6G6gJD8U1JNvPm7X0j46yxNRJ8Ui6SgK4Zw5Ktu8RgjEft3BGn+l/RX1TTzhhO3/uUcKuqM+/9/ETFxWS/Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1399,7 +1412,7 @@
|
||||
"node": ">=20.8.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"semantic-release": ">=20.1.0"
|
||||
"semantic-release": ">=24.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/github/node_modules/@semantic-release/error": {
|
||||
@@ -1569,9 +1582,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/npm/node_modules/execa": {
|
||||
"version": "9.3.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-9.3.0.tgz",
|
||||
"integrity": "sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==",
|
||||
"version": "9.4.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz",
|
||||
"integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -1579,10 +1592,10 @@
|
||||
"cross-spawn": "^7.0.3",
|
||||
"figures": "^6.1.0",
|
||||
"get-stream": "^9.0.0",
|
||||
"human-signals": "^7.0.0",
|
||||
"human-signals": "^8.0.0",
|
||||
"is-plain-obj": "^4.1.0",
|
||||
"is-stream": "^4.0.1",
|
||||
"npm-run-path": "^5.2.0",
|
||||
"npm-run-path": "^6.0.0",
|
||||
"pretty-ms": "^9.0.0",
|
||||
"signal-exit": "^4.1.0",
|
||||
"strip-final-newline": "^4.0.0",
|
||||
@@ -1613,9 +1626,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/npm/node_modules/human-signals": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz",
|
||||
"integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==",
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz",
|
||||
"integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
@@ -1649,16 +1662,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/npm/node_modules/npm-run-path": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
|
||||
"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
|
||||
"integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^4.0.0"
|
||||
"path-key": "^4.0.0",
|
||||
"unicorn-magic": "^0.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
@@ -1703,6 +1717,19 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/npm/node_modules/unicorn-magic": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
|
||||
"integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@semantic-release/release-notes-generator": {
|
||||
"version": "14.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.0.1.tgz",
|
||||
@@ -2273,13 +2300,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.3.5",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
|
||||
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
|
||||
"version": "4.3.7",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
|
||||
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "2.1.2"
|
||||
"ms": "^2.1.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
@@ -2358,9 +2385,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/env-ci": {
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.0.0.tgz",
|
||||
"integrity": "sha512-apikxMgkipkgTvMdRT9MNqWx5VLOci79F4VBd7Op/7OPjjoanjdAvn6fglMCCEf/1bAh8eOiuEVCUs4V3qP3nQ==",
|
||||
"version": "11.1.0",
|
||||
"resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.1.0.tgz",
|
||||
"integrity": "sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -2549,9 +2576,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/escalade": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
|
||||
"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
||||
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -2847,9 +2874,9 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/gradle-semantic-release-plugin": {
|
||||
"version": "1.9.2",
|
||||
"resolved": "https://registry.npmjs.org/gradle-semantic-release-plugin/-/gradle-semantic-release-plugin-1.9.2.tgz",
|
||||
"integrity": "sha512-8qpf4GYFPQ+UMUymYBy/VchOOwLILAWzZMrZX1R0RR3JMgJBMN2R0tJn92R/3rXmxx4OAqwUFH6Np51eFoxr3w==",
|
||||
"version": "1.10.1",
|
||||
"resolved": "https://registry.npmjs.org/gradle-semantic-release-plugin/-/gradle-semantic-release-plugin-1.10.1.tgz",
|
||||
"integrity": "sha512-Q4dLAFICjPouUyRRHEKK8cXNB75nraXoioYZDZlVQOg4sYKudnTDZ3ohLmV3k4cPGiiMCh1ckXETkx9JnuyKmA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -2925,16 +2952,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/hosted-git-info": {
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
|
||||
"integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.0.tgz",
|
||||
"integrity": "sha512-4nw3vOVR+vHUOT8+U4giwe2tcGv+R3pwwRidUe67DoMBTjhrfr6rZYJVVwdkBE+Um050SG+X9tf0Jo4fOpn01w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"lru-cache": "^10.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.14.0 || >=18.0.0"
|
||||
"node": "^18.17.0 || >=20.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/http-proxy-agent": {
|
||||
@@ -2976,9 +3003,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ignore": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
|
||||
"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
|
||||
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -3191,9 +3218,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/is-unicode-supported": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz",
|
||||
"integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==",
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
|
||||
"integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
@@ -3497,9 +3524,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.7",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
|
||||
"integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -3547,9 +3574,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ms": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -3610,6 +3637,19 @@
|
||||
"node": "^16.14.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/normalize-package-data/node_modules/hosted-git-info": {
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
|
||||
"integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"lru-cache": "^10.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.14.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/normalize-url": {
|
||||
"version": "8.0.1",
|
||||
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz",
|
||||
@@ -3624,9 +3664,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm": {
|
||||
"version": "10.8.2",
|
||||
"resolved": "https://registry.npmjs.org/npm/-/npm-10.8.2.tgz",
|
||||
"integrity": "sha512-x/AIjFIKRllrhcb48dqUNAAZl0ig9+qMuN91RpZo3Cb2+zuibfh+KISl6+kVVyktDz230JKc208UkQwwMqyB+w==",
|
||||
"version": "10.8.3",
|
||||
"resolved": "https://registry.npmjs.org/npm/-/npm-10.8.3.tgz",
|
||||
"integrity": "sha512-0IQlyAYvVtQ7uOhDFYZCGK8kkut2nh8cpAdA9E6FvRSJaTgtZRZgNjlC5ZCct//L73ygrpY93CxXpRJDtNqPVg==",
|
||||
"bundleDependencies": [
|
||||
"@isaacs/string-locale-compare",
|
||||
"@npmcli/arborist",
|
||||
@@ -3719,13 +3759,13 @@
|
||||
"@sigstore/tuf": "^2.3.4",
|
||||
"abbrev": "^2.0.0",
|
||||
"archy": "~1.0.0",
|
||||
"cacache": "^18.0.3",
|
||||
"cacache": "^18.0.4",
|
||||
"chalk": "^5.3.0",
|
||||
"ci-info": "^4.0.0",
|
||||
"cli-columns": "^4.0.0",
|
||||
"fastest-levenshtein": "^1.0.16",
|
||||
"fs-minipass": "^3.0.3",
|
||||
"glob": "^10.4.2",
|
||||
"glob": "^10.4.5",
|
||||
"graceful-fs": "^4.2.11",
|
||||
"hosted-git-info": "^7.0.2",
|
||||
"ini": "^4.1.3",
|
||||
@@ -3734,7 +3774,7 @@
|
||||
"json-parse-even-better-errors": "^3.0.2",
|
||||
"libnpmaccess": "^8.0.6",
|
||||
"libnpmdiff": "^6.1.4",
|
||||
"libnpmexec": "^8.1.3",
|
||||
"libnpmexec": "^8.1.4",
|
||||
"libnpmfund": "^5.0.12",
|
||||
"libnpmhook": "^10.0.5",
|
||||
"libnpmorg": "^6.0.6",
|
||||
@@ -3748,12 +3788,12 @@
|
||||
"minipass": "^7.1.1",
|
||||
"minipass-pipeline": "^1.2.4",
|
||||
"ms": "^2.1.2",
|
||||
"node-gyp": "^10.1.0",
|
||||
"node-gyp": "^10.2.0",
|
||||
"nopt": "^7.2.1",
|
||||
"normalize-package-data": "^6.0.2",
|
||||
"npm-audit-report": "^5.0.0",
|
||||
"npm-install-checks": "^6.3.0",
|
||||
"npm-package-arg": "^11.0.2",
|
||||
"npm-package-arg": "^11.0.3",
|
||||
"npm-pick-manifest": "^9.1.0",
|
||||
"npm-profile": "^10.0.0",
|
||||
"npm-registry-fetch": "^17.1.0",
|
||||
@@ -3764,7 +3804,7 @@
|
||||
"proc-log": "^4.2.0",
|
||||
"qrcode-terminal": "^0.12.0",
|
||||
"read": "^3.0.1",
|
||||
"semver": "^7.6.2",
|
||||
"semver": "^7.6.3",
|
||||
"spdx-expression-parse": "^4.0.0",
|
||||
"ssri": "^10.0.6",
|
||||
"supports-color": "^9.4.0",
|
||||
@@ -4335,7 +4375,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/cacache": {
|
||||
"version": "18.0.3",
|
||||
"version": "18.0.4",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
@@ -4502,7 +4542,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/debug": {
|
||||
"version": "4.3.5",
|
||||
"version": "4.3.6",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "MIT",
|
||||
@@ -4586,7 +4626,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/foreground-child": {
|
||||
"version": "3.2.1",
|
||||
"version": "3.3.0",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
@@ -4614,7 +4654,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/glob": {
|
||||
"version": "10.4.2",
|
||||
"version": "10.4.5",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
@@ -4629,9 +4669,6 @@
|
||||
"bin": {
|
||||
"glob": "dist/esm/bin.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
@@ -4815,16 +4852,13 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/npm/node_modules/jackspeak": {
|
||||
"version": "3.4.0",
|
||||
"version": "3.4.3",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"@isaacs/cliui": "^8.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
},
|
||||
@@ -4910,7 +4944,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/libnpmexec": {
|
||||
"version": "8.1.3",
|
||||
"version": "8.1.4",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
@@ -5044,13 +5078,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/lru-cache": {
|
||||
"version": "10.2.2",
|
||||
"version": "10.4.3",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": "14 || >=16.14"
|
||||
}
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/npm/node_modules/make-fetch-happen": {
|
||||
"version": "13.0.1",
|
||||
@@ -5262,7 +5293,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/node-gyp": {
|
||||
"version": "10.1.0",
|
||||
"version": "10.2.0",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "MIT",
|
||||
@@ -5273,9 +5304,9 @@
|
||||
"graceful-fs": "^4.2.6",
|
||||
"make-fetch-happen": "^13.0.0",
|
||||
"nopt": "^7.0.0",
|
||||
"proc-log": "^3.0.0",
|
||||
"proc-log": "^4.1.0",
|
||||
"semver": "^7.3.5",
|
||||
"tar": "^6.1.2",
|
||||
"tar": "^6.2.1",
|
||||
"which": "^4.0.0"
|
||||
},
|
||||
"bin": {
|
||||
@@ -5285,15 +5316,6 @@
|
||||
"node": "^16.14.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/node-gyp/node_modules/proc-log": {
|
||||
"version": "3.0.0",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/nopt": {
|
||||
"version": "7.2.1",
|
||||
"dev": true,
|
||||
@@ -5366,7 +5388,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/npm-package-arg": {
|
||||
"version": "11.0.2",
|
||||
"version": "11.0.3",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
@@ -5540,7 +5562,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/npm/node_modules/postcss-selector-parser": {
|
||||
"version": "6.1.0",
|
||||
"version": "6.1.2",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "MIT",
|
||||
@@ -5678,7 +5700,7 @@
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/npm/node_modules/semver": {
|
||||
"version": "7.6.2",
|
||||
"version": "7.6.3",
|
||||
"dev": true,
|
||||
"inBundle": true,
|
||||
"license": "ISC",
|
||||
@@ -6437,9 +6459,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
|
||||
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
|
||||
"integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
@@ -6481,9 +6503,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/pretty-ms": {
|
||||
"version": "9.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.0.0.tgz",
|
||||
"integrity": "sha512-E9e9HJ9R9NasGOgPaPE8VMeiPKAyWR5jcFpNnwIejslIhWqdqOrb2wShBsncMPUb+BcCd2OPYfh7p2W6oemTng==",
|
||||
"version": "9.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz",
|
||||
"integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -6738,15 +6760,15 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/semantic-release": {
|
||||
"version": "24.0.0",
|
||||
"resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.0.0.tgz",
|
||||
"integrity": "sha512-v46CRPw+9eI3ZuYGF2oAjqPqsfbnfFTwLBgQsv/lch4goD09ytwOTESMN4QIrx/wPLxUGey60/NMx+ANQtWRsA==",
|
||||
"version": "24.1.2",
|
||||
"resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz",
|
||||
"integrity": "sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@semantic-release/commit-analyzer": "^13.0.0-beta.1",
|
||||
"@semantic-release/error": "^4.0.0",
|
||||
"@semantic-release/github": "^10.0.0",
|
||||
"@semantic-release/github": "^11.0.0",
|
||||
"@semantic-release/npm": "^12.0.0",
|
||||
"@semantic-release/release-notes-generator": "^14.0.0-beta.1",
|
||||
"aggregate-error": "^5.0.0",
|
||||
@@ -6759,7 +6781,7 @@
|
||||
"get-stream": "^6.0.0",
|
||||
"git-log-parser": "^1.2.0",
|
||||
"hook-std": "^3.0.0",
|
||||
"hosted-git-info": "^7.0.0",
|
||||
"hosted-git-info": "^8.0.0",
|
||||
"import-from-esm": "^1.3.1",
|
||||
"lodash-es": "^4.17.21",
|
||||
"marked": "^12.0.0",
|
||||
@@ -6851,9 +6873,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/semantic-release/node_modules/execa": {
|
||||
"version": "9.3.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-9.3.0.tgz",
|
||||
"integrity": "sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==",
|
||||
"version": "9.4.0",
|
||||
"resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz",
|
||||
"integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -6861,10 +6883,10 @@
|
||||
"cross-spawn": "^7.0.3",
|
||||
"figures": "^6.1.0",
|
||||
"get-stream": "^9.0.0",
|
||||
"human-signals": "^7.0.0",
|
||||
"human-signals": "^8.0.0",
|
||||
"is-plain-obj": "^4.1.0",
|
||||
"is-stream": "^4.0.1",
|
||||
"npm-run-path": "^5.2.0",
|
||||
"npm-run-path": "^6.0.0",
|
||||
"pretty-ms": "^9.0.0",
|
||||
"signal-exit": "^4.1.0",
|
||||
"strip-final-newline": "^4.0.0",
|
||||
@@ -6895,9 +6917,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/semantic-release/node_modules/human-signals": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-7.0.0.tgz",
|
||||
"integrity": "sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==",
|
||||
"version": "8.0.0",
|
||||
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz",
|
||||
"integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
@@ -6931,16 +6953,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/semantic-release/node_modules/npm-run-path": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
|
||||
"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
|
||||
"integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"path-key": "^4.0.0"
|
||||
"path-key": "^4.0.0",
|
||||
"unicorn-magic": "^0.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
@@ -6998,6 +7021,19 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/semantic-release/node_modules/unicorn-magic": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
|
||||
"integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.6.3",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
|
||||
@@ -7239,9 +7275,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/spdx-license-ids": {
|
||||
"version": "3.0.18",
|
||||
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
|
||||
"integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
|
||||
"version": "3.0.20",
|
||||
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
|
||||
"integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
|
||||
"dev": true,
|
||||
"license": "CC0-1.0"
|
||||
},
|
||||
@@ -7365,9 +7401,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/supports-hyperlinks": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
|
||||
"integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz",
|
||||
"integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -7376,6 +7412,9 @@
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.18"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/temp-dir": {
|
||||
@@ -7530,9 +7569,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/type-fest": {
|
||||
"version": "4.22.1",
|
||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.22.1.tgz",
|
||||
"integrity": "sha512-9tHNEa0Ov81YOopiVkcCJVz5TM6AEQ+CHHjFIktqPnE3NV0AHIkx+gh9tiCl58m/66wWxkOC9eltpa75J4lQPA==",
|
||||
"version": "4.26.1",
|
||||
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz",
|
||||
"integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==",
|
||||
"dev": true,
|
||||
"license": "(MIT OR CC0-1.0)",
|
||||
"engines": {
|
||||
@@ -7543,9 +7582,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/uglify-js": {
|
||||
"version": "3.19.0",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.0.tgz",
|
||||
"integrity": "sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==",
|
||||
"version": "3.19.3",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
|
||||
"integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"optional": true,
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"@saithodev/semantic-release-backmerge": "^4.0.1",
|
||||
"@semantic-release/changelog": "^6.0.3",
|
||||
"@semantic-release/git": "^10.0.1",
|
||||
"gradle-semantic-release-plugin": "^1.9.2",
|
||||
"semantic-release": "^24.0.0"
|
||||
"gradle-semantic-release-plugin": "^1.10.1",
|
||||
"semantic-release": "^24.1.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Pro unlock",
|
||||
compatiblePackages = [CompatiblePackage("com.backdrops.wallpapers", ["4.52"])]
|
||||
compatiblePackages = [CompatiblePackage("com.backdrops.wallpapers")]
|
||||
)
|
||||
@Suppress("unused")
|
||||
object ProUnlockPatch : BytecodePatch(
|
||||
@@ -34,4 +34,4 @@ object ProUnlockPatch : BytecodePatch(
|
||||
|
||||
} ?: throw ProUnlockFingerprint.exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
package app.revanced.patches.facebook.ads.mainfeed
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.facebook.ads.mainfeed.fingerprints.BaseModelMapperFingerprint
|
||||
import app.revanced.patches.facebook.ads.mainfeed.fingerprints.GetSponsoredDataModelTemplateFingerprint
|
||||
import app.revanced.patches.facebook.ads.mainfeed.fingerprints.GetStoryVisibilityFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction31i
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
||||
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||
|
||||
@Patch(
|
||||
name = "Hide 'Sponsored Stories'",
|
||||
compatiblePackages = [CompatiblePackage("com.facebook.katana")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object HideSponsoredStoriesPatch : BytecodePatch(
|
||||
setOf(GetStoryVisibilityFingerprint, GetSponsoredDataModelTemplateFingerprint, BaseModelMapperFingerprint),
|
||||
) {
|
||||
private const val GRAPHQL_STORY_TYPE = "Lcom/facebook/graphql/model/GraphQLStory;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
GetStoryVisibilityFingerprint.result?.apply {
|
||||
val sponsoredDataModelTemplateMethod = GetSponsoredDataModelTemplateFingerprint.resultOrThrow().method
|
||||
val baseModelMapperMethod = BaseModelMapperFingerprint.resultOrThrow().method
|
||||
val baseModelWithTreeType = baseModelMapperMethod.returnType
|
||||
|
||||
// The "SponsoredDataModelTemplate" methods has the ids in its body to extract sponsored data
|
||||
// from GraphQL models, but targets the wrong derived type of "BaseModelWithTree". Since those ids
|
||||
// could change in future version, we need to extract them and call the base implementation directly.
|
||||
val getSponsoredDataHelperMethod = ImmutableMethod(
|
||||
classDef.type,
|
||||
"getSponsoredData",
|
||||
listOf(ImmutableMethodParameter(GRAPHQL_STORY_TYPE, null, null)),
|
||||
baseModelWithTreeType,
|
||||
AccessFlags.PRIVATE or AccessFlags.STATIC,
|
||||
null,
|
||||
null,
|
||||
MutableMethodImplementation(4),
|
||||
).toMutable().apply {
|
||||
// Extract the ids of the original method. These ids seem to correspond to model types for
|
||||
// GraphQL data structure. They are then fed to a method of BaseModelWithTree that populate
|
||||
// and cast the requested GraphQL subtype. The Ids are found in the two first "CONST" instructions.
|
||||
val constInstructions = sponsoredDataModelTemplateMethod.implementation!!.instructions
|
||||
.asSequence()
|
||||
.filterIsInstance<Instruction31i>()
|
||||
.take(2)
|
||||
.toList()
|
||||
|
||||
val storyTypeId = constInstructions[0].narrowLiteral
|
||||
val sponsoredDataTypeId = constInstructions[1].narrowLiteral
|
||||
|
||||
addInstructions(
|
||||
"""
|
||||
const-class v2, $baseModelWithTreeType
|
||||
const v1, $storyTypeId
|
||||
const v0, $sponsoredDataTypeId
|
||||
invoke-virtual {p0, v2, v1, v0}, $baseModelMapperMethod
|
||||
move-result-object v0
|
||||
check-cast v0, $baseModelWithTreeType
|
||||
return-object v0
|
||||
""",
|
||||
)
|
||||
}
|
||||
|
||||
mutableClass.methods.add(getSponsoredDataHelperMethod)
|
||||
|
||||
// Check if the parameter type is GraphQLStory and if sponsoredDataModelGetter returns a non-null value.
|
||||
// If so, hide the story by setting the visibility to StoryVisibility.GONE.
|
||||
mutableMethod.addInstructionsWithLabels(
|
||||
scanResult.patternScanResult!!.startIndex,
|
||||
"""
|
||||
instance-of v0, p0, $GRAPHQL_STORY_TYPE
|
||||
if-eqz v0, :resume_normal
|
||||
invoke-static {p0}, $getSponsoredDataHelperMethod
|
||||
move-result-object v0
|
||||
if-eqz v0, :resume_normal
|
||||
const-string v0, "GONE"
|
||||
return-object v0
|
||||
:resume_normal
|
||||
nop
|
||||
""",
|
||||
)
|
||||
} ?: throw GetStoryVisibilityFingerprint.exception
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package app.revanced.patches.facebook.ads.mainfeed.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object BaseModelMapperFingerprint : MethodFingerprint(
|
||||
|
||||
accessFlags = (AccessFlags.PUBLIC or AccessFlags.FINAL),
|
||||
parameters = listOf("Ljava/lang/Class","I","I"),
|
||||
returnType = "Lcom/facebook/graphql/modelutil/BaseModelWithTree;",
|
||||
opcodes = listOf(
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CONST_4,
|
||||
Opcode.IF_EQ
|
||||
)
|
||||
|
||||
)
|
||||
@@ -0,0 +1,23 @@
|
||||
package app.revanced.patches.facebook.ads.mainfeed.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object GetSponsoredDataModelTemplateFingerprint : MethodFingerprint(
|
||||
|
||||
accessFlags = (AccessFlags.PUBLIC or AccessFlags.FINAL),
|
||||
parameters = listOf(),
|
||||
returnType = "L",
|
||||
opcodes = listOf(
|
||||
Opcode.CONST,
|
||||
Opcode.CONST,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.RETURN_OBJECT
|
||||
),
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
classDef.type == "Lcom/facebook/graphql/model/GraphQLFBMultiAdsFeedUnit;"
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,23 @@
|
||||
package app.revanced.patches.facebook.ads.mainfeed.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.Annotation
|
||||
import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue
|
||||
|
||||
internal object GetStoryVisibilityFingerprint : MethodFingerprint(
|
||||
returnType = "Ljava/lang/String;",
|
||||
accessFlags = (AccessFlags.PUBLIC or AccessFlags.STATIC),
|
||||
opcodes = listOf(
|
||||
Opcode.INSTANCE_OF,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.INSTANCE_OF,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.INSTANCE_OF,
|
||||
Opcode.IF_NEZ,
|
||||
Opcode.CONST
|
||||
),
|
||||
strings = listOf("This should not be called for base class object"),
|
||||
)
|
||||
@@ -0,0 +1,33 @@
|
||||
package app.revanced.patches.googlephotos.preferences
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.googlephotos.preferences.fingerprints.BackupPreferencesFingerprint
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
|
||||
@Patch(
|
||||
name = "Restore hidden 'Back up while charging' toggle",
|
||||
description = "Restores a hidden toggle to only run backups when the device is charging.",
|
||||
compatiblePackages = [CompatiblePackage("com.google.android.apps.photos")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object RestoreHiddenBackUpWhileChargingTogglePatch : BytecodePatch(
|
||||
setOf(BackupPreferencesFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
// Patches 'backup_prefs_had_backup_only_when_charging_enabled' to always be true.
|
||||
BackupPreferencesFingerprint.result?.let {
|
||||
val chargingPrefStringIndex = it.scanResult.stringsScanResult!!.matches.first().index
|
||||
it.mutableMethod.apply {
|
||||
// Get the register of move-result.
|
||||
val resultRegister = getInstruction<OneRegisterInstruction>(chargingPrefStringIndex + 2).registerA
|
||||
// Insert const after move-result to override register as true.
|
||||
addInstruction(chargingPrefStringIndex + 3, "const/4 v$resultRegister, 0x1")
|
||||
}
|
||||
} ?: throw Exception("BackupPreferencesFingerprint result not found")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package app.revanced.patches.googlephotos.preferences.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object BackupPreferencesFingerprint : MethodFingerprint(
|
||||
returnType = "Lcom/google/android/apps/photos/backup/data/BackupPreferences;",
|
||||
strings = listOf(
|
||||
"backup_prefs_had_backup_only_when_charging_enabled",
|
||||
),
|
||||
)
|
||||
@@ -0,0 +1,62 @@
|
||||
package app.revanced.patches.reddit.customclients.syncforreddit.fix.video
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.reddit.customclients.syncforreddit.fix.video.fingerprints.ParseRedditVideoNetworkResponseFingerprint
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
||||
|
||||
@Patch(
|
||||
name = "Fix video downloads",
|
||||
description = "Fixes a bug in Sync's MPD parser resulting in only the audio-track being saved.",
|
||||
compatiblePackages = [
|
||||
CompatiblePackage("com.laurencedawson.reddit_sync"),
|
||||
CompatiblePackage("com.laurencedawson.reddit_sync.pro"),
|
||||
CompatiblePackage("com.laurencedawson.reddit_sync.dev"),
|
||||
],
|
||||
requiresIntegrations = true,
|
||||
)
|
||||
@Suppress("unused")
|
||||
object FixVideoDownloadsPatch : BytecodePatch(
|
||||
fingerprints = setOf(ParseRedditVideoNetworkResponseFingerprint),
|
||||
) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/syncforreddit/FixRedditVideoDownloadPatch;"
|
||||
private const val GET_LINKS_METHOD = "getLinks([B)[Ljava/lang/String;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
ParseRedditVideoNetworkResponseFingerprint.resultOrThrow().let {
|
||||
val scanResult = it.scanResult.patternScanResult!!
|
||||
val newInstanceIndex = scanResult.startIndex
|
||||
val invokeDirectIndex = scanResult.endIndex - 1
|
||||
|
||||
val buildResponseInstruction = it.mutableMethod.getInstruction<Instruction35c>(invokeDirectIndex)
|
||||
|
||||
it.mutableMethod.addInstructions(
|
||||
newInstanceIndex + 1,
|
||||
"""
|
||||
# Get byte array from response.
|
||||
iget-object v2, p1, Lcom/android/volley/NetworkResponse;->data:[B
|
||||
|
||||
# Parse the videoUrl and audioUrl from the byte array.
|
||||
invoke-static { v2 }, $INTEGRATIONS_CLASS_DESCRIPTOR->$GET_LINKS_METHOD
|
||||
move-result-object v2
|
||||
|
||||
# Get videoUrl (Index 0).
|
||||
const/4 v5, 0x0
|
||||
aget-object v${buildResponseInstruction.registerE}, v2, v5
|
||||
|
||||
# Get audioUrl (Index 1).
|
||||
const/4 v6, 0x1
|
||||
aget-object v${buildResponseInstruction.registerF}, v2, v6
|
||||
|
||||
# Register E and F are used to build the response.
|
||||
""",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package app.revanced.patches.reddit.customclients.syncforreddit.fix.video.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object ParseRedditVideoNetworkResponseFingerprint : MethodFingerprint(
|
||||
opcodes = listOf(
|
||||
Opcode.NEW_INSTANCE,
|
||||
Opcode.IGET_OBJECT,
|
||||
Opcode.INVOKE_DIRECT,
|
||||
Opcode.CONST_WIDE_32
|
||||
),
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
classDef.sourceFile == "RedditVideoRequest.java" && methodDef.name == "parseNetworkResponse"
|
||||
}
|
||||
)
|
||||
@@ -65,12 +65,8 @@ abstract class BaseCheckEnvironmentPatch(
|
||||
"PATCH_ID" to ID.encodedAndHashed,
|
||||
"PATCH_MANUFACTURER" to MANUFACTURER.encodedAndHashed,
|
||||
"PATCH_MODEL" to MODEL.encodedAndHashed,
|
||||
"PATCH_ODM_SKU" to ODM_SKU.encodedAndHashed,
|
||||
"PATCH_PRODUCT" to PRODUCT.encodedAndHashed,
|
||||
"PATCH_RADIO" to RADIO.encodedAndHashed,
|
||||
"PATCH_SKU" to SKU.encodedAndHashed,
|
||||
"PATCH_SOC_MANUFACTURER" to SOC_MANUFACTURER.encodedAndHashed,
|
||||
"PATCH_SOC_MODEL" to SOC_MODEL.encodedAndHashed,
|
||||
"PATCH_TAGS" to TAGS.encodedAndHashed,
|
||||
"PATCH_TYPE" to TYPE.encodedAndHashed,
|
||||
"PATCH_USER" to USER.encodedAndHashed,
|
||||
@@ -98,8 +94,10 @@ abstract class BaseCheckEnvironmentPatch(
|
||||
private val String.encodedAndHashed
|
||||
get() = MutableStringEncodedValue(
|
||||
ImmutableStringEncodedValue(
|
||||
Base64.encode(MessageDigest.getInstance("SHA-1")
|
||||
.digest(this.toByteArray(StandardCharsets.UTF_8))),
|
||||
Base64.encode(
|
||||
MessageDigest.getInstance("SHA-1")
|
||||
.digest(this.toByteArray(StandardCharsets.UTF_8)),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import app.revanced.patches.shared.misc.settings.preference.IntentPreference
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.copyResources
|
||||
import app.revanced.util.getNode
|
||||
import app.revanced.util.insertFirst
|
||||
import org.w3c.dom.Node
|
||||
import java.io.Closeable
|
||||
|
||||
@@ -47,11 +48,7 @@ abstract class BaseSettingsResourcePatch(
|
||||
// It may be necessary to ask for the desired resourceValue in the future.
|
||||
AddResourcesPatch("values", resource)
|
||||
}.let { preferenceNode ->
|
||||
if (prepend && firstChild != null) {
|
||||
insertBefore(preferenceNode, firstChild)
|
||||
} else {
|
||||
appendChild(preferenceNode)
|
||||
}
|
||||
insertFirst(preferenceNode)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,4 @@ internal object InterceptFingerprint : MethodFingerprint(
|
||||
Opcode.MOVE_RESULT_OBJECT
|
||||
),
|
||||
strings = listOf("SC-Mob-UserPlan", "Configuration"),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "ApiUserPlanInterceptor.java" ||
|
||||
classDef.sourceFile == "ApiUserPlanInterceptor.kt"
|
||||
},
|
||||
)
|
||||
|
||||
@@ -8,7 +8,4 @@ internal object UserConsumerPlanConstructorFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
parameters = listOf("Ljava/lang/String;", "Z", "Ljava/lang/String;", "Ljava/util/List;", "Ljava/lang/String;", "Ljava/lang/String;"),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "UserConsumerPlan.kt"
|
||||
},
|
||||
)
|
||||
@@ -7,6 +7,7 @@ internal object CreateTrackingApiFingerprint : MethodFingerprint(
|
||||
returnType = "L",
|
||||
accessFlags = AccessFlags.PUBLIC.value,
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
classDef.sourceFile == "DefaultTrackingApiFactory.kt" && methodDef.name == "create"
|
||||
methodDef.name == "create"
|
||||
},
|
||||
strings = listOf("backend", "boogaloo")
|
||||
)
|
||||
|
||||
@@ -15,7 +15,5 @@ internal object DownloadOperationsHeaderVerificationFingerprint : MethodFingerpr
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.CONST_STRING
|
||||
),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "DownloadOperations.kt"
|
||||
}
|
||||
strings = listOf("X-SC-Mime-Type", "X-SC-Preset", "X-SC-Quality")
|
||||
)
|
||||
@@ -14,7 +14,4 @@ internal object DownloadOperationsURLBuilderFingerprint : MethodFingerprint(
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.FILLED_NEW_ARRAY
|
||||
),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "DownloadOperations.kt"
|
||||
}
|
||||
)
|
||||
@@ -3,12 +3,16 @@ package app.revanced.patches.soundcloud.shared.fingerprints
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
|
||||
internal object FeatureConstructorFingerprint : MethodFingerprint(
|
||||
returnType = "V",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
||||
parameters = listOf("Ljava/lang/String;", "Z", "Ljava/util/List;"),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.sourceFile == "Feature.kt"
|
||||
},
|
||||
opcodes = listOf(
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.INVOKE_VIRTUAL
|
||||
)
|
||||
)
|
||||
@@ -17,16 +17,16 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
@Patch(
|
||||
name = "Feed filter",
|
||||
description = "Removes ads, livestreams, stories, image videos " +
|
||||
"and videos with a specific amount of views or likes from the feed.",
|
||||
"and videos with a specific amount of views or likes from the feed.",
|
||||
dependencies = [IntegrationsPatch::class, SettingsPatch::class],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"])
|
||||
]
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["36.5.4"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["36.5.4"]),
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object FeedFilterPatch : BytecodePatch(
|
||||
setOf(FeedApiServiceLIZFingerprint, SettingsStatusLoadFingerprint)
|
||||
setOf(FeedApiServiceLIZFingerprint, SettingsStatusLoadFingerprint),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
FeedApiServiceLIZFingerprint.result?.mutableMethod?.apply {
|
||||
@@ -36,13 +36,13 @@ object FeedFilterPatch : BytecodePatch(
|
||||
addInstruction(
|
||||
returnFeedItemInstruction.location.index,
|
||||
"invoke-static { v$feedItemsRegister }, " +
|
||||
"Lapp/revanced/integrations/tiktok/feedfilter/FeedItemsFilter;->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V"
|
||||
"Lapp/revanced/integrations/tiktok/feedfilter/FeedItemsFilter;->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V",
|
||||
)
|
||||
} ?: throw FeedApiServiceLIZFingerprint.exception
|
||||
|
||||
SettingsStatusLoadFingerprint.result?.mutableMethod?.addInstruction(
|
||||
0,
|
||||
"invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableFeedFilter()V"
|
||||
"invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableFeedFilter()V",
|
||||
) ?: throw SettingsStatusLoadFingerprint.exception
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.smali.ExternalLabel
|
||||
import app.revanced.patches.tiktok.interaction.cleardisplay.fingerprints.OnClearDisplayEventFingerprint
|
||||
import app.revanced.patches.tiktok.interaction.cleardisplay.fingerprints.OnRenderFirstFrameFingerprint
|
||||
import app.revanced.patches.tiktok.shared.fingerprints.OnRenderFirstFrameFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
@@ -19,16 +19,16 @@ import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction22c
|
||||
name = "Remember clear display",
|
||||
description = "Remembers the clear display configurations in between videos.",
|
||||
compatiblePackages = [
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"])
|
||||
]
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["36.5.4"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["36.5.4"]),
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object RememberClearDisplayPatch : BytecodePatch(
|
||||
setOf(
|
||||
OnClearDisplayEventFingerprint,
|
||||
OnRenderFirstFrameFingerprint
|
||||
)
|
||||
OnRenderFirstFrameFingerprint,
|
||||
),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
OnClearDisplayEventFingerprint.result?.mutableMethod?.let {
|
||||
@@ -40,7 +40,7 @@ object RememberClearDisplayPatch : BytecodePatch(
|
||||
it.addInstructions(
|
||||
isEnabledIndex,
|
||||
"invoke-static { v$isEnabledRegister }, " +
|
||||
"Lapp/revanced/integrations/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V"
|
||||
"Lapp/revanced/integrations/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V",
|
||||
)
|
||||
|
||||
// endregion
|
||||
@@ -54,22 +54,25 @@ object RememberClearDisplayPatch : BytecodePatch(
|
||||
"""
|
||||
# Create a new clearDisplayEvent and post it to the EventBus (https://github.com/greenrobot/EventBus)
|
||||
|
||||
# The state of clear display.
|
||||
invoke-static { }, Lapp/revanced/integrations/tiktok/cleardisplay/RememberClearDisplayPatch;->getClearDisplayState()Z
|
||||
move-result v3
|
||||
if-eqz v3, :clear_display_disabled
|
||||
|
||||
# Clear display type such as 0 = LONG_PRESS, 1 = SCREEN_RECORD etc.
|
||||
const/4 v1, 0x0
|
||||
|
||||
# Enter method (Such as "pinch", "swipe_exit", or an empty string (unknown, what it means)).
|
||||
const-string v2, ""
|
||||
|
||||
# Name of the clear display type which is equivalent to the clear display type.
|
||||
const-string v2, "long_press"
|
||||
const-string v3, "long_press"
|
||||
|
||||
# The state of clear display.
|
||||
invoke-static { }, Lapp/revanced/integrations/tiktok/cleardisplay/RememberClearDisplayPatch;->getClearDisplayState()Z
|
||||
move-result v4
|
||||
if-eqz v4, :clear_display_disabled
|
||||
|
||||
new-instance v0, $clearDisplayEventClass
|
||||
invoke-direct { v0, v1, v2, v3 }, $clearDisplayEventClass-><init>(ILjava/lang/String;Z)V
|
||||
invoke-direct { v0, v1, v2, v3, v4 }, $clearDisplayEventClass-><init>(ILjava/lang/String;Ljava/lang/String;Z)V
|
||||
invoke-virtual { v0 }, $clearDisplayEventClass->post()Lcom/ss/android/ugc/governance/eventbus/IEvent;
|
||||
""",
|
||||
ExternalLabel("clear_display_disabled", getInstruction(0))
|
||||
ExternalLabel("clear_display_disabled", getInstruction(0)),
|
||||
)
|
||||
} ?: throw OnRenderFirstFrameFingerprint.exception
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package app.revanced.patches.tiktok.interaction.cleardisplay.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object OnRenderFirstFrameFingerprint : MethodFingerprint(
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/BaseListFragmentPanel;") && methodDef.name == "onRenderFirstFrame"
|
||||
}
|
||||
)
|
||||
@@ -13,14 +13,13 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint
|
||||
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint2
|
||||
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.ACLCommonShareFingerprint3
|
||||
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.DownloadPathParentFingerprint
|
||||
import app.revanced.patches.tiktok.interaction.downloads.fingerprints.DownloadUriFingerprint
|
||||
import app.revanced.patches.tiktok.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.tiktok.misc.settings.SettingsPatch
|
||||
import app.revanced.patches.tiktok.misc.settings.fingerprints.SettingsStatusLoadFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@Patch(
|
||||
@@ -28,9 +27,9 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
description = "Removes download restrictions and changes the default path to download to.",
|
||||
dependencies = [IntegrationsPatch::class, SettingsPatch::class],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"])
|
||||
]
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["36.5.4"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["36.5.4"]),
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object DownloadsPatch : BytecodePatch(
|
||||
@@ -38,9 +37,9 @@ object DownloadsPatch : BytecodePatch(
|
||||
ACLCommonShareFingerprint,
|
||||
ACLCommonShareFingerprint2,
|
||||
ACLCommonShareFingerprint3,
|
||||
DownloadPathParentFingerprint,
|
||||
SettingsStatusLoadFingerprint
|
||||
)
|
||||
DownloadUriFingerprint,
|
||||
SettingsStatusLoadFingerprint,
|
||||
),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
fun MethodFingerprint.getMethod() = result?.mutableMethod ?: throw exception
|
||||
@@ -52,7 +51,7 @@ object DownloadsPatch : BytecodePatch(
|
||||
"""
|
||||
const/4 v0, 0x0
|
||||
return v0
|
||||
"""
|
||||
""",
|
||||
)
|
||||
},
|
||||
ACLCommonShareFingerprint2 to {
|
||||
@@ -61,7 +60,7 @@ object DownloadsPatch : BytecodePatch(
|
||||
"""
|
||||
const/4 v0, 0x2
|
||||
return v0
|
||||
"""
|
||||
""",
|
||||
)
|
||||
},
|
||||
// Download videos without watermark.
|
||||
@@ -76,48 +75,40 @@ object DownloadsPatch : BytecodePatch(
|
||||
return v0
|
||||
:noremovewatermark
|
||||
nop
|
||||
"""
|
||||
""",
|
||||
)
|
||||
},
|
||||
// Change the download path patch.
|
||||
DownloadPathParentFingerprint to {
|
||||
val targetIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_STATIC }
|
||||
val downloadUriMethod = context
|
||||
.toMethodWalker(this)
|
||||
.nextMethod(targetIndex, true)
|
||||
.getMethod() as MutableMethod
|
||||
|
||||
val firstIndex = downloadUriMethod.indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_DIRECT && ((this as Instruction35c).reference as MethodReference).name == "<init>"
|
||||
DownloadUriFingerprint to {
|
||||
val firstIndex = indexOfFirstInstructionOrThrow {
|
||||
getReference<MethodReference>()?.name == "<init>"
|
||||
}
|
||||
val secondIndex = downloadUriMethod.indexOfFirstInstructionOrThrow {
|
||||
opcode == Opcode.INVOKE_STATIC && ((this as Instruction35c).reference as MethodReference).returnType.contains(
|
||||
"Uri"
|
||||
)
|
||||
val secondIndex = indexOfFirstInstructionOrThrow {
|
||||
getReference<MethodReference>()?.returnType?.contains("Uri") == true
|
||||
}
|
||||
|
||||
downloadUriMethod.addInstructions(
|
||||
addInstructions(
|
||||
secondIndex,
|
||||
"""
|
||||
invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String;
|
||||
move-result-object v0
|
||||
"""
|
||||
invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String;
|
||||
move-result-object v0
|
||||
""",
|
||||
)
|
||||
|
||||
downloadUriMethod.addInstructions(
|
||||
addInstructions(
|
||||
firstIndex,
|
||||
"""
|
||||
invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String;
|
||||
move-result-object v0
|
||||
"""
|
||||
invoke-static {}, Lapp/revanced/integrations/tiktok/download/DownloadsPatch;->getDownloadPath()Ljava/lang/String;
|
||||
move-result-object v0
|
||||
""",
|
||||
)
|
||||
},
|
||||
SettingsStatusLoadFingerprint to {
|
||||
addInstruction(
|
||||
0,
|
||||
"invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableDownload()V"
|
||||
"invoke-static {}, Lapp/revanced/integrations/tiktok/settings/SettingsStatus;->enableDownload()V",
|
||||
)
|
||||
}
|
||||
},
|
||||
).forEach { (fingerprint, patch) ->
|
||||
fingerprint.getMethod().patch()
|
||||
}
|
||||
|
||||
@@ -3,22 +3,18 @@ package app.revanced.patches.tiktok.interaction.downloads.fingerprints
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object DownloadPathParentFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
internal object DownloadUriFingerprint : MethodFingerprint(
|
||||
"Landroid/net/Uri;",
|
||||
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
strings = listOf(
|
||||
"video/mp4"
|
||||
"/",
|
||||
"/Camera",
|
||||
"/Camera/",
|
||||
"video/mp4",
|
||||
),
|
||||
parameters = listOf(
|
||||
"L",
|
||||
"L"
|
||||
"Landroid/content/Context;",
|
||||
"Ljava/lang/String;",
|
||||
),
|
||||
opcodes = listOf(
|
||||
Opcode.CONST_STRING,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.RETURN_OBJECT
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -9,30 +9,33 @@ import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.GetSpeedFingerprint
|
||||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.OnRenderFirstFrameFingerprint
|
||||
import app.revanced.patches.tiktok.interaction.speed.fingerprints.SetSpeedFingerprint
|
||||
import app.revanced.patches.tiktok.shared.fingerprints.GetEnterFromFingerprint
|
||||
import app.revanced.patches.tiktok.shared.fingerprints.OnRenderFirstFrameFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11x
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@Patch(
|
||||
name = "Playback speed",
|
||||
description = "Enables the playback speed option for all videos and " +
|
||||
"retains the speed configurations in between videos.",
|
||||
"retains the speed configurations in between videos.",
|
||||
compatiblePackages = [
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"])
|
||||
]
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["36.5.4"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["36.5.4"]),
|
||||
],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object PlaybackSpeedPatch : BytecodePatch(
|
||||
setOf(
|
||||
GetSpeedFingerprint,
|
||||
OnRenderFirstFrameFingerprint,
|
||||
SetSpeedFingerprint
|
||||
)
|
||||
SetSpeedFingerprint,
|
||||
GetEnterFromFingerprint,
|
||||
),
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
SetSpeedFingerprint.result?.let { onVideoSwiped ->
|
||||
@@ -44,7 +47,7 @@ object PlaybackSpeedPatch : BytecodePatch(
|
||||
addInstruction(
|
||||
injectIndex,
|
||||
"invoke-static { v$register }," +
|
||||
" Lapp/revanced/integrations/tiktok/speed/PlaybackSpeedPatch;->rememberPlaybackSpeed(F)V"
|
||||
" Lapp/revanced/integrations/tiktok/speed/PlaybackSpeedPatch;->rememberPlaybackSpeed(F)V",
|
||||
)
|
||||
} ?: throw GetSpeedFingerprint.exception
|
||||
|
||||
@@ -53,29 +56,29 @@ object PlaybackSpeedPatch : BytecodePatch(
|
||||
OnRenderFirstFrameFingerprint.result?.mutableMethod?.addInstructions(
|
||||
0,
|
||||
"""
|
||||
# Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method.
|
||||
const/4 v0, 0x1
|
||||
invoke-virtual {p0, v0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getEnterFrom(Z)Ljava/lang/String;
|
||||
move-result-object v0
|
||||
|
||||
# Model of current video retrieved using getCurrentAweme method.
|
||||
invoke-virtual {p0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme;
|
||||
move-result-object v1
|
||||
|
||||
# Desired playback speed retrieved using getPlaybackSpeed method.
|
||||
invoke-static {}, Lapp/revanced/integrations/tiktok/speed/PlaybackSpeedPatch;->getPlaybackSpeed()F
|
||||
move-result-object v2
|
||||
invoke-static { v0, v1, v2 }, ${onVideoSwiped.method}
|
||||
"""
|
||||
# Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method.
|
||||
const/4 v0, 0x1
|
||||
invoke-virtual {p0, v0}, ${GetEnterFromFingerprint.resultOrThrow().method}
|
||||
move-result-object v0
|
||||
|
||||
# Model of current video retrieved using getCurrentAweme method.
|
||||
invoke-virtual {p0}, Lcom/ss/android/ugc/aweme/feed/panel/BaseListFragmentPanel;->getCurrentAweme()Lcom/ss/android/ugc/aweme/feed/model/Aweme;
|
||||
move-result-object v1
|
||||
|
||||
# Desired playback speed retrieved using getPlaybackSpeed method.
|
||||
invoke-static {}, Lapp/revanced/integrations/tiktok/speed/PlaybackSpeedPatch;->getPlaybackSpeed()F
|
||||
move-result v2
|
||||
invoke-static { v0, v1, v2 }, ${onVideoSwiped.method}
|
||||
""",
|
||||
) ?: throw OnRenderFirstFrameFingerprint.exception
|
||||
|
||||
// Force enable the playback speed option for all videos.
|
||||
onVideoSwiped.mutableClass.methods.find { method -> method.returnType == "Z" }?.addInstructions(
|
||||
0,
|
||||
"""
|
||||
const/4 v0, 0x1
|
||||
return v0
|
||||
"""
|
||||
const/4 v0, 0x1
|
||||
return v0
|
||||
""",
|
||||
) ?: throw PatchException("Failed to force enable the playback speed option.")
|
||||
} ?: throw SetSpeedFingerprint.exception
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
description = "Adds ReVanced settings to TikTok.",
|
||||
dependencies = [IntegrationsPatch::class],
|
||||
compatiblePackages = [
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["32.5.3"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["32.5.3"])
|
||||
]
|
||||
CompatiblePackage("com.ss.android.ugc.trill", ["36.5.4"]),
|
||||
CompatiblePackage("com.zhiliaoapp.musically", ["36.5.4"]),
|
||||
],
|
||||
)
|
||||
object SettingsPatch : BytecodePatch(
|
||||
setOf(
|
||||
@@ -34,21 +34,21 @@ object SettingsPatch : BytecodePatch(
|
||||
AddSettingsEntryFingerprint,
|
||||
SettingsEntryFingerprint,
|
||||
SettingsEntryInfoFingerprint,
|
||||
)
|
||||
),
|
||||
) {
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/tiktok/settings/AdPersonalizationActivityHook;"
|
||||
|
||||
private const val INITIALIZE_SETTINGS_METHOD_DESCRIPTOR =
|
||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->initialize(" +
|
||||
"Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" +
|
||||
")Z"
|
||||
"Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" +
|
||||
")Z"
|
||||
|
||||
private const val CREATE_SETTINGS_ENTRY_METHOD_DESCRIPTOR =
|
||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->createSettingsEntry(" +
|
||||
"Ljava/lang/String;" +
|
||||
"Ljava/lang/String;" +
|
||||
")Ljava/lang/Object;"
|
||||
"Ljava/lang/String;" +
|
||||
"Ljava/lang/String;" +
|
||||
")Ljava/lang/Object;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
// Find the class name of classes which construct a settings entry
|
||||
@@ -70,8 +70,8 @@ object SettingsPatch : BytecodePatch(
|
||||
markIndex + 2,
|
||||
listOf(
|
||||
getUnitManager,
|
||||
addEntry
|
||||
)
|
||||
addEntry,
|
||||
),
|
||||
)
|
||||
|
||||
addInstructions(
|
||||
@@ -81,7 +81,8 @@ object SettingsPatch : BytecodePatch(
|
||||
const-string v1, "$settingsButtonInfoClass"
|
||||
invoke-static {v0, v1}, $CREATE_SETTINGS_ENTRY_METHOD_DESCRIPTOR
|
||||
move-result-object v0
|
||||
"""
|
||||
check-cast v0, ${SettingsEntryFingerprint.result!!.classDef}
|
||||
""",
|
||||
)
|
||||
} ?: throw AddSettingsEntryFingerprint.exception
|
||||
|
||||
@@ -102,12 +103,10 @@ object SettingsPatch : BytecodePatch(
|
||||
if-eqz v$usableRegister, :do_not_open
|
||||
return-void
|
||||
""",
|
||||
ExternalLabel("do_not_open", getInstruction(initializeSettingsIndex))
|
||||
ExternalLabel("do_not_open", getInstruction(initializeSettingsIndex)),
|
||||
)
|
||||
} ?: throw AdPersonalizationActivityOnCreateFingerprint.exception
|
||||
}
|
||||
|
||||
private fun String.toClassName(): String {
|
||||
return substring(1, this.length - 1).replace("/", ".")
|
||||
}
|
||||
}
|
||||
private fun String.toClassName(): String = substring(1, this.length - 1).replace("/", ".")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package app.revanced.patches.tiktok.shared.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object GetEnterFromFingerprint : MethodFingerprint(
|
||||
returnType = "Ljava/lang/String;",
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("Z"),
|
||||
opcodes = listOf(
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.INVOKE_STATIC,
|
||||
Opcode.MOVE_RESULT_OBJECT,
|
||||
Opcode.RETURN_OBJECT,
|
||||
),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/BaseListFragmentPanel;")
|
||||
},
|
||||
)
|
||||
@@ -1,9 +1,10 @@
|
||||
package app.revanced.patches.tiktok.interaction.speed.fingerprints
|
||||
package app.revanced.patches.tiktok.shared.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object OnRenderFirstFrameFingerprint : MethodFingerprint(
|
||||
strings = listOf("method_enable_viewpager_preload_duration"),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.definingClass.endsWith("/BaseListFragmentPanel;") && methodDef.name == "onRenderFirstFrame"
|
||||
}
|
||||
methodDef.definingClass.endsWith("/BaseListFragmentPanel;")
|
||||
},
|
||||
)
|
||||
@@ -10,5 +10,5 @@ internal object BuildMediaOptionsSheetFingerprint : MethodFingerprint(
|
||||
Opcode.GOTO_16,
|
||||
Opcode.NEW_INSTANCE,
|
||||
),
|
||||
strings = listOf("resources.getString(R.string.post_video)"),
|
||||
strings = listOf("mediaEntity", "media_options_sheet"),
|
||||
)
|
||||
|
||||
@@ -5,6 +5,6 @@ import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object ShowDownloadVideoUpsellBottomSheetFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
strings = listOf("variantToDownload.url"),
|
||||
strings = listOf("mediaEntity", "url"),
|
||||
opcodes = listOf(Opcode.IF_EQZ)
|
||||
)
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
package app.revanced.patches.twitter.misc.links
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption
|
||||
import app.revanced.patches.twitter.misc.links.fingerprints.LinkBuilderFingerprint
|
||||
import app.revanced.patches.twitter.misc.links.fingerprints.LinkResourceGetterFingerprint
|
||||
import app.revanced.patches.twitter.misc.links.fingerprints.LinkSharingDomainFingerprint
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
||||
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||
|
||||
@Patch(
|
||||
name = "Change link sharing domain",
|
||||
description = "Replaces the domain name of Twitter links when sharing them.",
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android")],
|
||||
)
|
||||
@Suppress("unused")
|
||||
object ChangeLinkSharingDomainPatch : BytecodePatch(
|
||||
setOf(
|
||||
LinkBuilderFingerprint,
|
||||
LinkResourceGetterFingerprint,
|
||||
LinkSharingDomainFingerprint,
|
||||
),
|
||||
) {
|
||||
private var domainName by stringPatchOption(
|
||||
key = "domainName",
|
||||
default = "fxtwitter.com",
|
||||
title = "Domain name",
|
||||
description = "The domain name to use when sharing links.",
|
||||
required = true,
|
||||
)
|
||||
|
||||
// This method is used to build the link that is shared when the "Share via..." button is pressed.
|
||||
private const val FORMAT_METHOD_RESOURCE_REFERENCE =
|
||||
"Lapp/revanced/integrations/twitter/patches/links/ChangeLinkSharingDomainPatch;->" +
|
||||
"formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;"
|
||||
|
||||
// This method is used to build the link that is shared when the "Copy link" button is pressed.
|
||||
private const val FORMAT_METHOD_REFERENCE =
|
||||
"Lapp/revanced/integrations/twitter/patches/links/ChangeLinkSharingDomainPatch;->" +
|
||||
"formatLink(JLjava/lang/String;)Ljava/lang/String;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
LinkSharingDomainFingerprint.result?.let {
|
||||
val replacementIndex = it.scanResult.stringsScanResult!!.matches.first().index
|
||||
val domainRegister = it.mutableMethod.getInstruction<OneRegisterInstruction>(replacementIndex).registerA
|
||||
it.mutableMethod.replaceInstruction(
|
||||
replacementIndex,
|
||||
"const-string v$domainRegister, \"https://$domainName\"",
|
||||
)
|
||||
} ?: throw LinkSharingDomainFingerprint.exception
|
||||
|
||||
// Replace the domain name when copying a link with "Copy link" button.
|
||||
LinkBuilderFingerprint.result?.let {
|
||||
it.mutableMethod.apply {
|
||||
addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static { p0, p1, p2 }, $FORMAT_METHOD_REFERENCE
|
||||
move-result-object p0
|
||||
return-object p0
|
||||
""",
|
||||
)
|
||||
}
|
||||
} ?: throw LinkBuilderFingerprint.exception
|
||||
|
||||
// Used in the Share via... dialog.
|
||||
LinkResourceGetterFingerprint.result?.mutableMethod?.apply {
|
||||
val constWithParameterName = indexOfFirstInstructionOrThrow {
|
||||
getReference<StringReference>()?.string?.contains("id.toString()") == true
|
||||
}
|
||||
|
||||
// Format the link with the new domain name register (2 instructions above the const-string).
|
||||
val formatLinkCallIndex = constWithParameterName - 2
|
||||
val formatLinkCall = getInstruction<Instruction35c>(formatLinkCallIndex)
|
||||
|
||||
// Replace the original method call with the new method call.
|
||||
replaceInstruction(
|
||||
formatLinkCallIndex,
|
||||
"invoke-static { v${formatLinkCall.registerE} }, $FORMAT_METHOD_RESOURCE_REFERENCE",
|
||||
)
|
||||
} ?: throw LinkResourceGetterFingerprint.exception
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ import app.revanced.util.exception
|
||||
name = "Open links with app chooser",
|
||||
description = "Instead of opening links directly, open them with an app chooser. " +
|
||||
"As a result you can select a browser to open the link with.",
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android")],
|
||||
compatiblePackages = [CompatiblePackage("com.twitter.android", ["10.48.0-release.0"])],
|
||||
use = false,
|
||||
)
|
||||
@Suppress("unused")
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package app.revanced.patches.twitter.misc.links.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
// Returns a shareable link string based on a tweet ID and a username.
|
||||
internal object LinkBuilderFingerprint : MethodFingerprint(
|
||||
strings = listOf("/%1\$s/status/%2\$d"),
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
package app.revanced.patches.twitter.misc.links.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
// Gets Resource string for share link view available by pressing "Share via" button.
|
||||
internal object LinkResourceGetterFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("Landroid/content/res/Resources;"),
|
||||
strings = listOf("res.getString(R.string.t…lUsername, id.toString())"),
|
||||
)
|
||||
@@ -0,0 +1,7 @@
|
||||
package app.revanced.patches.twitter.misc.links.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
|
||||
internal object LinkSharingDomainFingerprint : MethodFingerprint(
|
||||
strings = listOf("https://fxtwitter.com"),
|
||||
)
|
||||
@@ -0,0 +1,28 @@
|
||||
package app.revanced.patches.willhaben.ads
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.willhaben.ads.fingerprints.AdResolverFingerprint
|
||||
import app.revanced.patches.willhaben.ads.fingerprints.WHAdViewInjectorFingerprint
|
||||
import app.revanced.util.returnEarly
|
||||
|
||||
@Patch(
|
||||
name = "Hide ads",
|
||||
description = "Hides all in-app ads.",
|
||||
compatiblePackages = [CompatiblePackage("at.willhaben")]
|
||||
)
|
||||
@Suppress("unused")
|
||||
object HideAdsPatch : BytecodePatch(
|
||||
fingerprints = setOf(
|
||||
AdResolverFingerprint,
|
||||
WHAdViewInjectorFingerprint
|
||||
)
|
||||
) {
|
||||
override fun execute(context: BytecodeContext) {
|
||||
arrayOf(AdResolverFingerprint, WHAdViewInjectorFingerprint).forEach {
|
||||
it.returnEarly()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package app.revanced.patches.willhaben.ads.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object AdResolverFingerprint : MethodFingerprint(
|
||||
"L",
|
||||
parameters = listOf("L", "L"),
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
strings = listOf(
|
||||
"Google Ad is invalid ",
|
||||
"Google Native Ad is invalid ",
|
||||
"Criteo Ad is invalid ",
|
||||
"Amazon Ad is invalid "
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
package app.revanced.patches.willhaben.ads.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object WHAdViewInjectorFingerprint : MethodFingerprint(
|
||||
"V",
|
||||
parameters = listOf("L", "L", "L", "Z"),
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
strings = listOf("successfulAdView"),
|
||||
customFingerprint = { _, classDef ->
|
||||
classDef.type == "Lat/willhaben/advertising/WHAdView;"
|
||||
}
|
||||
)
|
||||
@@ -51,8 +51,8 @@ object CopyVideoUrlBytecodePatch : BytecodePatch(emptySet()) {
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
BUTTONS_DESCRIPTORS.forEach { descriptor ->
|
||||
PlayerControlsBytecodePatch.initializeControl("$descriptor->initializeButton(Landroid/view/View;)V")
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall("$descriptor->changeVisibility(Z)V")
|
||||
PlayerControlsBytecodePatch.initializeBottomControl(descriptor)
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(descriptor)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.youtube.misc.playercontrols.BottomControlsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.copyResources
|
||||
@@ -13,7 +13,7 @@ import app.revanced.util.copyResources
|
||||
@Patch(
|
||||
dependencies = [
|
||||
SettingsPatch::class,
|
||||
BottomControlsResourcePatch::class,
|
||||
PlayerControlsResourcePatch::class,
|
||||
AddResourcesPatch::class
|
||||
]
|
||||
)
|
||||
@@ -34,6 +34,6 @@ internal object CopyVideoUrlResourcePatch : ResourcePatch() {
|
||||
)
|
||||
)
|
||||
|
||||
BottomControlsResourcePatch.addControls("copyvideourl")
|
||||
PlayerControlsResourcePatch.addBottomControls("copyvideourl")
|
||||
}
|
||||
}
|
||||
@@ -58,8 +58,8 @@ object DownloadsPatch : BytecodePatch(
|
||||
private const val BUTTON_DESCRIPTOR = "Lapp/revanced/integrations/youtube/videoplayer/ExternalDownloadButton;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
PlayerControlsBytecodePatch.initializeControl("$BUTTON_DESCRIPTOR->initializeButton(Landroid/view/View;)V")
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall("$BUTTON_DESCRIPTOR->changeVisibility(Z)V")
|
||||
PlayerControlsBytecodePatch.initializeBottomControl(BUTTON_DESCRIPTOR)
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(BUTTON_DESCRIPTOR)
|
||||
|
||||
// Main activity is used to launch downloader intent.
|
||||
MainActivityFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
|
||||
@@ -9,14 +9,14 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen
|
||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen.Sorting
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||
import app.revanced.patches.youtube.misc.playercontrols.BottomControlsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.copyResources
|
||||
|
||||
@Patch(
|
||||
dependencies = [
|
||||
BottomControlsResourcePatch::class,
|
||||
PlayerControlsResourcePatch::class,
|
||||
SettingsPatch::class,
|
||||
AddResourcesPatch::class,
|
||||
],
|
||||
@@ -42,6 +42,6 @@ internal object DownloadsResourcePatch : ResourcePatch() {
|
||||
ResourceGroup("drawable", "revanced_yt_download_button.xml"),
|
||||
)
|
||||
|
||||
BottomControlsResourcePatch.addControls("downloads")
|
||||
PlayerControlsResourcePatch.addBottomControls("downloads")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,20 @@
|
||||
package app.revanced.patches.youtube.interaction.seekbar
|
||||
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.smali.ExternalLabel
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.IsSwipingUpFingerprint
|
||||
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.AllowSwipingUpGestureFingerprint
|
||||
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.ShowSwipingUpGuideFingerprint
|
||||
import app.revanced.patches.youtube.interaction.seekbar.fingerprints.SwipingUpGestureParentFingerprint
|
||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.exception
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import app.revanced.util.alsoResolve
|
||||
|
||||
@Patch(
|
||||
name = "Disable precise seeking gesture",
|
||||
@@ -52,11 +54,10 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
)
|
||||
@Suppress("unused")
|
||||
object DisablePreciseSeekingGesturePatch : BytecodePatch(
|
||||
setOf(IsSwipingUpFingerprint)
|
||||
setOf(SwipingUpGestureParentFingerprint)
|
||||
) {
|
||||
private const val INTEGRATIONS_METHOD_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/DisablePreciseSeekingGesturePatch;->" +
|
||||
"disableGesture(Landroid/view/VelocityTracker;Landroid/view/MotionEvent;)V"
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/DisablePreciseSeekingGesturePatch;"
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
AddResourcesPatch(this::class)
|
||||
@@ -65,19 +66,37 @@ object DisablePreciseSeekingGesturePatch : BytecodePatch(
|
||||
SwitchPreference("revanced_disable_precise_seeking_gesture")
|
||||
)
|
||||
|
||||
IsSwipingUpFingerprint.result?.let {
|
||||
val addMovementIndex = it.scanResult.patternScanResult!!.startIndex - 1
|
||||
AllowSwipingUpGestureFingerprint.alsoResolve(
|
||||
context,
|
||||
SwipingUpGestureParentFingerprint
|
||||
).mutableMethod.apply {
|
||||
addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->isGestureDisabled()Z
|
||||
move-result v0
|
||||
if-eqz v0, :disabled
|
||||
return-void
|
||||
""",
|
||||
ExternalLabel("disabled", getInstruction(0))
|
||||
)
|
||||
}
|
||||
|
||||
it.mutableMethod.apply {
|
||||
val addMovementInstruction = getInstruction<FiveRegisterInstruction>(addMovementIndex)
|
||||
val trackerRegister = addMovementInstruction.registerC
|
||||
val eventRegister = addMovementInstruction.registerD
|
||||
|
||||
replaceInstruction(
|
||||
addMovementIndex,
|
||||
"invoke-static {v$trackerRegister, v$eventRegister}, $INTEGRATIONS_METHOD_DESCRIPTOR"
|
||||
)
|
||||
}
|
||||
} ?: throw IsSwipingUpFingerprint.exception
|
||||
ShowSwipingUpGuideFingerprint.alsoResolve(
|
||||
context,
|
||||
SwipingUpGestureParentFingerprint
|
||||
).mutableMethod.apply {
|
||||
addInstructionsWithLabels(
|
||||
0,
|
||||
"""
|
||||
invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->isGestureDisabled()Z
|
||||
move-result v0
|
||||
if-eqz v0, :disabled
|
||||
const/4 v0, 0x0
|
||||
return v0
|
||||
""",
|
||||
ExternalLabel("disabled", getInstruction(0))
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
/**
|
||||
* Resolves using the class found in [SwipingUpGestureParentFingerprint].
|
||||
*/
|
||||
internal object AllowSwipingUpGestureFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "V",
|
||||
parameters = listOf("L"),
|
||||
)
|
||||
@@ -1,13 +0,0 @@
|
||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object IsSwipingUpFingerprint : MethodFingerprint(
|
||||
returnType = "Z",
|
||||
parameters = listOf("Landroid/view/MotionEvent;", "J"),
|
||||
opcodes = listOf(
|
||||
Opcode.SGET_OBJECT,
|
||||
Opcode.IGET_OBJECT
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,14 @@
|
||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||
|
||||
import app.revanced.util.patch.LiteralValueFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
/**
|
||||
* Resolves using the class found in [SwipingUpGestureParentFingerprint].
|
||||
*/
|
||||
internal object ShowSwipingUpGuideFingerprint : LiteralValueFingerprint(
|
||||
accessFlags = AccessFlags.FINAL.value,
|
||||
returnType = "Z",
|
||||
parameters = emptyList(),
|
||||
literalSupplier = { 1L }
|
||||
)
|
||||
@@ -0,0 +1,12 @@
|
||||
package app.revanced.patches.youtube.interaction.seekbar.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.util.patch.LiteralValueFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object SwipingUpGestureParentFingerprint : LiteralValueFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "Z",
|
||||
parameters = listOf(),
|
||||
literalSupplier = { 45379021 }
|
||||
)
|
||||
@@ -18,13 +18,18 @@ import app.revanced.patches.youtube.layout.hide.general.fingerprints.HideShowMor
|
||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.ParseElementFromBufferFingerprint
|
||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.PlayerOverlayFingerprint
|
||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.ShowWatermarkFingerprint
|
||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.YoodlesImageViewFingerprint
|
||||
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
||||
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.findOpcodeIndicesReversed
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
|
||||
@Patch(
|
||||
name = "Hide layout components",
|
||||
@@ -70,7 +75,12 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||
)
|
||||
@Suppress("unused")
|
||||
object HideLayoutComponentsPatch : BytecodePatch(
|
||||
setOf(ParseElementFromBufferFingerprint, PlayerOverlayFingerprint, HideShowMoreButtonFingerprint),
|
||||
setOf(
|
||||
ParseElementFromBufferFingerprint,
|
||||
PlayerOverlayFingerprint,
|
||||
HideShowMoreButtonFingerprint,
|
||||
YoodlesImageViewFingerprint,
|
||||
),
|
||||
) {
|
||||
private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/components/LayoutComponentsFilter;"
|
||||
@@ -89,7 +99,6 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
||||
SwitchPreference("revanced_hide_channel_guidelines"),
|
||||
SwitchPreference("revanced_hide_channel_member_shelf"),
|
||||
SwitchPreference("revanced_hide_channel_watermark"),
|
||||
SwitchPreference("revanced_hide_chips_shelf"),
|
||||
SwitchPreference("revanced_hide_community_guidelines"),
|
||||
PreferenceScreen(
|
||||
key = "revanced_hide_description_components_screen",
|
||||
@@ -129,6 +138,7 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
||||
SwitchPreference("revanced_hide_search_result_recommendations"),
|
||||
SwitchPreference("revanced_hide_search_result_shelf_header"),
|
||||
SwitchPreference("revanced_hide_show_more_button"),
|
||||
SwitchPreference("revanced_hide_doodles"),
|
||||
PreferenceScreen(
|
||||
key = "revanced_hide_keyword_content_screen",
|
||||
sorting = Sorting.UNSORTED,
|
||||
@@ -145,6 +155,7 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
||||
)
|
||||
|
||||
SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||
SwitchPreference("revanced_hide_chips_shelf"),
|
||||
SwitchPreference("revanced_hide_expandable_chip"),
|
||||
SwitchPreference("revanced_hide_gray_separator"),
|
||||
PreferenceScreen(
|
||||
@@ -226,5 +237,28 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region 'Yoodles'
|
||||
|
||||
YoodlesImageViewFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
findOpcodeIndicesReversed{
|
||||
opcode == Opcode.INVOKE_VIRTUAL
|
||||
&& getReference<MethodReference>()?.name == "setImageDrawable"
|
||||
}.forEach { insertIndex ->
|
||||
val register = getInstruction<FiveRegisterInstruction>(insertIndex).registerD
|
||||
|
||||
addInstructionsWithLabels(
|
||||
insertIndex,
|
||||
"""
|
||||
invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideYoodles(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;
|
||||
move-result-object v$register
|
||||
if-eqz v$register, :hide
|
||||
""",
|
||||
ExternalLabel("hide", getInstruction(insertIndex + 1)),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,10 +17,17 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
internal object HideLayoutComponentsResourcePatch : ResourcePatch() {
|
||||
internal var expandButtonDownId: Long = -1
|
||||
|
||||
var youTubeLogo = -1L
|
||||
|
||||
override fun execute(context: ResourceContext) {
|
||||
expandButtonDownId = ResourceMappingPatch[
|
||||
"layout",
|
||||
"expand_button_down",
|
||||
]
|
||||
|
||||
youTubeLogo = ResourceMappingPatch[
|
||||
"id",
|
||||
"youtube_logo"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package app.revanced.patches.youtube.layout.hide.general.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patches.youtube.layout.hide.general.HideLayoutComponentsResourcePatch
|
||||
import app.revanced.util.patch.LiteralValueFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object YoodlesImageViewFingerprint : LiteralValueFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
parameters = listOf("L", "L"),
|
||||
returnType = "Landroid/view/View;",
|
||||
literalSupplier = { HideLayoutComponentsResourcePatch.youTubeLogo }
|
||||
)
|
||||
@@ -6,6 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||
import app.revanced.patches.youtube.layout.hide.shorts.fingerprints.*
|
||||
@@ -76,6 +77,20 @@ object HideShortsComponentsPatch : BytecodePatch(
|
||||
) {
|
||||
private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/integrations/youtube/patches/components/ShortsFilter;"
|
||||
|
||||
internal val hideShortsAppShortcut by booleanPatchOption(
|
||||
key = "hideShortsAppShortcut",
|
||||
default = false,
|
||||
title = "Hide Shorts app shortcut",
|
||||
description = "Permanently hides the shortcut to open Shorts when long pressing the app icon in your launcher."
|
||||
)
|
||||
|
||||
internal val hideShortsWidget by booleanPatchOption(
|
||||
key = "hideShortsWidget",
|
||||
default = false,
|
||||
title = "Hide Shorts widget",
|
||||
description = "Permanently hides the launcher widget Shorts button."
|
||||
)
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
// region Hide the Shorts shelf.
|
||||
|
||||
|
||||
@@ -6,7 +6,10 @@ import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||
import app.revanced.patches.youtube.layout.hide.shorts.HideShortsComponentsPatch.hideShortsAppShortcut
|
||||
import app.revanced.patches.youtube.layout.hide.shorts.HideShortsComponentsPatch.hideShortsWidget
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.util.findElementByAttributeValueOrThrow
|
||||
|
||||
@Patch(dependencies = [SettingsPatch::class, ResourceMappingPatch::class, AddResourcesPatch::class])
|
||||
object HideShortsComponentsResourcePatch : ResourcePatch() {
|
||||
@@ -26,6 +29,7 @@ object HideShortsComponentsResourcePatch : ResourcePatch() {
|
||||
// since this Setting menu currently uses the ordering used here.
|
||||
|
||||
// Vertical row of buttons on right side of the screen.
|
||||
SwitchPreference("revanced_hide_shorts_like_fountain"),
|
||||
SwitchPreference("revanced_hide_shorts_like_button"),
|
||||
SwitchPreference("revanced_hide_shorts_dislike_button"),
|
||||
SwitchPreference("revanced_hide_shorts_comments_button"),
|
||||
@@ -38,9 +42,12 @@ object HideShortsComponentsResourcePatch : ResourcePatch() {
|
||||
SwitchPreference("revanced_hide_shorts_subscribe_button"),
|
||||
SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"),
|
||||
SwitchPreference("revanced_hide_shorts_save_sound_button"),
|
||||
SwitchPreference("revanced_hide_shorts_use_this_sound_button"),
|
||||
SwitchPreference("revanced_hide_shorts_use_template_button"),
|
||||
SwitchPreference("revanced_hide_shorts_upcoming_button"),
|
||||
SwitchPreference("revanced_hide_shorts_green_screen_button"),
|
||||
SwitchPreference("revanced_hide_shorts_shop_button"),
|
||||
SwitchPreference("revanced_hide_shorts_tagged_products"),
|
||||
SwitchPreference("revanced_hide_shorts_stickers"),
|
||||
SwitchPreference("revanced_hide_shorts_search_suggestions"),
|
||||
SwitchPreference("revanced_hide_shorts_super_thanks_button"),
|
||||
SwitchPreference("revanced_hide_shorts_location_label"),
|
||||
@@ -52,6 +59,28 @@ object HideShortsComponentsResourcePatch : ResourcePatch() {
|
||||
SwitchPreference("revanced_hide_shorts_navigation_bar"),
|
||||
)
|
||||
|
||||
if (hideShortsAppShortcut == true) {
|
||||
context.xmlEditor["res/xml/main_shortcuts.xml"].use { editor ->
|
||||
val shortsItem = editor.file.childNodes.findElementByAttributeValueOrThrow(
|
||||
"android:shortcutId",
|
||||
"shorts-shortcut",
|
||||
)
|
||||
|
||||
shortsItem.parentNode.removeChild(shortsItem)
|
||||
}
|
||||
}
|
||||
|
||||
if (hideShortsWidget == true) {
|
||||
context.xmlEditor["res/layout/appwidget_two_rows.xml"].use { editor ->
|
||||
val shortsItem = editor.file.childNodes.findElementByAttributeValueOrThrow(
|
||||
"android:id",
|
||||
"@id/button_shorts_container",
|
||||
)
|
||||
|
||||
shortsItem.parentNode.removeChild(shortsItem)
|
||||
}
|
||||
}
|
||||
|
||||
reelPlayerRightCellButtonHeight = ResourceMappingPatch[
|
||||
"dimen",
|
||||
"reel_player_right_cell_button_height",
|
||||
|
||||
@@ -10,7 +10,6 @@ import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||
import app.revanced.patches.youtube.layout.sponsorblock.fingerprints.AppendTimeFingerprint
|
||||
import app.revanced.patches.youtube.layout.sponsorblock.fingerprints.ControlsOverlayFingerprint
|
||||
import app.revanced.patches.youtube.layout.sponsorblock.fingerprints.RectangleFieldInvalidatorFingerprint
|
||||
@@ -26,7 +25,10 @@ import app.revanced.patches.youtube.video.information.VideoInformationPatch
|
||||
import app.revanced.patches.youtube.video.videoid.VideoIdPatch
|
||||
import app.revanced.util.exception
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.*
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
|
||||
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
@@ -169,59 +171,14 @@ object SponsorBlockBytecodePatch : BytecodePatch(
|
||||
break
|
||||
}
|
||||
|
||||
/*
|
||||
* Voting & Shield button
|
||||
*/
|
||||
val controlsMethodResult = PlayerControlsBytecodePatch.showPlayerControlsFingerprintResult
|
||||
// Change visibility of the buttons.
|
||||
PlayerControlsBytecodePatch.initializeTopControl(INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR)
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR)
|
||||
|
||||
val controlsLayoutStubResourceId =
|
||||
ResourceMappingPatch["id", "controls_layout_stub"]
|
||||
val zoomOverlayResourceId =
|
||||
ResourceMappingPatch["id", "video_zoom_overlay_stub"]
|
||||
PlayerControlsBytecodePatch.initializeTopControl(INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR)
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR)
|
||||
|
||||
methods@ for (method in controlsMethodResult.mutableClass.methods) {
|
||||
val instructions = method.implementation?.instructions!!
|
||||
instructions@ for ((index, instruction) in instructions.withIndex()) {
|
||||
// search for method which inflates the controls layout view
|
||||
if (instruction.opcode != Opcode.CONST) continue@instructions
|
||||
|
||||
when ((instruction as NarrowLiteralInstruction).wideLiteral) {
|
||||
controlsLayoutStubResourceId -> {
|
||||
// replace the view with the YouTubeControlsOverlay
|
||||
val moveResultInstructionIndex = index + 5
|
||||
val inflatedViewRegister =
|
||||
(instructions[moveResultInstructionIndex] as OneRegisterInstruction).registerA
|
||||
// initialize with the player overlay object
|
||||
method.addInstructions(
|
||||
moveResultInstructionIndex + 1, // insert right after moving the view to the register and use that register
|
||||
"""
|
||||
invoke-static {v$inflatedViewRegister}, $INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/View;)V
|
||||
invoke-static {v$inflatedViewRegister}, $INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/View;)V
|
||||
""",
|
||||
)
|
||||
}
|
||||
|
||||
zoomOverlayResourceId -> {
|
||||
val invertVisibilityMethod =
|
||||
context.toMethodWalker(method).nextMethod(index - 6, true).getMethod() as MutableMethod
|
||||
// change visibility of the buttons
|
||||
invertVisibilityMethod.addInstructions(
|
||||
0,
|
||||
"""
|
||||
invoke-static {p1}, $INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibilityNegatedImmediate(Z)V
|
||||
invoke-static {p1}, $INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibilityNegatedImmediate(Z)V
|
||||
""".trimIndent(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// change visibility of the buttons
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall("$INTEGRATIONS_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibility(Z)V")
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall("$INTEGRATIONS_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR->changeVisibility(Z)V")
|
||||
|
||||
// append the new time to the player layout
|
||||
// Append the new time to the player layout.
|
||||
val appendTimeFingerprintResult = AppendTimeFingerprint.result!!
|
||||
val appendTimePatternScanStartIndex = appendTimeFingerprintResult.scanResult.patternScanResult!!.startIndex
|
||||
val targetRegister =
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
package app.revanced.patches.youtube.layout.sponsorblock
|
||||
|
||||
import app.revanced.patcher.data.ResourceContext
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||
import app.revanced.patches.shared.misc.settings.preference.IntentPreference
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||
import app.revanced.patches.youtube.misc.settings.SettingsResourcePatch
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.copyResources
|
||||
import app.revanced.util.copyXmlNode
|
||||
import app.revanced.util.inputStreamFromBundledResource
|
||||
|
||||
@Patch(
|
||||
dependencies = [
|
||||
@@ -60,49 +58,6 @@ internal object SponsorBlockResourcePatch : ResourcePatch() {
|
||||
context.copyResources("sponsorblock", resourceGroup)
|
||||
}
|
||||
|
||||
// copy nodes from host resources to their real xml files
|
||||
|
||||
val hostingResourceStream =
|
||||
inputStreamFromBundledResource(
|
||||
"sponsorblock",
|
||||
"host/layout/youtube_controls_layout.xml",
|
||||
)!!
|
||||
|
||||
var modifiedControlsLayout = false
|
||||
val editor = context.xmlEditor["res/layout/youtube_controls_layout.xml"]
|
||||
"RelativeLayout".copyXmlNode(
|
||||
context.xmlEditor[hostingResourceStream],
|
||||
editor,
|
||||
).also {
|
||||
val document = editor.file
|
||||
|
||||
val children = document.getElementsByTagName("RelativeLayout").item(0).childNodes
|
||||
|
||||
// Replace the startOf with the voting button view so that the button does not overlap
|
||||
for (i in 1 until children.length) {
|
||||
val view = children.item(i)
|
||||
|
||||
// Replace the attribute for a specific node only
|
||||
if (!(
|
||||
view.hasAttributes() &&
|
||||
view.attributes.getNamedItem(
|
||||
"android:id",
|
||||
).nodeValue.endsWith("live_chat_overlay_button")
|
||||
)
|
||||
) {
|
||||
continue
|
||||
}
|
||||
|
||||
// voting button id from the voting button view from the youtube_controls_layout.xml host file
|
||||
val votingButtonId = "@+id/revanced_sb_voting_button"
|
||||
|
||||
view.attributes.getNamedItem("android:layout_toStartOf").nodeValue = votingButtonId
|
||||
|
||||
modifiedControlsLayout = true
|
||||
break
|
||||
}
|
||||
}.close()
|
||||
|
||||
if (!modifiedControlsLayout) throw PatchException("Could not modify controls layout")
|
||||
PlayerControlsResourcePatch.addTopControls("sponsorblock")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,17 +99,15 @@ object SpoofVideoStreamsPatch : BytecodePatch(
|
||||
preferences = setOf(
|
||||
SwitchPreference("revanced_spoof_video_streams"),
|
||||
ListPreference(
|
||||
"revanced_spoof_video_streams_client_type",
|
||||
summaryKey = null,
|
||||
entriesKey = "revanced_spoof_video_streams_client_type_entries",
|
||||
entryValuesKey = "revanced_spoof_video_streams_client_type_entry_values",
|
||||
"revanced_spoof_video_streams_client",
|
||||
summaryKey = null
|
||||
),
|
||||
SwitchPreference(
|
||||
"revanced_spoof_video_streams_ios_force_avc",
|
||||
tag = "app.revanced.integrations.youtube.settings.preference.ForceAVCSpoofingPreference",
|
||||
),
|
||||
NonInteractivePreference("revanced_spoof_video_streams_about_ios"),
|
||||
NonInteractivePreference("revanced_spoof_video_streams_about_android_vr"),
|
||||
NonInteractivePreference("revanced_spoof_video_streams_about_ios"),
|
||||
),
|
||||
),
|
||||
)
|
||||
@@ -256,7 +254,9 @@ object SpoofVideoStreamsPatch : BytecodePatch(
|
||||
// endregion
|
||||
|
||||
// region Remove /videoplayback request body to fix playback.
|
||||
// This is needed when using iOS client as streaming data source.
|
||||
// It is assumed, YouTube makes a request with a body tuned for Android.
|
||||
// Requesting streams intended for other platforms with a body tuned for Android could be the cause of 400 errors.
|
||||
// A proper fix may include modifying the request body to match the platforms expected body.
|
||||
|
||||
BuildMediaDataSourceFingerprint.resultOrThrow().let {
|
||||
it.mutableMethod.apply {
|
||||
|
||||
@@ -3,70 +3,18 @@ package app.revanced.patches.youtube.misc.playercontrols
|
||||
import app.revanced.patcher.data.ResourceContext
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.DomFileEditor
|
||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||
import java.io.Closeable
|
||||
|
||||
@Patch(dependencies = [ResourceMappingPatch::class])
|
||||
@Patch(
|
||||
dependencies = [PlayerControlsBytecodePatch::class],
|
||||
)
|
||||
@Deprecated("Patch renamed to PlayerControlsResourcePatch", replaceWith = ReplaceWith("PlayerControlsBytecodePatch"))
|
||||
object BottomControlsResourcePatch : ResourcePatch(), Closeable {
|
||||
internal var bottomUiContainerResourceId: Long = -1
|
||||
override fun execute(context: ResourceContext) {}
|
||||
|
||||
private const val TARGET_RESOURCE_NAME = "youtube_controls_bottom_ui_container.xml"
|
||||
private const val TARGET_RESOURCE = "res/layout/$TARGET_RESOURCE_NAME"
|
||||
|
||||
// The element to the left of the element being added.
|
||||
private var lastLeftOf = "fullscreen_button"
|
||||
|
||||
private lateinit var resourceContext: ResourceContext
|
||||
private lateinit var targetDocumentEditor: DomFileEditor
|
||||
|
||||
override fun execute(context: ResourceContext) {
|
||||
resourceContext = context
|
||||
targetDocumentEditor = context.xmlEditor[TARGET_RESOURCE]
|
||||
|
||||
bottomUiContainerResourceId = ResourceMappingPatch["id", "bottom_ui_container_stub"]
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new controls to the bottom of the YouTube player.
|
||||
*
|
||||
* @param resourceDirectoryName The name of the directory containing the hosting resource.
|
||||
*/
|
||||
fun addControls(resourceDirectoryName: String) {
|
||||
val sourceDocumentEditor = resourceContext.xmlEditor[
|
||||
this::class.java.classLoader.getResourceAsStream(
|
||||
"$resourceDirectoryName/host/layout/$TARGET_RESOURCE_NAME",
|
||||
)!!,
|
||||
]
|
||||
val sourceDocument = sourceDocumentEditor.file
|
||||
val targetDocument = targetDocumentEditor.file
|
||||
|
||||
val targetElementTag = "android.support.constraint.ConstraintLayout"
|
||||
|
||||
val sourceElements = sourceDocument.getElementsByTagName(targetElementTag).item(0).childNodes
|
||||
val targetElement = targetDocument.getElementsByTagName(targetElementTag).item(0)
|
||||
|
||||
for (index in 1 until sourceElements.length) {
|
||||
val element = sourceElements.item(index).cloneNode(true)
|
||||
|
||||
// If the element has no attributes there's no point to adding it to the destination.
|
||||
if (!element.hasAttributes()) continue
|
||||
|
||||
// Set the elements lastLeftOf attribute to the lastLeftOf value.
|
||||
val namespace = "@+id"
|
||||
element.attributes.getNamedItem("yt:layout_constraintRight_toLeftOf").nodeValue =
|
||||
"$namespace/$lastLeftOf"
|
||||
|
||||
// Set lastLeftOf attribute to the current element.
|
||||
val nameSpaceLength = 5
|
||||
lastLeftOf = element.attributes.getNamedItem("android:id").nodeValue.substring(nameSpaceLength)
|
||||
|
||||
// Add the element.
|
||||
targetDocument.adoptNode(element)
|
||||
targetElement.appendChild(element)
|
||||
}
|
||||
sourceDocumentEditor.close()
|
||||
PlayerControlsResourcePatch.addBottomControls(resourceDirectoryName)
|
||||
}
|
||||
|
||||
override fun close() = targetDocumentEditor.close()
|
||||
}
|
||||
override fun close() {}
|
||||
}
|
||||
@@ -1,65 +1,144 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols
|
||||
|
||||
import app.revanced.util.exception
|
||||
import app.revanced.patcher.data.BytecodeContext
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprintResult
|
||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||
import app.revanced.patcher.patch.BytecodePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.youtube.shared.fingerprints.LayoutConstructorFingerprint
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.BottomControlsInflateFingerprint
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.PlayerControlsVisibilityFingerprint
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.ControlsOverlayVisibility
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.OverlayViewInflateFingerprint
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.PlayerBottomControlsInflateFingerprint
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.PlayerControlsIntegrationHookFingerprint
|
||||
import app.revanced.patches.youtube.misc.playercontrols.fingerprints.PlayerTopControlsInflateFingerprint
|
||||
import app.revanced.util.alsoResolve
|
||||
import app.revanced.util.getReference
|
||||
import app.revanced.util.indexOfFirstInstructionOrThrow
|
||||
import app.revanced.util.indexOfFirstWideLiteralInstructionValueReversedOrThrow
|
||||
import app.revanced.util.resultOrThrow
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
|
||||
|
||||
@Patch(
|
||||
description = "Manages the code for the player controls of the YouTube player.",
|
||||
dependencies = [BottomControlsResourcePatch::class],
|
||||
dependencies = [PlayerControlsResourcePatch::class],
|
||||
)
|
||||
object PlayerControlsBytecodePatch : BytecodePatch(
|
||||
setOf(LayoutConstructorFingerprint, BottomControlsInflateFingerprint)
|
||||
setOf(
|
||||
PlayerTopControlsInflateFingerprint,
|
||||
PlayerBottomControlsInflateFingerprint,
|
||||
OverlayViewInflateFingerprint,
|
||||
PlayerControlsIntegrationHookFingerprint
|
||||
)
|
||||
) {
|
||||
lateinit var showPlayerControlsFingerprintResult: MethodFingerprintResult
|
||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||
"Lapp/revanced/integrations/youtube/patches/PlayerControlsPatch;"
|
||||
|
||||
private var moveToRegisterInstructionIndex: Int = 0
|
||||
private var viewRegister: Int = 0
|
||||
private lateinit var inflateFingerprintResult: MethodFingerprintResult
|
||||
private lateinit var inflateTopControlMethod: MutableMethod
|
||||
private var inflateTopControlInsertIndex: Int = -1
|
||||
private var inflateTopControlRegister: Int = -1
|
||||
|
||||
private lateinit var inflateBottomControlMethod: MutableMethod
|
||||
private var inflateBottomControlInsertIndex: Int = -1
|
||||
private var inflateBottomControlRegister: Int = -1
|
||||
|
||||
private lateinit var visibilityMethod: MutableMethod
|
||||
private var visibilityInsertIndex: Int = 0
|
||||
|
||||
private lateinit var visibilityImmediateMethod: MutableMethod
|
||||
private var visibilityImmediateInsertIndex: Int = 0
|
||||
|
||||
override fun execute(context: BytecodeContext) {
|
||||
LayoutConstructorFingerprint.result?.let {
|
||||
if (!PlayerControlsVisibilityFingerprint.resolve(context, it.classDef))
|
||||
throw LayoutConstructorFingerprint.exception
|
||||
} ?: throw LayoutConstructorFingerprint.exception
|
||||
fun MutableMethod.indexOfFirstViewInflateOrThrow() =
|
||||
indexOfFirstInstructionOrThrow {
|
||||
val reference = getReference<MethodReference>()
|
||||
reference?.definingClass == "Landroid/view/ViewStub;" &&
|
||||
reference.name == "inflate"
|
||||
}
|
||||
|
||||
showPlayerControlsFingerprintResult = PlayerControlsVisibilityFingerprint.result!!
|
||||
PlayerBottomControlsInflateFingerprint.resultOrThrow().mutableMethod.apply{
|
||||
inflateBottomControlMethod = this
|
||||
|
||||
inflateFingerprintResult = BottomControlsInflateFingerprint.result!!.also {
|
||||
moveToRegisterInstructionIndex = it.scanResult.patternScanResult!!.endIndex
|
||||
viewRegister =
|
||||
(it.mutableMethod.implementation!!.instructions[moveToRegisterInstructionIndex] as OneRegisterInstruction).registerA
|
||||
val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1
|
||||
inflateBottomControlRegister = getInstruction<OneRegisterInstruction>(inflateReturnObjectIndex).registerA
|
||||
inflateBottomControlInsertIndex = inflateReturnObjectIndex + 1
|
||||
}
|
||||
|
||||
PlayerTopControlsInflateFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
inflateTopControlMethod = this
|
||||
|
||||
val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1
|
||||
inflateTopControlRegister = getInstruction<OneRegisterInstruction>(inflateReturnObjectIndex).registerA
|
||||
inflateTopControlInsertIndex = inflateReturnObjectIndex + 1
|
||||
}
|
||||
|
||||
ControlsOverlayVisibility.alsoResolve(
|
||||
context, PlayerTopControlsInflateFingerprint
|
||||
).mutableMethod.apply {
|
||||
visibilityMethod = this
|
||||
}
|
||||
|
||||
// Hook the fullscreen close button. Used to fix visibility
|
||||
// when seeking and other situations.
|
||||
OverlayViewInflateFingerprint.resultOrThrow().mutableMethod.apply {
|
||||
val resourceIndex = indexOfFirstWideLiteralInstructionValueReversedOrThrow(
|
||||
PlayerControlsResourcePatch.fullscreenButton
|
||||
)
|
||||
|
||||
val index = indexOfFirstInstructionOrThrow(resourceIndex) {
|
||||
opcode == Opcode.CHECK_CAST && getReference<TypeReference>()?.type ==
|
||||
"Landroid/widget/ImageView;"
|
||||
}
|
||||
val register = getInstruction<OneRegisterInstruction>(index).registerA
|
||||
|
||||
addInstruction(index + 1, "invoke-static { v$register }, " +
|
||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V")
|
||||
}
|
||||
|
||||
visibilityImmediateMethod = PlayerControlsIntegrationHookFingerprint.resultOrThrow().mutableMethod
|
||||
}
|
||||
|
||||
/**
|
||||
* Injects the code to change the visibility of controls.
|
||||
* Injects the code to initialize the controls.
|
||||
* @param descriptor The descriptor of the method which should be called.
|
||||
*/
|
||||
fun injectVisibilityCheckCall(descriptor: String) {
|
||||
showPlayerControlsFingerprintResult.mutableMethod.addInstruction(
|
||||
0,
|
||||
"""
|
||||
invoke-static {p1}, $descriptor
|
||||
"""
|
||||
internal fun initializeTopControl(descriptor: String) {
|
||||
inflateTopControlMethod.addInstruction(
|
||||
inflateTopControlInsertIndex++,
|
||||
"invoke-static { v$inflateTopControlRegister }, $descriptor->initialize(Landroid/view/View;)V"
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Injects the code to initialize the controls.
|
||||
* @param descriptor The descriptor of the method which should be calleed.
|
||||
* @param descriptor The descriptor of the method which should be called.
|
||||
*/
|
||||
fun initializeControl(descriptor: String) {
|
||||
inflateFingerprintResult.mutableMethod.addInstruction(
|
||||
moveToRegisterInstructionIndex + 1,
|
||||
"invoke-static {v$viewRegister}, $descriptor"
|
||||
fun initializeBottomControl(descriptor: String) {
|
||||
inflateBottomControlMethod.addInstruction(
|
||||
inflateBottomControlInsertIndex++,
|
||||
"invoke-static { v$inflateBottomControlRegister }, $descriptor->initializeButton(Landroid/view/View;)V"
|
||||
)
|
||||
}
|
||||
/**
|
||||
* Injects the code to change the visibility of controls.
|
||||
* @param descriptor The descriptor of the method which should be called.
|
||||
*/
|
||||
fun injectVisibilityCheckCall(descriptor: String) {
|
||||
visibilityMethod.addInstruction(
|
||||
visibilityInsertIndex++,
|
||||
"invoke-static { p1 , p2 }, $descriptor->changeVisibility(ZZ)V"
|
||||
)
|
||||
|
||||
visibilityImmediateMethod.addInstruction(
|
||||
visibilityImmediateInsertIndex++,
|
||||
"invoke-static { p0 }, $descriptor->changeVisibilityImmediate(Z)V"
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@Deprecated("Obsolete", replaceWith = ReplaceWith("initializeBottomControl"))
|
||||
fun initializeControl(descriptor: String)= initializeBottomControl(descriptor)
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols
|
||||
|
||||
import app.revanced.patcher.data.ResourceContext
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patcher.util.DomFileEditor
|
||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
||||
import app.revanced.util.copyXmlNode
|
||||
import app.revanced.util.findElementByAttributeValue
|
||||
import app.revanced.util.findElementByAttributeValueOrThrow
|
||||
import app.revanced.util.inputStreamFromBundledResource
|
||||
import org.w3c.dom.Node
|
||||
import java.io.Closeable
|
||||
|
||||
@Patch(dependencies = [ResourceMappingPatch::class])
|
||||
object PlayerControlsResourcePatch : ResourcePatch(), Closeable {
|
||||
private const val TARGET_RESOURCE_NAME = "youtube_controls_bottom_ui_container.xml"
|
||||
private const val TARGET_RESOURCE = "res/layout/$TARGET_RESOURCE_NAME"
|
||||
|
||||
internal var bottomUiContainerResourceId: Long = -1L
|
||||
internal var controlsLayoutStub: Long = -1L
|
||||
internal var heatseekerViewstub = -1L
|
||||
internal var fullscreenButton = -1L
|
||||
|
||||
private lateinit var resourceContext: ResourceContext
|
||||
|
||||
/**
|
||||
* The element to the left of the element being added.
|
||||
*/
|
||||
private var bottomLastLeftOf = "@id/fullscreen_button"
|
||||
private lateinit var bottomInsertBeforeNode: Node
|
||||
private lateinit var bottomTargetDocumentEditor: DomFileEditor
|
||||
private lateinit var bottomTargetElement : Node
|
||||
|
||||
override fun execute(context: ResourceContext) {
|
||||
bottomUiContainerResourceId = ResourceMappingPatch["id", "bottom_ui_container_stub"]
|
||||
controlsLayoutStub = ResourceMappingPatch["id", "controls_layout_stub"]
|
||||
heatseekerViewstub = ResourceMappingPatch["id", "heatseeker_viewstub"]
|
||||
fullscreenButton = ResourceMappingPatch["id", "fullscreen_button"]
|
||||
|
||||
resourceContext = context
|
||||
bottomTargetDocumentEditor = context.xmlEditor[TARGET_RESOURCE]
|
||||
val document = bottomTargetDocumentEditor.file
|
||||
|
||||
bottomTargetElement = document.getElementsByTagName(
|
||||
"android.support.constraint.ConstraintLayout"
|
||||
).item(0)
|
||||
|
||||
bottomInsertBeforeNode = document.childNodes.findElementByAttributeValue(
|
||||
"android:inflatedId",
|
||||
bottomLastLeftOf
|
||||
) ?: document.childNodes.findElementByAttributeValueOrThrow(
|
||||
"android:id", // Older targets use non inflated id.
|
||||
bottomLastLeftOf
|
||||
)
|
||||
}
|
||||
|
||||
// Internal until this is modified to work with any patch (and not just SponsorBlock).
|
||||
internal fun addTopControls(resourceDirectoryName: String) {
|
||||
val hostingResourceStream = inputStreamFromBundledResource(
|
||||
resourceDirectoryName,
|
||||
"host/layout/youtube_controls_layout.xml",
|
||||
)!!
|
||||
|
||||
val editor = resourceContext.xmlEditor["res/layout/youtube_controls_layout.xml"]
|
||||
|
||||
"RelativeLayout".copyXmlNode(
|
||||
resourceContext.xmlEditor[hostingResourceStream],
|
||||
editor,
|
||||
).use {
|
||||
val element = editor.file.childNodes.findElementByAttributeValueOrThrow(
|
||||
"android:id",
|
||||
"@id/player_video_heading"
|
||||
)
|
||||
|
||||
// FIXME: This uses hard coded values that only works with SponsorBlock.
|
||||
// If other top buttons are added by other patches, this code must be changed.
|
||||
// voting button id from the voting button view from the youtube_controls_layout.xml host file
|
||||
val votingButtonId = "@+id/revanced_sb_voting_button"
|
||||
element.attributes.getNamedItem("android:layout_toStartOf").nodeValue = votingButtonId
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new controls to the bottom of the YouTube player.
|
||||
*
|
||||
* @param resourceDirectoryName The name of the directory containing the hosting resource.
|
||||
*/
|
||||
fun addBottomControls(resourceDirectoryName: String) {
|
||||
val sourceDocumentEditor = resourceContext.xmlEditor[
|
||||
this::class.java.classLoader.getResourceAsStream(
|
||||
"$resourceDirectoryName/host/layout/$TARGET_RESOURCE_NAME",
|
||||
)!!,
|
||||
]
|
||||
|
||||
val sourceElements = sourceDocumentEditor.file.getElementsByTagName(
|
||||
"android.support.constraint.ConstraintLayout"
|
||||
).item(0).childNodes
|
||||
|
||||
// Copy the patch layout xml into the target layout file.
|
||||
for (index in 1 until sourceElements.length) {
|
||||
val element = sourceElements.item(index).cloneNode(true)
|
||||
|
||||
// If the element has no attributes there's no point to adding it to the destination.
|
||||
if (!element.hasAttributes()) continue
|
||||
|
||||
element.attributes.getNamedItem("yt:layout_constraintRight_toLeftOf").nodeValue = bottomLastLeftOf
|
||||
bottomLastLeftOf = element.attributes.getNamedItem("android:id").nodeValue
|
||||
|
||||
bottomTargetDocumentEditor.file.adoptNode(element)
|
||||
// Elements do not need to be added in the layout order since a layout constraint is used,
|
||||
// but in order is easier to make sense of while debugging.
|
||||
bottomTargetElement.insertBefore(element, bottomInsertBeforeNode)
|
||||
bottomInsertBeforeNode = element
|
||||
}
|
||||
|
||||
sourceDocumentEditor.close()
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
arrayOf(
|
||||
"@id/bottom_end_container",
|
||||
"@id/multiview_button",
|
||||
).forEach {
|
||||
bottomTargetDocumentEditor.file.childNodes.findElementByAttributeValue(
|
||||
"android:id",
|
||||
it
|
||||
)?.setAttribute("yt:layout_constraintRight_toLeftOf", bottomLastLeftOf)
|
||||
}
|
||||
|
||||
bottomTargetDocumentEditor.close()
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patches.youtube.misc.playercontrols.BottomControlsResourcePatch
|
||||
import app.revanced.util.patch.LiteralValueFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
import com.android.tools.smali.dexlib2.Opcode
|
||||
|
||||
internal object BottomControlsInflateFingerprint : LiteralValueFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC,
|
||||
returnType = "L",
|
||||
parameters = listOf(),
|
||||
opcodes = listOf(
|
||||
Opcode.CHECK_CAST,
|
||||
Opcode.INVOKE_VIRTUAL,
|
||||
Opcode.MOVE_RESULT_OBJECT
|
||||
),
|
||||
literalSupplier = { BottomControlsResourcePatch.bottomUiContainerResourceId }
|
||||
)
|
||||
@@ -4,7 +4,10 @@ import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object PlayerControlsVisibilityFingerprint : MethodFingerprint(
|
||||
/**
|
||||
* Resolves to the class found in [PlayerTopControlsInflateFingerprint].
|
||||
*/
|
||||
internal object ControlsOverlayVisibility : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL,
|
||||
returnType = "V",
|
||||
parameters = listOf("Z", "Z")
|
||||
@@ -0,0 +1,17 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.util.containsWideLiteralInstructionValue
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object OverlayViewInflateFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "V",
|
||||
parameters = listOf("Landroid/view/View;"),
|
||||
customFingerprint = { methodDef, _ ->
|
||||
methodDef.containsWideLiteralInstructionValue(PlayerControlsResourcePatch.fullscreenButton) &&
|
||||
methodDef.containsWideLiteralInstructionValue(PlayerControlsResourcePatch.heatseekerViewstub)
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.util.patch.LiteralValueFingerprint
|
||||
|
||||
internal object PlayerBottomControlsInflateFingerprint : LiteralValueFingerprint(
|
||||
returnType = "Ljava/lang/Object;",
|
||||
parameters = listOf(),
|
||||
literalSupplier = { PlayerControlsResourcePatch.bottomUiContainerResourceId }
|
||||
)
|
||||
@@ -0,0 +1,15 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object PlayerControlsIntegrationHookFingerprint : MethodFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||
returnType = "V",
|
||||
parameters = listOf("Z"),
|
||||
customFingerprint = { methodDef, classDef ->
|
||||
methodDef.name == "fullscreenButtonVisibilityChanged" &&
|
||||
classDef.type == "Lapp/revanced/integrations/youtube/patches/PlayerControlsPatch;"
|
||||
}
|
||||
)
|
||||
@@ -0,0 +1,13 @@
|
||||
package app.revanced.patches.youtube.misc.playercontrols.fingerprints
|
||||
|
||||
import app.revanced.patcher.extensions.or
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.util.patch.LiteralValueFingerprint
|
||||
import com.android.tools.smali.dexlib2.AccessFlags
|
||||
|
||||
internal object PlayerTopControlsInflateFingerprint : LiteralValueFingerprint(
|
||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||
returnType = "V",
|
||||
parameters = listOf(),
|
||||
literalSupplier = { PlayerControlsResourcePatch.controlsLayoutStub }
|
||||
)
|
||||
@@ -32,7 +32,7 @@ object PlaybackSpeedButtonPatch : BytecodePatch(emptySet()) {
|
||||
SwitchPreference("revanced_playback_speed_dialog_button"),
|
||||
)
|
||||
|
||||
PlayerControlsBytecodePatch.initializeControl("$SPEED_BUTTON_CLASS_DESCRIPTOR->initializeButton(Landroid/view/View;)V")
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall("$SPEED_BUTTON_CLASS_DESCRIPTOR->changeVisibility(Z)V")
|
||||
PlayerControlsBytecodePatch.initializeBottomControl(SPEED_BUTTON_CLASS_DESCRIPTOR)
|
||||
PlayerControlsBytecodePatch.injectVisibilityCheckCall(SPEED_BUTTON_CLASS_DESCRIPTOR)
|
||||
}
|
||||
}
|
||||
@@ -3,12 +3,12 @@ package app.revanced.patches.youtube.video.speed.button
|
||||
import app.revanced.patcher.data.ResourceContext
|
||||
import app.revanced.patcher.patch.ResourcePatch
|
||||
import app.revanced.patcher.patch.annotation.Patch
|
||||
import app.revanced.patches.youtube.misc.playercontrols.BottomControlsResourcePatch
|
||||
import app.revanced.patches.youtube.misc.playercontrols.PlayerControlsResourcePatch
|
||||
import app.revanced.util.ResourceGroup
|
||||
import app.revanced.util.copyResources
|
||||
|
||||
@Patch(
|
||||
dependencies = [BottomControlsResourcePatch::class],
|
||||
dependencies = [PlayerControlsResourcePatch::class],
|
||||
)
|
||||
internal object PlaybackSpeedButtonResourcePatch : ResourcePatch() {
|
||||
override fun execute(context: ResourceContext) {
|
||||
@@ -20,6 +20,6 @@ internal object PlaybackSpeedButtonResourcePatch : ResourcePatch() {
|
||||
),
|
||||
)
|
||||
|
||||
BottomControlsResourcePatch.addControls("speedbutton")
|
||||
PlayerControlsResourcePatch.addBottomControls("speedbutton")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
|
||||
import com.android.tools.smali.dexlib2.iface.reference.Reference
|
||||
import com.android.tools.smali.dexlib2.util.MethodUtil
|
||||
import org.stringtemplate.v4.compiler.Bytecode.instructions
|
||||
|
||||
fun MethodFingerprint.resultOrThrow() = result ?: throw exception
|
||||
|
||||
@@ -73,7 +74,7 @@ fun MutableMethod.injectHideViewCall(
|
||||
* @param resourceName the name of the resource to find the id for.
|
||||
* @return the index of the first instruction with the id of the given resource name, or -1 if not found.
|
||||
* @throws PatchException if the resource cannot be found.
|
||||
* @see [indexOfIdResourceOrThrow]
|
||||
* @see [indexOfIdResourceOrThrow], [indexOfFirstWideLiteralInstructionValueReversed]
|
||||
*/
|
||||
fun Method.indexOfIdResource(resourceName: String): Int {
|
||||
val resourceId = ResourceMappingPatch["id", resourceName]
|
||||
@@ -86,6 +87,7 @@ fun Method.indexOfIdResource(resourceName: String): Int {
|
||||
* Requires [ResourceMappingPatch] as a dependency.
|
||||
*
|
||||
* @throws [PatchException] if the resource is not found, or the method does not contain the resource id literal value.
|
||||
* @see [indexOfIdResource], [indexOfFirstWideLiteralInstructionValueReversedOrThrow]
|
||||
*/
|
||||
fun Method.indexOfIdResourceOrThrow(resourceName: String): Int {
|
||||
val index = indexOfIdResource(resourceName)
|
||||
@@ -120,6 +122,30 @@ fun Method.indexOfFirstWideLiteralInstructionValueOrThrow(literal: Long): Int {
|
||||
return index
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the index of the last wide literal instruction with the given value.
|
||||
*
|
||||
* @return the last literal instruction with the value, or -1 if not found.
|
||||
* @see indexOfFirstWideLiteralInstructionValueOrThrow
|
||||
*/
|
||||
fun Method.indexOfFirstWideLiteralInstructionValueReversed(literal: Long) = implementation?.let {
|
||||
it.instructions.indexOfLast { instruction ->
|
||||
(instruction as? WideLiteralInstruction)?.wideLiteral == literal
|
||||
}
|
||||
} ?: -1
|
||||
|
||||
/**
|
||||
* Find the index of the last wide literal instruction with the given value,
|
||||
* or throw an exception if not found.
|
||||
*
|
||||
* @return the last literal instruction with the value, or throws [PatchException] if not found.
|
||||
*/
|
||||
fun Method.indexOfFirstWideLiteralInstructionValueReversedOrThrow(literal: Long): Int {
|
||||
val index = indexOfFirstWideLiteralInstructionValueReversed(literal)
|
||||
if (index < 0) throw PatchException("Could not find literal value: $literal")
|
||||
return index
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the method contains a literal with the given value.
|
||||
*
|
||||
@@ -198,18 +224,25 @@ fun Method.indexOfFirstInstructionOrThrow(startIndex: Int = 0, predicate: Instru
|
||||
/**
|
||||
* @return The list of indices of the opcode in reverse order.
|
||||
*/
|
||||
fun Method.findOpcodeIndicesReversed(opcode: Opcode): List<Int> {
|
||||
fun Method.findOpcodeIndicesReversed(opcode: Opcode): List<Int> =
|
||||
findOpcodeIndicesReversed { this.opcode == opcode }
|
||||
|
||||
/**
|
||||
* @return The list of indices of the opcode in reverse order.
|
||||
*/
|
||||
fun Method.findOpcodeIndicesReversed(filter: Instruction.() -> Boolean): List<Int> {
|
||||
val indexes = implementation!!.instructions
|
||||
.withIndex()
|
||||
.filter { (_, instruction) -> instruction.opcode == opcode }
|
||||
.filter { (_, instruction) -> filter(instruction) }
|
||||
.map { (index, _) -> index }
|
||||
.reversed()
|
||||
|
||||
if (indexes.isEmpty()) throw PatchException("No ${opcode.name} instructions found in: $this")
|
||||
if (indexes.isEmpty()) throw PatchException("No matching instructions found in: $this")
|
||||
|
||||
return indexes
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the resolved method early.
|
||||
*/
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package app.revanced.util
|
||||
|
||||
import app.revanced.patcher.data.ResourceContext
|
||||
import app.revanced.patcher.patch.PatchException
|
||||
import app.revanced.patcher.util.DomFileEditor
|
||||
import app.revanced.util.resource.BaseResource
|
||||
import org.w3c.dom.Attr
|
||||
import org.w3c.dom.Element
|
||||
import org.w3c.dom.Node
|
||||
import org.w3c.dom.NodeList
|
||||
import java.io.InputStream
|
||||
@@ -39,6 +42,14 @@ fun Node.doRecursively(action: (Node) -> Unit) {
|
||||
for (i in 0 until this.childNodes.length) this.childNodes.item(i).doRecursively(action)
|
||||
}
|
||||
|
||||
fun Node.insertFirst(node: Node) {
|
||||
if (hasChildNodes()) {
|
||||
insertBefore(node, firstChild)
|
||||
} else {
|
||||
appendChild(node)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy resources from the current class loader to the resource directory.
|
||||
*
|
||||
@@ -49,7 +60,7 @@ fun ResourceContext.copyResources(
|
||||
sourceResourceDirectory: String,
|
||||
vararg resources: ResourceGroup,
|
||||
) {
|
||||
val targetResourceDirectory = this.get("res")
|
||||
val targetResourceDirectory = this["res", false]
|
||||
|
||||
for (resourceGroup in resources) {
|
||||
resourceGroup.resources.forEach { resource ->
|
||||
@@ -164,3 +175,37 @@ internal fun Node.addResource(
|
||||
}
|
||||
|
||||
internal fun org.w3c.dom.Document.getNode(tagName: String) = this.getElementsByTagName(tagName).item(0)
|
||||
|
||||
internal fun NodeList.findElementByAttributeValue(attributeName: String, value: String): Element? {
|
||||
for (i in 0 until length) {
|
||||
val node = item(i)
|
||||
if (node.nodeType == Node.ELEMENT_NODE) {
|
||||
val element = node as Element
|
||||
|
||||
if (element.getAttribute(attributeName) == value) {
|
||||
return element
|
||||
}
|
||||
|
||||
// Recursively search.
|
||||
val found = element.childNodes.findElementByAttributeValue(attributeName, value)
|
||||
if (found != null) {
|
||||
return found
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
internal fun NodeList.findElementByAttributeValueOrThrow(attributeName: String, value: String): Element {
|
||||
return findElementByAttributeValue(attributeName, value) ?: throw PatchException("Could not find: $attributeName $value")
|
||||
}
|
||||
|
||||
internal fun Element.copyAttributesFrom(oldContainer: Element) {
|
||||
// Copy attributes from the old element to the new element
|
||||
val attributes = oldContainer.attributes
|
||||
for (i in 0 until attributes.length) {
|
||||
val attr = attributes.item(i) as Attr
|
||||
setAttribute(attr.name, attr.value)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -147,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">إخفاء إرشادات القناة</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">تم إخفاء إرشادات القناة</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">يتم عرض إرشادات القناة</string>
|
||||
<string name="revanced_hide_chips_shelf_title">إخفاء رف الشرائح</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">تم إخفاء رف الشرائح</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">يتم عرض رف الشرائح</string>
|
||||
<string name="revanced_hide_expandable_chip_title">إخفاء الشريحة القابلة للتوسيع تحت مقاطع الفيديو</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">تم إخفاء الرقائق القابلة للتوسيع</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">يتم عرض الرقائق القابلة للتوسيع</string>
|
||||
@@ -207,9 +210,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">إخفاء بطاقات الفنان</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">تم إخفاء بطاقات الفنان</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">يتم عرض بطاقات الفنان</string>
|
||||
<string name="revanced_hide_chips_shelf_title">إخفاء رف الشرائح</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">تم إخفاء رف الشرائح</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">يتم عرض رف الشرائح</string>
|
||||
<string name="revanced_hide_attributes_section_title">إخفاء قسم الصفات</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">تم إخفاء \'الأماكن المميزة\'، أقسام الألعاب والموسيقى</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">يتم عرض \'الأماكن المميزة\'، أقسام الألعاب والموسيقى</string>
|
||||
@@ -627,15 +627,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">إخفاء تسمية الموقع</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">تم إخفاء تسمية الموقع</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">يتم عرض تسمية الموقع</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">إخفاء حفظ الصوت إلى زر قائمة التشغيل</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">تم إخفاء حفظ الصوت في قائمة التشغيل</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">يتم عرض حفظ الصوت في قائمة التشغيل</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">إخفاء استخدام هذا الزر الصوتي</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">تم إخفاء زر الصوت هذا</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">استخدم هذا الزر الصوتي يظهر</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">إخفاء زر حفظ الموسيقى</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">تم إخفاء حفظ الموسيقى</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">يتم عرض حفظ الموسيقى</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">إخفاء اقتراحات البحث</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">تم إخفاء اقتراحات البحث</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">يتم عرض اقتراحات البحث</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">إخفاء الملصقات</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">تم إخفاء الملصقات</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">يتم عرض الملصقات</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">إخفاء زر أعجبني</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">تم إخفاء زر أعجبني</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">يتم عرض زر أعجبني</string>
|
||||
@@ -1132,27 +1132,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">تم تمكين Slide to Seek</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">تم تعطيل Slide to Seek</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Spoof Client</string>
|
||||
<string name="revanced_spoof_client_screen_summary">محاكاة العميل لمنع مشكلات التشغيل</string>
|
||||
<string name="revanced_spoof_client_title">Spoof Client</string>
|
||||
<string name="revanced_spoof_client_summary_on">يتم محاكاة العميل</string>
|
||||
<string name="revanced_spoof_client_summary_off">لا يتم محاكاة العميل\n\nقد لا يعمل تشغيل الفيديو</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">إيقاف تشغيل هذا الإعداد قد يسبب مشاكل في تشغيل الفيديو.</string>
|
||||
<string name="revanced_spoof_client_type_title">نوع Spoof Client</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">فرض AVC iOS (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">ترميز فيديو iOS هو AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">ترميز فيديو iOS هو AVC أو VP9 أو AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">قد يؤدي تمكين هذا إلى تحسين عمر البطارية وإصلاح مشكلة تقطيع التشغيل.\n\nيتمتع تنسيق AVC بدقة قصوى تبلغ 1080P، وسيستخدم تشغيل الفيديو المزيد من بيانات الإنترنت مقارنةً بتنسيق VP9 أو AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">التأثيرات الجانبية لمحاكاة iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR مدعوم فقط مع ترميز AV1\n• سجل المشاهدة لا يعمل مع حساب العلامة التجارية</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">التأثيرات الجانبية لمحاكاة Android VR</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• لا يوجد فيديو HDR\n• لا يتم تشغيل مقاطع فيديو الأطفال\n• يمكن استئناف مقاطع الفيديو المتوقفة مؤقتًا بشكل عشوائي\n• مصغرات شريط تقدم فيديوهات Shorts منخفضة الجودة\n• زر إجراء التنزيل مخفي\n• بطاقات شاشة النهاية مخفية</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">محاكاة مصغرات العميل غير متوفرة (انتهت مهلة API)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">محاكاة مصغرات العميل غير متوفرة مؤقتًا: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spoof Video Streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">تزييف تدفقات الفيديو الخاصة بالعميل لمنع حدوث مشكلات أثناء التشغيل</string>
|
||||
<string name="revanced_spoof_video_streams_title">Spoof Video Streams</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">يتم تزييف تدفقات الفيديو</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">لا يتم تزييف تدفقات الفيديو\n\nقد لا يعمل تشغيل الفيديو</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">إيقاف تشغيل هذا الإعداد قد يسبب مشاكل في تشغيل الفيديو.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">العميل الافتراضي</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">فرض AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">ترميز الفيديو هو AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">ترميز الفيديو هو VP9 أو AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">لا يحتوي جهازك على فك تشفير الأجهزة VP9، وهذا الإعداد يعمل دائما عند تمكين تزييف العميل</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">قد يؤدي تمكين هذا إلى تحسين عمر البطارية وإصلاح مشكلة تقطيع التشغيل.\n\nيتمتع تنسيق AVC بدقة قصوى تبلغ 1080P، وسيستخدم تشغيل الفيديو المزيد من بيانات الإنترنت مقارنةً بتنسيق VP9 أو AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">التأثيرات الجانبية لمحاكاة iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• قد لا يتم تشغيل الأفلام أو الفيديوهات المدفوعة\n• تبدأ البثوث المباشرة من البداية\n• قد تنتهي الفيديوهات قبل النهاية بثانية واحدة\n• لا يوجد ترميز الصوت Opus</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">التأثيرات الجانبية لمحاكاة Android VR</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• قائمة المقطع الصوتي مفقودة\n• مستوى الصوت الثابت غير متوفر</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -147,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Kanal təlimatlarını gizlət</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Kanal təlimatları gizlidir</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Kanal təlimatları göstərilir</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Çip bölməsin gizlət</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Çip bölməsi gizlidir</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Çip bölməsi göstərilir</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Videoların altında genişlənən çipi gizlət</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Genişlənən çiplər gizlidir</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Genişlənən çiplər göstərilir</string>
|
||||
@@ -207,9 +210,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Sənətçi kartlarını gizlət</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Sənətçi kartları gizlidir</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Sənətçi kartları göstərilir</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Çip bölməsin gizlət</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Çip bölməsi gizlidir</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Çip bölməsi göstərilir</string>
|
||||
<string name="revanced_hide_attributes_section_title">Atributlar bölməsini gizlət</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\"Seçilən məkanlar\", Oyunlar və Musiqi bölmələri gizlidir</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\"Seçilən məkanlar\", Oyunlar və Musiqi bölmələri göstərilir</string>
|
||||
@@ -627,15 +627,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Məkan etiketini gizlət</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Məkan etiketi gizlidir</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Məkan etiketi göstərilir</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Səsi pleylistdə saxlama düyməsini gizlət</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Səsi pleylistdə saxlama gizlidir</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Səsi pleylistdə saxlama göstərilir</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">\"Bu səsi istifadə et\" düyməsini gizlət</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">\"Bu səsi istifadə et\" düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">\"Bu səsi istifadə et\" düyməsi göstərilir</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">\"Musiqini saxla\" düyməsini gizlət</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">\"Musiqini saxla\" gizlidir</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">\"Musiqini saxla\" göstərilir</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Axtarış təkliflərini gizlət</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Axtarış təklifləri gizlədilib</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Axtarış təklifləri göstərilir</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Stikerləri gizlət</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Stikerlər gizlidir</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Stikerlər göstərilir</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">\"Bəyən\" düyməsini gizlət</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Bəyənmə düyməsi gizlidir</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Bəyənmə düyməsi göstərilir</string>
|
||||
@@ -1132,27 +1132,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Axtarmaq üçün sürüşdürmə aktivdir</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Axtarmaq üçün sürüşdürmə aktiv deyil</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Qəbuledicini saxtalaşdır</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Oynatma problemlərinin olmaması üçün client-i saxtalaşdır</string>
|
||||
<string name="revanced_spoof_client_title">Qəbuledicini saxtalaşdır</string>
|
||||
<string name="revanced_spoof_client_summary_on">Qəbuledici saxtalaşdırıldı</string>
|
||||
<string name="revanced_spoof_client_summary_off">Qəbuledici dəyişməyib\n\nVideo oynatma işləməyə bilər</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Bu seçimin bağlanması, video oynatma problemlərinə səbəb ola bilər.</string>
|
||||
<string name="revanced_spoof_client_type_title">Qəbuledici saxtalaşdırma növü</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">iOS AVC-yə Zorla (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">iOS video kodlayıcı AVC-dir</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">iOS video kodlayıcı AVC, VP9 və ya AV1-dir</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Bunu aktivləşdirmə batareya ömrünü yaxşılaşdıra və oynatma donmasını düzəldə bilər.\n\nAVC maksimum 1080p görüntü imkanına malikdir və video oynadılması VP9 və ya AV1-dən daha çox internet məlumatından istifadə edəcək.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">iOS saxtakarlığının yan təsirləri</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR yalnız AV1 kodlayıcı ilə dəstəklənir\n• Baxış tarixçəsi ödəyici hesab ilə işləmir</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Android VR saxtakarlığı yan təsirləri</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• HDR video yoxdur• Uşaq videoları oynadılmır\n• Fasilə verilmiş videolar gözlənilmədən davam edə bilər\n• Aşağı keyfiyyətli Shorts axtarma çubuğu miniatürləri\n• \"Yüklə\" fəaliyyət düyməsi gizlidir\n• Bitiş ekran kartları gizlidir</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Client kiçik şəkillərini təqlid etmə əlçatmazdır (API vaxtı bitdi)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Client kiçik şəkillərini təqlid etmə müvəqqəti əlçatmazdır: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Video yayımları saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Oynatma problemlərin önləmək üçün qəbuledici video yayımların saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_title">Video yayımları saxtalaşdır</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Video yayımları saxtalaşdırılır</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Video yayımları saxtalaşmır\n\nVideo oynatma işləməyə bilər</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Bu seçimi bağlamaq, video oynatma problemlərinə səbəb olar.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">İlkin qəbuledici</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Məcburi AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Video kodlaşdırma: AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Video kodlaşdırma / VP9 və ya AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Cihazınızın VP9 hardware decoding\'i yoxdur və bu seçim, \"Qəbuledicini saxtalaşdırma\" aktivləşdikdə həmişəlikdir</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Bunu aktivləşdirmə batareya ömrünü yaxşılaşdıra və oynatma donmasını düzəldə bilər.\n\nAVC maksimum 1080p görüntü imkanına malikdir və video oynadılması VP9 və ya AV1-dən daha çox internet məlumatı istifadə edəcək.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">iOS saxtakarlığı yan təsirləri</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Filmlər və ya ödənişli videolar oynadılmaya bilər\n• Canlı yayımlar əvvəldən başlayır\n• Videolar 1 saniyə tez bitə bilər\n• Opus səs kodlama yoxdur</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Android VR saxtakarlığı yan təsirləri</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Səs axını menyusu əskikdir\n• Stabil səs səviyyəsi əlçatan deyil</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -137,6 +137,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Схаваць рэкамендацыі канала</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Правілы канала схаваны</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Паказваюцца інструкцыі па каналах</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Схавайце паліцу для чыпсаў</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Паліца для чыпсаў схаваная</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Паказана паліца для чыпсаў</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Схаваць пашыраемы чып пад відэа</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Чыпы, якія пашыраюцца, схаваныя</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Паказаны чыпы, якія пашыраюцца</string>
|
||||
@@ -197,9 +200,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Схаваць карткі выканаўцаў</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Карткі выканаўцаў схаваныя</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Паказваюцца карткі выканаўцаў</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Схавайце паліцу для чыпсаў</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Паліца для чыпсаў схаваная</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Паказана паліца для чыпсаў</string>
|
||||
<string name="revanced_hide_attributes_section_title">Схаваць раздзел атрыбутаў</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Раздзелы \"Выбраныя месцы\", гульні і музыка схаваны</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Паказваюцца раздзелы \"Выбраныя месцы\", Гульні і Музыка</string>
|
||||
@@ -608,9 +608,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Схаваць метку месцазнаходжання</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Метка месцазнаходжання схавана</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Паказана метка месцазнаходжання</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Схаваць кнопку захавання гуку ў спіс прайгравання</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Захаваць гук у плэйліст схавана</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Паказваецца Захаваць гук у спіс прайгравання</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Схаваць прапановы пошуку</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Пошукавыя прапановы схаваны</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Паказваюцца прапановы пошуку</string>
|
||||
@@ -1107,19 +1104,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Слайд для пошуку ўключаны</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Слайд для пошуку не ўключаны</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Падман кліента</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Падробка кліента, каб прадухіліць праблемы з прайграваннем</string>
|
||||
<string name="revanced_spoof_client_title">Падман кліента</string>
|
||||
<string name="revanced_spoof_client_summary_on">Кліент падроблены</string>
|
||||
<string name="revanced_spoof_client_summary_off">Кліент не падроблены\n\nПрайграванне відэа можа не працаваць</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Адключэнне гэтай налады можа выклікаць праблемы з прайграваннем відэа.</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Няма HDR-відэа\n• Дзіцячыя відэа не прайграваюцца\n• Прыпыненыя відэа могуць аднаўляцца выпадковым чынам\n• Нізкая якасць мініяцюр на панэлі пошуку Shorts\n• Кнопка дзеяння Спампаваць схавана\n• Карткі канцавога экрана схаваны</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Мініяцюры кліента Spoof недаступныя (час чакання API скончыўся)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Мініяцюры кліента Spoof часова недаступныя: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Адключэнне гэтай налады можа выклікаць праблемы з прайграваннем відэа.</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -147,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Скриване на насоките на канала</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Насоките на канала са скрити</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Насоките на канала са показани</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Скриване на рафта за чипове</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Рафтът за чипове е скрит</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Рафтът за чипове е показан</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Скриване на разширяемия чип под видеоклиповете</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Разширяващите се чипове са скрити</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Разширяващите се чипове са показани</string>
|
||||
@@ -207,9 +210,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Скриване на картите на артистите</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Картите на артистите са скрити</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Картите на артистите са показани</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Скриване на рафта за чипове</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Рафтът за чипове е скрит</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Рафтът за чипове е показан</string>
|
||||
<string name="revanced_hide_attributes_section_title">Скриване на секцията с атрибути</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">„Популярни места“, „Игри“ и „Музика“ под описанието са скрити</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">„Популярни места“, „Игри“ и „Музика“ под описанието се показват</string>
|
||||
@@ -627,9 +627,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Етикет за местоположение</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Етикет за местоположение е скрит</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Етикет за местоположение се показва</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Бутон за запазване на аудиото в плейлиста</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Бутонът за Запазване в плейлиста е скрит</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Бутонът за Запазване в плейлиста се показва</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Скриване на предложенията за търсене</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Предложенията за търсене са скрити</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Предложенията за търсене се показват</string>
|
||||
@@ -1130,25 +1127,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Слайд за превъртане е активиран</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Слайд за превъртане е деактивиран</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Подмяна на версията (на клиента)</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Подмяна на версията, за да предотвратите проблеми с възпроизвеждането на видео</string>
|
||||
<string name="revanced_spoof_client_title">Подмяна на версията (на клиента)</string>
|
||||
<string name="revanced_spoof_client_summary_on">Версията е подменена</string>
|
||||
<string name="revanced_spoof_client_summary_off">Клиентът не е подправен.\n\nВъзпроизвеждането на видео може да не работи</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Деактивирането на тази настройка ще доведе до проблеми с възпроизвеждането на видео.</string>
|
||||
<string name="revanced_spoof_client_type_title">Начин за подмяна на версията</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Принудително AVC (H.264) за iOS</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">При подмяна на клиента на iOS се използва видеокодек AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">При подмяна на клиента на iOS се използва видеокодек AVC, VP9 или AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Активирането на това може да подобри живота на батерията и да коригира прекъсванията при възпроизвеждане.\n\nAVC има максимална разделителна способност от 1080p и възпроизвеждането на видео ще използва повече интернет данни от VP9 или AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Cтранични ефекти от подмяната на iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR се поддържа само с кодек AV1\n• Историята на гледане не работи с акаунт на марка</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Странични ефекти от подправяне на Android VR</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Няма HDR видео\n• Детските видеоклипове не се възпроизвеждат\n• Поставените на пауза видеоклипове могат произволно да се възобновят\n• Нискокачествени миниатюри на лентата за търсене на Shorts\n• Бутон за действие за изтегляне е скрито\n• Картите на крайния екран са скрити</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Подправяне на видео потоци</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Подправете клиентските видео потоци, за да предотвратите проблеми с възпроизвеждането</string>
|
||||
<string name="revanced_spoof_video_streams_title">Подправяне на видео потоци</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Видео потоците са подправени</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Видео потоците не са подправени\n\nВъзпроизвеждането на видео може да не работи</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Деактивирането на тази настройка ще доведе до проблеми с възпроизвеждането на видео.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Клиент по подразбиране</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Принудително AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Видеокодека е AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Видеокодека е VP9 или AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Вашето устройство няма хардуерно VP9 декодиране и тази настройка винаги е активирана, когато е активно подправяне на клиента</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Активирането на това може да подобри живота на батерията и да коригира прекъсванията при възпроизвеждане.\n\nAVC има максимална разделителна способност от 1080p и възпроизвеждането на видео ще използва повече интернет данни от VP9 или AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">Cтранични ефекти от подмяната на iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Филми или платени видеоклипове може да не се възпроизвеждат\n• Потоците на живо започват отначало\n• Видеоклиповете може да завършват 1 секунда по-рано\n• Няма аудиокодек Opus</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Странични ефекти от подправяне на Android VR</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Липсва менюто за избор аудио\n• Не е налична стабилна сила на звука</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -137,6 +137,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">চ্যানেল নির্দেশিকা লুকান</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">চ্যানেল নির্দেশিকা লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">চ্যানেল নির্দেশিকা প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_chips_shelf_title">চিপ শেলপ লুকান</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">চিপ শেলপ লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">চিপ শেলপ প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_expandable_chip_title">ভিডিওর নিচের সম্প্রসারণযোগ্য চিপস লুকান</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">সম্প্রসারণযোগ্য চিপস লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">সম্প্রসারণযোগ্য চিপস প্রদর্শিত হয়েছে</string>
|
||||
@@ -197,9 +200,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">আর্টিস্ট কার্ড লুকান</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">আর্টিস্ট কার্ড লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">আর্টিস্ট কার্ড প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_chips_shelf_title">চিপ শেলপ লুকান</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">চিপ শেলপ লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">চিপ শেলপ প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_attributes_section_title">বৈশিষ্ট্য বিভাগ লুকান</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\'বৈশিষ্ট্যযুক্ত স্থান\', গেম এবং সঙ্গীত বিভাগগুলি লুকানো আছে</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\'বৈশিষ্ট্যযুক্ত স্থান\', গেম এবং সঙ্গীত বিভাগগুলি প্রদর্শিত হয়েছে</string>
|
||||
@@ -535,9 +535,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">অবস্থান লেবেল লুকান</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">অবস্থান লেবেল লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">অবস্থান লেবেল প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">প্লেলিস্টে সাউন্ড সংরক্ষণ করুন বোতাম লুকান</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">প্লেলিস্টে সাউন্ড সংরক্ষণ করুন বোতাম লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">প্লেলিস্টে সাউন্ড সংরক্ষণ করুন বোতাম প্রদর্শিত হয়েছে</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">অনুসন্ধান পরামর্শগুলি লুকান</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">অনুসন্ধান পরামর্শগুলি লুকিয়ে রয়েছে</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">অনুসন্ধান পরামর্শগুলি প্রদর্শিত হয়েছে</string>
|
||||
@@ -1031,19 +1028,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়েছে</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়নি</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">ক্লায়েন্ট স্পুফ করুন</string>
|
||||
<string name="revanced_spoof_client_screen_summary">প্লেব্যাক সমস্যা প্রতিরোধ করতে ক্লায়েন্ট স্পুফ করুন</string>
|
||||
<string name="revanced_spoof_client_title">ক্লায়েন্ট স্পুফ করুন</string>
|
||||
<string name="revanced_spoof_client_summary_on">ক্লায়েন্ট স্পুফ করা হয়েছে</string>
|
||||
<string name="revanced_spoof_client_summary_off">ক্লায়েন্ট স্পুফ করা হয়নি\n\nভিডিও প্লেব্যাক ঠিকমতো কাজ নাও করতে পারে</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">এই সেটিংটি বন্ধ করার ফলে ভিডিও প্লেব্যাক ত্রুটি হতে পারে।</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• কোনও HDR ভিডিও নেই\n• বাচ্চাদের ভিডিও প্লেব্যাক হয় না\n• বিরতি দেওয়া ভিডিওগুলি এলোমেলোভাবে আবার শুরু হতে পারে\n• নিম্নমানের শর্টস সিকবার থাম্বনেল\n• ডাউনলোড অ্যাকশন বোতাম সবসময় লুকানো থাকে\n• শেষ স্ক্রিন কার্ড সবসময় লুকানো থাকে</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">ক্লায়েন্ট স্পুফ থাম্বনেইল সাময়িকভাবে উপলভ্য নয় (API সময় শেষ হয়েছে)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">স্পুফ ক্লায়েন্ট থাম্বনেইল সাময়িকভাবে উপলভ্য নয়: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">এই সেটিংটি বন্ধ করার ফলে ভিডিও প্লেব্যাক ত্রুটি হতে পারে।</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -242,10 +242,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -148,6 +148,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Skrýt pokyny pro kanály</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Pokyny kanálu jsou skryty</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Jsou zobrazeny pokyny kanálu</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Skrýt čipy</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Šipka je skrytá</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Šipky jsou zobrazeny</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Skrýt rozšiřitelný čip pod videem</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Rozšiřitelné čipy jsou skryty</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Jsou zobrazeny rozšiřitelné čipy</string>
|
||||
@@ -208,9 +211,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Skrýt karty umělce</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Karty umělců jsou skryty</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Karty umělců jsou zobrazeny</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Skrýt čipy</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Šipka je skrytá</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Šipky jsou zobrazeny</string>
|
||||
<string name="revanced_hide_attributes_section_title">Skrýt část atributů</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\'Doporučená místa\', sekce Hry a hudba jsou skryté</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\'Doporučená místa\', jsou zobrazeny sekce Hry a hudba</string>
|
||||
@@ -628,15 +628,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Skrýt štítek polohy</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Štítek polohy je skrytý</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Popisek umístění je zobrazen</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Skrýt zvuk do playlistu</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Uložit zvuk do playlistu je skrytý</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Ukládat zvuk do seznamu skladeb je zobrazen</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">Skrýt toto tlačítko zvuku</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">Použít toto zvukové tlačítko je skryté</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">Použít toto zvukové tlačítko je zobrazeno</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Skrýt tlačítko uložit hudbu</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Uložení hudby je skryté</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Ukládání hudby je zobrazeno</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Skrýt návrhy hledání</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Návrhy hledání jsou skryty</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Návrhy hledání jsou zobrazeny</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Skrýt nálepky</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Samolepky jsou skryté</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Samolepky jsou zobrazeny</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Skrýt tlačítko „To se mi líbí“</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Tlačítko se mi líbí je skryté</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Tlačítko se mi líbí</string>
|
||||
@@ -1134,41 +1134,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Posunutí pro vyhledání je povoleno</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Posunutí k vyhledání není povoleno</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Sponzor</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Spořič klienta, aby zabránil problémům s přehráváním</string>
|
||||
<string name="revanced_spoof_client_title">Sponzor</string>
|
||||
<string name="revanced_spoof_client_summary_on">Klient je falešný</string>
|
||||
<string name="revanced_spoof_client_summary_off">Klient není spoofed\n\nPřehrávání videa nemusí fungovat</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Vypnutí tohoto nastavení může způsobit problémy při přehrávání videa.</string>
|
||||
<string name="revanced_spoof_client_type_title">Typ klienta</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Vynutit iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">iOS video kodek je AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">iOS video kodek je AVC, VP9 nebo AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Povolení této funkce může zlepšit životnost baterie a opravit stahování přehrávání.\n\nAVC má maximální rozlišení 1080p a video přehrávání bude používat více dat než VP9 nebo AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Boční efekty iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR je podporováno pouze s AV1 kodekem\n• Historie sledování nefunguje s obchodním účtem</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Boční efekty Android VR</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Žádné HDR video\n• Dětská videa nepřehrávají\n• Pozastavená videa mohou náhodně obnovit\n• Nízká kvalita rychlých náhledů ve vyhledávacím panelu\n• Tlačítko stahování je skryté\n• Karty na konci obrazovky jsou skryté</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Náhledy klientů nejsou k dispozici (vypršel časový limit API)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Spouštění náhledů klientů dočasně není k dispozici: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<string name="revanced_spoof_signature_verification_screen_title">Podpis aplikace</string>
|
||||
<string name="revanced_spoof_signature_verification_screen_summary">Podpis aplikace zabraňující problémům při přehrávání</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_title">Podpis aplikace</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_on">Podpis aplikace spoofed\n\nBoční efekty zahrnují:\n• Rozšířená bitrate není k dispozici\n• Videa nelze stáhnout\n• Žádné náhledy pro placená videa</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_off">Podpis aplikace není falešný\n\nPřehrávání videa nemusí fungovat</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">Vypnutí tohoto nastavení způsobí problémy při přehrávání videa.</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_title">Podpis aplikace do kanálu</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">Podpis aplikace spoofed\n\nBoční efekty zahrnují:\n• Video kanálu chybí titulky\n• Automaticky přehrávaná videa se zobrazí ve vaší historii sledování</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">Podpis aplikace není falešný pro videa s kanálem\n\nPřed zjištěním problémů s přehráváním se videa kanálu budou přehrávat méně než 1 minutu</string>
|
||||
<string name="revanced_spoof_storyboard_title">Příběh</string>
|
||||
<string name="revanced_spoof_storyboard_summary_on">Skládací krabice</string>
|
||||
<string name="revanced_spoof_storyboard_summary_off">Storyboard není falešný\n\nBoční efekty zahrnují:\n• Žádný ambientní režim\n• Náhledy v panelu vyhledávání jsou skryté</string>
|
||||
<string name="revanced_spoof_storyboard_timeout">Spoof storyboard dočasně není k dispozici (vypršel časový limit API)</string>
|
||||
<string name="revanced_spoof_storyboard_io_exception">Příběhová deska dočasně není k dispozici: %s</string>
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spouštěcí video streamy</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spouštět klientské video streamy, aby se zabránilo problémům s přehráváním</string>
|
||||
<string name="revanced_spoof_video_streams_title">Spouštěcí video streamy</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Video streamy jsou falešné</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Video streamy nejsou falešné\n\nPřehrávání videa nemusí fungovat</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Vypnutí tohoto nastavení může způsobit problémy při přehrávání videa.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Výchozí klient</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Síla AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Video kodek je AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Video kodek je VP9 nebo AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Vaše zařízení nemá hardwarové dekódování VP9 a toto nastavení je vždy zapnuto, když je aktivní spoofování klienta</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Povolení této funkce může zlepšit životnost baterie a opravit stahování přehrávání.\n\nAVC má maximální rozlišení 1080p a video přehrávání bude používat více dat než VP9 nebo AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">Boční efekty iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Filmy nebo placená videa nemusí přehrávat\n• Živočišné rekony začínající od začátku\n• Videa mohou skončit 1 sekundu na začátku\n• Žádný opus audio kodek</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Boční efekty Android VR</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Menu zvukové stopy chybí\n• Stabilní hlasitost není k dispozici</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -148,6 +148,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Skjul kanalretningslinjer</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Kanalretningslinjer er skjult</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Kanalretningslinjer er vist</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Skjul chips hylde</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Chips hylde er skjult</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Chips hylde er vist</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Skjul udvidelig chip under videoer</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Kan udvides chips er skjult</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Udvidede jetoner vises</string>
|
||||
@@ -208,9 +211,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Skjul kunstnerkort</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Kunstnerkort er skjult</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Kunstnerkort vises</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Skjul chips hylde</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Chips hylde er skjult</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Chips hylde er vist</string>
|
||||
<string name="revanced_hide_attributes_section_title">Skjul attributter sektion</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\'Udvalgte steder\', Spil og Musik sektioner er skjult</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\'Udvalgte steder\', Spil og Musik sektioner er vist</string>
|
||||
@@ -627,15 +627,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Skjul placeringsetiket</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Placeringsetiket er skjult</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Placeringsetiket er vist</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Skjul gem lyd til afspilningslisteknappen</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Gem lyd til afspilningslisten er skjult</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Gem lyd til afspilningslisten vises</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">Skjul brug denne lydknap</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">Brug denne lydknap er skjult</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">Brug denne lydknap vises</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Skjul gem musik knap</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Gem musik er skjult</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Gem musik er vist</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Skjul søgeforslag</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Søgeforslag er skjult</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Søgeforslag er vist</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Skjul klistermærker</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Klistermærker er skjult</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Klistermærker vises</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Skjul lignende knap</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Ligesom knappen er skjult</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Lideknap vises</string>
|
||||
@@ -1132,41 +1132,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Dias for at søge er aktiveret</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Dias til søgning er ikke aktiveret</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Spoof klient</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Spoof klienten for at forhindre afspilningsproblemer</string>
|
||||
<string name="revanced_spoof_client_title">Spoof klient</string>
|
||||
<string name="revanced_spoof_client_summary_on">Kunden er spoofed</string>
|
||||
<string name="revanced_spoof_client_summary_off">Klienten er ikke forfalsket\n\nVideoafspilning fungerer muligvis ikke</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">At slå denne indstilling fra kan forårsage problemer med videoafspilning.</string>
|
||||
<string name="revanced_spoof_client_type_title">Spoof klient type</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Gennemtving iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">iOS video codec er AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">iOS video codec er AVC, VP9 eller AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Aktivering af dette kan forbedre batteriets levetid og rette afspilningsstuttering.\n\nAVC har en maksimal opløsning på 1080p, og videoafspilning vil bruge flere internetdata end VP9 eller AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">iOS forfalskning bivirkninger</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR er kun understøttet med AV1 codec\n• Watch historie virker ikke med en brandkonto</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Android VR spoofing bivirkninger</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Ingen HDR-video\n• Kids videoer ikke afspilning\n• Pausede videoer kan tilfældigt genoptage\n• Lav kvalitet Kortsøgerbar miniaturer\n• Download handling knap er skjult\n• End screen cards are hidden</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Spoof klient miniaturer ikke tilgængelige (API timemed out)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Spoof klient miniaturer midlertidigt ikke tilgængelige: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<string name="revanced_spoof_signature_verification_screen_title">Spoof app signatur</string>
|
||||
<string name="revanced_spoof_signature_verification_screen_summary">Spoof app-signaturen for at forhindre afspilningsproblemer</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_title">Spoof app signatur</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_on">App signatur spoofed\n\nBivirkninger omfatter:\n• Forbedret bitrate er ikke tilgængelig\n• Videoer kan ikke downloades\n• Ingen søgelinje miniaturer til betalte videoer</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_off">App signatur ikke forfalsket\n\nVideo afspilning fungerer muligvis ikke</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">At slå denne indstilling fra vil forårsage problemer med videoafspilning.</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_title">Spoof app signatur i feed</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">App signatur spoofed\n\nBivirkninger omfatter:\n• Feed videoer mangler undertekster\n• Automatisk afspillede feed videoer vil blive vist i din ur historie</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">App signatur ikke spoofed for feed videoer\n\nFeed videoer vil spille i mindre end 1 minut, før der opstår afspilningsproblemer</string>
|
||||
<string name="revanced_spoof_storyboard_title">Spoof storyboard</string>
|
||||
<string name="revanced_spoof_storyboard_summary_on">Storyboard spoofed</string>
|
||||
<string name="revanced_spoof_storyboard_summary_off">Storyboard ikke forfalsket\n\nBivirkninger omfatter:\n• Ingen omgivende tilstand\n• Seekbar miniaturer er skjult</string>
|
||||
<string name="revanced_spoof_storyboard_timeout">Spoof storyboard midlertidigt ikke tilgængelig (API timemed out)</string>
|
||||
<string name="revanced_spoof_storyboard_io_exception">Spoof storyboard midlertidigt ikke tilgængelig: %s</string>
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spoof video streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spoof klienten video streams for at forhindre afspilning problemer</string>
|
||||
<string name="revanced_spoof_video_streams_title">Spoof video streams</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Video streams er spoofed</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Videostreams er ikke forfalskede\n\nVideoafspilning fungerer muligvis ikke</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">At slå denne indstilling fra kan forårsage problemer med videoafspilning.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Standard klient</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Gennemtving AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Video codec er AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Video-codec er VP9 eller AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Din enhed har ikke VP9 hardwareafkodning, og denne indstilling er altid tændt, når Client spoofing er aktiveret</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Aktivering af dette kan forbedre batteriets levetid og rette afspilningsstuttering.\n\nAVC har en maksimal opløsning på 1080p, og videoafspilning vil bruge flere internetdata end VP9 eller AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">iOS forfalskning bivirkninger</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Film eller betalte videoer kan ikke afspille\n• Livestreams starter fra begyndelsen\n• Videoer kan ende 1 sekund tidlig\n• Ingen opus lydkode</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Android VR spoofing bivirkninger</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Menuen Lydspor mangler\n• Stabil lydstyrke er ikke tilgængelig</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -39,6 +39,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_check_environment_not_same_patching_device">Auf einem anderen Gerät gepatcht</string>
|
||||
<string name="revanced_check_environment_manager_not_expected_installer">Nicht von ReVanced Manager installiert</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time">Vor mehr als 10 Minuten gepatcht</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_days">Vor %s Tagen gepatcht</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">APK-Erstellungsdatum ist beschädigt</string>
|
||||
</patch>
|
||||
<patch id="misc.settings.BaseSettingsResourcePatch">
|
||||
@@ -146,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Kanalrichtlinien ausblenden</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Kanal-Richtlinien sind ausgeblendet</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Kanalrichtlinien werden angezeigt</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Chips ausblenden</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Chips sind ausgeblendet</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Chips werden angezeigt</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Erweiterbaren Sektions-Chip unter Videos ausblenden</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Erweiterbare Chips sind ausgeblendet</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Erweiterbare Chips werden angezeigt</string>
|
||||
@@ -206,9 +210,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Interpretenkarten ausblenden</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Künstlerkarten sind ausgeblendet</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Interpretenkarten werden angezeigt</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Chips ausblenden</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Chips sind ausgeblendet</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Chips werden angezeigt</string>
|
||||
<string name="revanced_hide_attributes_section_title">Attributbereich ausblenden</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\'Vorgestellte Orte\', Spiele und Musik Sektionen sind ausgeblendet</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\'Vorgestellte Orte\', Spiele- und Musiksektionen werden angezeigt</string>
|
||||
@@ -626,15 +627,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Standortbezeichnung ausblenden</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Ortsbezeichnung ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Ortsbezeichnung wird angezeigt</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Speicherton in Wiedergabelisten-Button ausblenden</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Ton in Wiedergabeliste speichern ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Ton in Wiedergabeliste speichern wird angezeigt</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">Diese Sound-Taste ausblenden</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">Diese Sound-Taste ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">Diese Sound-Taste wird angezeigt</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Musikspeichern-Button ausblenden</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Musik speichern ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Musik speichern wird angezeigt</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Suchvorschläge ausblenden</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Suchvorschläge sind ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Suchvorschläge werden angezeigt</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Sticker ausblenden</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Sticker sind versteckt</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Sticker werden angezeigt</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Verstecke \"Gefällt mir\" Button</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">\"Gefällt mir\" Button ist ausgeblendet</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">\"Gefällt mir\" Button wird angezeigt</string>
|
||||
@@ -1132,41 +1133,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Slide zum Suchen ist aktiviert</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Slide zum Suchen ist nicht aktiviert</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Spoof-Client</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Spoof des Clients, um Wiedergabeprobleme zu verhindern</string>
|
||||
<string name="revanced_spoof_client_title">Spoof-Client</string>
|
||||
<string name="revanced_spoof_client_summary_on">Client ist getäuscht</string>
|
||||
<string name="revanced_spoof_client_summary_off">Client ist nicht gefälscht\n\nVideo-Wiedergabe funktioniert möglicherweise nicht</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Das Deaktivieren dieser Einstellung kann zu Videowiedergabeproblemen führen.</string>
|
||||
<string name="revanced_spoof_client_type_title">Spoof-Client-Typ</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Erzwinge iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">iOS-Video-Codec ist AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">iOS-Video-Codec ist AVC, VP9 oder AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Das Aktivieren kann die Akkulaufzeit verbessern und die Wiedergabe-Stutting beheben.\n\nAVC hat eine maximale Auflösung von 1080p, und die Videowiedergabe wird mehr Internet-Daten als VP9 oder AV1 verwenden.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">iOS Spoofing Nebeneffekte</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR wird nur mit AV1 Codec\nunterstützt • Verlauf funktioniert nicht mit einem Markenkonto</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Android VR Spoofing Nebeneffekte</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Kein HDR-Video\n• Kindervideos werden nicht wiedergegeben\n• Pausierte Videos können zufällig wieder\n• Niedrige Shorts Suchleisten-Vorschaubilder\n• Download Schaltfläche ist ausgeblendet\n• Endbildschirm-Karten werden ausgeblendet</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Spoof-Thumbnails nicht verfügbar (API-Zeitüberschreitung)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Spoof-Client-Thumbnails vorübergehend nicht verfügbar: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<string name="revanced_spoof_signature_verification_screen_title">Spoof-App-Signatur</string>
|
||||
<string name="revanced_spoof_signature_verification_screen_summary">Spoof der App-Signatur, um Wiedergabeprobleme zu vermeiden</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_title">Spoof-App-Signatur</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_on">App-Signatur gefälscht\n\nNebeneffekte beinhalten:\n• Erweiterte Bitrate ist nicht verfügbar\n• Videos können nicht\nheruntergeladen werden • Keine Suchleisten-Vorschaubilder für bezahlte Videos</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_off">App-Signatur nicht gefälscht\n\nVideowiedergabe funktioniert möglicherweise nicht</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">Das Deaktivieren dieser Einstellung führt zu Videowiedergabeproblemen.</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_title">Spoof-App-Signatur im Feed</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">App-Signatur gefälscht\n\nNebeneffekte beinhalten:\n• Feed-Videos fehlen Untertitel\n• Automatisch abgespielte Feed-Videos werden in Ihrem Überwachungsverlauf angezeigt</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">App-Signatur für Feed-Videos nicht gefälscht\n\nFeed Videos werden weniger als 1 Minute vor Wiedergabeproblemen abgespielt</string>
|
||||
<string name="revanced_spoof_storyboard_title">Spoof-Storyboard</string>
|
||||
<string name="revanced_spoof_storyboard_summary_on">Storyboard gefälscht</string>
|
||||
<string name="revanced_spoof_storyboard_summary_off">Storyboard nicht gefälscht\n\nNebeneffekte beinhalten:\n• Kein Umgebungsmodus\n• Suchleisten-Thumbnails werden ausgeblendet</string>
|
||||
<string name="revanced_spoof_storyboard_timeout">Spoof-Storyboard vorübergehend nicht verfügbar (API Timeout)</string>
|
||||
<string name="revanced_spoof_storyboard_io_exception">Spoof Storyboard vorübergehend nicht verfügbar: %s</string>
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Spoof-Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spoof der Client-Videostreams um Wiedergabeprobleme zu verhindern</string>
|
||||
<string name="revanced_spoof_video_streams_title">Spoof-Video-Streams</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Video-Streams sind gefälscht</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Video-Streams sind nicht gefälscht\n\nVideo-Wiedergabe funktioniert möglicherweise nicht</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Das Deaktivieren dieser Einstellung kann zu Videowiedergabeproblemen führen.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Standard-Client</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">AVC erzwingen (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Video Codec ist AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Video Codec ist VP9 oder AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Ihr Gerät hat keine VP9-Hardware-Dekodierung, und diese Einstellung ist immer aktiviert, wenn Client-Spoofing aktiviert ist</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Das Aktivieren kann die Akkulaufzeit verbessern und die Wiedergabe-Stutting beheben.\n\nAVC hat eine maximale Auflösung von 1080p, und die Videowiedergabe wird mehr Internet-Daten als VP9 oder AV1 verwenden.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">iOS Spoofing Nebeneffekte</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Filme oder bezahlte Videos werden möglicherweise nicht abgespielt\n• Livestreams starten von Anfang an\n• Videos enden möglicherweise 1 Sekunde früher\n• kein Opus-Audiocodec</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Android VR Spoofing Nebeneffekte</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Audio Track Menü fehlt\n• Stabile Lautstärke ist nicht verfügbar</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -147,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Οδηγίες καναλιού</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Ενότητα σχετιζόμενων λέξεων</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Επεκτάσιμα πλαίσια κάτω από τα βίντεο</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Εμφανίζονται</string>
|
||||
@@ -207,9 +210,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Κάρτες καλλιτεχνών</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Ενότητα σχετιζόμενων λέξεων</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_attributes_section_title">Ενότητα χαρακτηριστικών</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">«Προτεινόμενα μέρη», Παιχνίδια και Μουσικές ενότητες είναι κρυμμένα</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">«Προτεινόμενα μέρη», Παιχνίδια και Μουσικές ενότητες εμφανίζονται</string>
|
||||
@@ -627,15 +627,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Ετικέτα τοποθεσίας</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Κρυμμένη</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Κουμπί αποθήκευσης ήχου σε λίστα αναπαραγωγής</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Κουμπί «Αποθήκευση μουσικής»</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Εμφανίζεται</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">Απόκρυψη χρήσης αυτού του κουμπιού ήχου</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">Χρήση αυτού του κουμπιού ήχου είναι κρυμμένο</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">Χρήση αυτού του κουμπιού ήχου</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Προτάσεις αναζήτησης</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Κρυμμένες</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Αυτοκόλλητα</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Κρυμμένα</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Εμφανίζονται</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Κουμπί «Μου αρέσει»</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Κρυμμένο</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Εμφανίζεται</string>
|
||||
@@ -1133,28 +1133,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Η αναζήτηση στη γραμμή προόδου με χειρονομία οριζόντιας σάρωσης είναι ενεργοποιημένη</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Η αναζήτηση στη γραμμή προόδου με χειρονομία σάρωσης είναι απενεργοποιημένη</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Παραποίηση προγράμματος πελάτη</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Παραποίηση του προγράμματος πελάτη για την αποφυγή προβλημάτων αναπαραγωγής</string>
|
||||
<string name="revanced_spoof_client_title">Παραποίηση προγράμματος πελάτη</string>
|
||||
<string name="revanced_spoof_client_summary_on">Το πρόγραμμα πελάτη παραποιείται</string>
|
||||
<string name="revanced_spoof_client_summary_off">Το πρόγραμμα πελάτη δεν παραποιείται\n\nΗ αναπαραγωγή βίντεο ενδέχεται να μη λειτουργεί</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Η απενεργοποίηση αυτής της ρύθμισης ενδέχεται να προκαλέσει προβλήματα αναπαραγωγής βίντεο.</string>
|
||||
<string name="revanced_spoof_client_type_title">Παραποίηση τύπου πελάτη</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Εξαναγκασμός iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">Ο κωδικοποιητής βίντεο στο iOS είναι ο AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">Ο κωδικοποιητής βίντεο στο iOS είναι ο AVC, ο VP9 ή ο AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Ενεργοποιώντας αυτόν τον κωδικοποιητή ίσως να βελτιώσει κατανάλωση ενέργειας και ίσως διορθώσει κολλήματα αναπαραγωγής.\n\nΟ AVC έχει μέγιστη ανάλυση 1080p, και καταναλώνει περισσότερα δεδομένα internet από τον VP9 ή τον AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Παρενέργειες παραποίησης σε iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• Το HDR υποστηρίζεται μόνο με τον κωδικοποιητή AV1\n• Το ιστορικό παρακολούθησης δε λειτουργεί με λογαριασμό επωνυμίας</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Παρενέργειες παραποίησης σε Android VR</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Δεν υπάρχει η ποιότητα HDR στα βίντεο• Δεν λειτουργεί η αναπαραγωγή στα βίντεο για παιδιά\n• Βίντεο που έχετε θέσει σε παύση μπορεί να συνεχίσουν να παίζουν τυχαία\n• Χαμηλή ποιότητα μικρογραφιών γραμμής προόδου στα Shorts\n• Το κουμπί λήψης είναι πάντα κρυμμένο\n• Οι κάρτες τελικής οθόνης είναι πάντα κρυμμένες</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Μικρογραφίες προεπισκόπησης μη διαθέσιμες (καθυστέρηση API)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Μικρογραφίες προεπισκόπησης προσωρινά μη διαθέσιμες: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">Η εγκυρότητα της εφαρμογής δεν παραποιείται για βίντεο στη ροή\n\nΤα βίντεο στη ροή θα αναπαράγονται για λιγότερο από 1 λεπτό πριν αντιμετωπίσουν προβλήματα αναπαραγωγής</string>
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Παραποίηση ροών βίντεο</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Παραποίηση ροών βίντεο του προγράμματος πελάτη για την αποφυγή προβλημάτων αναπαραγωγής</string>
|
||||
<string name="revanced_spoof_video_streams_title">Παραποίηση ροών βίντεο</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Οι ροές βίντεο παραποιούνται</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Οι ροές βίντεο δεν παραποιούνται\n\nΗ αναπαραγωγή βίντεο ενδέχεται να μην λειτουργεί</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Η απενεργοποίηση αυτής της ρύθμισης ενδέχεται να προκαλέσει προβλήματα αναπαραγωγής βίντεο.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Προεπιλεγμένο πρόγραμμα πελάτη</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Εξαναγκασμός AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Ο κωδικοποιητής βίντεο είναι ο AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Ο κωδικοποιητής βίντεο είναι ο VP9 ή ο AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Η συσκευή σας δεν διαθέτει αποκωδικοποίηση υλικού VP9, και αυτή η ρύθμιση είναι πάντα ενεργή όταν είναι ενεργοποιημένη η παραποίηση προγράμματος πελάτη</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Ενεργοποιώντας αυτόν τον κωδικοποιητή ίσως να βελτιώσει κατανάλωση ενέργειας και ίσως διορθώσει κολλήματα αναπαραγωγής.\n\nΟ AVC έχει μέγιστη ανάλυση 1080p, και καταναλώνει περισσότερα δεδομένα internet από τον VP9 ή τον AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">Παρενέργειες παραποίησης σε iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Οι ταινίες ή τα επί πληρωμή βίντεο ενδέχεται να μην αναπαράγονται\n• Οι ζωντανές μεταδόσεις ξεκινούν από την αρχή κατά την αναπαραγωγή\n• Τα βίντεο μπορεί να τελειώνουν 1 δευτερόλεπτο νωρίτερα\n• Ο κωδικοποιητής ήχου opus δεν είναι διαθέσιμος</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Παρενέργειες παραποίησης σε Android VR</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Το μενού «Κομμάτι ήχου» λείπει\n• Η λειτουργία «Σταθερή ένταση» δεν είναι διαθέσιμη</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -36,9 +36,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_check_environment_failed_title">Comprobaciones fallidas</string>
|
||||
<string name="revanced_check_environment_dialog_open_official_source_button">Abrir sitio web oficial</string>
|
||||
<string name="revanced_check_environment_dialog_ignore_button">Ignorar</string>
|
||||
<string name="revanced_check_environment_failed_message"><h5>Esta app no parece estar parcheada por ti.</h5><br>Esta app podría no funcionar correctamente, <b> podría ser perjudicial o incluso peligrosa de usar</b>.<br><br>Estas comprobaciones implican que esta app está pre-parcheada o se ha obtenido de alguien más:<br><br><small>%1$s</small><br>Se recomienda mucho <b>desinstalar esta app y parchearla por ti mismo</b> para asegurarte de que estás usando una app segura y validada.<p><br>Si se ignora, este aviso se mostrará solo dos veces.</string>
|
||||
<string name="revanced_check_environment_not_same_patching_device">Parcheado en un dispositivo diferente</string>
|
||||
<string name="revanced_check_environment_manager_not_expected_installer">No instalado por ReVanced Manager</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time">Parcheado hace más de 10 minutos</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_days">Parcheado hace %s días</string>
|
||||
<string name="revanced_check_environment_not_near_patch_time_invalid">La fecha de compilación de APK está dañada</string>
|
||||
</patch>
|
||||
<patch id="misc.settings.BaseSettingsResourcePatch">
|
||||
@@ -98,11 +100,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_debug_toast_on_error_title">Mostrar brindis en error ReVanced</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_on">Toast mostrado si ocurre un error</string>
|
||||
<string name="revanced_debug_toast_on_error_summary_off">Toast no se muestra si ocurre un error</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">Desactivar los brindis de errores oculta todas las notificaciones de error ReVanced\n\nNo se le notificará de ningún evento inesperado.</string>
|
||||
<string name="revanced_debug_toast_on_error_user_dialog_message">Desactivar los avisos (toasts) de errores oculta todas las notificaciones de error ReVanced\n\nNo se le notificará de ningún evento inesperado.</string>
|
||||
</patch>
|
||||
<patch id="layout.hide.general.HideLayoutComponentsPatch">
|
||||
<string name="revanced_disable_like_subscribe_glow_title">Desactivar el brillo del botón de like / suscripción</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">El botón de \"Me gusta\" y \"suscribir\" no brillará cuando se mencione</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_on">El botón de \"Me gusta\" y \"Suscribir\" no brillará cuando se mencione</string>
|
||||
<string name="revanced_disable_like_subscribe_glow_summary_off">El botón de \"Me gusta\" y \"Suscribir\" brillará cuando se mencione</string>
|
||||
<string name="revanced_hide_gray_separator_title">Ocultar separador gris</string>
|
||||
<string name="revanced_hide_gray_separator_summary_on">Los separadores de grises están ocultos</string>
|
||||
@@ -111,7 +113,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_watermark_summary_on">Marca de agua oculta</string>
|
||||
<string name="revanced_hide_channel_watermark_summary_off">Marca de agua mostrada</string>
|
||||
<string name="revanced_hide_horizontal_shelves_title">Ocultar estantes horizontales</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">Los estantes están ocultos como:\n• Noticias de último momento\n• Continuar viendo\n• Explorar más canales\n• Comprar\n• Verlo de nuevo</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_on">Los estantes están ocultos como:\n• Últimas noticias\n• Continuar viendo\n• Explorar más canales\n• Comprar\n• Verlo de nuevo</string>
|
||||
<string name="revanced_hide_horizontal_shelves_summary_off">Se muestran las estanterías</string>
|
||||
<!-- 'Join' should be translated using the same localized wording YouTube displays.
|
||||
This appears in the video player for certain videos. -->
|
||||
@@ -145,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Ocultar pautas de canal</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Las pautas del canal están ocultas</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Se muestran las pautas del canal</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Ocultar estante de fichas</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">El estante de fichas está oculto</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Se muestra el estante de fichas</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Ocultar ficha expandible en videos</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Las fichas expandibles están ocultas</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Se muestran fichas expandibles</string>
|
||||
@@ -162,7 +167,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_movies_section_summary_off">Se muestra la sección de películas</string>
|
||||
<string name="revanced_hide_feed_survey_title">Ocultar encuestas</string>
|
||||
<string name="revanced_hide_feed_survey_summary_on">Las encuestas en el Inicio están ocultas</string>
|
||||
<string name="revanced_hide_feed_survey_summary_off">Se muestran encuestas en ele Inicio</string>
|
||||
<string name="revanced_hide_feed_survey_summary_off">Se muestran encuestas en el Inicio</string>
|
||||
<string name="revanced_hide_community_guidelines_title">Ocultar pautas comunitarias</string>
|
||||
<string name="revanced_hide_community_guidelines_summary_on">Las pautas comunitarias están ocultas</string>
|
||||
<string name="revanced_hide_community_guidelines_summary_off">Se muestran las pautas comunitarias</string>
|
||||
@@ -184,9 +189,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_bar_title">Ocultar barra de canal</string>
|
||||
<string name="revanced_hide_channel_bar_summary_on">Barra de canales oculta</string>
|
||||
<string name="revanced_hide_channel_bar_summary_off">Barra de canales mostrada</string>
|
||||
<string name="revanced_hide_playables_title">Ocultar los Juegos</string>
|
||||
<string name="revanced_hide_playables_summary_on">Los Juegos están ocultos</string>
|
||||
<string name="revanced_hide_playables_summary_off">Se muestran los Juegos</string>
|
||||
<string name="revanced_hide_playables_title">Ocultar los reproducibles</string>
|
||||
<string name="revanced_hide_playables_summary_on">Los reproducibles están ocultos</string>
|
||||
<string name="revanced_hide_playables_summary_off">Se muestran los reproducibles</string>
|
||||
<string name="revanced_hide_quick_actions_title">Ocultar acciones rápidas en pantalla completa</string>
|
||||
<string name="revanced_hide_quick_actions_summary_on">Las acciones rápidas están ocultas</string>
|
||||
<string name="revanced_hide_quick_actions_summary_off">Se muestran acciones rápidas</string>
|
||||
@@ -197,17 +202,14 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_image_shelf_summary_on">El estante de imágenes está oculto</string>
|
||||
<string name="revanced_hide_image_shelf_summary_off">El estante de imágenes se muestra</string>
|
||||
<string name="revanced_hide_latest_posts_ads_title">Ocultar últimos mensajes</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_on">Los últimos mensajes están ocultos</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_off">Se muestran los últimos mensajes</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_on">Las últimas publicaciones están ocultas</string>
|
||||
<string name="revanced_hide_latest_posts_ads_summary_off">Se muestran las últimas publicaciones</string>
|
||||
<string name="revanced_hide_mix_playlists_title">Ocultar listas de mezcla</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_on">Las listas de reproducción mixtas están ocultas</string>
|
||||
<string name="revanced_hide_mix_playlists_summary_off">Mezclar listas de reproducción son mostradas</string>
|
||||
<string name="revanced_hide_artist_cards_title">Ocultar tarjetas de artistas</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Las tarjetas de artistas están ocultas</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Se muestran las tarjetas del artista</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Ocultar estante de fichas</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">El estante de fichas está oculto</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Se muestra el estante de fichas</string>
|
||||
<string name="revanced_hide_attributes_section_title">Ocultar sección de atributos</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">\'Lugares destacados\', Las secciones de juegos y música están ocultas</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">\'Lugares destacados\', Se muestran las secciones de juegos y música</string>
|
||||
@@ -221,8 +223,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_info_cards_section_summary_on">La sección de tarjetas de información está oculta</string>
|
||||
<string name="revanced_hide_info_cards_section_summary_off">Se muestra la sección de tarjetas de información</string>
|
||||
<string name="revanced_hide_key_concepts_section_title">Ocultar sección \'Conceptos clave\'</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_on">la sección \'Conceptos clave\' está oculta</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_off">la sección \'Conceptos clave\' se muestra</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_on">La sección \'Conceptos clave\' está oculta</string>
|
||||
<string name="revanced_hide_key_concepts_section_summary_off">La sección \'Conceptos clave\' se muestra</string>
|
||||
<string name="revanced_hide_transcript_section_title">Ocultar sección de transcripción</string>
|
||||
<string name="revanced_hide_transcript_section_summary_on">La sección transcripción está oculta</string>
|
||||
<string name="revanced_hide_transcript_section_summary_off">Se muestra la sección transcripción</string>
|
||||
@@ -256,10 +258,11 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_keyword_content_about_summary">Los resultados de inicio/suscripción/búsqueda se filtran para ocultar el contenido que coincide con las frases de palabras clave\n\nLimitaciones\n• Los cortos no se pueden ocultar con el nombre del canal\n• Algunos componentes de la interfaz pueden no estar ocultos\n• Buscar una palabra clave no puede mostrar resultados</string>
|
||||
<string name="revanced_hide_keyword_content_about_whole_words_title">Coincidir palabras completas</string>
|
||||
<!-- Translations _must_ use a localized example. For languages that do not use spaces between words (Chinese, Japanese, etc) the English AI example should be used since no localized examples exist. Or if using machine translations, or if nobody wants to think of a localized example, then the English 'ai' example should be left as-is. -->
|
||||
<string name="revanced_hide_keyword_content_about_whole_words_summary">Rodear una palabra clave/frase con comillas dobles evitará las coincidencias parciales de títulos de vídeo y nombres de canales<br><br>Por ejemplo,<br><b>\"ia\"</b> ocultará el vídeo: <b>¿Cómo funciona la AI?</b><br>pero no ocultará: <b>¿Quieres aprender a bailar?</b></string>
|
||||
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||
<string name="revanced_hide_keyword_toast_invalid_common">No se puede usar la palabra clave: %s</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_common_whole_word_required">Añadir comillas para usar palabra clave: %s</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_conflicting">La palabra clave tiene declaraciones en conflicto: %s</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_conflicting">La palabra clave tiene declaraciones conflictivas: %s</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_length">La palabra clave es demasiado corta y requiere comillas: %s</string>
|
||||
<string name="revanced_hide_keyword_toast_invalid_broad">Palabra clave ocultará todos los vídeos: %s</string>
|
||||
</patch>
|
||||
@@ -271,7 +274,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_fullscreen_ads_summary_on">Los anuncios a pantalla completa están ocultos\n\nEsta función solo está disponible para dispositivos más antiguos</string>
|
||||
<string name="revanced_hide_fullscreen_ads_summary_off">Se muestran anuncios a pantalla completa</string>
|
||||
<string name="revanced_hide_buttoned_ads_title">Ocultar anuncios botonados</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_on">Los anuncios bloqueados están ocultos</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_on">Los anuncios botonados están ocultos</string>
|
||||
<string name="revanced_hide_buttoned_ads_summary_off">Se muestran anuncios botonados</string>
|
||||
<string name="revanced_hide_paid_promotion_label_title">Ocultar etiqueta de promoción de pago</string>
|
||||
<string name="revanced_hide_paid_promotion_label_summary_on">Etiqueta de promoción pagada está oculta</string>
|
||||
@@ -304,7 +307,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_get_premium_summary_off">Se muestran las promociones de YouTube Premium en el reproductor de vídeo</string>
|
||||
</patch>
|
||||
<patch id="ad.video.VideoAdsPatch">
|
||||
<string name="revanced_hide_video_ads_title">Ocultar video anuncios</string>
|
||||
<string name="revanced_hide_video_ads_title">Ocultar anuncios de video</string>
|
||||
<string name="revanced_hide_video_ads_summary_on">Los anuncios de vídeo están ocultos</string>
|
||||
<string name="revanced_hide_video_ads_summary_off">Los anuncios de vídeo se muestran</string>
|
||||
</patch>
|
||||
@@ -325,7 +328,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_remove_viewer_discretion_dialog_user_dialog_message">Esto no pasa por alto la restricción de edad, sino que simplemente la acepta automáticamente.</string>
|
||||
</patch>
|
||||
<patch id="interaction.downloads.DownloadsResourcePatch">
|
||||
<string name="revanced_external_downloader_screen_title">Descarga externa</string>
|
||||
<string name="revanced_external_downloader_screen_title">Descargas externa</string>
|
||||
<string name="revanced_external_downloader_screen_summary">Configuración para el uso de un descargador externo</string>
|
||||
<string name="revanced_external_downloader_title">Mostrar botón externo de descarga</string>
|
||||
<string name="revanced_external_downloader_summary_on">Botón de descarga mostrado en el reproductor</string>
|
||||
@@ -439,8 +442,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_navigation_buttons_screen_summary">Ocultar o cambiar botones en la barra de navegación</string>
|
||||
<!-- 'Home' should be translated using the same localized wording YouTube displays for the tab. -->
|
||||
<string name="revanced_hide_home_button_title">Ocultar Principal</string>
|
||||
<string name="revanced_hide_home_button_summary_on">El botón de principal está oculto</string>
|
||||
<string name="revanced_hide_home_button_summary_off">Se muestra el botón de principal</string>
|
||||
<string name="revanced_hide_home_button_summary_on">El botón de inicio está oculto</string>
|
||||
<string name="revanced_hide_home_button_summary_off">El botón de inicio es visible</string>
|
||||
<!-- 'Shorts' should be translated using the same localized wording YouTube displays the tab. -->
|
||||
<string name="revanced_hide_shorts_button_title">Ocultar Shorts</string>
|
||||
<string name="revanced_hide_shorts_button_summary_on">El botón de Shorts está oculto</string>
|
||||
@@ -624,15 +627,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Ocultar etiqueta de ubicación</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Etiqueta de ubicación oculta</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Etiqueta de ubicación mostrada</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Ocultar sonido guardado al botón de lista de reproducción</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Guardar sonido en lista de reproducción está oculto</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Guardar sonido en la lista de reproducción se muestra</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">Ocultar usar este botón de sonido</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">Usar este botón de sonido está oculto</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">Usar este botón de sonido se muestra</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Ocultar botón de guardar música</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Guardar música está oculta</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Guardar música se muestra</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Ocultar sugerencias de búsqueda</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Las sugerencias de búsqueda están ocultas</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Se muestran sugerencias de búsqueda</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Ocultar stickers</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Los pegatinas están ocultos</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Se muestran pegatinas</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Ocultar botón me gusta</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">El botón Me gusta está oculto</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Se muestra el botón Me Gusta</string>
|
||||
@@ -925,7 +928,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_sb_reset_color">Reiniciar color</string>
|
||||
<string name="revanced_sb_reset">Restablecer</string>
|
||||
<string name="revanced_sb_about">Acerca de</string>
|
||||
<string name="revanced_sb_about_api_sum">Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas de otras plataformas</string>
|
||||
<string name="revanced_sb_about_api_sum">Los datos son proporcionados por la API de SponsorBlock. Pulsa aquí para aprender más y ver las descargas para otras plataformas</string>
|
||||
</patch>
|
||||
<patch id="layout.spoofappversion.SpoofAppVersionPatch">
|
||||
<string name="revanced_spoof_app_version_title">Versión de la aplicación Spoof</string>
|
||||
@@ -970,9 +973,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_tablet_layout_user_dialog_message">Los mensajes de la comunidad no se muestran en los diseños de tablet</string>
|
||||
</patch>
|
||||
<patch id="layout.miniplayer.MiniplayerPatch">
|
||||
<string name="revanced_miniplayer_screen_title">Minijugador</string>
|
||||
<string name="revanced_miniplayer_screen_title">Minireproductor</string>
|
||||
<string name="revanced_miniplayer_screen_summary">Cambiar el estilo del reproductor minimizado de la aplicación</string>
|
||||
<string name="revanced_miniplayer_type_title">Tipo de minijugador</string>
|
||||
<string name="revanced_miniplayer_type_title">Tipo de minreproductor</string>
|
||||
<string name="revanced_miniplayer_type_entry_1">Original</string>
|
||||
<string name="revanced_miniplayer_type_entry_2">Teléfono</string>
|
||||
<string name="revanced_miniplayer_type_entry_3">Tablet</string>
|
||||
@@ -1129,41 +1132,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Deslizar para buscar está activado</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Slide to seek no está habilitado</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Cliente Falseado</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Fusiona al cliente para evitar problemas de reproducción</string>
|
||||
<string name="revanced_spoof_client_title">Cliente Falseado</string>
|
||||
<string name="revanced_spoof_client_summary_on">Cliente Falseado</string>
|
||||
<string name="revanced_spoof_client_summary_off">El cliente no está falsificado\n\nEs posible que la reproducción de vídeo no funcione</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Desactivar esta configuración puede causar problemas de reproducción de vídeo.</string>
|
||||
<string name="revanced_spoof_client_type_title">Tipo de cliente falseado</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Forzar iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">El código de vídeo de iOS es AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">El códec de vídeo de iOS es AVC, VP9 o AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Activar esto puede mejorar la vida de la batería y corregir el retraso en la reproducción.\n\nAVC tiene una resolución máxima de 1080p, y la reproducción de vídeo utilizará más datos de Internet que VP9 o AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Efectos secundarios para falseo de iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR solo es compatible con el código AV1\n• El historial de reproducción no funciona con una cuenta comercial</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Efectos secundarios de falsear RV de Android</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• No hay vídeo HDR\n• Los vídeos para niños no se reproducirán\n• Los vídeos en pausa pueden reanudar aleatoriamente\n• Miniaturas de Shorts de baja calidad\n• El botón de acción está oculto\n• Las tarjetas para la pantalla final están ocultas</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Las miniaturas del cliente de Spoof no están disponibles (API)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Las miniaturas del cliente Spoof temporalmente no están disponibles: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<string name="revanced_spoof_signature_verification_screen_title">Firma de aplicación Spoof</string>
|
||||
<string name="revanced_spoof_signature_verification_screen_summary">Espoya la firma de la aplicación para evitar problemas de reproducción</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_title">Firma de aplicación Spoof</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_on">La firma de la aplicación falseada\n\nLos efectos laterales incluyen:\n• La tasa de bits mejorada no está disponible\n• Los vídeos no se pueden descargar\n• No hay miniaturas en la barra de búsqueda para vídeos pagados</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_off">La firma de la aplicación no está falseada\n\nLa reproducción de vídeo puede no funcionar</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">Desactivar esta configuración causará problemas de reproducción de vídeo.</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_title">Spoof firma de aplicación en el feed</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">La firma de la aplicación está falseada\n\nLos efectos laterales incluyen:\n• Los vídeos alimentarios no tienen subtítulos\n• Los vídeos reproducidos automáticamente se mostrarán en tu historial de relojes</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">Firma de la aplicación no simulada para videos de feed\n\nLos vídeos alimentarios se reproducirán durante menos de 1 minuto antes de encontrar problemas de reproducción</string>
|
||||
<string name="revanced_spoof_storyboard_title">Cuadro de historias</string>
|
||||
<string name="revanced_spoof_storyboard_summary_on">Cuadro de historias falseado</string>
|
||||
<string name="revanced_spoof_storyboard_summary_off">El storyboard no está falseado\n\nLos efectos laterales incluyen:\n• Sin modo ambiente\n• Las miniaturas de la barra de búsqueda están ocultas</string>
|
||||
<string name="revanced_spoof_storyboard_timeout">El storyboard espía no está disponible temporalmente (API)</string>
|
||||
<string name="revanced_spoof_storyboard_io_exception">El storyboard espía no está disponible temporalmente: %s</string>
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Falsificación del stream de vídeo</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Falsifica el stream de vídeo del cliente para evitar problemas de reproducción</string>
|
||||
<string name="revanced_spoof_video_streams_title">Falsificación del stream de vídeo</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">El stream de vídeo está falsificado</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Los streams de vídeo no están falsificados\n\nLa reproducción de vídeo puede no funcionar</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Desactivar esta configuración puede causar problemas de reproducción de vídeo.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Cliente por defecto</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Forzar AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Codec de vídeo AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">El códec de vídeo es VP9 o AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Su dispositivo no tiene decodificación de hardware VP9, y esta configuración siempre está encendida cuando el cliente spoofing está habilitado</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Activar esto puede mejorar la vida de la batería y corregir el retraso en la reproducción.\n\nAVC tiene una resolución máxima de 1080p, y la reproducción de vídeo utilizará más datos de Internet que VP9 o AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">Efectos secundarios para la falsificación de iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Las películas o vídeos de pago pueden no reproducirse\n• Los directos empiezan desde el principio\n• Los vídeos pueden terminar 1 segundo antes\n• No hay códec de audio de Opus</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Efectos secundarios para la falsificación de Android RV</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Falta el menú de pista de audio\n• El volumen estable no está disponible</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
@@ -1179,8 +1164,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_block_audio_ads_summary_off">Anuncios de audio desbloqueados</string>
|
||||
</patch>
|
||||
<patch id="ad.embedded.EmbeddedAdsPatch">
|
||||
<string name="revanced_embedded_ads_service_unavailable">%s no está disponible. Los anuncios pueden mostrarse. Intenta cambiar a otro servicio de bloque de anuncios en la configuración.</string>
|
||||
<string name="revanced_embedded_ads_service_failed">El servidor %s devolvió un error. Los anuncios pueden mostrar. Intente cambiar a otro servicio de bloque de anuncios en la configuración.</string>
|
||||
<string name="revanced_embedded_ads_service_unavailable">%s no está disponible. Los anuncios pueden mostrarse. Intenta cambiar a otro servicio de bloqueo de anuncios en la configuración.</string>
|
||||
<string name="revanced_embedded_ads_service_failed">El servidor %s devolvió un error. Los anuncios pueden mostrar. Intente cambiar a otro servicio de bloqueo de anuncios en la configuración.</string>
|
||||
<string name="revanced_block_embedded_ads_title">Bloquear anuncios de vídeo incrustados</string>
|
||||
<string name="revanced_block_embedded_ads_entry_1">Desactivado</string>
|
||||
<string name="revanced_block_embedded_ads_entry_2">Proxy luminoso</string>
|
||||
|
||||
@@ -234,10 +234,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -234,10 +234,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -134,6 +134,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Itago ang mga alituntunin ng channel</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Nakatago ang mga alituntunin ng channel</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Ipinapakita ang mga alituntunin sa channel</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Itago ang shelf ng chips</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Nakatago ang istante ng chips</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Ipinapakita ang istante ng chips</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Itago ang napapalawak na chip sa ilalim ng mga video</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Nakatago ang mga napapalawak na chip</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Ipinapakita ang mga napapalawak na chip</string>
|
||||
@@ -194,9 +197,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Itago ang mga card ng artist</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Nakatago ang mga artist card</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Ipinapakita ang mga card ng artist</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Itago ang shelf ng chips</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Nakatago ang istante ng chips</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Ipinapakita ang istante ng chips</string>
|
||||
<string name="revanced_hide_attributes_section_title">Itago ang seksyon ng mga katangian</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Ang \"Mga itinatampok na lugar\", Mga seksyon ng Laro at Musika ay nakatago</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Ipinapakita ang \"Mga itinatampok na lugar\", Mga seksyon ng Laro at Musika</string>
|
||||
@@ -600,9 +600,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Itago ang label ng lokasyon</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Nakatago ang label ng lokasyon</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Ipinapakita ang label ng lokasyon</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Itago ang save sound to playlist button</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Nakatago ang pag-save ng tunog sa playlist</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Ang pag-save ng tunog sa playlist ay ipinapakita</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Itago ang mga mungkahi sa paghahanap</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Nakatago ang mga mungkahi sa paghahanap</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Ipinapakita ang mga mungkahi sa paghahanap</string>
|
||||
@@ -1081,17 +1078,8 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Naka-enable ang slide to seek</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Hindi pinagana ang slide to seek</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_summary">Panggagaya ang kliyente upang maiwasan ang mga isyu sa pag-playback</string>
|
||||
<string name="revanced_spoof_client_summary_on">Na-spoof ang kliyente</string>
|
||||
<string name="revanced_spoof_client_summary_off">Hindi na-spoof ang kliyente\n\nMaaaring hindi gumana ang pag-playback ng video</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Ang pag-off sa setting na ito ay maaaring magdulot ng mga isyu sa pag-playback ng video.</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Walang HDR na video\n• Hindi nagpe-playback ang mga pambata na video\n• Ang mga naka-pause na video ay maaaring random na ipagpatuloy\n• Mga thumbnail ng shorts seekbar na may mababang kalidad\n• I-download ang action button ay laging nakatago\n• Palaging nakatago ang mga end screen card</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Hindi available ang mga thumbnail ng spoof client (nag-time out ang API)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Pansamantalang hindi available ang mga thumbnail ng spoof client: %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Ang pag-off sa setting na ito ay maaaring magdulot ng mga isyu sa pag-playback ng video.</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -146,6 +146,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Masquer les règles de la chaîne</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Les règles de la chaîne sont masqués</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Les règles de la chaîne sont affichés</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Masquer l\'étagère des puces</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">L\'étagère des puces est masquée</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">L\'étagère des puces est affichée</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Masquer les options extensibles sous les vidéos</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Les puces extensibles sont masquées</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Les puces extensibles sont affichées</string>
|
||||
@@ -206,9 +209,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Masquer les cartes d\'artiste</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Les cartes d\'artiste sont masquées</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Les cartes d\'artiste sont affichées</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Masquer l\'étagère des puces</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">L\'étagère des puces est masquée</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">L\'étagère des puces est affichée</string>
|
||||
<string name="revanced_hide_attributes_section_title">Masquer la section des attributs</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Les sections « Lieux en vedette », « Jeux » et « Musique » sont masquées</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Les sections « Lieux en vedette », « Jeux » et « Musique » sont affichées</string>
|
||||
@@ -626,15 +626,15 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Masquer le libellé de l\'emplacement</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Le libellé de l\'emplacement est masqué</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Le libellé de l\'emplacement est affiché</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Masquer le bouton Enregistrer le son dans la liste de lecture</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Enregistrer le son dans la playlist est masqué</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Enregistrer le son dans la playlist est affiché</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_title">Cacher utiliser ce bouton de son</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_on">Utiliser ce bouton de son est caché</string>
|
||||
<string name="revanced_hide_shorts_use_this_sound_button_summary_off">Utiliser ce bouton de son est affiché</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Masquer le bouton \"Enregistrer la musique\" </string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">\"Enregistrer la musique\" est masqué </string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">\"Enregistrer la musique\" est affiché </string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Masquer les suggestions de recherche</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Les suggestions de recherche sont masquées</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Suggestions de recherche affichées</string>
|
||||
<string name="revanced_hide_shorts_stickers_title">Masquer les stickers</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_on">Les stickers sont masqués</string>
|
||||
<string name="revanced_hide_shorts_stickers_summary_off">Les stickers sont affichés</string>
|
||||
<string name="revanced_hide_shorts_like_button_title">Masquer le bouton \"J\'aime\"</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_on">Le bouton J\'aime est caché</string>
|
||||
<string name="revanced_hide_shorts_like_button_summary_off">Le bouton J\'aime est affiché</string>
|
||||
@@ -1131,41 +1131,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Glisser pour chercher est activé</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Glisser à chercher n\'est pas activé</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Tromper le client</string>
|
||||
<string name="revanced_spoof_client_screen_summary">Tromper le client pour empêcher les problèmes de lecture</string>
|
||||
<string name="revanced_spoof_client_title">Tromper le client</string>
|
||||
<string name="revanced_spoof_client_summary_on">Le client est trompé </string>
|
||||
<string name="revanced_spoof_client_summary_off">Le client n\'est pas trompé\n\nLa lecture de la vidéo peut ne pas fonctionner</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Désactiver ce paramètre peut causer des problèmes de lecture vidéo.</string>
|
||||
<string name="revanced_spoof_client_type_title">Falsifier le type de client</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Forcer iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">Le codec vidéo iOS est AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">Le codec vidéo iOS est AVC, VP9 ou AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Activer ceci peut améliorer la durée de vie de la batterie et corriger les erreurs de lecture.\n\nAVC a une résolution maximale de 1080p, et la lecture vidéo utilisera plus de données internet que VP9 ou AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Effets secondaires d\'usurpation iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• HDR n\'est pris en charge qu\'avec le codec AV1\n• L\'historique de la montre ne fonctionne pas avec un compte de marque</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Effets secondaires de l\'usurpation VR Android</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Aucune vidéo HDR\n• Les vidéos des enfants ne lisent pas\n• Les vidéos en pause peuvent reprendre aléatoirement\n• Les miniatures de la barre de recherche de faible qualité\n• Le bouton d\'action de téléchargement est caché\n• Les cartes de fin d\'écran sont cachées</string>
|
||||
<string name="revanced_spoof_client_storyboard_timeout">Tromper les vignettes du client non disponibles (API expirée)</string>
|
||||
<string name="revanced_spoof_client_storyboard_io_exception">Tromper les vignettes du client temporairement indisponibles : %s</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<string name="revanced_spoof_signature_verification_screen_title">Falsifier la signature de l\'application</string>
|
||||
<string name="revanced_spoof_signature_verification_screen_summary">Falsifier la signature de l\'application pour empêcher les problèmes de lecture</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_title">Falsifier la signature de l\'application</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_on">La signature de l\'application falsifiée\n\nLes effets secondaires comprennent :\n• Le débit amélioré n\'est pas disponible\n• Les vidéos ne peuvent pas être téléchargées\n• Aucune vignette de barre de recherche pour les vidéos payantes</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_summary_off">La signature de l\'application n\'a pas été falsifiée\n\nLa lecture de la vidéo peut ne pas fonctionner</string>
|
||||
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">Désactiver ce paramètre causera des problèmes de lecture vidéo.</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_title">Falsifier la signature de l\'application dans le flux</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">La signature de l\'application falsifiée\n\nLes effets secondaires comprennent :\n• Les vidéos des flux manquent de sous-titres\n• Les vidéos des flux automatiquement jouées apparaîtront dans votre historique de montre</string>
|
||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">La signature de l\'application n\'a pas été falsifiée pour les flux de vidéos\n\nLes vidéos en flux seront lues pendant moins d\'une minute avant de rencontrer des problèmes de lecture</string>
|
||||
<string name="revanced_spoof_storyboard_title">Falsifier le storyboard</string>
|
||||
<string name="revanced_spoof_storyboard_summary_on">Feuille de contes</string>
|
||||
<string name="revanced_spoof_storyboard_summary_off">Le storyboard n\'a pas falsifié\n\nLes effets secondaires incluent :\n• Aucun mode ambiant\n• Les vignettes de Seekbar sont cachées</string>
|
||||
<string name="revanced_spoof_storyboard_timeout">Spoof storyboard temporairement indisponible (API expirée)</string>
|
||||
<string name="revanced_spoof_storyboard_io_exception">Falsification de storyboard temporairement indisponible : %s</string>
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Falsifier les flux vidéo</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Falsifier les flux vidéo du client pour éviter les problèmes de lecture</string>
|
||||
<string name="revanced_spoof_video_streams_title">Falsifier les flux vidéo</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Les flux vidéo sont falsifiés</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Les flux vidéo ne sont pas falsifiés\n\nLa lecture de la vidéo pourrait ne pas fonctionner</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Désactiver ce paramètre peut causer des problèmes de lecture vidéo.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Client par défaut</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Forcer AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Le codec vidéo est AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Le codec vidéo est VP9 ou AV1</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Votre appareil ne possède pas de décodage matériel VP9, et ce paramètre est toujours activé lorsque la falsification du client est activée</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Activer ceci peut améliorer la durée de vie de la batterie et corriger les erreurs de lecture.\n\nAVC a une résolution maximale de 1080p, et la lecture vidéo utilisera plus de données internet que VP9 ou AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">Effets secondaires d\'usurpation iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Les films ou les vidéos payantes ne peuvent pas lire\n• Les Livestreams commencent depuis le début\n• Les vidéos peuvent se terminer 1 seconde tôt\n• Pas de codec audio opus</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Effets secondaires de l\'usurpation VR Android</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Le menu de la piste audio manque\n• Le volume stable n\'est pas disponible</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -147,6 +147,9 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_channel_guidelines_title">Folaigh treoirlínte cainéal</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_on">Tá treoirlínte cainéal i bhfolach</string>
|
||||
<string name="revanced_hide_channel_guidelines_summary_off">Taispeántar treoirlínte cainéal</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Folaigh seilf sliseanna</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Tá seilf sliseanna i bhfolach</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Taispeántar seilf sliseanna</string>
|
||||
<string name="revanced_hide_expandable_chip_title">Folaigh sliseanna inmhéadaithe faoi fhíseáin</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_on">Tá sceallóga leathnaithe i bhfolach</string>
|
||||
<string name="revanced_hide_expandable_chip_summary_off">Taispeántar sceallóga leathnaithe</string>
|
||||
@@ -207,9 +210,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_artist_cards_title">Folaigh cártaí ealaíontóirí</string>
|
||||
<string name="revanced_hide_artist_cards_summary_on">Tá cártaí ealaíontóirí i bhfolach</string>
|
||||
<string name="revanced_hide_artist_cards_summary_off">Taispeántar cártaí ealaíonta</string>
|
||||
<string name="revanced_hide_chips_shelf_title">Folaigh seilf sliseanna</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_on">Tá seilf sliseanna i bhfolach</string>
|
||||
<string name="revanced_hide_chips_shelf_summary_off">Taispeántar seilf sliseanna</string>
|
||||
<string name="revanced_hide_attributes_section_title">Folaigh roinn tréithe</string>
|
||||
<string name="revanced_hide_attributes_section_summary_on">Tá rannáin \'Áiteanna Réadmhaí\', Cluichí agus Ceol i bhfolach</string>
|
||||
<string name="revanced_hide_attributes_section_summary_off">Taispeántar \'Áiteanna faoi Thrácht\', rannóga Cluichí agus Ceoil</string>
|
||||
@@ -627,9 +627,6 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_hide_shorts_location_label_title">Folaigh lipéad suímh</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_on">Tá lipéad suímh i bhfolach</string>
|
||||
<string name="revanced_hide_shorts_location_label_summary_off">Taispeántar lipéad suímh</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_title">Folaigh fuaim a shábháil go cnaipe seinmliosta</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_on">Tá fuaim a shábháil go seinmliosta i bhfolach</string>
|
||||
<string name="revanced_hide_shorts_save_sound_button_summary_off">Taispeántar fuaim a shábháil go seinmliosta</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_title">Folaigh moltaí cuardaigh</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_on">Tá moltaí cuardaigh i bhfolach</string>
|
||||
<string name="revanced_hide_shorts_search_suggestions_summary_off">Taispeántar moltaí cuardaigh</string>
|
||||
@@ -1129,25 +1126,23 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
<string name="revanced_slide_to_seek_summary_on">Tá sleamhnán le lorg cumasaithe</string>
|
||||
<string name="revanced_slide_to_seek_summary_off">Níl sleamhnán le lorg cumasaithe</string>
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
<string name="revanced_spoof_client_screen_title">Cliant spoof</string>
|
||||
<string name="revanced_spoof_client_screen_summary">An cliant a shaothrú chun ceisteanna athsheinm a chosc</string>
|
||||
<string name="revanced_spoof_client_title">Cliant spoof</string>
|
||||
<string name="revanced_spoof_client_summary_on">Tá an cliant spoofed</string>
|
||||
<string name="revanced_spoof_client_summary_off">Ní dhéantar an cliant a spreagadh\n\nB\'fhéidir nach n-oibreoidh athsheinm físeáin</string>
|
||||
<string name="revanced_spoof_client_user_dialog_message">Seans go mbeidh fadhbanna athsheinm físe ag baint leis an socrú seo a mhúchadh.</string>
|
||||
<string name="revanced_spoof_client_type_title">Cineál cliant spoof</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_title">Fórsa iOS AVC (H.264)</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_on">Is é codec físe iOS AVC</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_summary_off">Is é codec físe iOS AVC, VP9, nó AV1</string>
|
||||
<string name="revanced_spoof_client_ios_force_avc_user_dialog_message">Má dhéantar é seo a chumasú, d\'fhéadfadh sé go bhfeabhsófaí saol na gceallraí agus go n-athshocraigh sé stopáil athsheinm.\n\nTá uas-taifeach 1080p ag AVC, agus úsáidfidh athsheinm físe níos mó sonraí idirlín ná mar a úsáideann VP9 nó AV1.</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_title">Fo-iarsmaí spoofing iOS</string>
|
||||
<string name="revanced_spoof_client_about_android_ios_summary">• Ní thacaítear le HDR ach le codec AV1\n• Ní oibríonn stair faire le cuntas branda</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_title">Fo-iarsmaí spoofing Android VR</string>
|
||||
<string name="revanced_spoof_client_about_android_vr_summary">• Níl físeán HDR ar bith\n• Ní athsheintear físeáin do pháistí\n• Is féidir físeáin ar sos a atosú go randamach\n• Mionsamhlacha barra cuardaigh Shorts ar chaighdeán íseal\n• Tá an cnaipe gnímh íoslódála i bhfolach\n• Tá na cártaí scáileáin deiridh i bhfolach</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
<string name="revanced_spoof_video_streams_screen_title">Sruthanna físeán spoof</string>
|
||||
<string name="revanced_spoof_video_streams_screen_summary">Spoof na sruthanna físeáin cliant chun saincheisteanna athsheinm a chosc</string>
|
||||
<string name="revanced_spoof_video_streams_title">Sruthanna físeán spoof</string>
|
||||
<string name="revanced_spoof_video_streams_summary_on">Tá sruthanna físe spoofed</string>
|
||||
<string name="revanced_spoof_video_streams_summary_off">Níl sruthanna físeáin meallta\n\nSeans nach n-oibreoidh athsheinm físe</string>
|
||||
<string name="revanced_spoof_video_streams_user_dialog_message">Seans go mbeidh fadhbanna athsheinm físe ag baint leis an socrú seo a mhúchadh.</string>
|
||||
<string name="revanced_spoof_video_streams_client_title">Cliant réamhshocraithe</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_title">Fórsa AVC (H.264)</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_on">Is é AVC (H.264) an codec físeán</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_summary_off">Is é VP9 nó AV1 an codec físeán</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_no_hardware_vp9_summary_on">Níl díchódú crua-earraí VP9 ar do ghléas, agus bíonn an socrú seo ar siúl i gcónaí nuair atá spoofing Cliant cumasaithe</string>
|
||||
<string name="revanced_spoof_video_streams_ios_force_avc_user_dialog_message">Má dhéantar é seo a chumasú, d\'fhéadfadh sé go bhfeabhsófaí saol na gceallraí agus go n-athshocraigh sé stopáil athsheinm.\n\nTá uas-taifeach 1080p ag AVC, agus úsáidfidh athsheinm físe níos mó sonraí idirlín ná mar a úsáideann VP9 nó AV1.</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_title">Fo-iarsmaí spoofing iOS</string>
|
||||
<string name="revanced_spoof_video_streams_about_ios_summary">• Ní féidir le scannáin nó físeáin íoctha a sheinm\n• Tosaíonn sruthanna beo ón tús\n• Seans go gcríochnóidh físeáin 1 soicind go luath\n• Gan codec fuaime opus</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_title">Fo-iarsmaí spoofing Android VR</string>
|
||||
<string name="revanced_spoof_video_streams_about_android_vr_summary">• Tá roghchlár rian fuaime in easnamh\n• Níl an toirt cobhsaí ar fáil</string>
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
@@ -233,10 +233,7 @@ This is because Crowdin requires temporarily flattening this file and removing t
|
||||
</patch>
|
||||
<patch id="interaction.seekbar.EnableSlideToSeekPatch">
|
||||
</patch>
|
||||
<patch id="misc.fix.playback.SpoofClientPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||
<patch id="misc.fix.playback.SpoofVideoStreamsPatch">
|
||||
</patch>
|
||||
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user