Compare commits

..

43 Commits

Author SHA1 Message Date
semantic-release-bot
a3ba92e742 chore: Release v5.37.0-dev.4 [skip ci]
# [5.37.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.3...v5.37.0-dev.4) (2025-09-14)

### Bug Fixes

* **YouTube Music - Spoof streaming data:** Fix audio playback stuttering ([#5839](https://github.com/ReVanced/revanced-patches/issues/5839)) ([2a85a3b](2a85a3b290))
2025-09-14 18:22:57 +00:00
LisoUseInAIKyrios
2a85a3b290 fix(YouTube Music - Spoof streaming data): Fix audio playback stuttering (#5839) 2025-09-14 22:19:13 +04:00
semantic-release-bot
eee72208dd chore: Release v5.37.0-dev.3 [skip ci]
# [5.37.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.2...v5.37.0-dev.3) (2025-09-14)

### Bug Fixes

* **Spotify:** Remove broken `Spoof client` patch ([#5833](https://github.com/ReVanced/revanced-patches/issues/5833)) ([dcd4245](dcd42454bd))
2025-09-14 17:15:28 +00:00
LisoUseInAIKyrios
dcd42454bd fix(Spotify): Remove broken Spoof client patch (#5833) 2025-09-14 21:11:15 +04:00
LisoUseInAIKyrios
782353c18a refactor(Spoof video streams): Handle migration of default spoof client for users upgrading from very old patches 2025-09-14 18:06:40 +04:00
semantic-release-bot
b53b870e8f chore: Release v5.37.0-dev.2 [skip ci]
# [5.37.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.1...v5.37.0-dev.2) (2025-09-14)

### Bug Fixes

* Resolve patching with dev branch ([09b941a](09b941abf0))
2025-09-14 12:00:38 +00:00
LisoUseInAIKyrios
09b941abf0 fix: Resolve patching with dev branch 2025-09-14 15:58:05 +04:00
semantic-release-bot
678ef4052e chore: Release v5.37.0-dev.1 [skip ci]
# [5.37.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.36.0...v5.37.0-dev.1) (2025-09-14)

### Features

* **Viber:** Add `Hide ads` patch ([#5826](https://github.com/ReVanced/revanced-patches/issues/5826)) ([0abfab7](0abfab79d7))
2025-09-14 11:52:21 +00:00
Samo Hribar
0abfab79d7 feat(Viber): Add Hide ads patch (#5826) 2025-09-14 15:49:52 +04:00
LisoUseInAIKyrios
61cadf72cd refactor(Spoof video streams): Back port code from v22 branch to support patching the latest YT Music. Using any target above 7.49.52 is untested and only recommended for experimental or development purposes. 2025-09-14 15:49:35 +04:00
github-actions[bot]
e12359b94f chore: Sync translations (#5829) 2025-09-14 15:46:32 +04:00
semantic-release-bot
c001daba4a chore: Release v5.36.0 [skip ci]
# [5.36.0](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0) (2025-09-14)

### Bug Fixes

* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](88b47ef414))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](8cd8e59bbc))
* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](a53b00dd51))

### Features

* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](9d4aa5cd16))
2025-09-14 06:56:22 +00:00
LisoUseInAIKyrios
e136f62d6e chore: Merge branch dev to main (#5800) 2025-09-14 10:53:28 +04:00
semantic-release-bot
8ec405a359 chore: Release v5.36.0-dev.1 [skip ci]
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13)

### Bug Fixes

* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](88b47ef414))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](8cd8e59bbc))
* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](a53b00dd51))

### Features

* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](9d4aa5cd16))
2025-09-13 15:31:54 +00:00
github-actions[bot]
2f4b3a887b chore: Sync translations (#5821) 2025-09-13 19:28:15 +04:00
semantic-release-bot
d1fabb242b chore: Release v5.36.0-dev.1 [skip ci]
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13)

### Bug Fixes

* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](88b47ef414))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](8cd8e59bbc))
* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](a53b00dd51))

### Features

* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](9d4aa5cd16))
2025-09-13 15:15:40 +00:00
LisoUseInAIKyrios
a53b00dd51 fix(YouTube Music): Resolve playback issues, change recommended app target to 7.29.52 (#5813) 2025-09-13 19:12:00 +04:00
semantic-release-bot
850c13e98e chore: Release v5.36.0-dev.1 [skip ci]
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13)

### Bug Fixes

* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](88b47ef414))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](8cd8e59bbc))

### Features

* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](9d4aa5cd16))
2025-09-13 07:00:16 +00:00
LisoUseInAIKyrios
4310789a26 chore: Fix api 2025-09-13 10:56:43 +04:00
semantic-release-bot
c4a720fbd3 chore: Release v5.36.0-dev.1 [skip ci]
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-12)

### Bug Fixes

* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](88b47ef414))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](8cd8e59bbc))

### Features

* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](9d4aa5cd16))
2025-09-12 15:08:03 +00:00
LisoUseInAIKyrios
3bdb8dbce0 chore(YouTube - SponsorBlock): Adjust strings for consistency / clarity
Strings taken from https://github.com/ajayyy/ExtensionTranslations/blob/master/en/messages.json
2025-09-12 18:49:34 +04:00
LisoUseInAIKyrios
4894f33c96 chore: fix compilation 2025-09-12 18:49:33 +04:00
semantic-release-bot
7f6093ee66 chore: Release v5.36.0-dev.1 [skip ci]
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.1-dev.1...v5.36.0-dev.1) (2025-09-12)

### Features

* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](9d4aa5cd16))
2025-09-12 01:59:47 +00:00
LisoUseInAIKyrios
9d4aa5cd16 feat(YouTube - SponsorBlock): Add 'Hook' segment category (#5783) 2025-09-12 05:56:50 +04:00
oSumAtrIX
5ace6f587c chore: Add ads.fund verification file [skip ci] (#5786) 2025-09-11 16:00:24 +02:00
semantic-release-bot
796f56745e chore: Release v5.35.1-dev.1 [skip ci]
## [5.35.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.35.1-dev.1) (2025-09-11)

### Bug Fixes

* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](88b47ef414))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](8cd8e59bbc))
2025-09-11 01:29:16 +00:00
hoodles
88b47ef414 fix(Duolingo - Disable ads): Support latest app target (#5782) 2025-09-11 03:26:28 +02:00
LisoUseInAIKyrios
8cd8e59bbc fix(YouTube - Hide layout components): Hide new type of Playable shelf 2025-09-11 03:24:09 +02:00
LisoUseInAIKyrios
6e72b14d07 refactor(YouTube - Video Quality): Handle extremely slow internet connections that initially can use -1 quality index 2025-09-11 02:58:33 +02:00
LisoUseInAIKyrios
52b088327b chore: Fix api dump 2025-09-10 21:58:27 +02:00
semantic-release-bot
8e934cc56b chore: Release v5.35.0 [skip ci]
# [5.35.0](https://github.com/ReVanced/revanced-patches/compare/v5.34.0...v5.35.0) (2025-09-09)

### Bug Fixes

* **Instagram - Hide navigation buttons:** Fix Manager patching error ([0a8cd7a](0a8cd7a7db))
* **Proton mail:** Constrain patches to last working app target ([1895291](189529151a))
* Revert dependency updates to fix Manager pre-release patching ([9256aa4](9256aa4548))
* **Spotify - Unlock Premium:** Make compatible with latest versions again by fixing fingerprint ([#5684](https://github.com/ReVanced/revanced-patches/issues/5684)) ([23496c7](23496c7c36))
* **YouTube - Hide layout components:** Hide Playable shelf header ([1473db0](1473db0bef))

### Features

* **BaconReader:** Add `Fix Redgifs API` patch ([#5761](https://github.com/ReVanced/revanced-patches/issues/5761)) ([144af2f](144af2f07e))
* **Boost/Sync for Reddit:** Add `Fix Redgifs` patch  ([#5725](https://github.com/ReVanced/revanced-patches/issues/5725)) ([c66c42e](c66c42e946))
* **Instagram:** Add `Hide navigation buttons` patch ([#5678](https://github.com/ReVanced/revanced-patches/issues/5678)) ([1dbc2d4](1dbc2d4057))
* **Instagram:** Add `Hide Stories from Home` patch ([#5756](https://github.com/ReVanced/revanced-patches/issues/5756)) ([b8629aa](b8629aacb6))
2025-09-09 19:38:18 +00:00
LisoUseInAIKyrios
b3140d909b chore: Merge branch dev to main (#5691) 2025-09-09 21:34:30 +02:00
github-actions[bot]
97645aa9f4 chore: Sync translations (#5777) 2025-09-09 21:32:56 +02:00
semantic-release-bot
603e2d018c chore: Release v5.35.0-dev.5 [skip ci]
# [5.35.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.4...v5.35.0-dev.5) (2025-09-06)

### Features

* **BaconReader:** Add `Fix Redgifs API` patch ([#5761](https://github.com/ReVanced/revanced-patches/issues/5761)) ([144af2f](144af2f07e))
* **Instagram:** Add `Hide Stories from Home` patch ([#5756](https://github.com/ReVanced/revanced-patches/issues/5756)) ([b8629aa](b8629aacb6))
2025-09-06 10:56:54 +00:00
Eric Ahn
144af2f07e feat(BaconReader): Add Fix Redgifs API patch (#5761) 2025-09-06 12:53:26 +02:00
PainfulPaladins
b8629aacb6 feat(Instagram): Add Hide Stories from Home patch (#5756) 2025-09-06 12:53:08 +02:00
github-actions[bot]
3951527f51 chore: Sync translations (#5768) 2025-09-06 12:52:48 +02:00
semantic-release-bot
7a8b618c4e chore: Release v5.35.0-dev.4 [skip ci]
# [5.35.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.3...v5.35.0-dev.4) (2025-09-04)

### Features

* **Boost/Sync for Reddit:** Add `Fix Redgifs` patch  ([#5725](https://github.com/ReVanced/revanced-patches/issues/5725)) ([c66c42e](c66c42e946))
2025-09-04 21:33:33 +00:00
Eric Ahn
c66c42e946 feat(Boost/Sync for Reddit): Add Fix Redgifs patch (#5725) 2025-09-04 23:29:58 +02:00
semantic-release-bot
b340769cf3 chore: Release v5.35.0-dev.3 [skip ci]
# [5.35.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.2...v5.35.0-dev.3) (2025-09-04)

### Bug Fixes

* **Instagram - Hide navigation buttons:** Fix Manager patching error ([0a8cd7a](0a8cd7a7db))
2025-09-04 14:06:03 +00:00
LisoUseInAIKyrios
0a8cd7a7db fix(Instagram - Hide navigation buttons): Fix Manager patching error 2025-09-04 16:01:50 +02:00
semantic-release-bot
39f90e4b11 chore: Release v5.35.0-dev.2 [skip ci]
# [5.35.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.1...v5.35.0-dev.2) (2025-09-04)

### Bug Fixes

* Revert dependency updates to fix Manager pre-release patching ([9256aa4](9256aa4548))
2025-09-04 10:27:39 +00:00
LisoUseInAIKyrios
9256aa4548 fix: Revert dependency updates to fix Manager pre-release patching 2025-09-04 12:23:56 +02:00
124 changed files with 1685 additions and 769 deletions

View File

@@ -12,10 +12,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v5
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'

View File

@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v4
- name: Open pull request
uses: repo-sync/pull-request@v2

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v4
with:
ref: dev
clean: true

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v4
- name: Preprocess strings
env:

View File

@@ -18,10 +18,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v5
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
@@ -51,14 +51,14 @@ jobs:
fingerprint: ${{ vars.GPG_FINGERPRINT }}
- name: Release
uses: cycjimmy/semantic-release-action@v5
uses: cycjimmy/semantic-release-action@v4
id: release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Attest
if: steps.release.outputs.new_release_published == 'true'
uses: actions/attest-build-provenance@v3
uses: actions/attest-build-provenance@v2
with:
subject-name: 'ReVanced Patches ${{ steps.release.outputs.new_release_git_tag }}'
subject-path: patches/build/libs/patches-*.rvp

View File

@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
uses: actions/checkout@v4
- name: Update Gradle Wrapper
uses: gradle-update/update-gradle-wrapper-action@v1

View File

@@ -1,3 +1,162 @@
# [5.37.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.3...v5.37.0-dev.4) (2025-09-14)
### Bug Fixes
* **YouTube Music - Spoof streaming data:** Fix audio playback stuttering ([#5839](https://github.com/ReVanced/revanced-patches/issues/5839)) ([2a85a3b](https://github.com/ReVanced/revanced-patches/commit/2a85a3b29092729ae16d1fd93803634ce5f08e95))
# [5.37.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.2...v5.37.0-dev.3) (2025-09-14)
### Bug Fixes
* **Spotify:** Remove broken `Spoof client` patch ([#5833](https://github.com/ReVanced/revanced-patches/issues/5833)) ([dcd4245](https://github.com/ReVanced/revanced-patches/commit/dcd42454bd5f87dddd720534f6120c4ef90063a3))
# [5.37.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.37.0-dev.1...v5.37.0-dev.2) (2025-09-14)
### Bug Fixes
* Resolve patching with dev branch ([09b941a](https://github.com/ReVanced/revanced-patches/commit/09b941abf0e8029999565082b02a88b5de507ec4))
# [5.37.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.36.0...v5.37.0-dev.1) (2025-09-14)
### Features
* **Viber:** Add `Hide ads` patch ([#5826](https://github.com/ReVanced/revanced-patches/issues/5826)) ([0abfab7](https://github.com/ReVanced/revanced-patches/commit/0abfab79d7cda15bf17c53679fbfffb021662649))
# [5.36.0](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0) (2025-09-14)
### Bug Fixes
* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0))
* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](https://github.com/ReVanced/revanced-patches/commit/a53b00dd514dbe2b3406f3c1013a4f58a7f481c5))
### Features
* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe))
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13)
### Bug Fixes
* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0))
* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](https://github.com/ReVanced/revanced-patches/commit/a53b00dd514dbe2b3406f3c1013a4f58a7f481c5))
### Features
* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe))
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13)
### Bug Fixes
* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0))
* **YouTube Music:** Resolve playback issues, change recommended app target to `7.29.52` ([#5813](https://github.com/ReVanced/revanced-patches/issues/5813)) ([a53b00d](https://github.com/ReVanced/revanced-patches/commit/a53b00dd514dbe2b3406f3c1013a4f58a7f481c5))
### Features
* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe))
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-13)
### Bug Fixes
* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0))
### Features
* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe))
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.36.0-dev.1) (2025-09-12)
### Bug Fixes
* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([88b47ef](https://github.com/ReVanced/revanced-patches/commit/88b47ef414cd073ec3800258b32aceb6f383a411))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([8cd8e59](https://github.com/ReVanced/revanced-patches/commit/8cd8e59bbc3a878269276b8ae5f627b044d157f0))
### Features
* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([9d4aa5c](https://github.com/ReVanced/revanced-patches/commit/9d4aa5cd16a6f9e95cf7c626351b46b86ca80efe))
# [5.36.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.1-dev.1...v5.36.0-dev.1) (2025-09-12)
### Features
* **YouTube - SponsorBlock:** Add 'Hook' segment category ([#5783](https://github.com/ReVanced/revanced-patches/issues/5783)) ([2e042c4](https://github.com/ReVanced/revanced-patches/commit/2e042c4b3366fa3daf991d5560fcae991d00ad12))
## [5.35.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.35.0...v5.35.1-dev.1) (2025-09-11)
### Bug Fixes
* **Duolingo - Disable ads:** Support latest app target ([#5782](https://github.com/ReVanced/revanced-patches/issues/5782)) ([8491516](https://github.com/ReVanced/revanced-patches/commit/849151637389b8f399356d0d331bb74482f3f05d))
* **YouTube - Hide layout components:** Hide new type of Playable shelf ([3af4126](https://github.com/ReVanced/revanced-patches/commit/3af41265338ddaab52d009f53370c57abddd4599))
# [5.35.0](https://github.com/ReVanced/revanced-patches/compare/v5.34.0...v5.35.0) (2025-09-09)
### Bug Fixes
* **Instagram - Hide navigation buttons:** Fix Manager patching error ([0d10e94](https://github.com/ReVanced/revanced-patches/commit/0d10e94663283fac09f3efc57c9b9805c38c4e13))
* **Proton mail:** Constrain patches to last working app target ([21c34b9](https://github.com/ReVanced/revanced-patches/commit/21c34b908e07a97de8c31c7c828b44a8cc4739b6))
* Revert dependency updates to fix Manager pre-release patching ([4c7a1a8](https://github.com/ReVanced/revanced-patches/commit/4c7a1a8554c67797bf663e5230f566c5a9b229af))
* **Spotify - Unlock Premium:** Make compatible with latest versions again by fixing fingerprint ([#5684](https://github.com/ReVanced/revanced-patches/issues/5684)) ([30dcff1](https://github.com/ReVanced/revanced-patches/commit/30dcff13a56883efc499b71faadb403877cd1c67))
* **YouTube - Hide layout components:** Hide Playable shelf header ([fbb5046](https://github.com/ReVanced/revanced-patches/commit/fbb50463f0e3f533a278c5251cfbce59f09ce641))
### Features
* **BaconReader:** Add `Fix Redgifs API` patch ([#5761](https://github.com/ReVanced/revanced-patches/issues/5761)) ([08868c0](https://github.com/ReVanced/revanced-patches/commit/08868c00d3c4f1f37f4a77f333a03ca5a3259b59))
* **Boost/Sync for Reddit:** Add `Fix Redgifs` patch ([#5725](https://github.com/ReVanced/revanced-patches/issues/5725)) ([c5e8079](https://github.com/ReVanced/revanced-patches/commit/c5e8079eab08075a72078cd0fa79f3beb1f75d98))
* **Instagram:** Add `Hide navigation buttons` patch ([#5678](https://github.com/ReVanced/revanced-patches/issues/5678)) ([415cf0f](https://github.com/ReVanced/revanced-patches/commit/415cf0fb5b9b3dcaf4592943a69eea1c10447b07))
* **Instagram:** Add `Hide Stories from Home` patch ([#5756](https://github.com/ReVanced/revanced-patches/issues/5756)) ([3ae3251](https://github.com/ReVanced/revanced-patches/commit/3ae3251dc0317b6ced136fe9aa14be369642f203))
# [5.35.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.4...v5.35.0-dev.5) (2025-09-06)
### Features
* **BaconReader:** Add `Fix Redgifs API` patch ([#5761](https://github.com/ReVanced/revanced-patches/issues/5761)) ([08868c0](https://github.com/ReVanced/revanced-patches/commit/08868c00d3c4f1f37f4a77f333a03ca5a3259b59))
* **Instagram:** Add `Hide Stories from Home` patch ([#5756](https://github.com/ReVanced/revanced-patches/issues/5756)) ([3ae3251](https://github.com/ReVanced/revanced-patches/commit/3ae3251dc0317b6ced136fe9aa14be369642f203))
# [5.35.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.3...v5.35.0-dev.4) (2025-09-04)
### Features
* **Boost/Sync for Reddit:** Add `Fix Redgifs` patch ([#5725](https://github.com/ReVanced/revanced-patches/issues/5725)) ([c5e8079](https://github.com/ReVanced/revanced-patches/commit/c5e8079eab08075a72078cd0fa79f3beb1f75d98))
# [5.35.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.2...v5.35.0-dev.3) (2025-09-04)
### Bug Fixes
* **Instagram - Hide navigation buttons:** Fix Manager patching error ([0d10e94](https://github.com/ReVanced/revanced-patches/commit/0d10e94663283fac09f3efc57c9b9805c38c4e13))
# [5.35.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.35.0-dev.1...v5.35.0-dev.2) (2025-09-04)
### Bug Fixes
* Revert dependency updates to fix Manager pre-release patching ([4c7a1a8](https://github.com/ReVanced/revanced-patches/commit/4c7a1a8554c67797bf663e5230f566c5a9b229af))
# [5.35.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.34.1-dev.3...v5.35.0-dev.1) (2025-09-03)

8
adsfund.json Normal file
View File

@@ -0,0 +1,8 @@
{
"info": "This is verification file for ads.fund project",
"project": {
"name": "Revanced Patches",
"walletAddress": "0x7ab4091e00363654bf84B34151225742cd92FCE5",
"tokenAddress": "0xadf325f255083a3f3d9a9d01ffb3db52a148d802"
}
}

View File

@@ -0,0 +1,5 @@
dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(libs.annotation)
compileOnly(libs.okhttp)
}

View File

@@ -0,0 +1 @@
<manifest/>

View File

@@ -0,0 +1,22 @@
package app.revanced.extension.baconreader;
import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch;
import okhttp3.OkHttpClient;
/**
* @noinspection unused
*/
public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch {
static {
INSTANCE = new FixRedgifsApiPatch();
}
public String getDefaultUserAgent() {
// BaconReader uses a static user agent for Redgifs API calls
return "BaconReader";
}
public static OkHttpClient install(OkHttpClient.Builder builder) {
return builder.addInterceptor(INSTANCE).build();
}
}

View File

@@ -1,4 +1,6 @@
dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:boostforreddit:stub"))
compileOnly(libs.annotation)
compileOnly(libs.okhttp)
}

View File

@@ -0,0 +1,22 @@
package app.revanced.extension.boostforreddit;
import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch;
import okhttp3.OkHttpClient;
/**
* @noinspection unused
*/
public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch {
static {
INSTANCE = new FixRedgifsApiPatch();
}
public String getDefaultUserAgent() {
// Boost uses a static user agent for Redgifs API calls
return "Boost";
}
public static OkHttpClient createClient() {
return new OkHttpClient.Builder().addInterceptor(INSTANCE).build();
}
}

View File

@@ -1,3 +1,9 @@
dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:youtube:stub"))
compileOnly(libs.annotation)
}
android {
defaultConfig {
minSdk = 26

View File

@@ -0,0 +1,23 @@
package app.revanced.extension.music.patches.spoof;
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_43_32;
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48;
import app.revanced.extension.shared.spoof.ClientType;
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
@SuppressWarnings("unused")
public class SpoofVideoStreamsPatch {
/**
* Injection point.
*/
public static void setClientOrderToUse() {
ClientType[] availableClients = {
ANDROID_VR_1_43_32,
ANDROID_VR_1_61_48,
};
StreamingDataRequest.setClientOrderToUse(availableClients, ANDROID_VR_1_43_32);
}
}

View File

@@ -1,27 +0,0 @@
package app.revanced.extension.music.spoof;
/**
* @noinspection unused
*/
public class SpoofClientPatch {
private static final int CLIENT_TYPE_ID = 26;
private static final String CLIENT_VERSION = "6.21";
private static final String DEVICE_MODEL = "iPhone16,2";
private static final String OS_VERSION = "17.7.2.21H221";
public static int getClientId() {
return CLIENT_TYPE_ID;
}
public static String getClientVersion() {
return CLIENT_VERSION;
}
public static String getClientModel() {
return DEVICE_MODEL;
}
public static String getOsVersion() {
return OS_VERSION;
}
}

View File

@@ -1,3 +1,4 @@
dependencies {
implementation(project(":extensions:shared:library"))
compileOnly(libs.okhttp)
}

View File

@@ -18,4 +18,5 @@ android {
dependencies {
compileOnly(libs.annotation)
compileOnly(libs.okhttp)
}

View File

@@ -0,0 +1,71 @@
package app.revanced.extension.shared.fixes.redgifs;
import androidx.annotation.NonNull;
import org.json.JSONException;
import java.io.IOException;
import java.net.HttpURLConnection;
import app.revanced.extension.shared.Logger;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Protocol;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
public abstract class BaseFixRedgifsApiPatch implements Interceptor {
protected static BaseFixRedgifsApiPatch INSTANCE;
public abstract String getDefaultUserAgent();
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
Request request = chain.request();
if (!request.url().host().equals("api.redgifs.com")) {
return chain.proceed(request);
}
String userAgent = getDefaultUserAgent();
if (request.header("Authorization") != null) {
Response response = chain.proceed(request.newBuilder().header("User-Agent", userAgent).build());
if (response.isSuccessful()) {
return response;
}
// It's possible that the user agent is being overwritten later down in the interceptor
// chain, so make sure we grab the new user agent from the request headers.
userAgent = response.request().header("User-Agent");
response.close();
}
try {
RedgifsTokenManager.RedgifsToken token = RedgifsTokenManager.refreshToken(userAgent);
// Emulate response for old OAuth endpoint
if (request.url().encodedPath().equals("/v2/oauth/client")) {
String responseBody = RedgifsTokenManager.getEmulatedOAuthResponseBody(token);
return new Response.Builder()
.message("OK")
.code(HttpURLConnection.HTTP_OK)
.protocol(Protocol.HTTP_1_1)
.request(request)
.header("Content-Type", "application/json")
.body(ResponseBody.create(
responseBody, MediaType.get("application/json")))
.build();
}
Request modifiedRequest = request.newBuilder()
.header("Authorization", "Bearer " + token.getAccessToken())
.header("User-Agent", userAgent)
.build();
return chain.proceed(modifiedRequest);
} catch (JSONException ex) {
Logger.printException(() -> "Could not parse Redgifs response", ex);
throw new IOException(ex);
}
}
}

View File

@@ -0,0 +1,94 @@
package app.revanced.extension.shared.fixes.redgifs;
import static app.revanced.extension.shared.requests.Route.Method.GET;
import androidx.annotation.GuardedBy;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import app.revanced.extension.shared.requests.Requester;
/**
* Manages Redgifs token lifecycle.
*/
public class RedgifsTokenManager {
public static class RedgifsToken {
// Expire after 23 hours to provide some breathing room
private static final long EXPIRY_SECONDS = 23 * 60 * 60;
private final String accessToken;
private final long refreshTimeInSeconds;
public RedgifsToken(String accessToken, long refreshTime) {
this.accessToken = accessToken;
this.refreshTimeInSeconds = refreshTime;
}
public String getAccessToken() {
return accessToken;
}
public long getExpiryTimeInSeconds() {
return refreshTimeInSeconds + EXPIRY_SECONDS;
}
public boolean isValid() {
if (accessToken == null) return false;
return getExpiryTimeInSeconds() >= System.currentTimeMillis() / 1000;
}
}
public static final String REDGIFS_API_HOST = "https://api.redgifs.com";
private static final String GET_TEMPORARY_TOKEN = REDGIFS_API_HOST + "/v2/auth/temporary";
@GuardedBy("itself")
private static final Map<String, RedgifsToken> tokenMap = new HashMap<>();
private static String getToken(String userAgent) throws IOException, JSONException {
HttpURLConnection connection = (HttpURLConnection) new URL(GET_TEMPORARY_TOKEN).openConnection();
connection.setFixedLengthStreamingMode(0);
connection.setRequestMethod(GET.name());
connection.setRequestProperty("User-Agent", userAgent);
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
connection.setUseCaches(false);
JSONObject responseObject = Requester.parseJSONObject(connection);
return responseObject.getString("token");
}
public static RedgifsToken refreshToken(String userAgent) throws IOException, JSONException {
synchronized(tokenMap) {
// Reference: https://github.com/JeffreyCA/Apollo-ImprovedCustomApi/pull/67
RedgifsToken token = tokenMap.get(userAgent);
if (token != null && token.isValid()) {
return token;
}
// Copy user agent from original request if present because Redgifs verifies
// that the user agent in subsequent requests matches the one in the OAuth token.
String accessToken = getToken(userAgent);
long refreshTime = System.currentTimeMillis() / 1000;
token = new RedgifsToken(accessToken, refreshTime);
tokenMap.put(userAgent, token);
return token;
}
}
public static String getEmulatedOAuthResponseBody(RedgifsToken token) throws JSONException {
// Reference: https://github.com/JeffreyCA/Apollo-ImprovedCustomApi/pull/67
JSONObject responseObject = new JSONObject();
responseObject.put("access_token", token.accessToken);
responseObject.put("expiry_time", token.getExpiryTimeInSeconds() - (System.currentTimeMillis() / 1000));
responseObject.put("scope", "read");
responseObject.put("token_type", "Bearer");
return responseObject.toString();
}
}

View File

@@ -34,6 +34,5 @@ public class BaseSettings {
public static final BooleanSetting SPOOF_VIDEO_STREAMS_IOS_FORCE_AVC = new BooleanSetting("revanced_spoof_video_streams_ios_force_avc", FALSE, true,
"revanced_spoof_video_streams_ios_force_avc_user_dialog_message", new SpoofiOSAvailability());
// Client type must be last spoof setting due to cyclic references.
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_UNPLUGGED, true, parent(SPOOF_VIDEO_STREAMS));
public static final EnumSetting<ClientType> SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS));
}

View File

@@ -12,7 +12,7 @@ import app.revanced.extension.shared.settings.BaseSettings;
public enum ClientType {
// https://dumps.tadiphone.dev/dumps/oculus/eureka
ANDROID_VR_NO_AUTH(
ANDROID_VR_1_61_48(
28,
"ANDROID_VR",
"com.google.android.apps.youtube.vr.oculus",
@@ -27,7 +27,7 @@ public enum ClientType {
"1.61.48",
false,
false,
"Android VR No auth"
"Android VR 1.61"
),
// Chromecast with Google TV 4K.
// https://dumps.tadiphone.dev/dumps/google/kirkwood
@@ -97,21 +97,25 @@ public enum ClientType {
? "iOS TV Force AVC"
: "iOS TV"
),
ANDROID_VR_AUTH(
ANDROID_VR_NO_AUTH.id,
ANDROID_VR_NO_AUTH.clientName,
ANDROID_VR_NO_AUTH.packageName,
ANDROID_VR_NO_AUTH.deviceMake,
ANDROID_VR_NO_AUTH.deviceModel,
ANDROID_VR_NO_AUTH.osName,
ANDROID_VR_NO_AUTH.osVersion,
ANDROID_VR_NO_AUTH.androidSdkVersion,
ANDROID_VR_NO_AUTH.buildId,
ANDROID_VR_NO_AUTH.cronetVersion,
ANDROID_VR_NO_AUTH.clientVersion,
ANDROID_VR_NO_AUTH.requiresAuth,
true,
"Android VR Auth"
/**
* Uses non adaptive bitrate, which fixes audio stuttering with YT Music.
* Uses VP9 and not AV1.
*/
ANDROID_VR_1_43_32(
ANDROID_VR_1_61_48.id,
ANDROID_VR_1_61_48.clientName,
ANDROID_VR_1_61_48.packageName,
ANDROID_VR_1_61_48.deviceMake,
ANDROID_VR_1_61_48.deviceModel,
ANDROID_VR_1_61_48.osName,
ANDROID_VR_1_61_48.osVersion,
ANDROID_VR_1_61_48.androidSdkVersion,
ANDROID_VR_1_61_48.buildId,
"107.0.5284.2",
"1.43.32",
ANDROID_VR_1_61_48.requiresAuth,
ANDROID_VR_1_61_48.useAuth,
"Android VR 1.43"
);
private static boolean forceAVC() {

View File

@@ -252,8 +252,9 @@ public class SpoofVideoStreamsPatch {
public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability {
@Override
public boolean isAvailable() {
ClientType clientType = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
return BaseSettings.SPOOF_VIDEO_STREAMS.get()
&& BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_NO_AUTH;
&& (clientType == ClientType.ANDROID_VR_1_61_48 || clientType == ClientType.ANDROID_VR_1_43_32);
}
}

View File

@@ -42,7 +42,8 @@ final class PlayerRoutes {
// but if this is a fall over client it will set the language even though
// the audio language is not selectable in the UI.
ClientType userSelectedClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
Locale streamLocale = userSelectedClient == ClientType.ANDROID_VR_NO_AUTH
Locale streamLocale = (userSelectedClient == ClientType.ANDROID_VR_1_61_48
|| userSelectedClient == ClientType.ANDROID_VR_1_43_32)
? BaseSettings.SPOOF_VIDEO_STREAMS_LANGUAGE.get().getLocale()
: Locale.getDefault();

View File

@@ -35,21 +35,22 @@ import app.revanced.extension.shared.spoof.ClientType;
*/
public class StreamingDataRequest {
private static final ClientType[] CLIENT_ORDER_TO_USE;
private static volatile ClientType[] clientOrderToUse = ClientType.values();
static {
ClientType[] allClientTypes = ClientType.values();
ClientType preferredClient = BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get();
public static void setClientOrderToUse(ClientType[] availableClients, ClientType preferredClient) {
Objects.requireNonNull(availableClients);
CLIENT_ORDER_TO_USE = new ClientType[allClientTypes.length];
CLIENT_ORDER_TO_USE[0] = preferredClient;
clientOrderToUse = new ClientType[availableClients.length];
clientOrderToUse[0] = preferredClient;
int i = 1;
for (ClientType c : allClientTypes) {
for (ClientType c : availableClients) {
if (c != preferredClient) {
CLIENT_ORDER_TO_USE[i++] = c;
clientOrderToUse[i++] = c;
}
}
Logger.printDebug(() -> "Available spoof clients: " + Arrays.toString(clientOrderToUse));
}
private static final String AUTHORIZATION_HEADER = "Authorization";
@@ -193,9 +194,9 @@ public class StreamingDataRequest {
// Retry with different client if empty response body is received.
int i = 0;
for (ClientType clientType : CLIENT_ORDER_TO_USE) {
for (ClientType clientType : clientOrderToUse) {
// Show an error if the last client type fails, or if debug is enabled then show for all attempts.
final boolean showErrorToast = (++i == CLIENT_ORDER_TO_USE.length) || debugEnabled;
final boolean showErrorToast = (++i == clientOrderToUse.length) || debugEnabled;
HttpURLConnection connection = send(clientType, videoId, playerHeaders, showErrorToast);
if (connection != null) {

View File

@@ -2,4 +2,5 @@ dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:syncforreddit:stub"))
compileOnly(libs.annotation)
compileOnly(libs.okhttp)
}

View File

@@ -0,0 +1,22 @@
package app.revanced.extension.syncforreddit;
import app.revanced.extension.shared.fixes.redgifs.BaseFixRedgifsApiPatch;
import okhttp3.OkHttpClient;
/**
* @noinspection unused
*/
public class FixRedgifsApiPatch extends BaseFixRedgifsApiPatch {
static {
INSTANCE = new FixRedgifsApiPatch();
}
public String getDefaultUserAgent() {
// To be filled in by patch
return "";
}
public static OkHttpClient install(OkHttpClient.Builder builder) {
return builder.addInterceptor(INSTANCE).build();
}
}

View File

@@ -513,6 +513,9 @@ public final class VideoInformation {
Logger.printDebug(() -> "VideoQualities: " + Arrays.toString(currentQualities));
}
// On extremely slow internet connections the index can initially be -1
originalQualityIndex = Math.max(0, originalQualityIndex);
VideoQuality updatedCurrentQuality = qualities[originalQualityIndex];
if (updatedCurrentQuality.patch_getResolution() != AUTOMATIC_VIDEO_QUALITY_VALUE
&& (currentQuality == null || currentQuality != updatedCurrentQuality)) {

View File

@@ -194,7 +194,7 @@ public final class LayoutComponentsFilter extends Filter {
// Playable horizontal shelf header.
playablesBuffer = new ByteArrayFilterGroup(
Settings.HIDE_PLAYABLES,
"mini_game"
"FEmini_app_destination"
);
final var quickActions = new StringFilterGroup(

View File

@@ -0,0 +1,29 @@
package app.revanced.extension.youtube.patches.spoof;
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_CREATOR;
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_UNPLUGGED;
import static app.revanced.extension.shared.spoof.ClientType.ANDROID_VR_1_61_48;
import static app.revanced.extension.shared.spoof.ClientType.IOS_UNPLUGGED;
import app.revanced.extension.shared.settings.BaseSettings;
import app.revanced.extension.shared.spoof.ClientType;
import app.revanced.extension.shared.spoof.requests.StreamingDataRequest;
@SuppressWarnings("unused")
public class SpoofVideoStreamsPatch {
/**
* Injection point.
*/
public static void setClientOrderToUse() {
ClientType[] availableClients = {
ANDROID_VR_1_61_48,
ANDROID_UNPLUGGED,
ANDROID_CREATOR,
IOS_UNPLUGGED
};
StreamingDataRequest.setClientOrderToUse(availableClients,
BaseSettings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get());
}
}

View File

@@ -436,6 +436,9 @@ public class Settings extends BaseSettings {
public static final StringSetting SB_CATEGORY_HIGHLIGHT = new StringSetting("sb_highlight", MANUAL_SKIP.reVancedKeyValue);
public static final StringSetting SB_CATEGORY_HIGHLIGHT_COLOR = new StringSetting("sb_highlight_color", "#FF1684");
public static final FloatSetting SB_CATEGORY_HIGHLIGHT_OPACITY = new FloatSetting("sb_highlight_opacity", 0.8f);
public static final StringSetting SB_CATEGORY_HOOK = new StringSetting("sb_hook", IGNORE.reVancedKeyValue);
public static final StringSetting SB_CATEGORY_HOOK_COLOR = new StringSetting("sb_hook_color", "#395699");
public static final FloatSetting SB_CATEGORY_HOOK_OPACITY = new FloatSetting("sb_hook_opacity", 0.8f);
public static final StringSetting SB_CATEGORY_INTRO = new StringSetting("sb_intro", MANUAL_SKIP.reVancedKeyValue);
public static final StringSetting SB_CATEGORY_INTRO_COLOR = new StringSetting("sb_intro_color", "#00FFFF");
public static final FloatSetting SB_CATEGORY_INTRO_OPACITY = new FloatSetting("sb_intro_opacity", 0.8f);

View File

@@ -86,7 +86,8 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference {
String summary = str(key + "_summary");
// Android VR supports AV1 but all other clients do not.
if (clientType != ClientType.ANDROID_VR_AUTH && clientType != ClientType.ANDROID_VR_NO_AUTH) {
if (clientType != ClientType.ANDROID_VR_1_61_48
&& clientType != ClientType.ANDROID_VR_1_43_32) {
summary += '\n' + str("revanced_spoof_video_streams_about_no_av1");
}

View File

@@ -15,6 +15,7 @@ import android.graphics.drawable.shapes.RoundRectShape;
import android.text.TextUtils;
import android.util.Range;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
@@ -167,6 +168,11 @@ public class SegmentPlaybackController {
*/
private static WeakReference<Dialog> toastDialogRef = new WeakReference<>(null);
/**
* Visibility of the ad progress UI component.
*/
private static volatile int adProgressTextVisibility = -1;
static {
// Dismiss toast if app changes to PiP while undo skip is shown.
PlayerType.getOnChange().addObserver((PlayerType type) -> {
@@ -336,6 +342,7 @@ public class SegmentPlaybackController {
*/
static void executeDownloadSegments(String videoId) {
Objects.requireNonNull(videoId);
Utils.verifyOffMainThread();
SponsorSegment[] segments = SBRequester.getSegments(videoId);
@@ -367,6 +374,35 @@ public class SegmentPlaybackController {
});
}
/**
* Injection point.
*/
@SuppressWarnings("unused")
public static void setAdProgressTextVisibility(int visibility) {
if (adProgressTextVisibility != visibility) {
adProgressTextVisibility = visibility;
Logger.printDebug(() -> {
String visibilityMessage = switch (visibility) {
case View.VISIBLE -> "VISIBLE";
case View.GONE -> "GONE";
case View.INVISIBLE -> "INVISIBLE";
default -> "UNKNOWN";
};
return "AdProgressText visibility changed to: " + visibilityMessage;
});
}
}
/**
* When a video ad is playing in a regular video player, segments or the Skip button should be hidden.
* @return Whether the Ad Progress TextView is visible in the regular video player.
*/
public static boolean isAdProgressTextVisible() {
return adProgressTextVisibility == View.VISIBLE;
}
/**
* Injection point.
* Updates SponsorBlock every 1000ms.
@@ -376,7 +412,8 @@ public class SegmentPlaybackController {
try {
if (!Settings.SB_ENABLED.get()
|| PlayerType.getCurrent().isNoneOrHidden() // Shorts playback.
|| segments == null || segments.length == 0) {
|| segments == null || segments.length == 0
|| isAdProgressTextVisible()) {
return;
}
Logger.printDebug(() -> "setVideoTime: " + millis);
@@ -671,7 +708,14 @@ public class SegmentPlaybackController {
// Check for any smaller embedded segments, and count those as auto-skipped.
final boolean showSkipToast = Settings.SB_TOAST_ON_SKIP.get();
for (SponsorSegment otherSegment : Objects.requireNonNull(segments)) {
if (segmentToSkip.end < otherSegment.start) {
if (otherSegment.end <= segmentToSkip.start) {
// Other segment does not overlap, and is before this skipped segment.
// This situation can only happen if a video is opened and adjusted to
// a later time in the video where earlier auto skip segments
// have not been encountered yet.
continue;
}
if (segmentToSkip.end <= otherSegment.start) {
break; // No other segments can be contained.
}
@@ -922,7 +966,8 @@ public class SegmentPlaybackController {
public static String appendTimeWithoutSegments(String totalTime) {
try {
if (Settings.SB_ENABLED.get() && Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.get()
&& !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments)) {
&& !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments)
&& !isAdProgressTextVisible()) {
// Force LTR layout, to match the same LTR video time/length layout YouTube uses for all languages
return "\u202D" + totalTime + timeWithoutSegments; // u202D = left to right override
}
@@ -983,7 +1028,7 @@ public class SegmentPlaybackController {
@SuppressWarnings("unused")
public static void drawSponsorTimeBars(final Canvas canvas, final float posY) {
try {
if (segments == null) return;
if (segments == null || isAdProgressTextVisible()) return;
final long videoLength = VideoInformation.getVideoLength();
if (videoLength <= 0) return;

View File

@@ -52,6 +52,8 @@ public enum SegmentCategory {
sf("revanced_sb_skip_button_preview_beginning"), sf("revanced_sb_skip_button_preview_middle"), sf("revanced_sb_skip_button_preview_end"),
sf("revanced_sb_skipped_preview_beginning"), sf("revanced_sb_skipped_preview_middle"), sf("revanced_sb_skipped_preview_end"),
SB_CATEGORY_PREVIEW, SB_CATEGORY_PREVIEW_COLOR, SB_CATEGORY_PREVIEW_OPACITY),
HOOK("hook", sf("revanced_sb_segments_hook"), sf("revanced_sb_segments_hook_sum"), sf("revanced_sb_skip_button_hook"), sf("revanced_sb_skipped_hook"),
SB_CATEGORY_HOOK, SB_CATEGORY_HOOK_COLOR, SB_CATEGORY_HOOK_OPACITY),
FILLER("filler", sf("revanced_sb_segments_filler"), sf("revanced_sb_segments_filler_sum"), sf("revanced_sb_skip_button_filler"), sf("revanced_sb_skipped_filler"),
SB_CATEGORY_FILLER, SB_CATEGORY_FILLER_COLOR, SB_CATEGORY_FILLER_OPACITY),
MUSIC_OFFTOPIC("music_offtopic", sf("revanced_sb_segments_nomusic"), sf("revanced_sb_segments_nomusic_sum"), sf("revanced_sb_skip_button_nomusic"), sf("revanced_sb_skipped_nomusic"),
@@ -69,6 +71,7 @@ public enum SegmentCategory {
INTRO,
OUTRO,
PREVIEW,
HOOK,
FILLER,
MUSIC_OFFTOPIC,
};
@@ -81,6 +84,7 @@ public enum SegmentCategory {
INTRO,
OUTRO,
PREVIEW,
HOOK,
FILLER,
MUSIC_OFFTOPIC,
};

View File

@@ -6,6 +6,7 @@ import androidx.annotation.Nullable;
import app.revanced.extension.shared.Logger;
import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController;
import app.revanced.extension.youtube.videoplayer.PlayerControlButton;
@SuppressWarnings("unused")
@@ -26,7 +27,7 @@ public class CreateSegmentButton {
controlsView,
"revanced_sb_create_segment_button",
null,
CreateSegmentButton::shouldBeShown,
CreateSegmentButton::isButtonEnabled,
v -> SponsorBlockViewController.toggleNewSegmentLayoutVisibility(),
null
);
@@ -56,7 +57,8 @@ public class CreateSegmentButton {
if (instance != null) instance.setVisibility(visible, animated);
}
private static boolean shouldBeShown() {
return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get();
private static boolean isButtonEnabled() {
return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get()
&& !SegmentPlaybackController.isAdProgressTextVisible();
}
}

View File

@@ -28,7 +28,7 @@ public class VotingButton {
controlsView,
"revanced_sb_voting_button",
null,
VotingButton::shouldBeShown,
VotingButton::isButtonEnabled,
v -> SponsorBlockUtils.onVotingClicked(v.getContext()),
null
);
@@ -58,8 +58,9 @@ public class VotingButton {
if (instance != null) instance.setVisibility(visible, animated);
}
private static boolean shouldBeShown() {
private static boolean isButtonEnabled() {
return Settings.SB_ENABLED.get() && Settings.SB_VOTING_BUTTON.get()
&& SegmentPlaybackController.videoHasSegments();
&& SegmentPlaybackController.videoHasSegments()
&& !SegmentPlaybackController.isAdProgressTextVisible();
}
}

View File

@@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M
org.gradle.parallel = true
android.useAndroidX = true
kotlin.code.style = official
version = 5.35.0-dev.1
version = 5.37.0-dev.4

View File

@@ -268,6 +268,10 @@ public final class app/revanced/patches/instagram/hide/navigation/HideNavigation
public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/instagram/hide/stories/HideStoriesKt {
public static final fun getHideStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt {
public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -388,14 +392,21 @@ public final class app/revanced/patches/music/misc/gms/GmsCoreSupportPatchKt {
public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/music/misc/spoof/SpoofClientPatchKt {
public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
public final class app/revanced/patches/music/misc/spoof/SpoofVideoStreamsKt {
public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/music/misc/spoof/UserAgentClientSpoofPatchKt {
public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/music/playservice/VersionCheckPatchKt {
public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch;
public static final fun is_7_33_or_greater ()Z
public static final fun is_8_11_or_greater ()Z
public static final fun is_8_15_or_greater ()Z
}
public final class app/revanced/patches/myexpenses/misc/pro/UnlockProPatchKt {
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -512,6 +523,13 @@ public final class app/revanced/patches/reddit/ad/general/HideAdsPatchKt {
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/FixRedgifsApiPatchKt {
public static final field CREATE_NEW_CLIENT_METHOD Ljava/lang/String;
public static final field INSTALL_NEW_CLIENT_METHOD Ljava/lang/String;
public static final fun fixRedgifsApiPatch (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch;
public static synthetic fun fixRedgifsApiPatch$default (Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/FixSLinksPatchKt {
public static final field RESOLVE_S_LINK_METHOD Ljava/lang/String;
public static final field SET_ACCESS_TOKEN_METHOD Ljava/lang/String;
@@ -528,6 +546,14 @@ public final class app/revanced/patches/reddit/customclients/baconreader/api/Spo
public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/FixRedgifsApiPatchKt {
public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/baconreader/misc/extension/SharedExtensionPatchKt {
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatchKt {
public static final fun getDisableAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -540,6 +566,10 @@ public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/
public static final fun getFixAudioMissingInDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatchKt {
public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatchKt {
public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String;
public static final fun getFixSlinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
@@ -610,6 +640,10 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/FixRedgifsApiPatchKt {
public static final fun getFixRedgifsApi ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/FixSLinksPatchKt {
public static final field EXTENSION_CLASS_DESCRIPTOR Ljava/lang/String;
public static final fun getFixSLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
@@ -956,10 +990,6 @@ public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt {
public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/spotify/misc/UnlockPremiumPatchKt {
public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt {
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
@@ -1212,6 +1242,10 @@ public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksP
public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/viber/ads/HideAdsPatchKt {
public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt {
public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}

View File

@@ -19,14 +19,16 @@ val disableAdsPatch = bytecodePatch(
// SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS".
//
// MonetizationDebugSettings seems to be the most general setting to work fine.
initializeMonetizationDebugSettingsFingerprint.method.apply {
val insertIndex = initializeMonetizationDebugSettingsFingerprint.patternMatch!!.startIndex
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
initializeMonetizationDebugSettingsFingerprint
.match(monetizationDebugSettingsToStringFingerprint.classDef)
.method.apply {
val insertIndex = initializeMonetizationDebugSettingsFingerprint.patternMatch!!.startIndex
val register = getInstruction<TwoRegisterInstruction>(insertIndex).registerA
addInstructions(
insertIndex,
"const/4 v$register, 0x1",
)
}
addInstructions(
insertIndex,
"const/4 v$register, 0x1",
)
}
}
}

View File

@@ -7,13 +7,11 @@ import com.android.tools.smali.dexlib2.Opcode
internal val initializeMonetizationDebugSettingsFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
returns("V")
parameters(
"Z", // disableAds
"Z", // useDebugBilling
"Z", // showManageSubscriptions
"Z", // alwaysShowSuperAds
// matches "Lcom/duolingo/debug/FamilyQuestOverride;" or "Lcom/duolingo/data/debug/monetization/FamilyQuestOverride;"
"Lcom/duolingo/",
)
// Parameters have not been reliable for fingerprinting between versions.
opcodes(Opcode.IPUT_BOOLEAN)
}
internal val monetizationDebugSettingsToStringFingerprint = fingerprint {
strings("MonetizationDebugSettings(") // Partial string match.
custom { method, _ -> method.name == "toString" }
}

View File

@@ -20,13 +20,15 @@ val hideNavigationButtonsPatch = bytecodePatch(
val hideReels by booleanOption(
key = "hideReels",
default = true,
title = "Hide Reels"
title = "Hide Reels",
description = "Permanently hides the Reels button."
)
val hideCreate by booleanOption(
key = "hideCreate",
default = true,
title = "Hide Create"
title = "Hide Create",
description = "Permanently hides the Create button."
)
execute {

View File

@@ -0,0 +1,17 @@
package app.revanced.patches.instagram.hide.stories
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.Opcode
internal val getOrCreateAvatarViewFingerprint = fingerprint {
parameters()
returns("L")
custom { method, classDef ->
classDef.type == "Lcom/instagram/reels/ui/views/reelavatar/RecyclerReelAvatarView;"
}
opcodes(
Opcode.INVOKE_VIRTUAL,
Opcode.IPUT_OBJECT,
Opcode.INVOKE_VIRTUAL // Add View (Story)
)
}

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.instagram.hide.stories
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.patch.bytecodePatch
@Suppress("unused")
val hideStoriesPatch = bytecodePatch(
name = "Hide Stories from Home",
description = "Hides Stories from the main page, by removing the buttons.",
use = false
) {
compatibleWith("com.instagram.android")
execute {
val addStoryMethod = getOrCreateAvatarViewFingerprint.method // Creates Story
val addStoryEndIndex = getOrCreateAvatarViewFingerprint.patternMatch!!.endIndex
// Remove addView of Story.
addStoryMethod.removeInstruction(addStoryEndIndex)
}
}

View File

@@ -8,7 +8,11 @@ val hideVideoAdsPatch = bytecodePatch(
name = "Hide music video ads",
description = "Hides ads that appear while listening to or streaming music videos, podcasts, or songs.",
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
navigate(showVideoAdsParentFingerprint.originalMethod)

View File

@@ -8,7 +8,11 @@ val enableExclusiveAudioPlaybackPatch = bytecodePatch(
name = "Enable exclusive audio playback",
description = "Enables the option to play audio without video.",
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
allowExclusiveAudioPlaybackFingerprint.method.returnEarly(true)

View File

@@ -11,7 +11,11 @@ val permanentRepeatPatch = bytecodePatch(
description = "Permanently remember your repeating preference even if the playlist ends or another track is played.",
use = false,
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
val startIndex = repeatTrackFingerprint.patternMatch!!.endIndex

View File

@@ -9,7 +9,11 @@ val permanentShufflePatch = bytecodePatch(
description = "Permanently remember your shuffle preference " +
"even if the playlist ends or another track is played."
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
disableShuffleFingerprint.method.addInstruction(0, "return-void")

View File

@@ -12,7 +12,11 @@ val hideCategoryBar = bytecodePatch(
description = "Hides the category bar at the top of the homepage.",
use = false,
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
constructCategoryBarFingerprint.method.apply {

View File

@@ -11,7 +11,11 @@ val hideGetPremiumPatch = bytecodePatch(
name = "Hide 'Get Music Premium' label",
description = "Hides the \"Get Music Premium\" label from the account menu and settings.",
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
hideGetPremiumFingerprint.method.apply {

View File

@@ -18,7 +18,11 @@ val removeUpgradeButtonPatch = bytecodePatch(
name = "Remove upgrade button",
description = "Removes the upgrade tab from the pivot bar.",
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
pivotBarConstructorFingerprint.method.apply {

View File

@@ -8,7 +8,11 @@ val bypassCertificateChecksPatch = bytecodePatch(
name = "Bypass certificate checks",
description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.",
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
checkCertificateFingerprint.method.returnEarly(true)

View File

@@ -8,7 +8,11 @@ val backgroundPlaybackPatch = bytecodePatch(
name = "Remove background playback restrictions",
description = "Removes restrictions on background playback, including playing kids videos in the background.",
) {
compatibleWith("com.google.android.apps.youtube.music")
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
execute {
kidsBackgroundPlaybackPolicyControllerFingerprint.method.addInstruction(

View File

@@ -4,7 +4,7 @@ import app.revanced.patcher.patch.Option
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
import app.revanced.patches.music.misc.spoof.spoofClientPatch
import app.revanced.patches.music.misc.spoof.spoofVideoStreamsPatch
import app.revanced.patches.shared.castContextFetchFingerprint
import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch
import app.revanced.patches.shared.primeMethodFingerprint
@@ -21,7 +21,7 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch(
extensionPatch = sharedExtensionPatch,
gmsCoreSupportResourcePatchFactory = ::gmsCoreSupportResourcePatch,
) {
dependsOn(spoofClientPatch)
dependsOn(spoofVideoStreamsPatch)
compatibleWith(MUSIC_PACKAGE_NAME)
}

View File

@@ -1,39 +0,0 @@
package app.revanced.patches.music.misc.spoof
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val playerRequestConstructorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
strings("player")
}
/**
* Matches using the class found in [playerRequestConstructorFingerprint].
*/
internal val createPlayerRequestBodyFingerprint = fingerprint {
parameters("L")
returns("V")
opcodes(
Opcode.CHECK_CAST,
Opcode.IGET,
Opcode.AND_INT_LIT16,
)
strings("ms")
}
/**
* Used to get a reference to other clientInfo fields.
*/
internal val setClientInfoFieldsFingerprint = fingerprint {
returns("L")
strings("Google Inc.")
}
/**
* Used to get a reference to the clientInfo and clientInfo.clientVersion field.
*/
internal val setClientInfoClientVersionFingerprint = fingerprint {
strings("10.29")
}

View File

@@ -1,105 +0,0 @@
package app.revanced.patches.music.misc.spoof
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.util.getReference
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
private const val EXTENSION_CLASS_DESCRIPTOR =
"Lapp/revanced/extension/music/spoof/SpoofClientPatch;"
// TODO: Replace this patch with spoofVideoStreamsPatch once possible.
val spoofClientPatch = bytecodePatch(
name = "Spoof client",
description = "Spoofs the client to fix playback.",
) {
compatibleWith("com.google.android.apps.youtube.music")
dependsOn(
sharedExtensionPatch,
// TODO: Add settingsPatch
userAgentClientSpoofPatch,
)
execute {
val playerRequestClass = playerRequestConstructorFingerprint.classDef
val createPlayerRequestBodyMatch = createPlayerRequestBodyFingerprint.match(playerRequestClass)
val clientInfoContainerClass = createPlayerRequestBodyMatch.method
.getInstruction(createPlayerRequestBodyMatch.patternMatch!!.startIndex)
.getReference<TypeReference>()!!.type
val clientInfoField = setClientInfoClientVersionFingerprint.method.instructions.first {
it.opcode == Opcode.IPUT_OBJECT && it.getReference<FieldReference>()!!.definingClass == clientInfoContainerClass
}.getReference<FieldReference>()!!
val setClientInfoFieldInstructions = setClientInfoFieldsFingerprint.method.instructions.filter {
(it.opcode == Opcode.IPUT_OBJECT || it.opcode == Opcode.IPUT) &&
it.getReference<FieldReference>()!!.definingClass == clientInfoField.type
}.map { it.getReference<FieldReference>()!! }
// Offsets are known for the fields in the clientInfo object.
val clientIdField = setClientInfoFieldInstructions[0]
val clientModelField = setClientInfoFieldInstructions[5]
val osVersionField = setClientInfoFieldInstructions[7]
val clientVersionField = setClientInfoClientVersionFingerprint.method
.getInstruction(setClientInfoClientVersionFingerprint.stringMatches!!.first().index + 1)
.getReference<FieldReference>()
// Helper method to spoof the client info.
val spoofClientInfoMethod = ImmutableMethod(
playerRequestClass.type,
"spoofClientInfo",
listOf(ImmutableMethodParameter(clientInfoContainerClass, null, null)),
"V",
AccessFlags.PRIVATE.value or AccessFlags.STATIC.value,
null,
null,
MutableMethodImplementation(3),
).toMutable().also(playerRequestClass.methods::add).apply {
addInstructions(
"""
iget-object v0, p0, $clientInfoField
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->getClientId()I
move-result v1
iput v1, v0, $clientIdField
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->getClientModel()Ljava/lang/String;
move-result-object v1
iput-object v1, v0, $clientModelField
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->getClientVersion()Ljava/lang/String;
move-result-object v1
iput-object v1, v0, $clientVersionField
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->getOsVersion()Ljava/lang/String;
move-result-object v1
iput-object v1, v0, $osVersionField
return-void
""",
)
}
createPlayerRequestBodyMatch.method.apply {
val checkCastIndex = createPlayerRequestBodyMatch.patternMatch!!.startIndex
val clientInfoContainerRegister = getInstruction<OneRegisterInstruction>(checkCastIndex).registerA
addInstruction(checkCastIndex + 1, "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod")
}
}
}

View File

@@ -0,0 +1,33 @@
package app.revanced.patches.music.misc.spoof
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint
import app.revanced.patches.music.playservice.is_7_33_or_greater
import app.revanced.patches.music.playservice.is_8_11_or_greater
import app.revanced.patches.music.playservice.is_8_15_or_greater
import app.revanced.patches.music.playservice.versionCheckPatch
import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;"
val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
fixMediaFetchHotConfigChanges = { true },
fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater },
fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater },
block = {
compatibleWith(
"com.google.android.apps.youtube.music"(
"7.29.52"
)
)
dependsOn(sharedExtensionPatch, versionCheckPatch, userAgentClientSpoofPatch)
},
executeBlock = {
musicActivityOnCreateFingerprint.method.addInstruction(
1, // Must use 1 index so context is set by extension patch.
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V"
)
}
)

View File

@@ -0,0 +1,28 @@
@file:Suppress("ktlint:standard:property-naming")
package app.revanced.patches.music.playservice
import app.revanced.patcher.patch.resourcePatch
import app.revanced.util.findPlayStoreServicesVersion
var is_7_33_or_greater = false
private set
var is_8_11_or_greater = false
private set
var is_8_15_or_greater = false
private set
val versionCheckPatch = resourcePatch(
description = "Uses the Play Store service version to find the major/minor version of the YouTube Music target app.",
) {
execute {
// The app version is missing from the decompiled manifest,
// so instead use the Google Play services version and compare against specific releases.
val playStoreServicesVersion = findPlayStoreServicesVersion()
// All bug fix releases always seem to use the same play store version as the minor version.
is_7_33_or_greater = 245199000 <= playStoreServicesVersion
is_8_11_or_greater = 251199000 <= playStoreServicesVersion
is_8_15_or_greater = 251530000 <= playStoreServicesVersion
}
}

View File

@@ -0,0 +1,17 @@
package app.revanced.patches.reddit.customclients
import app.revanced.patcher.patch.BytecodePatchBuilder
import app.revanced.patcher.patch.Patch
import app.revanced.patcher.patch.bytecodePatch
const val INSTALL_NEW_CLIENT_METHOD = "install(Lokhttp3/OkHttpClient${'$'}Builder;)Lokhttp3/OkHttpClient;"
const val CREATE_NEW_CLIENT_METHOD = "createClient()Lokhttp3/OkHttpClient;"
fun fixRedgifsApiPatch(
extensionPatch: Patch<*>,
block: BytecodePatchBuilder.() -> Unit = {},
) = bytecodePatch(name = "Fix Redgifs API") {
dependsOn(extensionPatch)
block()
}

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
internal val getOkHttpClientFingerprint = fingerprint {
returns("Lokhttp3/OkHttpClient;")
parameters()
custom { method, classDef ->
classDef.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;" && method.name == "getOkhttpClient"
}
}

View File

@@ -0,0 +1,53 @@
package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD
import app.revanced.patches.reddit.customclients.baconreader.misc.extension.sharedExtensionPatch
import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch
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.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/baconreader/FixRedgifsApiPatch;"
@Suppress("unused")
val fixRedgifsApi = fixRedgifsApiPatch(
extensionPatch = sharedExtensionPatch
) {
compatibleWith(
"com.onelouder.baconreader",
"com.onelouder.baconreader.premium",
)
execute {
// region Patch Redgifs OkHttp3 client.
getOkHttpClientFingerprint.method.apply {
// Remove conflicting OkHttp interceptors.
val originalInterceptorInstallIndex = indexOfFirstInstructionOrThrow {
opcode == Opcode.NEW_INSTANCE && getReference<TypeReference>()?.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager\$HeaderInterceptor;"
}
removeInstructions(originalInterceptorInstallIndex, 5)
val index = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>()
reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;"
}
val register = getInstruction<FiveRegisterInstruction>(index).registerC
replaceInstruction(
index,
"""
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD
"""
)
}
// endregion
}
}

View File

@@ -0,0 +1,6 @@
package app.revanced.patches.reddit.customclients.baconreader.misc.extension
import app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks.initHook
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
val sharedExtensionPatch = sharedExtensionPatch("baconreader", initHook)

View File

@@ -0,0 +1,9 @@
package app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks
import app.revanced.patches.shared.misc.extension.extensionHook
internal val initHook = extensionHook {
custom { method, _ ->
method.definingClass == "Lcom/onelouder/baconreader/BaconReader;" && method.name == "onCreate"
}
}

View File

@@ -0,0 +1,20 @@
package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs
import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
internal val createOkHttpClientFingerprint = fingerprint {
accessFlags(AccessFlags.PRIVATE)
opcodes(
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.NEW_INSTANCE,
Opcode.INVOKE_DIRECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT
)
custom { _, classDef -> classDef.sourceFile == "RedGifsAPIv2.java" }
}

View File

@@ -0,0 +1,38 @@
package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs
import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patches.reddit.customclients.CREATE_NEW_CLIENT_METHOD
import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch
import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/boostforreddit/FixRedgifsApiPatch;"
@Suppress("unused")
val fixRedgifsApi = fixRedgifsApiPatch(
extensionPatch = sharedExtensionPatch
) {
compatibleWith("com.rubenmayayo.reddit")
execute {
// region Patch Redgifs OkHttp3 client.
createOkHttpClientFingerprint.method.apply {
val index = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>()
reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;"
}
replaceInstruction(
index,
"""
invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->$CREATE_NEW_CLIENT_METHOD
"""
)
}
// endregion
}
}

View File

@@ -0,0 +1,39 @@
package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs
import app.revanced.patcher.extensions.InstructionExtensions.instructions
import app.revanced.patcher.fingerprint
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.writeRegister
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11n
internal val createOkHttpClientFingerprint = fingerprint {
accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC)
returns("V")
parameters()
custom { method, classDef ->
// There are four functions (each creating a client) defined in this file with very similar fingerprints.
// We're looking for the one that only creates one object (the builder) and sets client options true
// (thus never reloading the register with a 0).
classDef.sourceFile == "OkHttpHelper.java" &&
method.instructions.count { it.opcode == Opcode.NEW_INSTANCE } == 1 &&
method.indexOfFirstInstruction {
opcode == Opcode.CONST_4 && writeRegister == 1 && (this as Instruction11n).narrowLiteral == 0
} == -1
}
}
internal val getDefaultUserAgentFingerprint = fingerprint {
custom { method, classDef ->
method.name == "getDefaultUserAgent" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
}
}
internal val getOriginalUserAgentFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Ljava/lang/String;")
parameters()
custom { _, classDef -> classDef.sourceFile == "AccountSingleton.java" }
}

View File

@@ -0,0 +1,56 @@
package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patches.reddit.customclients.INSTALL_NEW_CLIENT_METHOD
import app.revanced.patches.reddit.customclients.fixRedgifsApiPatch
import app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.sharedExtensionPatch
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/syncforreddit/FixRedgifsApiPatch;"
@Suppress("unused")
val fixRedgifsApi = fixRedgifsApiPatch(
extensionPatch = sharedExtensionPatch
) {
compatibleWith(
"com.laurencedawson.reddit_sync",
"com.laurencedawson.reddit_sync.pro",
"com.laurencedawson.reddit_sync.dev",
)
execute {
// region Patch Redgifs OkHttp3 client.
createOkHttpClientFingerprint.method.apply {
val index = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>()
reference?.name == "build" && reference.definingClass == "Lokhttp3/OkHttpClient\$Builder;"
}
val register = getInstruction<FiveRegisterInstruction>(index).registerC
replaceInstruction(
index,
"""
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$INSTALL_NEW_CLIENT_METHOD
"""
)
}
getDefaultUserAgentFingerprint.method.apply {
addInstructions(
0,
"""
invoke-static { }, ${getOriginalUserAgentFingerprint.method}
move-result-object v0
return-object v0
"""
)
}
// endregion
}
}

View File

@@ -1,9 +1,12 @@
package app.revanced.patches.shared.misc.spoof
import app.revanced.patcher.fingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
internal val buildInitPlaybackRequestFingerprint = fingerprint {
returns("Lorg/chromium/net/UrlRequest\$Builder;")
@@ -35,8 +38,15 @@ internal val buildPlayerRequestURIFingerprint = fingerprint {
internal val buildRequestFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Lorg/chromium/net/UrlRequest;")
returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder;
custom { methodDef, _ ->
if (methodDef.indexOfFirstInstruction {
val reference = getReference<MethodReference>()
reference?.name == "newUrlRequestBuilder"
} < 0) {
return@custom false
}
// Different targets have slightly different parameters
// Earlier targets have parameters:
@@ -58,12 +68,22 @@ internal val buildRequestFingerprint = fingerprint {
// Lorg/chromium/net/UrlRequest\$Callback;
// L
// 20.16+ uses a refactored and extracted method:
// L
// Ljava/util/Map;
// [B
// L
// Lorg/chromium/net/UrlRequest$Callback;
// L
val parameterTypes = methodDef.parameterTypes
(parameterTypes.size == 7 || parameterTypes.size == 8) &&
parameterTypes[1] == "Ljava/util/Map;" // URL headers.
val parameterTypesSize = parameterTypes.size
(parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) &&
parameterTypes[1] == "Ljava/util/Map;" // URL headers.
}
}
internal val protobufClassParseByteBufferFingerprint = fingerprint {
accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC)
returns("L")
@@ -148,7 +168,8 @@ internal val mediaFetchHotConfigFingerprint = fingerprint {
literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG }
}
// 20.10+
// YT 20.10+, YT Music 8.11 - 8.14.
// Flag is missing in YT Music 8.15+, and it is not known if a replacement flag/feature exists.
internal const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L
internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint {
@@ -162,7 +183,6 @@ internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint {
internal const val PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG = 45665455L
internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters()
returns("Z")
literal { PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG }

View File

@@ -10,6 +10,7 @@ import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.music.misc.extension.sharedExtensionPatch
import app.revanced.util.findFreeRegister
import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference
@@ -53,9 +54,8 @@ fun spoofVideoStreamsPatch(
// region Block /initplayback requests to fall back to /get_watch requests.
val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch!!.startIndex
buildInitPlaybackRequestFingerprint.method.apply {
val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch!!.startIndex
val targetRegister = getInstruction<OneRegisterInstruction>(moveUriStringIndex).registerA
addInstructions(
@@ -63,7 +63,7 @@ fun spoofVideoStreamsPatch(
"""
invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockInitPlaybackRequest(Ljava/lang/String;)Ljava/lang/String;
move-result-object v$targetRegister
""",
"""
)
}
@@ -71,9 +71,8 @@ fun spoofVideoStreamsPatch(
// region Block /get_watch requests to fall back to /player requests.
val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch!!.startIndex
buildPlayerRequestURIFingerprint.method.apply {
val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch!!.startIndex
val uriRegister = getInstruction<FiveRegisterInstruction>(invokeToStringIndex).registerC
addInstructions(
@@ -81,7 +80,7 @@ fun spoofVideoStreamsPatch(
"""
invoke-static { v$uriRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri;
move-result-object v$uriRegister
""",
"""
)
}
@@ -178,9 +177,9 @@ fun spoofVideoStreamsPatch(
:disabled
return-void
""",
"""
)
},
}
)
}
@@ -199,17 +198,17 @@ fun spoofVideoStreamsPatch(
addInstructions(
targetIndex,
"""
# Field a: Stream uri.
# Field c: Http method.
# Field d: Post data.
move-object v0, p0 # method has over 15 registers and must copy p0 to a lower register.
iget-object v1, v0, $definingClass->a:Landroid/net/Uri;
iget v2, v0, $definingClass->c:I
iget-object v3, v0, $definingClass->d:[B
invoke-static { v1, v2, v3 }, $EXTENSION_CLASS_DESCRIPTOR->removeVideoPlaybackPostBody(Landroid/net/Uri;I[B)[B
move-result-object v1
iput-object v1, v0, $definingClass->d:[B
""",
# Field a: Stream uri.
# Field c: Http method.
# Field d: Post data.
move-object v0, p0 # method has over 15 registers and must copy p0 to a lower register.
iget-object v1, v0, $definingClass->a:Landroid/net/Uri;
iget v2, v0, $definingClass->c:I
iget-object v3, v0, $definingClass->d:[B
invoke-static { v1, v2, v3 }, $EXTENSION_CLASS_DESCRIPTOR->removeVideoPlaybackPostBody(Landroid/net/Uri;I[B)[B
move-result-object v1
iput-object v1, v0, $definingClass->d:[B
"""
)
}

View File

@@ -187,11 +187,16 @@ val customThemePatch = resourcePatch(
}
// Login screen gradient.
document("res/drawable/start_screen_gradient.xml").use { document ->
val gradientNode = document.getElementsByTagName("gradient").item(0) as Element
try {
document("res/drawable/start_screen_gradient.xml").use { document ->
val gradientNode = document.getElementsByTagName("gradient").item(0) as Element
gradientNode.setAttribute("android:startColor", "@color/gray_7")
gradientNode.setAttribute("android:endColor", "@color/gray_7")
gradientNode.setAttribute("android:startColor", "@color/gray_7")
gradientNode.setAttribute("android:endColor", "@color/gray_7")
}
} catch (_: Exception) {
// Fails for 9.0.66+
// printWarn("Failed to locate start_screen_gradient.xml, skipping modification.")
}
}
}

View File

@@ -1,145 +0,0 @@
package app.revanced.patches.spotify.misc
import app.revanced.patcher.fingerprint
import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
context(BytecodePatchContext)
internal val accountAttributeFingerprint get() = fingerprint {
custom { _, classDef -> classDef.type == "Lcom/spotify/remoteconfig/internal/AccountAttribute;" }
}
context(BytecodePatchContext)
internal val productStateProtoGetMapFingerprint get() = fingerprint {
returns("Ljava/util/Map;")
custom { _, classDef -> classDef.type == "Lcom/spotify/remoteconfig/internal/ProductStateProto;" }
}
internal val buildQueryParametersFingerprint = fingerprint {
strings("trackRows", "device_type:tablet")
}
internal val contextMenuViewModelClassFingerprint = fingerprint {
strings("ContextMenuViewModel(header=")
}
/**
* Used in versions older than "9.0.60.128".
*/
internal val oldContextMenuViewModelAddItemFingerprint = fingerprint {
parameters("L")
returns("V")
custom { method, _ ->
method.indexOfFirstInstruction {
getReference<MethodReference>()?.name == "add"
} >= 0
}
}
internal val contextMenuViewModelConstructorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
}
/**
* Used to find the interface name of a context menu item.
*/
internal val removeItemFromPlaylistContextMenuItemClassFingerprint = fingerprint {
strings("spotify:playlist:", "REMOVE_TRACK")
}
internal const val CONTEXT_MENU_ITEM_CLASS_DESCRIPTOR_PLACEHOLDER = "Lapp/revanced/ContextMenuItemPlaceholder;"
internal val extensionFilterContextMenuItemsFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Ljava/util/List;")
parameters("Ljava/util/List;")
custom { method, classDef ->
method.name == "filterContextMenuItems" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
}
}
internal val getViewModelFingerprint = fingerprint {
custom { method, _ -> method.name == "getViewModel" }
}
internal val contextFromJsonFingerprint = fingerprint {
opcodes(
Opcode.INVOKE_STATIC,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.INVOKE_STATIC
)
custom { method, classDef ->
method.name == "fromJson" &&
classDef.type.endsWith("voiceassistants/playermodels/ContextJsonAdapter;")
}
}
internal val readPlayerOptionOverridesFingerprint = fingerprint {
custom { method, classDef ->
method.name == "readPlayerOptionOverrides" &&
classDef.type.endsWith("voiceassistants/playermodels/PreparePlayOptionsJsonAdapter;")
}
}
internal val protobufListsFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
custom { method, _ -> method.name == "emptyProtobufList" }
}
internal val abstractProtobufListEnsureIsMutableFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters()
returns("V")
custom { method, _ ->
method.indexOfFirstInstruction {
getReference<TypeReference>()?.type == "Ljava/lang/UnsupportedOperationException;"
} >= 0
}
}
internal fun structureGetSectionsFingerprint(className: String) = fingerprint {
custom { method, classDef ->
classDef.type.endsWith(className) && method.indexOfFirstInstruction {
opcode == Opcode.IGET_OBJECT && getReference<FieldReference>()?.name == "sections_"
} >= 0
}
}
internal val homeSectionFingerprint = fingerprint {
custom { _, classDef -> classDef.type.endsWith("homeapi/proto/Section;") }
}
internal val homeStructureGetSectionsFingerprint =
structureGetSectionsFingerprint("homeapi/proto/HomeStructure;")
internal val browseSectionFingerprint = fingerprint {
custom { _, classDef-> classDef.type.endsWith("browsita/v1/resolved/Section;") }
}
internal val browseStructureGetSectionsFingerprint =
structureGetSectionsFingerprint("browsita/v1/resolved/BrowseStructure;")
internal fun reactivexFunctionApplyWithClassInitFingerprint(className: String) = fingerprint {
returns("Ljava/lang/Object;")
parameters("Ljava/lang/Object;")
custom { method, _ ->
method.name == "apply" && method.indexOfFirstInstruction {
opcode == Opcode.NEW_INSTANCE && getReference<TypeReference>()?.type?.endsWith(className) == true
} >= 0
}
}
internal const val PENDRAGON_JSON_FETCH_MESSAGE_REQUEST_CLASS_NAME = "FetchMessageRequest;"
internal val pendragonJsonFetchMessageRequestFingerprint =
reactivexFunctionApplyWithClassInitFingerprint(PENDRAGON_JSON_FETCH_MESSAGE_REQUEST_CLASS_NAME)
internal const val PENDRAGON_PROTO_FETCH_MESSAGE_LIST_REQUEST_CLASS_NAME = "FetchMessageListRequest;"
internal val pendragonProtoFetchMessageListRequestFingerprint =
reactivexFunctionApplyWithClassInitFingerprint(PENDRAGON_PROTO_FETCH_MESSAGE_LIST_REQUEST_CLASS_NAME)

View File

@@ -12,9 +12,9 @@ import app.revanced.util.returnEarly
internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;"
@Deprecated("Patch no longer functions")
@Suppress("unused")
val spoofClientPatch = bytecodePatch(
name = "Spoof client",
description = "Spoofs the client to fix various functions of the app.",
) {
val requestListenerPort by intOption(

View File

@@ -1,12 +1,9 @@
package app.revanced.patches.spotify.navbar
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patches.spotify.misc.unlockPremiumPatch
@Deprecated("Superseded by unlockPremiumPatch", ReplaceWith("unlockPremiumPatch"))
@Deprecated("Obsolete and will be deleted soon")
@Suppress("unused")
val premiumNavbarTabPatch = bytecodePatch(
description = "Hides the premium tab from the navigation bar.",
) {
dependsOn(unlockPremiumPatch)
}
)

View File

@@ -0,0 +1,13 @@
package app.revanced.patches.viber.ads
import app.revanced.patcher.fingerprint
internal val adsFreeFingerprint = fingerprint {
returns("I")
parameters()
custom { method, classDef ->
classDef.type.contains("com/viber/voip/feature/viberplus") &&
classDef.superclass?.contains("com/viber/voip/core/feature") == true && // Must extend com.viber.voip.core.feature.?
classDef.methods.count() == 1
}
}

View File

@@ -0,0 +1,17 @@
package app.revanced.patches.viber.ads
import app.revanced.patcher.patch.bytecodePatch
import app.revanced.util.returnEarly
@Suppress("unused")
val hideAdsPatch = bytecodePatch(
name = "Hide Ads",
description = "Hides ad banners between chats.",
) {
compatibleWith("com.viber.voip")
execute {
// Return 1 (true) indicating ads should be disabled.
adsFreeFingerprint.method.returnEarly(1)
}
}

View File

@@ -1,8 +1,11 @@
package app.revanced.patches.youtube.layout.sponsorblock
import app.revanced.patcher.fingerprint
import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionReversed
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -56,3 +59,20 @@ internal val rectangleFieldInvalidatorFingerprint = fingerprint {
reference?.parameterTypes?.size == 1 && reference.name == "invalidate" // the reference is the invalidate(..) method
}
}
internal val adProgressTextViewVisibilityFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters("Z")
custom { method, _ ->
indexOfAdProgressTextViewVisibilityInstruction(method) >= 0
}
}
internal fun indexOfAdProgressTextViewVisibilityInstruction(method: Method) =
method.indexOfFirstInstructionReversed {
val reference = getReference<MethodReference>()
reference?.definingClass ==
"Lcom/google/android/libraries/youtube/ads/player/ui/AdProgressTextView;"
&& reference.name =="setVisibility"
}

View File

@@ -252,5 +252,16 @@ val sponsorBlockPatch = bytecodePatch(
}
} ?: throw PatchException("Could not find the method which contains the replaceMeWith* strings")
}
adProgressTextViewVisibilityFingerprint.method.apply {
val index = indexOfAdProgressTextViewVisibilityInstruction(this)
val register = getInstruction<FiveRegisterInstruction>(index).registerD
addInstructionsAtControlFlowLabel(
index,
"invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setAdProgressTextVisibility(I)V"
)
}
}
}

View File

@@ -3,7 +3,7 @@
package app.revanced.patches.youtube.misc.playservice
import app.revanced.patcher.patch.resourcePatch
import app.revanced.util.findElementByAttributeValueOrThrow
import app.revanced.util.findPlayStoreServicesVersion
@Deprecated("19.34.42 is the lowest supported version")
var is_19_03_or_greater = false
@@ -77,12 +77,7 @@ val versionCheckPatch = resourcePatch(
execute {
// The app version is missing from the decompiled manifest,
// so instead use the Google Play services version and compare against specific releases.
val playStoreServicesVersion = document("res/values/integers.xml").use { document ->
document.documentElement.childNodes.findElementByAttributeValueOrThrow(
"name",
"google_play_services_version",
).textContent.toInt()
}
val playStoreServicesVersion = findPlayStoreServicesVersion()
// All bug fix releases always seem to use the same play store version as the minor version.
is_19_03_or_greater = 240402000 <= playStoreServicesVersion

View File

@@ -1,5 +1,6 @@
package app.revanced.patches.youtube.misc.spoof
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.shared.misc.settings.preference.ListPreference
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
@@ -13,56 +14,70 @@ import app.revanced.patches.youtube.misc.playservice.is_20_14_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
compatibleWith(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;"
val spoofVideoStreamsPatch = spoofVideoStreamsPatch(
block = {
compatibleWith(
"com.google.android.youtube"(
"19.34.42",
"19.43.41",
"19.47.53",
"20.07.39",
"20.12.46",
"20.13.41",
)
)
)
dependsOn(
userAgentClientSpoofPatch,
settingsPatch,
versionCheckPatch
)
}, {
is_19_34_or_greater
}, {
// In 20.14 the flag was merged with 20.03 start playback flag.
is_20_10_or_greater && !is_20_14_or_greater
}, {
is_20_03_or_greater
}, {
addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch")
dependsOn(
userAgentClientSpoofPatch,
settingsPatch,
versionCheckPatch
)
},
fixMediaFetchHotConfigChanges = {
is_19_34_or_greater
},
fixMediaFetchHotConfigAlternativeChanges = {
// In 20.14 the flag was merged with 20.03 start playback flag.
is_20_10_or_greater && !is_20_14_or_greater
},
fixParsePlaybackResponseFeatureFlag = {
is_20_03_or_greater
},
executeBlock = {
addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch")
PreferenceScreen.MISC.addPreferences(
PreferenceScreenPreference(
key = "revanced_spoof_video_streams_screen",
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
preferences = setOf(
SwitchPreference("revanced_spoof_video_streams"),
ListPreference("revanced_spoof_video_streams_client_type"),
NonInteractivePreference(
// Requires a key and title but the actual text is chosen at runtime.
key = "revanced_spoof_video_streams_about_android",
tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference"
PreferenceScreen.MISC.addPreferences(
PreferenceScreenPreference(
key = "revanced_spoof_video_streams_screen",
sorting = PreferenceScreenPreference.Sorting.UNSORTED,
preferences = setOf(
SwitchPreference("revanced_spoof_video_streams"),
ListPreference("revanced_spoof_video_streams_client_type"),
NonInteractivePreference(
// Requires a key and title but the actual text is chosen at runtime.
key = "revanced_spoof_video_streams_about_android",
tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference"
),
ListPreference(
key = "revanced_spoof_video_streams_language",
// Language strings are declared in Setting patch.
entriesKey = "revanced_language_entries",
entryValuesKey = "revanced_language_entry_values",
tag = "app.revanced.extension.shared.settings.preference.SortedListPreference"
),
SwitchPreference("revanced_spoof_video_streams_ios_force_avc"),
SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"),
),
ListPreference(
key = "revanced_spoof_video_streams_language",
// Language strings are declared in Setting patch.
entriesKey = "revanced_language_entries",
entryValuesKey = "revanced_language_entry_values",
tag = "app.revanced.extension.shared.settings.preference.SortedListPreference"
),
SwitchPreference("revanced_spoof_video_streams_ios_force_avc"),
SwitchPreference("revanced_spoof_streaming_data_stats_for_nerds"),
),
),
)
})
)
mainActivityOnCreateFingerprint.method.addInstruction(
1, // Must use 1 index so context is set by extension patch.,
"invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V"
)
}
)

View File

@@ -132,6 +132,7 @@ internal val Instruction.registersUsed: List<Int>
get() = when (this) {
is FiveRegisterInstruction -> {
when (registerCount) {
0 -> listOf()
1 -> listOf(registerC)
2 -> listOf(registerC, registerD)
3 -> listOf(registerC, registerD, registerE)

View File

@@ -178,3 +178,15 @@ internal fun Element.copyAttributesFrom(oldContainer: Element) {
setAttribute(attr.name, attr.value)
}
}
/**
* @return The play store services version.
*/
internal fun ResourcePatchContext.findPlayStoreServicesVersion(): Int =
document("res/values/integers.xml").use { document ->
document.documentElement.childNodes.findElementByAttributeValueOrThrow(
"name",
"google_play_services_version",
).textContent.toInt()
}

View File

@@ -1075,10 +1075,12 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_intro_sum">فاصل زمني بدون محتوى فعلي. قد يكون توقفًا مؤقتًا، أو إطارًا ثابتًا، أو رسومًا متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات</string>
<string name="revanced_sb_segments_outro">الخاتمة / تترات النهاية</string>
<string name="revanced_sb_segments_outro_sum">تتر النهاية أو عندما تظهر بطاقات نهاية YouTube، نهايات غير منطوقة. ليس للاستنتاجات مع المعلومات</string>
<string name="revanced_sb_segments_preview">معاينة/موجز/ربط</string>
<string name="revanced_sb_segments_hook">مقدمة / تحيات</string>
<string name="revanced_sb_segments_hook_sum">مقاطع دعائية مروية للفيديو القادم، تحيات ووداعات. لا تشمل الأقسام التي تضيف محتوى إضافيًا</string>
<string name="revanced_sb_segments_preview">معاينة / ملخص</string>
<string name="revanced_sb_segments_preview_sum">مجموعة من المقاطع التي توضح ما هو قادم أو ما حدث في الفيديو أو في مقاطع فيديو أخرى من السلسلة، حيث تتكرر جميع المعلومات في مكان آخر</string>
<string name="revanced_sb_segments_filler">خارج الموضوع/النكات</string>
<string name="revanced_sb_segments_filler_sum">تم إضافة مشاهد ملتقطة خارج الموضوع أو الفكاهة التي ليست مطلوبة لفهم المحتوى الرئيسي للفيديو. لا تتضمن مقاطع توفر تَعبِير أو تفاصيل الخلفية</string>
<string name="revanced_sb_segments_filler">استطراد / نكات</string>
<string name="revanced_sb_segments_filler_sum">مشاهد أو نكات جانبية غير ضرورية لفهم المحتوى الرئيسي للفيديو. لا تشمل الأقسام التي توفر سياقًا أو تفاصيل خلفية</string>
<string name="revanced_sb_segments_nomusic">الموسيقى: مقطع غير موسيقي</string>
<string name="revanced_sb_segments_nomusic_sum">فقط للاستخدام في المقاطع الموسيقية. أقسام المقاطع الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى</string>
<string name="revanced_sb_skip_button_compact">تخطي</string>
@@ -1091,10 +1093,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skip_button_intro_middle">تخطي الفاصل</string>
<string name="revanced_sb_skip_button_intro_end">تخطي الفاصل</string>
<string name="revanced_sb_skip_button_outro">تخطي الخاتمة</string>
<string name="revanced_sb_skip_button_hook">تخطي المقدمة</string>
<string name="revanced_sb_skip_button_preview_beginning">تخطي النظرة العامة</string>
<string name="revanced_sb_skip_button_preview_middle">تخطي النظرة العامة</string>
<string name="revanced_sb_skip_button_preview_end">تخطي الملخص</string>
<string name="revanced_sb_skip_button_filler">تخطي مقطع غير ذي صلة</string>
<string name="revanced_sb_skip_button_filler">تخطي الجزء الجانبي</string>
<string name="revanced_sb_skip_button_nomusic">تخطي غير الموسيقى</string>
<string name="revanced_sb_skip_button_unsubmitted">تخطي المقطع</string>
<string name="revanced_sb_skipped_sponsor">تم تخطي الراعي</string>
@@ -1105,10 +1108,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skipped_intro_middle">تم تخطي الفاصل</string>
<string name="revanced_sb_skipped_intro_end">تم تخطي الفاصل</string>
<string name="revanced_sb_skipped_outro">تم تخطي الخاتمة</string>
<string name="revanced_sb_skipped_hook">تم تخطي المقدمة</string>
<string name="revanced_sb_skipped_preview_beginning">تم تخطي النظرة العامة</string>
<string name="revanced_sb_skipped_preview_middle">تم تخطي النظرة العامة</string>
<string name="revanced_sb_skipped_preview_end">تم تخطي الملخص</string>
<string name="revanced_sb_skipped_filler">تم تخطي مقطع غير ذي صلة</string>
<string name="revanced_sb_skipped_filler">تم تخطي الجزء الجانبي</string>
<string name="revanced_sb_skipped_nomusic">تم تخطي جزء غير موسيقي</string>
<string name="revanced_sb_skipped_unsubmitted">تم تخطي المقطع الغير المرسل</string>
<string name="revanced_sb_skipped_multiple_segments">تم تخطي عدة مقاطع</string>

View File

@@ -1074,10 +1074,12 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
<string name="revanced_sb_segments_intro_sum">Həqiqi məzmunu olmayan aralıq. Fasilə, statik kadr və ya təkrarlanan animasiya ola bilər. Məlumat ehtiva edən keçidlər daxil deyil</string>
<string name="revanced_sb_segments_outro">Son kartlar / Zaminlər</string>
<string name="revanced_sb_segments_outro_sum">Zaminlər və ya YouTube bitiş kartları görünəndə. Məlumat daxil olan nəticələr üçün deyil</string>
<string name="revanced_sb_segments_preview">Önizləmə/Anons/Qısa</string>
<string name="revanced_sb_segments_hook">Giriş / Salamlar</string>
<string name="revanced_sb_segments_hook_sum">Yaxınlaşan video üçün danışılan kadrlar, salamlama və sağollaşma. Əlavə məzmun əlavə edən bölmələr daxil deyil</string>
<string name="revanced_sb_segments_preview">Önizləmə / Anons</string>
<string name="revanced_sb_segments_preview_sum">Videoda və ya seriyanın digər videolarında nə gözlənildiyini və ya baş verdiyini göstərən, bütün məlumatların başqa yerdə təkrarlandığı bölüm toplusu</string>
<string name="revanced_sb_segments_filler">Əlaqəsiz/Zarafatlar</string>
<string name="revanced_sb_segments_filler_sum">Videonun əsas məzmununu başa düşmək tələb olunmayan yalnız əlaqəsiz və ya yumor üçün əlavə edilmiş təsiredici səhnələr. Məzmun və ya arxa plan detallarınıqdim edən bölümlər daxil deyil</string>
<string name="revanced_sb_segments_filler">Əlaqəsiz / Zarafatlar</string>
<string name="revanced_sb_segments_filler_sum">Videonun əsas məzmunun başa düşmək tələb olunmayan əlaqəsiz səhnələr və ya zarafatlar. Məzmun və ya arxa plan təfərrüatlarınımin edən bölmələr daxil deyil</string>
<string name="revanced_sb_segments_nomusic">Musiqi: Musiqi olmayan bölmə</string>
<string name="revanced_sb_segments_nomusic_sum">Yalnız musiqi videolarında istifadə üçün. Artıq başqa kateqoriyaya aid edilməyən musiqisiz musiqi videoları bölmələri</string>
<string name="revanced_sb_skip_button_compact">Ötür</string>
@@ -1090,10 +1092,11 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
<string name="revanced_sb_skip_button_intro_middle">Fasiləni ötür</string>
<string name="revanced_sb_skip_button_intro_end">Fasiləni ötür</string>
<string name="revanced_sb_skip_button_outro">Bitişi ötür</string>
<string name="revanced_sb_skip_button_hook">Girişi ötür</string>
<string name="revanced_sb_skip_button_preview_beginning">Önizləməni ötür</string>
<string name="revanced_sb_skip_button_preview_middle">Önizləməni ötür</string>
<string name="revanced_sb_skip_button_preview_end">Anonsu ötür</string>
<string name="revanced_sb_skip_button_filler">Əlaqəsiz hissəni ötür</string>
<string name="revanced_sb_skip_button_filler">Əlaqəsiz olanı ötür</string>
<string name="revanced_sb_skip_button_nomusic">Musiqisiz hissəni ötür</string>
<string name="revanced_sb_skip_button_unsubmitted">Bölümü ötür</string>
<string name="revanced_sb_skipped_sponsor">Sponsorlu hissə ötürüldü</string>
@@ -1104,10 +1107,11 @@ Sizin istifadəçi Id-niz parol kimidir və heç vaxt paylaşmaq olmaz.
<string name="revanced_sb_skipped_intro_middle">Fasilə ötürüldü</string>
<string name="revanced_sb_skipped_intro_end">Fasilə ötürüldü</string>
<string name="revanced_sb_skipped_outro">Bitiş ötürüldü</string>
<string name="revanced_sb_skipped_hook">Giriş ötürüldü</string>
<string name="revanced_sb_skipped_preview_beginning">Önbaxış ötürüldü</string>
<string name="revanced_sb_skipped_preview_middle">Önbaxış ötürüldü</string>
<string name="revanced_sb_skipped_preview_end">Anons ötürüldü</string>
<string name="revanced_sb_skipped_filler">Əlaqəsiz hissə ötürüldü</string>
<string name="revanced_sb_skipped_filler">Əlaqəsiz ötürüldü</string>
<string name="revanced_sb_skipped_nomusic">Musiqi olmayan bölmə ötürüldü</string>
<string name="revanced_sb_skipped_unsubmitted">Göndərilməmiş bölüm ötürüldü</string>
<string name="revanced_sb_skipped_multiple_segments">Çoxlu bölümlər ötürüldü</string>

View File

@@ -1076,10 +1076,12 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_intro_sum">Інтэрвал без фактычнага зместу. Гэта можа быць паўза, статычны кадр або паўтаральная анімацыя. Не ўключае пераходы, якія змяшчаюць інфармацыю</string>
<string name="revanced_sb_segments_outro">Канцоўкі / Цітры</string>
<string name="revanced_sb_segments_outro_sum">Крэдыты або калі з\"яўляюцца канцавыя карткі YouTube. Не для высноў з інфармацыяй</string>
<string name="revanced_sb_segments_preview">Папярэдні прагляд/Паўзвядзенне/Хук</string>
<string name="revanced_sb_segments_hook">Уступ / Прывітанні</string>
<string name="revanced_sb_segments_hook_sum">Агучаныя трэйлеры для будучага відэа, прывітанні і развітанні. Не ўключае раздзелы, якія дадаюць дадатковы змест</string>
<string name="revanced_sb_segments_preview">Прадпрагляд / Паўтарэнне</string>
<string name="revanced_sb_segments_preview_sum">Калекцыя кліпаў, якія паказваюць, што адбываецца або што адбылося ў відэа ці ў іншых відэа серыі, дзе ўся інфармацыя паўтараецца ў іншым месцы</string>
<string name="revanced_sb_segments_filler">Філер Тангенс / Жарты</string>
<string name="revanced_sb_segments_filler_sum">Датычныя сцэны дададзены толькі для напаўнення або гумару, якія не патрэбныя для разумення асноўнага зместу відэа. Не ўключае сегменты, якія прадстаўляюць кантэкст або даведку</string>
<string name="revanced_sb_segments_filler">Лірычнае адступленне / Жарты</string>
<string name="revanced_sb_segments_filler_sum">Тангенцыяльныя сцэны або жарты, якія не патрабуюцца для разумення асноўнага зместу відэа. Не ўключае раздзелы, якія прадастаўляюць кантэкст або фонавыя дэталі</string>
<string name="revanced_sb_segments_nomusic">Музыка: немузычны раздзел</string>
<string name="revanced_sb_segments_nomusic_sum">Толькі для выкарыстання ў музычных відэа. Раздзелы музычных відэа без музыкі, якія яшчэ не ахоплены іншай катэгорыяй</string>
<string name="revanced_sb_skip_button_compact">Прапусціць</string>
@@ -1092,10 +1094,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skip_button_intro_middle">Прапусціць антракт</string>
<string name="revanced_sb_skip_button_intro_end">Прапусціць антракт</string>
<string name="revanced_sb_skip_button_outro">Прапусціць іншы</string>
<string name="revanced_sb_skip_button_hook">Прапусціць уступ</string>
<string name="revanced_sb_skip_button_preview_beginning">Прапусціць папярэдні прагляд</string>
<string name="revanced_sb_skip_button_preview_middle">Прапусціць папярэдні прагляд</string>
<string name="revanced_sb_skip_button_preview_end">Прапусціць рэзюмэ</string>
<string name="revanced_sb_skip_button_filler">Скіп напаўняльнік</string>
<string name="revanced_sb_skip_button_filler">Прапусціць тангенс</string>
<string name="revanced_sb_skip_button_nomusic">Прапусціць не музыку</string>
<string name="revanced_sb_skip_button_unsubmitted">Прапусціць сегмент</string>
<string name="revanced_sb_skipped_sponsor">Прапусціў спонсара</string>
@@ -1106,10 +1109,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skipped_intro_middle">Прапушчаны антракт</string>
<string name="revanced_sb_skipped_intro_end">Прапушчаны антракт</string>
<string name="revanced_sb_skipped_outro">Прапушчаны выхад</string>
<string name="revanced_sb_skipped_hook">Уступ прапушчаны</string>
<string name="revanced_sb_skipped_preview_beginning">Прапушчаны папярэдні прагляд</string>
<string name="revanced_sb_skipped_preview_middle">Прапушчаны папярэдні прагляд</string>
<string name="revanced_sb_skipped_preview_end">Прапушчаны рэзюмэ</string>
<string name="revanced_sb_skipped_filler">Прапушчаны напаўняльнік</string>
<string name="revanced_sb_skipped_filler">Тангенс прапушчаны</string>
<string name="revanced_sb_skipped_nomusic">Прапусціў немузычны раздзел</string>
<string name="revanced_sb_skipped_unsubmitted">Прапушчаны неадпраўлены сегмент</string>
<string name="revanced_sb_skipped_multiple_segments">Прапушчаны некалькі сегментаў</string>

View File

@@ -1075,10 +1075,12 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_intro_sum">Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация</string>
<string name="revanced_sb_segments_outro">Край на клипа / Надписи</string>
<string name="revanced_sb_segments_outro_sum">Информация или когато се показват крайните карти на YouTube. Не за заключения с информация</string>
<string name="revanced_sb_segments_preview">Кратък преглед/Обобщение</string>
<string name="revanced_sb_segments_hook">Начало / Поздрави</string>
<string name="revanced_sb_segments_hook_sum">Озвучени трейлъри за предстоящото видео, поздрави и сбогувания. Не включва секции, които добавят допълнително съдържание</string>
<string name="revanced_sb_segments_preview">Предварителен преглед / Резюме</string>
<string name="revanced_sb_segments_preview_sum">Колекция от клипове, които показват какво предстои в този видеоклип или в други видеоклипове от поредицата, където цялата информация се повтаря по-късно във видеоклипа</string>
<string name="revanced_sb_segments_filler">Пълнеж/Шеги</string>
<string name="revanced_sb_segments_filler_sum">Сцени извън темата, добавени само за пълнеж или хумор, които не са необходими за разбирането на основното съдържание на видеоклипа. Това не трябва да включва сегменти, предоставящи контекст или справочни данни</string>
<string name="revanced_sb_segments_filler">Отклонение / Шеги</string>
<string name="revanced_sb_segments_filler_sum">Странични сцени или шеги, които не са необходими за разбиране на основното съдържание на видеоклипа. Не включва секции, предоставящи контекст или фонови детайли</string>
<string name="revanced_sb_segments_nomusic">Музика: Част без музика</string>
<string name="revanced_sb_segments_nomusic_sum">За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория</string>
<string name="revanced_sb_skip_button_compact">Пропусни</string>
@@ -1091,10 +1093,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skip_button_intro_middle">Пропусни пауза</string>
<string name="revanced_sb_skip_button_intro_end">Пропусни пауза</string>
<string name="revanced_sb_skip_button_outro">Пропусни заключение</string>
<string name="revanced_sb_skip_button_hook">Пропускане на увод</string>
<string name="revanced_sb_skip_button_preview_beginning">Пропусни преглед</string>
<string name="revanced_sb_skip_button_preview_middle">Пропусни преглед</string>
<string name="revanced_sb_skip_button_preview_end">Пропуснете обобщението</string>
<string name="revanced_sb_skip_button_filler">Пропусни пълнеж</string>
<string name="revanced_sb_skip_button_filler">Пропускане на отклонение</string>
<string name="revanced_sb_skip_button_nomusic">Пропусни част без музика</string>
<string name="revanced_sb_skip_button_unsubmitted">Пропускане на сегмент</string>
<string name="revanced_sb_skipped_sponsor">Пропуснат спонсор</string>
@@ -1105,10 +1108,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skipped_intro_middle">Пропусни паузи</string>
<string name="revanced_sb_skipped_intro_end">Пропусни паузи</string>
<string name="revanced_sb_skipped_outro">Пропуснато заключение</string>
<string name="revanced_sb_skipped_hook">Пропуснато увод</string>
<string name="revanced_sb_skipped_preview_beginning">Пропуснат преглед</string>
<string name="revanced_sb_skipped_preview_middle">Пропуснат преглед</string>
<string name="revanced_sb_skipped_preview_end">Пропуснато повторение</string>
<string name="revanced_sb_skipped_filler">Пропуснат пълнеж</string>
<string name="revanced_sb_skipped_filler">Пропуснато отклонение</string>
<string name="revanced_sb_skipped_nomusic">Пропусната част без музика</string>
<string name="revanced_sb_skipped_unsubmitted">Пропуснат неизпратен сегмент</string>
<string name="revanced_sb_skipped_multiple_segments">Пропуснати множество части</string>

View File

@@ -1070,10 +1070,12 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
<string name="revanced_sb_segments_intro_sum">প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয়</string>
<string name="revanced_sb_segments_outro">এন্ডকার্ডস / কৃতজ্ঞতা স্বীকার</string>
<string name="revanced_sb_segments_outro_sum">ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয়</string>
<string name="revanced_sb_segments_preview">পূর্বরূপ/সংক্ষিপ্তবৃত্তি/হুক</string>
<string name="revanced_sb_segments_hook">হুক / শুভেচ্ছা</string>
<string name="revanced_sb_segments_hook_sum">আসন্ন ভিডিওর জন্য বর্ণিত ট্রেলার, শুভেচ্ছা এবং বিদায়। এমন অংশগুলি অন্তর্ভুক্ত নয় যা অতিরিক্ত সামগ্রী যোগ করে।</string>
<string name="revanced_sb_segments_preview">পূর্বরূপ / সারসংক্ষেপ</string>
<string name="revanced_sb_segments_preview_sum">একটি সমষ্টি ক্লিপ সমূহ যা ভিডিওতে এসে যা হচ্ছে বা অন্য ভিডিও সিরিজে ঘটেছে সেগুলি দেখায় যেখানে সমস্ত তথ্য অন্যত্র পুনরাবৃত্তি করা হয়</string>
<string name="revanced_sb_segments_filler">স্পর্শক/কৌতুক ফিল্টার করুন</string>
<string name="revanced_sb_segments_filler_sum">স্পর্শকাতর দৃশ্যগুলি শুধুমাত্র ফিলার বা হাস্যরসের জন্য যোগ করা হয়েছে যা ভিডিওর মূল বিষয়বস্তু বোঝার প্রয়োজন নেই। প্রসঙ্গ বা পটভূমি বিশদ প্রদানকারী বিভাগগুলি এতে অন্তর্ভুক্ত করা উচিত নয়</string>
<string name="revanced_sb_segments_filler">অপ্রাসঙ্গিক / কৌতুক</string>
<string name="revanced_sb_segments_filler_sum">পার্শ্বীয় দৃশ্য বা কৌতুক যা ভিডিওর মূল বিষবস্তু বোঝার জন্য অপরিহার্য নয়। প্রসঙ্গ বা পটভূমি বিশদ প্রদানকারী অংশগুলি অন্তর্ভুক্ত নয়।</string>
<string name="revanced_sb_segments_nomusic">সঙ্গীত: সঙ্গীতবিহীন অংশ</string>
<string name="revanced_sb_segments_nomusic_sum">শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়।</string>
<string name="revanced_sb_skip_button_compact">এড়িয়ে যান</string>
@@ -1086,10 +1088,11 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
<string name="revanced_sb_skip_button_intro_middle">উপসংহার এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_intro_end">উপসংহার এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_outro">শেষ অংশ এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_hook">হুক এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_preview_beginning">প্রিভিউ এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_preview_middle">প্রিভিউ এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_preview_end">সংক্ষিপ্তবৃত্তি এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_filler">ফিল্টার এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_filler">প্রাসঙ্গিকতা এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_nomusic">সঙ্গীত-বিহীন অংশ এড়িয়ে যান</string>
<string name="revanced_sb_skip_button_unsubmitted">সেগমেন্ট এড়িয়ে যান</string>
<string name="revanced_sb_skipped_sponsor">স্পন্সর এড়িয়ে গেছে</string>
@@ -1100,10 +1103,11 @@ YouTube সেটিংসে অটো প্লে পরিবর্তন
<string name="revanced_sb_skipped_intro_middle">উপসংহার এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_intro_end">উপসংহার এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_outro">শেষ অংশ এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_hook">হুক এড়িয়ে যাওয়া হয়েছে</string>
<string name="revanced_sb_skipped_preview_beginning">প্রাকদর্শন এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_preview_middle">প্রাকদর্শন এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_preview_end">সংক্ষিপ্তবৃত্তি এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_filler">ফিল্টার এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_filler">প্রাসঙ্গিকতা এড়িয়ে যাওয়া হয়েছে</string>
<string name="revanced_sb_skipped_nomusic">একটি সঙ্গীতবিহীন অংশ এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_unsubmitted">জমা না হওয়া সেগমেন্ট এড়িয়ে গেছে</string>
<string name="revanced_sb_skipped_multiple_segments">একটানা একাধিক সেগমেন্ট এড়িয়ে গেছে</string>

View File

@@ -1075,10 +1075,12 @@ Vaše ID uživatele je jako heslo a nikdy by nemělo být sdíleno."</string>
<string name="revanced_sb_segments_intro_sum">Interval bez skutečného obsahu. Může to být pauza, statický snímek nebo opakující se animace. Neobsahuje přechody s informacemi</string>
<string name="revanced_sb_segments_outro">Outro / Závěrečné titulky</string>
<string name="revanced_sb_segments_outro_sum">Titulky nebo když se objeví závěrečné karty YouTube. Ne pro závěry s informacemi</string>
<string name="revanced_sb_segments_preview">Náhled/Shrnutí/Háček</string>
<string name="revanced_sb_segments_hook">Úvod / Pozdravy</string>
<string name="revanced_sb_segments_hook_sum">Komentované upoutávky na nadcházející video, pozdravy a rozloučení. Neobsahuje sekce, které přidávají další obsah</string>
<string name="revanced_sb_segments_preview">Náhled / Shrnutí</string>
<string name="revanced_sb_segments_preview_sum">Sbírka klipů, které ukazují, co se chystá nebo co se stalo ve videu nebo v jiných videích série, kde jsou všechny informace opakované jinde</string>
<string name="revanced_sb_segments_filler">Výplň / vtipy</string>
<string name="revanced_sb_segments_filler_sum">Vedlejší scény přidány pouze pro výplň nebo humor, které nejsou nutné pro pochopení hlavního obsahu videa. Neobsahuje segmenty poskytující kontext nebo podrobnosti o pozadí</string>
<string name="revanced_sb_segments_filler">Odbočka / Vtipy</string>
<string name="revanced_sb_segments_filler_sum">Vedlejší scény nebo vtipy, které nejsou nutné k pochopení hlavního obsahu videa. Neobsahuje sekce poskytující kontext nebo podrobnosti na pozadí</string>
<string name="revanced_sb_segments_nomusic">Hudba: nehudební sekce</string>
<string name="revanced_sb_segments_nomusic_sum">Pouze pro použití v hudebních videích. Sekce hudebních videí bez hudby, které nejsou již pokryty jinou kategorií</string>
<string name="revanced_sb_skip_button_compact">Přeskočit</string>
@@ -1091,10 +1093,11 @@ Vaše ID uživatele je jako heslo a nikdy by nemělo být sdíleno."</string>
<string name="revanced_sb_skip_button_intro_middle">Přeskočit přestávku</string>
<string name="revanced_sb_skip_button_intro_end">Přeskočit přestávku</string>
<string name="revanced_sb_skip_button_outro">Přeskočit závěr</string>
<string name="revanced_sb_skip_button_hook">Přeskočit úvod</string>
<string name="revanced_sb_skip_button_preview_beginning">Přeskočit náhled</string>
<string name="revanced_sb_skip_button_preview_middle">Přeskočit náhled</string>
<string name="revanced_sb_skip_button_preview_end">Přeskočit shrnutí</string>
<string name="revanced_sb_skip_button_filler">Přeskočit výplň</string>
<string name="revanced_sb_skip_button_filler">Přeskočit vedlejší část</string>
<string name="revanced_sb_skip_button_nomusic">Přeskočit bez hudby</string>
<string name="revanced_sb_skip_button_unsubmitted">Přeskočit segment</string>
<string name="revanced_sb_skipped_sponsor">Sponzor přeskočen</string>
@@ -1105,10 +1108,11 @@ Vaše ID uživatele je jako heslo a nikdy by nemělo být sdíleno."</string>
<string name="revanced_sb_skipped_intro_middle">Přeskočena přestávka</string>
<string name="revanced_sb_skipped_intro_end">Přeskočena přestávka</string>
<string name="revanced_sb_skipped_outro">Outro přeskočeno</string>
<string name="revanced_sb_skipped_hook">Úvod přeskočen</string>
<string name="revanced_sb_skipped_preview_beginning">Přeskočena ukázka/rekapitulace</string>
<string name="revanced_sb_skipped_preview_middle">Přeskočena ukázka/rekapitulace</string>
<string name="revanced_sb_skipped_preview_end">Přeskočeno shrnutí</string>
<string name="revanced_sb_skipped_filler">Přeskočená nepodstatná výplň videa</string>
<string name="revanced_sb_skipped_filler">Vedlejší část přeskočena</string>
<string name="revanced_sb_skipped_nomusic">Přeskočena nehudební sekce</string>
<string name="revanced_sb_skipped_unsubmitted">Přeskočen neodeslaný segment</string>
<string name="revanced_sb_skipped_multiple_segments">Přeskočeno více segmentů</string>

View File

@@ -1077,10 +1077,12 @@ Dit bruger-id er som en adgangskode, og det må aldrig deles.
<string name="revanced_sb_segments_intro_sum">Et interval uden reelt indhold. Kunne være en pause, statisk ramme eller gentagelse af animation. Omfatter ikke overgange indeholdende information</string>
<string name="revanced_sb_segments_outro">Slutkort / Kredit</string>
<string name="revanced_sb_segments_outro_sum">Medvirkende eller når YouTube-endcards vises. Ikke for konklusioner med information</string>
<string name="revanced_sb_segments_preview">Forhåndsvisning/Genoptag/Krog</string>
<string name="revanced_sb_segments_hook">Intro / Hilsener</string>
<string name="revanced_sb_segments_hook_sum">Fortalte trailere for den kommende video, hilsener og farvel. Indeholder ikke afsnit, der tilføjer yderligere indhold</string>
<string name="revanced_sb_segments_preview">Forhåndsvisning / Resumé</string>
<string name="revanced_sb_segments_preview_sum">Indsamling af klip, der viser, hvad der kommer op, eller hvad der skete i videoen eller i andre videoer af en serie, hvor alle oplysninger gentages andetsteds</string>
<string name="revanced_sb_segments_filler">Fyldstof-tangent/jokes</string>
<string name="revanced_sb_segments_filler_sum">Tangential scener tilføjet kun for fyldstof eller humor, der ikke er forpligtet til at forstå hovedindholdet af videoen. Omfatter ikke segmenter, der giver kontekst- eller baggrundsoplysninger</string>
<string name="revanced_sb_segments_filler">Sidespor / Vittigheder</string>
<string name="revanced_sb_segments_filler_sum">Tangentielle scener eller vittigheder, der ikke er nødvendige for at forstå videoens hovedindhold. Indeholder ikke afsnit, der giver kontekst eller baggrundsoplysninger</string>
<string name="revanced_sb_segments_nomusic">Musik: Ikke-Musik Sektion</string>
<string name="revanced_sb_segments_nomusic_sum">Kun til brug i musikvideoer. Sektioner af musikvideoer uden musik, der ikke allerede er dækket af en anden kategori</string>
<string name="revanced_sb_skip_button_compact">Overspring</string>
@@ -1093,10 +1095,11 @@ Dit bruger-id er som en adgangskode, og det må aldrig deles.
<string name="revanced_sb_skip_button_intro_middle">Spring intermission over</string>
<string name="revanced_sb_skip_button_intro_end">Spring intermission over</string>
<string name="revanced_sb_skip_button_outro">Spring outro over</string>
<string name="revanced_sb_skip_button_hook">Spring hook over</string>
<string name="revanced_sb_skip_button_preview_beginning">Spring forhåndsvisning over</string>
<string name="revanced_sb_skip_button_preview_middle">Spring forhåndsvisning over</string>
<string name="revanced_sb_skip_button_preview_end">Spring resumé over</string>
<string name="revanced_sb_skip_button_filler">Spring filler over</string>
<string name="revanced_sb_skip_button_filler">Spring tangent over</string>
<string name="revanced_sb_skip_button_nomusic">Spring over ikke-musik</string>
<string name="revanced_sb_skip_button_unsubmitted">Overspring segment</string>
<string name="revanced_sb_skipped_sponsor">Sponsor sprunget over</string>
@@ -1107,10 +1110,11 @@ Dit bruger-id er som en adgangskode, og det må aldrig deles.
<string name="revanced_sb_skipped_intro_middle">Intermission sprunget over</string>
<string name="revanced_sb_skipped_intro_end">Intermission sprunget over</string>
<string name="revanced_sb_skipped_outro">Sprunget over outro</string>
<string name="revanced_sb_skipped_hook">Hook sprunget over</string>
<string name="revanced_sb_skipped_preview_beginning">Forklaring sprunget over</string>
<string name="revanced_sb_skipped_preview_middle">Forklaring sprunget over</string>
<string name="revanced_sb_skipped_preview_end">Oversprunget resumé</string>
<string name="revanced_sb_skipped_filler">Fyldstof sprunget over</string>
<string name="revanced_sb_skipped_filler">Tangent sprunget over</string>
<string name="revanced_sb_skipped_nomusic">Oversprunget en ikke-musiksektion over</string>
<string name="revanced_sb_skipped_unsubmitted">Uindsendt segment sprunget over</string>
<string name="revanced_sb_skipped_multiple_segments">Oversprunget over flere segmenter</string>

View File

@@ -1070,10 +1070,12 @@ Ihre Benutzer-ID ist wie ein Passwort und sollte niemals weitergegeben werden.
<string name="revanced_sb_segments_intro_sum">Ein Intervall ohne aktuellen Inhalt. Kann eine Pause, ein statischer Rahmen oder eine Wiederholung der Animation sein. Enthält keine Übergänge mit Informationen</string>
<string name="revanced_sb_segments_outro">Endkarten / Credits</string>
<string name="revanced_sb_segments_outro_sum">Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für Schlussfolgerungen mit Informationen</string>
<string name="revanced_sb_segments_preview">Vorschau/Recap/Hook</string>
<string name="revanced_sb_segments_hook">Hook / Begrüßungen</string>
<string name="revanced_sb_segments_hook_sum">Erzählte Trailer für das kommende Video, Begrüßungen und Verabschiedungen. Enthält keine Abschnitte, die zusätzlichen Inhalt hinzufügen</string>
<string name="revanced_sb_segments_preview">Vorschau / Rückblick</string>
<string name="revanced_sb_segments_preview_sum">Sammlung von Clips, die zeigen, was im Video oder in anderen Videos einer Serie vor sich geht, wo alle Informationen andernorts wiederholt werden</string>
<string name="revanced_sb_segments_filler">Füller/Witze</string>
<string name="revanced_sb_segments_filler_sum">Tangentielle Szenen, die nur für Füller oder Humor hinzugefügt werden, die nicht erforderlich sind, um den Hauptinhalt des Videos zu verstehen. Enthält keine Segmente mit Kontext oder Hintergrunddetails</string>
<string name="revanced_sb_segments_filler">Abschweifung / Witze</string>
<string name="revanced_sb_segments_filler_sum">Tangentiale Szenen oder Witze, die nicht erforderlich sind, um den Hauptinhalt des Videos zu verstehen. Dies sollte keine Segmente enthalten, die Kontext oder Hintergrunddetails liefern</string>
<string name="revanced_sb_segments_nomusic">Musik: Nicht-Musik-Sektion</string>
<string name="revanced_sb_segments_nomusic_sum">Nur für die Verwendung in Musikvideos. Abschnitte von Musikvideos ohne Musik, die noch nicht von einer anderen Kategorie abgedeckt sind</string>
<string name="revanced_sb_skip_button_compact">Überspringen</string>
@@ -1086,10 +1088,11 @@ Ihre Benutzer-ID ist wie ein Passwort und sollte niemals weitergegeben werden.
<string name="revanced_sb_skip_button_intro_middle">Unterbrechung überspringen</string>
<string name="revanced_sb_skip_button_intro_end">Unterbrechung überspringen</string>
<string name="revanced_sb_skip_button_outro">Überspringen</string>
<string name="revanced_sb_skip_button_hook">Hook überspringen</string>
<string name="revanced_sb_skip_button_preview_beginning">Vorschau überspringen</string>
<string name="revanced_sb_skip_button_preview_middle">Vorschau überspringen</string>
<string name="revanced_sb_skip_button_preview_end">Rückfall überspringen</string>
<string name="revanced_sb_skip_button_filler">Füller überspringen</string>
<string name="revanced_sb_skip_button_filler">Abschweifung überspringen</string>
<string name="revanced_sb_skip_button_nomusic">Nicht-Musik überspringen</string>
<string name="revanced_sb_skip_button_unsubmitted">Segment überspringen</string>
<string name="revanced_sb_skipped_sponsor">Sponsor übersprungen</string>
@@ -1100,10 +1103,11 @@ Ihre Benutzer-ID ist wie ein Passwort und sollte niemals weitergegeben werden.
<string name="revanced_sb_skipped_intro_middle">Übersprungene Unterbrechung</string>
<string name="revanced_sb_skipped_intro_end">Übersprungene Unterbrechung</string>
<string name="revanced_sb_skipped_outro">Outro übersprungen</string>
<string name="revanced_sb_skipped_hook">Hook übersprungen</string>
<string name="revanced_sb_skipped_preview_beginning">Vorschau übersprungen</string>
<string name="revanced_sb_skipped_preview_middle">Vorschau übersprungen</string>
<string name="revanced_sb_skipped_preview_end">Übersprungene Rücklage</string>
<string name="revanced_sb_skipped_filler">Füller übersprungen</string>
<string name="revanced_sb_skipped_filler">Abschweifung übersprungen</string>
<string name="revanced_sb_skipped_nomusic">Nicht-Musik-Sektion übersprungen</string>
<string name="revanced_sb_skipped_unsubmitted">Nicht übermitteltes Segment übersprungen</string>
<string name="revanced_sb_skipped_multiple_segments">Mehrere Segmente übersprungen</string>

View File

@@ -1076,10 +1076,12 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_intro_sum">Χρονικό διάστημα χωρίς πραγματικό περιεχόμενο. Θα μπορούσε να είναι μια παύση, ένα στατικό καρέ ή μια επαναλαμβανόμενη κίνηση. Δεν περιλαμβάνει μεταβάσεις που περιέχουν πληροφορίες</string>
<string name="revanced_sb_segments_outro">Τελική Οθόνη / Συντελεστές</string>
<string name="revanced_sb_segments_outro_sum">Όταν εμφανίζονται οι συντελεστές ή τα προτεινόμενα βίντεο των καναλιών. Όχι για επίλογους που περιέχουν πληροφορίες</string>
<string name="revanced_sb_segments_preview">Προεπισκόπηση/Περίληψη</string>
<string name="revanced_sb_segments_hook">Έναρξη / Χαιρετισμοί</string>
<string name="revanced_sb_segments_hook_sum">Αφηγηματικά τρέιλερ για το επερχόμενο βίντεο, χαιρετισμοί και αποχαιρετισμοί. Δεν περιλαμβάνει τμήματα που προσθέτουν επιπλέον περιεχόμενο</string>
<string name="revanced_sb_segments_preview">Προεπισκόπηση / Περίληψη</string>
<string name="revanced_sb_segments_preview_sum">Συλλογή από κλιπ που δείχνουν τι έρχεται ή τι συνέβη στο βίντεο ή σε άλλα βίντεο μιας σειράς, όπου όλες οι πληροφορίες επαναλαμβάνονται αλλού</string>
<string name="revanced_sb_segments_filler">Σπατάλη Χρόνου/Αστεία</string>
<string name="revanced_sb_segments_filler_sum">Παρεμβατικές σκηνές που προστίθενται μόνο για γέμισμα του βίντεο ή χιούμορ οι οποίες δεν είναι απαραίτητες για την κατανόηση του κύριου περιεχομένου του βίντεο. Δεν περιλαμβάνει τμήματα που παρέχουν συνάφεια ή λεπτομέρειες ως υπόβαθρο</string>
<string name="revanced_sb_segments_filler">Εφαπτομενικές Σκηνές / Αστεία</string>
<string name="revanced_sb_segments_filler_sum">Παρεμβατικές σκηνές ή αστεία που δεν είναι απαραίτητα για την κατανόηση του κύριου περιεχομένου του βίντεο. Δεν περιλαμβάνει τμήματα που παρέχουν πλαίσιο ή λεπτομέρειες υποβάθρου</string>
<string name="revanced_sb_segments_nomusic">Μουσική: Τμήμα χωρίς μουσική</string>
<string name="revanced_sb_segments_nomusic_sum">Μόνο για χρήση σε βίντεο μουσικής. Τμήματα χωρίς μουσική σε βίντεο μουσικής, που δεν καλύπτονται ήδη από άλλη κατηγορία</string>
<string name="revanced_sb_skip_button_compact">Παράλειψη</string>
@@ -1092,10 +1094,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skip_button_intro_middle">Παράλειψη διακοπής</string>
<string name="revanced_sb_skip_button_intro_end">Παράλειψη διακοπής</string>
<string name="revanced_sb_skip_button_outro">Παράλειψη επιλόγου</string>
<string name="revanced_sb_skip_button_hook">Παράλειψη έναρξης</string>
<string name="revanced_sb_skip_button_preview_beginning">Παράλειψη προεπισκόπησης</string>
<string name="revanced_sb_skip_button_preview_middle">Παράλειψη προεπισκόπησης</string>
<string name="revanced_sb_skip_button_preview_end">Παράλειψη περίληψης</string>
<string name="revanced_sb_skip_button_filler">Παράλειψη σπατάλης χρόνου</string>
<string name="revanced_sb_skip_button_filler">Παράλειψη παρέκβασης</string>
<string name="revanced_sb_skip_button_nomusic">Παράλειψη μη-μουσικού</string>
<string name="revanced_sb_skip_button_unsubmitted">Παράλειψη τμήματος</string>
<string name="revanced_sb_skipped_sponsor">Παραλείφθηκε ο χορηγός</string>
@@ -1106,10 +1109,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skipped_intro_middle">Παραλείφθηκε η διακοπή</string>
<string name="revanced_sb_skipped_intro_end">Παραλείφθηκε η διακοπή</string>
<string name="revanced_sb_skipped_outro">Παραλείφθηκε ο επίλογος</string>
<string name="revanced_sb_skipped_hook">Παραλείφθηκε η έναρξη</string>
<string name="revanced_sb_skipped_preview_beginning">Παραλείφθηκε η προεπισκόπηση</string>
<string name="revanced_sb_skipped_preview_middle">Παραλείφθηκε η προεπισκόπηση</string>
<string name="revanced_sb_skipped_preview_end">Παραλείφθηκε η περίληψη</string>
<string name="revanced_sb_skipped_filler">Παραλείφθηκε η σπατάλη χρόνου</string>
<string name="revanced_sb_skipped_filler">Παραλείφθηκε η παρέκβαση</string>
<string name="revanced_sb_skipped_nomusic">Παραλείφθηκε τμήμα χωρίς μουσική</string>
<string name="revanced_sb_skipped_unsubmitted">Παραλήφθηκε μη υποβληθέν τμήμα</string>
<string name="revanced_sb_skipped_multiple_segments">Παραλείφθηκαν πολλαπλά τμήματα</string>

View File

@@ -1074,10 +1074,12 @@ Tu ID de usuario es como una contraseña y nunca debe compartirse."</string>
<string name="revanced_sb_segments_intro_sum">Un intervalo sin contenido real. Podría ser una pausa, marco estático o animación de repetición. No incluye transiciones que contengan información</string>
<string name="revanced_sb_segments_outro">Tarjetas finales / Créditos</string>
<string name="revanced_sb_segments_outro_sum">Créditos o cuando aparecen las tarjetas finales de YouTube. No para conclusiones con información</string>
<string name="revanced_sb_segments_preview">Vista previa/Resumen/Enganche</string>
<string name="revanced_sb_segments_hook">Enganche / Saludos</string>
<string name="revanced_sb_segments_hook_sum">Tráilers narrados para el próximo video, saludos y despedidas. No incluye secciones que añadan contenido adicional</string>
<string name="revanced_sb_segments_preview">Vista previa / Resumen</string>
<string name="revanced_sb_segments_preview_sum">Colección de clips que muestran lo que viene o lo que pasó en el vídeo o en otros videos de una serie, donde toda la información se repite en otro lugar</string>
<string name="revanced_sb_segments_filler">Bromas de relleno</string>
<string name="revanced_sb_segments_filler_sum">Escenas tangenciales añadidas sólo para relleno o humor que no están obligadas a entender el contenido principal del vídeo. No incluye segmentos proporcionando detalles de contexto o fondo</string>
<string name="revanced_sb_segments_filler">Digresión / Chistes</string>
<string name="revanced_sb_segments_filler_sum">Escenas o chistes tangenciales que no son necesarios para entender el contenido principal del video. No incluye secciones que proporcionen contexto o detalles de fondo</string>
<string name="revanced_sb_segments_nomusic">Música: Sección sin música</string>
<string name="revanced_sb_segments_nomusic_sum">Sólo para usar en vídeos de música. Secciones de vídeos de música sin música, que no están cubiertas por otra categoría</string>
<string name="revanced_sb_skip_button_compact">Saltar</string>
@@ -1090,10 +1092,11 @@ Tu ID de usuario es como una contraseña y nunca debe compartirse."</string>
<string name="revanced_sb_skip_button_intro_middle">Omitir intermisión</string>
<string name="revanced_sb_skip_button_intro_end">Omitir intermisión</string>
<string name="revanced_sb_skip_button_outro">Saltar outro</string>
<string name="revanced_sb_skip_button_hook">Omitir gancho</string>
<string name="revanced_sb_skip_button_preview_beginning">Saltar vista previa</string>
<string name="revanced_sb_skip_button_preview_middle">Saltar vista previa</string>
<string name="revanced_sb_skip_button_preview_end">Saltar resumen</string>
<string name="revanced_sb_skip_button_filler">Saltar relleno</string>
<string name="revanced_sb_skip_button_filler">Omitir tangencial</string>
<string name="revanced_sb_skip_button_nomusic">Omitir no música</string>
<string name="revanced_sb_skip_button_unsubmitted">Saltar Segmento</string>
<string name="revanced_sb_skipped_sponsor">Omitir patrocinio</string>
@@ -1104,10 +1107,11 @@ Tu ID de usuario es como una contraseña y nunca debe compartirse."</string>
<string name="revanced_sb_skipped_intro_middle">Intermisión omitida</string>
<string name="revanced_sb_skipped_intro_end">Intermisión omitida</string>
<string name="revanced_sb_skipped_outro">Outro omitida</string>
<string name="revanced_sb_skipped_hook">Gancho omitido</string>
<string name="revanced_sb_skipped_preview_beginning">Vista previa omitida</string>
<string name="revanced_sb_skipped_preview_middle">Vista previa omitida</string>
<string name="revanced_sb_skipped_preview_end">Resumen omitido</string>
<string name="revanced_sb_skipped_filler">Relleno omitido</string>
<string name="revanced_sb_skipped_filler">Tangencial omitido</string>
<string name="revanced_sb_skipped_nomusic">Se omitió una sección de no musical</string>
<string name="revanced_sb_skipped_unsubmitted">Un segmento no enviado fue omitido</string>
<string name="revanced_sb_skipped_multiple_segments">Se omitieron varios segmentos</string>

View File

@@ -1075,10 +1075,12 @@ Teie kasutajatunnis on nagu parool ja seda ei tohiks kunagi jagada.
<string name="revanced_sb_segments_intro_sum">Ajavahemik, millel pole tegelikku sisu. Võib olla paus, staatiline kaader või korduv animatsioon. Ei sisalda üleminekuid, mis sisaldavad teavet</string>
<string name="revanced_sb_segments_outro">Lõpukaardid / Tiitrid</string>
<string name="revanced_sb_segments_outro_sum">Tiitrid või YouTube\'i lõppkaardid. Ei ole mõeldud järelduste jaoks, mis sisaldavad teavet</string>
<string name="revanced_sb_segments_preview">Eelvaade/Kokkuvõte/Konks</string>
<string name="revanced_sb_segments_hook">Konks / Tervitused</string>
<string name="revanced_sb_segments_hook_sum">Jutustatud treilerid eelseisvatele videotele, tervitused ja hüvasti jätmised. Ei hõlma osi, mis lisavad täiendavat sisu</string>
<string name="revanced_sb_segments_preview">Eelvaade / Kokkuvõte</string>
<string name="revanced_sb_segments_preview_sum">Klipi kogum, mis näitab, mis tulemas on või mis juhtus videos või teistes sarja videotes, kus kogu teave on korduv</string>
<string name="revanced_sb_segments_filler">Täiteaine/Naljad</string>
<string name="revanced_sb_segments_filler_sum">Tangentsiaalsed stseenid, mis on lisatud ainult täiteainena või huumorina, mis ei ole vajalikud video peamise sisu mõistmiseks. Ei sisalda segmente, mis annavad konteksti või taustateavet</string>
<string name="revanced_sb_segments_filler">Kõrvalepõige / Naljad</string>
<string name="revanced_sb_segments_filler_sum">Kõrvalised stseenid või naljad, mis pole video peamise sisu mõistmiseks vajalikud. Ei hõlma osi, mis pakuvad konteksti või taustateavet</string>
<string name="revanced_sb_segments_nomusic">Muusika: Muusikavaba osa</string>
<string name="revanced_sb_segments_nomusic_sum">Ainult muusikavideote puhul. Muusikavideote osad ilma muusikata, mis ei ole juba kaetud mõne teise kategooriaga</string>
<string name="revanced_sb_skip_button_compact">Jäta vahele</string>
@@ -1091,10 +1093,11 @@ Teie kasutajatunnis on nagu parool ja seda ei tohiks kunagi jagada.
<string name="revanced_sb_skip_button_intro_middle">Jäta vahepausini</string>
<string name="revanced_sb_skip_button_intro_end">Jäta vahepausini</string>
<string name="revanced_sb_skip_button_outro">Jäta lõppuni</string>
<string name="revanced_sb_skip_button_hook">Jäta sissejuhatus vahele</string>
<string name="revanced_sb_skip_button_preview_beginning">Jäta eelvaatesse</string>
<string name="revanced_sb_skip_button_preview_middle">Jäta eelvaatesse</string>
<string name="revanced_sb_skip_button_preview_end">Jäta kokkuvõttes</string>
<string name="revanced_sb_skip_button_filler">Jäta täiteaine vahele</string>
<string name="revanced_sb_skip_button_filler">Jäta kõrvalepõige vahele</string>
<string name="revanced_sb_skip_button_nomusic">Jäta muusikavaba osa vahele</string>
<string name="revanced_sb_skip_button_unsubmitted">Jäta segment vahele</string>
<string name="revanced_sb_skipped_sponsor">Reklaam vahele jäetud</string>
@@ -1105,10 +1108,11 @@ Teie kasutajatunnis on nagu parool ja seda ei tohiks kunagi jagada.
<string name="revanced_sb_skipped_intro_middle">Vahepaus vahele jäetud</string>
<string name="revanced_sb_skipped_intro_end">Vahepaus vahele jäetud</string>
<string name="revanced_sb_skipped_outro">Lõpp vahele jäetud</string>
<string name="revanced_sb_skipped_hook">Sissejuhatus vahele jäetud</string>
<string name="revanced_sb_skipped_preview_beginning">Eelvaade vahele jäetud</string>
<string name="revanced_sb_skipped_preview_middle">Eelvaade vahele jäetud</string>
<string name="revanced_sb_skipped_preview_end">Kokkuvõte vahele jäetud</string>
<string name="revanced_sb_skipped_filler">Täiteaine vahele jäetud</string>
<string name="revanced_sb_skipped_filler">Kõrvalepõige vahele jäetud</string>
<string name="revanced_sb_skipped_nomusic">Muusikavaba osa vahele jäetud</string>
<string name="revanced_sb_skipped_unsubmitted">Esitamata segment vahele jäetud</string>
<string name="revanced_sb_skipped_multiple_segments">Mitmed segmendid vahele jäetud</string>

View File

@@ -1072,10 +1072,12 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
<string name="revanced_sb_segments_intro_sum">Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys tai toistuva animaatio. Ei sisällä siirtymiä, jotka sisältävät tietoa</string>
<string name="revanced_sb_segments_outro">Loppukortit / Tekijätiedot</string>
<string name="revanced_sb_segments_outro_sum">Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille, joissa on tietoa</string>
<string name="revanced_sb_segments_preview">Esikatselu/Kertaus/Koukku</string>
<string name="revanced_sb_segments_hook">Koukku / Tervehdykset</string>
<string name="revanced_sb_segments_hook_sum">Kertovat trailerit tulevasta videosta, tervehdykset ja hyvästelyt. Ei sisällä osioita, jotka lisäävät lisäsisältöä</string>
<string name="revanced_sb_segments_preview">Esikatselu / Yhteenveto</string>
<string name="revanced_sb_segments_preview_sum">Kokoelma leikkeitä, jotka osoittavat, mitä on tulossa tai mitä tapahtui videossa tai muissa sarjan videoissa, joiden kaikki informaatio toistuu muualla</string>
<string name="revanced_sb_segments_filler">Epäolennainen täytesisältö/Vitsit</string>
<string name="revanced_sb_segments_filler_sum">Täytteeksi tai huumoriksi lisättyjä toissijaisia kohtauksia, joita videon pääsisällön ymmärrys ei edellytä. Ei sisällä aiheeseen liittyviä tai taustatietoja tarjoavia osioita</string>
<string name="revanced_sb_segments_filler">Tangentti / Vitsit</string>
<string name="revanced_sb_segments_filler_sum">Epäolennaiset kohtaukset tai vitsit, joita ei tarvita videon pääsisällön ymmärtämiseen. Ei sisällä osioita, jotka tarjoavat kontekstia tai taustatietoja</string>
<string name="revanced_sb_segments_nomusic">Musiikki: Musiikiton osa</string>
<string name="revanced_sb_segments_nomusic_sum">Vain musiikkivideoille. Musiikkivideoiden osiot ilman musiikkia, jotka eivät jo kuulu toiseen kategoriaan</string>
<string name="revanced_sb_skip_button_compact">Ohita</string>
@@ -1088,10 +1090,11 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
<string name="revanced_sb_skip_button_intro_middle">Ohita tauko</string>
<string name="revanced_sb_skip_button_intro_end">Ohita tauko</string>
<string name="revanced_sb_skip_button_outro">Ohita outro</string>
<string name="revanced_sb_skip_button_hook">Ohita koukku</string>
<string name="revanced_sb_skip_button_preview_beginning">Ohita esikatselu</string>
<string name="revanced_sb_skip_button_preview_middle">Ohita esikatselu</string>
<string name="revanced_sb_skip_button_preview_end">Ohita kertaus</string>
<string name="revanced_sb_skip_button_filler">Ohita täytesisältö</string>
<string name="revanced_sb_skip_button_filler">Ohita Tangentti</string>
<string name="revanced_sb_skip_button_nomusic">Ohita musiikiton</string>
<string name="revanced_sb_skip_button_unsubmitted">Ohita osio</string>
<string name="revanced_sb_skipped_sponsor">Sponsori ohitettiin</string>
@@ -1102,10 +1105,11 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään.
<string name="revanced_sb_skipped_intro_middle">Tauko ohitettiin</string>
<string name="revanced_sb_skipped_intro_end">Tauko ohitettiin</string>
<string name="revanced_sb_skipped_outro">Outro ohitettiin</string>
<string name="revanced_sb_skipped_hook">Ohitettu koukku</string>
<string name="revanced_sb_skipped_preview_beginning">Esikatselu ohitettiin</string>
<string name="revanced_sb_skipped_preview_middle">Esikatselu ohitettiin</string>
<string name="revanced_sb_skipped_preview_end">Kertaus ohitettiin</string>
<string name="revanced_sb_skipped_filler">Täytesisältö ohitettiin</string>
<string name="revanced_sb_skipped_filler">Ohitettu tangentti</string>
<string name="revanced_sb_skipped_nomusic">Musiikiton osio ohitettiin</string>
<string name="revanced_sb_skipped_unsubmitted">Lähettämätön osio ohitettiin</string>
<string name="revanced_sb_skipped_multiple_segments">Useita osioita ohitettiin</string>

View File

@@ -1073,10 +1073,12 @@ Ang iyong user id ay parang isang password at hindi dapat ibahagi.
<string name="revanced_sb_segments_intro_sum">Isang agwat na walang aktwal na nilalaman. Maaaring isang pause, static na frame, o umuulit na animation. Hindi kasama ang mga transition na naglalaman ng impormasyon</string>
<string name="revanced_sb_segments_outro">Mga Endcard / Credit</string>
<string name="revanced_sb_segments_outro_sum">Mga kredito o kapag lumitaw ang mga endcard ng YouTube. Hindi para sa mga konklusyon na may impormasyon</string>
<string name="revanced_sb_segments_preview">Preview/Recap/Hook</string>
<string name="revanced_sb_segments_hook">Panimula / Pagbati</string>
<string name="revanced_sb_segments_hook_sum">Mga sinasalaysay na trailer para sa paparating na video, pagbati at pamamaalam. Hindi kasama ang mga seksyon na nagdaragdag ng karagdagang nilalaman</string>
<string name="revanced_sb_segments_preview">Preview / Balik-tanaw</string>
<string name="revanced_sb_segments_preview_sum">Koleksyon ng mga clip na nagpapakita kung ano ang paparating o kung ano ang nangyari sa video o sa iba pang mga video ng isang serye, kung saan ang lahat ng impormasyon ay inuulit sa ibang lugar</string>
<string name="revanced_sb_segments_filler">Filler Tangent/Jokes</string>
<string name="revanced_sb_segments_filler_sum">Ang mga tangential na eksena ay idinagdag lamang para sa tagapuno o katatawanan na hindi kinakailangan upang maunawaan ang pangunahing nilalaman ng video. Hindi kasama ang mga segment na nagbibigay ng mga detalye ng konteksto o background</string>
<string name="revanced_sb_segments_filler">Paglihis / Mga Biro</string>
<string name="revanced_sb_segments_filler_sum">Mga eksena o biro na hindi kinakailangan upang maunawaan ang pangunahing nilalaman ng video. Hindi kasama ang mga seksyon na nagbibigay ng konteksto o detalye sa background</string>
<string name="revanced_sb_segments_nomusic">Musika: Seksyon na Hindi Musika</string>
<string name="revanced_sb_segments_nomusic_sum">Para lang gamitin sa mga music video. Mga seksyon ng mga music video na walang musika, na hindi pa sakop ng isa pang kategorya</string>
<string name="revanced_sb_skip_button_compact">Laktawan</string>
@@ -1089,10 +1091,11 @@ Ang iyong user id ay parang isang password at hindi dapat ibahagi.
<string name="revanced_sb_skip_button_intro_middle">Laktawan ang intermission</string>
<string name="revanced_sb_skip_button_intro_end">Laktawan ang intermission</string>
<string name="revanced_sb_skip_button_outro">Laktawan ang isa pa</string>
<string name="revanced_sb_skip_button_hook">Laktawan ang hook</string>
<string name="revanced_sb_skip_button_preview_beginning">Laktawan ang preview</string>
<string name="revanced_sb_skip_button_preview_middle">Laktawan ang preview</string>
<string name="revanced_sb_skip_button_preview_end">Laktawan ang recap</string>
<string name="revanced_sb_skip_button_filler">Laktawan ang tagapuno</string>
<string name="revanced_sb_skip_button_filler">Laktawan ang tangent</string>
<string name="revanced_sb_skip_button_nomusic">Laktawan ang hindi musika</string>
<string name="revanced_sb_skip_button_unsubmitted">Laktawan ang segment</string>
<string name="revanced_sb_skipped_sponsor">Nilagpasang isponsor</string>
@@ -1103,10 +1106,11 @@ Ang iyong user id ay parang isang password at hindi dapat ibahagi.
<string name="revanced_sb_skipped_intro_middle">Nilaktawan ang intermission</string>
<string name="revanced_sb_skipped_intro_end">Nilaktawan ang intermission</string>
<string name="revanced_sb_skipped_outro">Nilagpasang wakas</string>
<string name="revanced_sb_skipped_hook">Nalaktawan ang hook</string>
<string name="revanced_sb_skipped_preview_beginning">Nilaktawan ang preview</string>
<string name="revanced_sb_skipped_preview_middle">Nilaktawan ang preview</string>
<string name="revanced_sb_skipped_preview_end">Nilaktawan ang recap</string>
<string name="revanced_sb_skipped_filler">Nilaktawan ang tagapuno</string>
<string name="revanced_sb_skipped_filler">Nalaktawan ang tangent</string>
<string name="revanced_sb_skipped_nomusic">Nilaktawan ang isang seksyon na hindi musika</string>
<string name="revanced_sb_skipped_unsubmitted">Nilaktawan ang hindi naisumiteng segment</string>
<string name="revanced_sb_skipped_multiple_segments">Nilaktawan ang maraming segment</string>

View File

@@ -1076,10 +1076,12 @@ Votre ID d'utilisateur est comme un mot de passe et ne doit jamais être partag
<string name="revanced_sb_segments_intro_sum">Un intervalle sans contenu réel. Il peut s\'agir d\'une pause, d\'une image statique ou d\'une animation répétitive. N\'inclut pas les transitions contenant des informations.</string>
<string name="revanced_sb_segments_outro">Écrans de fin / Crédits</string>
<string name="revanced_sb_segments_outro_sum">Crédits ou moment où apparaissent les écrans de fin YouTube. Pas pour les conclusions contenant des informations.</string>
<string name="revanced_sb_segments_preview">Aperçu/Résumé/Accroche</string>
<string name="revanced_sb_segments_hook">Accroche / Salutations</string>
<string name="revanced_sb_segments_hook_sum">Présentation de la vidéo actuelle ou d\'une prochaine vidéo par le créateur, salutations et au revoir. N\'inclut pas les sections qui ajoutent du contenu supplémentaire</string>
<string name="revanced_sb_segments_preview">Aperçu / Résumé</string>
<string name="revanced_sb_segments_preview_sum">Collection de clips qui présentent ce qui va suivre ou ce qui s\'est passé dans la vidéo ou dans d\'autres vidéos d\'une série, où toutes les informations sont répétées ailleurs</string>
<string name="revanced_sb_segments_filler">Digressions/Blagues</string>
<string name="revanced_sb_segments_filler_sum">Digressions ou blagues non nécessaires à la compréhension du contenu principal de la vidéo. Ne contient pas de segments fournissant du contexte ou des détails.</string>
<string name="revanced_sb_segments_filler">Digression / Blagues</string>
<string name="revanced_sb_segments_filler_sum">Digressions ou blagues non nécessaires à la compréhension du contenu principal de la vidéo. Cette catégorie ne devrait pas contenir de segments fournissant du contexte ou des détails secondaires</string>
<string name="revanced_sb_segments_nomusic">Musique : Segment non musical</string>
<string name="revanced_sb_segments_nomusic_sum">Uniquement pour utilisation dans les vidéos musicales. Sections non musicales dans les clips, qui ne sont pas déjà couvertes par une autre catégorie.</string>
<string name="revanced_sb_skip_button_compact">Passer</string>
@@ -1092,10 +1094,11 @@ Votre ID d'utilisateur est comme un mot de passe et ne doit jamais être partag
<string name="revanced_sb_skip_button_intro_middle">Passer l\'entracte</string>
<string name="revanced_sb_skip_button_intro_end">Passer l\'entracte</string>
<string name="revanced_sb_skip_button_outro">Passer l\'outro</string>
<string name="revanced_sb_skip_button_hook">Passer l\'accroche</string>
<string name="revanced_sb_skip_button_preview_beginning">Passer l\'aperçu</string>
<string name="revanced_sb_skip_button_preview_middle">Passer l\'aperçu</string>
<string name="revanced_sb_skip_button_preview_end">Passer le résumé</string>
<string name="revanced_sb_skip_button_filler">Passer remplissage</string>
<string name="revanced_sb_skip_button_filler">Passer la digression</string>
<string name="revanced_sb_skip_button_nomusic">Passer non musical</string>
<string name="revanced_sb_skip_button_unsubmitted">Passer le segment</string>
<string name="revanced_sb_skipped_sponsor">Sponsor ignoré</string>
@@ -1106,10 +1109,11 @@ Votre ID d'utilisateur est comme un mot de passe et ne doit jamais être partag
<string name="revanced_sb_skipped_intro_middle">Entracte ignoré</string>
<string name="revanced_sb_skipped_intro_end">Entracte ignoré</string>
<string name="revanced_sb_skipped_outro">Outro ignorée</string>
<string name="revanced_sb_skipped_hook">Accroche ignorée</string>
<string name="revanced_sb_skipped_preview_beginning">Aperçu ignoré</string>
<string name="revanced_sb_skipped_preview_middle">Aperçu ignoré</string>
<string name="revanced_sb_skipped_preview_end">Résumé ignoré</string>
<string name="revanced_sb_skipped_filler">Remplissage ignoré</string>
<string name="revanced_sb_skipped_filler">Digression ignorée</string>
<string name="revanced_sb_skipped_nomusic">Section non musicale ignorée</string>
<string name="revanced_sb_skipped_unsubmitted">Segment non soumis ignoré</string>
<string name="revanced_sb_skipped_multiple_segments">Plusieurs segments ignorés</string>

View File

@@ -1075,10 +1075,12 @@ Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh
<string name="revanced_sb_segments_intro_sum">Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis</string>
<string name="revanced_sb_segments_outro">Cártaí Deiridh / Creidiúintí</string>
<string name="revanced_sb_segments_outro_sum">Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis</string>
<string name="revanced_sb_segments_preview">Réamhamhar/Athbhreithniú/Crúca</string>
<string name="revanced_sb_segments_hook">Hook / Beannachtaí</string>
<string name="revanced_sb_segments_hook_sum">Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis</string>
<string name="revanced_sb_segments_preview">Réamhamharc / Achoimre</string>
<string name="revanced_sb_segments_preview_sum">Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile</string>
<string name="revanced_sb_segments_filler">Tadhall Líonta/Greann</string>
<string name="revanced_sb_segments_filler_sum">Ní chuirtear radhairc tangensiúla ach le haghaidh líonta nó greann nach gá chun príomhábhar an fhíseáin a thuiscint. Ní chuimsíonn sé deighleoga a sholáthraíonn sonraí comhthéacs</string>
<string name="revanced_sb_segments_filler">Seachrán / Scéalta Grinn</string>
<string name="revanced_sb_segments_filler_sum">Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra</string>
<string name="revanced_sb_segments_nomusic">Ceol: Rannóg Neamh-Cheoil</string>
<string name="revanced_sb_segments_nomusic_sum">Le húsáid amháin i bhfíseáin ceoil. Rannóga d\'fhíseáin ceoil gan ceol, nach bhfuil clúdaithe ag catagóir eile cheana féin</string>
<string name="revanced_sb_skip_button_compact">Scip</string>
@@ -1091,10 +1093,11 @@ Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh
<string name="revanced_sb_skip_button_intro_middle">Scip idirghabháil</string>
<string name="revanced_sb_skip_button_intro_end">Scip idirghabháil</string>
<string name="revanced_sb_skip_button_outro">Scip an forchríoch</string>
<string name="revanced_sb_skip_button_hook">Scipeáil crúca</string>
<string name="revanced_sb_skip_button_preview_beginning">Scip réamhamharc</string>
<string name="revanced_sb_skip_button_preview_middle">Scip réamhamharc</string>
<string name="revanced_sb_skip_button_preview_end">Scip an achoimre</string>
<string name="revanced_sb_skip_button_filler">Scip líonadh</string>
<string name="revanced_sb_skip_button_filler">Scipeáil imeall</string>
<string name="revanced_sb_skip_button_nomusic">Scip neamh-cheol</string>
<string name="revanced_sb_skip_button_unsubmitted">Scip deighleog</string>
<string name="revanced_sb_skipped_sponsor">Urra scipeáilte</string>
@@ -1105,10 +1108,11 @@ Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh
<string name="revanced_sb_skipped_intro_middle">Idirmheas scipeáilte</string>
<string name="revanced_sb_skipped_intro_end">Idirmheas scipeáilte</string>
<string name="revanced_sb_skipped_outro">Scipeáilte an forchríoch</string>
<string name="revanced_sb_skipped_hook">Crúca scipeáilte</string>
<string name="revanced_sb_skipped_preview_beginning">Scipeáilte an réamhléiriú</string>
<string name="revanced_sb_skipped_preview_middle">Scipeáilte an réamhléiriú</string>
<string name="revanced_sb_skipped_preview_end">Athbhreithniú scipeáilte</string>
<string name="revanced_sb_skipped_filler">Líonadh scipeáilte</string>
<string name="revanced_sb_skipped_filler">Imeall scipeáilte</string>
<string name="revanced_sb_skipped_nomusic">Scaoileadh rannán neamh-cheoil</string>
<string name="revanced_sb_skipped_unsubmitted">Deighleog gan curtha isteach scipeáilte</string>
<string name="revanced_sb_skipped_multiple_segments">Scipeáilte go leor deighleoga</string>

View File

@@ -1075,10 +1075,12 @@ A felhasználói azonosítója olyan, mint egy jelszó, és soha nem szabad mego
<string name="revanced_sb_segments_intro_sum">Egy részlet tartalom nélkül. Lehet szünet, álló képkocka, vagy ismétlődő animáció. Nem használandó információt tartalmazó átmeneteknél</string>
<string name="revanced_sb_segments_outro">Záróképernyő / Köszönetek</string>
<string name="revanced_sb_segments_outro_sum">Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem tartozik bele az információt tartalmazó összegzés</string>
<string name="revanced_sb_segments_preview">Előzetes/Ismétlés</string>
<string name="revanced_sb_segments_hook">Bevezetés / Üdvözlet</string>
<string name="revanced_sb_segments_hook_sum">Narrált előzetesek a közelgő videóhoz, üdvözlések és búcsúzások. Nem tartalmaz olyan szakaszokat, amelyek további tartalmat adnak hozzá</string>
<string name="revanced_sb_segments_preview">Előnézet / Összefoglaló</string>
<string name="revanced_sb_segments_preview_sum">Olyan klipek gyűjteménye, amik azt mutatják, hogy mi következik majd ebben, vagy a sorozat más videóiban és minden információ megismétlődik később a videóban</string>
<string name="revanced_sb_segments_filler">Érintőleges tartalom/Viccek</string>
<string name="revanced_sb_segments_filler_sum">Csak töltelék vagy humornak hozzáadott részek, amik nem szükségesek a videó fő tartalmának megértéséhez. Ne tartalmazzon olyan szegmenseket, amik kontextust, vagy háttérinformációt szolgáltatnak</string>
<string name="revanced_sb_segments_filler">Kitérés / Viccek</string>
<string name="revanced_sb_segments_filler_sum">Mellékes jelenetek vagy viccek, amelyek nem szükségesek a videó fő tartalmának megértéséhez. Ez nem foglalja magában azokat a szegmenseket, amelyek kontextust vagy háttérinformációkat nyújtanak</string>
<string name="revanced_sb_segments_nomusic">Zene: zenementes rész</string>
<string name="revanced_sb_segments_nomusic_sum">Csak zenei videókhoz használható. Zenei videók zene nélküli részei, amelyek még nem tartoznak más kategóriába</string>
<string name="revanced_sb_skip_button_compact">Kihagyás</string>
@@ -1091,10 +1093,11 @@ A felhasználói azonosítója olyan, mint egy jelszó, és soha nem szabad mego
<string name="revanced_sb_skip_button_intro_middle">Szünet kihagyása</string>
<string name="revanced_sb_skip_button_intro_end">Szünet kihagyása</string>
<string name="revanced_sb_skip_button_outro">Outro kihagyása</string>
<string name="revanced_sb_skip_button_hook">Horog kihagyása</string>
<string name="revanced_sb_skip_button_preview_beginning">Előnézet kihagyása</string>
<string name="revanced_sb_skip_button_preview_middle">Előnézet kihagyása</string>
<string name="revanced_sb_skip_button_preview_end">Recap kihagyása</string>
<string name="revanced_sb_skip_button_filler">Töltelékrész kihagyása</string>
<string name="revanced_sb_skip_button_filler">Mellékes rész kihagyása</string>
<string name="revanced_sb_skip_button_nomusic">Nem zenei rész kihagyása</string>
<string name="revanced_sb_skip_button_unsubmitted">Szakasz kihagyása</string>
<string name="revanced_sb_skipped_sponsor">Szponzor kihagyva</string>
@@ -1105,10 +1108,11 @@ A felhasználói azonosítója olyan, mint egy jelszó, és soha nem szabad mego
<string name="revanced_sb_skipped_intro_middle">Szünet kihagyva</string>
<string name="revanced_sb_skipped_intro_end">Szünet kihagyva</string>
<string name="revanced_sb_skipped_outro">Outro kihagyva</string>
<string name="revanced_sb_skipped_hook">Horog kihagyva</string>
<string name="revanced_sb_skipped_preview_beginning">Bevezető kihagyva</string>
<string name="revanced_sb_skipped_preview_middle">Bevezető kihagyva</string>
<string name="revanced_sb_skipped_preview_end">Recap kihagyva</string>
<string name="revanced_sb_skipped_filler">Töltelékrész kihagyva</string>
<string name="revanced_sb_skipped_filler">Mellékes rész kihagyva</string>
<string name="revanced_sb_skipped_nomusic">Zenementes rész kihagyva</string>
<string name="revanced_sb_skipped_unsubmitted">Beküldésre váró rész kihagyva</string>
<string name="revanced_sb_skipped_multiple_segments">Több szakasz kihagyva</string>

View File

@@ -1076,10 +1076,12 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
<string name="revanced_sb_segments_intro_sum">Ժամանակահատված, որը չունի իրական content: Կարող է լինել դադար, կայուն կադր կամ կրկնվող անիմացիա: Չի ներառում transitions, որոնք պարունակում են տեղեկություն</string>
<string name="revanced_sb_segments_outro">Վերջնական տիտրեր / Տիտրեր</string>
<string name="revanced_sb_segments_outro_sum">Կրեդիտները կամ երբ YouTube-ի վերջնական քարտերը հայտնվում են։ Չի կիրառվում տեղեկատվություն ներառող եզրափակումների համար</string>
<string name="revanced_sb_segments_preview">Նախադիտում/Համառոտ վերանայում/Կեռ</string>
<string name="revanced_sb_segments_hook">Ներածություն / Ողջույններ</string>
<string name="revanced_sb_segments_hook_sum">Առաջիկա տեսանյութի պատմողական անոնսներ, ողջույններ և հրաժեշտներ։ Չի ներառում լրացուցիչ բովանդակություն ավելացնող հատվածներ</string>
<string name="revanced_sb_segments_preview">Նախադիտում / Ամփոփում</string>
<string name="revanced_sb_segments_preview_sum">Կտորների հավաքածու, որոնք ցույց են տալիս, թե ինչ է գալու կամ ինչ է պատահել տեսանյութում կամ սերիայի այլ տեսանյութերում, որտեղ բոլոր տեղեկությունները կրկնվում են այլուր</string>
<string name="revanced_sb_segments_filler">Լցոնիչ կողմնակի թեմա/Ծիծաղելի</string>
<string name="revanced_sb_segments_filler_sum">Շոշափող տեսարաններ ավելացվել են միայն լցոնման կամ հումորի համար, որոնք չեն պահանջվում տեսանյութի հիմնական բովանդակությունը հասկանալու համար: Չի ներառում ենթատեքստ կամ ֆոնային մանրամասներ տրամադրող հատվածներ</string>
<string name="revanced_sb_segments_filler">Շեղում / Կատակներ</string>
<string name="revanced_sb_segments_filler_sum">Երկրորդական տեսարաններ կամ կատակներ, որոնք անհրաժեշտ չեն տեսանյութի հիմնական բովանդակությունը հասկանալու համար։ Չի ներառում համատեքստ կամ ֆոնային մանրամասներ տրամադրող հատվածներ</string>
<string name="revanced_sb_segments_nomusic">Երաժշտություն՝ ոչ երաժշտական բաժին</string>
<string name="revanced_sb_segments_nomusic_sum">Միայն երաժշտական տեսահոլովակներում օգտագործելու համար: Երաժշտական տեսահոլովակների բաժիններ առանց երաժշտության, որոնք դեռ չեն ընդգրկված մեկ այլ կատեգորիայի կողմից</string>
<string name="revanced_sb_skip_button_compact">Բաց թողնել</string>
@@ -1092,10 +1094,11 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
<string name="revanced_sb_skip_button_intro_middle">Բաց թողնել ընդմիջումը</string>
<string name="revanced_sb_skip_button_intro_end">Բաց թողնել ընդմիջումը</string>
<string name="revanced_sb_skip_button_outro">Բաց թողնել ավարտը</string>
<string name="revanced_sb_skip_button_hook">Բաց թողնել ներածությունը</string>
<string name="revanced_sb_skip_button_preview_beginning">Բաց թողնել նախադիտումը</string>
<string name="revanced_sb_skip_button_preview_middle">Բաց թողնել նախադիտումը</string>
<string name="revanced_sb_skip_button_preview_end">Բաց թողնել համառոտ վերանայումը</string>
<string name="revanced_sb_skip_button_filler">Բաց թողնել լցոնիչը</string>
<string name="revanced_sb_skip_button_filler">Բաց թողնել շեղումը</string>
<string name="revanced_sb_skip_button_nomusic">Բաց թողնել ոչ-երաժշտական մասը</string>
<string name="revanced_sb_skip_button_unsubmitted">Բաց թողնել հատվածը</string>
<string name="revanced_sb_skipped_sponsor">Բաց թողնված հովանավորը</string>
@@ -1106,10 +1109,11 @@ Seekbar thumbnails-ները կօգտագործեն նույն որակը, ինչ
<string name="revanced_sb_skipped_intro_middle">Բաց թողնել ընդմիջումը</string>
<string name="revanced_sb_skipped_intro_end">Բաց թողնել ընդմիջումը</string>
<string name="revanced_sb_skipped_outro">Բաց թողնված ավարտը</string>
<string name="revanced_sb_skipped_hook">Ներածությունը բաց է թողնված</string>
<string name="revanced_sb_skipped_preview_beginning">Բաց թողնված նախադիտումը</string>
<string name="revanced_sb_skipped_preview_middle">Բաց թողնված նախադիտումը</string>
<string name="revanced_sb_skipped_preview_end">Բաց թողնված համառոտ վերանայումը</string>
<string name="revanced_sb_skipped_filler">Բաց թողնված լցոնիչը</string>
<string name="revanced_sb_skipped_filler">Շեղումը բաց է թողնված</string>
<string name="revanced_sb_skipped_nomusic">Բաց թողնված ոչ-երաժշտական մասը</string>
<string name="revanced_sb_skipped_unsubmitted">Բաց թողնված չհաստատված հատվածը</string>
<string name="revanced_sb_skipped_multiple_segments">Բաց թողնված մի քանի հատվածներ</string>

View File

@@ -1074,10 +1074,12 @@ Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan."</string>
<string name="revanced_sb_segments_intro_sum">Interval tanpa konten yang sebenarnya. Bisa berupa jeda, bingkai statis, atau animasi berulang. Tidak termasuk transisi yang berisi informasi</string>
<string name="revanced_sb_segments_outro">Kartu Akhir / Kredit</string>
<string name="revanced_sb_segments_outro_sum">Kredit atau ketika layar akhir YouTube muncul. Bukan kesimpulan dengan informasi</string>
<string name="revanced_sb_segments_preview">Pratinjau/Rekap/Pengait</string>
<string name="revanced_sb_segments_hook">Pengantar / Sapaan</string>
<string name="revanced_sb_segments_hook_sum">Trailer yang dinarasikan untuk video mendatang, sapaan, dan perpisahan. Tidak termasuk bagian yang menambahkan konten tambahan</string>
<string name="revanced_sb_segments_preview">Pratinjau / Rekap</string>
<string name="revanced_sb_segments_preview_sum">Kumpulan klip yang menunjukkan apa yang akan datang atau apa yang terjadi di video atau di video lain dari sebuah seri, di mana semua informasi diulang di tempat lain</string>
<string name="revanced_sb_segments_filler">Pengisi Tidak Relevan/Lelucon</string>
<string name="revanced_sb_segments_filler_sum">Adegan berbelit-belit yang ditambahkan hanya sebagai filler atau candaan yang tidak diperlukan untuk memahami isi utama video. Tidak termasuk bagian yang mengandung konteks atau detail latar belakang</string>
<string name="revanced_sb_segments_filler">Penyimpangan / Lelucon</string>
<string name="revanced_sb_segments_filler_sum">Adegan atau lelucon sampingan yang tidak diperlukan untuk memahami konten utama video. Tidak termasuk bagian yang memberikan konteks atau detail latar belakang</string>
<string name="revanced_sb_segments_nomusic">Musik: Bagian Non-Musik</string>
<string name="revanced_sb_segments_nomusic_sum">Hanya untuk digunakan pada video musik. Bagian video musik tanpa musiknya, yang belum tercakup dalam kategori lain</string>
<string name="revanced_sb_skip_button_compact">Lewati</string>
@@ -1090,10 +1092,11 @@ Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan."</string>
<string name="revanced_sb_skip_button_intro_middle">Lewati jeda</string>
<string name="revanced_sb_skip_button_intro_end">Lewati jeda</string>
<string name="revanced_sb_skip_button_outro">Lewati outro</string>
<string name="revanced_sb_skip_button_hook">Lewati hook</string>
<string name="revanced_sb_skip_button_preview_beginning">Lewati pratinjau</string>
<string name="revanced_sb_skip_button_preview_middle">Lewati pratinjau</string>
<string name="revanced_sb_skip_button_preview_end">Lewati rekap</string>
<string name="revanced_sb_skip_button_filler">Lewati filler</string>
<string name="revanced_sb_skip_button_filler">Lewati penyimpangan</string>
<string name="revanced_sb_skip_button_nomusic">Lewati non-musik</string>
<string name="revanced_sb_skip_button_unsubmitted">Lewati segmen</string>
<string name="revanced_sb_skipped_sponsor">Sponsor dilewati</string>
@@ -1104,10 +1107,11 @@ Id pengguna Anda seperti kata sandi dan jangan pernah dibagikan."</string>
<string name="revanced_sb_skipped_intro_middle">Jeda dilewati</string>
<string name="revanced_sb_skipped_intro_end">Jeda dilewati</string>
<string name="revanced_sb_skipped_outro">Outro dilewati</string>
<string name="revanced_sb_skipped_hook">Hook dilewati</string>
<string name="revanced_sb_skipped_preview_beginning">Pratinjau dilewati</string>
<string name="revanced_sb_skipped_preview_middle">Pratinjau dilewati</string>
<string name="revanced_sb_skipped_preview_end">Rekap dilewati</string>
<string name="revanced_sb_skipped_filler">Pengisi dilewati</string>
<string name="revanced_sb_skipped_filler">Penyimpangan dilewati</string>
<string name="revanced_sb_skipped_nomusic">Melewati bagian non-musik</string>
<string name="revanced_sb_skipped_unsubmitted">Melewati segmen yang belum dikirim</string>
<string name="revanced_sb_skipped_multiple_segments">Beberapa segmen dilewati</string>

View File

@@ -1074,10 +1074,12 @@ Il tuo ID utente è come una password e non dovrebbe mai essere condiviso."</str
<string name="revanced_sb_segments_intro_sum">Un intervallo senza contenuto effettivo. Potrebbe essere una pausa, un quadro statico o un\'animazione ripetitiva. Non include transizioni contenenti informazioni</string>
<string name="revanced_sb_segments_outro">Conclusioni / Titoli di coda</string>
<string name="revanced_sb_segments_outro_sum">Riconoscimenti o quando appaiono le carte finali di YouTube. Non per conclusioni con informazioni</string>
<string name="revanced_sb_segments_preview">Anteprima/Recap/Hook</string>
<string name="revanced_sb_segments_hook">Introduzione / Saluti</string>
<string name="revanced_sb_segments_hook_sum">Trailer narrati per il video in arrivo, saluti e addii. Non include sezioni che aggiungono contenuti aggiuntivi</string>
<string name="revanced_sb_segments_preview">Anteprima / Riepilogo</string>
<string name="revanced_sb_segments_preview_sum">Raccolta di clip che mostrano ciò che è in arrivo o ciò che è successo nel video o in altri video di una serie, dove tutte le informazioni sono ripetute altrove</string>
<string name="revanced_sb_segments_filler">Riempitivi irrilevanti/Battute</string>
<string name="revanced_sb_segments_filler_sum">Scene tangenziali aggiunte solo per riempitivo o umorismo che non sono tenuti a capire il contenuto principale del video. Non comprende i segmenti che forniscono dettagli sul contesto o sullo sfondo</string>
<string name="revanced_sb_segments_filler">Divagazione / Battute</string>
<string name="revanced_sb_segments_filler_sum">Scene o battute tangenziali che non sono necessarie per comprendere il contenuto principale del video. Non include sezioni che forniscono contesto o dettagli di sfondo</string>
<string name="revanced_sb_segments_nomusic">Musica: Sezione Non-Musicale</string>
<string name="revanced_sb_segments_nomusic_sum">Solo per l\'uso in video musicali. Sezioni di video musicali senza musica, che non sono già coperti da un\'altra categoria</string>
<string name="revanced_sb_skip_button_compact">Salta</string>
@@ -1090,10 +1092,11 @@ Il tuo ID utente è come una password e non dovrebbe mai essere condiviso."</str
<string name="revanced_sb_skip_button_intro_middle">Salta intermezzo</string>
<string name="revanced_sb_skip_button_intro_end">Salta intermezzo</string>
<string name="revanced_sb_skip_button_outro">Salta conclusione</string>
<string name="revanced_sb_skip_button_hook">Salta aggancio</string>
<string name="revanced_sb_skip_button_preview_beginning">Salta anteprima</string>
<string name="revanced_sb_skip_button_preview_middle">Salta anteprima</string>
<string name="revanced_sb_skip_button_preview_end">Salta riepilogo</string>
<string name="revanced_sb_skip_button_filler">Salta riempimento</string>
<string name="revanced_sb_skip_button_filler">Salta tangenziale</string>
<string name="revanced_sb_skip_button_nomusic">Salta sezione non-musicale</string>
<string name="revanced_sb_skip_button_unsubmitted">Salta segmento</string>
<string name="revanced_sb_skipped_sponsor">Sponsorizzazione saltata</string>
@@ -1104,10 +1107,11 @@ Il tuo ID utente è come una password e non dovrebbe mai essere condiviso."</str
<string name="revanced_sb_skipped_intro_middle">Intermezzo saltato</string>
<string name="revanced_sb_skipped_intro_end">Intermezzo saltato</string>
<string name="revanced_sb_skipped_outro">Conclusione saltata</string>
<string name="revanced_sb_skipped_hook">Aggancio saltato</string>
<string name="revanced_sb_skipped_preview_beginning">Anteprima saltata</string>
<string name="revanced_sb_skipped_preview_middle">Anteprima saltata</string>
<string name="revanced_sb_skipped_preview_end">Riepilogo saltato</string>
<string name="revanced_sb_skipped_filler">Riempitivo saltato</string>
<string name="revanced_sb_skipped_filler">Tangenziale saltata</string>
<string name="revanced_sb_skipped_nomusic">Sezione non-musicale saltata</string>
<string name="revanced_sb_skipped_unsubmitted">Segmento non inviato saltato</string>
<string name="revanced_sb_skipped_multiple_segments">Segmenti multipli saltati</string>

View File

@@ -1077,10 +1077,12 @@ Second \"item\" text"</string>
<string name="revanced_sb_segments_intro_sum">מרווח זמן ללא תוכן ממשי. יכול להיות הפסקה, מסגרת סטטית, או הנפשה חוזרת. אינו כולל מעברים המכילים מידע</string>
<string name="revanced_sb_segments_outro">כרטיסי סיום / קרדיטים</string>
<string name="revanced_sb_segments_outro_sum">קרדיטים או כאשר כרטיסי הסיום של YouTube מופיעים. לא בשביל מסקנות עם מידע</string>
<string name="revanced_sb_segments_preview">קדימון/סיכום/מלכודת</string>
<string name="revanced_sb_segments_hook">פתיח / ברכות</string>
<string name="revanced_sb_segments_hook_sum">קדימונים מקריינים לסרטון הקרוב, ברכות ופרידות. אינו כולל קטעים המוסיפים תוכן נוסף</string>
<string name="revanced_sb_segments_preview">תצוגה מקדימה / סיכום</string>
<string name="revanced_sb_segments_preview_sum">אוסף של קליפים שמראים מה עומד לקרות בקרוב או מה קרה בסרטון או בסרטונים אחרים של סדרה, כאשר כל המידע חוזר על עצמו במקום אחר</string>
<string name="revanced_sb_segments_filler">פילר משיק/בדיחות</string>
<string name="revanced_sb_segments_filler_sum">סצנות משיקות שנוספו רק עבור פילר או הומור שאינן נדרשות כדי להבין את התוכן העיקרי של הסרטון. לא כולל מקטעים המספקים הקשר או פרטי רקע</string>
<string name="revanced_sb_segments_filler">סטייה / בדיחות</string>
<string name="revanced_sb_segments_filler_sum">סצנות או בדיחות צדדיות שאינן נדרשות להבנת התוכן העיקרי של הסרטון. אינו כולל קטעים המספקים הקשר או פרטי רקע</string>
<string name="revanced_sb_segments_nomusic">מוזיקה: קטע שאינו מוזיקה</string>
<string name="revanced_sb_segments_nomusic_sum">לשימוש בסרטוני מוזיקה בלבד. קטעים של סרטוני מוזיקה ללא מוזיקה, שאינם מכוסים כבר על ידי קטגוריה אחרת</string>
<string name="revanced_sb_skip_button_compact">דילוג</string>
@@ -1093,10 +1095,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skip_button_intro_middle">דלג על הפסקה</string>
<string name="revanced_sb_skip_button_intro_end">דלג על הפסקה</string>
<string name="revanced_sb_skip_button_outro">דלג על סיום</string>
<string name="revanced_sb_skip_button_hook">דלג על פתיח</string>
<string name="revanced_sb_skip_button_preview_beginning">דלג על קדימון</string>
<string name="revanced_sb_skip_button_preview_middle">דלג על קדימון</string>
<string name="revanced_sb_skip_button_preview_end">דלג על סיכום</string>
<string name="revanced_sb_skip_button_filler">דלג על פילר</string>
<string name="revanced_sb_skip_button_filler">דלג על קטע טנגנציאלי</string>
<string name="revanced_sb_skip_button_nomusic">דלג על שאינו מוזיקה</string>
<string name="revanced_sb_skip_button_unsubmitted">דלג על מקטע</string>
<string name="revanced_sb_skipped_sponsor">דילג על נותן חסות</string>
@@ -1107,10 +1110,11 @@ Second \"item\" text"</string>
<string name="revanced_sb_skipped_intro_middle">דילג על הפסקה</string>
<string name="revanced_sb_skipped_intro_end">דילג על הפסקה</string>
<string name="revanced_sb_skipped_outro">דילג על סיום</string>
<string name="revanced_sb_skipped_hook">פתיח דולג</string>
<string name="revanced_sb_skipped_preview_beginning">דילג על קדימון</string>
<string name="revanced_sb_skipped_preview_middle">דילג על קדימון</string>
<string name="revanced_sb_skipped_preview_end">דילג על סיכום</string>
<string name="revanced_sb_skipped_filler">דלג על פילר</string>
<string name="revanced_sb_skipped_filler">קטע טנגנציאלי דולג</string>
<string name="revanced_sb_skipped_nomusic">דילג על קטע שאינו מוזיקה</string>
<string name="revanced_sb_skipped_unsubmitted">דילג על מקטעים שלא נשלחו</string>
<string name="revanced_sb_skipped_multiple_segments">דילג על מקטעים מרובים</string>

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