diff --git a/.github/ISSUE_TEMPLATE/bug-issue.yml b/.github/ISSUE_TEMPLATE/bug-issue.yml deleted file mode 100644 index 6b98f0483..000000000 --- a/.github/ISSUE_TEMPLATE/bug-issue.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: 🐞 Bug report -description: Report a very clearly broken issue. -title: 'bug: ' -labels: [bug] -body: - - type: markdown - attributes: - value: | - # ReVanced bug report - - Important to note that your issue may have already been reported before. Please check for existing issues [here](https://github.com/revanced/revanced-patches/labels/bug). - - - type: dropdown - attributes: - label: Type - options: - - Error while patching - - Error at runtime - - Cosmetic - - Other - validations: - required: true - - type: textarea - attributes: - label: Bug description - description: How did you find the bug? Any additional details that might help? - validations: - required: true - - type: textarea - attributes: - label: Steps to reproduce - description: Add the steps to reproduce this bug including your environment. - placeholder: Step 1. Download some files. Step 2. ... - validations: - required: true - - type: textarea - attributes: - label: Relevant log output - description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. Capture crash logs by running `logcat | grep AndroidRuntime`. - render: shell - validations: - required: true - - type: textarea - attributes: - label: Screenshots or videos - description: Add screenshots or videos that show the bug here. - placeholder: Drag and drop the screenshots/videos into this box. - validations: - required: false - - type: textarea - attributes: - label: Solution - description: If applicable, add a possible solution. - validations: - required: false - - type: textarea - attributes: - label: Additional context - description: Add additional context here. - validations: - required: false - - type: checkboxes - id: acknowledgements - attributes: - label: Acknowledgements - description: Your issue will be closed if you haven't done these steps. - options: - - label: I have searched the existing issues and this is a new and no duplicate or related to another open issue. - required: true - - label: I have written a short but informative title. - required: true - - label: I filled out all of the requested information in this issue properly. - required: true diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 000000000..910adefc7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,49 @@ +name: 🐞 Bug report +description: Report a bug or an issue. +title: 'bug: ' +labels: ['Bug report'] +body: + - type: markdown + attributes: + value: | + # ReVanced Patches bug report + + Please check for existing bug reports + [here](https://github.com/ReVanced/revanced-patches/labels/Bug%20report) + before creating a new one. + + - type: textarea + attributes: + label: Bug description + description: | + - Describe your bug in detail + - Add steps to reproduce the bug if possible (Step 1. ... Step 2. ...) + - Add images and videos if possible + - List used patches if applicable + validations: + required: true + - type: textarea + attributes: + label: Error logs + description: Exceptions can be captured by running `logcat | grep AndroidRuntime` in a shell. + render: shell + - type: textarea + attributes: + label: Solution + description: If applicable, add a possible solution to the bug. + - type: textarea + attributes: + label: Additional context + description: Add additional context here. + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your issue will be closed if you don't follow the checklist below. + options: + - label: This request is not a duplicate of an existing issue. + required: true + - label: I have chosen an appropriate title. + required: true + - label: All requested information has been provided properly. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 9f537ff85..6fb647b70 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,5 @@ blank_issues_enabled: false contact_links: - - name: 📃 Documentation - url: https://github.com/revanced/revanced-documentation/ - about: Don't know how or where to start? Check out our documentation! - name: 🗨 Discussions url: https://github.com/revanced/revanced-suggestions/discussions - about: Got something you think should change or be added? Search for or start a new discussion! \ No newline at end of file + about: Have something unspecific to ReVanced Patches in mind? Search for or start a new discussion! \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 000000000..63f7ad2da --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,44 @@ +name: ⭐ Feature request +description: Create a detailed request for a new feature. +title: 'feat: ' +labels: ['Feature request'] +body: + - type: markdown + attributes: + value: | + # ReVanced Patches feature request + + Please check for existing feature requests + [here](https://github.com/ReVanced/revanced-patches/labels/Feature%20request) + before creating a new one. + - type: textarea + attributes: + label: Feature description + description: | + - Describe your feature in detail + - Add images, videos, links, examples, references, etc. if possible + - Add the target application name in case you request a new patch + - type: textarea + attributes: + label: Motivation + description: | + A strong motivation is necessary for a feature request to be considered. + + - Why should this feature be implemented? + - What is the explicit use case? + - What are the benefits? + - What makes this feature important? + validations: + required: true + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your issue will be closed if you don't follow the checklist below. + options: + - label: This request is not a duplicate of an existing issue. + required: true + - label: I have chosen an appropriate title. + required: true + - label: All requested information has been provided properly. + required: true diff --git a/.github/ISSUE_TEMPLATE/patch-request.yml b/.github/ISSUE_TEMPLATE/patch-request.yml deleted file mode 100644 index 35084c206..000000000 --- a/.github/ISSUE_TEMPLATE/patch-request.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: ⭐ Patch Request -description: Create a detailed patch request. -title: 'feat: ' -labels: [patch-request] -body: - - type: textarea - attributes: - label: Application - description: Which application is this patch for? - validations: - required: true - - type: textarea - attributes: - label: Issue - description: What is the issue this patch should solve? - validations: - required: true - - type: textarea - attributes: - label: Patch - description: "Describe the patch you'd like to see in detail." - validations: - required: true - - type: textarea - attributes: - label: Motivation - description: Why should your patch request be considered? What makes it valuable to the community? - validations: - required: true - - type: checkboxes - id: acknowledgements - attributes: - label: Acknowledgements - description: Your issue will be closed if you haven't done these steps. - options: - - label: I have searched the existing issues and this is a new and no duplicate or related to another open issue. - required: true - - label: I have written a short but informative title. - required: true - - label: I filled out all of the requested information in this issue properly. - required: true diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 8b208066e..da51ad113 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -1,4 +1,4 @@ -name: PR to main +name: Open a PR to main on: push: @@ -7,7 +7,7 @@ on: workflow_dispatch: env: - MESSAGE: merge branch `${{ github.head_ref || github.ref_name }}` to `main` + MESSAGE: Merge branch `${{ github.head_ref || github.ref_name }}` to `main` jobs: pull-request: @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Open pull request uses: repo-sync/pull-request@v2 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b122f635..c3be77c5e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Make sure the release step uses its own credentials: # https://github.com/cycjimmy/semantic-release-action#private-packages diff --git a/CHANGELOG.md b/CHANGELOG.md index ef164c8c5..64b12f7f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,319 @@ +# [2.191.0-dev.33](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.32...v2.191.0-dev.33) (2023-10-04) + + +### Bug Fixes + +* **TikTok - Hide ads:** Constrain to last working version ([56e45a6](https://github.com/ReVanced/revanced-patches/commit/56e45a60a405b5382e1ef6f7bcd5de570c7c52ef)) + +# [2.191.0-dev.32](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.31...v2.191.0-dev.32) (2023-10-03) + + +### Bug Fixes + +* **Sync for Reddit:** Do not throw an error when not necessary ([ef644e4](https://github.com/ReVanced/revanced-patches/commit/ef644e48018a90429108779b7419299c4f43e4ff)) + + +### Features + +* **Sync for Reddit - Client spoof:** Restore upload functionality ([9344c8a](https://github.com/ReVanced/revanced-patches/commit/9344c8a067127b0fb4ee8599c5dcfcb206b4ee07)) +* Use properties file for `Client spoof` patches ([e5d548c](https://github.com/ReVanced/revanced-patches/commit/e5d548c6427fb54968f26d706ff16274e72f700a)) + +# [2.191.0-dev.31](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.30...v2.191.0-dev.31) (2023-10-02) + + +### Bug Fixes + +* **YouTube - SponsorBlock:** Adjust import/export UI text ([#3063](https://github.com/ReVanced/revanced-patches/issues/3063)) ([4e5513e](https://github.com/ReVanced/revanced-patches/commit/4e5513e973f5de7c9f6330dfe7a0744e91f305b4)) + +# [2.191.0-dev.30](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.29...v2.191.0-dev.30) (2023-10-02) + + +### Bug Fixes + +* Add hooks to existing hook set ([5655067](https://github.com/ReVanced/revanced-patches/commit/5655067f28d010f3a7a6d91b09ac984eee162031)) +* **Google Recorder - Remove device restrictions:** Clarify limitation ([094f57b](https://github.com/ReVanced/revanced-patches/commit/094f57b601d746079c43fd5c8834e3e6be07f946)) + + +### Features + +* **YouTube - Hide layout components:** Hide search result shelf header ([f4eda8c](https://github.com/ReVanced/revanced-patches/commit/f4eda8c8d111cc856d5878a32ddca3f7c2e0df31)) + +# [2.191.0-dev.29](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.28...v2.191.0-dev.29) (2023-10-01) + + +### Features + +* **TikTok - Hide ads:** Constrain to last working version ([516e8a1](https://github.com/ReVanced/revanced-patches/commit/516e8a14c0e113f9f4c0dda9be223cf3e929eb3a)) + +# [2.191.0-dev.28](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.27...v2.191.0-dev.28) (2023-10-01) + + +### Bug Fixes + +* **YouTube - Hide "Load more" button:** Use correct names ([569c3cd](https://github.com/ReVanced/revanced-patches/commit/569c3cde9875b807c9116322ca324f69b5fa0218)) +* **YouTube - Hide shorts components:** Fix hiding navigation bar ([2de51e6](https://github.com/ReVanced/revanced-patches/commit/2de51e65f05be8a6364dfdfe9cd36e8fed5737f6)) + +# [2.191.0-dev.27](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.26...v2.191.0-dev.27) (2023-10-01) + + +### Features + +* **Tumblr:** Add `Disable in-app update` patch ([#3058](https://github.com/ReVanced/revanced-patches/issues/3058)) ([5e8076b](https://github.com/ReVanced/revanced-patches/commit/5e8076b330cabe57130233adacdf84b56f010217)) + +# [2.191.0-dev.26](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.25...v2.191.0-dev.26) (2023-10-01) + + +### Bug Fixes + +* Use correct instruction ([246cf2c](https://github.com/ReVanced/revanced-patches/commit/246cf2cc92624e43bc7405cb32be9b560bb648c5)) + +# [2.191.0-dev.25](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.24...v2.191.0-dev.25) (2023-10-01) + + +### Features + +* **YouTube - Hide layout components:** Hide "Join" button ([1b71f89](https://github.com/ReVanced/revanced-patches/commit/1b71f893bb9fd8511833b8895031c8d8122a6efb)) +* **YouTube - Hide layout components:** Hide "Notify me" button ([3027c15](https://github.com/ReVanced/revanced-patches/commit/3027c1575717588f43f4b95be6ba97dac2b94069)) +* **YouTube - Hide layout components:** Hide timed reactions ([d0a775d](https://github.com/ReVanced/revanced-patches/commit/d0a775d685b1e0564804d564d1cbcbb8d0a04b03)) + +# [2.191.0-dev.24](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.23...v2.191.0-dev.24) (2023-09-30) + + +### Features + +* **Duolingo:** Remove `Unlock Duolingo Super` patch ([b4b9746](https://github.com/ReVanced/revanced-patches/commit/b4b9746361b5435b9d9429ad065e53364c51904a)) + +# [2.191.0-dev.23](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.22...v2.191.0-dev.23) (2023-09-30) + + +### Features + +* **SPB Serviceportal Bund:** Add `Remove root detection` patch ([#3049](https://github.com/ReVanced/revanced-patches/issues/3049)) ([481bf58](https://github.com/ReVanced/revanced-patches/commit/481bf583afbf954bef1c4e5349a62ea1c623115a)) + +# [2.191.0-dev.22](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.21...v2.191.0-dev.22) (2023-09-28) + + +### Bug Fixes + +* **YouTube - Premium heading:** Correct inverted logic ([#3042](https://github.com/ReVanced/revanced-patches/issues/3042)) ([b33ed75](https://github.com/ReVanced/revanced-patches/commit/b33ed757370653b8eb0002b0977eedfbc73dbe5e)) + +# [2.191.0-dev.21](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.20...v2.191.0-dev.21) (2023-09-28) + + +### Bug Fixes + +* **YouTube - ReturnYouTubeDislike:** Revert support for 18.37.36 ([#3041](https://github.com/ReVanced/revanced-patches/issues/3041)) ([3761073](https://github.com/ReVanced/revanced-patches/commit/37610732da87549c22a430bb62d10793dfa2e696)) + +# [2.191.0-dev.20](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.19...v2.191.0-dev.20) (2023-09-28) + + +### Bug Fixes + +* **YouTube - Video Id:** Fix video id not showing the currently playing video ([#3038](https://github.com/ReVanced/revanced-patches/issues/3038)) ([f6f226b](https://github.com/ReVanced/revanced-patches/commit/f6f226ba281823cb5d2d468c32f6e48551971726)) + +# [2.191.0-dev.19](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.18...v2.191.0-dev.19) (2023-09-28) + + +### Features + +* **YouTube:** Add `Bypass URL redirects` patch ([125cac5](https://github.com/ReVanced/revanced-patches/commit/125cac5928c9b71d35253f1fd7651f4a30e15529)) + +# [2.191.0-dev.18](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.17...v2.191.0-dev.18) (2023-09-28) + + +### Features + +* **YouTube - Premium heading:** Allow using default heading ([#3029](https://github.com/ReVanced/revanced-patches/issues/3029)) ([d5ab35a](https://github.com/ReVanced/revanced-patches/commit/d5ab35a444523baa0586fcb9513d6ae4f2518946)) + +# [2.191.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.16...v2.191.0-dev.17) (2023-09-27) + + +### Features + +* **YouTube:** Bump compatibility to `18.37.36` ([#3028](https://github.com/ReVanced/revanced-patches/issues/3028)) ([eda28e5](https://github.com/ReVanced/revanced-patches/commit/eda28e507e7fb5171eeb15a5a0532929ee611211)) + +# [2.191.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.15...v2.191.0-dev.16) (2023-09-27) + + +### Bug Fixes + +* **YouTube - Hide info cards:** Fix info cards not hiding for some users ([#3039](https://github.com/ReVanced/revanced-patches/issues/3039)) ([cb38637](https://github.com/ReVanced/revanced-patches/commit/cb38637e6be968d54561a1e0466b9259dbf0b4ee)) + +# [2.191.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.14...v2.191.0-dev.15) (2023-09-26) + + +### Bug Fixes + +* **YouTube - Client spoof:** adjust settings text ([#3035](https://github.com/ReVanced/revanced-patches/issues/3035)) ([59a2e96](https://github.com/ReVanced/revanced-patches/commit/59a2e9617fc4f898e87cefeb3d2c6996b925fa90)) + +# [2.191.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.13...v2.191.0-dev.14) (2023-09-26) + + +### Bug Fixes + +* **YouTube - Client spoof:** Show seekbar thumbnail for age restricted and paid videos ([1a79300](https://github.com/ReVanced/revanced-patches/commit/1a793007c919753a8c31ab2382d86c0546eefe20)) + +# [2.191.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.12...v2.191.0-dev.13) (2023-09-25) + + +### Bug Fixes + +* **YouTube - Client spoof:** Removed unused code ([#3030](https://github.com/ReVanced/revanced-patches/issues/3030)) ([15e27bf](https://github.com/ReVanced/revanced-patches/commit/15e27bf93e6366ba8a59091409c4271c8230edb6)) + +# [2.191.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.11...v2.191.0-dev.12) (2023-09-25) + + +### Bug Fixes + +* **YouTube - Client spoof:** Display seekbar thumbnails in high quality ([5e8a2d3](https://github.com/ReVanced/revanced-patches/commit/5e8a2d3fe77a4a08ea32e7dc22f2c8e4048b7a6b)) + +# [2.191.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.10...v2.191.0-dev.11) (2023-09-25) + + +### Features + +* Add notice for thumbnails for age restricted or paid videos ([f7cf70b](https://github.com/ReVanced/revanced-patches/commit/f7cf70b5d3f415411fa767931a33e84df9df6c16)) + +# [2.191.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.9...v2.191.0-dev.10) (2023-09-25) + + +### Bug Fixes + +* **YouTube - Client spoof:** Restore seekbar thumbnails ([bf4a115](https://github.com/ReVanced/revanced-patches/commit/bf4a1159ff745f8f91e11f30db4651d85769227b)) + +# [2.191.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.8...v2.191.0-dev.9) (2023-09-25) + + +### Features + +* **Strava:** Add `Disable subscription suggestions` patch ([#2997](https://github.com/ReVanced/revanced-patches/issues/2997)) ([af02175](https://github.com/ReVanced/revanced-patches/commit/af0217594d9c7526f550fc7e6f09f8a9232e72cf)) + +# [2.191.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.7...v2.191.0-dev.8) (2023-09-24) + + +### Bug Fixes + +* **Relay - Spoof client:** Restore OAuth login ([96e01f7](https://github.com/ReVanced/revanced-patches/commit/96e01f7a7b87f468776fbde48e114a3f51630a46)) +* **Slide - Spoof client:** Use correct patch name ([f355dbf](https://github.com/ReVanced/revanced-patches/commit/f355dbf1d2af3075c6a3f13d8bf5f8dca22e6005)) + +# [2.191.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.6...v2.191.0-dev.7) (2023-09-24) + + +### Bug Fixes + +* **Duolingo - Unlock Super:** Get correct instruction offset ([#3023](https://github.com/ReVanced/revanced-patches/issues/3023)) ([5146de8](https://github.com/ReVanced/revanced-patches/commit/5146de872acb17d7c21019ac7ed531f27361038f)) + +# [2.191.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.5...v2.191.0-dev.6) (2023-09-23) + + +### Bug Fixes + +* **YouTube - Client spoof:** Do not record feed videos to history by default ([#3017](https://github.com/ReVanced/revanced-patches/issues/3017)) ([5ccbf1b](https://github.com/ReVanced/revanced-patches/commit/5ccbf1bf8ed92cde61689a2b1e3a3c1e915959a7)) + + +### Features + +* **Tumblr:** Add `Disable Tumblr Live` patch ([#2987](https://github.com/ReVanced/revanced-patches/issues/2987)) ([bf1f9dc](https://github.com/ReVanced/revanced-patches/commit/bf1f9dc799705679d17973e689165ab1bff327cd)) +* **YouTube - Spoof app version:** add version 18.20.39 ([#3001](https://github.com/ReVanced/revanced-patches/issues/3001)) ([f14c5e7](https://github.com/ReVanced/revanced-patches/commit/f14c5e79792f62fb060dd0eebbd3dd7157a08a98)) + +# [2.191.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.5...v2.191.0-dev.6) (2023-09-23) + + +### Features + +* **Tumblr:** Add `Disable Tumblr Live` patch ([#2987](https://github.com/ReVanced/revanced-patches/issues/2987)) ([bf1f9dc](https://github.com/ReVanced/revanced-patches/commit/bf1f9dc799705679d17973e689165ab1bff327cd)) +* **YouTube - Spoof app version:** add version 18.20.39 ([#3001](https://github.com/ReVanced/revanced-patches/issues/3001)) ([f14c5e7](https://github.com/ReVanced/revanced-patches/commit/f14c5e79792f62fb060dd0eebbd3dd7157a08a98)) + +# [2.191.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.5...v2.191.0-dev.6) (2023-09-21) + + +### Features + +* **Tumblr:** Add `Disable Tumblr Live` patch ([#2987](https://github.com/ReVanced/revanced-patches/issues/2987)) ([bf1f9dc](https://github.com/ReVanced/revanced-patches/commit/bf1f9dc799705679d17973e689165ab1bff327cd)) +* **YouTube - Spoof app version:** add version 18.20.39 ([#3001](https://github.com/ReVanced/revanced-patches/issues/3001)) ([f14c5e7](https://github.com/ReVanced/revanced-patches/commit/f14c5e79792f62fb060dd0eebbd3dd7157a08a98)) + +# [2.191.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.5...v2.191.0-dev.6) (2023-09-20) + + +### Features + +* **Tumblr:** Add `Disable Tumblr Live` patch ([#2987](https://github.com/ReVanced/revanced-patches/issues/2987)) ([bf1f9dc](https://github.com/ReVanced/revanced-patches/commit/bf1f9dc799705679d17973e689165ab1bff327cd)) +* **YouTube - Spoof app version:** add version 18.20.39 ([#3001](https://github.com/ReVanced/revanced-patches/issues/3001)) ([f14c5e7](https://github.com/ReVanced/revanced-patches/commit/f14c5e79792f62fb060dd0eebbd3dd7157a08a98)) + +# [2.191.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.5...v2.191.0-dev.6) (2023-09-20) + + +### Features + +* **Tumblr:** Add `Disable Tumblr Live` patch ([#2987](https://github.com/ReVanced/revanced-patches/issues/2987)) ([bf1f9dc](https://github.com/ReVanced/revanced-patches/commit/bf1f9dc799705679d17973e689165ab1bff327cd)) + +# [2.191.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.5...v2.191.0-dev.6) (2023-09-20) + +# [2.191.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.4...v2.191.0-dev.5) (2023-09-19) + + +### Bug Fixes + +* **YouTube:** Restore functionality of `Old video quality menu` and `Custom speeds` on tablets ([#2999](https://github.com/ReVanced/revanced-patches/issues/2999)) ([238bed1](https://github.com/ReVanced/revanced-patches/commit/238bed12519ec61a53b1ee72da467830ef252154)) + +# [2.191.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.3...v2.191.0-dev.4) (2023-09-14) + + +### Features + +* **Twitch - Block embedded ads:** Switch from `ttv.lol` to `luminous.dev` ([0fe115e](https://github.com/ReVanced/revanced-patches/commit/0fe115e8f98ccdc86d318090fc92fe77cece1dd8)) + +# [2.191.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.2...v2.191.0-dev.3) (2023-09-14) + + +### Features + +* **TU Dortmund:** Add `Show on lockscreen` patch ([#2947](https://github.com/ReVanced/revanced-patches/issues/2947)) ([9a18326](https://github.com/ReVanced/revanced-patches/commit/9a18326aeb68d7518594d0eab326ca845b9bdbdd)) +* **Tumblr:** Add `Disable blog notification reminder` patch ([29f19b9](https://github.com/ReVanced/revanced-patches/commit/29f19b9378c7e167137f38fa4517ae19382ca4f6)) +* **Tumblr:** Add `Disable gift message popup` patch ([a4d6b4e](https://github.com/ReVanced/revanced-patches/commit/a4d6b4e5ce6065d932f3895b4996e7dc1e5f7c67)) + +# [2.191.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v2.191.0-dev.1...v2.191.0-dev.2) (2023-09-11) + + +### Bug Fixes + +* Use consistent toggle description ([#2983](https://github.com/ReVanced/revanced-patches/issues/2983)) ([ceaa512](https://github.com/ReVanced/revanced-patches/commit/ceaa512f317fdd95dca37e425b389494a9b2e226)) + +# [2.191.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v2.190.1-dev.4...v2.191.0-dev.1) (2023-09-11) + + +### Features + +* **Tumblr:** Add `Disable dashboard ads` patch ([#2979](https://github.com/ReVanced/revanced-patches/issues/2979)) ([07c267a](https://github.com/ReVanced/revanced-patches/commit/07c267ad20afa1415d2dba31f0830d2dd5a34654)) + +## [2.190.1-dev.4](https://github.com/ReVanced/revanced-patches/compare/v2.190.1-dev.3...v2.190.1-dev.4) (2023-09-07) + + +### Bug Fixes + +* **YouTube - Custom filter:** Use new lines between components instead of commas ([#2952](https://github.com/ReVanced/revanced-patches/issues/2952)) ([ecb2e32](https://github.com/ReVanced/revanced-patches/commit/ecb2e32b1e296590d150bdd3f8bea2665b19a84d)) + +## [2.190.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v2.190.1-dev.2...v2.190.1-dev.3) (2023-09-07) + + +### Bug Fixes + +* **Infinity for Reddit - Spoof client:** Constrain patch to last working versions ([#2944](https://github.com/ReVanced/revanced-patches/issues/2944)) ([ee975de](https://github.com/ReVanced/revanced-patches/commit/ee975dea846c77af0efe608e647075f4055af320)) + +## [2.190.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v2.190.1-dev.1...v2.190.1-dev.2) (2023-09-07) + + +### Bug Fixes + +* **YouTube - Hide layout components:** Always hide redundant 'player audio track' button ([#2951](https://github.com/ReVanced/revanced-patches/issues/2951)) ([ca632bd](https://github.com/ReVanced/revanced-patches/commit/ca632bd2cc74f0ce5ccb948e902445de3ab893cf)) + +## [2.190.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v2.190.0...v2.190.1-dev.1) (2023-09-03) + + +### Bug Fixes + +* **Twitch - Audio ads:** Support missing version `16.1.0` ([#2928](https://github.com/ReVanced/revanced-patches/issues/2928)) ([688d8fa](https://github.com/ReVanced/revanced-patches/commit/688d8fa7e86862e03d8336af5f6cb207c4b72593)) + # [2.190.0](https://github.com/ReVanced/revanced-patches/compare/v2.189.0...v2.190.0) (2023-09-03) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..ae02f2a8f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,106 @@ +

+ + + + +
+ + +     + + + + + +     + + +     + + +     + + +     + + +     + + +     +
+
+ Continuing the legacy of Vanced +

+ +# 📙 ReVanced Patches contribution guidelines + +This document describes how to contribute to ReVanced Patches. + +## 📖 Resources to help you get started + +* The [documentation](https://github.com/ReVanced/revanced-patches/tree/docs/docs) provides the fundamentals of patches +and everything necessary to create your own patch from scratch +* [Our backlog](https://github.com/orgs/ReVanced/projects/12) is where we keep track of what we're working on +* [Issues](https://github.com/ReVanced/revanced-patches/issues) are where we keep track of bugs and feature requests + +## 🙏 Submitting a feature request + +Features can be requested by opening an issue using the +[Feature request issue template](https://github.com/ReVanced/revanced-patches/issues/new?assignees=&labels=Feature+request&projects=&template=feature-request.yml&title=feat%3A+). + +> **Note** +> Requests can be accepted or rejected at the discretion of maintainers of ReVanced Patches. +> Good motivation has to be provided for a request to be accepted. + +## 🐞 Submitting a bug report + +If you encounter a bug while using ReVanced Patches, open an issue using the +[Bug report issue template](https://github.com/ReVanced/revanced-patches/issues/new?assignees=&labels=Bug+report&projects=&template=bug-report.yml&title=bug%3A+). + +## 🧑‍⚖️ Guidelines for requesting or contributing patches + +To maintain a high-quality and ethical collection of patches, the following guidelines for requesting +or contributing patches are effective as of September 14, 2023. Any patches present prior to this date +are unaffected by this change. + +> **Note** +> We generally adhere to the guidelines outlined below. However, we may make exceptions +> in specific cases based on our discretion. Pull requests for patches that deviate from the guidelines +> will be evaluated individually. While a patch may not align with our general guidelines, +> we will consider its acceptance on a case-by-case basis, taking into account its impact on user experience +> and ethical considerations. We reserve the right to make exceptions for patches that provide significant value. + +✅ Examples for acceptable patches include: + +* Customizations: Feel free to contribute patches that allow users to personalize their experience +* Ad-Blocking: Patches aimed at enhancing user privacy and blocking intrusive advertisements are appreciated +* Feature additions: Patches that add new features or change behaviour to the app are welcome + +❌ Examples for unacceptable patches include: + +* Payment circumvention: We do not accept patches that exist solely to bypass payment for the app or any of its features +* Malicious patches: Patches that are malicious in nature are not allowed + + +## 📝 How to contribute + +1. Before contributing, it is recommended to open an issue to discuss your change +with the maintainers of ReVanced Patches. This will help you determine whether your change is acceptable +and whether it is worth your time to implement it +2. Development happens on the `dev` branch. Fork the repository and create your branch from `dev` +3. Commit your changes. In case you are contributing a new patch, make sure to follow the conventions for patches +described in the [documentation](https://github.com/ReVanced/revanced-patches/tree/docs/docs) +4. Submit a pull request to the `dev` branch of the repository and reference issues +that your pull request closes in the description of your pull request +5. Our team will review your pull request and provide feedback. Once your pull request is approved, +it will be merged into the `dev` branch and will be included in the next release of ReVanced Patches + +❤️ Thank you for considering contributing to ReVanced Patches, +ReVanced diff --git a/README.md b/README.md index 79fde2b82..6336b2c21 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,91 @@ -## 🧩 ReVanced Patches +

+ + + + +
+ + +     + + + + + +     + + +     + + +     + + +     + + +     + + +     +
+
+ Continuing the legacy of Vanced +

-Patches for ReVanced. + +# 🧩 ReVanced Patches + +![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/ReVanced/revanced-patches/release.yml) +![GPLv3 License](https://img.shields.io/badge/License-GPL%20v3-yellow.svg) + +This repository contains a collection of ReVanced Patches. + +## ❓ About + +Patches are small modifications to Android apps that allow you to change the behaviour of or add new features, +block ads, customize the appearance, and much more. + +## 💪 Features + +Some of the features the patches provide are: + +* 🚫 **Block ads**: Say goodbye to ads +* ⭐ **Customize your app**: Personalize the appearance of apps with various layouts and themes +* 🪄 **Add new features**: Extend the functionality of apps with lots of new features +* ⚙️ **Miscellaneous and general purpose**: Rename packages, enable debugging, disable screen capture restrictions, +export activities, etc. +* ✨ **And much more!** + +For a full list of all available patches, visit [revanced.app/patches](https://revanced.app/patches). + +## 🚀 How to get started + +You can use [ReVanced CLI](https://github.com/ReVanced/revanced-cli) or [ReVanced Manager](https://github.com/ReVanced/revanced-manager) to use ReVanced Patches. + +## 📚 Everything else + +### 📙 Contributing + +Thank you for considering contributing to ReVanced Patches. You can find the contribution guidelines [here](CONTRIBUTING.md). + +### 📃 Documentation + +The documentation provides the fundamentals of patches and everything necessary to create your own patch from scratch. +You can find it [here](https://github.com/ReVanced/revanced-patches/tree/docs/docs). + +### 🛠️ Building + +In order to build ReVanced Patches, you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation). + +## 📜 Licence + +ReVanced Patches is licensed under the GPLv3 licence. Please see the [licence file](LICENSE) for more information. +[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced patches as long as you track changes/dates in source files. +Any modifications to ReVanced Patches must also be made available under the GPL along with build & install instructions. diff --git a/assets/revanced-headline/revanced-headline-vertical-dark.svg b/assets/revanced-headline/revanced-headline-vertical-dark.svg new file mode 100644 index 000000000..a59bfb50b --- /dev/null +++ b/assets/revanced-headline/revanced-headline-vertical-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/revanced-headline/revanced-headline-vertical-light.svg b/assets/revanced-headline/revanced-headline-vertical-light.svg new file mode 100644 index 000000000..3c5eeccc7 --- /dev/null +++ b/assets/revanced-headline/revanced-headline-vertical-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/revanced-logo/revanced-logo-round.svg b/assets/revanced-logo/revanced-logo-round.svg new file mode 100644 index 000000000..901e1914b --- /dev/null +++ b/assets/revanced-logo/revanced-logo-round.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index dc49306d7..ef4cbf566 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ plugins { kotlin("jvm") version "1.8.20" + alias(libs.plugins.ksp) } group = "app.revanced" @@ -25,16 +26,17 @@ repositories { } dependencies { - implementation("app.revanced:revanced-patcher:14.2.1") - implementation("com.android.tools.smali:smali:3.0.3") - // Required because build fails without it. - // TODO: Find a way to remove this dependency. - implementation("com.google.guava:guava:32.1.2-jre") + implementation(libs.revanced.patcher) + implementation(libs.smali) + implementation(libs.revanced.patch.annotation.processor) + // TODO: Required because build fails without it. Find a way to remove this dependency. + implementation(libs.guava) // Used in JsonGenerator. - implementation("com.google.code.gson:gson:2.10.1") - // A dependency to the Android library unfortunately fails the build, - // which is why this is required for the patch change-oauth-client-id. + implementation(libs.gson) + // A dependency to the Android library unfortunately fails the build, which is why this is required. compileOnly(project("dummy")) + + ksp(libs.revanced.patch.annotation.processor) } kotlin { @@ -50,7 +52,7 @@ tasks { val androidHome = System.getenv("ANDROID_HOME") ?: throw GradleException("ANDROID_HOME not found") val d8 = "${androidHome}/build-tools/33.0.1/d8" val input = configurations.archives.get().allArtifacts.files.files.first().absolutePath - val work = File("${buildDir}/libs") + val work = layout.buildDirectory.dir("libs").get().asFile exec { workingDir = work @@ -63,6 +65,7 @@ tasks { } } } + register("generateMeta") { description = "Generate metadata for this bundle" dependsOn(build) @@ -70,6 +73,7 @@ tasks { classpath = sourceSets["main"].runtimeClasspath mainClass.set("app.revanced.meta.PatchesFileGenerator") } + // Dummy task to fix the Gradle semantic-release plugin. // Remove this if you forked it to support building only. // Tracking issue: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435 diff --git a/gradle.properties b/gradle.properties index c836a2ec8..542cff4ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.parallel = true org.gradle.caching = true kotlin.code.style = official -version = 2.190.0 +version = 2.191.0-dev.33 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..87ecc96b9 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,17 @@ +[versions] +revanced-patcher = "16.0.0" +revanced-patch-annotation-processor = "16.0.0" +ksp = "1.9.0-1.0.11" +smali = "3.0.3" +guava = "32.1.2-jre" +gson = "2.10.1" + +[libraries] +revanced-patcher = { module = "app.revanced:revanced-patcher", version.ref = "revanced-patcher" } +revanced-patch-annotation-processor = { module = "app.revanced:revanced-patch-annotation-processor", version.ref = "revanced-patch-annotation-processor" } +smali = { module = "com.android.tools.smali:smali", version.ref = "smali" } +guava = { module = "com.google.guava:guava", version.ref = "guava" } +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } + +[plugins] +ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } diff --git a/patches.json b/patches.json index 59d9a07a9..de8b00dbe 100644 --- a/patches.json +++ b/patches.json @@ -1 +1 @@ -[{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails with still image captures of the video.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Always autorepeat","description":"Always repeats the playing video again.","excluded":false,"options":[],"dependencies":["Integrations"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","excluded":false,"options":[],"dependencies":["Settings"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}]},{"name":"Background play","description":"Enables playing music in the background.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1"]}]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like TTV.lol or PurpleAdBlocker.","excluded":false,"options":[],"dependencies":["Block video ads","Integrations","Settings"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Change package name","description":"Changes the package name. Appends \".revanced\" to the package name by default.","excluded":true,"options":[{"key":"packageName","title":"Package name","description":"The name of the package to rename the app to.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[]},{"name":"Client spoof","description":"Spoofs the client to allow playback.","excluded":false,"options":[],"dependencies":["Spoof signature verification"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Comments","description":"Hides components related to comments.","excluded":false,"options":[],"dependencies":["Settings","LithoFilterPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Copy video url","description":"Adds buttons in player to copy video links.","excluded":false,"options":[],"dependencies":["CopyVideoUrlResourcePatch","Player controls bytecode patch","Video information"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Custom branding","description":"Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).","excluded":true,"options":[{"key":"appName","title":"Application Name","description":"The name of the application it will show on your home screen.","required":true,"choices":null},{"key":"iconPath","title":"App Icon Path","description":"A path containing mipmap resource folders with icons.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Custom player overlay opacity","description":"Change the opacity of the player background, when player controls are visible.","excluded":false,"options":[],"dependencies":["CustomPlayerOverlayOpacityResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","excluded":true,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":[]}]},{"name":"Disable Shorts on startup","description":"Disables playing YouTube Shorts when launching YouTube.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":[]},{"name":"com.laurencedawson.reddit_sync.dev","versions":[]}]},{"name":"Disable ads","description":"Disables ads in HexEditor.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.myprog.hexedit","versions":[]}]},{"name":"Disable ads","description":"This patch has no description.","excluded":false,"options":[],"dependencies":["DisablePiracyDetectionPatch"],"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":[]}]},{"name":"Disable ads","description":"This patch has no description.","excluded":false,"options":[],"dependencies":["DisablePiracyDetectionPatch"],"compatiblePackages":[{"name":"o.o.joey","versions":[]}]},{"name":"Disable auto captions","description":"Disable forced captions from being automatically enabled.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Disable login requirement","description":"Do not force login.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Disable mandatory login","description":"This patch has no description.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":[]}]},{"name":"Disable player popup panels","description":"Disables panels from appearing automatically when going into fullscreen (playlist or live chat).","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.reddit.frontpage","versions":[]}]},{"name":"Disable switching emoji to sticker in message input field","description":"Disables switching from emoji to sticker search mode in message input field","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.facebook.orca","versions":[]}]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.facebook.orca","versions":[]}]},{"name":"Disable zoom haptics","description":"Disables haptics when zooming.","excluded":false,"options":[],"dependencies":["Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Dynamic color","description":"Replaces the default Twitter Blue with the users Material You palette.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.twitter.android","versions":[]}]},{"name":"Enable android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[]},{"name":"Enable debugging","description":"Adds debugging options.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.spotify.lite","versions":[]}]},{"name":"Enable tablet layout","description":"Spoofs the device form factor to a tablet which enables the tablet layout.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Export all activities","description":"Makes all app activities exportable.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external app.","excluded":false,"options":[],"dependencies":["ExternalDownloadsResourcePatch","Player controls bytecode patch","Video information"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Feed filter","description":"Filters tiktok videos: removing ads, removing livestreams.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Fix google login","description":"Allows logging in with a Google account.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"HDR auto brightness","description":"Makes the brightness of HDR videos follow the system default.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide Shorts components","description":"Hides components from YouTube Shorts.","excluded":false,"options":[],"dependencies":["Integrations","LithoFilterPatch","HideShortsComponentsResourcePatch","ResourceMappingPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide ads","description":"Removes general ads.","excluded":false,"options":[],"dependencies":["Hide get premium","HideAdsResourcePatch","VerticalScrollPatch","FixBackToExitGesturePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide ads","description":"Removes ads from the Reddit.","excluded":false,"options":[],"dependencies":["Hide subreddit banner","Hide comment ads"],"compatiblePackages":[{"name":"com.reddit.frontpage","versions":[]}]},{"name":"Hide ads","description":"Hides ads.","excluded":false,"options":[],"dependencies":["Json hook"],"compatiblePackages":[{"name":"com.twitter.android","versions":[]}]},{"name":"Hide ads","description":"Removes general ads.","excluded":false,"options":[],"dependencies":["VerticalScrollPatch"],"compatiblePackages":[{"name":"com.vanced.android.youtube","versions":[]}]},{"name":"Hide ads","description":"Removes ads from TikTok.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Hide ads","description":"Removes ads from Inshorts.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.nis.app","versions":[]}]},{"name":"Hide ads","description":"Hides ads.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"jp.pxv.android","versions":[]}]},{"name":"Hide album cards","description":"Hides the album cards below the artist description.","excluded":false,"options":[],"dependencies":["Integrations","AlbumCardsResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide autoplay button","description":"Hides the autoplay button in the video player.","excluded":false,"options":[],"dependencies":["Integrations","Settings","ResourceMappingPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide breaking news shelf","description":"Hides the breaking news shelf on the homepage tab.","excluded":false,"options":[],"dependencies":["Integrations","BreakingNewsResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide captions button","description":"Hides the captions button on video player.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide cast button","description":"Hides the cast button in the video player.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Hide crowdfunding box","description":"Hides the crowdfunding box between the player and video description.","excluded":false,"options":[],"dependencies":["Integrations","CrowdfundingBoxResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide email address","description":"Hides the email address in the account switcher.","excluded":false,"options":[],"dependencies":["Integrations","HideEmailAddressResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide endscreen cards","description":"Hides the suggested video cards at the end of a video in fullscreen.","excluded":false,"options":[],"dependencies":["Integrations","HideEndscreenCardsResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide filter bar","description":"Hides the filter bar in video feeds.","excluded":false,"options":[],"dependencies":["HideFilterBarResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide floating microphone button","description":"Hides the floating microphone button which appears in search.","excluded":false,"options":[],"dependencies":["HideFloatingMicrophoneButtonResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.facebook.orca","versions":[]}]},{"name":"Hide info cards","description":"Hides info cards in videos.","excluded":false,"options":[],"dependencies":["Integrations","HideInfocardsResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide layout components","description":"Hides general layout components.","excluded":false,"options":[],"dependencies":["LithoFilterPatch","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39"]}]},{"name":"Hide load more button","description":"Hides the button under videos that loads similar videos.","excluded":false,"options":[],"dependencies":["HideLoadMoreButtonResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide player buttons","description":"Adds the option to hide video player previous and next buttons.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","excluded":false,"options":[],"dependencies":["ResourceMappingPatch"],"compatiblePackages":[{"name":"com.spotify.music","versions":[]}]},{"name":"Hide recommended users","description":"Hides recommended users.","excluded":false,"options":[],"dependencies":["Json hook"],"compatiblePackages":[{"name":"com.twitter.android","versions":[]}]},{"name":"Hide seekbar","description":"Hides the seekbar.","excluded":false,"options":[],"dependencies":["Integrations","Settings","SeekbarColorBytecodePatch","SeekbarPreferencesPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}]},{"name":"Hide timestamp","description":"Hides timestamp in video player.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide video action buttons","description":"Adds the options to hide action buttons under a video.","excluded":false,"options":[],"dependencies":["ResourceMappingPatch","LithoFilterPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Hide watermark","description":"Hides creator\u0027s watermarks on videos.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Minimized playback","description":"Enables minimized and background playback.","excluded":false,"options":[],"dependencies":["Integrations","Player type hook","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Music video ads","description":"Removes ads in the music player.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Navigation buttons","description":"Adds options to hide or change navigation buttons.","excluded":false,"options":[],"dependencies":["Integrations","Settings","ResolvePivotBarFingerprintsPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Old video quality menu","description":"Shows the old video quality with the advanced video quality options instead of the new one.","excluded":false,"options":[],"dependencies":["Integrations","OldVideoQualityMenuResourcePatch","LithoFilterPatch","BottomSheetHookPatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Open links externally","description":"Open links outside of the app directly in your browser.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","excluded":true,"options":[],"dependencies":["Enable android debugging"],"compatiblePackages":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Playback speed","description":"Adds custom playback speeds and ability to remember the playback speed you chose in the video playback speed flyout.","excluded":false,"options":[],"dependencies":["Custom playback speed","Remember playback speed"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Player flyout menu","description":"Hides player flyout menu items.","excluded":false,"options":[],"dependencies":["LithoFilterPatch","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[]},{"name":"Premium heading","description":"Shows premium branding on the home screen.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Premium icon reddit","description":"Unlocks premium Reddit app icons.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.reddit.frontpage","versions":[]}]},{"name":"Pro unlock","description":"Unlocks pro-only functions.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","excluded":false,"options":[],"dependencies":["Spoof cert patch"],"compatiblePackages":[{"name":"de.dwd.warnapp","versions":[]}]},{"name":"Remember video quality","description":"Adds the ability to remember the video quality you chose in the video quality flyout.","excluded":false,"options":[],"dependencies":["Integrations","Video information","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Remove ads","description":"Removes all ads from the app.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":[]}]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":[]}]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":[]}]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[{"name":"eu.faircode.netguard","versions":[]}]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.scb.phone","versions":[]}]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":[]}]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"pl.solidexplorer2","versions":[]}]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":[]}]},{"name":"Remove player controls background","description":"Removes the background from the video player controls.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"at.gv.oe.app","versions":[]}]},{"name":"Remove root detection","description":"Removes the check for root permissions.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":[]}]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","excluded":true,"options":[],"dependencies":["RemoveCaptureRestrictionResourcePatch"],"compatiblePackages":[]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Return YouTube Dislike","description":"Shows the dislike count of videos using the Return YouTube Dislike API.","excluded":false,"options":[],"dependencies":["Integrations","Video id hook","ReturnYouTubeDislikeResourcePatch","Player type hook"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39"]}]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.reddit.frontpage","versions":[]}]},{"name":"Seekbar tapping","description":"Enables tap-to-seek on the seekbar of the video player.","excluded":false,"options":[],"dependencies":["Integrations","EnableSeekbarTappingResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Settings","description":"Adds settings menu to Twitch.","excluded":false,"options":[],"dependencies":["Integrations","SettingsResourcePatch"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":[]}]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","excluded":false,"options":[],"dependencies":["Integrations"],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}]},{"name":"Show seekbar","description":"Shows progress bar for all video.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"Sim spoof","description":"Spoofs the information which is retrieved from the sim-card.","excluded":true,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":[]},{"name":"com.zhiliaoapp.musically","versions":[]}]},{"name":"SponsorBlock","description":"Integrates SponsorBlock which allows skipping video segments such as sponsored content.","excluded":false,"options":[],"dependencies":["Integrations","Video id hook","Video information","Player type hook","Player controls bytecode patch","SponsorBlockResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Spoof app version","description":"Tricks YouTube into thinking you are running an older version of the app. One of the side effects also includes restoring the old UI.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"com.onelouder.baconreader","versions":[]},{"name":"com.onelouder.baconreader.premium","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"free.reddit.news","versions":[]},{"name":"reddit.news","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":[]},{"name":"com.andrewshu.android.redditdonation","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":["DisablePiracyDetectionPatch"],"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":[]},{"name":"com.laurencedawson.reddit_sync.pro","versions":[]},{"name":"com.laurencedawson.reddit_sync.dev","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":["DisablePiracyDetectionPatch"],"compatiblePackages":[{"name":"o.o.joey","versions":[]},{"name":"o.o.joey.pro","versions":[]},{"name":"o.o.joey.dev","versions":[]}]},{"name":"Spoof client","description":"Spoofs the client in order to allow logging in. The OAuth application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","excluded":false,"options":[{"key":"client-id","title":"OAuth client ID","description":"The Reddit OAuth client ID.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"me.ccrama.redditslide","versions":[]}]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","excluded":false,"options":[],"dependencies":["SignatureDetectionPatch"],"compatiblePackages":[{"name":"com.microblink.photomath","versions":[]}]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"at.gv.oe.app","versions":[]}]},{"name":"Spoof wifi connection","description":"Spoofs an existing Wi-Fi connection.","excluded":true,"options":[],"dependencies":[],"compatiblePackages":[]},{"name":"Spotify theme","description":"Applies a custom theme.","excluded":false,"options":[{"key":"backgroundColor","title":"Background color","description":"The background color. Can be a hex color or a resource reference.","required":false,"choices":null},{"key":"accentColor","title":"Accent color","description":"The accent color (\u0027spotify green\u0027 by default). Can be a hex color or a resource reference.","required":false,"choices":null},{"key":"accentPressedColor","title":"Pressed accent for the dark theme","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":false,"choices":null}],"dependencies":[],"compatiblePackages":[{"name":"com.spotify.music","versions":[]}]},{"name":"Swipe controls","description":"Adds volume and brightness swipe controls.","excluded":false,"options":[],"dependencies":["Integrations","Player type hook","SwipeControlsResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Tablet mini player","description":"Enables the tablet mini player layout.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Theme","description":"Applies a custom theme.","excluded":false,"options":[{"key":"darkThemeBackgroundColor","title":"Background color for the dark theme","description":"The background color of the dark theme. Can be a hex color or a resource reference.","required":false,"choices":null},{"key":"lightThemeBackgroundColor","title":"Background color for the light theme","description":"The background color of the light theme. Can be a hex color or a resource reference.","required":false,"choices":null}],"dependencies":["Litho color hook","SeekbarColorBytecodePatch","ThemeResourcePatch"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":[]}]},{"name":"Unlock Duolingo Super","description":"Unlocks Duolingo Super features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.duolingo","versions":[]}]},{"name":"Unlock paid widgets","description":"Unlocks paid widgets of the app","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.dci.dev.androidtwelvewidgets","versions":[]}]},{"name":"Unlock plus","description":"This patch has no description.","excluded":false,"options":[],"dependencies":["SignatureDetectionPatch","EnableBookpointPatch"],"compatiblePackages":[{"name":"com.microblink.photomath","versions":[]}]},{"name":"Unlock premium","description":"Unlocks premium features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":[]}]},{"name":"Unlock premium","description":"Unlocks premium features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"io.yuka.android","versions":[]}]},{"name":"Unlock pro","description":"Unlocks premium features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.candylink.openvpn","versions":[]}]},{"name":"Unlock pro","description":"Unlocks all pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":[]}]},{"name":"Unlock pro","description":"Unlocks pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":[]}]},{"name":"Unlock pro","description":"Unlocks all pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.awedea.nyx","versions":[]}]},{"name":"Unlock pro","description":"Unlocks pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.vsco.cam","versions":[]}]},{"name":"Unlock pro","description":"Unlocks pro features.","excluded":false,"options":[],"dependencies":["SignatureVerificationPatch","LicenseValidationPatch"],"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}]},{"name":"Unlock pro","description":"Unlocks all professional features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}]},{"name":"Unlock pro","description":"Unlocks pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}]},{"name":"Unlock pro","description":"Unlocks all pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":[]}]},{"name":"Unlock pro","description":"Unlocks all pro features.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"co.windyapp.android","versions":[]}]},{"name":"Unlock subscription features","description":"Unlocks \"Matched Runs\" and \"Segment Efforts\".","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","excluded":false,"options":[],"dependencies":[],"compatiblePackages":[{"name":"com.ticktick.task","versions":[]}]},{"name":"Vanced MicroG support","description":"Allows YouTube ReVanced to run without root and under a different package name with Vanced MicroG.","excluded":false,"options":[],"dependencies":["MicroGResourcePatch","Hide cast button","Client spoof"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Vanced MicroG support","description":"Allows YouTube Music ReVanced to run without root and under a different package name.","excluded":false,"options":[],"dependencies":["MicroGResourcePatch"],"compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":[]}]},{"name":"Video ads","description":"Removes ads in the video player.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]},{"name":"Wide searchbar","description":"Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.","excluded":false,"options":[],"dependencies":["Integrations","Settings"],"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39"]}]}] \ No newline at end of file +[{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable mandatory login","description":null,"compatiblePackages":[{"name":"com.adobe.lrmobile","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.vanced.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"ginlemon.iconpackstudio","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.ithebk.expensemanager","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable typing indicator","description":"Disables the indicator while typing a message.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable switching emoji to sticker","description":"Disables switching from emoji to sticker search mode in message input field.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide inbox ads","description":"Hides ads in inbox.","compatiblePackages":[{"name":"com.facebook.orca","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove file size limit","description":"Allows opening files larger than 2 MB in the text editor.","compatiblePackages":[{"name":"pl.solidexplorer2","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock themes","description":"Unlocks all themes that are inaccessible until a certain level is reached.","compatiblePackages":[{"name":"com.ticktick.task","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide premium navbar","description":"Removes the premium tab from the navbar.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable on demand","description":"Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.","compatiblePackages":[{"name":"com.spotify.lite","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.spotify.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"backgroundColor","default":"@android:color/black","title":"Background color","description":"The background color. Can be a hex color or a resource reference.","required":false},{"key":"accentColor","default":"#ff1ed760","title":"Accent color","description":"The accent color (\u0027spotify green\u0027 by default). Can be a hex color or a resource reference.","required":false},{"key":"accentPressedColor","default":"#ff169c46","title":"Pressed accent for the dark theme","description":"The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.","required":false}]},{"name":"Unlock premium","description":null,"compatiblePackages":[{"name":"io.yuka.android","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.candylink.openvpn","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Exclusive audio playback","description":"Enables the option to play audio without video.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Codecs unlock","description":"Adds more audio codec options. The new audio codecs usually result in better audio quality.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Permanent repeat","description":"Permanently remember your repeating preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Permanent shuffle","description":"Permanently remember your shuffle preference even if the playlist ends or another track is played.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Music video ads","description":"Removes ads in the music player.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Background play","description":"Enables playing music in the background.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Vanced MicroG support","description":"Allows YouTube Music to run without root and under a different package name.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass certificate checks","description":"Bypasses certificate checks which prevent YouTube Music from working on Android Auto.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":"Removes all \"Get Premium\" evidences from the avatar menu.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback music","description":"Enables minimized playback on Kids music.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Compact header","description":"Hides the music category bar at the top of the homepage.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove upgrade button","description":"Removes the upgrade tab from the pivot bar.","compatiblePackages":[{"name":"com.google.android.apps.youtube.music","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove bootloader detection","description":"Removes the check for an unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bmf.bmf2go","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Pro unlock","description":null,"compatiblePackages":[{"name":"com.backdrops.wallpapers","versions":["4.52"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof device ID","description":"Spoofs device ID to mitigate manual bans by developers.","compatiblePackages":[{"name":"com.microblink.photomath","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock plus","description":null,"compatiblePackages":[{"name":"com.microblink.photomath","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.myprog.hexedit","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Auto claim channel points","description":"Automatically claim Channel Points.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show deleted messages","description":"Shows deleted chat messages behind a clickable spoiler.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Debug mode","description":"Enables Twitch\u0027s internal debugging mode.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Block audio ads","description":"Blocks audio ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block video ads","description":"Blocks video ads in streams and VODs.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Block embedded ads","description":"Blocks embedded stream ads using services like Luminous or PurpleAdBlocker.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":["15.4.1","16.1.0"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds settings menu to Twitch.","compatiblePackages":[{"name":"tv.twitch.android.app","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Promo code unlock","description":"Disables the validation of promo code. Any code will work to unlock all features.","compatiblePackages":[{"name":"de.dwd.warnapp","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Feed filter","description":"Filters tiktok videos: removing ads, removing livestreams.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Downloads","description":"Removes download restrictions and changes the default path to download to.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Enables the playback speed option for all videos.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show seekbar","description":"Shows progress bar for all video.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":["30.8.4"]},{"name":"com.zhiliaoapp.musically","versions":["30.8.4"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SIM spoof","description":"Spoofs the information which is retrieved from the SIM card.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable login requirement","description":null,"compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Fix Google login","description":"Allows logging in with a Google account.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Settings","description":"Adds ReVanced settings to TikTok.","compatiblePackages":[{"name":"com.ss.android.ugc.trill","versions":null},{"name":"com.zhiliaoapp.musically","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock paid widgets","description":"Unlocks paid widgets of the app","compatiblePackages":[{"name":"com.dci.dev.androidtwelvewidgets","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable subscription suggestions","description":null,"compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock subscription features","description":"Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".","compatiblePackages":[{"name":"com.strava","versions":["320.12"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable dashboard ads","description":"Disables ads in the dashboard.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable gift message popup","description":"Disables the popup suggesting to buy TumblrMart items for other people.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable in-app update","description":"Disables the in-app update check and update prompt.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable blog notification reminder","description":"Disables the reminder to enable notifications for blogs you visit.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Tumblr Live","description":"Disable the Tumblr Live tab button and dashboard carousel.","compatiblePackages":[{"name":"com.tumblr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.bka.serviceportal","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove badge tab","description":"Removes the badge tab from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove notification badge","description":"Removes the red notification badge from the activity tab.","compatiblePackages":[{"name":"com.sony.songpal.mdr","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove device restrictions","description":"Removes restrictions from using the app on any device. Requires mounting patched app over original.","compatiblePackages":[{"name":"com.google.android.apps.recorder","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.awedea.nyx","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks pro features.","compatiblePackages":[{"name":"com.vsco.cam","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof signature","description":"Spoofs the signature of the app.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove root detection","description":"Removes the check for root permissions and unlocked bootloader.","compatiblePackages":[{"name":"at.gv.oe.app","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"org.totschnig.myexpenses","versions":["3.4.9"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":"Unlocks all pro features.","compatiblePackages":[{"name":"co.windyapp.android","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.zombodroid.MemeGenerator","versions":["4.6364","4.6370","4.6375","4.6377"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"jp.pxv.android","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Show on lockscreen","description":"Shows student id and student ticket on lockscreen.","compatiblePackages":[{"name":"de.tudortmund.app","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Remove debugging detection","description":"Removes the USB and wireless debugging checks.","compatiblePackages":[{"name":"com.scb.phone","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"External downloads","description":"Adds support to download and save YouTube videos using an external app.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Copy video url","description":"Adds buttons in player to copy video links.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Seekbar tapping","description":"Enables tap-to-seek on the seekbar of the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Swipe controls","description":"Adds volume and brightness swipe controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Removes general ads.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide get premium","description":null,"compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Video ads","description":"Removes ads in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Old video quality menu","description":"Shows the old video quality with the advanced video quality options instead of the new one.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Playback speed","description":"Adds custom playback speeds and ability to remember the playback speed you chose in the video playback speed flyout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"HDR auto brightness","description":"Makes the brightness of HDR videos follow the system default.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remember video quality","description":"Adds the ability to remember the video quality you chose in the video quality flyout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Always autorepeat","description":"Always repeats the playing video again.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Vanced MicroG support","description":"Allows YouTube to run without root and under a different package name with Vanced MicroG.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Minimized playback","description":"Enables minimized and background playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable zoom haptics","description":"Disables haptics when zooming.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable debugging","description":"Adds debugging options.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Bypass URL redirects","description":"Bypass URL redirects and open the original URL directly.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Open links externally","description":"Open links outside of the app directly in your browser.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Client spoof","description":"Spoofs the client to allow playback.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide filter bar","description":"Hides the filter bar in video feeds.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timestamp","description":"Hides timestamp in video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide \"Load more\" button","description":"Hides the button under videos that loads similar videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide layout components","description":"Hides general layout components.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide breaking news shelf","description":"Hides the breaking news shelf on the homepage tab.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide endscreen cards","description":"Hides the suggested video cards at the end of a video in fullscreen.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide floating microphone button","description":"Hides the floating microphone button which appears in search.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide watermark","description":"Hides creator\u0027s watermarks on videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Comments","description":"Hides components related to comments.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide album cards","description":"Hides the album cards below the artist description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide email address","description":"Hides the email address in the account switcher.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide seekbar","description":"Hides the seekbar.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide Shorts components","description":"Hides components from YouTube Shorts.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide crowdfunding box","description":"Hides the crowdfunding box between the player and video description.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide info cards","description":"Hides info cards in videos.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Player flyout menu","description":"Hides player flyout menu items.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide captions button","description":"Hides the captions button on video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide autoplay button","description":"Hides the autoplay button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Navigation buttons","description":"Adds options to hide or change navigation buttons.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide video action buttons","description":"Adds the options to hide action buttons under a video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide cast button","description":"Hides the cast button in the video player.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide player buttons","description":"Adds the option to hide video player previous and next buttons.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable auto captions","description":"Disable forced captions from being automatically enabled.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Wide searchbar","description":"Replaces the search icon with a wide search bar. This will hide the YouTube logo when active.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Enable tablet layout","description":"Spoofs the device form factor to a tablet which enables the tablet layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Shorts on startup","description":"Disables playing YouTube Shorts when launching YouTube.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Theme","description":"Applies a custom theme.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"darkThemeBackgroundColor","default":"@android:color/black","title":"Background color for the dark theme","description":"The background color of the dark theme. Can be a hex color or a resource reference.","required":false},{"key":"lightThemeBackgroundColor","default":"@android:color/white","title":"Background color for the light theme","description":"The background color of the light theme. Can be a hex color or a resource reference.","required":false}]},{"name":"Disable player popup panels","description":"Disables panels from appearing automatically when going into fullscreen (playlist or live chat).","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"SponsorBlock","description":"Integrates SponsorBlock which allows skipping video segments such as sponsored content.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom branding","description":"Changes the YouTube launcher icon and name to your choice (defaults to ReVanced).","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[{"key":"appName","default":"YouTube ReVanced","title":"Application Name","description":"The name of the application it will show on your home screen.","required":true},{"key":"iconPath","default":null,"title":"App Icon Path","description":"A path containing mipmap resource folders with icons.","required":false}]},{"name":"Premium heading","description":"Show or hide the premium heading.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"usePremiumHeading","default":true,"title":"Use premium heading","description":"Whether to use the premium heading.","required":true}]},{"name":"Return YouTube Dislike","description":"Shows the dislike count of videos using the Return YouTube Dislike API.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.32.39"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Tablet mini player","description":"Enables the tablet mini player layout.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof app version","description":"Tricks YouTube into thinking you are running an older version of the app. One of the side effects also includes restoring the old UI.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Alternative thumbnails","description":"Adds options to replace video thumbnails with still image captures of the video.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Custom player overlay opacity","description":"Change the opacity of the player background, when player controls are visible.","compatiblePackages":[{"name":"com.google.android.youtube","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove player controls background","description":"Removes the background from the video player controls.","compatiblePackages":[{"name":"com.google.android.youtube","versions":["18.16.37","18.19.35","18.20.39","18.23.35","18.29.38","18.32.39","18.37.36"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Export all activities","description":"Makes all app activities exportable.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Remove screen capture restriction","description":"Removes the restriction of capturing audio from apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":true,"options":[]},{"name":"Remove screenshot restriction","description":"Removes the restriction of taking screenshots in apps that normally wouldn\u0027t allow it.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":true,"options":[]},{"name":"Spoof Wi-Fi connection","description":"Spoofs an existing Wi-Fi connection.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":true,"options":[]},{"name":"Predictive back gesture","description":"Enables the predictive back gesture introduced on Android 13.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Override certificate pinning","description":"Overrides certificate pinning, allowing to inspect traffic via a proxy.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Change package name","description":"Appends \".revanced\" to the package name by default.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[{"key":"packageName","default":null,"title":"Package name","description":"The name of the package to rename the app to.","required":false}]},{"name":"Enable Android debugging","description":"Enables Android debugging capabilities. This can slow down the app.","compatiblePackages":null,"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable Sync for Lemmy bottom sheet","description":"Disables the bottom sheet at the startup that asks you to signup to \"Sync for Lemmy\".","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":["v23.06.30-13:39"]},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"com.laurencedawson.reddit_sync","versions":null},{"name":"com.laurencedawson.reddit_sync.pro","versions":null},{"name":"com.laurencedawson.reddit_sync.dev","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://redditsync/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"com.rubenmayayo.reddit","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://rubenmayayo.com\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"ml.docilealligator.infinityforreddit","versions":["5.4.0","5.4.1","5.4.2","6.0.1","6.0.2","6.0.4","6.0.6","6.1.1"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"infinity://localhost\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"com.onelouder.baconreader","versions":null},{"name":"com.onelouder.baconreader.premium","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://baconreader.com/auth\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"me.ccrama.redditslide","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"http://www.ccrama.me\".","required":true}]},{"name":"Disable ads","description":null,"compatiblePackages":[{"name":"o.o.joey","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"o.o.joey","versions":null},{"name":"o.o.joey.pro","versions":null},{"name":"o.o.joey.dev","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"https://127.0.0.1:65023/authorize_callback\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"free.reddit.news","versions":null},{"name":"reddit.news","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"dbrady://relay\".","required":true}]},{"name":"Spoof client","description":"Restores functionality of the app by using custom client ID\u0027s.","compatiblePackages":[{"name":"com.andrewshu.android.reddit","versions":null},{"name":"com.andrewshu.android.redditdonation","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[{"key":"client-id","default":null,"title":"OAuth client ID","description":"The Reddit OAuth client ID. You can get your client ID from https://www.reddit.com/prefs/apps. The application type has to be \"Installed app\" and the redirect URI has to be set to \"redditisfun://auth\".","required":true}]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":true,"options":[]},{"name":"Sanitize sharing links","description":"Removes (tracking) query parameters from the URLs when sharing links.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Disable screenshot popup","description":"Disables the popup that shows up when taking a screenshot.","compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock premium Reddit icons","description":null,"compatiblePackages":[{"name":"com.reddit.frontpage","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":"Hides ads.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide recommended users","description":null,"compatiblePackages":[{"name":"com.twitter.android","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Dynamic color","description":"Replaces the default Twitter Blue with the user\u0027s Material You palette.","compatiblePackages":[{"name":"com.twitter.android","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove broadcasts restriction","description":"Enables starting/stopping NetGuard via broadcasts.","compatiblePackages":[{"name":"eu.faircode.netguard","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":false,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"tv.trakt.trakt","versions":["1.1.1"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Remove ads","description":null,"compatiblePackages":[{"name":"net.binarymode.android.irplus","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide timeline ads","description":"Removes ads from the timeline.","compatiblePackages":[{"name":"com.instagram.android","versions":["275.0.0.27.98"]}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Hide ads","description":null,"compatiblePackages":[{"name":"com.nis.app","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]},{"name":"Unlock pro","description":null,"compatiblePackages":[{"name":"com.wakdev.apps.nfctools.se","versions":null}],"dependencies":["kotlin.reflect.jvm.internal.KClassImpl"],"use":true,"requiresIntegrations":false,"options":[]}] \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/extensions/Extensions.kt b/src/main/kotlin/app/revanced/extensions/Extensions.kt index 226f4b143..0a00f5dd2 100644 --- a/src/main/kotlin/app/revanced/extensions/Extensions.kt +++ b/src/main/kotlin/app/revanced/extensions/Extensions.kt @@ -2,12 +2,11 @@ package app.revanced.extensions import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.MethodFingerprintExtensions.name import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.mapping.misc.patch.ResourceMappingPatch +import app.revanced.patches.shared.mapping.misc.ResourceMappingPatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction @@ -20,7 +19,7 @@ import org.w3c.dom.Node * @return The [PatchException]. */ val MethodFingerprint.exception - get() = PatchException("Failed to resolve $name") + get() = PatchException("Failed to resolve ${this.javaClass.simpleName}") /** * Find the [MutableMethod] from a given [Method] in a [MutableClass]. @@ -77,22 +76,21 @@ fun Method.findIndexForIdResource(resourceName: String): Int { * * @return the first constant instruction with the value, or -1 if not found. */ -fun Method.indexOfFirstConstantInstructionValue(constantValue: Long): Int { - return implementation?.let { - it.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.CONST && (instruction as WideLiteralInstruction).wideLiteral == constantValue - } - } ?: -1 -} +fun Method.indexOfFirstConstantInstructionValue(constantValue: Long) = implementation?.let { + it.instructions.indexOfFirst { instruction -> + instruction.opcode == Opcode.CONST && (instruction as WideLiteralInstruction).wideLiteral == constantValue + } +} ?: -1 + /** * Check if the method contains a constant with the given value. * * @return if the method contains a constant with the given value. */ -fun Method.containsConstantInstructionValue(constantValue: Long): Boolean { - return indexOfFirstConstantInstructionValue(constantValue) >= 0 -} +fun Method.containsConstantInstructionValue(constantValue: Long) = + indexOfFirstConstantInstructionValue(constantValue) >= 0 + /** * Traverse the class hierarchy starting from the given root class. diff --git a/src/main/kotlin/app/revanced/meta/JsonGenerator.kt b/src/main/kotlin/app/revanced/meta/JsonGenerator.kt index 3be7793f8..dea128a76 100644 --- a/src/main/kotlin/app/revanced/meta/JsonGenerator.kt +++ b/src/main/kotlin/app/revanced/meta/JsonGenerator.kt @@ -1,67 +1,43 @@ package app.revanced.meta -import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages -import app.revanced.patcher.extensions.PatchExtensions.dependencies -import app.revanced.patcher.extensions.PatchExtensions.description -import app.revanced.patcher.extensions.PatchExtensions.include -import app.revanced.patcher.extensions.PatchExtensions.options -import app.revanced.patcher.extensions.PatchExtensions.patchName -import app.revanced.patcher.patch.PatchOption +import app.revanced.patcher.PatchSet +import app.revanced.patcher.patch.Patch import com.google.gson.GsonBuilder import java.io.File internal class JsonGenerator : PatchesFileGenerator { - override fun generate(bundle: PatchBundlePatches) { - val patches = bundle.map { - JsonPatch( - it.patchName, - it.description ?: "This patch has no description.", - !it.include, - it.options?.map { option -> - JsonPatch.Option( - option.key, - option.title, - option.description, - option.required, - option.let { listOption -> - if (listOption is PatchOption.ListOption<*>) { - listOption.options.toMutableList().toTypedArray() - } else null - } - ) - }?.toTypedArray() ?: emptyArray(), - it.dependencies?.map { dep -> - dep.java.patchName - }?.toTypedArray() ?: emptyArray(), - it.compatiblePackages?.map { pkg -> - JsonPatch.CompatiblePackage(pkg.name, pkg.versions) - }?.toTypedArray() ?: emptyArray() - ) - } - - val json = File("patches.json") - json.writeText(GsonBuilder().serializeNulls().create().toJson(patches)) + override fun generate(patches: PatchSet) = patches.map { + JsonPatch( + it.name!!, + it.description, + it.compatiblePackages, + it.dependencies?.map { dependency -> dependency::class.java.name }?.toSet(), + it.use, + it.requiresIntegrations, + it.options.values.map { option -> + JsonPatch.Option(option.key, option.value, option.title, option.description, option.required) + } + ) + }.let { + File("patches.json").writeText(GsonBuilder().serializeNulls().create().toJson(it)) } + @Suppress("unused") private class JsonPatch( - val name: String, - val description: String, - val excluded: Boolean, - val options: Array