diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml index c7ffa59f1..3e2f365f7 100644 --- a/.github/workflows/build_pull_request.yml +++ b/.github/workflows/build_pull_request.yml @@ -12,10 +12,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '17' diff --git a/.github/workflows/open_pull_request.yml b/.github/workflows/open_pull_request.yml index 33c8a7211..6e3eddd18 100644 --- a/.github/workflows/open_pull_request.yml +++ b/.github/workflows/open_pull_request.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Open pull request uses: repo-sync/pull-request@v2 diff --git a/.github/workflows/pull_strings.yml b/.github/workflows/pull_strings.yml index 6f0f6f6cd..be27b0687 100644 --- a/.github/workflows/pull_strings.yml +++ b/.github/workflows/pull_strings.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: ref: dev clean: true diff --git a/.github/workflows/push_strings.yml b/.github/workflows/push_strings.yml index 1be23c2a5..c51254f75 100644 --- a/.github/workflows/push_strings.yml +++ b/.github/workflows/push_strings.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Preprocess strings env: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e2278b3a..5a87fdd40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,10 +18,10 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '17' @@ -35,7 +35,7 @@ jobs: run: ./gradlew :patches:buildAndroid clean - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: 'lts/*' cache: 'npm' @@ -51,14 +51,14 @@ jobs: fingerprint: ${{ vars.GPG_FINGERPRINT }} - name: Release - uses: cycjimmy/semantic-release-action@v4 + uses: cycjimmy/semantic-release-action@v5 id: release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Attest if: steps.release.outputs.new_release_published == 'true' - uses: actions/attest-build-provenance@v2 + uses: actions/attest-build-provenance@v3 with: subject-name: 'ReVanced Patches ${{ steps.release.outputs.new_release_git_tag }}' subject-path: patches/build/libs/patches-*.rvp diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 8136ad5f3..765927aaf 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c54d9e73..b1298164a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,160 @@ +# [5.42.0-dev.19](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.18...v5.42.0-dev.19) (2025-10-07) + + +### Bug Fixes + +* **YouTube - Spoof video streams:** Do not allow VR AV1 if "Force AVC" is enabled ([7afeaeb](https://github.com/ReVanced/revanced-patches/commit/7afeaebb5cc22eb4f4512d8aa0cf4e835e7a2daf)) + +# [5.42.0-dev.18](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.17...v5.42.0-dev.18) (2025-10-07) + + +### Features + +* **Custom branding:** Add in-app settings to change icon and name ([#6059](https://github.com/ReVanced/revanced-patches/issues/6059)) ([a50f3b5](https://github.com/ReVanced/revanced-patches/commit/a50f3b5177808f07d84041c946caccb5a08ad387)) + +# [5.42.0-dev.17](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.16...v5.42.0-dev.17) (2025-10-07) + + +### Bug Fixes + +* **YouTube - Force original audio:** Change patch to default on ([#6070](https://github.com/ReVanced/revanced-patches/issues/6070)) ([bd4ba2d](https://github.com/ReVanced/revanced-patches/commit/bd4ba2dae85ee6fd8d7e6078c3de775ca336e0b6)) + +# [5.42.0-dev.16](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.15...v5.42.0-dev.16) (2025-10-07) + + +### Bug Fixes + +* **YouTube - Spoof video streams:** Add "Allow Android VR AV1" setting ([#6071](https://github.com/ReVanced/revanced-patches/issues/6071)) ([f03256c](https://github.com/ReVanced/revanced-patches/commit/f03256c471e1ee6a12267c1b56b531ca8f89278c)) + +# [5.42.0-dev.15](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.14...v5.42.0-dev.15) (2025-10-07) + + +### Features + +* **Instagram:** Add `Enable developer menu` patch ([#6043](https://github.com/ReVanced/revanced-patches/issues/6043)) ([2154d89](https://github.com/ReVanced/revanced-patches/commit/2154d89242fd8d7f7460145d5d35a4f1986944a3)) + +# [5.42.0-dev.14](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.13...v5.42.0-dev.14) (2025-10-07) + + +### Features + +* **Instagram:** Add `Custom share domain` patch ([#5998](https://github.com/ReVanced/revanced-patches/issues/5998)) ([20c4131](https://github.com/ReVanced/revanced-patches/commit/20c413120bad97af6121718e76b22a1b5540aa44)) + +# [5.42.0-dev.13](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.12...v5.42.0-dev.13) (2025-10-07) + + +### Bug Fixes + +* **Spotify:** Change `Hide Create button` patch to default off ([#6067](https://github.com/ReVanced/revanced-patches/issues/6067)) ([19949e1](https://github.com/ReVanced/revanced-patches/commit/19949e1695cc252ff0f94a33b6e3fb62e967d7fd)) + +# [5.42.0-dev.12](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.11...v5.42.0-dev.12) (2025-10-03) + + +### Bug Fixes + +* **Custom branding:** Update ReVanced logo ([#6049](https://github.com/ReVanced/revanced-patches/issues/6049)) ([9441e7a](https://github.com/ReVanced/revanced-patches/commit/9441e7acb4817e12d1443d438ef6c448518bd614)) + + +### Features + +* **Instagram:** Add `Sanitize sharing links` patch ([#5986](https://github.com/ReVanced/revanced-patches/issues/5986)) ([963a4ef](https://github.com/ReVanced/revanced-patches/commit/963a4ef43fd513de7a2d7d019992f06b62fdcc10)) + +# [5.42.0-dev.11](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.10...v5.42.0-dev.11) (2025-10-03) + + +### Bug Fixes + +* **YouTube:** Resolve UI components not hiding for some users ([#6054](https://github.com/ReVanced/revanced-patches/issues/6054)) ([6b26346](https://github.com/ReVanced/revanced-patches/commit/6b2634691423f5ce25a28b3f2fbc420977b81748)) + +# [5.42.0-dev.10](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.9...v5.42.0-dev.10) (2025-10-02) + + +### Bug Fixes + +* **YouTube - Spoof video streams:** Resolve playback dropping frames ([#6051](https://github.com/ReVanced/revanced-patches/issues/6051)) ([a62ee43](https://github.com/ReVanced/revanced-patches/commit/a62ee43441b197f5c8352ae373bb8919ad66f0bd)) + +# [5.42.0-dev.9](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.8...v5.42.0-dev.9) (2025-10-01) + + +### Bug Fixes + +* **Custom branding:** Update ReVanced logo sizing ([#6029](https://github.com/ReVanced/revanced-patches/issues/6029)) ([ae4b947](https://github.com/ReVanced/revanced-patches/commit/ae4b9474d3fb62528fc21397c19954d31605e9da)) + +# [5.42.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.7...v5.42.0-dev.8) (2025-10-01) + + +### Bug Fixes + +* **YouTube - Force original language:** Resolve some videos using Swedish audio track ([9d67316](https://github.com/ReVanced/revanced-patches/commit/9d6731660ba0e19b863d05d54aa04f74a879f69b)) + + +### Features + +* **YouTube Music:** Add `Force original audio` patch ([#6036](https://github.com/ReVanced/revanced-patches/issues/6036)) ([d0d53d1](https://github.com/ReVanced/revanced-patches/commit/d0d53d109e451759a029326873adfa36fba12b23)) + +# [5.42.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.6...v5.42.0-dev.7) (2025-10-01) + + +### Features + +* **Instagram:** Add `Open links externally` patch ([#6012](https://github.com/ReVanced/revanced-patches/issues/6012)) ([08e8ead](https://github.com/ReVanced/revanced-patches/commit/08e8ead04ffff47a4608a3db7aadc8d5feccd4ad)) + +# [5.42.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.5...v5.42.0-dev.6) (2025-09-30) + + +### Bug Fixes + +* **X / Twitter:** Remove non functional and obsolete patch `Open links with app chooser` ([#6033](https://github.com/ReVanced/revanced-patches/issues/6033)) ([673609c](https://github.com/ReVanced/revanced-patches/commit/673609c2aa87988cdc138eab101b9750fe6a7b62)) + +# [5.42.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.4...v5.42.0-dev.5) (2025-09-28) + + +### Features + +* **YouTube Music:** Add `Custom branding` patch ([#6007](https://github.com/ReVanced/revanced-patches/issues/6007)) ([4c8b56f](https://github.com/ReVanced/revanced-patches/commit/4c8b56f5466b244737f501654eb7c5d34b6b2f88)) + +# [5.42.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.3...v5.42.0-dev.4) (2025-09-28) + + +### Bug Fixes + +* **YouTube Music - GmsCore support:** Handle sharing links to certain apps such as Instagram ([#6026](https://github.com/ReVanced/revanced-patches/issues/6026)) ([328234f](https://github.com/ReVanced/revanced-patches/commit/328234f39ada81542e596f04e8ce410c787c15c8)) + +# [5.42.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.2...v5.42.0-dev.3) (2025-09-28) + + +### Bug Fixes + +* **YouTube - Hide end screen cards:** Hide new type of end screen card ([#6027](https://github.com/ReVanced/revanced-patches/issues/6027)) ([76b0364](https://github.com/ReVanced/revanced-patches/commit/76b0364c5b5562c6a0d178d2bbe5b220f48aaca9)) + +# [5.42.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.42.0-dev.1...v5.42.0-dev.2) (2025-09-27) + + +### Bug Fixes + +* **Instagram - Hide navigation buttons:** Resolve app startup crash ([080a226](https://github.com/ReVanced/revanced-patches/commit/080a2266146798be71789c939deef2f289697523)) + +# [5.42.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.41.1-dev.2...v5.42.0-dev.1) (2025-09-27) + + +### Features + +* **Viber:** Add `Hide navigation buttons` patch ([#5991](https://github.com/ReVanced/revanced-patches/issues/5991)) ([5cb46c4](https://github.com/ReVanced/revanced-patches/commit/5cb46c4e9180ebc16eddb983dad73d137d8ec047)) + +## [5.41.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.41.1-dev.1...v5.41.1-dev.2) (2025-09-27) + + +### Bug Fixes + +* **YouTube Music - Hide cast button:** Fix patching error ([28799a5](https://github.com/ReVanced/revanced-patches/commit/28799a548a73651134ef304cb6cb542cf8e55abe)) + +## [5.41.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.41.0...v5.41.1-dev.1) (2025-09-27) + + +### Bug Fixes + +* **YouTube Music - Hide cast button:** Resolve button not hiding ([7817885](https://github.com/ReVanced/revanced-patches/commit/7817885cffed66608039ab45881537cbd3069c9d)) + # [5.41.0](https://github.com/ReVanced/revanced-patches/compare/v5.40.0...v5.41.0) (2025-09-27) diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/links/OpenLinksExternallyPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/links/OpenLinksExternallyPatch.java new file mode 100644 index 000000000..49db896c2 --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/links/OpenLinksExternallyPatch.java @@ -0,0 +1,30 @@ +package app.revanced.extension.instagram.misc.links; + +import android.net.Uri; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; + +@SuppressWarnings("unused") +public final class OpenLinksExternallyPatch { + + /** + * Injection point. + */ + public static boolean openExternally(String url) { + try { + // The "url" parameter to this function will be of the form. + // https://l.instagram.com/?u=&e= + String actualUrl = Uri.parse(url).getQueryParameter("u"); + if (actualUrl != null) { + Utils.openLink(actualUrl); + return true; + } + + } catch (Exception ex) { + Logger.printException(() -> "openExternally failure", ex); + } + + return false; + } +} diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java new file mode 100644 index 000000000..b7a017e77 --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch.java @@ -0,0 +1,15 @@ +package app.revanced.extension.instagram.misc.privacy; + +import app.revanced.extension.shared.privacy.LinkSanitizer; + +@SuppressWarnings("unused") +public final class SanitizeSharingLinksPatch { + private static final LinkSanitizer sanitizer = new LinkSanitizer("igsh"); + + /** + * Injection point. + */ + public static String sanitizeSharingLink(String url) { + return sanitizer.sanitizeUrlString(url); + } +} diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.java new file mode 100644 index 000000000..77eea7e84 --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.java @@ -0,0 +1,33 @@ +package app.revanced.extension.instagram.misc.share.domain; + +import android.net.Uri; +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public final class ChangeLinkSharingDomainPatch { + + private static String getCustomShareDomain() { + // Method is modified during patching. + throw new IllegalStateException(); + } + + /** + * Injection point. + */ + public static String setCustomShareDomain(String url) { + try { + Uri uri = Uri.parse(url); + Uri.Builder builder = uri + .buildUpon() + .authority(getCustomShareDomain()) + .clearQuery(); + + String patchedUrl = builder.build().toString(); + Logger.printInfo(() -> "Domain change from : " + url + " to: " + patchedUrl); + return patchedUrl; + } catch (Exception ex) { + Logger.printException(() -> "setCustomShareDomain failure with " + url, ex); + return url; + } + } +} diff --git a/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java new file mode 100644 index 000000000..9b3aa6347 --- /dev/null +++ b/extensions/instagram/src/main/java/app/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch.java @@ -0,0 +1,15 @@ +package app.revanced.extension.instagram.misc.share.privacy; + +import app.revanced.extension.shared.privacy.LinkSanitizer; + +@SuppressWarnings("unused") +public final class SanitizeSharingLinksPatch { + private static final LinkSanitizer sanitizer = new LinkSanitizer("igsh"); + + /** + * Injection point. + */ + public static String sanitizeSharingLink(String url) { + return sanitizer.sanitizeUrlString(url); + } +} diff --git a/extensions/music/src/main/java/app/revanced/extension/music/patches/ForceOriginalAudioPatch.java b/extensions/music/src/main/java/app/revanced/extension/music/patches/ForceOriginalAudioPatch.java new file mode 100644 index 000000000..26589623e --- /dev/null +++ b/extensions/music/src/main/java/app/revanced/extension/music/patches/ForceOriginalAudioPatch.java @@ -0,0 +1,17 @@ +package app.revanced.extension.music.patches; + +import app.revanced.extension.music.settings.Settings; + +@SuppressWarnings("unused") +public class ForceOriginalAudioPatch { + + /** + * Injection point. + */ + public static void setEnabled() { + app.revanced.extension.shared.patches.ForceOriginalAudioPatch.setEnabled( + Settings.FORCE_ORIGINAL_AUDIO.get(), + Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() + ); + } +} diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java index 4feb13d9c..a56fb04b9 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/Settings.java @@ -32,4 +32,6 @@ public class Settings extends BaseSettings { // Miscellaneous public static final EnumSetting SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_43_32, true, parent(SPOOF_VIDEO_STREAMS)); + + public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", TRUE, true); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java index 978ee7131..993634eab 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java @@ -31,9 +31,6 @@ import app.revanced.extension.shared.ui.CustomDialog; @SuppressWarnings("unused") public class GmsCoreSupport { - private static final String PACKAGE_NAME_YOUTUBE = "com.google.android.youtube"; - private static final String PACKAGE_NAME_YOUTUBE_MUSIC = "com.google.android.apps.youtube.music"; - private static final String GMS_CORE_PACKAGE_NAME = getGmsCoreVendorGroupId() + ".android.gms"; private static final Uri GMS_CORE_PROVIDER @@ -53,6 +50,20 @@ public class GmsCoreSupport { @Nullable private static volatile Boolean DONT_KILL_MY_APP_MANUFACTURER_SUPPORTED; + private static String getOriginalPackageName() { + return null; // Modified during patching. + } + + /** + * @return If the current package name is the same as the original unpatched app. + * If `GmsCore support` was not included during patching, this returns true; + */ + public static boolean isPackageNameOriginal() { + String originalPackageName = getOriginalPackageName(); + return originalPackageName == null + || originalPackageName.equals(Utils.getContext().getPackageName()); + } + private static void open(String queryOrLink) { Logger.printInfo(() -> "Opening link: " + queryOrLink); @@ -113,11 +124,10 @@ public class GmsCoreSupport { // Verify the user has not included GmsCore for a root installation. // GmsCore Support changes the package name, but with a mounted installation // all manifest changes are ignored and the original package name is used. - String packageName = context.getPackageName(); - if (packageName.equals(PACKAGE_NAME_YOUTUBE) || packageName.equals(PACKAGE_NAME_YOUTUBE_MUSIC)) { + if (isPackageNameOriginal()) { Logger.printInfo(() -> "App is mounted with root, but GmsCore patch was included"); - // Cannot use localize text here, since the app will load - // resources from the unpatched app and all patch strings are missing. + // Cannot use localize text here, since the app will load resources + // from the unpatched app and all patch strings are missing. Utils.showToastLong("The 'GmsCore support' patch breaks mount installations"); // Do not exit. If the app exits before launch completes (and without @@ -250,8 +260,8 @@ public class GmsCoreSupport { }; } - // Modified by a patch. Do not touch. private static String getGmsCoreVendorGroupId() { - return "app.revanced"; + // Modified during patching. + throw new IllegalStateException(); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index feeb379a7..a9d7b6e9d 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -15,6 +15,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.net.ConnectivityManager; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -696,6 +697,18 @@ public class Utils { } } + public static void openLink(String url) { + try { + Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(url)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + Logger.printInfo(() -> "Opening link with external browser: " + intent); + getContext().startActivity(intent); + } catch (Exception ex) { + Logger.printException(() -> "openLink failure", ex); + } + } + public enum NetworkType { NONE, MOBILE, diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CheckWatchHistoryDomainNameResolutionPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CheckWatchHistoryDomainNameResolutionPatch.java index ff2c55ade..23321c0e5 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CheckWatchHistoryDomainNameResolutionPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CheckWatchHistoryDomainNameResolutionPatch.java @@ -46,7 +46,7 @@ public class CheckWatchHistoryDomainNameResolutionPatch { /** * Injection point. * - * Checks if s.youtube.com is blacklisted and playback history will fail to work. + * Checks if YouTube watch history endpoint cannot be reached. */ public static void checkDnsResolver(Activity context) { if (!Utils.isNetworkConnected() || !BaseSettings.CHECK_WATCH_HISTORY_DOMAIN_NAME.get()) return; @@ -67,28 +67,20 @@ public class CheckWatchHistoryDomainNameResolutionPatch { } Utils.runOnMainThread(() -> { - try { - // Create the custom dialog. - Pair dialogPair = CustomDialog.create( - context, - str("revanced_check_watch_history_domain_name_dialog_title"), // Title. - Html.fromHtml(str("revanced_check_watch_history_domain_name_dialog_message")), // Message (HTML). - null, // No EditText. - null, // OK button text. - () -> {}, // OK button action (just dismiss). - () -> {}, // Cancel button action (just dismiss). - str("revanced_check_watch_history_domain_name_dialog_ignore"), // Neutral button text. - () -> BaseSettings.CHECK_WATCH_HISTORY_DOMAIN_NAME.save(false), // Neutral button action (Ignore). - true // Dismiss dialog on Neutral button click. - ); + Pair dialogPair = CustomDialog.create( + context, + str("revanced_check_watch_history_domain_name_dialog_title"), // Title. + Html.fromHtml(str("revanced_check_watch_history_domain_name_dialog_message")), // Message (HTML). + null, // No EditText. + null, // OK button text. + () -> {}, // OK button action (just dismiss). + null, // No cancel button. + str("revanced_check_watch_history_domain_name_dialog_ignore"), // Neutral button text. + () -> BaseSettings.CHECK_WATCH_HISTORY_DOMAIN_NAME.save(false), // Neutral button action (Ignore). + true // Dismiss dialog on Neutral button click. + ); - // Show the dialog. - Dialog dialog = dialogPair.first; - - Utils.showDialog(context, dialog, false, null); - } catch (Exception ex) { - Logger.printException(() -> "checkDnsResolver dialog creation failure", ex); - } + Utils.showDialog(context, dialogPair.first, false, null); }); } catch (Exception ex) { Logger.printException(() -> "checkDnsResolver failure", ex); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java new file mode 100644 index 000000000..79a4d5484 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/CustomBrandingPatch.java @@ -0,0 +1,136 @@ +package app.revanced.extension.shared.patches; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; + +import java.util.ArrayList; +import java.util.List; + +import app.revanced.extension.shared.GmsCoreSupport; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; + +/** + * Patch shared by YouTube and YT Music. + */ +@SuppressWarnings("unused") +public class CustomBrandingPatch { + + // Important: In the future, additional branding themes can be added but all existing and prior + // themes cannot be removed or renamed. + // + // This is because if a user has a branding theme selected, then only that launch alias is enabled. + // If a future update removes or renames that alias, then after updating the app is effectively + // broken and it cannot be opened and not even clearing the app data will fix it. + // In that situation the only fix is to completely uninstall and reinstall again. + // + // The most that can be done is to hide a theme from the UI and keep the alias with dummy data. + public enum BrandingTheme { + /** + * Original unpatched icon. Must be first enum. + */ + ORIGINAL("revanced_original"), + ROUNDED("revanced_rounded"), + MINIMAL("revanced_minimal"), + SCALED("revanced_scaled"), + /** + * User provided custom icon. Must be the last enum. + */ + CUSTOM("revanced_custom"); + + public final String themeAlias; + + BrandingTheme(String themeAlias) { + this.themeAlias = themeAlias; + } + + private String packageAndNameIndexToClassAlias(String packageName, int appIndex) { + if (appIndex <= 0) { + throw new IllegalArgumentException("App index starts at index 1"); + } + return packageName + '.' + themeAlias + '_' + appIndex; + } + } + + /** + * Injection point. + * + * The total number of app name aliases, including dummy aliases. + */ + private static int numberOfPresetAppNames() { + // Modified during patching. + throw new IllegalStateException(); + } + + /** + * Injection point. + */ + @SuppressWarnings("ConstantConditions") + public static void setBranding() { + try { + if (GmsCoreSupport.isPackageNameOriginal()) { + Logger.printInfo(() -> "App is root mounted. Cannot dynamically change app icon"); + return; + } + + Context context = Utils.getContext(); + PackageManager pm = context.getPackageManager(); + String packageName = context.getPackageName(); + + BrandingTheme selectedBranding = BaseSettings.CUSTOM_BRANDING_ICON.get(); + final int selectedNameIndex = BaseSettings.CUSTOM_BRANDING_NAME.get(); + ComponentName componentToEnable = null; + ComponentName defaultComponent = null; + List componentsToDisable = new ArrayList<>(); + + for (BrandingTheme theme : BrandingTheme.values()) { + // Must always update all aliases including custom alias (last index). + final int numberOfPresetAppNames = numberOfPresetAppNames(); + + // App name indices starts at 1. + for (int index = 1; index <= numberOfPresetAppNames; index++) { + String aliasClass = theme.packageAndNameIndexToClassAlias(packageName, index); + ComponentName component = new ComponentName(packageName, aliasClass); + if (defaultComponent == null) { + // Default is always the first alias. + defaultComponent = component; + } + + if (index == selectedNameIndex && theme == selectedBranding) { + componentToEnable = component; + } else { + componentsToDisable.add(component); + } + } + } + + if (componentToEnable == null) { + // User imported a bad app name index value. Either the imported data + // was corrupted, or they previously had custom name enabled and the app + // no longer has a custom name specified. + Utils.showToastLong("Custom branding reset"); + BaseSettings.CUSTOM_BRANDING_ICON.resetToDefault(); + BaseSettings.CUSTOM_BRANDING_NAME.resetToDefault(); + + componentToEnable = defaultComponent; + componentsToDisable.remove(defaultComponent); + } + + for (ComponentName disable : componentsToDisable) { + // Use info logging because if the alias status become corrupt the app cannot launch. + Logger.printInfo(() -> "Disabling: " + disable.getClassName()); + pm.setComponentEnabledSetting(disable, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); + } + + ComponentName componentToEnableFinal = componentToEnable; + Logger.printInfo(() -> "Enabling: " + componentToEnableFinal.getClassName()); + pm.setComponentEnabledSetting(componentToEnable, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0); + } catch (Exception ex) { + Logger.printException(() -> "setBranding failure", ex); + } + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/ForceOriginalAudioPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/ForceOriginalAudioPatch.java new file mode 100644 index 000000000..8ae454e69 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/ForceOriginalAudioPatch.java @@ -0,0 +1,71 @@ +package app.revanced.extension.shared.patches; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.settings.AppLanguage; +import app.revanced.extension.shared.spoof.ClientType; +import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch; + +@SuppressWarnings("unused") +public class ForceOriginalAudioPatch { + + private static final String DEFAULT_AUDIO_TRACKS_SUFFIX = ".4"; + + private static volatile boolean enabled; + + public static void setEnabled(boolean isEnabled, ClientType client) { + enabled = isEnabled; + + if (isEnabled && !client.useAuth && !client.supportsMultiAudioTracks) { + // If client spoofing does not use authentication and lacks multi-audio streams, + // then can use any language code for the request and if that requested language is + // not available YT uses the original audio language. Authenticated requests ignore + // the language code and always use the account language. Use a language that is + // not auto-dubbed by YouTube: https://support.google.com/youtube/answer/15569972 + // but the language is also supported natively by the Meta Quest device that + // Android VR is spoofing. + AppLanguage override = AppLanguage.NB; // Norwegian Bokmal. + Logger.printDebug(() -> "Setting language override: " + override); + SpoofVideoStreamsPatch.setLanguageOverride(override); + } + } + + /** + * Injection point. + */ + public static boolean ignoreDefaultAudioStream(boolean original) { + if (enabled) { + return false; + } + return original; + } + + /** + * Injection point. + */ + public static boolean isDefaultAudioStream(boolean isDefault, String audioTrackId, String audioTrackDisplayName) { + try { + if (!enabled) { + return isDefault; + } + + if (audioTrackId.isEmpty()) { + // Older app targets can have empty audio tracks and these might be placeholders. + // The real audio tracks are called after these. + return isDefault; + } + + Logger.printDebug(() -> "default: " + String.format("%-5s", isDefault) + " id: " + + String.format("%-8s", audioTrackId) + " name:" + audioTrackDisplayName); + + final boolean isOriginal = audioTrackId.endsWith(DEFAULT_AUDIO_TRACKS_SUFFIX); + if (isOriginal) { + Logger.printDebug(() -> "Using audio: " + audioTrackId); + } + + return isOriginal; + } catch (Exception ex) { + Logger.printException(() -> "isDefaultAudioStream failure", ex); + return isDefault; + } + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java index 6952bdcd1..d02899727 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/patches/SanitizeSharingLinksPatch.java @@ -1,5 +1,6 @@ package app.revanced.extension.shared.patches; +import app.revanced.extension.shared.privacy.LinkSanitizer; import app.revanced.extension.shared.settings.BaseSettings; /** @@ -7,17 +8,18 @@ import app.revanced.extension.shared.settings.BaseSettings; */ @SuppressWarnings("unused") public final class SanitizeSharingLinksPatch { - private static final String NEW_TRACKING_PARAMETER_REGEX = ".si=.+"; - private static final String OLD_TRACKING_PARAMETER_REGEX = ".feature=.+"; + + private static final LinkSanitizer sanitizer = new LinkSanitizer( + "si", + "feature" // Old tracking parameter name, and may be obsolete. + ); /** * Injection point. */ public static String sanitize(String url) { if (BaseSettings.SANITIZE_SHARED_LINKS.get()) { - url = url - .replaceAll(NEW_TRACKING_PARAMETER_REGEX, "") - .replaceAll(OLD_TRACKING_PARAMETER_REGEX, ""); + url = sanitizer.sanitizeUrlString(url); } if (BaseSettings.REPLACE_MUSIC_LINKS_WITH_YOUTUBE.get()) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java new file mode 100644 index 000000000..9cfa05c1b --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/privacy/LinkSanitizer.java @@ -0,0 +1,60 @@ +package app.revanced.extension.shared.privacy; + +import android.net.Uri; + +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import app.revanced.extension.shared.Logger; + +/** + * Strips away specific parameters from URLs. + */ +public class LinkSanitizer { + + private final Collection parametersToRemove; + + public LinkSanitizer(String ... parametersToRemove) { + final int parameterCount = parametersToRemove.length; + if (parameterCount == 0) { + throw new IllegalArgumentException("No parameters specified"); + } + + // List is faster if only checking a few parameters. + this.parametersToRemove = parameterCount > 4 + ? Set.of(parametersToRemove) + : List.of(parametersToRemove); + } + + public String sanitizeUrlString(String url) { + try { + return sanitizeUri(Uri.parse(url)).toString(); + } catch (Exception ex) { + Logger.printException(() -> "sanitizeUrlString failure: " + url, ex); + return url; + } + } + + public Uri sanitizeUri(Uri uri) { + try { + Uri.Builder builder = uri.buildUpon().clearQuery(); + + for (String paramName : uri.getQueryParameterNames()) { + if (!parametersToRemove.contains(paramName)) { + for (String value : uri.getQueryParameters(paramName)) { + builder.appendQueryParameter(paramName, value); + } + } + } + + Uri sanitizedUrl = builder.build(); + Logger.printInfo(() -> "Sanitized url: " + uri + " to: " + sanitizedUrl); + + return sanitizedUrl; + } catch (Exception ex) { + Logger.printException(() -> "sanitizeUri failure: " + uri, ex); + return uri; + } + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java index 944529f4e..fbc734a51 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/AppLanguage.java @@ -36,8 +36,8 @@ public enum AppLanguage { FR, GL, GU, - HI, HE, // App uses obsolete 'IW' and not the modern 'HE' ISO code. + HI, HR, HU, HY, @@ -60,9 +60,9 @@ public enum AppLanguage { MR, MS, MY, + NB, NE, NL, - NB, OR, PA, PL, diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index 1eff30361..3bc16e313 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -2,6 +2,7 @@ package app.revanced.extension.shared.settings; import static java.lang.Boolean.FALSE; import static java.lang.Boolean.TRUE; +import static app.revanced.extension.shared.patches.CustomBrandingPatch.BrandingTheme; import static app.revanced.extension.shared.settings.Setting.parent; import static app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.AudioStreamLanguageOverrideAvailability; @@ -40,4 +41,7 @@ public class BaseSettings { public static final BooleanSetting REPLACE_MUSIC_LINKS_WITH_YOUTUBE = new BooleanSetting("revanced_replace_music_with_youtube", FALSE); public static final BooleanSetting CHECK_WATCH_HISTORY_DOMAIN_NAME = new BooleanSetting("revanced_check_watch_history_domain_name", TRUE, false, false); + + public static final EnumSetting CUSTOM_BRANDING_ICON = new EnumSetting<>("revanced_custom_branding_icon", BrandingTheme.ORIGINAL, true); + public static final IntegerSetting CUSTOM_BRANDING_NAME = new IntegerSetting("revanced_custom_branding_name", 1, true); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ForceOriginalAudioSwitchPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ForceOriginalAudioSwitchPreference.java similarity index 87% rename from extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ForceOriginalAudioSwitchPreference.java rename to extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ForceOriginalAudioSwitchPreference.java index b6be1b893..fdcde3668 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ForceOriginalAudioSwitchPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ForceOriginalAudioSwitchPreference.java @@ -1,4 +1,4 @@ -package app.revanced.extension.youtube.settings.preference; +package app.revanced.extension.shared.settings.preference; import static app.revanced.extension.shared.StringRef.str; @@ -6,17 +6,17 @@ import android.content.Context; import android.preference.SwitchPreference; import android.util.AttributeSet; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.spoof.ClientType; import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch; -import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings({"deprecation", "unused"}) public class ForceOriginalAudioSwitchPreference extends SwitchPreference { // Spoof stream patch is not included, or is not currently spoofing to Android Studio. private static final boolean available = !SpoofVideoStreamsPatch.isPatchIncluded() - || !(Settings.SPOOF_VIDEO_STREAMS.get() - && Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_CREATOR); + || !(BaseSettings.SPOOF_VIDEO_STREAMS.get() + && SpoofVideoStreamsPatch.getPreferredClient() == ClientType.ANDROID_CREATOR); { if (!available) { diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java index be14e4a63..4f4d3ef92 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ReVancedAboutPreference.java @@ -5,6 +5,7 @@ import static app.revanced.extension.shared.Utils.dipToPixels; import static app.revanced.extension.shared.requests.Route.Method.GET; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; @@ -125,6 +126,8 @@ public class ReVancedAboutPreference extends Preference { { setOnPreferenceClickListener(pref -> { + Context context = pref.getContext(); + // Show a progress spinner if the social links are not fetched yet. if (!AboutLinksRoutes.hasFetchedLinks() && Utils.isNetworkConnected()) { // Show a progress spinner, but only if the api fetch takes more than a half a second. @@ -137,17 +140,18 @@ public class ReVancedAboutPreference extends Preference { handler.postDelayed(showDialogRunnable, delayToShowProgressSpinner); Utils.runOnBackgroundThread(() -> - fetchLinksAndShowDialog(handler, showDialogRunnable, progress)); + fetchLinksAndShowDialog(context, handler, showDialogRunnable, progress)); } else { // No network call required and can run now. - fetchLinksAndShowDialog(null, null, null); + fetchLinksAndShowDialog(context, null, null, null); } return false; }); } - private void fetchLinksAndShowDialog(@Nullable Handler handler, + private void fetchLinksAndShowDialog(Context context, + @Nullable Handler handler, Runnable showDialogRunnable, @Nullable ProgressDialog progress) { WebLink[] links = AboutLinksRoutes.fetchAboutLinks(); @@ -164,7 +168,17 @@ public class ReVancedAboutPreference extends Preference { if (handler != null) { handler.removeCallbacks(showDialogRunnable); } - if (progress != null) { + + // Don't continue if the activity is done. To test this tap the + // about dialog and immediately press back before the dialog can show. + if (context instanceof Activity activity) { + if (activity.isFinishing() || activity.isDestroyed()) { + Logger.printDebug(() -> "Not showing about dialog, activity is closed"); + return; + } + } + + if (progress != null && progress.isShowing()) { progress.dismiss(); } new WebViewDialog(getContext(), htmlDialog).show(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java index 96299facc..cfd79b972 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/ClientType.java @@ -31,6 +31,7 @@ public enum ClientType { "132.0.6808.3", "1.61.48", false, + false, "Android VR 1.61" ), /** @@ -50,6 +51,7 @@ public enum ClientType { "107.0.5284.2", "1.43.32", ANDROID_VR_1_61_48.useAuth, + ANDROID_VR_1_61_48.supportsMultiAudioTracks, "Android VR 1.43" ), /** @@ -69,6 +71,7 @@ public enum ClientType { "132.0.6779.0", "23.47.101", true, + false, "Android Studio" ), /** @@ -83,6 +86,7 @@ public enum ClientType { "0.1", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Safari/605.1.15", false, + false, "visionOS" ), /** @@ -107,6 +111,7 @@ public enum ClientType { "19.22.3", "com.google.ios.youtube/19.22.3 (iPad7,6; U; CPU iPadOS 17_7_10 like Mac OS X; " + Locale.getDefault() + ")", false, + true, "iPadOS" ); @@ -180,6 +185,11 @@ public enum ClientType { */ public final boolean useAuth; + /** + * If the client supports multiple audio tracks. + */ + public final boolean supportsMultiAudioTracks; + /** * Friendly name displayed in stats for nerds. */ @@ -200,6 +210,7 @@ public enum ClientType { @NonNull String cronetVersion, String clientVersion, boolean useAuth, + boolean supportsMultiAudioTracks, String friendlyName) { this.id = id; this.clientName = clientName; @@ -213,6 +224,7 @@ public enum ClientType { this.cronetVersion = cronetVersion; this.clientVersion = clientVersion; this.useAuth = useAuth; + this.supportsMultiAudioTracks = supportsMultiAudioTracks; this.friendlyName = friendlyName; Locale defaultLocale = Locale.getDefault(); @@ -238,6 +250,7 @@ public enum ClientType { String clientVersion, String userAgent, boolean useAuth, + boolean supportsMultiAudioTracks, String friendlyName) { this.id = id; this.clientName = clientName; @@ -248,6 +261,7 @@ public enum ClientType { this.clientVersion = clientVersion; this.userAgent = userAgent; this.useAuth = useAuth; + this.supportsMultiAudioTracks = supportsMultiAudioTracks; this.friendlyName = friendlyName; this.packageName = null; this.androidSdkVersion = null; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java index a5f69ba30..53664881b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/SpoofVideoStreamsPatch.java @@ -19,6 +19,14 @@ import app.revanced.extension.shared.spoof.requests.StreamingDataRequest; @SuppressWarnings("unused") public class SpoofVideoStreamsPatch { + + public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability { + @Override + public boolean isAvailable() { + return BaseSettings.SPOOF_VIDEO_STREAMS.get() && !preferredClient.useAuth; + } + } + /** * Domain used for internet connectivity verification. * It has an empty response body and is only used to check for a 204 response code. @@ -39,7 +47,7 @@ public class SpoofVideoStreamsPatch { @Nullable private static volatile AppLanguage languageOverride; - private static volatile ClientType preferredClient = ClientType.ANDROID_VR_1_61_48; + private static volatile ClientType preferredClient = ClientType.ANDROID_VR_1_43_32; /** * @return If this patch was included during patching. @@ -66,6 +74,10 @@ public class SpoofVideoStreamsPatch { StreamingDataRequest.setClientOrderToUse(availableClients, client); } + public static ClientType getPreferredClient() { + return preferredClient; + } + public static boolean spoofingToClientWithNoMultiAudioStreams() { return isPatchIncluded() && SPOOF_STREAMING_DATA @@ -317,11 +329,4 @@ public class SpoofVideoStreamsPatch { return videoFormat; } - - public static final class AudioStreamLanguageOverrideAvailability implements Setting.Availability { - @Override - public boolean isAvailable() { - return BaseSettings.SPOOF_VIDEO_STREAMS.get() && !preferredClient.useAuth; - } - } } diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java index 55b78933d..61cb977a2 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch.java @@ -1,18 +1,11 @@ package app.revanced.extension.spotify.misc.privacy; -import android.net.Uri; - -import java.util.List; - -import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.privacy.LinkSanitizer; @SuppressWarnings("unused") public final class SanitizeSharingLinksPatch { - /** - * Parameters that are considered undesirable and should be stripped away. - */ - private static final List SHARE_PARAMETERS_TO_REMOVE = List.of( + private static final LinkSanitizer sanitizer = new LinkSanitizer( "si", // Share tracking parameter. "utm_source" // Share source, such as "copy-link". ); @@ -20,25 +13,7 @@ public final class SanitizeSharingLinksPatch { /** * Injection point. */ - public static String sanitizeUrl(String url) { - try { - Uri uri = Uri.parse(url); - Uri.Builder builder = uri.buildUpon().clearQuery(); - - for (String paramName : uri.getQueryParameterNames()) { - if (!SHARE_PARAMETERS_TO_REMOVE.contains(paramName)) { - for (String value : uri.getQueryParameters(paramName)) { - builder.appendQueryParameter(paramName, value); - } - } - } - - String sanitizedUrl = builder.build().toString(); - Logger.printInfo(() -> "Sanitized url " + url + " to " + sanitizedUrl); - return sanitizedUrl; - } catch (Exception ex) { - Logger.printException(() -> "sanitizeUrl failure with " + url, ex); - return url; - } + public static String sanitizeSharingLink(String url) { + return sanitizer.sanitizeUrlString(url); } } diff --git a/extensions/twitter/build.gradle.kts b/extensions/twitter/build.gradle.kts index f3c06ad73..8cf6305c1 100644 --- a/extensions/twitter/build.gradle.kts +++ b/extensions/twitter/build.gradle.kts @@ -1 +1,3 @@ -// Do not remove. Necessary for the extension plugin to be applied to the project. +dependencies { + compileOnly(project(":extensions:shared:library")) +} diff --git a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java index ff67394c6..f4f4a107d 100644 --- a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java +++ b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java @@ -1,15 +1,22 @@ package app.revanced.twitter.patches.links; +@SuppressWarnings("unused") public final class ChangeLinkSharingDomainPatch { private static final String DOMAIN_NAME = "https://fxtwitter.com"; private static final String LINK_FORMAT = "%s/%s/status/%s"; + /** + * Injection point. + */ public static String formatResourceLink(Object... formatArgs) { String username = (String) formatArgs[0]; String tweetId = (String) formatArgs[1]; return String.format(LINK_FORMAT, DOMAIN_NAME, username, tweetId); } + /** + * Injection point. + */ public static String formatLink(long tweetId, String username) { return String.format(LINK_FORMAT, DOMAIN_NAME, username, tweetId); } diff --git a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/OpenLinksWithAppChooserPatch.java b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/OpenLinksWithAppChooserPatch.java index 62220506a..bd0476d8b 100644 --- a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/OpenLinksWithAppChooserPatch.java +++ b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/OpenLinksWithAppChooserPatch.java @@ -2,11 +2,18 @@ package app.revanced.twitter.patches.links; import android.content.Context; import android.content.Intent; -import android.util.Log; +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +@Deprecated(forRemoval = true) public final class OpenLinksWithAppChooserPatch { + + /** + * Injection point. + */ public static void openWithChooser(final Context context, final Intent intent) { - Log.d("ReVanced", "Opening intent with chooser: " + intent); + Logger.printInfo(() -> "Opening intent with chooser: " + intent); intent.setAction("android.intent.action.VIEW"); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ForceOriginalAudioPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ForceOriginalAudioPatch.java index 8836e7b32..ed65e7fba 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ForceOriginalAudioPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ForceOriginalAudioPatch.java @@ -1,72 +1,17 @@ package app.revanced.extension.youtube.patches; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.shared.settings.AppLanguage; -import app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class ForceOriginalAudioPatch { - private static final String DEFAULT_AUDIO_TRACKS_SUFFIX = ".4"; - /** * Injection point. */ - public static void setPreferredLanguage() { - if (Settings.FORCE_ORIGINAL_AUDIO.get() - && SpoofVideoStreamsPatch.spoofingToClientWithNoMultiAudioStreams() - && !Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get().useAuth) { - // If client spoofing does not use authentication and lacks multi-audio streams, - // then can use any language code for the request and if that requested language is - // not available YT uses the original audio language. Authenticated requests ignore - // the language code and always use the account language. Use a language that is - // not auto-dubbed by YouTube: https://support.google.com/youtube/answer/15569972 - // but the language is also supported natively by the Meta Quest device that - // Android VR is spoofing. - AppLanguage override = AppLanguage.SV; - Logger.printDebug(() -> "Setting language override: " + override); - SpoofVideoStreamsPatch.setLanguageOverride(override); - } - } - - /** - * Injection point. - */ - public static boolean ignoreDefaultAudioStream(boolean original) { - if (Settings.FORCE_ORIGINAL_AUDIO.get()) { - return false; - } - return original; - } - - /** - * Injection point. - */ - public static boolean isDefaultAudioStream(boolean isDefault, String audioTrackId, String audioTrackDisplayName) { - try { - if (!Settings.FORCE_ORIGINAL_AUDIO.get()) { - return isDefault; - } - - if (audioTrackId.isEmpty()) { - // Older app targets can have empty audio tracks and these might be placeholders. - // The real audio tracks are called after these. - return isDefault; - } - - Logger.printDebug(() -> "default: " + String.format("%-5s", isDefault) + " id: " - + String.format("%-8s", audioTrackId) + " name:" + audioTrackDisplayName); - - final boolean isOriginal = audioTrackId.endsWith(DEFAULT_AUDIO_TRACKS_SUFFIX); - if (isOriginal) { - Logger.printDebug(() -> "Using audio: " + audioTrackId); - } - - return isOriginal; - } catch (Exception ex) { - Logger.printException(() -> "isDefaultAudioStream failure", ex); - return isDefault; - } + public static void setEnabled() { + app.revanced.extension.shared.patches.ForceOriginalAudioPatch.setEnabled( + Settings.FORCE_ORIGINAL_AUDIO.get(), + Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() + ); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java new file mode 100644 index 000000000..03668aa73 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenCardsPatch.java @@ -0,0 +1,24 @@ +package app.revanced.extension.youtube.patches; + +import android.view.View; + +import app.revanced.extension.shared.Utils; +import app.revanced.extension.youtube.settings.Settings; + +@SuppressWarnings("unused") +public class HideEndScreenCardsPatch { + + /** + * Injection point. + */ + public static void hideEndScreenCardView(View view) { + Utils.hideViewUnderCondition(Settings.HIDE_ENDSCREEN_CARDS, view); + } + + /** + * Injection point. + */ + public static boolean hideEndScreenCards() { + return Settings.HIDE_ENDSCREEN_CARDS.get(); + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java deleted file mode 100644 index 89261d119..000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java +++ /dev/null @@ -1,14 +0,0 @@ -package app.revanced.extension.youtube.patches; - -import android.view.View; - -import app.revanced.extension.youtube.settings.Settings; - -@SuppressWarnings("unused") -public class HideEndscreenCardsPatch { - //Used by app.revanced.patches.youtube.layout.hideendscreencards.bytecode.patch.HideEndscreenCardsPatch - public static void hideEndscreen(View view) { - if (!Settings.HIDE_ENDSCREEN_CARDS.get()) return; - view.setVisibility(View.GONE); - } -} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index dbd1ad8d4..f7c0bee2d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -131,11 +131,11 @@ public class ReturnYouTubeDislikePatch { String conversionContextString = conversionContext.toString(); - if (isRollingNumber && !conversionContextString.contains("video_action_bar.eml")) { + if (isRollingNumber && !conversionContextString.contains("video_action_bar.e")) { return original; } - if (conversionContextString.contains("segmented_like_dislike_button.eml")) { + if (conversionContextString.contains("segmented_like_dislike_button.e")) { // Regular video. ReturnYouTubeDislike videoData = currentVideoData; if (videoData == null) { @@ -153,12 +153,12 @@ public class ReturnYouTubeDislikePatch { } if (Utils.containsAny(conversionContextString, - "|shorts_dislike_button.eml", "|reel_dislike_button.eml")) { + "|shorts_dislike_button.e", "|reel_dislike_button.e")) { return getShortsSpan(original, true); } if (Utils.containsAny(conversionContextString, - "|shorts_like_button.eml", "|reel_like_button.eml")) { + "|shorts_like_button.e", "|reel_like_button.e")) { if (!Utils.containsNumber(original)) { Logger.printDebug(() -> "Replacing hidden likes count"); return getShortsSpan(original, false); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java index cb604c57b..01f82f5cf 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdsFilter.java @@ -105,17 +105,17 @@ public final class AdsFilter extends Filter { Settings.HIDE_VIEW_PRODUCTS_BANNER, "product_item", "products_in_video", - "shopping_overlay.eml" // Video player overlay shopping links. + "shopping_overlay.e" // Video player overlay shopping links. ); final var shoppingLinks = new StringFilterGroup( Settings.HIDE_SHOPPING_LINKS, - "shopping_description_shelf.eml" + "shopping_description_shelf.e" ); playerShoppingShelf = new StringFilterGroup( Settings.HIDE_CREATOR_STORE_SHELF, - "horizontal_shelf.eml" + "horizontal_shelf.e" ); playerShoppingShelfBuffer = new ByteArrayFilterGroup( @@ -131,7 +131,7 @@ public final class AdsFilter extends Filter { final var merchandise = new StringFilterGroup( Settings.HIDE_MERCHANDISE_BANNERS, "product_carousel", - "shopping_carousel.eml" // Channel profile shopping shelf. + "shopping_carousel.e" // Channel profile shopping shelf. ); final var selfSponsor = new StringFilterGroup( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java index fb64dd81d..d2bbad012 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/AdvancedVideoQualityMenuFilter.java @@ -14,7 +14,7 @@ public final class AdvancedVideoQualityMenuFilter extends Filter { public AdvancedVideoQualityMenuFilter() { addPathCallbacks(new StringFilterGroup( Settings.ADVANCED_VIDEO_QUALITY_MENU, - "quick_quality_sheet_content.eml-js" + "quick_quality_sheet_content.e" )); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java index 12775ed5f..3ca59ea0b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java @@ -4,13 +4,13 @@ import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") final class ButtonsFilter extends Filter { - private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.eml"; - private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.eml"; - private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.eml"; + private static final String COMPACT_CHANNEL_BAR_PATH_PREFIX = "compact_channel_bar.e"; + private static final String VIDEO_ACTION_BAR_PATH_PREFIX = "video_action_bar.e"; + private static final String VIDEO_ACTION_BAR_PATH = "video_action_bar.e"; /** * Video bar path when the video information is collapsed. Seems to shown only with 20.14+ */ - private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.eml"; + private static final String COMPACTIFY_VIDEO_ACTION_BAR_PATH = "compactify_video_action_bar.e"; private static final String ANIMATED_VECTOR_TYPE_PATH = "AnimatedVectorType"; private final StringFilterGroup likeSubscribeGlow; @@ -28,12 +28,12 @@ final class ButtonsFilter extends Filter { likeSubscribeGlow = new StringFilterGroup( Settings.DISABLE_LIKE_SUBSCRIBE_GLOW, - "animated_button_border.eml" + "animated_button_border.e" ); bufferFilterPathGroup = new StringFilterGroup( null, - "|ContainerType|button.eml" + "|ContainerType|button.e" ); addPathCallbacks( @@ -45,7 +45,7 @@ final class ButtonsFilter extends Filter { ), new StringFilterGroup( Settings.HIDE_DOWNLOAD_BUTTON, - "|download_button.eml" + "|download_button.e" ), new StringFilterGroup( Settings.HIDE_SAVE_BUTTON, @@ -53,7 +53,7 @@ final class ButtonsFilter extends Filter { ), new StringFilterGroup( Settings.HIDE_CLIP_BUTTON, - "|clip_button.eml" + "|clip_button.e" ) ); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java index 6264b2ab2..2af8d1a90 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/CommentsFilter.java @@ -6,7 +6,7 @@ import app.revanced.extension.youtube.shared.PlayerType; @SuppressWarnings("unused") final class CommentsFilter extends Filter { - private static final String COMMENT_COMPOSER_PATH = "comment_composer.eml"; + private static final String COMMENT_COMPOSER_PATH = "comment_composer.e"; private final StringFilterGroup chipBar; private final ByteArrayFilterGroup aiCommentsSummary; @@ -15,12 +15,12 @@ final class CommentsFilter extends Filter { public CommentsFilter() { var chatSummary = new StringFilterGroup( Settings.HIDE_COMMENTS_AI_CHAT_SUMMARY, - "live_chat_summary_banner.eml" + "live_chat_summary_banner.e" ); chipBar = new StringFilterGroup( Settings.HIDE_COMMENTS_AI_SUMMARY, - "chip_bar.eml" + "chip_bar.e" ); aiCommentsSummary = new ByteArrayFilterGroup( @@ -35,8 +35,8 @@ final class CommentsFilter extends Filter { var commentsByMembers = new StringFilterGroup( Settings.HIDE_COMMENTS_BY_MEMBERS_HEADER, - "sponsorships_comments_header.eml", - "sponsorships_comments_footer.eml" + "sponsorships_comments_header.e", + "sponsorships_comments_footer.e" ); var comments = new StringFilterGroup( @@ -52,7 +52,7 @@ final class CommentsFilter extends Filter { var createAShort = new StringFilterGroup( Settings.HIDE_COMMENTS_CREATE_A_SHORT_BUTTON, - "composer_short_creation_button.eml" + "composer_short_creation_button.e" ); emojiAndTimestampButtons = new StringFilterGroup( @@ -69,7 +69,7 @@ final class CommentsFilter extends Filter { var thanksButton = new StringFilterGroup( Settings.HIDE_COMMENTS_THANKS_BUTTON, - "super_thanks_button.eml" + "super_thanks_button.e" ); addPathCallbacks( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java index 5c0870cde..0d727bcfd 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/DescriptionComponentsFilter.java @@ -29,12 +29,12 @@ final class DescriptionComponentsFilter extends Filter { aiGeneratedVideoSummarySection = new StringFilterGroup( Settings.HIDE_AI_GENERATED_VIDEO_SUMMARY_SECTION, - "cell_expandable_metadata.eml" + "cell_expandable_metadata.e" ); final StringFilterGroup askSection = new StringFilterGroup( Settings.HIDE_ASK_SECTION, - "youchat_entrypoint.eml" + "youchat_entrypoint.e" ); final StringFilterGroup attributesSection = new StringFilterGroup( @@ -65,7 +65,7 @@ final class DescriptionComponentsFilter extends Filter { macroMarkersCarousel = new StringFilterGroup( null, - "macro_markers_carousel.eml" + "macro_markers_carousel.e" ); macroMarkersCarouselGroupList.addAll( @@ -81,7 +81,7 @@ final class DescriptionComponentsFilter extends Filter { horizontalShelf = new StringFilterGroup( Settings.HIDE_ATTRIBUTES_SECTION, - "horizontal_shelf.eml" + "horizontal_shelf.e" ); cellVideoAttribute = new ByteArrayFilterGroup( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java index 3c4c33d16..ca88f834f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilter.java @@ -9,7 +9,7 @@ public final class HideInfoCardsFilter extends Filter { addIdentifierCallbacks( new StringFilterGroup( Settings.HIDE_INFO_CARDS, - "info_card_teaser_overlay.eml" + "info_card_teaser_overlay.e" ) ); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java index eecf17766..8f9d99b6e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/KeywordContentFilter.java @@ -79,10 +79,10 @@ final class KeywordContentFilter extends Filter { "search_vwc_description_transition_key", "g-high-recZ", // Text and litho components found in the buffer that belong to path filters. - "expandable_metadata.eml", - "thumbnail.eml", - "avatar.eml", - "overflow_button.eml", + "expandable_metadata.e", + "thumbnail.e", + "avatar.e", + "overflow_button.e", "shorts-lockup-image", "shorts-lockup.overlay-metadata.secondary-text", "YouTubeSans-SemiBold", @@ -94,16 +94,16 @@ final class KeywordContentFilter extends Filter { */ private final StringFilterGroup startsWithFilter = new StringFilterGroup( null, // Multiple settings are used and must be individually checked if active. - "home_video_with_context.eml", - "search_video_with_context.eml", - "video_with_context.eml", // Subscription tab videos. - "related_video_with_context.eml", + "home_video_with_context.e", + "search_video_with_context.e", + "video_with_context.e", // Subscription tab videos. + "related_video_with_context.e", // A/B test for subscribed video, and sometimes when tablet layout is enabled. - "video_lockup_with_attachment.eml", - "compact_video.eml", + "video_lockup_with_attachment.e", + "compact_video.e", "inline_shorts", "shorts_video_cell", - "shorts_pivot_item.eml" + "shorts_pivot_item.e" ); /** @@ -112,9 +112,9 @@ final class KeywordContentFilter extends Filter { @SuppressWarnings("FieldCanBeLocal") private final StringFilterGroup containsFilter = new StringFilterGroup( null, - "modern_type_shelf_header_content.eml", - "shorts_lockup_cell.eml", // Part of 'shorts_shelf_carousel.eml' - "video_card.eml" // Shorts that appear in a horizontal shelf. + "modern_type_shelf_header_content.e", + "shorts_lockup_cell.e", // Part of 'shorts_shelf_carousel.e' + "video_card.e" // Shorts that appear in a horizontal shelf. ); /** @@ -125,10 +125,10 @@ final class KeywordContentFilter extends Filter { * the buffer of the parent component was already searched and passed. */ private final StringTrieSearch exceptions = new StringTrieSearch( - "metadata.eml", - "thumbnail.eml", - "avatar.eml", - "overflow_button.eml" + "metadata.e", + "thumbnail.e", + "avatar.e", + "overflow_button.e" ); /** diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java index 852e55f94..9b1aa94dc 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java @@ -76,18 +76,18 @@ public final class LayoutComponentsFilter extends Filter { communityPosts = new StringFilterGroup( Settings.HIDE_COMMUNITY_POSTS, "post_base_wrapper", // may be obsolete and no longer needed. - "text_post_root.eml", - "images_post_root.eml", - "images_post_slim.eml", // may be obsolete and no longer needed. - "images_post_root_slim.eml", - "text_post_root_slim.eml", - "post_base_wrapper_slim.eml", - "poll_post_root.eml", - "videos_post_root.eml", - "post_shelf_slim.eml", - "videos_post_responsive_root.eml", - "text_post_responsive_root.eml", - "poll_post_responsive_root.eml" + "text_post_root.e", + "images_post_root.e", + "images_post_slim.e", // may be obsolete and no longer needed. + "images_post_root_slim.e", + "text_post_root_slim.e", + "post_base_wrapper_slim.e", + "poll_post_root.e", + "videos_post_root.e", + "post_shelf_slim.e", + "videos_post_responsive_root.e", + "text_post_responsive_root.e", + "poll_post_responsive_root.e" ); final var subscribersCommunityGuidelines = new StringFilterGroup( @@ -149,7 +149,7 @@ public final class LayoutComponentsFilter extends Filter { final var channelLinksPreview = new StringFilterGroup( Settings.HIDE_LINKS_PREVIEW, - "attribution.eml" + "attribution.e" ); final var emergencyBox = new StringFilterGroup( @@ -190,8 +190,8 @@ public final class LayoutComponentsFilter extends Filter { final var playables = new StringFilterGroup( Settings.HIDE_PLAYABLES, - "horizontal_gaming_shelf.eml", - "mini_game_card.eml" + "horizontal_gaming_shelf.e", + "mini_game_card.e" ); // Playable horizontal shelf header. @@ -228,7 +228,7 @@ public final class LayoutComponentsFilter extends Filter { compactChannelBarInnerButton = new StringFilterGroup( null, - "|button.eml" + "|button.e" ); joinMembershipButton = new ByteArrayFilterGroup( @@ -248,13 +248,13 @@ public final class LayoutComponentsFilter extends Filter { final var videoRecommendationLabels = new StringFilterGroup( Settings.HIDE_VIDEO_RECOMMENDATION_LABELS, - "endorsement_header_footer.eml" + "endorsement_header_footer.e" ); channelProfile = new StringFilterGroup( null, - "channel_profile.eml", - "page_header.eml" + "channel_profile.e", + "page_header.e" ); channelProfileBuffer = new ByteArrayFilterGroupList(); channelProfileBuffer.addAll(new ByteArrayFilterGroup( @@ -269,15 +269,15 @@ public final class LayoutComponentsFilter extends Filter { horizontalShelves = new StringFilterGroup( Settings.HIDE_HORIZONTAL_SHELVES, - "horizontal_video_shelf.eml", - "horizontal_shelf.eml", - "horizontal_shelf_inline.eml", - "horizontal_tile_shelf.eml" + "horizontal_video_shelf.e", + "horizontal_shelf.e", + "horizontal_shelf_inline.e", + "horizontal_tile_shelf.e" ); ticketShelf = new ByteArrayFilterGroup( Settings.HIDE_TICKET_SHELF, - "ticket_item.eml" + "ticket_item.e" ); addPathCallbacks( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java index fc2b78ceb..d33dae8f2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter.java @@ -24,13 +24,13 @@ public final class PlaybackSpeedMenuFilter extends Filter { // 0.05x litho speed menu. var playbackRateSelectorGroup = new StringFilterGroup( Settings.CUSTOM_SPEED_MENU, - "playback_rate_selector_menu_sheet.eml-js" + "playback_rate_selector_menu_sheet.e" ); // Old litho based speed menu. oldPlaybackMenuGroup = new StringFilterGroup( Settings.CUSTOM_SPEED_MENU, - "playback_speed_sheet_content.eml-js"); + "playback_speed_sheet_content.e"); addPathCallbacks(playbackRateSelectorGroup, oldPlaybackMenuGroup); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java index 0cdf7b873..1323f4057 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlayerFlyoutMenuItemsFilter.java @@ -38,7 +38,7 @@ public class PlayerFlyoutMenuItemsFilter extends Filter { addPathCallbacks( videoQualityMenuFooter, - new StringFilterGroup(null, "overflow_menu_item.eml") + new StringFilterGroup(null, "overflow_menu_item.e") ); flyoutFilterGroupList.addAll( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java index 49a623b84..58e3af5e6 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java @@ -72,8 +72,8 @@ public final class ReturnYouTubeDislikeFilter extends Filter { // But if swiping back to a previous video and liking/disliking, then only that single button reloads. // So must check for both buttons. addPathCallbacks( - new StringFilterGroup(null, "|shorts_like_button.eml"), - new StringFilterGroup(null, "|shorts_dislike_button.eml") + new StringFilterGroup(null, "|shorts_like_button.e"), + new StringFilterGroup(null, "|shorts_dislike_button.e") ); // After the button identifiers is binary data and then the video id for that specific short. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index 57e996f14..f41f1e3a3 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -18,12 +18,12 @@ import app.revanced.extension.youtube.shared.PlayerType; @SuppressWarnings("unused") public final class ShortsFilter extends Filter { private static final boolean HIDE_SHORTS_NAVIGATION_BAR = Settings.HIDE_SHORTS_NAVIGATION_BAR.get(); - private static final String REEL_CHANNEL_BAR_PATH = "reel_channel_bar.eml"; + private static final String REEL_CHANNEL_BAR_PATH = "reel_channel_bar.e"; /** * For paid promotion label and subscribe button that appears in the channel bar. */ - private static final String REEL_METAPANEL_PATH = "reel_metapanel.eml"; + private static final String REEL_METAPANEL_PATH = "reel_metapanel.e"; /** * Tags that appears when opening the Shorts player. @@ -74,7 +74,7 @@ public final class ShortsFilter extends Filter { // Use a different filter group for this pattern, as it requires an additional check after matching. shelfHeader = new StringFilterGroup( null, - "shelf_header.eml" + "shelf_header.e" ); addIdentifierCallbacks(shortsIdentifiers, shelfHeader); @@ -85,11 +85,11 @@ public final class ShortsFilter extends Filter { shortsCompactFeedVideo = new StringFilterGroup(null, // Shorts that appear in the feed/search when the device is using tablet layout. - "compact_video.eml", - // 'video_lockup_with_attachment.eml' is shown instead of 'compact_video.eml' for some users - "video_lockup_with_attachment.eml", + "compact_video.e", + // 'video_lockup_with_attachment.e' is shown instead of 'compact_video.e' for some users + "video_lockup_with_attachment.e", // Search results that appear in a horizontal shelf. - "video_card.eml"); + "video_card.e"); // Filter out items that use the 'frame0' thumbnail. // This is a valid thumbnail for both regular videos and Shorts, @@ -134,31 +134,31 @@ public final class ShortsFilter extends Filter { StringFilterGroup stickers = new StringFilterGroup( Settings.HIDE_SHORTS_STICKERS, - "stickers_layer.eml" + "stickers_layer.e" ); StringFilterGroup likeFountain = new StringFilterGroup( Settings.HIDE_SHORTS_LIKE_FOUNTAIN, - "like_fountain.eml" + "like_fountain.e" ); StringFilterGroup likeButton = new StringFilterGroup( Settings.HIDE_SHORTS_LIKE_BUTTON, - "shorts_like_button.eml", - "reel_like_button.eml" + "shorts_like_button.e", + "reel_like_button.e" ); StringFilterGroup dislikeButton = new StringFilterGroup( Settings.HIDE_SHORTS_DISLIKE_BUTTON, - "shorts_dislike_button.eml", - "reel_dislike_button.eml" + "shorts_dislike_button.e", + "reel_dislike_button.e" ); StringFilterGroup previewComment = new StringFilterGroup( Settings.HIDE_SHORTS_PREVIEW_COMMENT, // Preview comment that can popup while a Short is playing. // Uses no bundled icons, and instead the users profile photo is shown. - "participation_bar.eml" + "participation_bar.e" ); joinButton = new StringFilterGroup( @@ -173,20 +173,20 @@ public final class ShortsFilter extends Filter { paidPromotionButton = new StringFilterGroup( Settings.HIDE_PAID_PROMOTION_LABEL, - "reel_player_disclosure.eml" + "reel_player_disclosure.e" ); shortsActionBar = new StringFilterGroup( null, - "shorts_action_bar.eml", - "reel_action_bar.eml" + "shorts_action_bar.e", + "reel_action_bar.e" ); useSoundButton = new StringFilterGroup( Settings.HIDE_SHORTS_USE_SOUND_BUTTON, // First filter needed for "Use this sound" that can appear when viewing Shorts // through the "Short remixing this video" section. - "floating_action_button.eml", + "floating_action_button.e", // Second filter needed for "Use this sound" that can appear below the video title. REEL_METAPANEL_PATH ); @@ -209,13 +209,13 @@ public final class ShortsFilter extends Filter { videoActionButton = new StringFilterGroup( null, - // Can be simply 'button.eml', 'shorts_video_action_button.eml' or 'reel_action_button.eml' - "button.eml" + // Can be simply 'button.e', 'shorts_video_action_button.e' or 'reel_action_button.e' + "button.e" ); suggestedAction = new StringFilterGroup( null, - "suggested_action.eml" + "suggested_action.e" ); addPathCallbacks( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java index da200ef67..ef8069e85 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch.java @@ -8,38 +8,40 @@ import static app.revanced.extension.shared.spoof.ClientType.VISIONOS; import java.util.List; +import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.spoof.ClientType; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") public class SpoofVideoStreamsPatch { + public static final class SpoofClientAv1Availability implements Setting.Availability { + @Override + public boolean isAvailable() { + return Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.isAvailable() + && Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ANDROID_VR_1_43_32; + } + } + /** * Injection point. */ public static void setClientOrderToUse() { - final boolean forceAVC = Settings.FORCE_AVC_CODEC.get(); - - // VR 1.61 uses VP9/AV1, and cannot force AVC. ClientType client = Settings.SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get(); - if (forceAVC && client == ANDROID_VR_1_61_48) { - client = ANDROID_VR_1_43_32; // Use VR 1.43 instead. + + // Use VR 1.61 client that has AV1 if user settings allow it. + // AVC cannot be forced with VR 1.61 because it uses VP9 and AV1. + // If both settings are on, then force AVC takes priority and VR 1.43 is used. + if (client == ANDROID_VR_1_43_32 && Settings.SPOOF_VIDEO_STREAMS_AV1.get() + && !Settings.FORCE_AVC_CODEC.get()) { + client = ANDROID_VR_1_61_48; } - List availableClients = forceAVC - ? List.of( - ANDROID_VR_1_43_32, - VISIONOS, - ANDROID_CREATOR, - ANDROID_VR_1_61_48, - IPADOS) - : List.of( - ANDROID_VR_1_61_48, - VISIONOS, + List availableClients = List.of( ANDROID_CREATOR, ANDROID_VR_1_43_32, - IPADOS - ); + VISIONOS, + IPADOS); app.revanced.extension.shared.spoof.SpoofVideoStreamsPatch.setClientsToUse( availableClients, client); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 17937a660..747a4f048 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -21,6 +21,7 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerT import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType; import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability; import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability; +import static app.revanced.extension.youtube.patches.spoof.SpoofVideoStreamsPatch.SpoofClientAv1Availability; import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle; import static app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController.SponsorBlockDuration; import static app.revanced.extension.youtube.sponsorblock.objects.CategoryBehaviour.IGNORE; @@ -55,6 +56,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting ADVANCED_VIDEO_QUALITY_MENU = new BooleanSetting("revanced_advanced_video_quality_menu", TRUE); public static final BooleanSetting DISABLE_HDR_VIDEO = new BooleanSetting("revanced_disable_hdr_video", FALSE); public static final BooleanSetting FORCE_AVC_CODEC = new BooleanSetting("revanced_force_avc_codec", FALSE, true, "revanced_force_avc_codec_user_dialog_message"); + public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", TRUE, true); public static final IntegerSetting VIDEO_QUALITY_DEFAULT_WIFI = new IntegerSetting("revanced_video_quality_default_wifi", -2); public static final IntegerSetting VIDEO_QUALITY_DEFAULT_MOBILE = new IntegerSetting("revanced_video_quality_default_mobile", -2); public static final BooleanSetting REMEMBER_VIDEO_QUALITY_LAST_SELECTED = new BooleanSetting("revanced_remember_video_quality_last_selected", FALSE); @@ -75,9 +77,6 @@ public class Settings extends BaseSettings { public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds", "0.25\n0.5\n0.75\n1.0\n1.25\n1.5\n1.75\n2.0\n2.5\n3.0\n4.0\n5.0\n6.0\n7.0\n8.0", true); - // Audio - public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", FALSE, true); - // Ads public static final BooleanSetting HIDE_CREATOR_STORE_SHELF = new BooleanSetting("revanced_hide_creator_store_shelf", TRUE); public static final BooleanSetting HIDE_END_SCREEN_STORE_BANNER = new BooleanSetting("revanced_hide_end_screen_store_banner", TRUE, true); @@ -358,7 +357,9 @@ public class Settings extends BaseSettings { public static final BooleanSetting EXTERNAL_BROWSER = new BooleanSetting("revanced_external_browser", TRUE, true); public static final BooleanSetting SPOOF_DEVICE_DIMENSIONS = new BooleanSetting("revanced_spoof_device_dimensions", FALSE, true, "revanced_spoof_device_dimensions_user_dialog_message"); - public static final EnumSetting SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_61_48, true, parent(SPOOF_VIDEO_STREAMS)); + public static final EnumSetting SPOOF_VIDEO_STREAMS_CLIENT_TYPE = new EnumSetting<>("revanced_spoof_video_streams_client_type", ClientType.ANDROID_VR_1_43_32, true, parent(SPOOF_VIDEO_STREAMS)); + public static final BooleanSetting SPOOF_VIDEO_STREAMS_AV1 = new BooleanSetting("revanced_spoof_video_streams_av1", FALSE, true, + "revanced_spoof_video_streams_av1_user_dialog_message", new SpoofClientAv1Availability()); public static final BooleanSetting DEBUG_PROTOBUFFER = new BooleanSetting("revanced_debug_protobuffer", FALSE, false, "revanced_debug_protobuffer_user_dialog_message", parent(BaseSettings.DEBUG)); @@ -526,6 +527,11 @@ public class Settings extends BaseSettings { SPOOF_APP_VERSION.resetToDefault(); } + // VR 1.61 is not selectable in the settings, and it's selected by spoof stream patch if needed. + if (SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_1_61_48) { + SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault(); + } + // RYD requires manually migrating old settings since the lack of // a "revanced_" on the old setting causes duplicate key exceptions during export. SharedPrefCategory revancedPrefs = Setting.preferences; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java index 9dee0b0c5..bf66edbd4 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/SpoofStreamingDataSideEffectsPreference.java @@ -83,12 +83,13 @@ public class SpoofStreamingDataSideEffectsPreference extends Preference { String summary = str("revanced_spoof_video_streams_about_no_audio_tracks"); switch (clientType) { - case ANDROID_VR_1_61_48 -> - summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume"); case ANDROID_CREATOR -> - summary += '\n' + str("revanced_spoof_video_streams_about_no_av1") - + '\n' + str("revanced_spoof_video_streams_about_no_stable_volume") - + '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio"); + summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume") + + '\n' + str("revanced_spoof_video_streams_about_no_av1") + + '\n' + str("revanced_spoof_video_streams_about_no_force_original_audio"); + // VR 1.61 is not exposed in the UI and should never be reached here. + case ANDROID_VR_1_43_32, ANDROID_VR_1_61_48 -> + summary += '\n' + str("revanced_spoof_video_streams_about_no_stable_volume"); case IPADOS -> summary = str("revanced_spoof_video_streams_about_playback_failure") + '\n' + str("revanced_spoof_video_streams_about_no_av1"); diff --git a/gradle.properties b/gradle.properties index 428798762..d5e85d1ad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.41.0 +version = 5.42.0-dev.19 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f55818425..b3d9a0a35 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ annotation = "1.9.1" appcompat = "1.7.0" okhttp = "5.0.0-alpha.14" retrofit = "2.11.0" -guava = "33.4.0-jre" +guava = "33.5.0-jre" protobuf-javalite = "4.32.0" protoc = "4.32.0" protobuf = "0.9.5" diff --git a/package-lock.json b/package-lock.json index 0637b7a45..537a7a4fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "gradle-semantic-release-plugin": "^1.10.1", - "semantic-release": "^24.2.7" + "semantic-release": "^24.2.9" } }, "node_modules/@babel/code-frame": { @@ -6889,9 +6889,9 @@ "license": "MIT" }, "node_modules/semantic-release": { - "version": "24.2.7", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.7.tgz", - "integrity": "sha512-g7RssbTAbir1k/S7uSwSVZFfFXwpomUB9Oas0+xi9KStSCmeDXcA7rNhiskjLqvUe/Evhx8fVCT16OSa34eM5g==", + "version": "24.2.9", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.9.tgz", + "integrity": "sha512-phCkJ6pjDi9ANdhuF5ElS10GGdAKY6R1Pvt9lT3SFhOwM4T7QZE7MLpBDbNruUx/Q3gFD92/UOFringGipRqZA==", "dev": true, "license": "MIT", "dependencies": { @@ -6909,7 +6909,7 @@ "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", - "hook-std": "^3.0.0", + "hook-std": "^4.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", @@ -6921,7 +6921,7 @@ "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", - "semver-diff": "^4.0.0", + "semver-diff": "^5.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, @@ -7045,6 +7045,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/hook-std": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", + "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/human-signals": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", @@ -7138,6 +7151,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semantic-release/node_modules/semver-diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-5.0.0.tgz", + "integrity": "sha512-0HbGtOm+S7T6NGQ/pxJSJipJvc4DK3FcRVMRkhsIwJDJ4Jcz5DQC1cPPzB5GhzyHjwttW878HaWQq46CkL3cqg==", + "deprecated": "Deprecated as the semver package now supports this built-in.", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/semantic-release/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", diff --git a/package.json b/package.json index 4ce37d34e..b38c0f0b8 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,6 @@ "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "gradle-semantic-release-plugin": "^1.10.1", - "semantic-release": "^24.2.7" + "semantic-release": "^24.2.9" } } diff --git a/patches/api/patches.api b/patches/api/patches.api index 7ac39ad52..15b955acb 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -280,10 +280,26 @@ public final class app/revanced/patches/instagram/hide/stories/HideStoriesKt { public static final fun getHideStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatchKt { + public static final fun getEnableDeveloperMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/instagram/misc/extension/SharedExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatchKt { + public static final fun getOpenLinksExternallyPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatchKt { + public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatchKt { + public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt { public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -372,6 +388,10 @@ public final class app/revanced/patches/music/interaction/permanentshuffle/Perma public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/music/layout/branding/CustomBrandingPatchKt { + public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; +} + public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt { public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -451,9 +471,14 @@ public final class app/revanced/patches/music/misc/spoof/UserAgentClientSpoofPat public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatchKt { + public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun is_7_33_or_greater ()Z + public static final fun is_8_10_or_greater ()Z public static final fun is_8_11_or_greater ()Z public static final fun is_8_15_or_greater ()Z } @@ -997,11 +1022,6 @@ public final class app/revanced/patches/shared/misc/settings/preference/TextPref public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } -public final class app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatchKt { - public static final fun spoofVideoStreamsPatch (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; - public static synthetic fun spoofVideoStreamsPatch$default (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatchKt { public static final fun userAgentClientSpoofPatch (Ljava/lang/String;)Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1306,6 +1326,10 @@ public final class app/revanced/patches/viber/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/viber/misc/navbar/HideNavigationButtonsKt { + public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1407,8 +1431,8 @@ public final class app/revanced/patches/youtube/layout/formfactor/ChangeFormFact public static final fun getChangeFormFactorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatchKt { - public static final fun getHideEndscreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +public final class app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatchKt { + public static final fun getHideEndScreenCardsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatchKt { @@ -1895,6 +1919,7 @@ public final class app/revanced/util/ResourceUtilsKt { public static final fun forEachChildElement (Lorg/w3c/dom/Node;Lkotlin/jvm/functions/Function1;)V public static final fun insertFirst (Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V public static final fun iterateXmlNodeChildren (Lapp/revanced/patcher/patch/ResourcePatchContext;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V + public static final fun removeFromParent (Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node; } public final class app/revanced/util/resource/ArrayResource : app/revanced/util/resource/BaseResource { diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt index e2b7b0616..c5ce1efe1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/RootDetectionPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.finanzonline.detection.root import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION @Suppress("unused") val rootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION, ) { compatibleWith("at.gv.bmf.bmf2go") diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt index 6c79650d9..07874bac7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt @@ -1,12 +1,14 @@ package app.revanced.patches.idaustria.detection.root import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION import app.revanced.util.returnEarly @Suppress("unused") val rootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions and unlocked bootloader.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION ) { compatibleWith("at.gv.oe.app") diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt index 4ada34d27..9add580bc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt @@ -3,6 +3,7 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.findFreeRegister import app.revanced.util.getReference @@ -24,6 +25,8 @@ val hideNavigationButtonsPatch = bytecodePatch( ) { compatibleWith("com.instagram.android") + dependsOn(sharedExtensionPatch) + val hideReels by booleanOption( key = "hideReels", default = true, @@ -69,20 +72,22 @@ val hideNavigationButtonsPatch = bytecodePatch( const-string v$freeRegister2, "$enumNameField" invoke-static { v$buttonsListRegister, v$freeRegister, v$freeRegister2 }, $EXTENSION_CLASS_DESCRIPTOR->removeNavigationButtonByName(Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; move-result-object v$buttonsListRegister - """ + """ } - if (hideReels!!) + if (hideReels!!) { addInstructionsAtControlFlowLabel( returnIndex, instructionsRemoveButtonByName("fragment_clips") ) + } - if (hideCreate!!) + if (hideCreate!!) { addInstructionsAtControlFlowLabel( returnIndex, instructionsRemoveButtonByName("fragment_share") ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt new file mode 100644 index 000000000..4f594478d --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt @@ -0,0 +1,37 @@ +package app.revanced.patches.instagram.misc.devmenu + +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +@Suppress("unused") +val enableDeveloperMenuPatch = bytecodePatch( + name = "Enable developer menu", + description = """ + Enables the developer menu, which can be found at the bottom of settings menu with name 'Internal Settings'. + + It is recommended to use this patch with an alpha/beta Instagram release. Patching a stable release works, but the developer menu shows the developer flags as numbers and does not show a human readable description. + """.trimIndentMultiline(), + use = false +) { + compatibleWith("com.instagram.android") + + execute { + with(clearNotificationReceiverFingerprint.method) { + indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverFingerprint.stringMatches!!.first().index) { + val reference = getReference() + Opcode.INVOKE_STATIC == opcode && + reference?.parameterTypes?.size == 1 && + reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && + reference.returnType == "Z" + }.let { index -> + navigate(this).to(index).stop().returnEarly(true) + } + } + } +} + diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt new file mode 100644 index 000000000..8b84606f0 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt @@ -0,0 +1,12 @@ + +package app.revanced.patches.instagram.misc.devmenu + +import app.revanced.patcher.fingerprint + +internal val clearNotificationReceiverFingerprint = fingerprint { + custom { method, classDef -> + method.name == "onReceive" && + classDef.type == "Lcom/instagram/notifications/push/ClearNotificationReceiver;" + } + strings("NOTIFICATION_DISMISSED") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt new file mode 100644 index 000000000..b33d5ace5 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.instagram.misc.links +import app.revanced.patcher.fingerprint + +internal const val TARGET_STRING = "Tracking.ARG_CLICK_SOURCE" + +internal val inAppBrowserFunctionFingerprint = fingerprint { + returns("Z") + strings("TrackingInfo.ARG_MODULE_NAME", TARGET_STRING) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt new file mode 100644 index 000000000..19b43e27e --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/OpenLinksExternallyPatch.kt @@ -0,0 +1,47 @@ +package app.revanced.patches.instagram.misc.links + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/instagram/misc/links/OpenLinksExternallyPatch;" + +@Suppress("unused") +val openLinksExternallyPatch = bytecodePatch( + name = "Open links externally", + description = "Changes links to always open in your external browser, instead of the in-app browser.", + use = false, +) { + + dependsOn(sharedExtensionPatch) + + compatibleWith("com.instagram.android") + + execute { + inAppBrowserFunctionFingerprint.let { + val stringMatchIndex = it.stringMatches?.first { match -> match.string == TARGET_STRING }!!.index + + it.method.apply { + val urlResultObjIndex = indexOfFirstInstructionOrThrow( + stringMatchIndex, Opcode.MOVE_OBJECT_FROM16 + ) + + // Register that contains the url after moving from a higher register. + val urlRegister = getInstruction(urlResultObjIndex).registerA + + addInstructions( + urlResultObjIndex + 1, + """ + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->openExternally(Ljava/lang/String;)Z + move-result v$urlRegister + return v$urlRegister + """ + ) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt new file mode 100644 index 000000000..b6d968c65 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.instagram.misc.share + +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction + +context(BytecodePatchContext) +internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { + val fingerprintsToPatch = arrayOf( + permalinkResponseJsonParserFingerprint, + storyUrlResponseJsonParserFingerprint, + profileUrlResponseJsonParserFingerprint, + liveUrlResponseJsonParserFingerprint + ) + + for (fingerprint in fingerprintsToPatch) { + fingerprint.method.apply { + val putSharingUrlIndex = indexOfFirstInstruction( + permalinkResponseJsonParserFingerprint.stringMatches!!.first().index, + Opcode.IPUT_OBJECT + ) + + val sharingUrlRegister = getInstruction(putSharingUrlIndex).registerA + + block(putSharingUrlIndex, sharingUrlRegister) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt new file mode 100644 index 000000000..9e0d8e64d --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt @@ -0,0 +1,23 @@ +package app.revanced.patches.instagram.misc.share + +import app.revanced.patcher.fingerprint + +internal val permalinkResponseJsonParserFingerprint = fingerprint { + strings("permalink", "PermalinkResponse") + custom { method, _ -> method.name == "parseFromJson" } +} + +internal val storyUrlResponseJsonParserFingerprint = fingerprint { + strings("story_item_to_share_url", "StoryItemUrlResponse") + custom { method, _ -> method.name == "parseFromJson" } +} + +internal val profileUrlResponseJsonParserFingerprint = fingerprint { + strings("profile_to_share_url", "ProfileUrlResponse") + custom { method, _ -> method.name == "parseFromJson" } +} + +internal val liveUrlResponseJsonParserFingerprint = fingerprint { + strings("live_to_share_url", "LiveItemLinkUrlResponse") + custom { method, _ -> method.name == "parseFromJson" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt new file mode 100644 index 000000000..1e476b73b --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt @@ -0,0 +1,42 @@ +package app.revanced.patches.instagram.misc.share.domain + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.stringOption +import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch +import app.revanced.patches.instagram.misc.share.editShareLinksPatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN +import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN +import app.revanced.util.returnEarly + +@Suppress("unused") +val changeLinkSharingDomainPatch = bytecodePatch( + name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, + description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN, + use = false +) { + compatibleWith("com.instagram.android") + + dependsOn(sharedExtensionPatch) + + execute { + val customDomainHost by stringOption( + key = "domainName", + default = "imginn.com", + title = "Domain name", + description = "The domain name to use when sharing links." + ) + + getCustomShareDomainFingerprint.method.returnEarly(customDomainHost!!) + + editShareLinksPatch { index, register -> + addInstructions( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setCustomShareDomain(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt new file mode 100644 index 000000000..133752000 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.instagram.misc.share.domain + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch;" + +internal val getCustomShareDomainFingerprint = fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { method, classDef -> + method.name == "getCustomShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt new file mode 100644 index 000000000..a73099a22 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatch.kt @@ -0,0 +1,33 @@ +package app.revanced.patches.instagram.misc.share.privacy + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch +import app.revanced.patches.instagram.misc.share.editShareLinksPatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch;" + +@Suppress("unused") +val sanitizeSharingLinksPatch = bytecodePatch( + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, +) { + compatibleWith("com.instagram.android") + + dependsOn(sharedExtensionPatch) + + execute { + editShareLinksPatch { index, register -> + addInstructions( + index, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt new file mode 100644 index 000000000..6f0f46026 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -0,0 +1,80 @@ +package app.revanced.patches.music.layout.branding + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.music.misc.gms.Constants.MUSIC_MAIN_ACTIVITY_NAME +import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME +import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint +import app.revanced.patches.music.misc.settings.PreferenceScreen +import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch +import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch +import app.revanced.patches.shared.misc.mapping.resourceMappings +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstInstructionReversed +import app.revanced.util.indexOfFirstLiteralInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private val disableSplashAnimationPatch = bytecodePatch { + + dependsOn(resourceMappingPatch) + + execute { + // The existing YT animation usually only shows for a fraction of a second, + // and the existing animation does not match the new splash screen + // causing the original YT Music logo to momentarily flash on screen as the animation starts. + // + // Could replace the lottie animation file with our own custom animation (app_launch.json), + // but the animation is not always the same size as the launch screen and it's still + // barely shown. Instead turn off the animation entirely (app will also launch a little faster). + cairoSplashAnimationConfigFingerprint.method.apply { + val mainActivityLaunchAnimation = resourceMappings["layout", "main_activity_launch_animation"] + val literalIndex = indexOfFirstLiteralInstructionOrThrow( + mainActivityLaunchAnimation + ) + val insertIndex = indexOfFirstInstructionReversed(literalIndex) { + this.opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.name == "setContentView" + } + 1 + val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { + opcode == Opcode.INVOKE_VIRTUAL && + getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/Runnable;" + } + 1 + + addInstructionsWithLabels( + insertIndex, + "goto :skip_animation", + ExternalLabel("skip_animation", getInstruction(jumpIndex)) + ) + } + } +} + +@Suppress("unused") +val customBrandingPatch = baseCustomBrandingPatch( + addResourcePatchName = "music", + originalLauncherIconName = "ic_launcher_release", + originalAppName = "@string/app_launcher_name", + originalAppPackageName = MUSIC_PACKAGE_NAME, + copyExistingIntentsToAliases = false, + numberOfPresetAppNames = 5, + mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + mainActivityName = MUSIC_MAIN_ACTIVITY_NAME, + activityAliasNameWithIntents = MUSIC_MAIN_ACTIVITY_NAME, + preferenceScreen = PreferenceScreen.GENERAL, + + block = { + dependsOn(disableSplashAnimationPatch) + + compatibleWith( + "com.google.android.apps.youtube.music"( + "7.29.52", + "8.10.52" + ) + ) + } +) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt new file mode 100644 index 000000000..8e8989983 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.music.layout.branding + +import app.revanced.patcher.fingerprint +import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE + +internal val cairoSplashAnimationConfigFingerprint = fingerprint { + returns("V") + parameters("Landroid/os/Bundle;") + custom { method, classDef -> + method.name == "onCreate" && method.definingClass == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt index 2c1fbdea8..fba3653ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt @@ -9,6 +9,9 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch +import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.resourceMappingPatch +import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstructionOrThrow @@ -29,6 +32,7 @@ val hideCastButton = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + resourceMappingPatch ) compatibleWith( @@ -39,6 +43,8 @@ val hideCastButton = bytecodePatch( ) execute { + playerOverlayChip = resourceMappings["id", "player_overlay_chip"] + addResources("music", "layout.castbutton.hideCastButton") PreferenceScreen.GENERAL.addPreferences( @@ -59,7 +65,7 @@ val hideCastButton = bytecodePatch( playerOverlayChipFingerprint.method.apply { val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerOverlayChip) - val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT) + val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT_OBJECT) val targetRegister = getInstruction(targetIndex).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt new file mode 100644 index 000000000..32c162a46 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/FileProviderPatch.kt @@ -0,0 +1,44 @@ +package app.revanced.patches.music.misc.fileprovider + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName +import app.revanced.patches.music.utils.fix.fileprovider.fileProviderResolverFingerprint + +internal fun fileProviderPatch( + youtubePackageName: String, + musicPackageName: String +) = bytecodePatch( + description = "Fixes broken YouTube Music file provider that prevents sharing with specific apps such as Instagram." +) { + finalize { + // Must do modification last, so change package name value is correctly set. + val musicChangedPackageName = setOrGetFallbackPackageName(musicPackageName) + + // For some reason, if the app gets "android.support.FILE_PROVIDER_PATHS", + // the package name of YouTube is used, not the package name of the YT Music. + // + // There is no issue in the stock YT Music, but this is an issue in the GmsCore Build. + // https://github.com/ReVanced/revanced-patches/issues/55 + // + // To solve this issue, replace the package name of YouTube with YT Music's package name. + fileProviderResolverFingerprint.method.addInstructionsWithLabels( + 0, + """ + const-string v0, "com.google.android.youtube.fileprovider" + invoke-static { p1, v0 }, Ljava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z + move-result v0 + if-nez v0, :fix + const-string v0, "$youtubePackageName.fileprovider" + invoke-static { p1, v0 }, Ljava/util/Objects;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z + move-result v0 + if-nez v0, :fix + goto :ignore + :fix + const-string p1, "$musicChangedPackageName.fileprovider" + :ignore + nop + """ + ) + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt new file mode 100644 index 000000000..16a2d6a58 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.music.utils.fix.fileprovider + +import app.revanced.patcher.fingerprint + +internal val fileProviderResolverFingerprint = fingerprint { + returns("L") + strings( + "android.support.FILE_PROVIDER_PATHS", + "Name must not be empty" + ) +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt index f4114a00b..39dda22aa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt @@ -1,6 +1,8 @@ package app.revanced.patches.music.misc.gms object Constants { + internal const val MUSIC_MAIN_ACTIVITY_NAME = "com.google.android.apps.youtube.music.activities.MusicActivity" + internal const val REVANCED_MUSIC_PACKAGE_NAME = "app.revanced.android.apps.youtube.music" internal const val MUSIC_PACKAGE_NAME = "com.google.android.apps.youtube.music" } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt index a037909a6..0d6b319d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/GmsCoreSupportPatch.kt @@ -9,6 +9,7 @@ import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.patches.music.misc.spoof.spoofVideoStreamsPatch +import app.revanced.patches.music.misc.fileprovider.fileProviderPatch import app.revanced.patches.shared.castContextFetchFingerprint import app.revanced.patches.shared.misc.gms.gmsCoreSupportPatch import app.revanced.patches.shared.misc.settings.preference.IntentPreference @@ -60,6 +61,10 @@ private fun gmsCoreSupportResourcePatch( ) { dependsOn( addResourcesPatch, - settingsPatch + settingsPatch, + fileProviderPatch( + MUSIC_PACKAGE_NAME, + REVANCED_MUSIC_PACKAGE_NAME + ) ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt index 1ea963470..e95db8c36 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt @@ -6,6 +6,7 @@ import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch +import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.BasePreference import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen @@ -126,7 +127,7 @@ fun newIntent(settingsName: String) = IntentPreference.Intent( targetClass = "com.google.android.gms.common.api.GoogleApiActivity" ) { // The package name change has to be reflected in the intent. - setOrGetFallbackPackageName("com.google.android.apps.youtube.music") + setOrGetFallbackPackageName(MUSIC_PACKAGE_NAME) } object PreferenceScreen : BasePreferenceScreen() { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt index b01f74cca..93c294480 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.music.misc.spoof -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch @@ -16,12 +15,13 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;" - val spoofVideoStreamsPatch = spoofVideoStreamsPatch( - fixMediaFetchHotConfigChanges = { true }, - fixMediaFetchHotConfigAlternativeChanges = { is_8_11_or_greater && !is_8_15_or_greater }, + extensionClassDescriptor = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;", + mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, + fixMediaFetchHotConfig = { true }, + fixMediaFetchHotConfigAlternative = { is_8_11_or_greater && !is_8_15_or_greater }, fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }, + block = { dependsOn( sharedExtensionPatch, @@ -38,6 +38,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) }, + executeBlock = { addResources("music", "misc.fix.playback.spoofVideoStreamsPatch") @@ -51,10 +52,5 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) ) - - musicActivityOnCreateFingerprint.method.addInstruction( - 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V" - ) } -) \ No newline at end of file +) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt new file mode 100644 index 000000000..8130cbe71 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt @@ -0,0 +1,34 @@ +package app.revanced.patches.music.misc.tracks + +import app.revanced.patches.music.misc.extension.sharedExtensionPatch +import app.revanced.patches.music.misc.settings.PreferenceScreen +import app.revanced.patches.music.misc.settings.settingsPatch +import app.revanced.patches.music.playservice.is_8_10_or_greater +import app.revanced.patches.music.playservice.versionCheckPatch +import app.revanced.patches.music.shared.mainActivityOnCreateFingerprint +import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;" + +@Suppress("unused") +val forceOriginalAudioPatch = forceOriginalAudioPatch( + block = { + dependsOn( + sharedExtensionPatch, + settingsPatch, + versionCheckPatch + ) + + compatibleWith( + "com.google.android.apps.youtube.music"( + "7.29.52", + "8.10.52" + ) + ) + }, + fixUseLocalizedAudioTrackFlag = is_8_10_or_greater, + mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR, + preferenceScreen = PreferenceScreen.MISC, +) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt index 467498bf2..b14d6b659 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt @@ -7,6 +7,8 @@ import app.revanced.util.findPlayStoreServicesVersion var is_7_33_or_greater = false private set +var is_8_10_or_greater = false + private set var is_8_11_or_greater = false private set var is_8_15_or_greater = false @@ -22,6 +24,7 @@ val versionCheckPatch = resourcePatch( // All bug fix releases always seem to use the same play store version as the minor version. is_7_33_or_greater = 245199000 <= playStoreServicesVersion + is_8_10_or_greater = 244799000 <= playStoreServicesVersion is_8_11_or_greater = 251199000 <= playStoreServicesVersion is_8_15_or_greater = 251530000 <= playStoreServicesVersion } diff --git a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt index 594083337..8669f6132 100644 --- a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/RemoveRootDetectionPatch.kt @@ -1,12 +1,14 @@ package app.revanced.patches.orfon.detection.root import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION import app.revanced.util.returnEarly @Suppress("unused") val removeRootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION ) { compatibleWith("com.nousguide.android.orftvthek") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt index f19a5964d..340f4096c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/FixRedgifsApiPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.redgifs -import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patches.reddit.customclients.CREATE_NEW_CLIENT_METHOD import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.sharedExtensionPatch @@ -27,9 +26,7 @@ val fixRedgifsApi = fixRedgifsApiPatch( } replaceInstruction( index, - """ - invoke-static { }, ${EXTENSION_CLASS_DESCRIPTOR}->$CREATE_NEW_CLIENT_METHOD - """ + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->$CREATE_NEW_CLIENT_METHOD" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt index 26ed42660..11bc79212 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.reddit.misc.tracking.url import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS @Suppress("unused") val sanitizeUrlQueryPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes (tracking) query parameters from the URLs when sharing links.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { compatibleWith("com.reddit.frontpage") diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt index 43ebaa19f..0c9fd9040 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt @@ -2,11 +2,13 @@ package app.revanced.patches.serviceportalbund.detection.root import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION +import app.revanced.patches.shared.PATCH_NAME_REMOVE_ROOT_DETECTION @Suppress("unused") val rootDetectionPatch = bytecodePatch( - name = "Remove root detection", - description = "Removes the check for root permissions and unlocked bootloader.", + name = PATCH_NAME_REMOVE_ROOT_DETECTION, + description = PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION ) { compatibleWith("at.gv.bka.serviceportal") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt b/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt new file mode 100644 index 000000000..39e3e8cf5 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.shared + +// +// Names and descriptions used by different patches implementing the same feature. +// + +internal const val PATCH_NAME_REMOVE_ROOT_DETECTION = "Remove root detection" +internal const val PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION = "Removes the check for root permissions and unlocked bootloader." + +internal const val PATCH_NAME_SANITIZE_SHARING_LINKS = "Sanitize sharing links" +internal const val PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS = "Removes the tracking query parameters from shared links." + +internal const val PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN = "Change link sharing domain" +internal const val PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN = "Replaces the domain name of shared links." diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt new file mode 100644 index 000000000..d8356aee0 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt @@ -0,0 +1,387 @@ +package app.revanced.patches.shared.layout.branding + +import app.revanced.patcher.Fingerprint +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.ResourcePatch +import app.revanced.patcher.patch.ResourcePatchBuilder +import app.revanced.patcher.patch.ResourcePatchContext +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringOption +import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.util.ResourceGroup +import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.copyResources +import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.removeFromParent +import app.revanced.util.returnEarly +import org.w3c.dom.Element +import org.w3c.dom.Node +import org.w3c.dom.NodeList +import java.io.File +import java.util.logging.Logger + +private val mipmapDirectories = arrayOf( + // Target app does not have ldpi icons. + "mipmap-mdpi", + "mipmap-hdpi", + "mipmap-xhdpi", + "mipmap-xxhdpi", + "mipmap-xxxhdpi" +) + +private val iconStyleNames = arrayOf( + "rounded", + "minimal", + "scaled" +) + +private const val ORIGINAL_USER_ICON_STYLE_NAME = "original" +private const val CUSTOM_USER_ICON_STYLE_NAME = "custom" + +private const val LAUNCHER_RESOURCE_NAME_PREFIX = "revanced_launcher_" +private const val LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX = "revanced_adaptive_background_" +private const val LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX = "revanced_adaptive_foreground_" +private const val LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX = "revanced_adaptive_monochrome_" + +private val USER_CUSTOM_ADAPTIVE_FILE_NAMES = arrayOf( + "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png" +) + +private const val USER_CUSTOM_MONOCHROME_NAME = "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" + +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/CustomBrandingPatch;" + +/** + * Shared custom branding patch for YouTube and YT Music. + */ +internal fun baseCustomBrandingPatch( + addResourcePatchName: String, + originalLauncherIconName: String, + originalAppName: String, + originalAppPackageName: String, + copyExistingIntentsToAliases: Boolean, + numberOfPresetAppNames: Int, + mainActivityOnCreateFingerprint: Fingerprint, + mainActivityName: String, + activityAliasNameWithIntents: String, + preferenceScreen: BasePreferenceScreen.Screen, + block: ResourcePatchBuilder.() -> Unit, + executeBlock: ResourcePatchContext.() -> Unit = {} +): ResourcePatch = resourcePatch( + name = "Custom branding", + description = "Adds options to change the app icon and app name. " + + "Branding cannot be changed for mounted (root) installations." +) { + val customName by stringOption( + key = "customName", + title = "App name", + description = "Custom app name." + ) + + val customIcon by stringOption( + key = "customIcon", + title = "Custom icon", + description = """ + Folder with images to use as a custom icon. + + The folder must contain one or more of the following folders, depending on the DPI of the device: + ${mipmapDirectories.joinToString("\n") { "- $it" }} + + Each of the folders must contain all of the following files: + ${USER_CUSTOM_ADAPTIVE_FILE_NAMES.joinToString("\n")} + + Optionally, the path can contain a 'drawable' folder with the monochrome icon file: + $USER_CUSTOM_MONOCHROME_NAME + """.trimIndentMultiline() + ) + + block() + + dependsOn( + addResourcesPatch, + bytecodePatch { + execute { + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setBranding()V" + ) + + numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames) + } + } + ) + + finalize { + val useCustomName = customName != null + val useCustomIcon = customIcon != null + + if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) { + if (useCustomName || useCustomIcon) { + Logger.getLogger(this::class.java.name).warning( + "Custom branding does not work with root installation. No changes applied." + ) + } + return@finalize + } + + preferenceScreen.addPreferences( + if (useCustomName) { + ListPreference( + key = "revanced_custom_branding_name", + entriesKey = "revanced_custom_branding_name_custom_entries", + entryValuesKey = "revanced_custom_branding_name_custom_entry_values" + ) + } else { + ListPreference("revanced_custom_branding_name") + }, + if (useCustomIcon) { + ListPreference( + key = "revanced_custom_branding_icon", + entriesKey = "revanced_custom_branding_icon_custom_entries", + entryValuesKey = "revanced_custom_branding_icon_custom_entry_values" + ) + } else { + ListPreference("revanced_custom_branding_icon") + } + ) + } + + execute { + addResources("shared", "layout.branding.baseCustomBrandingPatch") + addResources(addResourcePatchName, "layout.branding.customBrandingPatch") + + val useCustomName = customName != null + val useCustomIcon = customIcon != null + + iconStyleNames.forEach { style -> + copyResources( + "custom-branding", + ResourceGroup( + "drawable", + "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$style.xml", + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$style.xml", + "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$style.xml" + ), + ResourceGroup( + "mipmap-anydpi", + "$LAUNCHER_RESOURCE_NAME_PREFIX$style.xml" + ) + ) + } + + // Copy template user icon, because the aliases must be added even if no user icon is provided. + copyResources( + "custom-branding", + ResourceGroup( + "mipmap-anydpi", + "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + ), + ResourceGroup( + "drawable", + "$LAUNCHER_ADAPTIVE_MONOCHROME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + ) + ) + + // Copy template icon png files. + mipmapDirectories.forEach { dpi -> + copyResources( + "custom-branding", + ResourceGroup( + dpi, + "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", + ) + ) + } + + if (useCustomIcon) { + // Copy user provided files + val iconPathFile = File(customIcon!!.trim()) + + if (!iconPathFile.exists()) { + throw PatchException( + "The custom icon path cannot be found: " + iconPathFile.absolutePath + ) + } + + if (!iconPathFile.isDirectory) { + throw PatchException( + "The custom icon path must be a folder: " + iconPathFile.absolutePath + ) + } + + val sourceFolders = iconPathFile.listFiles { file -> file.isDirectory } + ?: throw PatchException("The custom icon path contains no subfolders: " + + iconPathFile.absolutePath) + + val resourceDirectory = get("res") + var copiedFiles = false + + // For each source folder, copy the files to the target resource directories. + sourceFolders.forEach { dpiSourceFolder -> + val targetDpiFolder = resourceDirectory.resolve(dpiSourceFolder.name) + if (!targetDpiFolder.exists()) return@forEach + + val customFiles = dpiSourceFolder.listFiles { file -> + file.isFile && file.name in USER_CUSTOM_ADAPTIVE_FILE_NAMES + }!! + + if (customFiles.size > 0 && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) { + throw PatchException("Must include all required icon files " + + "but only found " + customFiles.map { it.name }) + } + + customFiles.forEach { imgSourceFile -> + val imgTargetFile = targetDpiFolder.resolve(imgSourceFile.name) + imgSourceFile.copyTo(target = imgTargetFile, overwrite = true) + + copiedFiles = true + } + } + + // Copy monochrome if it provided. + val monochromeRelativePath = "drawable/$USER_CUSTOM_MONOCHROME_NAME" + val monochromeFile = iconPathFile.resolve(monochromeRelativePath) + if (monochromeFile.exists()) { + monochromeFile.copyTo( + target = resourceDirectory.resolve(monochromeRelativePath), + overwrite = true + ) + copiedFiles = true + } + + if (!copiedFiles) { + throw PatchException("Could not find any replacement images in " + + "patch option path: " + iconPathFile.absolutePath) + } + } + + document("AndroidManifest.xml").use { document -> + // Create launch aliases that can be programmatically selected in app. + fun createAlias( + aliasName: String, + iconMipmapName: String, + appNameIndex: Int, + useCustomName: Boolean, + enabled: Boolean, + intents: NodeList + ): Element { + val label = if (useCustomName) { + if (customName == null) { + "Custom" // Dummy text, and normally cannot be seen. + } else { + customName!! + } + } else if (appNameIndex == 1) { + // Indexing starts at 1. + originalAppName + } else { + "@string/revanced_custom_branding_name_entry_$appNameIndex" + } + val alias = document.createElement("activity-alias") + alias.setAttribute("android:name", aliasName) + alias.setAttribute("android:enabled", enabled.toString()) + alias.setAttribute("android:exported", "true") + alias.setAttribute("android:icon", "@mipmap/$iconMipmapName") + alias.setAttribute("android:label", label) + alias.setAttribute("android:targetActivity", mainActivityName) + + // Copy all intents from the original alias so long press actions still work. + if (copyExistingIntentsToAliases) { + for (i in 0 until intents.length) { + alias.appendChild( + intents.item(i).cloneNode(true) + ) + } + } else { + val intentFilter = document.createElement("intent-filter").apply { + val action = document.createElement("action") + action.setAttribute("android:name", "android.intent.action.MAIN") + appendChild(action) + + val category = document.createElement("category") + category.setAttribute("android:name", "android.intent.category.LAUNCHER") + appendChild(category) + } + alias.appendChild(intentFilter) + } + + return alias + } + + val intentFilters = document.childNodes.findElementByAttributeValueOrThrow( + "android:name", + activityAliasNameWithIntents + ).childNodes + + val application = document.getElementsByTagName("application").item(0) as Element + + for (appNameIndex in 1 .. numberOfPresetAppNames) { + fun aliasName(name: String): String = ".revanced_" + name + '_' + appNameIndex + + val useCustomNameLabel = (useCustomName && appNameIndex == numberOfPresetAppNames) + + // Original icon. + application.appendChild( + createAlias( + aliasName = aliasName(ORIGINAL_USER_ICON_STYLE_NAME), + iconMipmapName = originalLauncherIconName, + appNameIndex = appNameIndex, + useCustomName = useCustomNameLabel, + enabled = (appNameIndex == 1), + intentFilters + ) + ) + + // Bundled icons. + iconStyleNames.forEachIndexed { index, style -> + application.appendChild( + createAlias( + aliasName = aliasName(style), + iconMipmapName = LAUNCHER_RESOURCE_NAME_PREFIX + style, + appNameIndex = appNameIndex, + useCustomName = useCustomNameLabel, + enabled = false, + intentFilters + ) + ) + } + + // User provided custom icon. + // + // Must add all aliases even if the user did not provide a custom icon of their own. + // This is because if the user installs with an option, then repatches without the option, + // the alias must still exist because if it was previously enabled and then it's removed + // the app will become broken and cannot launch. Even if the app data is cleared + // it still cannot be launched and the only fix is to uninstall the app. + // To prevent this, always include all aliases and use dummy data if needed. + application.appendChild( + createAlias( + aliasName = aliasName(CUSTOM_USER_ICON_STYLE_NAME), + iconMipmapName = LAUNCHER_RESOURCE_NAME_PREFIX + CUSTOM_USER_ICON_STYLE_NAME, + appNameIndex = appNameIndex, + useCustomName = useCustomNameLabel, + enabled = false, + intentFilters + ) + ) + } + + // Remove the main action from the original alias, otherwise two apps icons + // can be shown in the launcher. Can only be done after adding the new aliases. + intentFilters.findElementByAttributeValueOrThrow( + "android:name", + "android.intent.action.MAIN" + ).removeFromParent() + } + + executeBlock() + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt new file mode 100644 index 000000000..c46cb1a88 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.shared.layout.branding + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("I") + parameters() + custom { method, classDef -> + method.name == "numberOfPresetAppNames" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt index de070fb89..40fb77980 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/BaseThemePatch.kt @@ -79,7 +79,7 @@ internal val darkThemeBackgroundColorOption = stringOption( */ internal fun baseThemePatch( extensionClassDescriptor: String, - block: BytecodePatchBuilder.() -> Unit = {}, + block: BytecodePatchBuilder.() -> Unit, executeBlock: BytecodePatchContext.() -> Unit = {} ) = bytecodePatch( name = "Theme", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt similarity index 67% rename from patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt rename to patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index 8e3755bc8..495ac4865 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.video.audio +package app.revanced.patches.shared.misc.audio import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction @@ -7,10 +7,14 @@ import com.android.tools.smali.dexlib2.AccessFlags internal val formatStreamModelToStringFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") - custom { method, classDef -> - method.name == "toString" && classDef.type == - "Lcom/google/android/libraries/youtube/innertube/model/media/FormatStreamModel;" + custom { method, _ -> + method.name == "toString" } + strings( + // Strings are partial matches. + "isDefaultAudioTrack=", + "audioTrackId=" + ) } internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L @@ -20,7 +24,6 @@ internal val selectAudioStreamFingerprint = fingerprint { returns("L") custom { method, _ -> method.parameters.size > 2 // Method has a large number of parameters and may change. - && method.parameters[1].type == "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;" && method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt new file mode 100644 index 000000000..5c0d8c907 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt @@ -0,0 +1,157 @@ +package app.revanced.patches.shared.misc.audio + +import app.revanced.patcher.Fingerprint +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.util.findMethodFromToString +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.insertLiteralOverride +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.immutable.ImmutableField +import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/shared/patches/ForceOriginalAudioPatch;" + +/** + * Patch shared with YouTube and YT Music. + */ +internal fun forceOriginalAudioPatch( + block: BytecodePatchBuilder.() -> Unit = {}, + executeBlock: BytecodePatchContext.() -> Unit = {}, + fixUseLocalizedAudioTrackFlag: Boolean, + mainActivityOnCreateFingerprint: Fingerprint, + subclassExtensionClassDescriptor: String, + preferenceScreen: BasePreferenceScreen.Screen +) = bytecodePatch( + name = "Force original audio", + description = "Adds an option to always use the original audio track.", +) { + + block() + + dependsOn(addResourcesPatch) + + execute { + addResources("shared", "misc.audio.forceOriginalAudioPatch") + + preferenceScreen.addPreferences( + SwitchPreference( + key = "revanced_force_original_audio", + tag = "app.revanced.extension.shared.settings.preference.ForceOriginalAudioSwitchPreference" + ) + ) + + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static { }, $subclassExtensionClassDescriptor->setEnabled()V" + ) + + // Disable feature flag that ignores the default track flag + // and instead overrides to the user region language. + if (fixUseLocalizedAudioTrackFlag) { + selectAudioStreamFingerprint.method.insertLiteralOverride( + AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG, + "$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z" + ) + } + + formatStreamModelToStringFingerprint.let { + val isDefaultAudioTrackMethod = it.originalMethod.findMethodFromToString("isDefaultAudioTrack=") + val audioTrackDisplayNameMethod = it.originalMethod.findMethodFromToString("audioTrackDisplayName=") + val audioTrackIdMethod = it.originalMethod.findMethodFromToString("audioTrackId=") + + it.classDef.apply { + // Add a new field to store the override. + val helperFieldName = "patch_isDefaultAudioTrackOverride" + fields.add( + ImmutableField( + type, + helperFieldName, + "Ljava/lang/Boolean;", + // Boolean is a 100% immutable class (all fields are final) + // and safe to write to a shared field without volatile/synchronization, + // but without volatile the field can show stale data + // and the same field is calculated more than once by different threads. + AccessFlags.PRIVATE.value or AccessFlags.VOLATILE.value, + null, + null, + null + ).toMutable() + ) + + // Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed. + val helperMethodClass = type + val helperMethodName = "patch_isDefaultAudioTrack" + val helperMethod = ImmutableMethod( + helperMethodClass, + helperMethodName, + listOf(ImmutableMethodParameter("Z", null, null)), + "Z", + AccessFlags.PRIVATE.value, + null, + null, + MutableMethodImplementation(6), + ).toMutable().apply { + addInstructionsWithLabels( + 0, + """ + iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; + if-eqz v0, :call_extension + invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z + move-result v3 + return v3 + + :call_extension + invoke-virtual { p0 }, $audioTrackIdMethod + move-result-object v1 + + invoke-virtual { p0 }, $audioTrackDisplayNameMethod + move-result-object v2 + + invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z + move-result v3 + + invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; + move-result-object v0 + iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; + return v3 + """ + ) + } + methods.add(helperMethod) + + // Modify isDefaultAudioTrack() to call extension helper method. + isDefaultAudioTrackMethod.apply { + val index = indexOfFirstInstructionOrThrow(Opcode.RETURN) + val register = getInstruction(index).registerA + + addInstructions( + index, + """ + invoke-direct { p0, v$register }, $helperMethodClass->$helperMethodName(Z)Z + move-result v$register + """ + ) + } + } + } + + executeBlock() + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index b5f613d54..27eebb8ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -1,16 +1,11 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.fingerprint +import app.revanced.patches.shared.misc.gms.EXTENSION_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId" -internal val gmsCoreSupportFingerprint = fingerprint { - custom { _, classDef -> - classDef.endsWith("GmsCoreSupport;") - } -} - internal val googlePlayUtilityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("I") @@ -28,3 +23,21 @@ internal val serviceCheckFingerprint = fingerprint { parameters("L", "I") strings("Google Play Services not available") } + +internal val gmsCoreSupportFingerprint = fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { method, classDef -> + method.name == "getGmsCoreVendorGroupId" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} + +internal val originalPackageNameExtensionFingerprint = fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters() + custom { methodDef, classDef -> + methodDef.name == "getOriginalPackageName" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index ef8743fda..fb773457f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -1,10 +1,18 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.* +import app.revanced.patcher.patch.BytecodePatchBuilder +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.patch.Option +import app.revanced.patcher.patch.Patch +import app.revanced.patcher.patch.ResourcePatchBuilder +import app.revanced.patcher.patch.ResourcePatchContext +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringOption import app.revanced.patches.all.misc.packagename.changePackageNamePatch import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources @@ -12,7 +20,8 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.gms.Constants.ACTIONS import app.revanced.patches.shared.misc.gms.Constants.AUTHORITIES import app.revanced.patches.shared.misc.gms.Constants.PERMISSIONS -import app.revanced.util.* +import app.revanced.util.getReference +import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -23,6 +32,8 @@ import com.android.tools.smali.dexlib2.util.MethodUtil import org.w3c.dom.Element import org.w3c.dom.Node +internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/GmsCoreSupport;" + private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$" /** @@ -201,19 +212,18 @@ fun gmsCoreSupportPatch( googlePlayUtilityFingerprint.method.returnEarly(0) } + // Set original and patched package names for extension to use. + originalPackageNameExtensionFingerprint.method.returnEarly(fromPackageName) + // Verify GmsCore is installed and whitelisted for power optimizations and background usage. - mainActivityOnCreateFingerprint.method.apply { - addInstructions( - 0, - "invoke-static/range { p0 .. p0 }, Lapp/revanced/extension/shared/GmsCoreSupport;->" + - "checkGmsCore(Landroid/app/Activity;)V", - ) - } + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + + "checkGmsCore(Landroid/app/Activity;)V" + ) // Change the vendor of GmsCore in the extension. - gmsCoreSupportFingerprint.classDef.methods - .single { it.name == GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME } - .replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"") + gmsCoreSupportFingerprint.method.returnEarly(gmsCoreVendorGroupId!!) executeBlock() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt index 7a52c3d81..2fe4d7e81 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt @@ -10,6 +10,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting @@ -20,14 +22,17 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/SanitizeSharingLinksPatch;" +/** + * Patch shared by YouTube and YT Music. + */ internal fun sanitizeSharingLinksPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, preferenceScreen: BasePreferenceScreen.Screen, replaceMusicLinksWithYouTube: Boolean = false ) = bytecodePatch( - name = "Sanitize sharing links", - description = "Adds an option to remove the tracking query parameter from shared links.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { block() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index c03e8022c..7395c3983 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.shared.misc.spoof +import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels @@ -36,11 +37,13 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = private lateinit var buildRequestMethod: MutableMethod private var buildRequestMethodUrlRegister = -1 -fun spoofVideoStreamsPatch( - block: BytecodePatchBuilder.() -> Unit = {}, - fixMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false }, - fixMediaFetchHotConfigAlternativeChanges: BytecodePatchBuilder.() -> Boolean = { false }, +internal fun spoofVideoStreamsPatch( + extensionClassDescriptor: String, + mainActivityOnCreateFingerprint: Fingerprint, + fixMediaFetchHotConfig: BytecodePatchBuilder.() -> Boolean = { false }, + fixMediaFetchHotConfigAlternative: BytecodePatchBuilder.() -> Boolean = { false }, fixParsePlaybackResponseFeatureFlag: BytecodePatchBuilder.() -> Boolean = { false }, + block: BytecodePatchBuilder.() -> Unit, executeBlock: BytecodePatchContext.() -> Unit = {}, ) = bytecodePatch( name = "Spoof video streams", @@ -53,6 +56,11 @@ fun spoofVideoStreamsPatch( execute { addResources("shared", "misc.fix.playback.spoofVideoStreamsPatch") + mainActivityOnCreateFingerprint.method.addInstruction( + 0, + "invoke-static { }, $extensionClassDescriptor->setClientOrderToUse()V" + ) + // region Enable extension helper method used by other patches patchIncludedExtensionMethodFingerprint.method.returnEarly(true) @@ -308,14 +316,14 @@ fun spoofVideoStreamsPatch( // region turn off stream config replacement feature flag. - if (fixMediaFetchHotConfigChanges()) { + if (fixMediaFetchHotConfig()) { mediaFetchHotConfigFingerprint.method.insertLiteralOverride( MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG, "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" ) } - if (fixMediaFetchHotConfigAlternativeChanges()) { + if (fixMediaFetchHotConfigAlternative()) { mediaFetchHotConfigAlternativeFingerprint.method.insertLiteralOverride( MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG, "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt index 514951479..4bb03fa06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt @@ -17,7 +17,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused") val hideCreateButtonPatch = bytecodePatch( name = "Hide Create button", - description = "Hides the \"Create\" button in the navigation bar." + description = "Hides the \"Create\" button in the navigation bar. The latest app targets do not need this patch.", + use = false ) { compatibleWith("com.spotify.music") diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt index ff74565c6..4e4ad474c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt @@ -3,6 +3,8 @@ package app.revanced.patches.spotify.misc.privacy import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -15,8 +17,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes the tracking query parameters from links before they are shared.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { compatibleWith("com.spotify.music") @@ -24,7 +26,7 @@ val sanitizeSharingLinksPatch = bytecodePatch( execute { val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" + - "sanitizeUrl(Ljava/lang/String;)Ljava/lang/String;" + "sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;" val copyFingerprint = if (shareCopyUrlFingerprint.originalMethodOrNull != null) { shareCopyUrlFingerprint diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt index 9d813b7ad..342800518 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt @@ -12,9 +12,8 @@ val dynamicColorPatch = resourcePatch( ) { compatibleWith( "com.twitter.android"( - "10.86.0-release.0", "10.60.0-release.0", - "10.48.0-release.0" + "10.86.0-release.0", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/ExtensionPatch.kt index c5c758245..8f9b5574f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/ExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/ExtensionPatch.kt @@ -1,5 +1,6 @@ package app.revanced.patches.twitter.misc.extension import app.revanced.patches.shared.misc.extension.sharedExtensionPatch +import app.revanced.patches.twitter.misc.extension.hooks.applicationInitHook -val sharedExtensionPatch = sharedExtensionPatch("twitter") +val sharedExtensionPatch = sharedExtensionPatch("twitter", applicationInitHook) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt new file mode 100644 index 000000000..13a1590a7 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/hooks/ApplicationInitHook.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.twitter.misc.extension.hooks + +import app.revanced.patches.shared.misc.extension.extensionHook + +internal val applicationInitHook = + extensionHook { + custom { method, classDef -> + classDef.type == "Lcom/twitter/app/TwitterApplication;" && method.name == "onCreate" + } + } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt index 80da4aecf..682bb4f37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HookPatch.kt @@ -13,11 +13,8 @@ fun hookPatch( compatibleWith( "com.twitter.android"( - // Only v10.85 uses Pairip and requires additional changes to work. - "10.86.0-release.0", - // Confirmed to not show reply ads. Slightly newer versions may also work. "10.60.0-release.0", - "10.48.0-release.0" + "10.86.0-release.0", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index bf3d9afd2..db33e715b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -6,6 +6,8 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption +import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN +import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappings @@ -29,8 +31,8 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/twitter/patches/li @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( - name = "Change link sharing domain", - description = "Replaces the domain name of Twitter links when sharing them.", + name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, + description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN ) { dependsOn( changeLinkSharingDomainResourcePatch, @@ -39,9 +41,8 @@ val changeLinkSharingDomainPatch = bytecodePatch( compatibleWith( "com.twitter.android"( - "10.86.0-release.0", "10.60.0-release.0", - "10.48.0-release.0" + "10.86.0-release.0", ) ) @@ -54,28 +55,28 @@ val changeLinkSharingDomainPatch = bytecodePatch( ) execute { - val replacementIndex = - linkSharingDomainFingerprint.stringMatches!!.first().index - val domainRegister = - linkSharingDomainFingerprint.method.getInstruction(replacementIndex).registerA + linkSharingDomainFingerprint.let { + val replacementIndex = it.stringMatches!!.first().index + val domainRegister = it.method.getInstruction( + replacementIndex + ).registerA - linkSharingDomainFingerprint.method.replaceInstruction( - replacementIndex, - "const-string v$domainRegister, \"https://$domainName\"", - ) - - // Replace the domain name when copying a link with "Copy link" button. - linkBuilderFingerprint.method.apply { - addInstructions( - 0, - """ - invoke-static { p0, p1, p2 }, $EXTENSION_CLASS_DESCRIPTOR->formatLink(JLjava/lang/String;)Ljava/lang/String; - move-result-object p0 - return-object p0 - """, + it.method.replaceInstruction( + replacementIndex, + "const-string v$domainRegister, \"https://$domainName\"", ) } + // Replace the domain name when copying a link with "Copy link" button. + linkBuilderFingerprint.method.addInstructions( + 0, + """ + invoke-static { p0, p1, p2 }, $EXTENSION_CLASS_DESCRIPTOR->formatLink(JLjava/lang/String;)Ljava/lang/String; + move-result-object p0 + return-object p0 + """ + ) + // Used in the Share via... dialog. linkResourceGetterFingerprint.method.apply { val templateIdConstIndex = indexOfFirstLiteralInstructionOrThrow(tweetShareLinkTemplateId) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt index a0fa4d0cc..9c109e360 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt @@ -4,12 +4,12 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch +@Deprecated("Patch is obsolete and no longer needed with the highest supported app target. " + + "This patch will soon be deleted.") @Suppress("unused") val openLinksWithAppChooserPatch = bytecodePatch( - name = "Open links with app chooser", description = "Instead of opening links directly, open them with an app chooser. " + - "As a result you can select a browser to open the link with.", - use = false, + "As a result you can select a browser to open the link with.", ) { dependsOn(sharedExtensionPatch) @@ -18,7 +18,7 @@ val openLinksWithAppChooserPatch = bytecodePatch( execute { val methodReference = "Lapp/revanced/extension/twitter/patches/links/OpenLinksWithAppChooserPatch;->" + - "openWithChooser(Landroid/content/Context;Landroid/content/Intent;)V" + "openWithChooser(Landroid/content/Context;Landroid/content/Intent;)V" openLinkFingerprint.method.addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt index d84cfb2ca..7856bfe96 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt @@ -2,17 +2,18 @@ package app.revanced.patches.twitter.misc.links import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS +import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS @Suppress("unused") val sanitizeSharingLinksPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes the tracking query parameters from links before they are shared.", + name = PATCH_NAME_SANITIZE_SHARING_LINKS, + description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS, ) { compatibleWith( "com.twitter.android"( - "10.86.0-release.0", "10.60.0-release.0", - "10.48.0-release.0" + "10.86.0-release.0", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt new file mode 100644 index 000000000..2f2a7bda3 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt @@ -0,0 +1,16 @@ +package app.revanced.patches.viber.misc.navbar +import app.revanced.patcher.fingerprint +import app.revanced.patcher.patch.BytecodePatchContext + +internal val tabIdClassFingerprint = fingerprint { + strings("shouldShowTabId") +} + +context(BytecodePatchContext) +internal val shouldShowTabIdMethodFingerprint get() = fingerprint { + parameters("I", "I") + returns("Z") + custom { methodDef, classDef -> + classDef == tabIdClassFingerprint.classDef + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt new file mode 100644 index 000000000..a4aa3e4a0 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt @@ -0,0 +1,85 @@ +package app.revanced.patches.viber.misc.navbar + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.patch.booleanOption +import app.revanced.patcher.patch.bytecodePatch +import java.util.logging.Logger +import kotlin.collections.joinToString + + +private const val instructionsFooter = """ + # If we reach this, it means that this tab has been disabled by user + const/4 v0, 0 + return v0 # return false as "This tab is not enabled" + + # Proceed with default execution + :continue + nop +""" + +@Suppress("unused") +val hideNavigationButtonsPatch = bytecodePatch( + name = "Hide navigation buttons", + description = "Permanently hides navigation bar buttons, such as Explore and Marketplace.", + use = false +) { + compatibleWith("com.viber.voip") + + val hideOptions = AllowedNavigationItems.entries.associateWith { + booleanOption( + key = it.key, + default = it.defaultHideOption, + title = it.title, + description = it.description, + ) + } + + execute { + // Items that won't be forcefully hidden. + val allowedItems = hideOptions.filter { (option, enabled) -> enabled.value != true } + + if (allowedItems.size == AllowedNavigationItems.entries.size) { + return@execute Logger.getLogger(this::class.java.name).warning( + "No hide navigation buttons options are enabled. No changes made." + ) + } + + val injectionInstructions = allowedItems + .map { it.key.buildAllowInstruction() } + .joinToString("\n") + instructionsFooter + + shouldShowTabIdMethodFingerprint + .method + .addInstructionsWithLabels(0, injectionInstructions) + } +} + +/** + * Navigation items taken from source code. + * They appear in code like new NavigationItem(0, R.string.bottom_tab_chats, R.drawable.ic_tab_chats). + */ +private enum class AllowedNavigationItems( + val defaultHideOption: Boolean, + private val itemName: String, + private vararg val ids: Int +) { + CHATS(false, "Chats", 0), + CALLS(false, "Calls", 1, 7), + EXPLORE(true, "Explore", 2), + MORE(false, "More", 3), + PAY(true, "Pay", 5), + CAMERA(true, "Camera", 6), + MARKETPLACE(true, "Marketplace", 8); + + val key = "hide$itemName" + val title = "Hide $itemName" + val description = "Permanently hides the $itemName button." + + fun buildAllowInstruction(): String = + ids.joinToString("\n") { id -> + """ + const/4 v0, $id # If tabId == $id ($itemName), don't hide it + if-eq p1, v0, :continue + """ + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 8a9c44c30..2294ef9b2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -1,141 +1,35 @@ package app.revanced.patches.youtube.layout.branding -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.patch.stringOption -import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater -import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.util.ResourceGroup -import app.revanced.util.Utils.trimIndentMultiline -import app.revanced.util.copyResources -import java.io.File -import java.nio.file.Files - -private const val REVANCED_ICON = "ReVanced*Logo" // Can never be a valid path. -private const val APP_NAME = "YouTube ReVanced" - -private val iconResourceFileNames = arrayOf( - "adaptiveproduct_youtube_background_color_108", - "adaptiveproduct_youtube_foreground_color_108", - "ic_launcher", - "ic_launcher_round", -).map { "$it.png" }.toTypedArray() - -private val iconResourceFileNamesNew = mapOf( - "adaptiveproduct_youtube_foreground_color_108" to "adaptiveproduct_youtube_2024_q4_foreground_color_108", - "adaptiveproduct_youtube_background_color_108" to "adaptiveproduct_youtube_2024_q4_background_color_108", -) - -private val mipmapDirectories = arrayOf( - "xxxhdpi", - "xxhdpi", - "xhdpi", - "hdpi", - "mdpi", -).map { "mipmap-$it" } +import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_MAIN_ACTIVITY_NAME +import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME +import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint @Suppress("unused") -val customBrandingPatch = resourcePatch( - name = "Custom branding", - description = "Applies a custom app name and icon. Defaults to \"YouTube ReVanced\" and the ReVanced logo.", - use = false, -) { - dependsOn(versionCheckPatch) +val customBrandingPatch = baseCustomBrandingPatch( + addResourcePatchName = "youtube", + originalLauncherIconName = "ic_launcher", + originalAppName = "@string/application_name", + originalAppPackageName = YOUTUBE_PACKAGE_NAME, + copyExistingIntentsToAliases = true, + numberOfPresetAppNames = 5, + mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + mainActivityName = YOUTUBE_MAIN_ACTIVITY_NAME, + activityAliasNameWithIntents = "com.google.android.youtube.app.honeycomb.Shell\$HomeActivity", + preferenceScreen = PreferenceScreen.GENERAL_LAYOUT, - compatibleWith( - "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", - "20.14.43", - ) - ) + block = { + dependsOn(sharedExtensionPatch) - val appName by stringOption( - key = "appName", - default = APP_NAME, - values = mapOf( - "YouTube ReVanced" to APP_NAME, - "YT ReVanced" to "YT ReVanced", - "YT" to "YT", - "YouTube" to "YouTube", - ), - title = "App name", - description = "The name of the app.", - ) - - val icon by stringOption( - key = "iconPath", - default = REVANCED_ICON, - values = mapOf("ReVanced Logo" to REVANCED_ICON), - title = "App icon", - description = """ - The icon to apply to the app. - - If a path to a folder is provided, the folder must contain the following folders: - - ${mipmapDirectories.joinToString("\n") { "- $it" }} - - Each of these folders must contain the following files: - - ${iconResourceFileNames.joinToString("\n") { "- $it" }} - """.trimIndentMultiline(), - ) - - execute { - icon?.let { icon -> - // Change the app icon. - mipmapDirectories.map { directory -> - ResourceGroup( - directory, - *iconResourceFileNames, - ) - }.let { resourceGroups -> - if (icon != REVANCED_ICON) { - val path = File(icon) - val resourceDirectory = get("res") - - resourceGroups.forEach { group -> - val fromDirectory = path.resolve(group.resourceDirectoryName) - val toDirectory = resourceDirectory.resolve(group.resourceDirectoryName) - - group.resources.forEach { iconFileName -> - Files.write( - toDirectory.resolve(iconFileName).toPath(), - fromDirectory.resolve(iconFileName).readBytes(), - ) - } - } - } else { - resourceGroups.forEach { copyResources("custom-branding", it) } - } - } - - if (is_19_34_or_greater) { - val resourceDirectory = get("res") - - mipmapDirectories.forEach { directory -> - val targetDirectory = resourceDirectory.resolve(directory) - - iconResourceFileNamesNew.forEach { (old, new) -> - val oldFile = targetDirectory.resolve("$old.png") - val newFile = targetDirectory.resolve("$new.png") - - Files.write(newFile.toPath(), oldFile.readBytes()) - } - } - } - } - - appName?.let { name -> - // Change the app name. - val manifest = get("AndroidManifest.xml") - manifest.writeText( - manifest.readText() - .replace( - "android:label=\"@string/application_name", - "android:label=\"$name", - ), + compatibleWith( + "com.google.android.youtube"( + "19.34.42", + "20.07.39", + "20.13.41", + "20.14.43", ) - } + ) } -} +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index fa02fcc29..26a10aacf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -136,8 +136,21 @@ val changeHeaderPatch = resourcePatch( ) if (custom != null) { - val sourceFolders = File(custom!!).listFiles { file -> file.isDirectory } - ?: throw PatchException("The provided path is not a directory: $custom") + val customFile = File(custom!!) + if (!customFile.exists()) { + throw PatchException("The custom icon path cannot be found: " + + customFile.absolutePath + ) + } + + if (!customFile.isDirectory) { + throw PatchException("The custom icon path must be a folder: " + + customFile.absolutePath) + } + + val sourceFolders = customFile.listFiles { file -> file.isDirectory } + ?: throw PatchException("The custom icon path contains no subfolders: " + + customFile.absolutePath) val customResourceFileNames = getLightDarkFileNames(CUSTOM_HEADER_RESOURCE_NAME) @@ -166,7 +179,8 @@ val changeHeaderPatch = resourcePatch( } if (!copiedFiles) { - throw PatchException("No custom header images found in the provided path: $custom") + throw PatchException("No custom header images found in " + + "the provided path: " + customFile.absolutePath) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index 59d859e80..d39a639fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -1,8 +1,13 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.fingerprint +import app.revanced.util.containsLiteralInstruction +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.FieldReference internal val layoutCircleFingerprint = fingerprint { returns("Landroid/view/View;") @@ -38,3 +43,19 @@ internal val layoutVideoFingerprint = fingerprint { ) literal { layoutVideo } } + +internal val showEndscreenCardsFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("L") + custom { method, classDef -> + classDef.methods.count() == 5 + && method.containsLiteralInstruction(0) + && method.containsLiteralInstruction(5) + && method.containsLiteralInstruction(8) + && method.indexOfFirstInstruction { + val reference = getReference() + reference?.type == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" + } >= 0 + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt similarity index 70% rename from patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt rename to patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt index d0dce4bd5..d09de1d2f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndscreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -11,6 +12,8 @@ import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -22,7 +25,7 @@ internal var layoutIcon = -1L internal var layoutVideo = -1L private set -private val hideEndscreenCardsResourcePatch = resourcePatch { +private val hideEndScreenCardsResourcePatch = resourcePatch { dependsOn( settingsPatch, resourceMappingPatch, @@ -30,7 +33,7 @@ private val hideEndscreenCardsResourcePatch = resourcePatch { ) execute { - addResources("youtube", "layout.hide.endscreencards.hideEndscreenCardsResourcePatch") + addResources("youtube", "layout.hide.endscreencards.hideEndScreenCardsResourcePatch") PreferenceScreen.PLAYER.addPreferences( SwitchPreference("revanced_hide_endscreen_cards"), @@ -45,16 +48,17 @@ private val hideEndscreenCardsResourcePatch = resourcePatch { } private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/HideEndscreenCardsPatch;" + "Lapp/revanced/extension/youtube/patches/HideEndScreenCardsPatch;" @Suppress("unused") -val hideEndscreenCardsPatch = bytecodePatch( +val hideEndScreenCardsPatch = bytecodePatch( name = "Hide end screen cards", description = "Adds an option to hide suggested video cards at the end of videos.", ) { dependsOn( sharedExtensionPatch, - hideEndscreenCardsResourcePatch, + hideEndScreenCardsResourcePatch, + versionCheckPatch ) compatibleWith( @@ -78,9 +82,24 @@ val hideEndscreenCardsPatch = bytecodePatch( addInstruction( insertIndex, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideEndscreen(Landroid/view/View;)V", + "invoke-static { v$viewRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCardView(Landroid/view/View;)V", ) } } + + if (is_19_43_or_greater) { + showEndscreenCardsFingerprint.method.addInstructionsWithLabels( + 0, + """ + invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCards()Z + move-result v0 + if-eqz v0, :show + return-void + :show + nop + """ + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index f94b27099..de715d06c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -27,6 +27,7 @@ import app.revanced.util.forEachLiteralValueInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstruction +import app.revanced.util.removeFromParent import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -127,7 +128,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch { ) if (hideShortsAppShortcut == true) { - shortsItem.parentNode.removeChild(shortsItem) + shortsItem.removeFromParent() } } @@ -138,7 +139,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch { ) if (hideShortsWidget == true) { - shortsItem.parentNode.removeChild(shortsItem) + shortsItem.removeFromParent() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 08450dc4d..463785754 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -161,7 +161,7 @@ val openShortsInRegularPlayerPatch = bytecodePatch( addInstructions( index + 1, """ - invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->overrideBackPressToExit(Z)Z + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->overrideBackPressToExit(Z)Z move-result v$register """ ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt index c532c57d4..19f0454ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt @@ -1,6 +1,8 @@ package app.revanced.patches.youtube.misc.gms internal object Constants { + internal const val YOUTUBE_MAIN_ACTIVITY_NAME = "com.google.android.apps.youtube.app.watchwhile.MainActivity" + const val YOUTUBE_PACKAGE_NAME = "com.google.android.youtube" const val REVANCED_YOUTUBE_PACKAGE_NAME = "app.revanced.android.youtube" } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index ee6750c60..083fdf2e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -164,7 +164,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig addInstruction( index + 1, - "invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->setToolbar(Landroid/widget/FrameLayout;)V" + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setToolbar(Landroid/widget/FrameLayout;)V" ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 86621209c..fd713626d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -38,6 +38,7 @@ var is_19_32_or_greater = false @Deprecated("19.34.42 is the lowest supported version") var is_19_33_or_greater = false private set +@Deprecated("19.34.42 is the lowest supported version") var is_19_34_or_greater = false private set var is_19_35_or_greater = false diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index 0131c9e59..2192f8016 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.misc.spoof -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference @@ -16,9 +15,20 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint -private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;" - val spoofVideoStreamsPatch = spoofVideoStreamsPatch( + extensionClassDescriptor = "Lapp/revanced/extension/youtube/patches/spoof/SpoofVideoStreamsPatch;", + mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + fixMediaFetchHotConfig = { + is_19_34_or_greater + }, + fixMediaFetchHotConfigAlternative = { + // In 20.14 the flag was merged with 20.03 start playback flag. + is_20_10_or_greater && !is_20_14_or_greater + }, + fixParsePlaybackResponseFeatureFlag = { + is_20_03_or_greater + }, + block = { compatibleWith( "com.google.android.youtube"( @@ -35,16 +45,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( versionCheckPatch ) }, - fixMediaFetchHotConfigChanges = { - is_19_34_or_greater - }, - fixMediaFetchHotConfigAlternativeChanges = { - // In 20.14 the flag was merged with 20.03 start playback flag. - is_20_10_or_greater && !is_20_14_or_greater - }, - fixParsePlaybackResponseFeatureFlag = { - is_20_03_or_greater - }, + executeBlock = { addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") @@ -61,6 +62,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( summaryKey = null, tag = "app.revanced.extension.youtube.settings.preference.SpoofStreamingDataSideEffectsPreference" ), + SwitchPreference("revanced_spoof_video_streams_av1"), ListPreference( key = "revanced_spoof_video_streams_language", // Language strings are declared in Setting patch. @@ -72,10 +74,5 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( ) ) ) - - mainActivityOnCreateFingerprint.method.addInstruction( - 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setClientOrderToUse()V" - ) } ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index bc985a70f..3b9097095 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -1,159 +1,36 @@ package app.revanced.patches.youtube.video.audio -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patches.all.misc.resources.addResources -import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint -import app.revanced.util.findMethodFromToString -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.insertLiteralOverride -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.immutable.ImmutableField -import com.android.tools.smali.dexlib2.immutable.ImmutableMethod -import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;" @Suppress("unused") -val forceOriginalAudioPatch = bytecodePatch( - name = "Force original audio", - description = "Adds an option to always use the original audio track.", -) { - dependsOn( - sharedExtensionPatch, - settingsPatch, - addResourcesPatch, - versionCheckPatch - ) - - compatibleWith( - "com.google.android.youtube"( - "19.34.42", - "20.07.39", - "20.13.41", - "20.14.43", +val forceOriginalAudioPatch = forceOriginalAudioPatch( + block = { + dependsOn( + sharedExtensionPatch, + settingsPatch, + versionCheckPatch ) - ) - execute { - addResources("youtube", "video.audio.forceOriginalAudioPatch") - - PreferenceScreen.VIDEO.addPreferences( - SwitchPreference( - key = "revanced_force_original_audio", - tag = "app.revanced.extension.youtube.settings.preference.ForceOriginalAudioSwitchPreference" + compatibleWith( + "com.google.android.youtube"( + "19.34.42", + "20.07.39", + "20.13.41", + "20.14.43", ) ) - - mainActivityOnCreateFingerprint.method.addInstruction( - 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setPreferredLanguage()V" - ) - - // Disable feature flag that ignores the default track flag - // and instead overrides to the user region language. - if (is_20_07_or_greater) { - selectAudioStreamFingerprint.method.insertLiteralOverride( - AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z" - ) - } - - formatStreamModelToStringFingerprint.let { - val isDefaultAudioTrackMethod = it.originalMethod.findMethodFromToString("isDefaultAudioTrack=") - val audioTrackDisplayNameMethod = it.originalMethod.findMethodFromToString("audioTrackDisplayName=") - val audioTrackIdMethod = it.originalMethod.findMethodFromToString("audioTrackId=") - - it.classDef.apply { - // Add a new field to store the override. - val helperFieldName = "patch_isDefaultAudioTrackOverride" - fields.add( - ImmutableField( - type, - helperFieldName, - "Ljava/lang/Boolean;", - // Boolean is a 100% immutable class (all fields are final) - // and safe to write to a shared field without volatile/synchronization, - // but without volatile the field can show stale data - // and the same field is calculated more than once by different threads. - AccessFlags.PRIVATE.value or AccessFlags.VOLATILE.value, - null, - null, - null - ).toMutable() - ) - - // Add a helper method because the isDefaultAudioTrack() has only 2 registers and 3 are needed. - val helperMethodClass = type - val helperMethodName = "patch_isDefaultAudioTrack" - val helperMethod = ImmutableMethod( - helperMethodClass, - helperMethodName, - listOf(ImmutableMethodParameter("Z", null, null)), - "Z", - AccessFlags.PRIVATE.value, - null, - null, - MutableMethodImplementation(6), - ).toMutable().apply { - addInstructionsWithLabels( - 0, - """ - iget-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; - if-eqz v0, :call_extension - invoke-virtual { v0 }, Ljava/lang/Boolean;->booleanValue()Z - move-result v3 - return v3 - - :call_extension - invoke-virtual { p0 }, $audioTrackIdMethod - move-result-object v1 - - invoke-virtual { p0 }, $audioTrackDisplayNameMethod - move-result-object v2 - - invoke-static { p1, v1, v2 }, $EXTENSION_CLASS_DESCRIPTOR->isDefaultAudioStream(ZLjava/lang/String;Ljava/lang/String;)Z - move-result v3 - - invoke-static { v3 }, Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean; - move-result-object v0 - iput-object v0, p0, $helperMethodClass->$helperFieldName:Ljava/lang/Boolean; - return v3 - """ - ) - } - methods.add(helperMethod) - - // Modify isDefaultAudioTrack() to call extension helper method. - isDefaultAudioTrackMethod.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.RETURN) - val register = getInstruction(index).registerA - - addInstructions( - index, - """ - invoke-direct { p0, v$register }, $helperMethodClass->$helperMethodName(Z)Z - move-result v$register - """ - ) - } - } - } - } -} + }, + fixUseLocalizedAudioTrackFlag = is_20_07_or_greater, + mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, + subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR, + preferenceScreen = PreferenceScreen.VIDEO, +) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index 1a7908772..b188238e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -14,8 +14,7 @@ internal val settingsMenuVideoQualityGroup = mutableSetOf() @Suppress("unused") val videoQualityPatch = bytecodePatch( name = "Video quality", - description = "Adds options to use the advanced video quality menu, set default video qualities, " + - "and disable video codecs such as VP9/HDR." + description = "Adds options to set default video qualities and always use the advanced video quality menu." ) { dependsOn( rememberVideoQualityPatch, diff --git a/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt index 61d7be350..b2d8ba287 100644 --- a/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -14,6 +14,13 @@ import java.nio.file.StandardCopyOption private val classLoader = object {}.javaClass.classLoader +/** + * Removes a node from its parent. + * + * @return The node that was removed (object this method was called on). + */ +fun Node.removeFromParent() : Node = parentNode.removeChild(this) + /** * Returns a sequence for all child nodes. */ @@ -70,8 +77,13 @@ fun ResourcePatchContext.copyResources( for (resourceGroup in resources) { resourceGroup.resources.forEach { resource -> val resourceFile = "${resourceGroup.resourceDirectoryName}/$resource" + val stream = inputStreamFromBundledResource(sourceResourceDirectory, resourceFile) + if (stream == null) { + throw IllegalArgumentException("Could not find resource: $resourceFile " + + "in directory: $sourceResourceDirectory") + } Files.copy( - inputStreamFromBundledResource(sourceResourceDirectory, resourceFile)!!, + stream, targetResourceDirectory.resolve(resourceFile).toPath(), StandardCopyOption.REPLACE_EXISTING, ) diff --git a/patches/src/main/resources/addresources/values-af-rZA/strings.xml b/patches/src/main/resources/addresources/values-af-rZA/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-af-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-af-rZA/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-am-rET/strings.xml b/patches/src/main/resources/addresources/values-am-rET/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-am-rET/strings.xml +++ b/patches/src/main/resources/addresources/values-am-rET/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index aebfa8fb4..d0db36d92 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -1,4 +1,5 @@ + + + اسم التطبيق + + مخصص + أيقونة التطبيق + أصلي + + ReVanced minimal + ReVanced مصغر + + مخصص + - فشلت الفحوصات + فشلت عمليات التحقق فتح الموقع الرسمي تجاهل <h5>لا يبدو أن هذا التطبيق قد تم تعديله من قبلك.</h5><br>قد لا يعمل هذا التطبيق بشكل صحيح، <b>قد يكون ضارًا أو حتى خطيرًا للاستخدام</b>.<br><br>تشير هذه الفحوصات إلى أن هذا التطبيق تم تعديله مسبقًا أو تم الحصول عليه من شخص آخر:<br><br><small>%1$s</small><br>يوصى بشدة بـ <b>إلغاء تثبيت هذا التطبيق وتعديله بنفسك</b> للتأكد من أنك تستخدم تطبيقًا معتمدًا وآمنًا.<p><br>في حالة تجاهل هذا التحذير، سيتم عرضه مرتين فقط. @@ -58,9 +71,9 @@ Second \"item\" text" مسح سجل البحث هل أنت متأكد أنك تريد مسح كل سجل البحث؟ نصائح البحث - "• انقر فوق مسار للتنقل إليه -• اضغط مطولاً على إعداد للتنقل إليه -• اضغط على Enter لحفظ استعلام بحث في السجل + "• انقر على مسار للانتقال إليه +• اضغط مطولًا على إعداد للانتقال إليه +• اضغط على Enter لحفظ استعلام البحث في السجل • يتجاهل البحث حالة الأحرف وعلامات الترقيم • تظهر الإعدادات الرئيسية فوق الإعدادات الفرعية المعطلة" سجل البحث فارغ @@ -81,7 +94,7 @@ Second \"item\" text" أنت تستخدم إصدار ReVanced Patches <i>%s</i> ملاحظة - هذه النسخة هي إصدار مسبق وقد تواجه مشكلات غير متوقعة + هذه النسخة هي إصدار ما قبل الإصدار وقد تواجه مشكلات غير متوقعة الروابط الرسمية @@ -94,7 +107,7 @@ Second \"item\" text" الإجراء مطلوب "لا يملك MicroG GmsCore صلاحية التشغيل في الخلفية. -اتبع دليل \"لا تقتل تطبيقي\" لهاتفك، وطبّق التعليمات لتثبيت MicroG. +اتبع دليل \"لا تغلق تطبيقي\" لهاتفك، وطبّق التعليمات على تثبيت MicroG. هذا مطلوب لعمل التطبيق." فتح الموقع @@ -108,18 +121,25 @@ Second \"item\" text" Spoof Video Streams تزييف تدفقات الفيديو الخاصة بالعميل لمنع حدوث مشكلات أثناء التشغيل - انتحال بثوث الفيديو - انتحال بثوث الفيديو الخاصة بالعميل لمنع مشكلات التشغيل + Spoof Video Streams + تزييف بثوث الفيديو الخاصة بالعميل لمنع مشكلات التشغيل Spoof Video Streams - "تدفقات الفيديو مزورة + "يتم تزييف تدفقات الفيديو إذا كنت مستخدمًا لـ YouTube Premium، فقد لا يكون هذا الإعداد مطلوبًا" - "لم يتم انتحال بثوث الفيديو + "لا يتم تزييف تدفقات الفيديو -قد لا يعمل التشغيل" +قد لا يعمل تشغيل الفيديو" قد يؤدي إيقاف تشغيل هذا الإعداد إلى مشكلات في التشغيل. العميل الافتراضي + + فرض لغة الصوت الأصلية + استخدام لغة الصوت الأصلية + استخدام الصوت الافتراضي + + لاستخدام هذه الميزة، غيّر \'Spoof Video Streams إلى أي عميل باستثناء Android Studio + تصحيح الأخطاء تمكين أو تعطيل خيارات تصحيح الأخطاء @@ -147,18 +167,18 @@ Second \"item\" text" تطهير روابط المشاركة - تمت إزالة معلمة استعلام التتبع من الروابط المشتركة - لم تتم إزالة معلمة استعلام التتبع من الروابط المشتركة + تمت إزالة معلمة استعلام التتبع من الروابط عند المشاركة + لم تتم إزالة معلمة استعلام التتبع من الروابط عند المشاركة تغيير روابط المشاركة إلى youtube.com - تستخدم الروابط المشتركة youtube.com - تستخدم الروابط المشتركة music.youtube.com + تستخدم روابط المشاركة youtube.com + تستخدم روابط المشاركة music.youtube.com لمحة الإعلانات - مُصغَّرات فيديو بديلة + مصغرات فيديو بديلة الموجز عام المشغل @@ -205,23 +225,23 @@ Second \"item\" text" تم إخفاء مربع التمويل الجماعي يتم عرض مربع التمويل الجماعي إخفاء البطاقة القابلة للتوسيع - البطاقة القابلة للتوسيع أسفل مقاطع الفيديو مخفية - البطاقة القابلة للتوسيع أسفل مقاطع الفيديو معروضة + تم إخفاء البطاقة القابلة للتوسيع أسفل مقاطع الفيديو + يتم عرض البطاقة القابلة للتوسيع أسفل مقاطع الفيديو إخفاء زر الميكروفون العائم - زر الميكروفون العائم في البحث مخفي - يظهر زر الميكروفون العائم في البحث + تم إخفاء زر الميكروفون العائم في البحث + يتم عرض زر الميكروفون العائم في البحث إخفاء الرفوف الأفقية - "الأرفف الأفقية مخفية، مثل: + "تم إخفاء الأرفف الأفقية، مثل: • الأخبار العاجلة • متابعة المشاهدة • استكشاف المزيد من القنوات • الأكثر صلة • التسوق -• شاهدها مرة أخرى" - الأرفف الأفقية معروضة +• أريد أن اشاهدها مرة أخرى" + يتم عرض الأرفف الأفقية إخفاء رف الصور - رف الصور في نتائج البحث مخفي - رف الصور في نتائج البحث معروض + تم إخفاء رف الصور في نتائج البحث + يتم عرض رف الصور في نتائج البحث إخفاء آخر المشاركات تم إخفاء أحدث المشاركات يتم عرض أحدث المشاركات @@ -234,33 +254,33 @@ Second \"item\" text" إخفاء زر \'تنبيهي\' - زر إشعاري مخفي - زر إشعاري معروض + تم إخفاء زر تنبيهي + يتم عرض زر تنبيهي إخفاء هيّا نلعب تم إخفاء هيّا نلعب يتم عرض هيّا نلعب إخفاء زر \'عرض المزيد\' - زر إظهار المزيد في نتائج البحث مخفي - زر إظهار المزيد في نتائج البحث معروض + تم إخفاء زر عرض المزيد في نتائج البحث + يتم إظهار زر عرض المزيد في نتائج البحث إخفاء الاستبيانات - الاستطلاعات مخفية - الاستطلاعات معروضة + تم إخفاء الاستبيانات + يتم عرض الاستبيانات إخفاء رف التذاكر تم إخفاء رف التذاكر يتم عرض رف التذاكر إخفاء تسميات توصيات الفيديو - تسميات \'شاهد المستخدمون أيضاً\' و\'قد يعجبك أيضاً\' في نتائج البحث مخفية - تسميات \'شاهد المستخدمون أيضاً\' و\'قد يعجبك أيضاً\' في نتائج البحث معروضة + تم إخفاء تسميات \'شاهد المستخدمون أيضًا\' و\'قد يعجبك أيضًا\' في نتائج البحث + يتم عرض تسميات \'شاهد المستخدمون أيضًا\' و\'قد يعجبك أيضًا\' في نتائج البحث إخفاء رسومات YouTube - رسوم Doodles المتحركة في شعار YouTube مخفية - يتم عرض رسوم متحركة Doodles من YouTube على الشعار - "تظهر \"\"Doodles\"\" على YouTube بضعة أيام كل عام. + تم إخفاء رسوم Doodles المتحركة على شعار YouTube + يتم عرض رسوم Doodles المتحركة على شعار YouTube + "تظهر رسومات YouTube Doodles لعدة أيام كل عام. -إذا كان يتم عرض \"Doodle\" حاليًا في منطقتك وإذا كان إعداد الإخفاء هذا قيد التشغيل، فسيتم أيضًا إخفاء شريط التصفية أسفل شريط البحث." +إذا كانت رسومات Doodles تظهر حاليًا في منطقتك وكان إعداد الإخفاء هذا قيد التشغيل، فسيتم أيضًا إخفاء شريط الفلتر الموجود أسفل شريط البحث." إخفاء شريط القناة تم إخفاء شريط القناة يتم عرض شريط القناة @@ -276,17 +296,17 @@ Second \"item\" text" إخفاء زر الانضمام - زر الانضمام مخفي - زر الانضمام معروض + تم إخفاء زر الانضمام + يتم عرض زر الانضمام إخفاء اللوحات الطبية تم إخفاء اللوحات الطبية يتم عرض اللوحات الطبية إخفاء الإجراءات السريعة - الإجراءات السريعة في وضع ملء الشاشة مخفية - الإجراءات السريعة في وضع ملء الشاشة معروضة - إخفاء مقاطع الفيديو ذات الصلة - مقاطع الفيديو ذات الصلة في الإجراءات السريعة مخفية - مقاطع الفيديو ذات الصلة في الإجراءات السريعة معروضة + تم إخفاء الإجراءات السريعة في ملء الشاشة + يتم عرض الإجراءات السريعة في ملء الشاشة + إخفاء الفيديوهات ذات الصلة + تم إخفاء الفيديوهات ذات الصلة في الإجراءات السريعة + يتم عرض الفيديوهات ذات الصلة في الإجراءات السريعة إخفاء إرشادات المشتركين تم إخفاء إرشادات مجتمع المشتركين يتم عرض إرشادات مجتمع المشتركين @@ -294,11 +314,11 @@ Second \"item\" text" تم إخفاء ردود الفعل المؤقتة يتم عرض ردود الفعل المؤقتة إخفاء \'ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي\' - قسم ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي مخفي - قسم ملخص الفيديو الذي تم إنشاؤه بواسطة الذكاء الاصطناعي معروض - إخفاء \"Ask\" - تم إخفاء قسم \"Ask\" - يتم عرض قسم \"Ask\" + تم إخفاء قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI + يتم عرض قسم ملخص الفيديو الذي تم إنشاؤه بواسطة AI + إخفاء طرح سؤال + تم إخفاء قسم طرح سؤال + يتم عرض قسم طرح سؤال إخفاء الصفات تم إخفاء أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون يتم عرض أقسام الأماكن المميزة، الألعاب، الموسيقى والأشخاص المذكورون @@ -323,65 +343,65 @@ Second \"item\" text" وصف الفيديو إخفاء أو عرض مكونات وصف الفيديو شريط التصفية - إخفاء أو إظهار شريط الفلترة في الموجزات ومقاطع الفيديو ذات الصلة ونتائج البحث وسجل المشاهدة + إخفاء أو عرض شريط الفلترة في الموجزات والفيديوهات ذات الصلة ونتائج البحث وسجل المشاهدة إخفاء في الموجز مخفي في الموجز - معروض في الموجز + يُعرض في الموجز إخفاء في الفيديوهات ذات الصلة مخفي في الفيديوهات ذات الصلة يُعرض في الفيديوهات ذات الصلة إخفاء في نتائج البحث مخفي في نتائج البحث يُعرض في نتائج البحث - إخفاء في سجل المشاهدة - مخفي في سجل المشاهدة - معروض في سجل المشاهدة + إخفاء في السجلّ + مخفي في السجلّ + يُعرض في السجلّ صفحة القناة - إخفاء أو إظهار مكونات صفحة القناة + إخفاء أو عرض مكونات صفحة القناة إخفاء رف \'مقترحات لك\' - رف \"لك\" مخفي - رف \"لك\" معروض + تم إخفاء رف مقترح لك + يتم عرض رف مقترح لك إخفاء معاينة الروابط - معاينة الروابط مخفية - معاينة الروابط معروضة + تم إخفاء معاينة الروابط + يتم عرض معاينة الروابط إخفاء رف الأعضاء - رف الأعضاء مخفي + تم إخفاء رف الأعضاء يتم عرض رف الأعضاء - إخفاء زر \"زيارة المنتدى\" - زر \"زيارة المنتدى\" مخفي - زر زيارة المجتمع معروض + إخفاء زر \'زيارة المجتمع\' + تم إخفاء زر زيارة المجتمع + يتم عرض زر زيارة المجتمع - إخفاء زر \'زيارة المتجر\' على صفحات القناة - زر زيارة المتجر مخفي - زر زيارة المتجر معروض + إخفاء زر \'زيارة المتجر\' + تم إخفاء زر زيارة المتجر + يتم عرض زر زيارة المتجر التعليقات إخفاء أو عرض مكونات قسم التعليقات - إخفاء ملخص الدردشة بالذكاء الاصطناعي - ملخص الدردشة بالذكاء الاصطناعي مخفي - ملخص الدردشة بالذكاء الاصطناعي معروض + إخفاء ملخص محادثات الذكاء الاصطناعي + تم إخفاء ملخص محادثة الذكاء الاصطناعي + يتم عرض ملخص محادثة الذكاء الاصطناعي إخفاء ملخص تعليقات الذكاء الاصطناعي - ملخص تعليقات الذكاء الاصطناعي مخفي - ملخص تعليقات الذكاء الاصطناعي معروض + تم إخفاء ملخص تعليقات الذكاء الاصطناعي + يتم عرض ملخص تعليقات الذكاء الاصطناعي إخفاء إرشادات القناة - إرشادات القناة مخفية - إرشادات القناة معروضة - إخفاء رأس \'تعليقات الأعضاء\' + تم إخفاء إرشادات القناة + يتم عرض إرشادات القناة + إخفاء علامة \'تعليقات بواسطة الأعضاء\' تم إخفاء علامة تعليقات من الأعضاء يتم عرض علامة تعليقات من الأعضاء إخفاء قسم التعليقات تم إخفاء قسم التعليقات يتم عرض قسم التعليقات - إخفاء إرشادات المنتدى - إرشادات المجتمع مخفية - إرشادات المجتمع معروضة + إخفاء إرشادات المجتمع + تم إخفاء إرشادات المجتمع + يتم عرض إرشادات المجتمع إخفاء زر \'إنشاء Short\' تم إخفاء زر إنشاء Short يتم عرض زر إنشاء Short إخفاء أزرار الرموز التعبيرية والطابع الزمني - أزرار الرموز التعبيرية والطابع الزمني مخفية - أزرار الرموز التعبيرية والطابع الزمني معروضة + تم إخفاء أزرار الرموز التعبيرية والطوابع الزمنية + يتم عرض أزرار الرموز التعبيرية والطوابع الزمنية إخفاء تعليق المعاينة تم إخفاء تعليق المعاينة يتم عرض تعليق المعاينة @@ -398,28 +418,28 @@ Second \"item\" text" قائمة سلاسل منشئ مسار المكونات المراد تصفيتها مفصولة بسطر جديد فلتر مخصص غير صالح: %s إخفاء عدد المشاهدات - عدد المشاهدات مخفي في الموجز ونتائج البحث - عدد المشاهدات ظاهر في الموجز ونتائج البحث + تم إخفاء عدد المشاهدات في الموجز ونتائج البحث + يتم عرض عدد المشاهدات في الموجز ونتائج البحث - "قيود: + "القيود: • رفوف Shorts وصفحات القنوات ونتائج البحث قد تظل تعرض أعداد المشاهدات -• هذه الميزة لا تعمل مع عامل الشكل الخاص بالسيارات" +• هذه الميزة لا تعمل مع عامل الشكل Automotive" إخفاء وقت التحميل - وقت التحميل مخفي في الخلاصة ونتائج البحث - وقت التحميل معروض في الخلاصة ونتائج البحث + تم إخفاء وقت التحميل في الموجز ونتائج البحث + يتم عرض وقت التحميل في الموجز ونتائج البحث "القيود: • قد تظل أرفف Shorts وصفحات القنوات ونتائج البحث تُظهر أوقات التحميل -• هذه الميزة لا تعمل مع عامل شكل السيارات" - إخفاء محتوى الكلمات المفتاحية +• هذه الميزة لا تعمل مع عامل الشكل Automotive" + إخفاء محتوى بالكلمات المفتاحية إخفاء فيديوهات البحث والموجز باستخدام فلاتر الكلمات المفتاحية إخفاء فيديوهات الصفحة الرئيسية بواسطة الكلمات المفتاحية - تتم تصفية الفيديوهات في علامة التبويب \"الصفحة الرئيسية\" حسب الكلمات المفتاحية - لا تتم تصفية الفيديوهات في علامة التبويب \"الصفحة الرئيسية\" حسب الكلمات المفتاحية + تتم تصفية الفيديوهات في علامة التبويب \'الصفحة الرئيسية\' حسب الكلمات المفتاحية + لا تتم تصفية الفيديوهات في علامة التبويب \'الصفحة الرئيسية\' حسب الكلمات المفتاحية إخفاء نتائج البحث عن طريق الكلمات المفتاحية يتم تصفية نتائج البحث حسب الكلمات المفتاحية لا يتم تصفية نتائج البحث حسب الكلمات المفتاحية - إخفاء الفيديوهات الخاصة بالاشتراك عن طريق الكلمات المفتاحية + إخفاء الفيديوهات الخاصة بالاشتراكات عن طريق الكلمات المفتاحية يتم تصفية الفيديوهات في علامة التبويب الاشتراكات حسب الكلمات المفتاحية لا يتم تصفية الفيديوهات في علامة التبويب الاشتراكات حسب الكلمات المفتاحية الكلمات المفتاحية المراد إخفاؤها @@ -430,7 +450,7 @@ Second \"item\" text" يمكن أن تكون الكلمات عبارة عن أسماء قنوات أو أي نص يظهر في عناوين الفيديوهات يجب إدخال الكلمات التي تحتوي على أحرف كبيرة في المنتصف بنفس الحالة (على سبيل المثال: iPhone, TikTok, LeBlanc)" - حول تصفية الكلمات المفتاحية + لمحة عن تصفية الكلمات المفتاحية "الصفحة الرئيسية/الاشتراكات/نتائج البحث يتم تصفيتها لإخفاء المحتوى الذي يتطابق مع كلمات البحث القيود @@ -439,21 +459,21 @@ Second \"item\" text" • البحث عن كلمة ما قد لا يعطي نتائج" مطابقة الكلمات بأكملها - سيؤدي وضع علامة اقتباس مزدوجة حول كلمة رئيسية/عبارة إلى منع التطابقات الجزئية لعناوين الفيديو وأسماء القنوات.<br><br>على سبيل المثال،<br><b>\"ai\"</b> سيخفي الفيديو: <b>How does AI work?</b><br>ولكن لن يخفي: <b>What does fair use mean?</b> + سيؤدي وضع علامة اقتباس مزدوجة حول كلمة مفتاحية/عبارة إلى منع التطابقات الجزئية لعناوين الفيديو وأسماء القنوات<br><br>على سبيل المثال،<br><b>\"ai\"</b> سيخفي الفيديو: <b>How does AI work?</b><br><b>ولكن لن يخفي:<b>What does fair use mean?</b> لا يمكن استخدام الكلمة المفتاحية: %s إضافة اقتباسات لاستخدام الكلمة المفتاحية: %s - الكلمة المفتاحية لها بيانات متضاربة: %s + الكلمة المفتاحية بها تعريفات متعارضة: %s الكلمة المفتاحية قصيرة جدًا وتتطلب اقتباسات: %s الكلمة المفتاحية سوف تخفي جميع الفيديوهات: %s - إخفاء رف متجر المبدع - رف متجر المنشئ أسفل مشغل الفيديو مخفي - يتم عرض رف متجر المنشئ تحت مشغل الفيديو + إخفاء رف متجر المنشئ + تم إخفاء رف متجر المنشئ أسفل مشغل الفيديو + يتم عرض رف متجر المنشئ أسفل مشغل الفيديو إخفاء لافتة شاشة المتجر النهائية - لافتة متجر الشاشة النهائية مخفية - لافتة متجر الشاشة النهائية معروضة + تم إخفاء لافتة المتجر بالشاشة النهائية + يتم عرض لافتة المتجر بالشاشة النهائية إخفاء إعلانات ملء الشاشة "يتم إخفاء إعلانات ملء الشاشة @@ -474,11 +494,11 @@ Second \"item\" text" تم إخفاء بطاقات الرعاية الذاتية يتم عرض بطاقات الرعاية الذاتية إخفاء روابط التسوق - روابط التسوق في وصف الفيديو مخفية + تم إخفاء روابط التسوق في وصف الفيديو يتم عرض روابط التسوق في وصف الفيديو إخفاء لافتة \'عرض المنتجات\' - لافتة عرض المنتجات في تراكب الفيديو مخفية - لافتة عرض المنتجات في تراكب الفيديو معروضة + تم إخفاء لافتة عرض المنتجات في واجهة الفيديو + يتم عرض لافتة عرض المنتجات في واجهة الفيديو إخفاء نتائج بحث الويب تم إخفاء نتائج البحث على الويب يتم عرض نتائج البحث على الويب @@ -511,8 +531,8 @@ Second \"item\" text" تعطيل النافذة المنبثقة لتسجيل الدخول إلى التلفزيون - النافذة المنبثقة لتسجيل الدخول إلى التلفزيون معطلة - النافذة المنبثقة لتسجيل الدخول إلى التلفزيون مفعلة + تم تعطيل نافذة تسجيل الدخول إلى التلفزيون + تم تمكين نافذة تسجيل الدخول إلى التلفزيون تعطيل تخطي الفصل بالنقر المزدوج @@ -526,7 +546,7 @@ Second \"item\" text" يتم عرض زر التنزيل في المشغل لا يتم عرض زر التنزيل في المشغل - تجاوز زر إجراء التنزيل + تجاوز زر إجراء زر التنزيل يفتح زر التنزيل أداة التنزيل الخارجية يفتح زر التنزيل أداة التنزيل الأصلية داخل التطبيق اسم حزمة أداة التنزيل @@ -542,8 +562,8 @@ Second \"item\" text" تعطيل إيماءة التمرير الدقيقة - تم تعطيل الإيماءة - تم تمكين الإيماءة + تم تعطيل إيماءة التمرير الدقيقة + تم تمكين إيماءة التمرير الدقيقة تمكين النقر للتمرير @@ -551,19 +571,19 @@ Second \"item\" text" تم تعطيل النقر للتمرير - التحكم بالسطوع عن طريق ايماءة التمرير - "تم تمكين التمرير السريع لضبط السطوع في وضع ملء الشاشة + تمكين إيماءة السطوع + "تم تمكين إيماءة مستوى السطوع في وضع ملء الشاشة -اضبط السطوع عن طريق التمرير عموديًا على الجانب الأيسر من الشاشة" - تم تعطيل التمرير السريع لضبط السطوع في وضع ملء الشاشة - تمكين التحكم بالصوت عن طريق إيماءة التمرير - "تم تمكين التمرير السريع لضبط مستوى الصوت في وضع ملء الشاشة +اضبط مستوى السطوع بالتمرير عموديًا على يسار الشاشة" + تم تعطيل إيماءة مستوى السطوع في وضع ملء الشاشة + تمكين إيماءة الصوت + "تم تمكين إيماءة مستوى الصوت في وضع ملء الشاشة اضبط مستوى الصوت عن طريق التمرير عموديًا على الجانب الأيمن من الشاشة" - تم تعطيل التمرير السريع لضبط مستوى الصوت في وضع ملء الشاشة - تمكين الضغط على إيماءة التمرير السريع - تم تمكين الضغط للتمرير السريع - تم تعطيل الضغط للتمرير السريع + تم تعطيل إيماءة مستوى الصوت في وضع ملء الشاشة + تمكين الضغط لتمرير الإيماءة + تم تمكين الضغط لتمرير الإيماءة + تم تعطيل الضغط لتمرير الإيماءة الاهتزاز عند الضغط تم تمكين الاهتزاز عند الضغط تم تعطيل الاهتزاز عند الضغط @@ -576,29 +596,29 @@ Second \"item\" text" تلقائي مهلة واجهة التمرير مقدار الوقت الذي تظهر فيه واجهة التمرير بعد التغيير بجزء الثانية - تعتيم خلفية واجهة التمرير السريع - قيمة التعتيم بين 0-100 - يجب أن يكون تعتيم التمرير السريع بين 0-100 - لون سطوع واجهة التمرير - لون شريط التقدم لعناصر التحكم في السطوع - لون مستوى صوت واجهة التمرير - لون شريط التقدم لعناصر التحكم في مستوى الصوت - حجم نص واجهة التمرير - حجم النص لواجهة التمرير بين 1-30 + تعتيم خلفية واجهة التمرير + قيمة الشفافية بين 0-100 + يجب أن تكون شفافية التمرير بين 0-100 + لون نمط إيماءة السطوع + لون شريط عناصر التحكم في مستوى السطوع + لون نمط إيماءة الصوت + لون شريط عناصر التحكم في مستوى الصوت + حجم نص نمط إيماءة التمرير + حجم النص لنمط التمرير بين 1-30 يجب أن يكون حجم النص بين 1-30 مقدار حد التمرير - الحد الأدنى من التمرير قبل اكتشاف الإيماءة - حساسية إيماءة تمرير مستوى الصوت + مقدار الحد الأقصى لحدوث التمرير + حساسية تمرير مستوى الصوت مقدار تغير مستوى الصوت لكل تمريرة نمط واجهة التمرير - واجهة أفقية - واجهة أفقية (الأدنى - الأعلى) - واجهة أفقية (الأدنى - المنتصف) - واجهة دائرية - واجهة دائرية (الأدنى) - واجهة عمودية - واجهة عمودية (الأدنى) - تمكين إيماءة التمرير لتغيير الفيديو + النمط الافقي + النمط الأفقي (الأدنى - الأعلى) + النمط الأفقي (الأدنى - المنتصف) + النمط الدائري + النمط الدائري (الأدنى) + النمط العمودي + النمط العمودي (الأدنى) + تمكين إيماءة التمرير لتغيير الفيديوهات سيؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق لن يؤدي التمرير في وضع ملء الشاشة إلى التغيير للفيديو التالي/السابق @@ -610,9 +630,9 @@ Second \"item\" text" أزرار الإجراء إخفاء أو عرض الأزرار تحت الفيديوهات - إيقاف تفعيل توهج الإعجاب والاشتراك - لن يتوهَّج زرّي أعجبني واشتراك عند ذكرهما - سيتوهَّج زرّي أعجبني واشتراك عند ذكرهما + تعطيل توهج الإعجاب والاشتراك + لن يتوهج زر أعجبني والاشتراك عند الإشارة إليه + سيتوهَّج زر أعجبني والاشتراك عند الإشارة إليه إخفاء أعجبني ولم يعجبني تم إخفاء أزرار أعجبني ولم يعجبني يتم عرض أزرار أعجبني ولم يعجبني @@ -622,55 +642,55 @@ Second \"item\" text" يتم عرض زر مشاركة إخفاء إيقاف الإعلانات - زر إيقاف الإعلانات مخفي - زر إيقاف الإعلانات معروض + تم إخفاء زر إيقاف الإعلانات + يتم عرض زر إيقاف الإعلانات إخفاء التعليقات - زر التعليقات مخفي - زر التعليقات ظاهر + تم إخفاء زر التعليقات + يتم عرض زر التعليقات - إخفاء الإبلاغ - تم إخفاء زر الإبلاغ - يتم عرض زر الإبلاغ + إخفاء إبلاغ + تم إخفاء زر إبلاغ + يتم عرض زر إبلاغ إخفاء ريمكس تم إخفاء زر ريمكس يتم عرض زر ريمكس - إخفاء التنزيل - تم إخفاء زر التنزيل - يتم عرض زر التنزيل + إخفاء تنزيل + تم إخفاء زر تنزيل + يتم عرض زر تنزيل - إخفاء الضجة - زر الضجة مخفي - يظهر زر الحماس + إخفاء التشجيع + تم إخفاء زر التشجيع + يتم عرض زر التشجيع إخفاء الترويج - زر الترويج مخفي - زر الترويج ظاهر + تم إخفاء زر الترويج + يتم عرض زر الترويج إخفاء شكرًا تم إخفاء زر شكرًا يتم عرض زر شكرًا - إخفاء \"Ask\" - تم إخفاء زر \"Ask\" - يتم عرض زر \"Ask\" + إخفاء طرح سؤال + تم إخفاء زر طرح سؤال + يتم عرض زر طرح سؤال إخفاء المقطع - تم إخفاء زر إنشاء مقطع - يتم عرض زر إنشاء مقطع + تم إخفاء زر المقطع + يتم عرض زر المقطع إخفاء المتجر - زر المتجر مخفي - زر المتجر معروض + تم إخفاء زر المتجر + يتم عرض زر المتجر إخفاء حفظ - زر الحفظ مخفي - زر الحفظ معروض + تم إخفاء زر حفظ + يتم عرض زر حفظ أزرار التنقل @@ -684,7 +704,7 @@ Second \"item\" text" تم إخفاء زر Shorts يتم عرض زر Shorts - إخفاء الإنشاء + إخفاء إنشاء تم إخفاء زر الإنشاء يتم عرض زر الإنشاء @@ -695,7 +715,7 @@ Second \"item\" text" تم إخفاء زر الإشعارات يتم عرض زر الإشعارات - تبديل الإنشاء مع الإشعارات + تبديل الإنشاء بالإشعارات "تم تبديل زر الإنشاء بـزر الإشعارات ملاحظة: يؤدي تمكين هذا أيضًا إلى إخفاء إعلانات الفيديو بالقوة" @@ -721,17 +741,17 @@ Second \"item\" text" القائمة المنبثقة إخفاء أو عرض عناصر قائمة المشغل المنبثقة - اخفاء التَرْجَمَة - تم إخفاء قائمة التَرْجَمَة - يتم عرض قائمة التَرْجَمَة + إخفاء الترجمة + تم إخفاء قائمة الترجمة + يتم عرض قائمة الترجمة - إخفاء الإعدادات الإضافية - تم إخفاء قائمة الإعدادات الإضافية - يتم عرض قائمة الإعدادات الإضافية + إخفاء إعدادات إضافية + تم إخفاء قائمة إعدادات إضافية + يتم عرض قائمة إعدادات إضافية - إخفاء مؤقت النوم - تم إخفاء قائمة مؤقت النوم - يتم عرض قائمة مؤقت النوم + إخفاء مؤقِّت إيقاف التشغيل + تم إخفاء قائمة مؤقِّت إيقاف التشغيل + يتم عرض قائمة مؤقِّت إيقاف التشغيل إخفاء تكرار الفيديو تم إخفاء قائمة تكرار الفيديو @@ -758,23 +778,23 @@ Second \"item\" text" يتم عرض قائمة المزيد من المعلومات إخفاء شاشة القفل - تم إخفاء قائمة قفل الشاشة - يتم عرض قائمة قفل الشاشة + تم إخفاء قائمة شاشة القفل + يتم عرض قائمة شاشة القفل إخفاء المقطع الصوتي تم إخفاء قائمة المقطع الصوتي يتم عرض قائمة المقطع الصوتي - "قائمة المسارات الصوتية مخفية + "تم إخفاء قائمة المقطع الصوتي -لعرض قائمة المسارات الصوتية، غيّر 'تزييف تدفقات الفيديو' إلى iPadOS" +لعرض قائمة المقطع الصوتي، غيّر 'Spoof video streams' إلى iPadOS" إخفاء المشاهدة في VR تم إخفاء قائمة المشاهدة في الوضع الافتراضي يتم عرض قائمة المشاهدة في الوضع الافتراضي إخفاء قائمة جودة الفيديو - قائمة جودة الفيديو مخفية - قائمة جودة الفيديو معروضة + تم إخفاء قائمة جودة الفيديو + يتم عرض قائمة جودة الفيديو إخفاء تذييل قائمة جودة الفيديو تم إخفاء تذييل قائمة جودة الفيديو يتم عرض تذييل قائمة جودة الفيديو @@ -784,20 +804,20 @@ Second \"item\" text" تم إخفاء زر التشغيل التلقائي يتم عرض زر التشغيل التلقائي - إخفاء زر التَرْجَمَة - تم إخفاء زر التَرْجَمَة - يتم عرض زر التَرْجَمَة + إخفاء زر الترجمة + تم إخفاء زر الترجمة + يتم عرض زر الترجمة إخفاء زر البث تم إخفاء زر البث يتم عرض زر البث إخفاء خلفية عناصر التحكم بالمشغل - خلفية عناصر تحكم المشغل مخفية - يتم عرض خلفية عناصر التحكم بالمشغل - إخفاء زري \"السابق\" و \"التالي\" - تم إخفاء الأزرار - يتم عرض الأزرار + تم إخفاء خلفية عناصر تحكم المشغل + يتم عرض خلفية عناصر تحكم المشغل + إخفاء أزرار السابق & التالي + تم إخفاء أزرار السابق & التالي + يتم عرض أزرار السابق & التالي - + إخفاء بطاقات شاشة النهاية تم إخفاء بطاقات شاشة النهاية يتم عرض بطاقات شاشة النهاية @@ -822,37 +842,37 @@ Second \"item\" text" تم إخفاء شريط تقدم الفيديو يتم عرض شريط تقدم الفيديو - إخفاء شريط تقدم صور مصغرة للفيديو - شريط تقدم صور مصغرة للفيديو مخفي - شريط تقدم صور مصغرة للفيديو معروض + إخفاء شريط تقدم مصغرات الفيديو + تم إخفاء شريط تقدم مصغرات الفيديو + يتم عرض شريط تقدم مصغرات الفيديو مشغل Shorts - إخفاء أو إظهار مكونات مشغل Shorts + إخفاء أو عرض مكونات مشغل Shorts إخفاء Shorts في الصفحة الرئيسية - مخفية في الصفحة الرئيسية ومقاطع الفيديو ذات الصلة - معروضة في الصفحة الرئيسية ومقاطع الفيديو ذات الصلة + مخفي في موجز الصفحة الرئيسية والفيديوهات ذات الصلة + يُعرض في موجز الصفحة الرئيسية والفيديوهات ذات الصلة إخفاء Shorts في نتائج البحث - مخفية في نتائج البحث - تُعرض في نتائج البحث + مخفي في نتائج البحث + يُعرض في نتائج البحث - إخفاء Shorts في خلاصة الاشتراكات - مخفية في خلاصة الاشتراكات - معروضة في خلاصة الاشتراكات - إخفاء Shorts في سجل المشاهدة - مخفية في سجل المشاهدة - تُعرض في سجل المشاهدة - إخفاء زر Super Thanks - زر شراء Super Thanks مخفي - زر شراء Super Thanks معروض + إخفاء Shorts في موجز الاشتراكات + مخفي في موجز الاشتراكات + يُعرض في موجز الاشتراكات + إخفاء Shorts في السجلّ + مخفي في السجلّ + يُعرض في السجلّ + إخفاء زر شراء Super Thanks + تم إخفاء زر شراء Super Thanks + يتم عرض زر شراء Super Thanks إخفاء زر التأثير - زر التأثير مخفي - زر التأثير معروض + تم إخفاء زر التأثير + يتم عرض زر التأثير إخفاء زر الشاشة الخضراء تم إخفاء زر الشاشة الخضراء يتم عرض زر الشاشة الخضراء - إخفاء زر الهاشتاج + إخفاء زر هاشتاج تم إخفاء زر الهاشتاج يتم عرض زر الهاشتاج @@ -862,9 +882,9 @@ Second \"item\" text" إخفاء تسمية الموقع تم إخفاء تسمية الموقع يتم عرض تسمية الموقع - إخفاء زر \"مشاركات جديدة\" - تم إخفاء زر \"مشاركات جديدة\" - يتم عرض زر \"مشاركات جديدة\" + إخفاء زر المنشورات الجديدة + تم إخفاء زر المنشورات الجديدة + يتم عرض زر المنشورات الجديدة إخفاء أزرار واجهة التوقف تم إخفاء أزرار واجهة التوقف يتم عرض أزرار واجهة التوقف @@ -893,11 +913,11 @@ Second \"item\" text" تم إخفاء زر القادم يتم عرض زر القادم إخفاء زر استخدام هذا الصوت - زر استخدام هذا الصوت مخفي - زر استخدام هذا الصوت معروض - إخفاء زر استخدام هذا القالب - زر استخدام هذا القالب مخفي - زر استخدام هذا القالب ظاهر + تم إخفاء زر استخدام هذا الصوت + يتم عرض زر استخدام هذا الصوت + إخفاء زر استخدام النموذج + تم إخفاء زر استخدم هذا النموذج + يتم عرض زر استخدم هذا النموذج إخفاء التأثير الفوّار لـزر أعجبني تم إخفاء التأثير الفوّار لـزر أعجبني يتم عرض التأثير الفوّار لـزر أعجبني @@ -928,11 +948,11 @@ Second \"item\" text" تم إخفاء شريط القناة يتم عرض شريط القناة إخفاء عنوان الفيديو - عنوان الفيديو مخفي - عنوان الفيديو معروض + تم إخفاء عنوان الفيديو + يتم عرض عنوان الفيديو إخفاء تسمية بيانات التعريف الصوتية - تسمية بيانات تعريف الصوت مخفية - تسمية بيانات تعريف الصوت معروضة + تم إخفاء تسمية بيانات التعريف الصوتية + يتم عرض تسمية بيانات التعريف الصوتية إخفاء تسمية رابط الفيديو تم إخفاء تسمية رابط الفيديو يتم عرض تسمية رابط الفيديو @@ -949,9 +969,9 @@ Second \"item\" text" يتم عرض الفيديو المقترح في شاشة النهاية - إخفاء تراكب مقاطع الفيديو ذات الصلة - تراكب مقاطع الفيديو ذات الصلة في وضع ملء الشاشة مخفي - تراكب مقاطع الفيديو ذات الصلة في وضع ملء الشاشة معروض + إخفاء واجهة الفيديوهات ذات الصلة + تم إخفاء واجهة الفيديوهات ذات الصلة في ملء الشاشة + يتم عرض واجهة الفيديوهات ذات الصلة في ملء الشاشة إخفاء الطابع الزمني للفيديو @@ -984,7 +1004,7 @@ Second \"item\" text" لم يعجبني غير متاح مؤقتًا (انتهت مهلة API) لم يعجبني غير متاح (الحالة %d) - مرات عدم الإعجاب غير متوفرة (حد واجهة برمجة تطبيقات العميل) + عدد مرات لم يعجبني غير متوفر (حد API للعميل) لم يعجبني غير متاح (%s) أعد تحميل الفيديو للتصويت بـ Return YouTube Dislike @@ -993,31 +1013,31 @@ Second \"item\" text" يتم عرض لم يعجبني لا يتم عرض لم يعجبني عرض لم يعجني في فيديوهات Shorts - "يتم عرض مرات عدم الإعجاب في فيديوهات Shorts + "يتم عرض عدد مرات لم يعجبني في فيديوهات Shorts -التقييد: قد لا تظهر مرات عدم الإعجاب في وضع التصفح المتخفي" - لا يتم عرض مرات عدم الإعجاب في فيديوهات Shorts +التقييد: قد لا تظهر مرات لم يعجبني في وضع التصفح المتخفي" + لا يتم عرض مرات لم يعجبني على فيديوهات Shorts لم يعجبني كــ نسبة مئوية - يتم عرض مرات عدم الإعجاب كنسبة مئوية - يتم عرض مرات عدم الإعجاب كرقم + يعرض عدد لم يعجبني كـ نسبة مئوية + يتم عرض عدد لم يعجبني كـ رَقَم مقاس زر أعجبني زر أعجبني مصمم لأدنى عرض زر أعجبني مصمم لأفضل مظهر عرض الإعجابات المقدرة - يتم عرض عدد تقديري للإعجابات في مقاطع الفيديو التي تم تعطيل الإعجابات فيها + يتم عرض عدد تقديري للإعجابات في الفيديوهات التي تم تعطيل الإعجابات فيها لا يتم عرض عدد الإعجابات المقدرة عرض ملاحظة إذا كان API غير متاح يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike لا يتم عرض الملاحظة في حالة عدم توفر Return YouTube Dislike يتم توفير البيانات بواسطة the Return YouTube Dislike API. اضغط هنا لمعرفة المزيد - ReturnYouTubeDislike API إحصائيات هذا الجهاز + إحصائيات واجهة برمجيات ReturnYouTubeDislike لهذا الجهاز وقت استجابة API، متوسط وقت استجابة API، الحد الأدنى وقت استجابة API، الحد الأقصى - وقت استجابة API، الفيديو الأخير - غير متوفر مؤقتًا - حد معدل API للعميل ساري المفعول + وقت استجابة API، آخر فيديو + لم يعجبني غير متوفر مؤقتًا - حد معدل API للعميل ساري المفعول API جلب الأصوات وعدد الاتصالات لم يتم إجراء اتصالات الشبكة %d اتصالات شبكية أجريت @@ -1049,7 +1069,7 @@ Second \"item\" text" تمكين SponsorBlock - SponsorBlock مانِع الرُعَاة هو نظام جماعي لتخطي الأجزاء المُمِلَّة في مقاطع YouTube + مانع الرُعَاة هو نظام جماعي لتخطي الأجزاء المزعجة من فيديوهات YouTube المظهر عرض زر التصويت يتم عرض زر التصويت على المقطع @@ -1065,12 +1085,12 @@ Second \"item\" text" إخفاء زر التخطي بعد بضع ثوانٍ يتم عرض زر التخطي للمقطع بأكمله مدة زر التخطي - كم المدة لعرض أزرار التخطي والتخطي إلى التمييز قبل الإخفاء التلقائي - إظهار إشعار التراجع عن التخطي - يظهر إشعار عند تخطي مقطع تلقائيًا. انقر على الإشعار للتراجع عن التخطي - لا يتم عرض التوست - مدة توست التخطي - كم المدة لعرض رسالة التراجع عن التخطي المنبثقة + كم من الوقت يجب إظهار أزرار التخطي والتخطي للأبرز قبل إخفائها تلقائيًا + عرض التراجع عن التخطي + تظهر ملاحظة عند تخطي مقطع تلقائيًا. انقر على الملاحظة للتراجع عن التخطي + لا يتم عرض الملاحظة + مدة ملاحظة التخطي + المدة اللازمة لإظهار التراجع عن التخطي ثانية واحدة ثانيتان 3 ثوانٍ @@ -1082,19 +1102,19 @@ Second \"item\" text" 9 ثوانٍ 10 ثوانٍ عرض مدة الفيديو بدون المقاطع - يتم عرض طول الفيديو مطروحًا منه جميع المقاطع على شريط التقدم + يعرض مدة الفيديو ناقصًا منه جميع المقاطع على شريط التقدم يتم عرض مدة الفيديو كاملةً إنشاء مقاطع جديدة عرض زر إنشاء مقطع جديد يتم عرض زر إنشاء مقطع جديد لا يتم عرض زر إنشاء مقطع جديد تعديل تقديم او تأخير المقطع الجديد - أجزاء الثانية التي تتحرك فيها أزرار ضبط الوقت عند إنشاء مقاطع جديدة + أجزاء الثانية في الوقت الذي تتحرك فيها أزرار ضبط الوقت عند إنشاء مقاطع جديدة يجب أن تكون القيمة رقمًا موجبًا عرض الإرشادات - الإرشادات تحتوي على نصائح حول تقديم المقاطع - توجد إرشادات - من المستحسن قراءة الإرشادات لمانع الرعاة قبل تقديم أي مقطع + الإرشادات تتضمن قواعد ونصائح لإنشاء مقاطع جديدة + اتبع الإرشادات + من المستحسن قراءة الإرشادات لـ SponsorBlock قبل تقديم أي مقطع تمت قراءتها اعرضها لي عام @@ -1103,11 +1123,11 @@ Second \"item\" text" لا يتم عرض ملاحظة في حالة عدم توفر SponsorBlock تمكين تتبع مرات التخطي يُتيح لـ SponsorBlock Leaderboard معرفة مقدار الوقت الذي وفره المشاهدين، يتم إعلام الخادم في كل مرة تتخطى فيها مقطعًا - تم تعطيل تتبع مرات التخطي + تتبع عدد مرات التخطي غير مفعل الحد الأدنى لمدة المقطع لن يتم عرض المقاطع الأقصر من هذه القيمة (بالثواني) أو تخطيها المدة الزمنية غير صالحة - معرف المستخدم الفريد الخاص بك + معرف المستخدم User ID الفريد الخاص بك يجب أن يبقى هذا خاصًا. انه مثل كلمة المرور ولا ينبغي مشاركته مع أي شخص. إذا كان شخص ما يملك هذا، فيمكنه انتحال شخصيتك يجب أن يكون معرف المستخدم الخاص 30 حرفًا على الأقل تغيير عنوان API @@ -1140,11 +1160,11 @@ Second \"item\" text" فاصل زمني بدون محتوى فعلي. قد يكون توقفًا مؤقتًا، أو إطارًا ثابتًا، أو رسومًا متحركة متكررة. لا يتضمن انتقالات تحتوي على معلومات الخاتمة / تترات النهاية تتر النهاية أو عندما تظهر بطاقات نهاية YouTube، نهايات غير منطوقة. ليس للاستنتاجات مع المعلومات - مقدمة / تحيات + تحية / وداع مقاطع دعائية مروية للفيديو القادم، تحيات ووداعات. لا تشمل الأقسام التي تضيف محتوى إضافيًا معاينة / ملخص مجموعة من المقاطع التي توضح ما هو قادم أو ما حدث في الفيديو أو في مقاطع فيديو أخرى من السلسلة، حيث تتكرر جميع المعلومات في مكان آخر - استطراد / نكات + خارج الموضوع / نكات مشاهد أو نكات جانبية غير ضرورية لفهم المحتوى الرئيسي للفيديو. لا تشمل الأقسام التي توفر سياقًا أو تفاصيل خلفية الموسيقى: مقطع غير موسيقي فقط للاستخدام في المقاطع الموسيقية. أقسام المقاطع الموسيقية بدون موسيقى، والتي لم يتم تغطيتها بالفعل من قبل فئة أخرى @@ -1162,7 +1182,7 @@ Second \"item\" text" تخطي النظرة العامة تخطي النظرة العامة تخطي الملخص - تخطي الجزء الجانبي + تخطي مقطع غير ذي صلة تخطي غير الموسيقى تخطي المقطع تم تخطي الراعي @@ -1177,13 +1197,13 @@ Second \"item\" text" تم تخطي النظرة العامة تم تخطي النظرة العامة تم تخطي الملخص - تم تخطي الجزء الجانبي + تم تخطي مقطع غير ذي صلة تم تخطي جزء غير موسيقي تم تخطي المقطع الغير المرسل تم تخطي عدة مقاطع التخطي تلقائيًا التخطي تلقائيًا مرة واحدة - عرض زر \"التخطي\" + عرض زر التخطي عرض في شريط تقدم الفيديو تعطيل غير قادر على إرسال المقطع: الحالة: %s @@ -1234,14 +1254,14 @@ Second \"item\" text" الوقت المحدد غير صحيح إحصائيات - الإحصائيات غير متوفرة مؤقتًا (الواجهة غير متوفرة) + الإحصائيات غير متوفرة مؤقتًا (API معطل) جارٍ التحميل... تم تعطيل SponsorBlock اسم المستخدم الخاص بك: <b>%s</b> اضغط هنا لتغيير اسم المستخدم الخاص بك غير قادر على تغيير اسم المستخدم: الحالة: %1$d %2$s تم تغيير اسم المستخدم بنجاح - سمعتك هي <b>%.2f</b> + سمعتك <b>%.2f</b> لقد أنشأت <b>%s</b> مقطع اضغط هنا لعرض المقاطع الخاصة بك متصدرين SponsorBlock @@ -1257,14 +1277,14 @@ Second \"item\" text" الشفافية: اللون: لمحة - يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد ومشاهدة التنزيلات لمنصات أخرى + يتم توفير البيانات بواسطة SponsorBlock API. انقر هنا لمعرفة المزيد والتنزيل لمنصات أخرى شكل نموذج التخطيط الافتراضي الجوّال الجهاز اللوحي - السيارات + Automotive "التغييرات تشمل: تصميم الجهاز اللوحي @@ -1275,7 +1295,7 @@ Second \"item\" text" • يتم تنظيم الموجز حسب المواضيع والقنوات" - خِداع إصدار التطبيق + إصدار تطبيق وهمي تم تغيير اصدار التطبيق لم يتم تغيير اصدار التطبيق "سيتم تغيير إصدار التطبيق إلى إصدار قديم من YouTube. @@ -1298,7 +1318,7 @@ Second \"item\" text" استكشف الموضة & التجميل ألعاب - السّجل + السجلّ المكتبة الفيديوهات التي أعجبتني مباشر @@ -1318,7 +1338,7 @@ Second \"item\" text" تغيير صفحة البداية دائمًا "يتم تغيير صفحة البداية دائمًا -القيد: قد لا يعمل استخدام زر الرجوع على شريط الأدوات" +التقييد: قد لا يعمل استخدام زر الرجوع على شريط الأدوات" يتم تغيير صفحة البداية فقط عند بدء تشغيل التطبيق @@ -1380,8 +1400,8 @@ Second \"item\" text" إخفاء أزرار التخطي للأمام والخلف تم إخفاء تخطي للأمام والخلف يتم عرض تخطي للأمام والخلف - الحجم الأولي - الحجم الأولي على الشاشة، بالبكسل + تهيئة الحجم + تهيئة الحجم على الشاشة، بالبكسل حجم البكسل يجب أن يكون بين %1$s و %2$s شفافية الواجهة قيمة الشفافية بين 0-100، حيث يكون 0 شفاف @@ -1399,16 +1419,18 @@ Second \"item\" text" يتم عرض لون شريط تقدم الفيديو الاصلي لون شريط تقدم الفيديو المخصص لون شريط التقدم - لون مميز لشريط التقدم المخصص - اللون المميز لشريط التقدم + لون تمييز شريط التقدم المخصص + لون تمييز شريط التقدم لون شريط التقدم غير صالح + + - شعار الرأس - افتراضي - عادي - - ريـفانسد بسيط + علامة الشعار + الافتراضي + القياسي + + ReVanced minimal مخصص @@ -1427,8 +1449,8 @@ Second \"item\" text" علامة التبويب أنت قوائم تشغيل المشغل والتوصيات نتائج البحث - المصّغرات الأصلية - DeArrow & المصّغرات الأصلية + المصغرات الأصلية + DeArrow & المصغرات الأصلية DeArrow & اللقطات الثابتة اللقطات الثابتة "يوفر DeArrow مصغرات فيديو من مصادر جماعية لفيديوهات YouTube. هذه المصغرات غالبًا ما تكون أكثر صلة من تلك المقدمة من YouTube @@ -1437,14 +1459,14 @@ Second \"item\" text" اضغط هنا لمعرفة المزيد عن DeArrow" عرض ملاحظة إذا كان API غير متاح - يتم عرض ملاحظة إذا كان DeArrow غير متوفر - لا يتم عرض ملاحظة إذا كان DeArrow غير متوفر - نقطة نهاية واجهة برمجة تطبيقات DeArrow - عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت للصور المصغرة لـ DeArrow + يتم عرض ملاحظة إذا كان DeArrow غير متاح + لا يتم عرض ملاحظة إذا كان DeArrow غير متاح + DeArrow API Endpoint + عنوان URL لنقطة نهاية ذاكرة التخزين المؤقت لمصغرات DeArrow لقطات الفيديو الثابتة يتم التقاط اللقطات الثابتة من بداية/وسط/نهاية كل فيديو. هذه الصور مدمجة في YouTube ولا يتم استخدام أي واجهة برمجة تطبيقات خارجية - استخدم اللقطات الثابتة السريعة - استخدام اللقطات متوسطة الجودة. سيتم تحميل المُصغَّرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مُصغَّرات فارغة + استخدام اللقطات الثابتة السريعة + استخدام اللقطات متوسطة الجودة. سيتم تحميل المصغرات بشكل أسرع، ولكن البث المباشر و الفيديوهات التي لم يتم إصدارها أو القديمة جدًا قد تعرض مصغرات فارغة استخدام لقطات الفيديو الثابتة بجودة عالية وقت الفيديو لأخذ اللقطات الثابتة منه بداية الفيديو @@ -1463,25 +1485,25 @@ Second \"item\" text" تجاهل - تفعيل تكرار الفيديو + تمكين تكرار الفيديو سيتم تكرار الفيديو لن يتم تكرار الفيديو - إظهار زر تكرار الفيديو - الزر ظاهر - الزر غير ظاهر + عرض زر تكرار الفيديو + يتم عرض الزر + لا يتم عرض الزر تكرار الفيديو قيد التشغيل تكرار الفيديو متوقف - محاكاة أبعاد الجهاز - "تم محاكاة أبعاد الجهاز + تزوير أبعاد الجهاز + "تم تزييف أبعاد الجهاز قد يتم فتح قفل جودة الفيديو العالية ولكن قد تواجه تقطعًا في تشغيل الفيديو وعمر بطارية أسوأ وتأثيرات جانبية غير معروفة" - "أبعاد الجهاز غير محاكاة + "أبعاد الجهاز غير مزيفة -يمكن أن يؤدي تفعيل هذا إلى فتح جودة أعلى للفيديو" +تفعيل هذا يمكن أن يفتح جودات فيديو أعلى" قد يؤدي تمكين هذا إلى تباطؤ تشغيل الفيديو وتدهور عمر البطارية وآثار جانبية غير معروفة. @@ -1489,19 +1511,19 @@ Second \"item\" text" تغيير الاهتزاز عند الضغط تعطيل الاهتزاز للفصول تم تعطيل الاهتزاز للفصول - تم تفعيل الاهتزاز للفصول + تم تمكين الاهتزاز للفصول تعطيل الاهتزاز عند التمرير الدقيق - تم تعطيل الاهتزاز الدقيق عند البحث - تم تفعيل الاهتزاز عند التمرير الدقيق - تعطيل الاهتزاز عند التراجع عن البحث - تم تعطيل الاهتزاز عند التراجع عن البحث - تم تمكين الاهتزاز عند التراجع عن البحث + تم تعطيل الاهتزاز الدقيق عند التمرير + تم تمكين الاهتزاز عند التمرير الدقيق + تعطيل اهتزاز التراجع عن التمرير + تم تعطيل اهتزاز التراجع عن التمرير + تم تمكين اهتزاز التراجع عن التمرير تعطيل الاهتزاز عند التكبير تم تعطيل الاهتزاز عند التكبير تم تمكين الاهتزاز عند التكبير - إذا قمت مؤخرًا بتغيير تفاصيل تسجيل الدخول إلى حسابك، فأزل تثبيت MicroG ثم أعد تثبيته. + إذا قمت مؤخرًا بتغيير تفاصيل تسجيل الدخول إلى حسابك، فقم بإلغاء تثبيت MicroG وإعادة تثبيته. تجاوز إعادة توجيه URL @@ -1513,22 +1535,15 @@ Second \"item\" text" فتح الروابط في متصفح خارجي فتح الروابط في متصفح داخل التطبيق - - فرض لغة الصوت الأصلية - استخدام لغة الصوت الأصلية - استخدام الصوت الافتراضي - - لاستخدام هذه الميزة، غيّر \"تزوير تدفقات الفيديو\" إلى أي عميل باستثناء Android Studio - تلقائي تذكر تغييرات جودة الفيديو تنطبق تغييرات الجودة على جميع الفيديوهات تنطبق تغييرات الجودة على الفيديو الحالي فقط - إظهار إشعار عند تغيير جودة الفيديو - يتم إظهار إشعار عند تغيير جودة الفيديو الافتراضية - لا يتم إظهار إشعار عند تغيير جودة الفيديو الافتراضية + عرض ملاحظة عند تغيير جودة الفيديو + يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية + لا يتم عرض ملاحظة عند تغيير جودة الفيديو الافتراضية جودة الفيديو الافتراضية على شبكة Wi-Fi جودة الفيديو الافتراضية على شبكة الجوَّال تذكر تغييرات جودة Shorts @@ -1543,36 +1558,36 @@ Second \"item\" text" عرض زر مربع حوار السرعة - الزر معروض. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي + يتم عرض الزر. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي لا يتم عرض الزر عرض زر جودة الفيديو - الزر معروض. انقر مع الاستمرار لإعادة تعيين الجودة إلى الافتراضي - الزر غير معروض + يتم عرض الزر. انقر مع الاستمرار لإعادة تعيين الجودة إلى الوضع الافتراضي + لا يتم عرض الزر قائمة سرعة التشغيل المخصصة يتم عرض قائمة سرعة التشغيل المخصصة لا يتم عرض قائمة سرعة التشغيل المخصصة استعادة قائمة سرعة التشغيل القديمة - قائمة السرعة القديمة معروضة - قائمة السرعة الحديثة معروضة + يتم عرض قائمة سرعة التشغيل القديمة + يتم عرض قائمة سرعة التشغيل الحديثة سرعة التشغيل المخصصة - إضافة أو تغيير سرعة التشغيل المخصصة + إضافة أو تغيير سرعات التشغيل المخصصة يجب أن تكون سرعات التشغيل المخصصة أقل من %s - سرعة التشغيل المخصصة غير صالحة + سرعات التشغيل المخصصة غير صالحة تلقائي سرعة النقر مع الاستمرار المخصصة سرعة التشغيل بين 0-8 - تذكر التغيرات في سرعة التشغيل + تذكر تغييرات سرعة التشغيل تطبيق تغييرات سرعة التشغيل على جميع الفيديوهات تطبيق تغييرات سرعة التشغيل فقط على الفيديو الحالي - إظهار إشعار عند تغيير سرعة التشغيل - يتم إظهار إشعار عند تغيير سرعة التشغيل الافتراضية - لا يتم عرض إشعار عند تغيير سرعة التشغيل الافتراضية. + عرض ملاحظة عند تغيير سرعة التشغيل + يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية + لا يتم عرض ملاحظة عند تغيير سرعة التشغيل الافتراضية سرعة التشغيل الافتراضية تغيير السرعة الافتراضية إلى: %s @@ -1604,10 +1619,18 @@ Second \"item\" text" تم تعطيل التمرير للتقديم أو الترجيع - الآثار الجانبية للتزوير + السماح لـ Android VR AV1 + "برنامج ترميز الفيديو هو AVC (H.264) أو VP9 أو AV1 + +قد يحدث تقطيع أو فقدان للإطارات أثناء التشغيل" + برنامج ترميز الفيديو هو AVC (H.264) أو VP9 + "قد يؤدي تمكين هذا الإعداد إلى استخدام فك ترميز AV1 برمجيًا. + +قد يتلعثم تشغيل الفيديو بتقنية AV1 أو يفقد بعض الإطارات." + التأثيرات الجانبية للتزييف • عميل تجريبي وقد يتوقف عن العمل في أي وقت • قد يتوقف الفيديو عند 1:00، أو قد لا يكون متاحًا في بعض المناطق - • قائمة المسارات الصوتية مفقودة + • قائمة المقطع الصوتي مفقودة • لا يوجد ترميز الفيديو AV1 • مستوى الصوت الثابت غير متاح • قد لا يتم تشغيل الفيديوهات المخصصة للأطفال عند تسجيل الخروج أو عند استخدام وضع التصفح المتخفي @@ -1618,14 +1641,16 @@ Second \"item\" text" تم إخفاء نوع العميل في إحصاءات تقنية لغة بث الصوت - لتحديد لغة صوتية معينة، قم بإيقاف تشغيل \"فرض لغة الصوت الأصلية\" + لتحديد لغة صوتية معينة، قم بإيقاف تشغيل \'فرض لغة الصوت الأصلية\' اختيار لغة البث غير متاح مع Android Studio + + - حول - إعلانات + لمحة + الإعلانات عام المشغل متنوعة @@ -1633,7 +1658,7 @@ Second \"item\" text" إخفاء إعلانات الفيديو تم إخفاء إعلانات الفيديو - تم عرض إعلانات الفيديو + يتم عرض إعلانات الفيديو تمكين التكرار الدائم @@ -1641,22 +1666,22 @@ Second \"item\" text" تم تعطيل التكرار الدائم - إخفاء زر الإرسال - زر الإرسال مخفي - زر الإرسال ظاهر + إخفاء زر البث + تم إخفاء زر البث + يتم عرض زر البث إخفاء شريط الفئات - شريط الفئات مخفي - شريط الفئات معروض + تم إخفاء شريط الفئات + يتم عرض شريط الفئات شريط التنقل إخفاء أزرار شريط التنقل أو تغييرها - إخفاء الرئيسية - زر \"الرئيسية\" مخفي - زر \"الرئيسية\" ظاهر + إخفاء الصفحة الرئيسية + تم إخفاء زر الصفحة الرئيسية + يتم عرض زر الصفحة الرئيسية إخفاء المقاطع زر \"المقتطفات\" مخفي @@ -1693,22 +1718,22 @@ Second \"item\" text" - منع الإعلانات الصوتية - تم منع الإعلانات الصوتية - تم إلغاء منع الإعلانات الصوتية + حظر الإعلانات الصوتية + تم حظر الإعلانات الصوتية + تم إلغاء حظر الإعلانات الصوتية - %s غير متوفر. قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. - قام خادم %s بإرجاع خطأ. قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. - منع إعلانات الفيديو المضمنة + %s غير متوفر، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. + قام خادم %s بإرجاع خطأ، قد تظهر الإعلانات. حاول التبديل إلى خدمة منع إعلانات أخرى في الإعدادات. + حظر إعلانات الفيديو المضمنة معطّل Luminous Proxy PurpleAdBlock Proxy - منع إعلانات الفيديو - تم منع إعلانات الفيديو - تم إلغاء منع إعلانات الفيديو + حظر إعلانات الفيديو + تم حظر إعلانات الفيديو + يتم إلغاء حظر إعلانات الفيديو تم حذف الرسالة diff --git a/patches/src/main/resources/addresources/values-as-rIN/strings.xml b/patches/src/main/resources/addresources/values-as-rIN/strings.xml index 487d0ef80..4f1e6a7a1 100644 --- a/patches/src/main/resources/addresources/values-as-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-as-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -35,6 +41,9 @@ Second \"item\" text" + + + @@ -136,7 +145,7 @@ Second \"item\" text" - + @@ -201,8 +210,10 @@ Second \"item\" text" + + - + @@ -229,9 +240,6 @@ Second \"item\" text" - - - @@ -255,6 +263,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index 9db6d36d4..0fe290e92 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -1,4 +1,5 @@ + + + Tətbiq adı + + Fərdi + Tətbiq ikonu + Orijinal + + Ən kiçik ReVanced + ReVanced ölçüləndirilmiş + + Fərdi + Yoxlamalar uğursuz oldu Xidməti veb saytı aç @@ -65,9 +78,9 @@ Second \"item\" text" • Valideyn tənzimləmələri qapadılan uşaq tənzimləmələrin üstündə görünür" Axtarış tarixçəsi boşdur Axtarış tarixçəsini saxlamaq üçün axtarış sorğusu yazın və Daxil Et basın - Axtarış tarixçəsi tənzimləməsin göstər - Axtarış tarixçəsi tənzimləməsi göstərilir - Axtarış tarixçəsi tənzimləməsi göstərilmir + Tənzimləmə axtarış tarixçəsin göstər + Tənzimləmə axtarış tarixçəsi göstərilir + Tənzimləmə axtarış tarixçəsi görünmür ReVanced tənzimləmə nişanların göstər Tənzimləmə nişanları göstərilir Tənzimləmə nişanları göstərilmir @@ -120,6 +133,13 @@ Oynatma işləməyə bilər" Bu tənzimləməni qapatmaq oynatma problemlərinə səbəb ola bilər. İlkin qəbuledici + + Orijinal səs dilini zorla + Orijinal səs dilini istifadə + İlkin səs istifadəsi + + Bu funksiyanı istifadə etmək üçün \"Video yayımları saxtalaşdırı\" Android Studio savayı istənilən qəbulediciyə dəyiş + Sazlama Sazlama seçimlərini aktiv/qeyri-aktiv et @@ -361,7 +381,7 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Sİ söhbət xülasəsini gizlət Sİ söhbət xülasəsi gizlidir Sİ söhbət xülasəsi görünür - AI Ṣərhlər Xülasəsini Gizlət + AI şərhlər xülasəsini gizlət Sİ şərhlər xülasəsi gizlidir Sİ şərhlər xülasəsi görünür Kanal təlimatlarını gizlət @@ -398,19 +418,19 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum Yeni sətirlə ayrılmış filtr üçün element yol qurucusu sətirlərinin siyahısı Etibarsız fərdi filtr: %s Baxış sayını gizlət - Baxış sayı lentdə və axtarış nəticələrində gizlədilib - Baxış sayı lentdə və axtarış nəticələrində göstərilib + Baxış sayı axın və axtarış nəticələrində gizlidir + Baxış sayı axın və axtarış nəticələrində görünür "Məhdudiyyətlər: -• Shorts rəfləri, kanal səhifələri və axtarış nəticələri hələ də baxış saylarını göstərə bilər -• Bu funksiya avtomobil form faktoru ilə işləmir" - Yükləmə vaxtını gizlət - Yükləmə vaxtı lentdə və axtarış nəticələrində gizlədilib - Yükləmə vaxtı lentdə və axtarış nəticələrində göstərilir +• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yenə də baxış sayını göstərə bilər +• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" + Yüklənilmə vaxtını gizlət + Yüklənilmə vaxtı axın və axtarış nəticələrində gizlidir + Yüklənilmə vaxtı axın və axtarış nəticələrində göstərilir "Məhdudiyyətlər: -• Shorts rəflərində, kanal səhifələrində və axtarış nəticələrində yükləmə vaxtları hələ də göstərilə bilər -• Bu funksiya avtomobil form faktoru ilə işləmir" +• Shorts bölmələri, kanal səhifələri və axtarış nəticələri yüklənilən vaxtı yenə də göstərə bilər +• Bu xüsusiyyət avtomobil forma göstərici ilə işləmir" Açar söz məzmununu gizlət Açar söz filtrləri ilə axtarış və axın videolarını gizlət Ev videolarını açar sözlərə görə gizlət @@ -797,7 +817,7 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"ı Düymələr gizlidir Düymələr göstərilir - + Son ekran kartlarını gizlət Son ekran kartları gizlidir Son ekran kartları göstərilir @@ -862,7 +882,7 @@ Səs treki menyusunu göstərmək üçün \"Video yayımları saxtalaşdır\"ı Məkan etiketini gizlət Məkan etiketi gizlidir Məkan etiketi göstərilir - Yeni elanları gizlət düyməsi + Yeni elanlar düyməsini gizlət Yeni elanlar düyməsi gizlidir Yeni elanlar düyməsi göstərilir Dayandırma örtük düymələrini gizlət @@ -1402,11 +1422,13 @@ Kiçik oynadıcı ekrandan sola və ya sağa sürüklənə bilər" İrəliləyiş cizgisi vurğu rəngi Etibarsız irəliləmə cizgisi rəng dəyəri + + Başlıq simvolu İlkin Müntəzəm - + Ən kiçik ReVanced Fərdi @@ -1512,13 +1534,6 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər Xarici brauzerdə bağlantıların açılması Tətbiqdaxili brauzerdə bağlantıların açılması - - Orijinal səs dilini zorla - Orijinal səs dilini istifadə - İlkin səs istifadəsi - - Bu funksiyanı istifadə etmək üçün \"Video yayımları saxtalaşdırı\" Android Studio savayı istənilən qəbulediciyə dəyiş - Avtomatik @@ -1603,6 +1618,14 @@ Məhdudiyyətlər: Axtarmaq üçün sürüşdürmə aktiv deyil + Android VR AV1-ə icazə ver + "Video kodek AVC (H.264), VP9 və ya AV1-dir + +Oxutma kəsilə bilər və ya kadrlar atıla bilər" + Video kodek AVC (H.264) və ya VP9-dur + "Bu ayarı aktivləşdirmək proqram təminatı AV1 dekodlaşdırmasından istifadə edə bilər. + +AV1 ilə video oxutma kəsilə bilər və ya kadrlar atıla bilər." Saxtakarlıq yan təsirləri • Təcrübi qəbuledici və hər vaxt işləməyi dayandıra bilər • Video 01:00-da dayana bilər və ya bəzi bölgələrdə mövcud olmaya bilər @@ -1622,6 +1645,8 @@ Məhdudiyyətlər: + + Haqqında Reklamlar diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index a2b78898c..39e9966c7 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -1,4 +1,5 @@ + + + Назва праграмы + + Карыстальніцкая + Значок праграмы + Арыгінал + + ReVanced мінімальны + ReVanced маштабаваны + + Карыстальніцкі + Праверкі не пройдзены Адкрыць афіцыйны вэб-сайт @@ -120,6 +133,13 @@ Second \"item\" text" Адключэнне гэтай налады можа выклікаць праблемы з прайграваннем. Клиент по умолчанию + + Вымушаная арыгінальная мова аўдыё + Выкарыстоўваць арыгінальную мову аўдыя + Выкарыстанне аўдыё па змаўчанні + + Каб выкарыстаць гэтую функцыю, змяніце \'Падмена відэаструменяў\' на любога кліента, акрамя Android Studio + Адладка Уключыць або выключыць параметры адладкі @@ -797,7 +817,7 @@ Second \"item\" text" Кнопкі схаваныя Паказваюцца кнопкі - + Схаваць карткі канцавога экрана Карткі канцавога экрана схаваны Паказваюцца карткі канцавога экрана @@ -1404,11 +1424,13 @@ Second \"item\" text" Акцэнтны колер пошуку Неверное значение цвета ползунка прогресса + + Лагатып загалоўка Па змаўчанні Звычайны - + ReVanced мінімальны Карыстальніцкі @@ -1514,13 +1536,6 @@ Second \"item\" text" Адкрыццё спасылак у знешнім браўзеры Адкрыццё спасылак ва ўбудаваным браўзеры - - Вымушаная арыгінальная мова аўдыё - Выкарыстоўваць арыгінальную мову аўдыя - Выкарыстанне аўдыё па змаўчанні - - Каб выкарыстаць гэтую функцыю, змяніце \'Падмена відэаструменяў\' на любога кліента, акрамя Android Studio - Аўто @@ -1605,6 +1620,14 @@ Second \"item\" text" Слайд для пошуку не ўключаны + Дазволіць Android VR AV1 + "Відэакодэк — AVC (H.264), VP9 або AV1 + +Праграмаванне можа заікацца або прапускаць кадры" + Відэакодэк — AVC (H.264) або VP9 + "Уключэнне гэтай налады можа выкарыстоўваць праграмнае дэкадаванне AV1. + +Прайграванне відэа з AV1 можа заікацца або прапускаць кадры." Пабочныя эфекты падробкі • Эксперыментальны кліент і можа спыніць працу ў любы час • Відэа можа спыніцца на 1:00, ці можа быць недаступным у некаторых рэгіёнах @@ -1624,6 +1647,8 @@ Second \"item\" text" + + Пра Рэклама diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index 98b86283a..49826e283 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -1,4 +1,5 @@ + + + Име на приложението + + Персонализиран + Икона на приложението + Оригинален + + ReVanced минимален + ReVanced мащабиран + + Персонализиран + Проверката е неуспешна Отворете официалния уебсайт @@ -120,6 +133,13 @@ Second \"item\" text" Изключването на тази настройка може да причини проблеми с възпроизвеждането. Клиент по подразбиране + + Принудително оригинално аудио език + Използване на оригиналния език на аудиото + Използване на аудио по подразбиране + + За да използвате тази функция, променете \'Фалшифициране на видео потоци\' на всеки клиент, освен Android Studio + Отстраняване на грешки Активиране или деактивиране на отстраняването на грешки @@ -797,7 +817,7 @@ Second \"item\" text" Бутоните са скрити Бутоните се показват - + Скриване на препоръките в края Препоръките в края са скрити Препоръките в края се показват @@ -1403,11 +1423,13 @@ Second \"item\" text" Цветът на лентата за търсене Невалидна стойност за цвят на лентата на прогреса + + Лого в заглавката По подразбиране Обикновено - + ReVanced минимално По избор @@ -1513,13 +1535,6 @@ Second \"item\" text" Отваряне на връзки във външен браузър Отваряне на връзки във вграден браузър - - Принудително оригинално аудио език - Използване на оригиналния език на аудиото - Използване на аудио по подразбиране - - За да използвате тази функция, променете \'Фалшифициране на видео потоци\' на всеки клиент, освен Android Studio - Авто @@ -1604,6 +1619,14 @@ Second \"item\" text" Слайд за превъртане е деактивиран + Разрешаване на Android VR AV1 + "Видеокодекът е AVC (H.264), VP9 или AV1 + +Възпроизвеждането може да заеква или да пропуска кадри" + Видеокодекът е AVC (H.264) или VP9 + "Разрешаването на тази настройка може да използва софтуерно AV1 декодиране. + +Възпроизвеждането на видео с AV1 може да заеква или да пропуска кадри." Странични ефекти от подменянето • Експериментален клиент и може да спре да работи по всяко време • Видеото може да спре на 1:00 или може да не е налично в някои региони @@ -1623,6 +1646,8 @@ Second \"item\" text" + + Относно Реклами diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index 7ff0637ce..6a4d757a6 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -1,4 +1,5 @@ + + + অ্যাপের নাম + + কাস্টম + অ্যাপ আইকন + মূল + + রিভ্যান্সড মিনিমাল + রিভ্যান্সড স্কেলড + + কাস্টম + চেক ফেইল করেছে অফিশ্যাল ওয়েবসাইট খুলুন @@ -120,6 +133,13 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ এই সেটিং বন্ধ করলে প্লেব্যাক সমস্যা হতে পারে। ডিফল্ট ক্লায়েন্ট + + মূল অডিও ভাষা বলপূর্বক চালু করুন + মূল অডিও ভাষা ব্যবহার করা হচ্ছে + ডিফল্ট অডিও ব্যবহার করছে + + এই বৈশিষ্ট্যটি ব্যবহার করতে, \'ভিডিও স্ট্রিম স্পুফ করুন\' অ্যান্ড্রয়েড স্টুডিও ছাড়া অন্য কোনো ক্লায়েন্টে পরিবর্তন করুন + ডিবাগিং ডিবাগিং অপশন সক্রিয় বা নিষ্ক্রিয় করুন @@ -793,7 +813,7 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ বোতাম লুকানো হয় বোতাম দেখানো হয় - + শেষ স্ক্রীন কার্ড লুকান শেষ স্ক্রীন কার্ড লুকিয়ে রয়েছে শেষ স্ক্রীন কার্ড প্রদর্শিত হয়েছে @@ -1399,11 +1419,13 @@ Miniplayer স্ক্রিন থেকে বামে বা ডানে সিকবারের এক্সেন্ট রঙ অবৈধ সিকবার রঙ মান + + হেডার লোগো ডিফল্ট সাধারণ - + রিভ্যান্সড মিনিমাল কাস্টম @@ -1509,13 +1531,6 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট বাহ্যিক ব্রাউজারে লিঙ্ক খোলা হচ্ছে ইন-অ্যাপ ব্রাউজারে লিঙ্ক খোলা হচ্ছে - - মূল অডিও ভাষা বলপূর্বক চালু করুন - মূল অডিও ভাষা ব্যবহার করা হচ্ছে - ডিফল্ট অডিও ব্যবহার করছে - - এই বৈশিষ্ট্যটি ব্যবহার করতে, \'ভিডিও স্ট্রিম স্পুফ করুন\' অ্যান্ড্রয়েড স্টুডিও ছাড়া অন্য কোনো ক্লায়েন্টে পরিবর্তন করুন - স্বতস্ফূর্তভাবে @@ -1600,6 +1615,14 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট ভিডিওর নির্দিষ্ট অংশে যেতে টানুন সক্রিয় করা হয়নি + অ্যান্ড্রয়েড VR AV1 অনুমতি দিন + "ভিডিও কোডেক হল AVC (H.264), VP9, অথবা AV1 + +প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে" + ভিডিও কোডেক হল AVC (H.264) অথবা VP9 + "এই সেটিংটি চালু করলে সফটওয়্যার AV1 ডিকোডিং ব্যবহার হতে পারে। + +AV1 সহ ভিডিও প্লেব্যাক আটকে যেতে পারে বা ফ্রেম বাদ দিতে পারে।" স্পুফিংয়ের পার্শ্বপ্রতিক্রিয়া • পরীক্ষামূলক ক্লায়েন্ট এবং যেকোনো সময় কাজ করা বন্ধ করতে পারে • ভিডিও ১:০০ মিনিটে বন্ধ হতে পারে, অথবা কিছু অঞ্চলে উপলব্ধ নাও হতে পারে @@ -1619,6 +1642,8 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট + + সম্পর্কে বিজ্ঞাপন diff --git a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-bs-rBA/strings.xml +++ b/patches/src/main/resources/addresources/values-bs-rBA/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index eec21e392..dfd9497ea 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -1,4 +1,5 @@ + + + Název aplikace + + Vlastní + Ikona aplikace + Původní + + ReVanced minimální + ReVanced škálované + + Vlastní + Kontrola proběhla neúspěšně Otevřít oficiální webovou stránku @@ -120,6 +133,13 @@ Přehrávání nemusí fungovat" Vypnutí tohoto nastavení může způsobit problémy s přehráváním. Výchozí klient + + Vynutit původní jazyk zvuku + Použít původní jazyk zvuku + Používání výchozího zvuku + + Chcete-li použít tuto funkci, změňte \'Zfalšovat video streamy\' na libovolného klienta kromě Android Studia + Debugování Povolit nebo zakázat debugovací možnosti @@ -797,7 +817,7 @@ Chcete-li zobrazit nabídku zvukové stopy, změňte 'Zfalšovat streamy videa' Tlačítka jsou skryta Tlačítka jsou zobrazena - + Skrýt karty s informacemi o videu Karty s informacemi o videu jsou skryty Karty s informacemi o videu jsou zobrazeny @@ -1403,11 +1423,13 @@ Omezení: Použití tlačítka zpět na panelu nástrojů nemusí fungovat"Zvýrazněná barva posuvníku Neplatná hodnota barvy posuvníku + + Logo záhlaví Výchozí Běžné - + ReVanced minimální Vlastní @@ -1513,13 +1535,6 @@ Povolením této funkce lze odemknout vyšší kvality videa" Otevírání odkazů v externím prohlížeči Otevírání odkazů v prohlížeči v aplikaci - - Vynutit původní jazyk zvuku - Použít původní jazyk zvuku - Používání výchozího zvuku - - Chcete-li použít tuto funkci, změňte \'Zfalšovat video streamy\' na libovolného klienta kromě Android Studia - Automaticky @@ -1604,6 +1619,14 @@ Omezení: Posun pro hledání není povolen + Povolit Android VR AV1 + "Video kodek je AVC (H.264), VP9 nebo AV1 + +Přehrávání se může zasekávat nebo přeskakovat snímky" + Video kodek je AVC (H.264) nebo VP9 + "Povolení tohoto nastavení může využívat softwarové dekódování AV1. + +Přehrávání videa s AV1 se může sekat nebo vypadávat snímky." Vedlejší účinky maskování • Experimentální klient a může kdykoli přestat fungovat • Video se může zastavit v 1:00 nebo nemusí být dostupné v některých oblastech @@ -1623,6 +1646,8 @@ Omezení: + + O aplikaci Reklamy diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index f32dacd33..2b2d63169 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -1,4 +1,5 @@ + + + Appnavn + + Tilpasset + Appikon + Original + + ReVanced minimal + ReVanced skaleret + + Tilpasset + Kontrol mislykkedes Åbn officiel hjemmeside @@ -120,6 +133,13 @@ Afspilning fungerer muligvis ikke" Deaktivering af denne indstilling kan forårsage afspilningsproblemer. Standard klient + + Tving originalt lydsprog + Bruger originalt lydsprog + Brug standard lyd + + For at bruge denne funktion skal du ændre \"Forfalsk videostreams\" til en hvilken som helst klient undtagen Android Studio + Fejlfinding Aktivér eller deaktiver fejlfindingsindstillinger @@ -797,7 +817,7 @@ For at vise lydsporsmenuen, skift 'Spoof videostreams' til iPadOS" Knapper er skjult Knapper vises - + Skjul slutskærmkort Slutskærmskortene er skjult Kort til slutskærm vises @@ -1405,11 +1425,13 @@ Miniafspiller kan trækkes ud over skærmen til venstre eller højre" Søgelinjens accentfarve Ugyldig søgelinje farveværdi + + Sidehovedlogo Standard Normal - + ReVanced minimal Brugerdefineret @@ -1515,13 +1537,6 @@ Aktivering af dette kan låse op for højere videokvalitet" Åbner links i ekstern browser Åbner links i browser i appen - - Tving originalt lydsprog - Bruger originalt lydsprog - Brug standard lyd - - For at bruge denne funktion skal du ændre \"Forfalsk videostreams\" til en hvilken som helst klient undtagen Android Studio - Automatisk @@ -1606,6 +1621,14 @@ Begrænsninger: Dias til søgning er ikke aktiveret + Tillad Android VR AV1 + "Videocodec er AVC (H.264), VP9 eller AV1 + +Afspilning kan hakke eller miste billeder" + Videocodec er AVC (H.264) eller VP9 + "Aktivering af denne indstilling kan bruge software AV1-afkodning. + +Videoafspilning med AV1 kan hakke eller tabe billeder." Bivirkninger ved spoofing • Eksperimentel klient og kan stoppe med at fungere når som helst • Videoen kan stoppe ved 1:00, eller er muligvis ikke tilgængelig i visse regioner @@ -1625,6 +1648,8 @@ Begrænsninger: + + Om Annoncer diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index 7ee669512..280ea35c3 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -1,4 +1,5 @@ + + + App-Name + + Benutzerdefiniert + App-Symbol + Original + + ReVanced minimal + ReVanced skaliert + + Benutzerdefiniert + Prüfungen fehlgeschlagen Offizielle Website öffnen @@ -120,6 +133,13 @@ Die Wiedergabe funktioniert möglicherweise nicht" Das Deaktivieren dieser Einstellung kann Wiedergabeprobleme verursachen. Standard-Client + + Original Audio erzwingen + Original-Audiosprache verwenden + Standardaudio verwenden + + Um diese Funktion zu nutzen, ändere \"Video-Streams fälschen\" auf einen beliebigen Client außer Android Studio + Fehlerbehebung Aktiviert oder deaktiviert Debugging-Optionen @@ -560,7 +580,7 @@ Passen Sie die Helligkeit an, indem Sie auf der linken Seite des Bildschirms ver Die Vollbild-Lautstärkegeste ist deaktiviert Wischen durch Drücken aktivieren Wischen durch Drücken ist aktiviert - Wischen durch Drücken ist deaktiviert + Wischgeste durch Drücken ist deaktiviert Haptisches Feedback aktivieren Haptisches Feedback ist aktiviert Haptisches Feedback ist deaktiviert @@ -794,7 +814,7 @@ Um das Audiotrack-Menü anzuzeigen, ändern Sie \"Video-Streams fälschen\" zu i Buttons sind ausgeblendet Tasten werden angezeigt - + Endkarte ausblenden Endbildschirmkarten sind ausgeblendet Endbildschirmkarten werden angezeigt @@ -1400,11 +1420,13 @@ Der Mini-Player kann mit einer Wischgeste vom Bildschirm nach links oder rechts Die Akzentfarbe der Fortschrittsanzeige Ungültiger Suchleisten-Farbwert + + Header-Logo Standard Regulär - + ReVanced Minimal Benutzerdefiniert @@ -1510,13 +1532,6 @@ Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet w Links im externen Browser öffnen Links im In-App-Browser öffnen - - Original Audio erzwingen - Original-Audiosprache verwenden - Standardaudio verwenden - - Um diese Funktion zu nutzen, ändere \"Video-Streams fälschen\" auf einen beliebigen Client außer Android Studio - Autom @@ -1601,6 +1616,14 @@ Einschränkungen: Slide zum Suchen ist nicht aktiviert + Android VR AV1 zulassen + "Video-Codec ist AVC (H.264), VP9 oder AV1 + +Die Wiedergabe kann stottern oder Frames verlieren" + Video-Codec ist AVC (H.264) oder VP9 + "Durch Aktivierung dieser Einstellung kann Software-AV1-Decodierung verwendet werden. + +Die Videowiedergabe mit AV1 kann stottern oder Bilder überspringen." Nebenwirkungen des Spoofings • Experimenteller Client und kann jederzeit aufhören zu funktionieren • Video kann um 1:00 Uhr stoppen oder ist möglicherweise in einigen Regionen nicht verfügbar @@ -1620,6 +1643,8 @@ Einschränkungen: + + Über Werbung diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index 3ea46a397..952f94146 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -1,4 +1,5 @@ + + + Όνομα εφαρμογής + + Προσαρμοσμένο + Εικονίδιο εφαρμογής + Αρχικό + + ReVanced απλό + ReVanced κλιμακωμένο + + Προσαρμοσμένο + Αποτυχία ελέγχων Άνοιγμα επίσημης ιστοσελίδας @@ -120,6 +133,13 @@ Second \"item\" text" Η απενεργοποίηση αυτής της ρύθμισης ενδέχεται να προκαλέσει προβλήματα αναπαραγωγής. Προεπιλεγμένο πρόγραμμα πελάτη + + Εξαναγκασμός αρχικής γλώσσας ήχου + Χρησιμοποιείται η αρχική γλώσσα ήχου + Χρησιμοποιείται ο προεπιλεγμένος ήχος + + Για να χρησιμοποιήσετε αυτήν τη λειτουργία, αλλάξτε την επιλογή «Παραποίηση ροών βίντεο» σε οποιονδήποτε πελάτη εκτός από το Android Studio + Εντοπισμός σφαλμάτων Ενεργοποίηση ή απενεργοποίηση επιλογών εντοπισμού σφαλμάτων @@ -799,7 +819,7 @@ Second \"item\" text" Κρυμμένα Εμφανίζονται - + Κάρτες τελικής οθόνης Κρυμμένες Εμφανίζονται @@ -952,8 +972,8 @@ Second \"item\" text" Σχετικά βίντεο στην πλήρη οθόνη - Κρυμμένα\n\nΑφορά τα σχετικά βίντεο της τελικής οθόνης στη λειτουργία πλήρους οθόνης - Εμφανίζονται\n\nΑφορά τα σχετικά βίντεο της τελικής οθόνης στη λειτουργία πλήρους οθόνης + Κρυμμένα + Εμφανίζονται Χρονική πρόοδος βίντεο @@ -1404,11 +1424,13 @@ Second \"item\" text" Το χρώμα έμφασης της γραμμής προόδου Μη έγκυρη τιμή χρώματος γραμμής προόδου + + Λογότυπο επικεφαλίδας Προεπιλογή Κανονικό - + ReVanced απλό Προσαρμοσμένο @@ -1512,13 +1534,6 @@ Second \"item\" text" Οι σύνδεσμοι ανοίγουν σε εξωτερικό πρόγραμμα περιήγησης Οι σύνδεσμοι ανοίγουν στο εσωτερικό πρόγραμμα περιήγησης της εφαρμογής - - Εξαναγκασμός αρχικής γλώσσας ήχου - Χρησιμοποιείται η αρχική γλώσσα ήχου - Χρησιμοποιείται ο προεπιλεγμένος ήχος - - Για να χρησιμοποιήσετε αυτήν τη λειτουργία, αλλάξτε την επιλογή «Παραποίηση ροών βίντεο» σε οποιονδήποτε πελάτη εκτός από το Android Studio - Αυτόματη @@ -1603,6 +1618,14 @@ Second \"item\" text" Η χειρονομία συρσίματος για αναζήτηση στη γραμμή προόδου είναι απενεργοποιημένη + Να επιτρέπεται ο κωδικοποιητής Android VR AV1 + "Ο κωδικοποιητής βίντεο είναι ο AVC (H.264), ο VP9 ή ο AV1 + +Η αναπαραγωγή μπορεί να κομπιάζει ή να χάνει καρέ" + Ο κωδικοποιητής βίντεο είναι ο AVC (H.264) ή ο VP9 + "Η ενεργοποίηση αυτής της ρύθμισης ενδέχεται να χρησιμοποιήσει αποκωδικοποίηση λογισμικού AV1. + +Η αναπαραγωγή βίντεο μπορεί να κομπιάζει ή να χάνει καρέ." Παρενέργειες παραποίησης • Πειραματικός πελάτης και μπορεί να σταματήσει να λειτουργεί ανά πάσα στιγμή • Το βίντεο μπορεί να σταματήσει στο 1:00 ή να μην είναι διαθέσιμο σε ορισμένες περιοχές @@ -1622,6 +1645,8 @@ Second \"item\" text" + + Σχετικά με Διαφημίσεις diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index a89606794..535ae0622 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -1,4 +1,5 @@ + + + Nombre de la aplicación + + Personalizado + Icono de la aplicación + Original + + ReVanced mínimo + ReVanced escalado + + Personalizado + Comprobaciones fallidas Ir al sitio web oficial @@ -120,6 +133,13 @@ La reproducción podría no funcionar" Desactivar esta configuración puede causar problemas de reproducción. Cliente por defecto + + Forzar idioma de audio original + Usar el idioma de audio original + Utilizando audio predeterminado + + Para usar esta función, cambia \'Falsificar transmisiones de vídeo\' a cualquier cliente excepto Android Studio + Depuración Activar o desactivar las opciones de depuración @@ -797,7 +817,7 @@ Para mostrar el menú de la pista de audio, cambia 'Suplantar transmisiones de v Los botones están ocultos Los botones se muestran - + Ocultar tarjetas de pantalla final Las tarjetas de pantalla de fin están ocultas Se muestran las tarjetas de la pantalla final @@ -1394,11 +1414,13 @@ El minireproductor se puede arrastrar fuera de la pantalla hacia la izquierda o El color de acento de la barra de búsqueda Valor de color de la barra de búsqueda inválido + + Logotipo del encabezado Predeterminado Normal - + ReVanced mínimo Personalizado @@ -1504,13 +1526,6 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Abrir enlaces en el navegador externo Abrir enlaces en el navegador integrado en la aplicación - - Forzar idioma de audio original - Usar el idioma de audio original - Utilizando audio predeterminado - - Para usar esta función, cambia \'Falsificar transmisiones de vídeo\' a cualquier cliente excepto Android Studio - Automático @@ -1595,6 +1610,12 @@ Limitaciones: Slide to seek no está activado + Permitir Android VR AV1 + "El códec de video es AVC (H.264), VP9 o AV1 + +La reproducción puede tartamudear o perder fotogramas" + El códec de video es AVC (H.264) o VP9 + "Habilitar esta configuración puede usar la decodificación de software AV1.\n\nLa reproducción de video con AV1 puede tartamudear o perder fotogramas." Efectos secundarios de la falsificación • El cliente es experimental y puede dejar de funcionar en cualquier momento • El video puede detenerse en 1:00, o puede no estar disponible en algunas regiones @@ -1614,6 +1635,8 @@ Limitaciones: + + Acerca de Anuncios diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index 2d6ad820b..22185a399 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -1,4 +1,5 @@ + + + Rakenduse nimi + + Kohandatud + Rakenduse ikoon + Algne + + ReVanced minimaalne + ReVanced skaleeritud + + Kohandatud + Kontrollid ebaõnnestusid Ava oficial veebileht @@ -120,6 +133,13 @@ Taasesitus ei pruugi töötada" Selle sätte väljalülitamine võib põhjustada taasesitusprobleeme. Vaikimisi klient + + Sunni originaalheli keel + Algse helikeele kasutamine + Kasutan vaikeheli + + Selle funktsiooni kasutamiseks muutke „Võltsitud videovood” mis tahes muule kliendile peale Android Studio. + Veaotsing Veaotsinguvalikud lubamiseks või keelamiseks @@ -797,7 +817,7 @@ Heliraja menüü nägemiseks muutke \"Video voogude võltsimine\" iPadOS-iks"Nupud on peidetud Nupud on nähtavad - + Peida lõpukujunduse kaardid Lõpukujunduse kaardid on peidetud Lõpukujunduse kaardid on nähtavad @@ -1403,11 +1423,13 @@ Minimaalset mängijat saab lohistada ekraanilt vasakule või paremale" Otsinguriba esiletõiduv värv Vigane edastusriba värvi väärtus + + Päise logo Vaikimisi Tavaline - + ReVanced minimaalne Kohandatud @@ -1513,13 +1535,6 @@ Selle lubamine võib avada kõrgema video kvaliteedi" Linkide avamine välises brauseris Linkide avamine rakendusesiseses brauseris - - Sunni originaalheli keel - Algse helikeele kasutamine - Kasutan vaikeheli - - Selle funktsiooni kasutamiseks muutke „Võltsitud videovood” mis tahes muule kliendile peale Android Studio. - Automaatne @@ -1604,6 +1619,14 @@ Piirangud: Libistamine otsimiseks on keelatud + Luba Android VR AV1 + "Videokodek on AVC (H.264), VP9 või AV1 + +Taasesitus võib hakata kokutama või kaotada kaadreid" + Videokodek on AVC (H.264) või VP9 + "Selle seade lubamine võib kasutada tarkvara AV1 dekodeerimist. + +AV1-ga videotaasesitus võib hakitud olla või kaadreid vahele jätta." Võltsimise kõrvalmõjud • Eksperimentaalne klient ja võib igal ajal töötamast lakata • Video võib peatuda kell 1:00 või ei pruugi olla teatud piirkondades saadaval @@ -1623,6 +1646,8 @@ Piirangud: + + Teave Reklaamid diff --git a/patches/src/main/resources/addresources/values-eu-rES/strings.xml b/patches/src/main/resources/addresources/values-eu-rES/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-eu-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-eu-rES/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml index 81df8ebe8..0801f705b 100644 --- a/patches/src/main/resources/addresources/values-fa-rIR/strings.xml +++ b/patches/src/main/resources/addresources/values-fa-rIR/strings.xml @@ -1,4 +1,5 @@ + + + + + + بررسی ناموفق بود رفتن به وبسایت رسمی @@ -69,6 +75,9 @@ Second \"item\" text" + + + عیب‌یابی فعال یا غیرفعال کردن گزینه‌های عیب یابی @@ -182,7 +191,7 @@ Second \"item\" text" - + @@ -250,8 +259,10 @@ Second \"item\" text" + + - + @@ -277,9 +288,6 @@ Second \"item\" text" - - - @@ -303,6 +311,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index 011c7b8d4..6f75cd4d8 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -1,4 +1,5 @@ + + + Sovelluksen nimi + + Mukautettu + Sovelluksen kuvake + Alkuperäinen + + ReVanced-minimaalinen + ReVanced skaalattu + + Mukautettu + Tarkastuksia epäonnistui Avaa virallinen sivusto @@ -109,7 +122,7 @@ Napauta jatka-painiketta ja salli optimoinnin muutokset." Naamioi videovirrat Naamioi asiakasohjelman videovirrat toisto-ongelmien estämiseksi Naamioi videovirrat - Naamioi asiakkaan videovirrat estääksesi toisto-ongelmat + Naamioi asiakasohjelman videovirrat toisto-ongelmien estämiseksi Naamioi videovirrat "Videovirrat on naamioitu @@ -120,6 +133,13 @@ Toisto ei välttämättä toimi" Tämän asetuksen poistaminen käytöstä voi aiheuttaa toisto-ongelmia. Oletusasiakasohjelma + + Pakota alkuperäinen äänen kieli + Käytetään alkuperäistä ääntä + Käytetään oletusääntä + + Käyttääksesi tätä ominaisuutta, muuta \"Naamioi videovirrat\" mihin tahansa asiakasohjelmaan paitsi Android Studioon + Virheenkorjaus Ota tai poista virheenkorjausasetukset käytöstä @@ -797,7 +817,7 @@ Näyttääksesi ääniraitavalikon, muuta \"Videostriimien naamioiminen\" iPadOS Edellinen- ja Seuraava-painikkeet piilotetaan Painikkeet näytetään - + Piilota loppunäytön kortit Loppunäytön kortit piilotetaan Loppunäytön kortit näytetään @@ -1403,11 +1423,13 @@ Minisoitin voidaan vetää pois näytöltä vasemmalle tai oikealle" Etenemispalkin korostusväri Virheellinen etenemispalkin väriarvo + + Ylätunnisteen logo Oletus Tavallinen - + ReVanced-minimaalinen Mukautettu @@ -1513,13 +1535,6 @@ Tämä voi avata korkealaatuisemmat videot" Linkit avataan ulkoisessa selaimessa Linkit avataan sovelluksen sisäisessä selaimessa - - Pakota alkuperäinen äänen kieli - Käytetään alkuperäistä ääntä - Käytetään oletusääntä - - Käyttääksesi tätä ominaisuutta, muuta \"Naamioi videovirrat\" mihin tahansa asiakasohjelmaan paitsi Android Studioon - Automaattinen @@ -1604,6 +1619,14 @@ Rajoitukset: Kelaus liu\'uttamalla ei ole käytössä + Salli Android VR AV1 + "Videokoodekki on AVC (H.264), VP9 tai AV1 + +Toisto voi nykiä tai pudottaa kehyksiä" + Videokoodekki on AVC (H.264) tai VP9 + "Tämän asetuksen ottaminen käyttöön saattaa käyttää ohjelmistopohjaista AV1-dekoodausta. + +AV1-videon toisto saattaa pätkiä tai pudottaa kuvia." Naamioimisen sivuvaikutukset • Kokeellinen asiakasohjelma, joka saattaa lakata toimimasta milloin tahansa • Video saattaa pysähtyä aikaan 1:00, tai ei välttämättä ole saatavilla joillakin alueilla @@ -1623,6 +1646,8 @@ Rajoitukset: + + Tietoja Mainokset diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index 5cb394885..4c4bef93e 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -1,4 +1,5 @@ + + + Pangalan ng app + + Pasadyang + Icon ng app + Orihinal + + ReVanced minimal + ReVanced naka-scale + + Pasadyang + Nabigo ang mga pagsusuri Buksan ang Opisyal na Website @@ -120,6 +133,13 @@ Maaaring hindi gumana ang pag-playback" Ang pag-off sa setting na ito ay maaaring magdulot ng mga isyu sa pag-playback. Default na kliyente + + Pilitin ang orihinal na wika ng audio + Ginagamit ang orihinal na wika ng audio + Gumagamit ng default audio + + Para magamit ang feature na ito, palitan ang \'Panggagaya ng mga video stream\' sa anumang client maliban sa Android Studio + Pagde-debug Paganahin o huwag paganahin ang mga opsyon sa pag-debug @@ -795,7 +815,7 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa iPad Nakatago ang mga pindutan Ang mga pindutan ay ipinapakita - + Itago ang mga end screen card Nakatago ang mga end screen card Ipinapakita ang mga end screen card @@ -1401,11 +1421,13 @@ Ang \"miniplayer\" ay maaaring i-drag palabas ng screen sa kaliwa o kanan"Ang accent na kulay ng seekbar Hindi wastong halaga ng kulay ng seekbar + + Logo ng Header Default Regular - + ReVanced minimal Pasadyang @@ -1511,13 +1533,6 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video"Binubuksan ang mga link sa panlabas na browser Binubuksan ang mga link sa in-app na browser - - Pilitin ang orihinal na wika ng audio - Ginagamit ang orihinal na wika ng audio - Gumagamit ng default audio - - Para magamit ang feature na ito, palitan ang \'Panggagaya ng mga video stream\' sa anumang client maliban sa Android Studio - Awtomatik @@ -1602,6 +1617,14 @@ Mga Limitasyon: Hindi pinagana ang slide to seek + Payagan ang Android VR AV1 + "Ang video codec ay AVC (H.264), VP9, o AV1 + +Maaaring mag-stutter o mag-drop ng frames ang playback" + Ang video codec ay AVC (H.264) o VP9 + "Ang pagpapagana sa setting na ito ay maaaring gumamit ng software AV1 decoding. + +Maaaring mag-stutter o mag-drop ng frames ang pag-playback ng video na may AV1." Mga epekto ng pagpapanggap • Pang-eksperimentong kliyente at maaaring huminto sa paggana anumang oras • Maaaring huminto ang video sa 1:00, o maaaring hindi available sa ilang rehiyon @@ -1621,6 +1644,8 @@ Mga Limitasyon: + + Tungkol Mga Ad diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index 675214568..53927546b 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -1,4 +1,5 @@ + + + Nom de l\'application + + Personnalisé + Icône de l\'application + Original + + ReVanced minimaliste + ReVanced mis à l\'échelle + + Personnalisé + Les vérifications ont échoué Ouvrir le site officiel @@ -120,6 +133,13 @@ Il est possible que la lecture ne fonctionne pas" La désactivation de ce paramètre peut entraîner des problèmes de lecture. Client par défaut + + Forcer la langue audio d\'origine + Utilisation de la langue audio d\'origine + Utilisation de l\'audio par défaut + + Pour utiliser cette fonctionnalité, définissez \"Falsifier les flux vidéo\" sur n\'importe quel client, sauf Android Studio + Débogage Activez ou désactivez les options de débogage @@ -797,7 +817,7 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Les boutons sont masqués Les boutons sont affichés - + Masquer les écrans de fin au format fiche Les écrans de fin au format fiche sont masqués Les écrans de fin au format fiche sont affichés @@ -1404,11 +1424,13 @@ Le lecteur réduit peut être glissé hors de l'écran, à gauche comme à droit La couleur d\'accentuation de la barre de progression Valeur invalide pour la couleur de la barre de progression + + Logo d\'en-tête Par défaut Standard - + ReVanced minimaliste Personnalisé @@ -1514,13 +1536,6 @@ Activer cette option peut déverrouiller des qualités vidéo supérieures"Les liens sont ouverts dans le navigateur externe Les liens sont ouverts dans le navigateur intégré à l\'application - - Forcer la langue audio d\'origine - Utilisation de la langue audio d\'origine - Utilisation de l\'audio par défaut - - Pour utiliser cette fonctionnalité, définissez \"Falsifier les flux vidéo\" sur n\'importe quel client, sauf Android Studio - Automatique @@ -1605,6 +1620,14 @@ Limitations : Glisser pour rechercher est désactivé + Autoriser Android VR AV1 + "Le codec vidéo est AVC (H.264), VP9 ou AV1 + +La lecture peut saccader ou perdre des images" + Le codec vidéo est AVC (H.264) ou VP9 + "L'activation de ce paramètre peut utiliser le décodage AV1 logiciel. + +La lecture vidéo avec AV1 peut saccader ou perdre des images." Effets secondaires de la falsification • Client expérimental, peut cesser de fonctionner à tout moment • Les vidéos sont susceptibles de s\'arrêter à 1:00, ou de ne pas être disponibles dans certaines régions @@ -1624,6 +1647,8 @@ Limitations : + + À propos Annonces diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index a0acceb34..5c844eb90 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -1,4 +1,5 @@ + + + Ainm an fheidhmchláir + + Saincheaptha + Deilbhín an fheidhmchláir + Bunaidh + + ReVanced Íosmhéid + ReVanced Scálaithe + + Saincheaptha + Theip ar sheiceálacha Oscailt láithreán gréasáin oifigiúil @@ -55,7 +68,7 @@ Second \"item\" text" Bain triail as eochairfhocal eile Cuardaigh le déanaí Bain as stair an chuardaigh? - Glan stair an chuardaigh + Glan stair chuardaigh An bhfuil tú cinnte gur mhaith leat stair chuardaigh go léir a ghlanadh? Leideanna Cuardaigh "• Tapáil cosán chun dul chuige @@ -106,20 +119,27 @@ Brúigh an cnaipe leanúnaí agus ligean athruithe optúimíochta." Lean ar aghaidh - Sruthanna físeán spoof - Spoof na sruthanna físeáin cliant chun saincheisteanna athsheinm a chosc - Sruthanna físeáin bréige - Déan bréagú ar shruthanna físeáin an chliaint chun saincheisteanna athsheinm a chosc - Sruthanna físeán spoof - "Tá sruthanna físeáin bréagaithe + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + Déan sruthanna físe an chliaint a fhalsú chun fadhbanna athsheinm a chosc + Sruthanna físe bréige + "Déantar sruthanna físe a bhréagnú -Má tá tú i do úsáideoir YouTube Premium, seans nach mbeidh an socrú seo ag teastáil" +Mura bhfuil tú i d’úsáideoir YouTube Premium, b’fhéidir nach mbeidh an socrú seo ag teastáil" "Ní dhéantar sruthanna físeáin a bhréagnú Seans nach n-oibreoidh an t-athsheinm" Má mhúchann tú an socrú seo, d\'fhéadfadh saincheisteanna athsheinm a theacht chun cinn. Cliant réamhshocraithe + + Fórsaigh teanga bhunaidh na fuaime + Ag úsáid teanga bhunaidh na fuaime + Ag úsáid fuaim réamhshocraithe + + Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio + Dífhabhtú Cumasaigh nó díchumasaigh roghanna dífhabhtú @@ -223,8 +243,8 @@ Mar sin féin, logálfaidh sé seo roinnt sonraí úsáideora freisin, mar shamp Tá seilf íomhá i dtorthaí cuardaigh i bhfolach Taispeántar seilf íomhánna i dtorthaí cuardaigh Folaigh na poist is déanaí - Tá postanna is déanaí i bhfolach - Taispeántar na postálacha is déanaí + Tá na poist is déanaí i bhfolach + Taispeántar na poist is déanaí Folaigh seinmliostaí meascán Tá seinmliostaí measctha i bhfolach Taispeántar seinmliostaí measctha @@ -241,9 +261,9 @@ Mar sin féin, logálfaidh sé seo roinnt sonraí úsáideora freisin, mar shamp Taispeántar na heilimintí inseinnte - Folaigh cnaipe \'Taispeáin tuilleadh\' + Folaigh an cnaipe \'Taispeáin níos mó\' Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh i bhfolach - Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh taispeánta + Cnaipe \'Taispeáin níos mó\' sna torthaí cuardaigh thaispeánta Folaigh suirbhéanna Tá suirbhéanna i bhfolach Tá suirbhéanna taispeánta @@ -797,7 +817,7 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Tá cnaipí i bhfolach Taispeántar cnaipí - + Folaigh cártaí scáileáin deireadh Tá cártaí scáileáin deiridh i bhfolach Taispeántar cártaí scáileáin deireadh @@ -1403,11 +1423,13 @@ Is féidir an mhion-imreoir a tharraingt as an scáileán ar chlé nó ar dheis" Dath accent an bhar taispillte Luach datha barra cuardaigh neamhbhailí + + Lógó Ceanntáisc Réamhshocrú Rialta - + ReVanced íosta Saincheaptha @@ -1460,7 +1482,7 @@ Brúigh anseo chun tuilleadh eolais a fháil faoi DeArrow" Ní thaispeántar fógraí ar thosú Taispeáin fógraí ar thosú Theip ar nascadh le soláthraí fógraí - Díbhunaigh + Díbhe Cumasaigh físeán lúbtha @@ -1469,68 +1491,61 @@ Brúigh anseo chun tuilleadh eolais a fháil faoi DeArrow" Taispeáin an cnaipe físeáin lúbtha - Tá an cnaipe ar taispeáint + Taispeántar an cnaipe Níl an cnaipe ar taispeáint Tá físeán lúbtha ar siúl Tá físeán lúbtha as siúl - Toisí feiste spoof - "Toisí gléise spoofed + Toisí gléas a fhalsú + "Toisí na ngléasanna falsaithe -D'fhéadfadh go gcuirfí caighdeáin físeáin níos airde ar fáil ach d'fhéadfá stuttering athsheinm físeáin, saol ceallraí níos measa, agus fo-iarsmaí anaithnid a fháil" - "Níl toisí gléise spoofed +D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" + "Toisí na ngléasanna gan falsaithe -Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" - D\'fhéadfadh sé seo a bheith ina chúis le stuttering athsheinm físe, saol ceallraí níos measa, agus fo-iarmhairtí anaithnid. +D’fhéadfadh cáilíochtaí físe níos airde a bheith díghlasáilte ach d’fhéadfadh go mbeadh stad ar athsheinm físe, saol ceallraí níos measa, agus fo-iarsmaí anaithnide agat" + Is féidir go mbeidh stad ar athsheinm físe, saolré na ceallraí níos measa, agus fo-iarsmaí anaithnide mar thoradh air seo. - Aiseolas haptach - Athraigh aiseolas haptach - Díchumasaigh haptics caibidlí - Tá haptics caibidlí díchumasaithe - Tá haptics caibidlí cumasaithe - Díchumasaigh haptics beacht cuardaigh - Tá haptics beachtais díchumasaithe - Tá haptics beacht cuardaigh cumasaithe - Díchumasaigh haptics díthurais - Tá haptics díthurais díchumasaithe - Tá haptics díthurais cumasaithe - Díchumasaigh súmáil haptics - Tá súmáil haptics díchumasaithe - Tá súmáil haptics cumasaithe + Aiseolas haiptice + Athraigh aiseolas haiptice + Díchumasaigh haiptice caibidlí + Tá haiptice caibidlí díchumasaithe + Tá haiptice caibidlí cumasaithe + Díchumasaigh haiptice beacht cuardaigh + Tá haiptice cuardaigh chruinne díchumasaithe + Tá haiptice cuardaigh chruinn cumasaithe + Díchumasaigh haiptice cuardaigh agus cealaithe + Tá haiptice cuardaigh cealaithe díchumasaithe + Tá haiptice cuardaigh cealaithe cumasaithe + Díchumasaigh haiptice súmála + Tá haiptice súmála díchumasaithe + Tá haiptice súmála cumasaithe Má d’athraigh tú sonraí logála isteach do chuntais le déanaí, ansin díshuiteáil agus athshuiteáil MicroG. - Atreoracha seachbhóthar URL - Seachnaítear atreoruithe URL - Ní chuirtear athsheoltaí URL + Seachain atreoruithe URL + Déantar atreoruithe URL a sheachaint + Ní dhéantar seachaint ar atreoruithe URL Oscail naisc sa bhrabhsála Ag oscailt naisc sa bhrabhsálaí seachtrach Ag oscailt naisc sa bhrabhsálaí in-aip - - Fórsaigh teanga bhunaidh na fuaime - Ag úsáid teanga bhunaidh na fuaime - Ag úsáid fuaim réamhshocraithe - - Chun an ghné seo a úsáid, athraigh \'Bréag-sruthanna físeáin\' chuig aon chliant seachas Android Studio - Uathoibríoch - Cuimhnigh athruithe ar cháilíocht + Cuimhnigh athruithe ar cháilíocht físe Baineann athruithe cáilíochta le gach físeán Ní bhaineann athruithe cáilíochta ach leis an bhfíseán reatha - Taispeáin fógra beag ar athruithe cáilíochta físe + Taispeáin tósta ar athruithe cáilíochta físe Taispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin Ní thaispeántar fógra beag nuair a athraítear cáilíocht réamhshocraithe an fhíseáin - Cáilíocht físe réamhshocraithe ar líonra - Cáilíocht físe réamhshocraithe ar líonra + Cáilíocht físe réamhshocraithe ar líonra Wi-Fi + Cáilíocht físe réamhshocraithe ar líonra soghluaiste Cuimhnigh ar athruithe cáilíochta Shorts Baineann athruithe ar an gcáilíocht le gach Shorts Ní bhaineann athruithe ar an gcáilíocht ach leis an Short reatha @@ -1538,7 +1553,7 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Cáilíocht réamhshocraithe Shorts ar líonra soghluaiste soghluaiste Wi-Fi - Athraigh cáilíocht réamhshocraithe %1$s go dtí: %2$s + Athraíodh cáilíocht réamhshocraithe %1$s go: %2$s Athraíodh cáilíocht Shorts %1$s go: %2$s @@ -1548,22 +1563,22 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Taispeáin cnaipe cáilíochta físeáin - Tá cnaipe le feiceáil. Tapáil agus coinnigh chun cáilíocht a athshocrú mar réamhshocrú - Níl cnaipe le feiceáil + Taispeántar an cnaipe. Tapáil agus coinnigh síos chun an caighdeán a athshocrú go dtí an caighdeán réamhshocraithe + Ní thaispeántar an cnaipe Roghchlár luas athsheinm saincheaptha Taispeántar roghchlár luais saincheaptha Ní thaispeántar roghchlár luais saincheaptha - Athchóirigh an seanchalafort luais athsheinm - Tá an seanchalafort luais taispeánta - Tá an calafort luais nua-aimseartha taispeánta + Athchóirigh an sean-roghchlár luas athsheinm + Taispeántar an sean-roghchlár luais + Taispeántar roghchlár luais nua-aimseartha Luas athsheinm saincheaptha Cuir leis nó athraigh na luasanna athsheinm saincheaptha Ní mór luas saincheaptha a bheith níos lú ná %s Luasanna athsheinm saincheaptha neamhbhailí Uathoibríoch - Luas tap is agus greim + Luas saincheaptha tapála agus coinnigh Luas athsheinm eatarthu 0-8 @@ -1577,12 +1592,12 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Athraigh luas réamhshocraithe go: %s -

Díchumasú físeán HDR

-

Tá físeán HDR díchumasaithe

-

Tá físeán HDR arna chumhachtú

+ Díchumasaigh físeán HDR + Tá físeán HDR díchumasaithe + Tá físeán HDR cumasaithe Fórsa AVC (H.264) Éigeantar an códóir físeáin go AVC (H.264) - Cinntear an códóir físeáin go huathoibríoch + Cinntear an cóideac físe go huathoibríoch "Sochair: • Féadfaidh sé saolré na ceallraí a fheabhsú • Féadfaidh sé réitigh físeáin atá in easnamh a chur ar ais ar ghléasanna níos sine @@ -1604,25 +1619,35 @@ Teorainneacha: Níl sleamhnán le lorg cumasaithe
- Fo-iarsmaí bréagaíochta + Ceadaigh Android VR AV1 + "Is é an códac físeáin AVC (H.264), VP9, nó AV1 + +D'fhéadfadh go mbeadh fadhbanna le hathsheinm nó go gcaillfí frámaí" + Is é an códac físeáin AVC (H.264) nó VP9 + "Má chumasaítear an socrú seo, d'fhéadfadh sé díchódú bogearraí AV1 a úsáid. + +D'fhéadfadh athsheinm físe AV1 leacadh nó frámaí a scaoileadh." + Fo-éifeachtaí a fhalsúa • Cliant turgnamhach é seo agus féadfaidh sé stop a chur ag obair ag am ar bith • Is féidir go stopfaidh an físeán ag 1:00, nó b\'fhéidir nach mbeidh sé ar fáil i réigiúin áirithe • Tá an roghchlár rian fuaime in easnamh - • Níl aon chóidéir físe AV1 + • Níl aon cóideac físe AV1 • Níl toirt chobhsaí ar fáil - • Videos faoi phaistí uaireanta nach imreoidh nuair a bhíonn tú logáilte amach nó i mod incognito + • Seans nach seinnfear físeáin do pháistí nuair a bhíonn siad logáilte amach nó i mód go hanaithnid - • Níl Éigean fuaime bunaidh ar fáil + • Níl an fuaim bhunaidh iallach ar fáil Taispeáin i Staitisticí do nerds Taispeántar cineál an chliaint i Staitisticí do nerds Tá an cliant curtha i bhfolach i Staitisticí do nerds Teanga an tsrutha fuaime - Chun teanga fuaime shonrach a roghnú, múch \'Cuir iallach ar bhunteanga fuaime\' + Chun teanga fuaime ar leith a roghnú, múch \'Fórsaigh teanga fuaime bhunaidh\' Níl roghnú theanga an tsrutha ar fáil le Android Studio
+ + Maidir Fógraí @@ -1637,13 +1662,13 @@ Teorainneacha: Cumasaigh athdhéanamh buan - Tá athdhéanamh buan cumasaithe - Tá athdhéanamh buan díchumasaithe + Tá athrá buan cumasaithe + Tá athrá buan díchumasaithe Folaigh an cnaipe teilgthe Tá an cnaipe teilgthe i bhfolach - Tá an cnaipe teilgthe ar taispeáint + Taispeántar an cnaipe teilgthe Folaigh an barra catagóirí @@ -1656,29 +1681,29 @@ Teorainneacha: Folaigh Baile Tá cnaipe Baile folaithe - Tá cnaipe Baile taispeánta + Taispeántar an cnaipe baile Folaigh Samplaí - Tá cnaipe Samplaí folaithe - Tá cnaipe Samplaí taispeánta + Tá cnaipe na samplaí i bhfolach + Taispeántar cnaipe na samplaí - Folaigh Scrúdaigh - Tá cnaipe Fionnachtana folaithe - Tá cnaipe Fionnachtana taispeánta + Folaigh Iniúchadh + Tá an cnaipe iniúchadh i bhfolach + Taispeántar an cnaipe iniúchadh Folaigh Leabharlann - Tá cnaipe Leabharlann folaithe - Tá cnaipe Leabharlann taispeánta + Tá cnaipe na leabharlainne i bhfolach + Taispeántar cnaipe na leabharlainne - Folaigh Uasghrádaigh - Tá cnaipe Uasghrádú folaithe - Tá cnaipe Uasghrádú taispeánta + Folaigh an tUasghrádú + Tá an cnaipe uasghrádaithe i bhfolach + Taispeántar an cnaipe uasghrádaithe Folaigh barra nascleanúna - Tá barra nascleanúna folaithe - Tá barra nascleanúna taispeánta + Tá an barra nascleanúna i bhfolach + Taispeántar barra nascleanúna Folaigh lipéid cnaipí nascleanúna - Tá lipéid folaithe - Tá lipéid taispeánta + Tá lipéid i bhfolach + Taispeántar lipéid Folaigh an lipéad \'Faigh Music Premium\' @@ -1695,7 +1720,7 @@ Teorainneacha: Cuir bac ar fógraí fuaime Cuirtear bac ar fhógraí fuaime - Déantar fógraí fuaime díbhocáilte + Tá fógraí fuaime díbhlocáilte %s neamh-infheidhme, d\'fhéadfadh go dtaispeánfadh fógraí. Bain triail as seirbhís blocála fógraí a athrú sna socruithe. @@ -1714,11 +1739,11 @@ Teorainneacha: Teachtaireacht scriosta Taispeáin teachtaireachtaí scriosta Ná taispeáin teachtaireachtaí scriosta - Folaigh teachtaireachtaí scriosta taobh thiar de spoiler - Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe + Folaigh teachtaireachtaí scriosta taobh thiar a fhalsúa + Taispeáin teachtaireachtaí scriosta mar théacs trasnaithe amach - Tóg Pointí Cainte go huathoibríoch + Éiligh Pointí Cainéil go huathoibríoch Éilítear Pointí Cainéal go huathoibríoch Ní éilítear Pointí Cainéal go huathoibríoch diff --git a/patches/src/main/resources/addresources/values-gl-rES/strings.xml b/patches/src/main/resources/addresources/values-gl-rES/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-gl-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-gl-rES/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-gu-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-gu-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml index 1d088b22b..7e56c695e 100644 --- a/patches/src/main/resources/addresources/values-hi-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-hi-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -36,6 +42,9 @@ Second \"item\" text" प्लेबैक समस्याओं को रोकने के लिए क्लाइंट वीडियो स्ट्रीम को स्पूफ करें प्लेबैक समस्याओं को रोकने के लिए क्लाइंट वीडियो स्ट्रीम को स्पूफ करें + + + @@ -137,7 +146,7 @@ Second \"item\" text" - + @@ -202,8 +211,10 @@ Second \"item\" text" + + - + @@ -229,9 +240,6 @@ Second \"item\" text" - - - @@ -255,6 +263,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml index 464bf02a9..5b8e7e12a 100644 --- a/patches/src/main/resources/addresources/values-hr-rHR/strings.xml +++ b/patches/src/main/resources/addresources/values-hr-rHR/strings.xml @@ -1,4 +1,5 @@ + + + + + + Provjere nisu uspjele @@ -35,6 +41,9 @@ Second \"item\" text" + + + @@ -136,7 +145,7 @@ Second \"item\" text" - + @@ -201,8 +210,10 @@ Second \"item\" text" + + - + @@ -228,9 +239,6 @@ Second \"item\" text" - - - @@ -254,6 +262,8 @@ Second \"item\" text"
+ + diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index c82619edb..8be320b4c 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -1,4 +1,5 @@ + + + Alkalmazás neve + + Egyéni + Alkalmazás ikonja + Eredeti + + ReVanced minimális + ReVanced méretezett + + Egyéni + Az ellenőrzések sikertelenek Hivatalos weboldal megnyitása @@ -120,6 +133,13 @@ A lejátszás nem működhet" Ennek a beállításnak a kikapcsolása lejátszási problémákat okozhat. Alapértelmezett kliens + + Eredeti hang kikényszerítése + Eredeti hang használata a hang nyelvén + Alapértelmezett hang használata + + A funkció használatához módosítsa a \"Videóstreamek hamisítása\" beállítást bármely kliensre, kivéve az Android Studiót + Hibakeresés Hibakeresési beállítások engedélyezése vagy letiltása @@ -797,7 +817,7 @@ Az hangsáv menü megjelenítéséhez állítsa a 'Videó stream-ek meghamisít A gombok elrejtve A gombok megjelennek - + Záróképernyő kártyák elrejtése A záróképernyő kártyák el vannak rejtve A záróképernyő kártyák megjelennek @@ -1400,11 +1420,13 @@ A miniatűr képernyőt a képernyő bal vagy jobb szélére húzhatja" A keresősáv kiemelõ színe Érvénytelen keresősáv színértéke + + Fejléc logó Alapértelmezett Normál - + ReVanced minimál Egyéni @@ -1510,13 +1532,6 @@ Ez a beállítás lehetővé teszi a magasabb videóminőségek feloldását"Hivatkozások megnyitása külső böngészőben Hivatkozások megnyitása az alkalmazáson belüli böngészőben - - Eredeti hang kikényszerítése - Eredeti hang használata a hang nyelvén - Alapértelmezett hang használata - - A funkció használatához módosítsa a \"Videóstreamek hamisítása\" beállítást bármely kliensre, kivéve az Android Studiót - Automatikus @@ -1601,6 +1616,14 @@ Korlátozások: A csúsztatás a kereséshez nincs engedélyezve + Android VR AV1 engedélyezése + "A videó kodek AVC (H.264), VP9 vagy AV1 + +A lejátszás akadozhat vagy képkockákat ejthet" + A videokodek AVC (H.264) vagy VP9 + "Ennek a beállításnak az engedélyezése szoftveres AV1 dekódolást használhat. + +Az AV1-es videólejátszás akadozhat vagy képkockákat ejthet." Hamisítás mellékhatásai • Kísérleti kliens, és bármikor leállhat • A videó megállhat 1:00-nál, vagy előfordulhat, hogy egyes régiókban nem elérhető @@ -1620,6 +1643,8 @@ Korlátozások: + + Névjegy Hirdetések diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index 4f37af712..5848a7adc 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -1,4 +1,5 @@ + + + Հավելվածի անվանումը + + Մաքսային + Հավելվածի պատկերակը + Բնօրինակ + + ReVanced մինիմալ + ReVanced սանդղակավորված + + Անհատականացված + Վերահսկումները ձախողվել են Բացել պաշտոնական կայքը @@ -120,6 +133,13 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Այս կարգավորումն անջատելը կարող է նվագարկման խնդիրներ առաջացնել։ Դեֆոլտ կլիենտ + + Բնօրինակ ձայն օգտագործել լեզուն + Օգտագործելով ձայնային օրիգինալ լեզուն + Վերջնական ձայն օգտագործվում է + + Այս հնարավորությունն օգտագործելու համար «Կեղծել վիդեո հոսքերը» տարբերակը փոխեք ցանկացած հաճախորդի, բացի Android Studio-ից + Debug Միացնել կամ անջատել առաջնորդման ռեժիմի ֆունկցիաները @@ -797,7 +817,7 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Կոճակները թաքցված են Կոճակները երևում են - + Էկրանի վերջում քարտերը թաքցնել Էկրանի վերջում քարտերը թաքցված են Էկրանի վերջում քարտերը երևում են @@ -1404,11 +1424,13 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Մարզումից դուրս ողորկության նշման գույնը Սխալ seekbar-ի գույնի արժեք + + Գլխագրի լոգո Լռակյաց Սովորական - + ReVanced մինիմալ Անհատական @@ -1514,13 +1536,6 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Բացել հղումները արտաքին բրաուզերում Բացել հղումները ներծրագրային բրաուզերում - - Բնօրինակ ձայն օգտագործել լեզուն - Օգտագործելով ձայնային օրիգինալ լեզուն - Վերջնական ձայն օգտագործվում է - - Այս հնարավորությունն օգտագործելու համար «Կեղծել վիդեո հոսքերը» տարբերակը փոխեք ցանկացած հաճախորդի, բացի Android Studio-ից - Ավտո @@ -1605,6 +1620,14 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Սահելը համար ընտրելը անջատված է + Թույլատրել Android VR AV1 + "Տեսակոդեկը AVC (H.264), VP9 կամ AV1 է + +Նվագարկումը կարող է կանգ առնել կամ կորցնել կադրեր" + Տեսակոդեկը AVC (H.264) կամ VP9 է + "Այս կարգավորումը միացնելը կարող է օգտագործել AV1 ծրագրային ապակոդավորում: + +AV1-ով տեսանյութի նվագարկումը կարող է ընդհատվել կամ կորցնել կադրեր:" Կեղծելու կողմնակի ազդեցություններ • Փորձնական հաճախորդ է և կարող է ցանկացած պահի դադարել աշխատել • Տեսանյութը կարող է դադարել 1:00-ին կամ հասանելի չլինել որոշ տարածաշրջաններում @@ -1624,6 +1647,8 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի + + Մասին Գովազդներ diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 3ea45f7e9..4e0ee5ec0 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -1,4 +1,5 @@ + + + Nama aplikasi + + Khusus + Ikon aplikasi + Asli + + ReVanced minimal + ReVanced berskala + + Khusus + Pemeriksaan gagal - Buka situs resminya + Buka situs resmi Abaikan - <h5>Aplikasi ini tampaknya tidak dipatch oleh Anda.</h5><br>Aplikasi ini mungkin tidak berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah dipatch sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan mempatchnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. - Dipatch pada perangkat yang berbeda - Tidak dipasang oleh ReVanced Manager - Dipatch lebih dari 10 menit yang lalu - Dipatch %s hari yang lalu + <h5>Aplikasi ini tampaknya tidak ditambal oleh Anda.</h5><br>Aplikasi ini mungkin tidak bisa berfungsi dengan baik, <b>bisa berbahaya atau bahkan membahayakan untuk digunakan</b>.<br><br>Pemeriksaan ini berarti bahwa aplikasi ini telah ditambal sebelumnya atau diperoleh dari orang lain:<br><br><small>%1$s</small><br>Sangat disarankan untuk <b>mencopot pemasangan aplikasi ini dan menambalnya sendiri</b> guna memastikan Anda menggunakan aplikasi yang tervalidasi dan aman.<p><br>Jika diabaikan, peringatan ini hanya akan ditampilkan dua kali. + Ditambal pada perangkat yang berbeda + Tidak terpasang oleh ReVanced Manager + Ditambal lebih dari 10 menit yang lalu + Ditambal %s hari yang lalu Tanggal pembuatan APK rusak Peringatan - Riwayat tontonan Anda tidak disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. + Riwayat tontonan Anda tidak sedang disimpan.<br><br>Hal ini kemungkinan besar disebabkan oleh pemblokir iklan DNS atau proksi jaringan.<br><br>Untuk memperbaikinya, masukkan daftar putih <b>s.youtube.com</b> atau matikan semua pemblokir DNS dan proksi. Jangan tampilkan lagi @@ -48,7 +61,7 @@ Second \"item\" text" Impor Salin Pengaturan ReVanced diatur ke bawaan - Mengimpor setelan %d + Setelan %d terimpor Impor gagal: %s Pengaturan pencarian Tidak ada hasil yang ditemukan untuk \'%s\' @@ -62,12 +75,12 @@ Second \"item\" text" • Tekan lama pada pengaturan untuk menelusuri ke jalur tersebut • Tekan Enter untuk menyimpan kueri pencarian ke riwayat • Pencarian mengabaikan huruf besar/kecil dan tanda baca -• Pengaturan orang tua muncul di atas pengaturan anak yang dinonaktifkan" +• Pengaturan utama muncul di atas pengaturan sampingan yang dinonaktifkan" Riwayat pencarian kosong Untuk menyimpan riwayat pencarian, ketik kueri pencarian dan tekan Enter - Tampilkan pengaturan riwayat pencarian - Pengaturan riwayat pencarian ditampilkan - Pengaturan riwayat pencarian tidak ditampilkan + Tampilkan riwayat pencarian setelan + Riwayat pencarian setelan ditampilkan + Riwayat pencarian setelan tidak ditampilkan Tampilkan ikon pengaturan ReVanced Ikon pengaturan ditampilkan Ikon pengaturan tidak ditampilkan @@ -120,6 +133,13 @@ Pemutaran mungkin tidak berfungsi" Mematikan pengaturan ini dapat menyebabkan masalah pemutaran. Klien bawaan + + Paksa bahasa audio asli + Menggunakan bahasa audio asli + Menggunakan audio bawaan + + Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke klien apa pun kecuali Android Studio + Debug Mengaktifkan atau menonaktifkan pilihan debugging @@ -402,14 +422,14 @@ Jika Doodle saat ini ditampilkan di wilayah Anda dan pengaturan penyembunyi ini Jumlah penayangan ditampilkan di umpan dan hasil pencarian "Keterbatasan: -• Rak Shorts, halaman channel, dan hasil pencarian mungkin masih menampilkan jumlah penayangan +• Rak Shorts, halaman saluran, dan hasil pencarian mungkin masih menampilkan jumlah penayangan • Fitur ini tidak berfungsi dengan faktor bentuk otomotif" Sembunyikan waktu unggah Waktu unggah disembunyikan di umpan dan hasil penelusuran Waktu unggah ditampilkan di umpan dan hasil penelusuran "Keterbatasan: -• Rak Shorts, halaman channel, dan hasil penelusuran mungkin masih menampilkan waktu unggah +• Rak Shorts, halaman saluran, dan hasil penelusuran mungkin masih menampilkan waktu unggah • Fitur ini tidak berfungsi dengan faktor bentuk otomotif" Sembunyikan kata kunci konten Sembunyikan pencarian dan feed video menggunakan penyaring kata kunci @@ -797,7 +817,7 @@ Untuk menampilkan menu trek audio, ubah 'Palsukan aliran video' ke iPadOS"Tombol disembunyikan Tombol ditampilkan - + Sembunyikan kartu layar akhir Kartu layar akhir disembunyikan Kartu layar akhir ditampilkan @@ -1402,11 +1422,13 @@ Miniplayer dapat diseret keluar layar ke kiri atau kanan" Warna aksen seekbar Nilai warna seekbar tidak sah + + Logo Header Bawaan Reguler - + ReVanced minimal Khusus @@ -1512,13 +1534,6 @@ Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi" Membuka tautan di peramban eksternal Membuka tautan di peramban dalam aplikasi - - Paksa bahasa audio asli - Menggunakan bahasa audio asli - Menggunakan audio bawaan - - Untuk menggunakan fitur ini, ubah \'Palsukan aliran video\' ke klien apa pun kecuali Android Studio - Otomatis @@ -1603,10 +1618,18 @@ Batasan: Geser untuk mencari tidak diaktifkan + Izinkan Android VR AV1 + "Codec video adalah AVC (H.264), VP9, atau AV1 + +Pemutaran mungkin tersendat atau kehilangan bingkai" + Codec video adalah AVC (H.264) atau VP9 + "Mengaktifkan pengaturan ini mungkin menggunakan perangkat lunak decoding AV1. + +Pemutaran video dengan AV1 mungkin tersendat atau kehilangan bingkai." Efek samping pemalsuan • Klien eksperimental dan dapat berhenti berfungsi kapan saja • Video mungkin berhenti pada 1:00, atau mungkin tidak tersedia di beberapa wilayah - • Menu trek audio tidak ada + • Menu trek audio hilang • Tidak ada codec video AV1 • Volume stabil tidak tersedia • Video anak-anak mungkin tidak dapat diputar saat keluar atau dalam mode penyamaran @@ -1622,6 +1645,8 @@ Batasan: + + Tentang Iklan @@ -1657,9 +1682,9 @@ Batasan: Tombol Beranda disembunyikan Tombol Beranda ditampilkan - Sembunyikan Cuplikan - Tombol Cuplikan disembunyikan - Tombol Cuplikan ditampilkan + Sembunyikan Sampel + Tombol Sampel disembunyikan + Tombol Sampel ditampilkan Sembunyikan Jelajahi Tombol Jelajahi disembunyikan diff --git a/patches/src/main/resources/addresources/values-is-rIS/strings.xml b/patches/src/main/resources/addresources/values-is-rIS/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-is-rIS/strings.xml +++ b/patches/src/main/resources/addresources/values-is-rIS/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index 48ee5cd1b..298999c84 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -1,4 +1,5 @@ + + + Nome dell\'app + + Personalizzato + Icona dell\'app + Originale + + ReVanced minimale + ReVanced ridimensionato + + Personalizzato + Controlli non riusciti Apri sito ufficiale @@ -120,6 +133,13 @@ La riproduzione potrebbe non funzionare" La disattivazione di questa impostazione potrebbe causare problemi di riproduzione. Client predefinito + + Forza la lingua audio originale + Utilizza la lingua audio originale + Utilizzo audio predefinito + + Per usare questa funzionalità, cambia \"Falsifica i flussi video\" a qualsiasi client eccetto Android Studio + Debug Abilita o disabilita impostazioni di debug @@ -797,7 +817,7 @@ Per mostrare il menu della traccia audio, cambia \"Falsifica flussi video\" su i I pulsanti sono nascosti I pulsanti sono visibili - + Nascondi le schede della schermata finale Le schede della schermata finale sono nascoste Le schede della schermata finale sono visibili @@ -1402,11 +1422,13 @@ Il riproduttore minimizzato può essere trascinato fuori dallo schermo a sinistr Il colore primario della barra di avanzamento Valore colore barra di avanzamento non valido + + Logo dell\'intestazione Predefinito Regolare - + ReVanced minimale Personalizzato @@ -1512,13 +1534,6 @@ Abilitare questa opzione può sbloccare qualità video più elevate" Apertura dei link nel browser esterno Apertura dei link nel browser in-app - - Forza la lingua audio originale - Utilizza la lingua audio originale - Utilizzo audio predefinito - - Per usare questa funzionalità, cambia \"Falsifica i flussi video\" a qualsiasi client eccetto Android Studio - Automatico @@ -1603,6 +1618,14 @@ Limitazioni: Scorri per avanzare non è abilitato + Consenti Android VR AV1 + "Il codec video è AVC (H.264), VP9 o AV1 + +La riproduzione potrebbe subire interruzioni o perdere fotogrammi" + Il codec video è AVC (H.264) o VP9 + "Abilitando questa impostazione potrebbe essere utilizzata la decodifica AV1 via software. + +La riproduzione video con AV1 potrebbe rallentare o perdere fotogrammi." Effetti collaterali della falsificazione • Client sperimentale e potrebbe smettere di funzionare in qualsiasi momento • Il video potrebbe interrompersi all\'1:00, o potrebbe non essere disponibile in alcune regioni @@ -1622,6 +1645,8 @@ Limitazioni: + + Informazioni Annunci diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index 3125fd399..c438e9573 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -1,4 +1,5 @@ + + + שם האפליקציה + + מותאם אישית + אייקון האפליקציה + מקורי + + ReVanced מינימלי + ReVanced מותאם גודל + + מותאם אישית + בדיקות נכשלו פתח אתר רשמי @@ -120,6 +133,13 @@ Second \"item\" text" כיבוי הגדרה זו עלול לגרום לבעיות השמעה. לקוח ברירת מחדל + + כפה שפת שמע מקורית + שימוש בשפת שמע מקורית + שימוש בשמע ברירת מחדל + + כדי להשתמש בתכונה זו, שנה את \'זיוף זרמי וידאו\' לכל לקוח מלבד Android Studio + איתור באגים הפעל או השבת אפשרויות לאיתור באגים @@ -797,7 +817,7 @@ Second \"item\" text" הלחצנים מוסתרים הלחצנים מוצגים - + הסתר כרטיסי מסך סיום כרטיסי מסך מסיום מוסתרים כרטיסי מסך מסיום מוצגים @@ -1405,11 +1425,13 @@ Second \"item\" text" צבע ההדגשה של סרגל הדילוג ערך צבע סרגל דילוג לא חוקי + + לוגו כותרת ברירת מחדל רגיל - + ReVanced מינימלי מותאם אישית @@ -1515,13 +1537,6 @@ Second \"item\" text" פותח קישורים בדפדפן חיצוני פותח קישורים בדפדפן בתוך היישום - - כפה שפת שמע מקורית - שימוש בשפת שמע מקורית - שימוש בשמע ברירת מחדל - - כדי להשתמש בתכונה זו, שנה את \'זיוף זרמי וידאו\' לכל לקוח מלבד Android Studio - אוטומטי @@ -1606,6 +1621,14 @@ Second \"item\" text" החלק כדי לדלג אינו מופעל + אפשר Android VR AV1 + "מקודד וידאו הוא AVC (H.264), VP9, או AV1 + +ההפעלה עשויה לגמגם או לדלג על פריימים" + מקודד וידאו הוא AVC (H.264) או VP9 + "הפעלת הגדרה זו עשויה להשתמש בפענוח תוכנה של AV1. + +הפעלת וידאו עם AV1 עלולה לגרום לגמגום או לדלוג על פריימים." תופעות לוואי של התחזות • לקוח ניסיוני ועשוי להפסיק לפעול בכל עת • הווידאו עשוי להיעצר בדקה 1:00, או ייתכן שלא יהיה זמין באזורים מסוימים @@ -1625,6 +1648,8 @@ Second \"item\" text" + + אודות מודעות diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index cbed69f3c..48ec4859a 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -1,4 +1,5 @@ + + + アプリ名 + + カスタム + アプリアイコン + オリジナル + + ReVanced (シンプル) + ReVanced (シンボル大) + + カスタム + チェックに失敗しました 公式サイトを開く @@ -69,8 +82,8 @@ Second \"item\" text" 設定の検索履歴は表示されます 設定の検索履歴は表示されません ReVanced の設定にアイコンを表示 - ReVanced の設定にアイコンが表示されます - ReVanced の設定にアイコンは表示されません + ReVanced の設定メニューにはアイコンが表示されます + ReVanced の設定メニューにはアイコンは表示されません ReVanced 設定の言語 "一部の言語の翻訳が欠落しているまたは不完全である可能性があります。 @@ -94,7 +107,7 @@ Second \"item\" text" 操作が必要です "GmsCore はバックグラウンドで実行する権限がありません。 -お使いのデバイスの「Don't kill my app!」ガイドに従い、GmsCore のインストール手順を適用してください。 +お使いのデバイスの「Don't kill my app!」ガイドに従い、GmsCore に対するデバイスの設定を変更してください。 これはアプリが正常に動作するために必要です。" ウェブサイトを開く @@ -107,7 +120,7 @@ GmsCore の電池の最適化を無効にしても、バッテリーの使用に 動画ストリームを偽装 - 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します + 動画の再生に失敗しないために、クライアントの動画ストリームを偽装します 動画ストリームを偽装 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します 動画ストリームを偽装 @@ -120,35 +133,42 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が この設定を無効にすると、動画の再生に失敗するようになる可能性があります。 デフォルトのクライアント + + オリジナルの音声を強制的に使用 + オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用しません + アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックを使用する場合があります + + この機能を使用するには、「動画ストリームを偽装」のクライアントを Android Studio 以外の任意のクライアントに変更してください + デバッグ - デバッグオプションを有効または無効にします + デバッグ オプションを有効または無効にします デバッグログを有効化 デバッグログは有効です デバッグログは無効です - スタック トレースをログに記録 - デバッグログにスタック トレースが含まれます - デバッグログにスタック トレースは含まれません + スタック トレースをログに保存 + デバッグログにはスタック トレースが含まれます + デバッグログにはスタック トレースは含まれません ReVanced のエラー時にトーストを表示 - エラーが発生した場合にトーストが表示されます - エラーが発生してもトーストは表示されません - "エラートーストをオフにすると、ReVanced のすべてのエラー通知が非表示になります。 + エラーが発生した場合にトースト通知が表示されます + エラーが発生した場合にトースト通知は表示されません + "エラーのトースト通知をオフにすると、ReVanced のすべてのエラー通知が表示されなくなります。 予期しないイベントが発生した場合でも通知されなくなります。" デバッグログのエクスポート ReVanced のデバッグログをクリップボードにコピーします - デバッグログは無効です + デバッグログが無効になっています ログが見つかりませんでした ログをコピーしました ログのエクスポートに失敗しました: %s デバッグログを消去 - 保存されているすべての ReVanced デバッグログを消去します + 保存されている ReVanced のすべてのデバッグログを消去します ログを消去しました 共有リンクを無害化 - トラッキング クエリ パラメータが共有リンクから削除されます - トラッキング クエリ パラメータは共有リンクから削除されません + 共有リンクから追跡パラメータが削除されます + 共有リンクから追跡パラメータは削除されません 共有リンクを youtube.com に変更 共有リンクには youtube.com が使用されます 共有リンクには music.youtube.com が使用されます @@ -168,8 +188,8 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が その他 動画 古い設定メニューを復元 - 旧バージョンの設定メニューが表示されます - 旧バージョンの設定メニューは表示されません + 古いスタイルの設定メニューが表示されます + 新しいスタイルの設定メニューが表示されます ショートのバックグラウンド再生を無効化 @@ -177,9 +197,9 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が ショート動画のバックグラウンド再生は有効です - プロトコルバッファを記録 - デバッグログに protocol buffer が含まれます - デバッグログに protocol buffer は含まれません + protocol buffer をログに保存 + デバッグログには protocol buffer が含まれます + デバッグログには protocol buffer は含まれません "この設定を有効にすると、一部の UI コンポーネントの画面上のテキストを含む、追加のレイアウトデータがログに記録されます。 これは、カスタムフィルターを作成する際にコンポーネントを識別するのに役立ちます。 @@ -501,7 +521,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 「動画の URL をコピー」ボタンを表示 ボタンがプレーヤー オーバーレイに表示されます。タップすると動画の URL が、長押しするとタイムスタンプ付きの URL がそれぞれコピーされます ボタンはプレーヤー オーバーレイに表示されません - 「動画のタイムスタンプ付き URL をコピー」ボタンを表示 + 「タイムスタンプ付き URL をコピー」ボタンを表示 ボタンがプレーヤー オーバーレイに表示されます。タップするとタイムスタンプ付きの URL が、長押しするとタイムスタンプなしの URL がそれぞれコピーされます ボタンはプレーヤー オーバーレイに表示されません @@ -594,12 +614,12 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が スワイプによる音量の変化量 オーバーレイのスタイル 横型 - 横型 (最小限 - 画面上部) - 横型 (最小限 - 画面中央) + 横型 (シンプル - 画面上部) + 横型 (シンプル - 画面中央) 円形 - 円形 (最小限) + 円形 (シンプル) 縦型 - 縦型 (最小限) + 縦型 (シンプル) スワイプによる動画の切り替えを有効化 全画面表示中に左 / 右にスワイプすると、前 / 次の動画に切り替わります 全画面表示中に左 / 右にスワイプしても、前 / 次の動画に切り替わりません @@ -670,7 +690,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 購入ボタンは表示されません 購入ボタンは表示されます - 「保存」を非表示にする + 保存ボタンを非表示 「保存」ボタンは表示されません 「保存」ボタンは表示されます @@ -708,16 +728,16 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が ボタンをアイコンのみで表示 ナビゲーション ボタンはアイコンのみで表示されます ナビゲーション ボタンはアイコンと文字で表示されます - ステータスバーの半透明化を無効化 + 半透明ステータスバーを無効化 ステータスバーは常に透けません ステータスバーは状況に応じて透けます 一部のデバイスでは、この機能を有効にすると、システムのナビゲーション バーが半透明になりアプリ内のコンポーネントに重なってしまう可能性があります。 - ライトモード時のナビゲーション バーの半透明化を無効にする - ライトモード時にナビゲーション バーは透けません - ライトモード時にナビゲーション バーが状況に応じて透けます - ダークモード時のナビゲーション バーの半透明化を無効にする - ダークモード時にナビゲーション バーは透けません - ダークモード時にナビゲーション バーは状況に応じて透けます + ライトモード時の半透明バーを無効化 + ライトモード時にはナビゲーション バーは透けません + ライトモード時にはナビゲーション バーが状況に応じて透けます + ダークモード時の半透明バーを無効化 + ダークモード時にはナビゲーション バーは透けません + ダークモード時にはナビゲーション バーが状況に応じて透けます フライアウト メニュー @@ -799,7 +819,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 前の動画ボタンと次の動画ボタンは表示されません 前の動画ボタンと次の動画ボタンは表示されます - + 終了画面カードを非表示 終了画面カードは表示されません 終了画面カードは表示されます @@ -833,18 +853,18 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が ショート プレーヤーのコンポーネントを表示または非表示にします ホームフィードでショートを非表示 - ショート動画はホームフィードおよび関連動画に表示されません - ショート動画はホームフィードおよび関連動画に表示されます + ホームフィードおよび関連動画にはショート動画は表示されません + ホームフィードおよび関連動画にはショート動画が表示されます 検索結果でショートを非表示 - ショート動画は検索結果に表示されません - ショート動画は検索結果に表示されます + 検索結果にはショート動画は表示されません + 検索結果にはショート動画が表示されます 登録チャンネル フィードでショートを非表示 - ショート動画は登録チャンネル フィードに表示されません - ショート動画は登録チャンネル フィードに表示されます + 登録チャンネル フィードにはショート動画は表示されません + 登録チャンネル フィードにはショート動画が表示されます 再生履歴でショートを非表示 - ショート動画は再生履歴に表示されません - ショート動画は再生履歴に表示されます + 再生履歴にはショート動画は表示されません + 再生履歴にはショート動画が表示されます 「Super Thanks を購入する」ボタンを非表示 「Super Thanks を購入する」ボタンは表示されません 「Super Thanks を購入する」ボタンは表示されます @@ -1047,7 +1067,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が シークバー サムネイルは、再生中の動画と同じ画質になります。 この機能は、非常に高速なインターネット接続を使用して 720P 以下の画質で動画を視聴する場合に最適です。" - 古いスタイルのシークバー サムネイルを復元 + 古いシークバー サムネイルを復元 シーク中のサムネイルはシークバーの上に表示されます シーク中のサムネイルはプレーヤー画面全体に表示されます @@ -1406,20 +1426,22 @@ Automotive レイアウト シークバーのアクセントカラーを編集します シークバーの色の値が無効です + + ヘッダーロゴ デフォルト 標準 - - ReVanced minimal + + ReVanced (シンプル) カスタム - 画像表示の地域制限を回避する + 画像表示の地域制限を回避 yt4.ggpht.com から画像を取得します "オリジナルの画像ホストから画像を取得します -この機能を有効にすると、一部の地域でブロックされている画像が表示される可能性があります" +この機能を有効にすると、一部の地域でブロックされている画像が表示されるようになる可能性があります" @@ -1456,10 +1478,10 @@ Automotive レイアウト DeArrow は一時的に利用できません - ReVanced のお知らせを表示する - お知らせは、アプリ起動時に表示されます - お知らせは、アプリ起動時に表示されません - アプリ起動時にお知らせを表示する + ReVanced のお知らせを表示 + アプリの起動時にお知らせが表示されます + アプリの起動時にお知らせは表示されません + アプリの起動時にお知らせを表示します お知らせの取得に失敗しました 閉じる @@ -1476,7 +1498,7 @@ Automotive レイアウト 動画のループ再生がオフになっています - デバイスの画面サイズを偽装する + デバイスの画面サイズを偽装 "デバイスの画面サイズは偽装されています より高画質な映像がアンロックされる可能性がありますが、動画のカクつき、バッテリー寿命の悪化、予期せぬ副作用が @@ -1489,16 +1511,16 @@ Automotive レイアウト 触覚フィードバック 触覚フィードバックの設定を変更します - チャプターの触覚フィードバックを無効にする + チャプターの触覚フィードバックを無効化 チャプターの触覚フィードバックは無効です チャプターの触覚フィードバックは有効です 精密シークの触覚フィードバックを無効化 精密シークの触覚フィードバックは無効です 精密シークの触覚フィードバックは有効です - シーク取り消しの触覚フィードバックを無効にする + シーク取り消しの触覚フィードバックを無効化 シーク取り消しの触覚フィードバックは無効です シーク取り消しの触覚フィードバックは有効です - ズームの触覚フィードバックを無効にする + ズームの触覚フィードバックを無効化 ズームの触覚フィードバックは無効です ズームの触覚フィードバックは有効です @@ -1506,8 +1528,8 @@ Automotive レイアウト 最近アカウントのログイン情報を変更した場合は、MicroG をアンインストールして再インストールしてください。 - URL リダイレクトを回避する - YouTube の URL リダイレクトを経由せずにリンクへ移動します + URL リダイレクトを回避 + YouTube の URL リダイレクトを経由せずにリンク先へ移動します YouTube の URL リダイレクトを経由してリンク先へ移動します @@ -1515,33 +1537,26 @@ Automotive レイアウト 外部ブラウザでリンクを開きます アプリ内ブラウザでリンクを開きます - - オリジナルの音声を強制的に使用 - オリジナルの音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックは使用しません - アプリが選択した音声トラック (言語) を使用します\n\nオートダビングを含む吹き替えの音声トラックを使用する場合があります - - この機能を使用するには、「動画ストリームを偽装」のクライアントを Android Studio 以外の任意のクライアントに変更してください - 自動 - 画質の変更を保存する + 画質の変更を保存 画質の変更はすべての動画に適用されます 画質の変更は現在の動画にのみ適用されます 画質の変更時にトーストを表示 - デフォルトの画質が変更されたとき、トーストが表示されます - デフォルトの画質が変更されたとき、トーストは表示されません + デフォルトの画質が変更された場合にトースト通知が表示されます + デフォルトの画質が変更された場合にトースト通知は表示されません デフォルトの画質(Wi-Fi) デフォルトの画質(携帯回線) - ショートの画質の変更を保存する + ショートの画質の変更を保存 画質の変更はすべてのショート動画に適用されます 画質の変更は現在のショート動画にのみ適用されます デフォルトのショートの画質(Wi-Fi) デフォルトのショートの画質(携帯回線) 携帯回線 Wi-Fi - デフォルトの画質 (%1$s): %2$s - ショートの画質 (%1$s): %2$s + デフォルトの画質の変更 (%1$s): %2$s + ショートの画質の変更 (%1$s): %2$s 再生速度設定ボタンを表示 @@ -1561,33 +1576,33 @@ Automotive レイアウト 古いスタイルの再生速度メニューが表示されます 新しいスタイルの再生速度メニューが表示されます カスタム再生速度リスト - カスタム再生速度を追加または変更します - 再生速度は %s 未満である必要があります - カスタム再生速度が無効です + カスタム再生速度リストを編集します + 再生速度は %s 未満でなければなりません + カスタム再生速度リストの値が無効です 自動 長押し倍速再生の速度 再生速度の範囲は 0-8 で、0 および 8 は含まれません - 再生速度の変更を保存する + 再生速度の変更を保存 再生速度の変更はすべての動画に適用されます 再生速度の変更は現在の動画にのみ適用されます 再生速度の変更時にトーストを表示 - デフォルトの再生速度が変更されたとき、トーストが表示されます - デフォルトの再生速度が変更されたとき、トーストは表示されません + デフォルトの再生速度が変更されたときにトースト通知が表示されます + デフォルトの再生速度が変更されたときにトースト通知は表示されません デフォルトの再生速度 - デフォルトの再生速度: %s + デフォルトの再生速度の変更: %s - HDR 動画を無効にする + HDR 動画を無効化 HDR 動画は無効です HDR 動画は有効です AVC (H.264) を強制的に使用 ビデオ コーデックは強制的に AVC (H.264) になります ビデオ コーデックは自動的に決定されます "利点: -• バッテリー寿命を延ばすことができる -• 古いデバイスで失われた動画解像度を復元できる +• バッテリー寿命が延びる可能性がある +• 古いデバイスで失われた動画解像度を復元できる可能性がある 制限事項: • 最大解像度が 1080p @@ -1606,6 +1621,14 @@ Automotive レイアウト スライドによるシークは無効です。プレーヤー画面を左右にスライドしても、前後にシークしません + Android VR で AV1 を許可 + "ビデオ コーデックは AVC (H.264)、VP9、AV1 のいずれかになります + +再生がカクつくまたはコマ落ちが発生する場合があります" + ビデオ コーデックは AVC (H.264)、VP9 のいずれかになります + "この設定を有効にすると、AV1 のソフトウェア デコードが使用される場合があります。 + +AV1 での動画再生は、カクつくまたはコマ落ちが発生する場合があります。" 偽装による副作用 • 実験的なクライアントであり、いつでも動作しなくなる可能性がある • 動画が 01:00 で停止する、または一部の地域で利用できない可能性がある @@ -1615,9 +1638,9 @@ Automotive レイアウト • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある •「オリジナルの音声を強制的に使用」が利用できない - 統計情報に表示する - 統計情報に現在のクライアントが表示されます - 統計情報に現在のクライアントは表示されません + 統計情報にクライアントを表示 + 統計情報には現在のクライアントが表示されます + 統計情報には現在のクライアントは表示されません 音声ストリームの言語 特定の音声言語を選択するには、「オリジナルの音声を強制的に使用」を無効にしてください @@ -1625,6 +1648,8 @@ Automotive レイアウト + + ReVanced について 広告 @@ -1640,7 +1665,7 @@ Automotive レイアウト 常時リピートを有効化 常時リピートは有効です\n\nリピート設定が保存され常時適用されます - 常時リピートは無効です\n\nリピート設定は保存されずリセットされます + 常時リピートは無効です\n\nリピート設定は保存されず毎回リセットされます キャストボタンを非表示 @@ -1714,15 +1739,15 @@ Automotive レイアウト メッセージを削除しました - 削除されたメッセージを表示 + 削除されたメッセージの表示方法 削除されたメッセージを表示しない - スポイラーの後ろに削除されたメッセージを非表示にする - クロスアウトテキストとして削除されたメッセージを表示 + 削除されたメッセージをスポイラー表示で隠して表示する + 削除されたメッセージを取り消し線つきで表示する - チャンネルポイントを自動的に獲得する - チャンネルポイントは自動的に請求されます - チャンネルポイントは自動的に請求されません + チャンネルポイントの受け取りを自動化 + チャンネルポイントの受け取りは自動的に行われます + チャンネルポイントの受け取りは自動的には行われません diff --git a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-ka-rGE/strings.xml +++ b/patches/src/main/resources/addresources/values-ka-rGE/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml +++ b/patches/src/main/resources/addresources/values-kk-rKZ/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-km-rKH/strings.xml b/patches/src/main/resources/addresources/values-km-rKH/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-km-rKH/strings.xml +++ b/patches/src/main/resources/addresources/values-km-rKH/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml index caaa3813c..a521cc779 100644 --- a/patches/src/main/resources/addresources/values-kn-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-kn-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + ಪರಿಶೀಲನೆ ವಿಫಲವಾಗಿದೆ ಅಧಿಕೃತ ಜಾಲತಾಣ ತೆರೆಯಿರಿ @@ -49,6 +55,9 @@ Second \"item\" text" + + + @@ -150,7 +159,7 @@ Second \"item\" text" - + @@ -215,8 +224,10 @@ Second \"item\" text" + + - + @@ -242,9 +253,6 @@ Second \"item\" text" - - - @@ -268,6 +276,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index fd15e110b..ca0df154b 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -1,4 +1,5 @@ + + + 앱 이름 + + 사용자 정의 + 앱 아이콘 + 원본 + + ReVanced 최소화 + ReVanced 크기 조정 + + 사용자 정의 + 환경 검사에 실패하였습니다 공식 홈페이지 열기 @@ -120,6 +133,13 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 이 설정을 비활성화하면 재생 문제가 발생할 수 있습니다. 기본 클라이언트 + + 원본 오디오 언어 강제로 활성화하기 + 원본 오디오 언어를 사용 중입니다 + 기본 오디오 언어를 사용 중입니다 + + 이 기능을 사용하려면, \'동영상 스트림 변경하기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요 + 디버깅 디버깅 옵션을 활성화하거나 비활성화할 수 있습니다 @@ -314,7 +334,7 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 팟캐스트 살펴보기 섹션 숨기기 팟캐스트 살펴보기 섹션이 숨겨집니다 팟캐스트 살펴보기 섹션이 표시됩니다 - 정보 카드 숨기기 + 크리에이터 정보 카드 섹션 숨기기 크리에이터 정보 카드 섹션이 숨겨집니다 크리에이터 정보 카드 섹션이 표시됩니다 주요 개념 섹션 숨기기 @@ -608,7 +628,7 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 동작 버튼 플레이어 하단에서 동작 버튼을 숨기거나 표시할 수 있습니다 - 빛나는 \'좋아요\' / \'구독\' 비활성화하기 + 빛나는 \'좋아요\' / \'구독\' 버튼 비활성화하기 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용하지 않습니다 동영상에서 \'Like (좋아요)\' 또는 \'Subscribe (구독)\' 버튼이 언급되었을 경우에 해당 버튼에 빛나는 애니메이션을 적용합니다 좋아요 & 싫어요 버튼 숨기기 @@ -796,7 +816,7 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 이전 & 다음 동영상 버튼이 숨겨집니다 이전 & 다음 동영상 버튼이 표시됩니다 - + 최종 화면 카드 숨기기 최종 화면 카드가 숨겨집니다 최종 화면 카드가 표시됩니다 @@ -1067,12 +1087,12 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 건너뛰기 버튼이 몇 초 후에 숨겨집니다 건너뛰기 버튼이 해당 구간이 끝날 때까지 표시됩니다 건너뛰기 버튼 표시 시간 - 건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 설정할 수 있습니다 + 건너뛰기 및 하이라이트로 건너뛰기 버튼이 자동으로 숨겨지기 전까지 표시되는 시간을 지정할 수 있습니다 건너뛰기 취소 메시지 표시하기 구간을 자동으로 건너뛰는 경우에 팝업 메시지를 표시합니다\n\n팝업 메시지를 탭하여 건너뛰기를 취소할 수 있습니다 팝업 메시지를 표시하지 않습니다 건너뛰기 취소 메시지 표시 시간 - 건너뛰기 취소 팝업 메시지가 표시되는 시간을 설정할 수 있습니다 + 건너뛰기 취소 팝업 메시지가 표시되는 시간을 지정할 수 있습니다 1 초 2 초 3 초 @@ -1108,7 +1128,7 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 건너뛴 횟수 기록을 비활성화합니다 건너뛸 최소 구간 길이 설정한 값(초)보다 작은 구간은 건너뛰지 않으며, 재생바에도 표시되지 않습니다 - 잘못된 지속 시간입니다 + 잘못된 표시 시간입니다 비공개 사용자 아이디 비공개 사용자 아이디는 SponsorBlock 서버에서 구간을 제출하거나 건너뛴 구간 정보를 기록하는데 사용되는 고유 아이디 입니다. 절대 다른 이에게 공개하지 마세요 비공개 사용자 아이디는 30자 이상이어야 합니다 @@ -1410,11 +1430,13 @@ YouTube Premium 사용자라면 이 설정은 필요하지 않을 수 있습니 재생바 보조 색상을 지정할 수 있습니다 잘못된 재생바 색상입니다 + + 헤더 로고 기본값 일반 - + ReVanced 최소화 사용자 정의 @@ -1520,13 +1542,6 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" 앱 내에서 외부 링크를 열 경우에 외부 브라우저를 사용합니다 앱 내에서 외부 링크를 열 경우에 내부 브라우저를 사용합니다 - - 원본 오디오 언어 강제로 활성화하기 - 원본 오디오 언어를 사용 중입니다 - 기본 오디오 언어를 사용 중입니다 - - 이 기능을 사용하려면, \'동영상 스트림 변경하기\'에서 기본 클라이언트를 Android Studio를 제외한 다른 클라이언트로 변경하세요 - 자동 @@ -1611,6 +1626,14 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" 슬라이드하여 탐색을 비활성화합니다 + Android VR AV1 허용하기 + "동영상 코덱이 AVC (H.264), VP9 또는 AV1으로 결정됩니다 + +동영상 재생이 끊기거나 프레임이 손실될 수 있습니다" + 동영상 코덱이 AVC (H.264) 또는 VP9으로 결정됩니다 + "이 설정을 활성화하면, 소프트웨어 AV1 디코딩이 사용될 수 있습니다. + +AV1이 사용된 동영상 재생이 끊기거나 프레임이 손실될 수 있습니다." 변경에 따른 부작용 • 실험용 클라이언트이며 언제든지 작동이 중단될 수 있습니다 • 동영상이 1:00에 멈출 수 있으며, 일부 지역에서는 이용이 불가능할 수 있습니다 @@ -1630,6 +1653,8 @@ DeArrow에 대해 자세히 알아보려면 여기를 탭하세요" + + 정보 광고 diff --git a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-ky-rKG/strings.xml +++ b/patches/src/main/resources/addresources/values-ky-rKG/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-lo-rLA/strings.xml +++ b/patches/src/main/resources/addresources/values-lo-rLA/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 0740bbe95..28c776da1 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -1,4 +1,5 @@ + + + Programos pavadinimas + + Pasirinktinis + Programos piktograma + Originalus + + ReVanced minimalus + ReVanced masteliu + + Pasirinktinis + Patikrinimai nepavyko Atidaryti oficialią svetainę @@ -120,6 +133,13 @@ Grojimas gali neveikti" Išjungus šį nustatymą, gali kilti atkūrimo problemų. Numatytasis klientas + + Priversti originalią garso kalbą + Naudojama originali garso kalba + Naudojamas numatytasis garsas + + Kad naudotumėte šią funkciją, pakeiskite „Klastoti vaizdo įrašų srautus“ į bet kurį klientą, išskyrus „Android Studio“ + Debugavimas Įgalinti arba išjungti derinimo parinktis @@ -797,7 +817,7 @@ Norėdami parodyti garso takelio meniu, pakeiskite „Klastoti vaizdo srautus“ Mygtukai yra paslėpti Mygtukai yra rodomi - + Slėpti ekrano pabaigos korteles Ekrano pabaigos kortelės yra paslėptos Ekrano pabaigos kortelės yra rodomos @@ -1404,11 +1424,13 @@ Ribojimas: įrankių juostoje esantis atgal mygtukas gali neveikti." Ieškojimo juostos akcento spalva Netinkama slankiklio spalvos vertė + + Antraštės logotipas Numatytasis Įprastas - + ReVanced minimalus Pasirinktinis @@ -1514,13 +1536,6 @@ Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti v Nuorodos atidaromos išorinėje naršyklėje Nuorodos atidaromos programėlės naršyklėje - - Priversti originalią garso kalbą - Naudojama originali garso kalba - Naudojamas numatytasis garsas - - Kad naudotumėte šią funkciją, pakeiskite „Klastoti vaizdo įrašų srautus“ į bet kurį klientą, išskyrus „Android Studio“ - Automatinis @@ -1605,6 +1620,14 @@ Apribojimai: Slinkimas, kad ieškotumėte, neišjungtas + Leisti Android VR AV1 + "Vaizdo kodekas yra AVC (H.264), VP9 arba AV1 + +Gali strigti arba praleisti kadrus" + Vaizdo kodekas yra AVC (H.264) arba VP9 + "Įjungus šį nustatymą, gali būti naudojamas programinės įrangos AV1 dekodavimas. + +Vaizdo įrašo atkūrimas su AV1 gali strigti arba praleisti kadrus." Klastojimo šalutiniai efektai • Eksperimentinis klientas ir bet kada gali nustoti veikti • Vaizdo įrašas gali sustoti ties 1:00 arba gali būti nepasiekiamas kai kuriuose regionuose @@ -1624,6 +1647,8 @@ Apribojimai: + + Apie Skelbimai diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index 1b311ba76..7ad9984aa 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -1,4 +1,5 @@ + + + Lietotnes nosaukums + + Pielāgots + Lietotnes ikona + Oriģināls + + ReVanced minimāls + ReVanced mērogots + + Pielāgots + Pārbaudes neizdevās Atvērt oficiālo vietni @@ -120,6 +133,13 @@ Atskaņošana var nedarboties" Šī iestatījuma izslēgšana var izraisīt atskaņošanas problēmas. Noklusētā klients + + Piespiest oriģinālo audio valodu + Izmantot oriģinālo audio valodu + Tiek izmantots noklusējuma audio + + Lai izmantotu šo funkciju, mainiet \"Viltotās video plūsmas\" uz jebkuru klientu, izņemot Android Studio + Atkļūdošana Iespējot vai atspējot atkļūdošanas opcijas @@ -797,7 +817,7 @@ Lai parādītu audio celiņa izvēlni, mainiet \"Atdarināt video straumes\" uz Pogas ir paslēptas Pogas ir redzamas - + Paslēpt ekrāna beigās esošās kartītes Ekrāna beigās esošās kartītes ir paslēptas Ekrāna beigās esošās kartītes ir redzamas @@ -1404,11 +1424,13 @@ Miniatskaņotāju var pārvilkt no ekrāna uz kreiso vai labo pusi" Meklētājjoslas akcenta krāsa Nederīga meklētāja joslas krāsas vērtība + + Galvenes logotips Noklusējums Parasts - + ReVanced minimāls Pielāgots @@ -1514,13 +1536,6 @@ Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atsk Saišu atvēršana ārējā pārlūkprogrammā Saišu atvēršana lietotnes pārlūkprogrammā - - Piespiest oriģinālo audio valodu - Izmantot oriģinālo audio valodu - Tiek izmantots noklusējuma audio - - Lai izmantotu šo funkciju, mainiet \"Viltotās video plūsmas\" uz jebkuru klientu, izņemot Android Studio - Automātiski @@ -1605,6 +1620,14 @@ Ierobežojumi: Slīdēšana, lai meklētu, nav iespējota + Atļaut Android VR AV1 + "Video kodeks ir AVC (H.264), VP9 vai AV1 + +Atskaņošana var raustīties vai izlaist kadrus" + Video kodeks ir AVC (H.264) vai VP9 + "Šī iestatījuma iespējošana var izmantot programmatūras AV1 dekodēšanu. + +AV1 video atskaņošana var raustīties vai izlaist kadrus." Viltotu straumju blakusparādības • Eksperimentāls klients un jebkurā brīdī var pārtraukt darbu • Video var apstāties pulksten 1:00 vai nebūt pieejams dažos reģionos @@ -1624,6 +1647,8 @@ Ierobežojumi: + + Par Reklāmas diff --git a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-mk-rMK/strings.xml +++ b/patches/src/main/resources/addresources/values-mk-rMK/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-ml-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ml-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-mn-rMN/strings.xml +++ b/patches/src/main/resources/addresources/values-mn-rMN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-mr-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-mr-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml index 399669ca3..622dd054e 100644 --- a/patches/src/main/resources/addresources/values-ms-rMY/strings.xml +++ b/patches/src/main/resources/addresources/values-ms-rMY/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -228,9 +239,6 @@ Second \"item\" text" - - - @@ -254,6 +262,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-my-rMM/strings.xml b/patches/src/main/resources/addresources/values-my-rMM/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-my-rMM/strings.xml +++ b/patches/src/main/resources/addresources/values-my-rMM/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-nb-rNO/strings.xml +++ b/patches/src/main/resources/addresources/values-nb-rNO/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml index 961293711..d1b6ab9cd 100644 --- a/patches/src/main/resources/addresources/values-ne-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ne-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + ReVanced Manager द्वारा स्थापित छैन APK निर्माण मिति खराब भएको छ @@ -36,6 +42,9 @@ Second \"item\" text" + + + @@ -137,7 +146,7 @@ Second \"item\" text" - + @@ -202,8 +211,10 @@ Second \"item\" text" + + - + @@ -229,9 +240,6 @@ Second \"item\" text" - - - @@ -255,6 +263,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index ae7adbe7b..b4d451dc2 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -1,4 +1,5 @@ + + + Appnaam + + Aangepast + App-pictogram + Origineel + + ReVanced minimaal + ReVanced geschaald + + Aangepast + Controle mislukt Open officiële website @@ -120,6 +133,13 @@ Afspeelproblemen kunnen optreden" Het uitschakelen van deze instelling kan afspeelproblemen veroorzaken. Standaard client + + Forceer de originele audiotaal + De oorspronkelijke audiotaal gebruiken + Standaard audio gebruiken + + Om deze functie te gebruiken, wijzig \'Videostreams spoofen\' naar elke client behalve Android Studio + Debuggen Schakel debugopties in of uit @@ -797,7 +817,7 @@ Om het audiotracks-menu te tonen, wijzig 'Videostreams spoofen' naar iPadOS"Knoppen zijn verborgen Knoppen worden weergegeven - + Verberg eindschermkaarten Eindschermkaarten zijn verborgen Eindschermkaarten worden weergegeven @@ -1401,11 +1421,13 @@ De miniplayer kan naar links of rechts van het scherm worden gesleept" De accentkleur van de zoekbalk Ongeldige waarde voor de kleur van de schuifregelaar + + Headerlogo Standaard Normaal - + ReVanced minimaal Aangepast @@ -1511,13 +1533,6 @@ Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen" Koppelingen openen in externe browser Koppelingen openen in in-app browser - - Forceer de originele audiotaal - De oorspronkelijke audiotaal gebruiken - Standaard audio gebruiken - - Om deze functie te gebruiken, wijzig \'Videostreams spoofen\' naar elke client behalve Android Studio - Automatisch @@ -1602,6 +1617,14 @@ Beperkingen: Schuiven om te zoeken is niet ingeschakeld + Sta Android VR AV1 toe + "Videocodec is AVC (H.264), VP9 of AV1 + +Afspelen kan haperen of frames overslaan" + Videocodec is AVC (H.264) of VP9 + "Het inschakelen van deze instelling kan gebruikmaken van softwarematige AV1-decodering. + +Het afspelen van video met AV1 kan haperen of frames overslaan." Spoofing-neveneffecten • Experimentele client en kan elk moment stoppen met werken • Video kan stoppen om 1:00, of is mogelijk niet beschikbaar in sommige regio\'s @@ -1621,6 +1644,8 @@ Beperkingen: + + Over Advertenties diff --git a/patches/src/main/resources/addresources/values-or-rIN/strings.xml b/patches/src/main/resources/addresources/values-or-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-or-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-or-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-pa-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-pa-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 6cc0aa06e..345a5f981 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -1,4 +1,5 @@ + + + Nazwa aplikacji + + Własna + Ikona aplikacji + Oryginalna + + ReVanced minimalna + ReVanced skalowana + + Niestandardowa + Sprawdzanie nie powiodło się Otwórz oficjalną stronę internetową @@ -120,6 +133,13 @@ Odtwarzanie może nie działać" Wyłączenie tego ustawienia może spowodować problemy z odtwarzaniem. Domyślny klient + + Wymuś język oryginalnego dźwięku + Używanie oryginalnego języka audio + Używanie domyślnego dźwięku + + Aby użyć tej funkcji, zmień \'Fałszuj strumienie wideo\' na dowolnego klienta z wyjątkiem Android Studio + Debugowanie Włącz lub wyłącz opcje debugowania @@ -793,7 +813,7 @@ Aby wyświetlić menu ścieżek audio, zmień „Fałszowanie strumieni wideo” Przyciski są ukryte Przyciski są widoczne - + Karty ekranu końcowego Karty ekranu końcowego są ukryte Karty ekranu końcowego są widoczne @@ -1399,11 +1419,13 @@ Odtwarzacz można przeciągnąć poza ekran w lewo lub w prawo" Kolor akcentu paska postępu Nieprawidłowa wartość koloru paska postępu + + Logo nagłówka Domyślne Zwykłe - + ReVanced minimalistyczne Niestandardowe @@ -1509,13 +1531,6 @@ Włączenie tego może odblokować wyższe jakości wideo" Otwieranie linków w zewnętrznej przeglądarce Otwieranie linków w przeglądarce w aplikacji - - Wymuś język oryginalnego dźwięku - Używanie oryginalnego języka audio - Używanie domyślnego dźwięku - - Aby użyć tej funkcji, zmień \'Fałszuj strumienie wideo\' na dowolnego klienta z wyjątkiem Android Studio - Automatycznie @@ -1600,6 +1615,14 @@ Ograniczenia: Przesuń, aby przeszukiwać nie jest włączony + Zezwól na Android VR AV1 + "Kodek wideo to AVC (H.264), VP9 lub AV1 + +Odtwarzanie może się zacinać lub gubić klatki" + Kodek wideo to AVC (H.264) lub VP9 + "Włączenie tego ustawienia może używać programowego dekodowania AV1. + +Odtwarzanie wideo z AV1 może powodować zacinanie się lub gubienie klatek." Skutki uboczne fałszowania • Eksperymentalny klient i może przestać działać w każdej chwili • Wideo może zatrzymać się o 1:00 lub może być niedostępne w niektórych regionach @@ -1619,6 +1642,8 @@ Ograniczenia: + + O programie Reklamy diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index 5e2d96d1b..8c8ed0479 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -1,4 +1,5 @@ + + + Nome do aplicativo + + Personalizado + Ícone do aplicativo + Original + + ReVanced mínimo + ReVanced escalado + + Personalizado + Verificação falhou Abrir o site oficial @@ -120,6 +133,13 @@ A reprodução pode não funcionar" Desativar esta configuração pode causar problemas de reprodução. Cliente padrão + + Forçar idioma do áudio original + Usar o idioma original do áudio + Usando áudio padrão + + Para usar este recurso, mude \'Falsificar fluxos de vídeo\' para qualquer cliente, exceto o Android Studio + Depuração Ativar ou desativar opções de depuração @@ -795,7 +815,7 @@ Se alterar esta configuração não fizer efeito, tente mudar para o modo anôni Os botões estão ocultos Os botões serão exibidos - + Ocultar cartões de tela final Cartões de tela final estão ocultos Cartões de tela final não estão ocultos @@ -1400,11 +1420,13 @@ O miniplayer pode ser arrastado para fora da tela para a esquerda ou direita"A cor de destaque da barra de progresso Valor de cor da barra de busca inválido + + Logotipo do cabeçalho Padrão Regular - + ReVanced mínimo Personalizado @@ -1510,13 +1532,6 @@ Habilitar isso pode desbloquear qualidades de vídeo mais altas" Abrindo links no navegador externo Abrindo links no navegador interno do app - - Forçar idioma do áudio original - Usar o idioma original do áudio - Usando áudio padrão - - Para usar este recurso, mude \'Falsificar fluxos de vídeo\' para qualquer cliente, exceto o Android Studio - Automático @@ -1601,6 +1616,14 @@ Limitações: Gesto na barra de busca está desativado + Permitir Android VR AV1 + "O codec de vídeo é AVC (H.264), VP9 ou AV1 + +A reprodução pode engasgar ou perder quadros" + O codec de vídeo é AVC (H.264) ou VP9 + "Ativar esta configuração pode usar decodificação de software AV1. + +A reprodução de vídeo com AV1 pode gaguejar ou perder quadros." Efeitos colaterais da falsificação • Cliente experimental e pode parar de funcionar a qualquer momento • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões @@ -1620,6 +1643,8 @@ Limitações: + + Sobre Anúncios diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index 5b0293be1..faa9de5b0 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -1,4 +1,5 @@ + + + Nome da aplicação + + Personalizado + Ícone da aplicação + Original + + ReVanced mínimo + ReVanced dimensionado + + Personalizado + Falha na verificação Abrir site oficial @@ -120,6 +133,13 @@ A reprodução pode não funcionar" Desativar esta configuração pode causar problemas de reprodução. Cliente predefinido + + Forçar idioma original do áudio + Usando o idioma de áudio original + Usando o áudio predefinido + + Para usar este recurso, altere \'Falsificar streams de vídeo\' para qualquer cliente, exceto o Android Studio + Depuração Ativar ou desativar opções de depuração @@ -797,7 +817,7 @@ Para mostrar o menu da faixa de áudio, altere 'Falsificar fluxos de vídeo' par Botões estão ocultos Botões são exibidos - + Esconder cartões de ecrã final Cartões de fim de ecrã estão escondidos Cartões de fim de ecrã são exibidos @@ -1403,11 +1423,13 @@ Miniplayer có thể được kéo ra khỏi màn hình sang trái hoặc phải A cor de destaque da barra de progresso Valor de cor de seekbar inválido + + Logotipo do cabeçalho Padrão Regular - + ReVanced mínimo Personalizado @@ -1513,13 +1535,6 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Abrindo links no navegador externo Abrindo links no navegador no aplicativo - - Forçar idioma original do áudio - Usando o idioma de áudio original - Usando o áudio predefinido - - Para usar este recurso, altere \'Falsificar streams de vídeo\' para qualquer cliente, exceto o Android Studio - Automático @@ -1604,6 +1619,14 @@ Limitações: Deslize para procurar não está habilitado + Permitir Android VR AV1 + "O codec de vídeo é AVC (H.264), VP9 ou AV1 + +A reprodução pode gaguejar ou perder quadros" + O codec de vídeo é AVC (H.264) ou VP9 + "Ativar esta configuração pode usar descodificação AV1 por software. + +A reprodução de vídeo com AV1 pode apresentar soluços ou perder quadros." Efeitos colaterais da falsificação • Cliente experimental e pode parar de funcionar a qualquer momento • O vídeo pode parar em 1:00, ou pode não estar disponível em algumas regiões @@ -1623,6 +1646,8 @@ Limitações: + + Sobre Anúncios diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index 82ae2935a..60c5f3436 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -1,4 +1,5 @@ + + + Numele aplicației + + Personalizat + Pictograma aplicației + Original + + ReVanced minimal + ReVanced scalat + + Personalizat + Verificările au eșuat Deschidere site oficial @@ -120,6 +133,13 @@ Redarea poate să nu funcționeze" Dezactivarea acestei setări poate cauza probleme de redare. Client implicit + + Forțează limba audio originală + Folosind limba audio originală + Utilizează audio implicit + + Pentru a utiliza această funcție, modificați \"Falsificare fluxuri video\" la orice client, cu excepția Android Studio + Depanare Activează sau dezactivează opțiunile de depanare @@ -795,7 +815,7 @@ Pentru a afișa meniul de piste audio, modificați „Emulare fluxuri video” l Butoanele sunt ascunse Butoanele sunt afișate - + Ascunde cardurile ecranului final Cardurile de pe ecranul de închidere sunt ascunse Cardurile de închidere ecran sunt afișate @@ -1400,11 +1420,13 @@ Miniplayerul poate fi tras pe ecran spre stânga sau spre dreapta" Culoarea de accent a barei de căutare Valoare culoare bară căutare nevalidă + + Siglă antet Implicit Normal - + ReVanced minimalist Personalizat @@ -1510,13 +1532,6 @@ Activarea acestei opțiuni poate debloca calități video mai mari" Deschiderea linkurilor în browserul extern Deschiderea linkurilor în browserul din aplicație - - Forțează limba audio originală - Folosind limba audio originală - Utilizează audio implicit - - Pentru a utiliza această funcție, modificați \"Falsificare fluxuri video\" la orice client, cu excepția Android Studio - Automat @@ -1601,6 +1616,14 @@ Limitări: Slide pentru a căuta nu este activat + Permite Android VR AV1 + "Codecul video este AVC (H.264), VP9 sau AV1 + +Redarea poate sacada sau pierde cadre" + Codecul video este AVC (H.264) sau VP9 + "Activarea acestei setări poate folosi decodarea software AV1. + +Redarea video cu AV1 poate sacada sau pierde cadre." Efecte secundare ale simulării • Client experimental și se poate opri din funcționare oricând • Videoclipul se poate opri la 1:00, sau poate să nu fie disponibil în unele regiuni @@ -1620,6 +1643,8 @@ Limitări: + + Despre Anunțuri diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index 551a30150..3406e92de 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -1,4 +1,5 @@ + + + Название приложения + + Кастомный + Значок приложения + Оригинал + + ReVanced минимальный + ReVanced масштабированный + + Кастомный + Проверки не удались Открыть официальный веб-сайт @@ -120,6 +133,13 @@ Second \"item\" text" Отключение этой настройки может вызвать проблемы с воспроизведением. Клиент по умолчанию + + Принудительно оригинальная звуковая дорожка + Используется оригинальная звуковая дорожка + Используется звуковая дорожка по умолчанию + + Для использования этой функции измените клиент в \"Подмене видеопотоков\" на любой, кроме Android Studio + Отладка Включить или отключить параметры отладки @@ -797,7 +817,7 @@ Second \"item\" text" Кнопки предыдущего и следующего видео в плеере скрыты Кнопки предыдущего и следующего видео в плеере показаны - + Скрыть заставки следующих видео Заставки следующих видео в конце просмотра скрыты Заставки следующих видео в конце просмотра показаны @@ -1410,11 +1430,13 @@ Second \"item\" text" Вторичный цвет полосы прогресса Неверное значение цвета полосы прогресса + + Логотип заголовка По умолчанию Обычный - + ReVanced минимальный Кастомный @@ -1520,13 +1542,6 @@ Second \"item\" text" Ссылки открываются во внешнем браузере Ссылки открываются во встроенном браузере - - Принудительно оригинальная звуковая дорожка - Используется оригинальная звуковая дорожка - Используется звуковая дорожка по умолчанию - - Для использования этой функции измените клиент в \"Подмене видеопотоков\" на любой, кроме Android Studio - Авто @@ -1611,6 +1626,14 @@ Second \"item\" text" Перемотка видео слайдом отключена (ускорение видео \"2x\" при нажатии и удержании включено) + Разрешить Android VR AV1 + "Видеокодек: AVC (H.264), VP9 или AV1 + +Воспроизведение может зависать или пропускать кадры" + Видеокодек: AVC (H.264) или VP9 + "Включение этой настройки может использовать программное декодирование AV1. + +Воспроизведение видео с AV1 может прерываться или пропускать кадры." Побочные эффекты подмены • Клиент экспериментальный и может перестать работать в любое время • Видео может остановиться на 1:00 или может быть недоступно в некоторых регионах @@ -1630,6 +1653,8 @@ Second \"item\" text" + + Информация Настройки рекламы diff --git a/patches/src/main/resources/addresources/values-si-rLK/strings.xml b/patches/src/main/resources/addresources/values-si-rLK/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-si-rLK/strings.xml +++ b/patches/src/main/resources/addresources/values-si-rLK/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index 0ba8360c8..e70a0a320 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -1,4 +1,5 @@ + + + Názov aplikácie + + Vlastné + Ikona aplikácie + Pôvodné + + ReVanced minimálne + ReVanced škálované + + Vlastné + Kontrola zlyhala Otvoriť oficiálnu webovú stránku @@ -118,6 +131,13 @@ Prehrávanie nemusí fungovať" Vypnutie tohto nastavenia môže spôsobiť problémy s prehrávaním. Predvolený klient + + Vynútiť pôvodný jazyk zvuku + Používa sa pôvodný jazyk zvuku + Používanie predvoleného zvuku + + Ak chcete použiť túto funkciu, zmeňte \"Podvrhnúť video streamy\" na ľubovoľného klienta okrem Android Studio + Ladenie Povoliť alebo zakázať možnosti ladenia @@ -795,7 +815,7 @@ Ak chcete zobraziť menu zvukových stôp, zmeňte \"Falošné video streamy\" n Tlačidlá sú skryté Zobrazia sa tlačidlá - + Skryť karty záverečnej obrazovky Karty záverečnej obrazovky sú skryté Zobrazia sa karty záverečnej obrazovky @@ -1396,11 +1416,13 @@ Miniprehrávač sa dá potiahnuť mimo obrazovky doľava alebo doprava" Farba zvýraznenia posuvníka Neplatná farba vyhľadávania panela + + Logo záhlavia Predvolené Bežné - + ReVanced minimálne Vlastné @@ -1506,13 +1528,6 @@ Povolením tejto možnosti môžete odomknúť vyššie kvality videa" Otváranie odkazov v externom prehliadači Otváranie odkazov v prehliadači v aplikácii - - Vynútiť pôvodný jazyk zvuku - Používa sa pôvodný jazyk zvuku - Používanie predvoleného zvuku - - Ak chcete použiť túto funkciu, zmeňte \"Podvrhnúť video streamy\" na ľubovoľného klienta okrem Android Studio - Automaticky @@ -1597,6 +1612,14 @@ Obmedzenia: Nie je povolené posúvanie + Povoliť Android VR AV1 + "Videokodek je AVC (H.264), VP9 alebo AV1 + +Prehrávanie sa môže sekať alebo môžu vypadávať snímky" + Videokodek je AVC (H.264) alebo VP9 + "Povolenie tohto nastavenia môže použiť softvérové AV1 dekódovanie. + +Prehrávanie videa s AV1 môže sekať alebo vynechávať snímky." Vedľajšie účinky podvrhnutia • Experimentálny klient a môže kedykoľvek prestať fungovať • Video sa môže zastaviť o 1:00, alebo nemusí byť dostupné v niektorých regiónoch @@ -1616,6 +1639,8 @@ Obmedzenia: + + O aplikácii Reklamy diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index babf8d99b..b25d91f0a 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -1,4 +1,5 @@ + + + Ime aplikacije + + Po meri + Ikona aplikacije + Izvirno + + ReVanced minimalno + ReVanced prilagojeno + + Po meri + Preverjanja so spodletela Obiščite uradno spletno mesto @@ -120,6 +133,13 @@ Predvajanje morda ne bo delovalo" Izklop te nastavitve lahko povzroči težave z predvajanjem. Privzeti odjemalec + + Izsili izvirni jezik zvoka + Uporabi izvirni jezik zvoka + Uporaba privzetega zvoka + + Za uporabo te funkcije spremenite \"Ponaredi video tokove\" na katerega koli odjemalca, razen na Android Studio + Razhroščevanje Omogoči ali onemogoči možnosti razhroščevanja @@ -797,7 +817,7 @@ Za prikaz menija za zvočno skladbo, spremenite \"Ponarejene video tokove\" na i Gumbi so skriti Gumbi so prikazani - + Skrij kartice na končnem zaslonu Kartice na končnem zaslonu so skrite Kartice na končnem zaslonu so prikazane @@ -1403,11 +1423,13 @@ Minipredvajalnik lahko povlečete z zaslona na levo ali desno" Barva poudarka iskalnika Neveljavna vrednost barve drsnika + + Logotip glave Privzeto Navadno - + ReVanced minimalno Po meri @@ -1513,13 +1535,6 @@ Omogočanje tega lahko odklene višje kakovosti videa" Odpiranje povezav v zunanjem brskalniku Odpiranje povezav v brskalniku v aplikaciji - - Izsili izvirni jezik zvoka - Uporabi izvirni jezik zvoka - Uporaba privzetega zvoka - - Za uporabo te funkcije spremenite \"Ponaredi video tokove\" na katerega koli odjemalca, razen na Android Studio - Samodejno @@ -1604,6 +1619,14 @@ Omejitve: Drsno iskanje ni omogočeno + Dovoli Android VR AV1 + "Video kodek je AVC (H.264), VP9 ali AV1 + +Predvajanje se lahko zatika ali izpušča sličice" + Video kodek je AVC (H.264) ali VP9 + "Omogočanje te nastavitve lahko uporablja programsko dekodiranje AV1. + +Predvajanje videa z AV1 se lahko zatika ali izpušča sličice." Stranski učinki ponarejanja • Eksperimentalni odjemalec in lahko kadar koli preneha delovati • Video se lahko ustavi ob 1:00, ali pa morda ne bo na voljo v nekaterih regijah @@ -1623,6 +1646,8 @@ Omejitve: + + O Oglasi diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index 63d72dc34..c4cd34604 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -1,4 +1,5 @@ + + + Emri i aplikacionit + + Personalizuar + Ikona e aplikacionit + Origjinal + + ReVanced minimal + ReVanced i shkallëzuar + + Personalizuar + Kontrollat ​​dështu Hap faqen zyrtare @@ -120,6 +133,13 @@ Riprodhimi mund të mos funksionojë" Fikja e këtij cilësimi mund të shkaktojë probleme riprodhimi. Klient i përdoruesit + + Forco gjuhën origjinale të audios + Duke përdorur gjuhën origjinale audio + Përdorimi i Zërit Parazgjedhur + + Për të përdorur këtë veçori, ndryshoni \'Falsifiko transmetimet e videos\' në çdo klient përveç Android Studio + Depurimi Aktivizo ose çaktivizo opsionet e depurimit @@ -797,7 +817,7 @@ Për të shfaqur menynë e gjurmës audio, ndryshoje 'Falsifiko transmetimet vid Butonat janë të fshehur Butonat janë të dukshme - + Fsheh kartat e ekranit të fundit Kartat e ekranit të fundit janë të fshehura Kartat e ekranit të fundit janë të dukshme @@ -1401,11 +1421,13 @@ Miniplayer mund të tërhiqet jashtë ekranit në të majtë ose në të djatht Ngjyra e theksuar e shiritit të kërkimit Vlerë e pavlefshme e ngjyrës së shkallës së kërkimit + + Logoja e sipërme Parazgjedhur Normale - + ReVanced minimaliste Personalizuar @@ -1511,13 +1533,6 @@ Aktivizimi i kësaj mund të zhbllokojë cilësi më të larta video" Hapja e linkeve në shfletuesin e jashtëm Hapja e linkeve në shfletuesin brenda aplikacionit - - Forco gjuhën origjinale të audios - Duke përdorur gjuhën origjinale audio - Përdorimi i Zërit Parazgjedhur - - Për të përdorur këtë veçori, ndryshoni \'Falsifiko transmetimet e videos\' në çdo klient përveç Android Studio - Automatik @@ -1602,6 +1617,14 @@ Kufizimet: Rrëshqitja për kërkim nuk është e aktivizuar + Lejo Android VR AV1 + "Kodeku i videos është AVC (H.264), VP9, ose AV1 + +Luajtja mund të bllokojë ose të humbasë korniza" + Kodeku i videos është AVC (H.264) ose VP9 + "Aktivizimi i këtij cilësimi mund të përdorë dekodimin softuerik AV1. + +Luajtja e videos me AV1 mund të ngecë ose të humbasë korniza." Efektet anësore të falsifikimit • Klient eksperimental dhe mund të ndalojë së funksionuari në çdo kohë • Videoja mund të ndalojë në 1:00, ose mund të mos jetë e disponueshme në disa rajone @@ -1621,6 +1644,8 @@ Kufizimet: + + Rreth Reklama diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index b608aed8c..8cd9b4256 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -1,4 +1,5 @@ + + + Naziv aplikacije + + Prilagođeno + Ikonica aplikacije + Originalna + + ReVanced minimalna + ReVanced skalirana + + Prilagođeno + Provere nisu uspele Otvori zvanični veb-sajt @@ -120,6 +133,13 @@ Reprodukcija možda neće raditi" Isključivanje ovog podešavanja može izazvati probleme sa reprodukcijom. Podrazumevani klijent + + Prisili originalni jezik zvuka + Korišćenje originalnog jezika zvuka + Korišćenje podrazumevanog zvuka + + Da biste koristili ovu funkciju, promenite opciju „Lažirani video strimovi” na bilo koji klijent osim Android Studio + Otklanjanje grešaka Omogućite ili onemogućite opcije za otklanjanje grešaka @@ -146,9 +166,9 @@ Nećete biti obavešteni ni o kakvim neočekivanim događajima." Evidencije su izbrisane - Saniraj linkove za deljenje - Parametar za praćenje iz upita je uklonjen sa deljenih linkova - Parametar za praćenje iz upita nije uklonjen sa deljenih linkova + Očisti deljene linkove + Parametar upita za praćenje je uklonjen iz deljenih linkova + Parametar upita za praćenje nije uklonjen iz deljenih linkova Promeni linkove za deljenje na youtube.com Deljeni linkovi koriste youtube.com Deljeni linkovi koriste music.youtube.com @@ -379,9 +399,9 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Sakrij dugme „Napravi Short” Dugme „Napravi Short” je skriveno Dugme „Napravi Short” je prikazano - Sakrij dugmad za emodžije i vremensku oznaku - Dugmad za emodžije i vremensku oznaku su skrivena - Dugmad za emodžije i vremensku oznaku su prikazana + Sakrij dugmad emodžija i vremenske oznake + Dugmad emodžija i vremenske oznake su skrivena + Dugmad emodžija i vremenske oznake su prikazana Sakrij komentar za pregled Komentar za pregled je skriven Komentar za pregled je prikazan @@ -398,19 +418,19 @@ Ako se Doodle trenutno prikazuje u vašem regionu i ova opcija skrivanja je uklj Lista stringova za pravljenje putanje komponenti za filtriranje, odvojena novim redom Nevažeći prilagođeni filter: %s Sakrij broj pregleda - Broj pregleda je sakriven u feed-u i rezultatima pretrage - Broj pregleda je prikazan u feed-u i rezultatima pretrage + Broj pregleda je skriven u fidu i rezultatima pretrage + Broj pregleda je prikazan u fidu i rezultatima pretrage "Ograničenja: -• Shorts sekcije, stranice kanala i rezultati pretrage i dalje mogu prikazivati brojeve pregleda +• Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati broj pregleda • Ova funkcija ne radi sa automobilskim faktorom forme" Sakrij vreme otpremanja - Vreme otpremanja je skriveno u feed-u i rezultatima pretrage - Vreme otpremanja je prikazano u feed-u i rezultatima pretrage + Vreme otpremanja je skriveno u fidu i rezultatima pretrage + Vreme otpremanja je prikazano u fidu i rezultatima pretrage "Ograničenja: -• Shorts police, stranice kanala i rezultati pretrage mogu i dalje prikazivati vreme otpremanja -• Ova funkcija ne radi sa automobilskim form faktorom" +• Police Shorts, stranice kanala i rezultati pretrage mogu i dalje prikazivati vreme otpremanja +• Ova funkcija ne radi sa automobilskim faktorom forme" Sakrij sadržaj ključne reči Sakrijte videe iz rezultata pretrage i fida koristeći filtere ključnih reči Sakrij videe na kartici „Početna” prema ključnim rečima @@ -797,7 +817,7 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Dugmad za prethodni i sledeći video su skrivena Dugmad za prethodni i sledeći video su prikazana - + Sakrij kartice završnog ekrana Kartice završnog ekrana su skrivene Kartice završnog ekrana su prikazane @@ -1351,7 +1371,7 @@ Ograničenje: Korišćenje dugmeta „Nazad” na traci sa alatkama možda neće Moderan 2 Moderan 3 Moderan 4 - Onemogući zaobljene ivice + Onemogući zaobljene uglove Uglovi su kvadratni Uglovi su zaobljeni Omogući dvostruki dodir i štipanje za promenu veličine @@ -1360,12 +1380,12 @@ Ograničenje: Korišćenje dugmeta „Nazad” na traci sa alatkama možda neće • Dvaput dodirnite da biste povećali veličinu mini-plejera • Dvaput dodirnite ponovo da biste vratili originalnu veličinu" Radnja dvostrukog dodira i štipanja za promenu veličine je onemogućena - Onemogući prevlačenje i ispuštanje + Onemogući prevlačenje i otpuštanje Prevlačenje i otpuštanje je onemogućeno "Povlačenje i otpuštanje je omogućeno Mini-plejer se može prevući u bilo koji ugao ekrana" - Onemogući horizontalni gest prevlačenja + Onemogući pokret horizontalnog prevlačenja Pokret horizontalnog prevlačenja je onemogućen "Pokret horizontalnog prevlačenja je omogućen @@ -1402,11 +1422,13 @@ Mini-plejer se može prevući sa ekrana ulevo ili udesno" Boja naglašavanja trake za premotavanje Nevažeća vrednost boje trake za premotavanje + + Logotip u zaglavlju Podrazumevani Obični - + ReVanced minimalistički Prilagođeni @@ -1512,13 +1534,6 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Otvaranje linkova u spoljnom pregledaču Otvaranje linkova u pregledaču u aplikaciji - - Prisili originalni jezik zvuka - Korišćenje originalnog jezika zvuka - Korišćenje podrazumevanog zvuka - - Da biste koristili ovu funkciju, promenite opciju „Lažirani video strimovi” na bilo koji klijent osim Android Studio - Automatski @@ -1584,7 +1599,7 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Video kodek se određuje automatski "Prednosti: • Može poboljšati trajanje baterije -• Može vratiti nedostajuće rezolucije videa na starijem uređaju +• Može vratiti nedostajuće rezolucije videa na starijim uređajima Ograničenja: • Maksimalna rezolucija je 1080p @@ -1603,6 +1618,14 @@ Ograničenja: Prevlaćenje za premotavanje nije omogućeno + Dozvoli Android VR AV1 + "Video kodek je AVC (H.264), VP9 ili AV1 + +Reprodukcija može zastajkivati ili preskakati kadrove" + Video kodek je AVC (H.264) ili VP9 + "Omogućavanje ove opcije može koristiti softversko dekodiranje AV1. + +Reprodukcija videa s AV1 može zastajkivati ili preskakati kadrove." Neželjeni efekti lažiranja • Eksperimentalni klijent i može prestati da radi bilo kada • Video se može zaustaviti u 1:00 ili možda neće biti dostupan u nekim regionima @@ -1622,6 +1645,8 @@ Ograničenja: + + O programu Oglasi diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 635ab6076..8a9e2315f 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -1,4 +1,5 @@ + + + Назив апликације + + Прилагођено + Иконица апликације + Оригинална + + ReVanced минимална + ReVanced скалирана + + Прилагођено + Провере нису успеле Отвори званични веб-сајт @@ -120,6 +133,13 @@ Second \"item\" text" Искључивање овог подешавања може изазвати проблеме са репродукцијом. Подразумевани клијент + + Присили оригинални језик звука + Коришћење оригиналног језика звука + Коришћење подразумеваног звука + + Да бисте користили ову функцију, промените опцију „Лажирани видео стримови” на било који клијент осим Android Studio + Отклањање грешака Омогућите или онемогућите опције за отклањање грешака @@ -146,9 +166,9 @@ Second \"item\" text" Евиденције су избрисане - Очисти везе за дељење - Параметар упита за праћење је уклоњен из дељених веза - Параметар упита за праћење није уклоњен из дељених веза + Очисти дељене линкове + Параметар упита за праћење је уклоњен из дељених линкова + Параметар упита за праћење није уклоњен из дељених линкова Промени линкове за дељење на youtube.com Дељени линкови користе youtube.com Дељени линкови користе music.youtube.com @@ -379,9 +399,9 @@ Second \"item\" text" Сакриј дугме „Направи Short” Дугме „Направи Short” је скривено Дугме „Направи Short” је приказано - Сакриј дугмад за емотиконе и временске ознаке - Дугмад за емотиконе и временске ознаке су скривена - Дугмад за емотиконе и временске ознаке су приказана + Сакриј дугмад емоџија и временске ознаке + Дугмад емоџија и временске ознаке су скривена + Дугмад емоџија и временске ознаке су приказана Сакриј коментар за преглед Коментар за преглед је скривен Коментар за преглед је приказан @@ -398,19 +418,19 @@ Second \"item\" text" Листа стрингова за прављење путање компоненти за филтрирање, одвојена новим редом Неважећи прилагођени филтер: %s Сакриј број прегледа - Број прегледа је сакривен у фиду и резултатима претраге + Број прегледа је скривен у фиду и резултатима претраге Број прегледа је приказан у фиду и резултатима претраге "Ограничења: -• Shorts секције, странице канала и резултати претраге могу и даље приказивати број прегледа -• Ова функција не ради са аутомобилским форм фактором" +• Полице Shorts, странице канала и резултати претраге могу и даље приказивати број прегледа +• Ова функција не ради са аутомобилским фактором форме" Сакриј време отпремања Време отпремања је скривено у фиду и резултатима претраге Време отпремања је приказано у фиду и резултатима претраге "Ограничења: -• Полице за Shorts, странице канала и резултати претраге могу и даље приказивати време отпремања -• Ова функција не ради са аутомобилским форм фактором" +• Полице Shorts, странице канала и резултати претраге могу и даље приказивати време отпремања +• Ова функција не ради са аутомобилским фактором форме" Сакриј садржај кључне речи Сакријте видее из резултата претраге и фида користећи филтере кључних речи Сакриј видее на картици „Почетна” према кључним речима @@ -797,7 +817,7 @@ Second \"item\" text" Дугмад за претходни и следећи видео су скривена Дугмад за претходни и следећи видео су приказана - + Сакриј картице завршног екрана Картице завршног екрана су скривене Картице завршног екрана су приказане @@ -1365,7 +1385,7 @@ Second \"item\" text" "Превлачење и отпуштање је омогућено Мини-плејер се може превући у било који угао екрана" - Онемогући хоризонтални покрет превлачења + Онемогући покрет хоризонталног превлачења Покрет хоризонталног превлачења је онемогућен "Покрет хоризонталног превлачења је омогућен @@ -1405,11 +1425,13 @@ Second \"item\" text" Боја наглашавања траке за премотавање Неважећа вредност боје траке за премотавање + + Логотип у заглављу Подразумевани Обични - + ReVanced минималистички Прилагођени @@ -1515,13 +1537,6 @@ Second \"item\" text" Отварање линкова у спољном прегледачу Отварање линкова у прегледачу у апликацији - - Присили оригинални језик звука - Коришћење оригиналног језика звука - Коришћење подразумеваног звука - - Да бисте користили ову функцију, промените опцију „Лажирани видео стримови” на било који клијент осим Android Studio - Аутоматски @@ -1587,7 +1602,7 @@ Second \"item\" text" Видео кодек се одређује аутоматски "Предности: • Може побољшати трајање батерије -• Може вратити недостајуће резолуције видеа на старијем уређају +• Може вратити недостајуће резолуције видеа на старијим уређајима Ограничења: • Максимална резолуција је 1080p @@ -1606,6 +1621,14 @@ Second \"item\" text" Превлачење за премотавање није омогућено + Дозволи Android VR AV1 + "Видео кодек је AVC (H.264), VP9 или AV1 + +Репродукција може застајкивати или прескакати кадрове" + Видео кодек је AVC (H.264) или VP9 + "Омогућавање ове опцијеможе користити софтверско декодирање AV1. + +Репродукција видеа с AV1 може застајкивати или прескакати кадрове." Нежељени ефекти лажирања • Експериментални клијент и може престати да ради било када • Видео се може зауставити на 1:00 или можда неће бити доступан у неким регионима @@ -1625,6 +1648,8 @@ Second \"item\" text" + + О програму Огласи diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 1e982b5a3..a5b569f03 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -1,4 +1,5 @@ + + + Appnamn + + Anpassad + Appikon + Original + + ReVanced minimalistisk + ReVanced skalad + + Anpassad + Kontroller misslyckades Öppna officiell hemsida @@ -120,6 +133,13 @@ Uppspelning kanske inte fungerar" Om du stänger av den här inställningen kan det leda till problem med uppspelning. Standardklient + + Tvinga ursprungligt ljudspråk + Använder ursprungligt ljudspråk + Använder standardljud + + Om du vill använda den här funktionen ändrar du \"Förfalska videoströmmar\" till valfri klient utom Android Studio + Felsökning Aktivera eller inaktivera felsökningsalternativ @@ -797,7 +817,7 @@ För att visa menyn Ljudspår, ändra \"Förfalska videoströmmar\" till iPadOS" Knapparna är dolda Knapparna visas - + Dölj slutskärmskort Slutskärmskort är dolda Slutskärmskort visas @@ -1402,11 +1422,13 @@ Minispelaren kan dras utanför skärmen till vänster eller höger" Accentfärgen på sökreglaget Ogiltigt färgvärde för sökreglaget + + Logotyp i sidhuvudet Standard Vanlig - + ReVanced minimalistisk Anpassad @@ -1512,13 +1534,6 @@ Om du aktiverar detta kan högre videokvaliteter låsas upp" Öppnar länkar i extern webbläsare Öppnar länkar i webbläsaren i appen - - Tvinga ursprungligt ljudspråk - Använder ursprungligt ljudspråk - Använder standardljud - - Om du vill använda den här funktionen ändrar du \"Förfalska videoströmmar\" till valfri klient utom Android Studio - Automatiskt @@ -1603,6 +1618,14 @@ Begränsningar: Dra för att söka är inaktiverat + Tillåt Android VR AV1 + "Videokodeken är AVC (H.264), VP9 eller AV1 + +Uppspelningen kan hacka eller tappa bildrutor" + Videokodeken är AVC (H.264) eller VP9 + "Aktivering av denna inställning kan använda programvarubaserad AV1-avkodning. + +Videouppspelning med AV1 kan hacka eller tappa bildrutor." Bieffekter av förfalskning • Experimentell klient och kan sluta fungera när som helst • Videor kan stanna vid 1:00 eller kanske inte är tillgängliga i vissa regioner @@ -1622,6 +1645,8 @@ Begränsningar: + + Om Annonser diff --git a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-sw-rKE/strings.xml +++ b/patches/src/main/resources/addresources/values-sw-rKE/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-ta-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ta-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-te-rIN/strings.xml b/patches/src/main/resources/addresources/values-te-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-te-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-te-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index 9aa721686..f3e4ffa53 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -1,4 +1,5 @@ + + + ชื่อแอป + + กำหนดเอง + ไอคอนแอป + ต้นฉบับ + + ReVanced เรียบง่าย + ReVanced ปรับขนาด + + กำหนดเอง + การตรวจสอบล้มเหลว เปิดเว็บไซต์อย่างเป็นทางการ @@ -120,6 +133,13 @@ Second \"item\" text" การปิดการตั้งค่านี้อาจทำให้เกิดปัญหาในการเล่น ไคลเอ็นต์เริ่มต้น + + บังคับใช้ภาษาเสียงต้นฉบับ + กำลังใช้ภาษาเสียงต้นฉบับ + กำลังใช้ออดิโอเริ่มต้น + + หากต้องการใช้คุณสมบัตินี้ ให้เปลี่ยน \'Spoof video streams\' เป็นไคลเอ็นต์อื่น ๆ ยกเว้น Android Studio + ดีบัก เปิดใช้งานหรือปิดใช้งานตัวเลือกการแก้ไขข้อบกพร่อง @@ -795,7 +815,7 @@ Second \"item\" text" ปุ่มซ่อนอยู่ ปุ่มแสดงอยู่ - + ซ่อนการ์ดหน้าจอสิ้นสุด การ์ดหน้าจอสิ้นสุดซ่อนอยู่ การ์ดหน้าจอสิ้นสุดแสดงอยู่ @@ -1405,11 +1425,13 @@ User id ของคุณเหมือนกับรหัสผ่าน สีเน้นของ seekbar ค่าสีแถบเลื่อนไม่ถูกต้อง + + โลโก้ส่วนหัว ค่าเริ่มต้น ปกติ - + ReVanced แบบย่อ กำหนดเอง @@ -1515,13 +1537,6 @@ User id ของคุณเหมือนกับรหัสผ่าน เปิดลิงก์ในเบราว์เซอร์ภายนอก เปิดลิงก์ในเบราว์เซอร์ในแอป - - บังคับใช้ภาษาเสียงต้นฉบับ - กำลังใช้ภาษาเสียงต้นฉบับ - กำลังใช้ออดิโอเริ่มต้น - - หากต้องการใช้คุณสมบัตินี้ ให้เปลี่ยน \'Spoof video streams\' เป็นไคลเอ็นต์อื่น ๆ ยกเว้น Android Studio - อัตโนมัติ @@ -1606,6 +1621,14 @@ User id ของคุณเหมือนกับรหัสผ่าน เลื่อนเพื่อค้นหาไม่ได้เปิดใช้งาน + อนุญาต Android VR AV1 + "ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264), VP9 หรือ AV1 + +การเล่นอาจกระตุกหรือเฟรมตก" + ตัวแปลงสัญญาณวิดีโอคือ AVC (H.264) หรือ VP9 + "การเปิดใช้งานการตั้งค่านี้อาจใช้ซอฟต์แวร์ถอดรหัส AV1 + +การเล่นวิดีโอด้วย AV1 อาจกระตุกหรือเฟรมตก" ผลข้างเคียงของการปลอมแปลง • ไคลเอนต์ทดลองและอาจหยุดทำงานได้ตลอดเวลา • วิดีโออาจหยุดที่ 1:00 หรืออาจไม่สามารถรับชมได้ในบางภูมิภาค @@ -1625,6 +1648,8 @@ User id ของคุณเหมือนกับรหัสผ่าน + + เกี่ยวกับ โฆษณา diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index 82869534b..f62f617f1 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -1,4 +1,5 @@ + + + Uygulama adı + + Özel + Uygulama simgesi + Orijinal + + ReVanced minimal + ReVanced ölçeklendirilmiş + + Özel + Denetimler başarısız Resmî web sitesini aç @@ -120,6 +133,13 @@ Oynatma çalışmayabilir" Bu ayarı devre dışı bırakmak oynatma sorunlarına yol açabilir. Varsayılan istemci + + Orijinal ses dilini zorla + Orijinal ses dili kullanılıyor + Varsayılan ses kullanılıyor + + Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını Android Studio dışındaki herhangi bir istemciye değiştirin + Hata ayıklama Hata ayıklama seçeneklerini etkinleştir veya devre dışı bırak @@ -797,7 +817,7 @@ Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayar Önceki & Sonraki düğmeleri gizli Önceki & Sonraki düğmeleri görünür - + Bitiş ekranı kartlarını gizle Bitiş ekranı kartları gizli Bitiş ekranı kartları görünür @@ -1410,11 +1430,13 @@ Genişletmek veya kapatmak için kaydırın" Zaman çubuğunun vurgu rengi Geçersiz zaman çubuğu renk değeri + + Başlık logosu Varsayılan Normal - + ReVanced minimal Özel @@ -1520,13 +1542,6 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir" Bağlantılar harici tarayıcıda açılıyor Bağlantılar uygulama içi tarayıcıda açılıyor - - Orijinal ses dilini zorla - Orijinal ses dili kullanılıyor - Varsayılan ses kullanılıyor - - Bu özelliği kullanmak için \'Video akışlarını taklit et\' ayarını Android Studio dışındaki herhangi bir istemciye değiştirin - Oto @@ -1611,6 +1626,14 @@ Sınırlamalar: Kaydırarak sardırma etkin değil + Android VR AV1\'e İzin Ver + "Video kodeği AVC (H.264), VP9 veya AV1'dir + +Oynatma takılabilir veya kare atlayabilir" + Video kodeği AVC (H.264) veya VP9\'dur + "Bu ayarı etkinleştirmek yazılım tabanlı AV1 kod çözmeyi kullanabilir. + +AV1 ile video oynatma takılabilir veya kare atlayabilir." Taklit yan etkileri • Deneysel istemci ve her an çalışmayı durdurabilir • Video 1:00\'da durabilir veya bazı bölgelerde kullanılamayabilir @@ -1630,6 +1653,8 @@ Sınırlamalar: + + Hakkında Reklamlar diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index 1c99e2a58..ee1b3c400 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -1,4 +1,5 @@ + + + Назва додатку + + Користувацька + Іконка додатку + Оригінальна + + ReVanced мінімальна + ReVanced масштабована + + Користувацька + Перевірки не вдалися Відкрити офіційний вебсайт @@ -120,6 +133,13 @@ Second \"item\" text" Вимкнення цієї опції може спричинити проблеми з відтворенням. Клієнт за замовчуванням + + Примусово оригінальна мова звукової доріжки + Використовується оригінальна мова звукової доріжки + Використовується стандартна (регіональна) мова звукової доріжки + + Щоб використовувати цю функцію, змініть клієнт \"Підміни відеопотоків\" на будь-який клієнт, окрім Android Studio + Налагодження Увімкнення або вимкнення параметрів налагодження @@ -797,7 +817,7 @@ Second \"item\" text" Кнопки попереднього та наступного відео приховано Кнопки попереднього та наступного відео показуються - + Приховати картки на кінцевому екрані Картки на кінцевому екрані приховано Картки на кінцевому екрані показуються @@ -1402,11 +1422,13 @@ Second \"item\" text" Значення вторинного кольору смуги прогресу Недійсне значення кольору смуги прогресу + + Логотип заголовка Стандартний Звичайний - + ReVanced мінімальний Користувацький @@ -1512,13 +1534,6 @@ Second \"item\" text" Посилання відкриваються у зовнішньому браузері Посилання відкриваються у вбудованому браузері - - Примусово оригінальна мова звукової доріжки - Використовується оригінальна мова звукової доріжки - Використовується стандартна (регіональна) мова звукової доріжки - - Щоб використовувати цю функцію, змініть клієнт \"Підміни відеопотоків\" на будь-який клієнт, окрім Android Studio - Авто @@ -1603,6 +1618,14 @@ Second \"item\" text" Перемотку пересуванням вимкнено\n\nУвімкнено поведінку нового інтерфейсу прискорення \"2х >>\" при утриманні на екрані + Дозволити Android VR AV1 + "Відеокодек AVC (H.264), VP9 або AV1 + +Відтворення може заїкатися або пропускати кадри" + Відеокодек AVC (H.264) або VP9 + "Увімкнення цього налаштування може призвести до використання програмного декодування AV1. + +Відтворення відео з AV1 може заїкатися або мати пропуски кадрів." Побічні ефекти підміни • Експериментальний клієнт, який може припинити працювати будь-якої миті • Відео може зупинитися на 1:00, або може бути недоступним у деяких регіонах @@ -1622,6 +1645,8 @@ Second \"item\" text" + + Інформація Реклама diff --git a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-ur-rIN/strings.xml +++ b/patches/src/main/resources/addresources/values-ur-rIN/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml +++ b/patches/src/main/resources/addresources/values-uz-rUZ/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index b0796c243..0df40a32f 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -1,4 +1,5 @@ + + + Tên ứng dụng + + Tùy chỉnh + Biểu tượng ứng dụng + Gốc + + ReVanced tối giản + ReVanced tỉ lệ + + Tùy chỉnh + Kiểm tra thất bại Mở trang web chính thức @@ -58,13 +71,13 @@ Second \"item\" text" Xóa lịch sử tìm kiếm Bạn có chắc chắn muốn xóa tất cả lịch sử tìm kiếm không? Mẹo tìm kiếm - "• Nhấn vào một đường dẫn để điều hướng đến đó -• Nhấn giữ một cài đặt để điều hướng đến đó -• Nhấn Enter để lưu truy vấn tìm kiếm vào lịch sử + "• Nhấn vào một đường dẫn để đi đến đó +• Nhấn giữ một cài đặt để đi đến đó +• Nhấn Enter để lưu từ khoá tìm kiếm vào lịch sử • Tìm kiếm bỏ qua chữ hoa/thường và dấu câu -• Cài đặt cha xuất hiện phía trên cài đặt con bị vô hiệu hóa" - Lịch sử tìm kiếm trống - Để lưu lịch sử tìm kiếm, nhập truy vấn tìm kiếm và nhấn Enter +• Cài đặt lớn nằm phía trên cài đặt nhỏ bị vô hiệu hóa" + Lịch sử tìm kiếm đang trống + Để lưu lịch sử tìm kiếm, nhập từ khoá tìm kiếm và nhấn Enter Hiện lịch sử tìm kiếm cài đặt Lịch sử tìm kiếm cài đặt đã được hiển thị Lịch sử tìm kiếm cài đặt không được hiển thị @@ -120,6 +133,13 @@ Có thể gặp lỗi khi phát." Tắt cài đặt này có thể gây ra lỗi khi phát. Ứng dụng khách mặc định + + Buộc ngôn ngữ âm thanh gốc + Đang dùng ngôn ngữ âm thanh gốc + Đang dùng âm thanh mặc định + + Để dùng tính năng này, hãy đổi \'Giả mạo luồng video\' thành bất kỳ ứng dụng khách nào ngoại trừ Android Studio + Gỡ lỗi Bật hoặc tắt tùy chọn gỡ lỗi @@ -150,8 +170,8 @@ Bạn sẽ không được thông báo khi xẩy ra lỗi bất ngờ." Tham số truy vấn theo dõi bị loại bỏ khỏi các liên kết được chia sẻ Tham số truy vấn theo dõi không bị loại bỏ khỏi các liên kết được chia sẻ Thay đổi liên kết chia sẻ thành youtube.com - Liên kết được chia sẻ sử dụng youtube.com - Liên kết được chia sẻ sử dụng music.youtube.com + Liên kết chia sẻ bắt đầu bằng youtube.com + Liên kết chia sẻ bắt đầu bằng music.youtube.com @@ -797,7 +817,7 @@ Nếu thay đổi cài đặt này không có hiệu lực, hãy thử chuyển Các nút đã bị ẩn Các nút được hiển thị - + Ẩn thẻ màn hình kết thúc Thẻ màn hình kết thúc đã bị ẩn Thẻ màn hình kết thúc được hiển thị @@ -1409,11 +1429,13 @@ Vuốt để mở rộng hoặc đóng" Màu sắc nổi bật của thanh tiến trình Giá trị màu của thanh tiến trình không hợp lệ + + Logo đầu trang Mặc định Thông thường - + ReVanced tối giản Tùy chỉnh @@ -1474,11 +1496,11 @@ Nhấn vào đây để tìm hiểu thêm về DeArrow" Video sẽ không lặp lại - Hiện nút video lặp lại + Hiện nút lặp lại video Nút được hiển thị Nút không được hiển thị - Video lặp lại đang bật - Video lặp lại đang tắt + Lặp lại video đang bật + Lặp lại video đang tắt Giả mạo kích thước thiết bị @@ -1519,13 +1541,6 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Đang mở liên kết trong trình duyệt bên ngoài Đang mở liên kết trình duyệt trong ứng dụng - - Buộc ngôn ngữ âm thanh gốc - Đang dùng ngôn ngữ âm thanh gốc - Đang dùng âm thanh mặc định - - Để dùng tính năng này, hãy đổi \'Giả mạo luồng video\' thành bất kỳ ứng dụng khách nào ngoại trừ Android Studio - Tự động @@ -1610,6 +1625,14 @@ Hạn chế: Vuốt để tua không được bật + Cho phép AV1 trên Android VR + "Bộ giải mã video là AVC (H.264), VP9 hoặc AV1 + +Quá trình phát có thể bị giật hoặc tụt khung hình" + Bộ giải mã video là AVC (H.264) hoặc VP9 + "Bật cài đặt này có thể sử dụng giải mã AV1 bằng phần mềm. + +Phát video bằng AV1 có thể bị giật hoặc tụt khung hình." Hạn chế khi giả mạo • Ứng dụng khách đang trong giai đoạn thử nghiệm và có thể ngừng hoạt động bất cứ lúc nào • Video có thể dừng ở 1:00, hoặc có thể không khả dụng ở một số khu vực @@ -1629,6 +1652,8 @@ Hạn chế: + + Giới thiệu Quảng cáo diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index 86186d6e6..6d09a78da 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -1,4 +1,5 @@ + + + 应用名称 + + 自定义 + 应用图标 + 原始 + + ReVanced 极简 + ReVanced 缩放 + + 自定义 + 检测失败 打开官方网站 @@ -120,6 +133,13 @@ Second \"item\" text" 关闭此设置可能会导致播放问题。 默认客户端 + + 强制使用原始音频语言 + 使用原始音频语言 + 正在使用默认音频 + + 要使用此功能,请将“伪造视频流”更改为除 Android Studio 之外的任何客户端 + 调试 启用或禁用调试选项 @@ -797,7 +817,7 @@ Second \"item\" text" 按钮已隐藏 按钮已显示 - + 隐藏片尾卡 片尾卡已隐藏 片尾卡已显示 @@ -1408,11 +1428,13 @@ Second \"item\" text" 进度条的强调色 无效的进度条颜色值 + + 标题徽标 默认 常规 - + ReVanced 极简 自定义 @@ -1518,13 +1540,6 @@ Second \"item\" text" 在外部浏览器中打开链接 在应用内浏览器中打开链接 - - 强制使用原始音频语言 - 使用原始音频语言 - 正在使用默认音频 - - 要使用此功能,请将“伪造视频流”更改为除 Android Studio 之外的任何客户端 - 自动 @@ -1609,6 +1624,14 @@ Second \"item\" text" 滑动拖动进度条未启用 + 允许 Android VR AV1 + "视频编解码器为 AVC (H.264)、VP9 或 AV1 + +播放可能会卡顿或掉帧" + 视频编解码器为 AVC (H.264) 或 VP9 + "启用此设置可能会使用软件 AV1 解码。 + +使用 AV1 播放视频可能会卡顿或丢帧。" 欺骗的副作用 • 实验性客户端,可能随时停止工作 • 视频可能会在 1:00 停止,或者在某些地区可能无法播放 @@ -1628,6 +1651,8 @@ Second \"item\" text" + + 关于 广告 diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index adbf8b177..0f5329d36 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -1,4 +1,5 @@ + + + 應用程式名稱 + + 自訂 + 應用程式圖示 + 原始 + + ReVanced 精簡版 + ReVanced 縮放 + + 自訂 + 檢查失敗 開啟官方網站 @@ -120,6 +133,13 @@ Second \"item\" text" 關閉此設定可能會導致播放問題。 預設用戶端 + + 強制使用原始音訊語言 + 正在使用原始音訊語言 + 使用預設音訊 + + 若要使用此功能,請將「偽造視訊串流」變更為 Android Studio 以外的任何用戶端 + 偵錯 啟用或停用偵錯選項 @@ -797,7 +817,7 @@ Second \"item\" text" 已隱藏「上一部」和「下一部」按鈕 已顯示「上一部」和「下一部」按鈕 - + 隱藏片尾資訊卡 已隱藏片尾資訊卡 已顯示片尾資訊卡 @@ -1409,11 +1429,13 @@ Second \"item\" text" 跳轉列強調色彩 跳轉列色彩值無效 + + 標題標誌 預設 一般 - + ReVanced 精簡版 自訂 @@ -1523,13 +1545,6 @@ Second \"item\" text" 在外部瀏覽器中開啟連結 在應用程式內瀏覽器中開啟連結 - - 強制使用原始音訊語言 - 正在使用原始音訊語言 - 使用預設音訊 - - 若要使用此功能,請將「偽造視訊串流」變更為 Android Studio 以外的任何用戶端 - 自動 @@ -1614,6 +1629,14 @@ Second \"item\" text" 未啟用滑動預覽 + 允許 Android VR AV1 + "視訊轉碼器為 AVC (H.264)、VP9 或 AV1 + +播放可能會卡頓或掉幀" + 視訊轉碼器為 AVC (H.264) 或 VP9 + "啟用此設定可能會使用軟體 AV1 解碼。 + +AV1 視訊播放可能會卡頓或掉幀。" 欺騙的副作用 • 實驗性用戶端,隨時可能停止運作 • 影片可能會在 1:00 停止,或在某些地區無法播放 @@ -1633,6 +1656,8 @@ Second \"item\" text" + + 關於 廣告 diff --git a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml index fcad9b45d..6b81af5f3 100644 --- a/patches/src/main/resources/addresources/values-zu-rZA/strings.xml +++ b/patches/src/main/resources/addresources/values-zu-rZA/strings.xml @@ -1,4 +1,5 @@ + + + + + + @@ -34,6 +40,9 @@ Second \"item\" text" + + + @@ -135,7 +144,7 @@ Second \"item\" text" - + @@ -200,8 +209,10 @@ Second \"item\" text" + + - + @@ -227,9 +238,6 @@ Second \"item\" text" - - - @@ -253,6 +261,8 @@ Second \"item\" text" + + diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index f89f52c2d..980f0c20c 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -1,5 +1,33 @@ + + + @string/revanced_custom_branding_icon_entry_1 + @string/revanced_custom_branding_icon_entry_2 + @string/revanced_custom_branding_icon_entry_3 + @string/revanced_custom_branding_icon_entry_4 + + + ORIGINAL + ROUNDED + MINIMAL + SCALED + + + @string/revanced_custom_branding_icon_entry_1 + @string/revanced_custom_branding_icon_entry_2 + @string/revanced_custom_branding_icon_entry_3 + @string/revanced_custom_branding_icon_entry_4 + @string/revanced_custom_branding_icon_entry_5 + + + ORIGINAL + ROUNDED + MINIMAL + SCALED + CUSTOM + + @string/revanced_language_DEFAULT @@ -123,6 +151,36 @@ + + + + @string/app_launcher_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + + + 1 + 2 + 3 + 4 + + + + @string/app_launcher_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + @string/revanced_custom_branding_name_entry_5 + + + 1 + 2 + 3 + 4 + 5 + + Android VR @@ -135,6 +193,36 @@ + + + + @string/application_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + + + 1 + 2 + 3 + 4 + + + + @string/application_name + @string/revanced_custom_branding_name_entry_2 + @string/revanced_custom_branding_name_entry_3 + @string/revanced_custom_branding_name_entry_4 + @string/revanced_custom_branding_name_entry_5 + + + 1 + 2 + 3 + 4 + 5 + + Android VR @@ -143,7 +231,7 @@ iPadOS - ANDROID_VR_1_61_48 + ANDROID_VR_1_43_32 ANDROID_CREATOR VISIONOS IPADOS diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index f151ae14d..4b7a00125 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1,3 +1,4 @@ + + + App name + + Custom + App icon + Original + ReVanced + + ReVanced minimal + ReVanced scaled + + Custom + Checks failed Open official website @@ -176,6 +190,13 @@ Playback may not work" Turning off this setting may cause playback issues. Default client + + Force original audio language + Using original audio language + Using default audio + + To use this feature, change \'Spoof video streams\' to any client except Android Studio + Debugging Enable or disable debugging options @@ -859,7 +880,7 @@ To show the Audio track menu, change \'Spoof video streams\' to iPadOS" Previous & Next buttons are hidden Previous & Next buttons are shown - + Hide end screen cards End screen cards are hidden End screen cards are shown @@ -1477,13 +1498,18 @@ Swipe to expand or close" The accent color of the seekbar Invalid seekbar color value + + YouTube ReVanced + YT ReVanced + YT + Header logo Default Regular Premium ReVanced - + ReVanced minimal Custom @@ -1590,13 +1616,6 @@ Enabling this can unlock higher video qualities" Opening links in external browser Opening links in in-app browser - - Force original audio language - Using original audio language - Using default audio - - To use this feature, change \'Spoof video streams\' to any client except Android Studio - Auto @@ -1681,6 +1700,14 @@ Limitations: Slide to seek is not enabled + Allow Android VR AV1 + "Video codec is AVC (H.264), VP9, or AV1 + +Playback may stutter or drop frames" + Video codec is AVC (H.264) or VP9 + "Enabling this setting may use software AV1 decoding. + +Video playback with AV1 may stutter or drop frames." Spoofing side effects • Experimental client and may stop working anytime • Video may stop at 1:00, or may not be available in some regions @@ -1700,6 +1727,11 @@ Limitations: + + YT Music ReVanced + Music ReVanced + Music + About Ads diff --git a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_dark.png b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_dark.png index 1b0799737..558fd728d 100644 Binary files a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_dark.png and b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_light.png b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_light.png index 581f62864..50c5583d1 100644 Binary files a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_light.png and b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png index 19581e9d6..2428aee24 100644 Binary files a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png index 46e1e2942..c444e6e0d 100644 Binary files a/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-hdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_dark.png b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_dark.png index 3a277b1e3..92c1bd7c6 100644 Binary files a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_dark.png and b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_light.png b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_light.png index 33d2cb093..4c5a74044 100644 Binary files a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_light.png and b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png index d9709b5cf..1bf077fb8 100644 Binary files a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png index 46370125d..a94f9918f 100644 Binary files a/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-mdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_dark.png b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_dark.png index 21dad199f..09380c6e5 100644 Binary files a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_dark.png and b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_light.png b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_light.png index c6f9154d8..96aa0bffd 100644 Binary files a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_light.png and b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png index 75bec79b4..438db3316 100644 Binary files a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png index 104fb0edb..9d4968d0b 100644 Binary files a/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-xhdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_dark.png b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_dark.png index 0e9ae9896..20e764314 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_dark.png and b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_light.png b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_light.png index c9f9c0cf9..f49bc8aa9 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_light.png and b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png index beee21133..331911070 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png index 59afb27b4..def9f2861 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-xxhdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_dark.png b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_dark.png index af8e0244b..e8f2deb43 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_dark.png and b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_light.png b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_light.png index 1d141f03e..6157ca5ce 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_light.png and b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_light.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png index b98c523db..81509cfa0 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png and b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_dark.png differ diff --git a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png index db2b2aaf6..d0c59666d 100644 Binary files a/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png and b/patches/src/main/resources/change-header/drawable-xxxhdpi/revanced_header_logo_minimal_light.png differ diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_minimal.xml new file mode 100644 index 000000000..ab5fb737e --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_minimal.xml @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_rounded.xml new file mode 100644 index 000000000..ab5fb737e --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_rounded.xml @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_scaled.xml new file mode 100644 index 000000000..6098eed22 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_background_scaled.xml @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml new file mode 100644 index 000000000..a4b14512d --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_minimal.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml new file mode 100644 index 000000000..1b4dcef31 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_rounded.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml new file mode 100644 index 000000000..e64200344 --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_foreground_scaled.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml new file mode 100644 index 000000000..a5eadebdc --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_custom.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml new file mode 100644 index 000000000..a5eadebdc --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_minimal.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml new file mode 100644 index 000000000..11979dd6a --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_rounded.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml new file mode 100644 index 000000000..41160d4ba --- /dev/null +++ b/patches/src/main/resources/custom-branding/drawable/revanced_adaptive_monochrome_scaled.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_custom.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_custom.xml new file mode 100644 index 000000000..888cbabc6 --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_custom.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_minimal.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_minimal.xml new file mode 100644 index 000000000..2e484170c --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_minimal.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_rounded.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_rounded.xml new file mode 100644 index 000000000..4bb8e855a --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_rounded.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_scaled.xml b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_scaled.xml new file mode 100644 index 000000000..2e2590863 --- /dev/null +++ b/patches/src/main/resources/custom-branding/mipmap-anydpi/revanced_launcher_scaled.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 1813f47fe..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 9448e7315..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 5adf89398..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 5adf89398..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_background_custom.png new file mode 100644 index 000000000..1bc5dbe71 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 000000000..315b280fb Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-hdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index bfb91cced..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 7fd951124..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 46117b63a..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 46117b63a..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_background_custom.png new file mode 100644 index 000000000..ff3c7a4c0 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 000000000..c58e817d2 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-mdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 4245fe042..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index b50442bec..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 224d66434..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 224d66434..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_background_custom.png new file mode 100644 index 000000000..82c15e2b9 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 000000000..bb90b61d5 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xhdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index da0fa7aa1..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 184eb07a5..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index f566f259e..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index f566f259e..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_background_custom.png new file mode 100644 index 000000000..be663ad72 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 000000000..296309358 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxhdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png deleted file mode 100644 index 865aad974..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png deleted file mode 100644 index 3b066a2c3..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 8823abe66..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 8823abe66..000000000 Binary files a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_background_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_background_custom.png new file mode 100644 index 000000000..addcbda14 Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_background_custom.png differ diff --git a/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_foreground_custom.png b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_foreground_custom.png new file mode 100644 index 000000000..917ea24cc Binary files /dev/null and b/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/revanced_adaptive_foreground_custom.png differ diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon.xml index 3c2cbe1c3..e561ea075 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_icon.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon.xml @@ -1,9 +1,4 @@ - - +