Compare commits

..

17 Commits

Author SHA1 Message Date
semantic-release-bot
ccb76983ff chore: Release v5.18.1-dev.1 [skip ci]
## [5.18.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.18.0...v5.18.1-dev.1) (2025-03-31)

### Bug Fixes

* **YouTube - Remove background playback restrictions:** Do not show media controls when playing Shorts from the feed ([318b55b](318b55b8fe))
2025-03-31 13:45:18 +00:00
LisoUseInAIKyrios
318b55b8fe fix(YouTube - Remove background playback restrictions): Do not show media controls when playing Shorts from the feed 2025-03-31 15:36:01 +02:00
github-actions[bot]
49ade9efbc chore: Sync translations (#4703) 2025-03-31 15:35:28 +02:00
LisoUseInAIKyrios
d77515bd68 refactor: Add helper method to find a free register for a specific insert index (#4693) 2025-03-30 18:37:54 +02:00
semantic-release-bot
087bf1e152 chore: Release v5.18.0 [skip ci]
# [5.18.0](https://github.com/ReVanced/revanced-patches/compare/v5.17.0...v5.18.0) (2025-03-28)

### Bug Fixes

* **Spotify:** Ignore optional attributes if not present ([#4688](https://github.com/ReVanced/revanced-patches/issues/4688)) ([84f5854](84f585492e))

### Features

* **YouTube:** Support version `20.07.39` ([#4677](https://github.com/ReVanced/revanced-patches/issues/4677)) ([842ba4f](842ba4fc4d))
2025-03-28 18:51:44 +00:00
LisoUseInAIKyrios
c2994d583d chore: Merge branch dev to main (#4686) 2025-03-28 19:48:32 +01:00
semantic-release-bot
127b0a63fe chore: Release v5.18.0-dev.2 [skip ci]
# [5.18.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.18.0-dev.1...v5.18.0-dev.2) (2025-03-28)

### Bug Fixes

* **Spotify:** Ignore optional attributes if not present ([#4688](https://github.com/ReVanced/revanced-patches/issues/4688)) ([84f5854](84f585492e))
2025-03-28 18:36:38 +00:00
github-actions[bot]
27aafd0ee1 chore: Sync translations (#4689) 2025-03-28 19:31:52 +01:00
semantic-release-bot
49c54c0e54 chore: Release v5.18.0-dev.1 [skip ci]
# [5.18.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.17.0...v5.18.0-dev.1) (2025-03-28)

### Features

* **YouTube:** Support version `20.07.39` ([#4677](https://github.com/ReVanced/revanced-patches/issues/4677)) ([842ba4f](842ba4fc4d))
2025-03-28 17:01:42 +00:00
LisoUseInAIKyrios
842ba4fc4d feat(YouTube): Support version 20.07.39 (#4677) 2025-03-28 17:49:12 +01:00
semantic-release-bot
66ecadce4f chore: Release v5.17.0 [skip ci]
# [5.17.0](https://github.com/ReVanced/revanced-patches/compare/v5.16.1...v5.17.0) (2025-03-28)

### Bug Fixes

* **Facebook - Hide 'Sponsored Stories':** Constrain patch to latest compatible version ([#4657](https://github.com/ReVanced/revanced-patches/issues/4657)) ([4d910fe](4d910fea93))
* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([ca4f960](ca4f960171))
* **Spotify - Unlock Premium:** Use correct patch description convention ([a486522](a4865228f8))
* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([497291c](497291c478))
* **YouTube - Navigation buttons:** Add user dialog message to 'Disable translucent status bar' ([bf91e12](bf91e127d8))

### Features

* **Spotify - Unlock Premium:** Disable the "Spotify Premium" upsell experiment in context menus ([c84be12](c84be120bd))
2025-03-28 16:39:31 +00:00
LisoUseInAIKyrios
73ca04da5e chore: Merge branch dev to main (#4658) 2025-03-28 17:36:31 +01:00
semantic-release-bot
a5d26208c1 chore: Release v5.17.0-dev.4 [skip ci]
# [5.17.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.3...v5.17.0-dev.4) (2025-03-28)

### Bug Fixes

* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([497291c](497291c478))
2025-03-28 16:14:49 +00:00
LisoUseInAIKyrios
497291c478 fix(X / Twitter): Constrain patches to latest compatible versions (#4683) 2025-03-28 17:11:30 +01:00
github-actions[bot]
b24278a544 chore: Sync translations (#4680) 2025-03-28 15:03:07 +01:00
semantic-release-bot
135f9ead3c chore: Release v5.17.0-dev.3 [skip ci]
# [5.17.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.2...v5.17.0-dev.3) (2025-03-28)

### Bug Fixes

* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([ca4f960](ca4f960171))
2025-03-28 10:55:04 +00:00
xC3FFF0E
ca4f960171 fix(Spotify - Unlock Premium): Override additional attributes (#4651)
Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com>
2025-03-28 11:52:23 +01:00
140 changed files with 1410 additions and 790 deletions

View File

@@ -1,3 +1,66 @@
## [5.18.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.18.0...v5.18.1-dev.1) (2025-03-31)
### Bug Fixes
* **YouTube - Remove background playback restrictions:** Do not show media controls when playing Shorts from the feed ([2ed675c](https://github.com/ReVanced/revanced-patches/commit/2ed675cdd058fb5876381a9d30dee5263f6b2e26))
# [5.18.0](https://github.com/ReVanced/revanced-patches/compare/v5.17.0...v5.18.0) (2025-03-28)
### Bug Fixes
* **Spotify:** Ignore optional attributes if not present ([#4688](https://github.com/ReVanced/revanced-patches/issues/4688)) ([84f5854](https://github.com/ReVanced/revanced-patches/commit/84f585492e4be3604c6c7680ffb3bebcea5a675f))
### Features
* **YouTube:** Support version `20.07.39` ([#4677](https://github.com/ReVanced/revanced-patches/issues/4677)) ([c1379f6](https://github.com/ReVanced/revanced-patches/commit/c1379f6e520c683d2c9d6a490a69ca542168b3b3))
# [5.18.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.18.0-dev.1...v5.18.0-dev.2) (2025-03-28)
### Bug Fixes
* **Spotify:** Ignore optional attributes if not present ([#4688](https://github.com/ReVanced/revanced-patches/issues/4688)) ([84f5854](https://github.com/ReVanced/revanced-patches/commit/84f585492e4be3604c6c7680ffb3bebcea5a675f))
# [5.18.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.17.0...v5.18.0-dev.1) (2025-03-28)
### Features
* **YouTube:** Support version `20.07.39` ([#4677](https://github.com/ReVanced/revanced-patches/issues/4677)) ([c1379f6](https://github.com/ReVanced/revanced-patches/commit/c1379f6e520c683d2c9d6a490a69ca542168b3b3))
# [5.17.0](https://github.com/ReVanced/revanced-patches/compare/v5.16.1...v5.17.0) (2025-03-28)
### Bug Fixes
* **Facebook - Hide 'Sponsored Stories':** Constrain patch to latest compatible version ([#4657](https://github.com/ReVanced/revanced-patches/issues/4657)) ([46bd1c8](https://github.com/ReVanced/revanced-patches/commit/46bd1c829acd5f83600025e0ceb7d482ae80be69))
* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([568b40d](https://github.com/ReVanced/revanced-patches/commit/568b40da9692eae9039bbb3cec513a61ca627c24))
* **Spotify - Unlock Premium:** Use correct patch description convention ([a486522](https://github.com/ReVanced/revanced-patches/commit/a4865228f8481d2efc8fbf4e90902a03289d9a3f))
* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([f579728](https://github.com/ReVanced/revanced-patches/commit/f5797289f45186052537982c7f5db6f2b0769aee))
* **YouTube - Navigation buttons:** Add user dialog message to 'Disable translucent status bar' ([a4a0e68](https://github.com/ReVanced/revanced-patches/commit/a4a0e6869e23d15ee09262460f4e290c90629eeb))
### Features
* **Spotify - Unlock Premium:** Disable the "Spotify Premium" upsell experiment in context menus ([9a10ee4](https://github.com/ReVanced/revanced-patches/commit/9a10ee4d22fb53da2012a182e038749d3ad72377))
# [5.17.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.3...v5.17.0-dev.4) (2025-03-28)
### Bug Fixes
* **X / Twitter:** Constrain patches to latest compatible versions ([#4683](https://github.com/ReVanced/revanced-patches/issues/4683)) ([f579728](https://github.com/ReVanced/revanced-patches/commit/f5797289f45186052537982c7f5db6f2b0769aee))
# [5.17.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.2...v5.17.0-dev.3) (2025-03-28)
### Bug Fixes
* **Spotify - Unlock Premium:** Override additional attributes ([#4651](https://github.com/ReVanced/revanced-patches/issues/4651)) ([568b40d](https://github.com/ReVanced/revanced-patches/commit/568b40da9692eae9039bbb3cec513a61ca627c24))
# [5.17.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.1...v5.17.0-dev.2) (2025-03-27) # [5.17.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.17.0-dev.1...v5.17.0-dev.2) (2025-03-27)

View File

@@ -122,6 +122,21 @@ public class SpoofVideoStreamsPatch {
return false; return false;
} }
/**
* Injection point.
* Turns off a feature flag that interferes with video playback.
*/
public static boolean usePlaybackStartFeatureFlag(boolean original) {
if (original) {
Logger.printDebug(() -> "usePlaybackStartFeatureFlag is set on");
}
if (!SPOOF_STREAMING_DATA) {
return original;
}
return false;
}
/** /**
* Injection point. * Injection point.
*/ */

View File

@@ -1,3 +1,16 @@
dependencies { dependencies {
compileOnly(project(":extensions:shared:library"))
compileOnly(project(":extensions:spotify:stub")) compileOnly(project(":extensions:spotify:stub"))
compileOnly(libs.annotation)
}
android {
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
} }

View File

@@ -1,6 +1,7 @@
package app.revanced.extension.youtube.patches; package app.revanced.extension.youtube.patches;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
import app.revanced.extension.youtube.shared.PlayerType;
import app.revanced.extension.youtube.shared.ShortsPlayerState; import app.revanced.extension.youtube.shared.ShortsPlayerState;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@@ -23,7 +24,13 @@ public class BackgroundPlaybackPatch {
// 7. Close the Short // 7. Close the Short
// 8. Resume playing the regular video // 8. Resume playing the regular video
// 9. Minimize the app (PIP should appear) // 9. Minimize the app (PIP should appear)
return !ShortsPlayerState.isOpen(); if (ShortsPlayerState.isOpen()) {
return false;
}
// Check if the video player is opened and it's not playing in the feed.
PlayerType current = PlayerType.getCurrent();
return !current.isNoneOrHidden() && current != PlayerType.INLINE_MINIMAL;
} }
/** /**

View File

@@ -2,7 +2,7 @@ package app.revanced.extension.youtube.patches;
import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.settings.Settings;
/** @noinspection unused*/ @SuppressWarnings("unused")
public class DisableResumingStartupShortsPlayerPatch { public class DisableResumingStartupShortsPlayerPatch {
/** /**
@@ -11,4 +11,11 @@ public class DisableResumingStartupShortsPlayerPatch {
public static boolean disableResumingStartupShortsPlayer() { public static boolean disableResumingStartupShortsPlayer() {
return Settings.DISABLE_RESUMING_SHORTS_PLAYER.get(); return Settings.DISABLE_RESUMING_SHORTS_PLAYER.get();
} }
/**
* Injection point.
*/
public static boolean disableResumingStartupShortsPlayer(boolean original) {
return original && !Settings.DISABLE_RESUMING_SHORTS_PLAYER.get();
}
} }

View File

@@ -43,10 +43,13 @@ public final class MiniplayerPatch {
MODERN_2(null, 2), MODERN_2(null, 2),
MODERN_3(null, 3), MODERN_3(null, 3),
/** /**
* Half broken miniplayer, that might be work in progress or left over abandoned code. * Works and is functional with 20.03+
* Can force this type by editing the import/export settings.
*/ */
MODERN_4(null, 4); MODERN_4(null, 4),
/**
* Half broken miniplayer, and in 20.02 and earlier is declared as type 4.
*/
MODERN_5(null, 5);
/** /**
* Legacy tablet hook value. * Legacy tablet hook value.
@@ -126,12 +129,13 @@ public final class MiniplayerPatch {
private static final boolean DRAG_AND_DROP_ENABLED = private static final boolean DRAG_AND_DROP_ENABLED =
CURRENT_TYPE.isModern() && Settings.MINIPLAYER_DRAG_AND_DROP.get(); CURRENT_TYPE.isModern() && Settings.MINIPLAYER_DRAG_AND_DROP.get();
private static final boolean HIDE_EXPAND_CLOSE_ENABLED = private static final boolean HIDE_OVERLAY_BUTTONS_ENABLED =
Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.get() Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.get()
&& Settings.MINIPLAYER_HIDE_EXPAND_CLOSE.isAvailable(); && Settings.MINIPLAYER_HIDE_OVERLAY_BUTTONS.isAvailable();
private static final boolean HIDE_SUBTEXT_ENABLED = private static final boolean HIDE_SUBTEXT_ENABLED =
(CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3) && Settings.MINIPLAYER_HIDE_SUBTEXT.get(); (CURRENT_TYPE == MODERN_1 || CURRENT_TYPE == MODERN_3 || CURRENT_TYPE == MODERN_4)
&& Settings.MINIPLAYER_HIDE_SUBTEXT.get();
// 19.25 is last version that has forward/back buttons for phones, // 19.25 is last version that has forward/back buttons for phones,
// but buttons still show for tablets/foldable devices and they don't work well so always hide. // but buttons still show for tablets/foldable devices and they don't work well so always hide.
@@ -139,7 +143,7 @@ public final class MiniplayerPatch {
&& (VersionCheckPatch.IS_19_34_OR_GREATER || Settings.MINIPLAYER_HIDE_REWIND_FORWARD.get()); && (VersionCheckPatch.IS_19_34_OR_GREATER || Settings.MINIPLAYER_HIDE_REWIND_FORWARD.get());
private static final boolean MINIPLAYER_ROUNDED_CORNERS_ENABLED = private static final boolean MINIPLAYER_ROUNDED_CORNERS_ENABLED =
Settings.MINIPLAYER_ROUNDED_CORNERS.get(); CURRENT_TYPE.isModern() && Settings.MINIPLAYER_ROUNDED_CORNERS.get();
private static final boolean MINIPLAYER_HORIZONTAL_DRAG_ENABLED = private static final boolean MINIPLAYER_HORIZONTAL_DRAG_ENABLED =
DRAG_AND_DROP_ENABLED && Settings.MINIPLAYER_HORIZONTAL_DRAG.get(); DRAG_AND_DROP_ENABLED && Settings.MINIPLAYER_HORIZONTAL_DRAG.get();
@@ -172,11 +176,12 @@ public final class MiniplayerPatch {
} }
} }
public static final class MiniplayerHideExpandCloseAvailability implements Setting.Availability { public static final class MiniplayerHideOverlayButtonsAvailability implements Setting.Availability {
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
MiniplayerType type = Settings.MINIPLAYER_TYPE.get(); MiniplayerType type = Settings.MINIPLAYER_TYPE.get();
return (!IS_19_20_OR_GREATER && (type == MODERN_1 || type == MODERN_3)) return type == MODERN_4
|| (!IS_19_20_OR_GREATER && (type == MODERN_1 || type == MODERN_3))
|| (!IS_19_26_OR_GREATER && type == MODERN_1 || (!IS_19_26_OR_GREATER && type == MODERN_1
&& !Settings.MINIPLAYER_DOUBLE_TAP_ACTION.get() && !Settings.MINIPLAYER_DRAG_AND_DROP.get()) && !Settings.MINIPLAYER_DOUBLE_TAP_ACTION.get() && !Settings.MINIPLAYER_DRAG_AND_DROP.get())
|| (IS_19_29_OR_GREATER && type == MODERN_3); || (IS_19_29_OR_GREATER && type == MODERN_3);
@@ -227,9 +232,13 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static void adjustMiniplayerOpacity(ImageView view) { public static void adjustMiniplayerOpacity(View view) {
if (CURRENT_TYPE == MODERN_1) { if (CURRENT_TYPE == MODERN_1) {
view.setImageAlpha(OPACITY_LEVEL); if (view instanceof ImageView imageView) {
imageView.setImageAlpha(OPACITY_LEVEL);
} else {
Logger.printException(() -> "Unknown miniplayer overlay view: " + view);
}
} }
} }
@@ -247,7 +256,7 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static boolean enableMiniplayerDoubleTapAction(boolean original) { public static boolean getMiniplayerDoubleTapAction(boolean original) {
if (CURRENT_TYPE == DEFAULT) { if (CURRENT_TYPE == DEFAULT) {
return original; return original;
} }
@@ -258,7 +267,7 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static boolean enableMiniplayerDragAndDrop(boolean original) { public static boolean getMiniplayerDragAndDrop(boolean original) {
if (CURRENT_TYPE == DEFAULT) { if (CURRENT_TYPE == DEFAULT) {
return original; return original;
} }
@@ -266,13 +275,36 @@ public final class MiniplayerPatch {
return DRAG_AND_DROP_ENABLED; return DRAG_AND_DROP_ENABLED;
} }
/**
* Injection point.
*/
public static boolean getRoundedCorners(boolean original) {
if (CURRENT_TYPE == DEFAULT) {
return original;
}
return MINIPLAYER_ROUNDED_CORNERS_ENABLED;
}
/** /**
* Injection point. * Injection point.
*/ */
public static boolean setRoundedCorners(boolean original) { public static boolean getHorizontalDrag(boolean original) {
if (CURRENT_TYPE.isModern()) { if (CURRENT_TYPE == DEFAULT) {
return MINIPLAYER_ROUNDED_CORNERS_ENABLED; return original;
}
return MINIPLAYER_HORIZONTAL_DRAG_ENABLED;
}
/**
* Injection point.
*/
public static boolean getMaximizeAnimation(boolean original) {
// This must be forced on if horizontal drag is enabled,
// otherwise the UI has visual glitches when maximizing the miniplayer.
if (MINIPLAYER_HORIZONTAL_DRAG_ENABLED) {
return true;
} }
return original; return original;
@@ -281,7 +313,7 @@ public final class MiniplayerPatch {
/** /**
* Injection point. * Injection point.
*/ */
public static int setMiniplayerDefaultSize(int original) { public static int getMiniplayerDefaultSize(int original) {
if (CURRENT_TYPE.isModern()) { if (CURRENT_TYPE.isModern()) {
return MINIPLAYER_SIZE; return MINIPLAYER_SIZE;
} }
@@ -289,29 +321,26 @@ public final class MiniplayerPatch {
return original; return original;
} }
/**
* Injection point.
*/
public static void hideMiniplayerExpandClose(View view) {
Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view);
}
/** /**
* Injection point. * Injection point.
*/ */
public static boolean setHorizontalDrag(boolean original) { public static void hideMiniplayerActionButton(View view) {
if (CURRENT_TYPE.isModern()) { if (CURRENT_TYPE == MODERN_4) {
return MINIPLAYER_HORIZONTAL_DRAG_ENABLED; Utils.hideViewByRemovingFromParentUnderCondition(HIDE_OVERLAY_BUTTONS_ENABLED, view);
} }
return original;
} }
/** /**
* Injection point. * Injection point.
*/ */
public static void hideMiniplayerExpandClose(ImageView view) { public static void hideMiniplayerRewindForward(View view) {
Utils.hideViewByRemovingFromParentUnderCondition(HIDE_EXPAND_CLOSE_ENABLED, view);
}
/**
* Injection point.
*/
public static void hideMiniplayerRewindForward(ImageView view) {
Utils.hideViewByRemovingFromParentUnderCondition(HIDE_REWIND_FORWARD_ENABLED, view); Utils.hideViewByRemovingFromParentUnderCondition(HIDE_REWIND_FORWARD_ENABLED, view);
} }

View File

@@ -3,11 +3,15 @@ package app.revanced.extension.youtube.patches;
import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.Utils;
public class VersionCheckPatch { public class VersionCheckPatch {
public static final boolean IS_19_17_OR_GREATER = Utils.getAppVersionName().compareTo("19.17.00") >= 0; private static boolean isVersionOrGreater(String version) {
public static final boolean IS_19_20_OR_GREATER = Utils.getAppVersionName().compareTo("19.20.00") >= 0; return Utils.getAppVersionName().compareTo(version) >= 0;
public static final boolean IS_19_21_OR_GREATER = Utils.getAppVersionName().compareTo("19.21.00") >= 0; }
public static final boolean IS_19_26_OR_GREATER = Utils.getAppVersionName().compareTo("19.26.00") >= 0;
public static final boolean IS_19_29_OR_GREATER = Utils.getAppVersionName().compareTo("19.29.00") >= 0; public static final boolean IS_19_17_OR_GREATER = isVersionOrGreater("19.17.00");
public static final boolean IS_19_34_OR_GREATER = Utils.getAppVersionName().compareTo("19.34.00") >= 0; public static final boolean IS_19_20_OR_GREATER = isVersionOrGreater("19.20.00");
public static final boolean IS_19_46_OR_GREATER = Utils.getAppVersionName().compareTo("19.46.00") >= 0; public static final boolean IS_19_21_OR_GREATER = isVersionOrGreater("19.21.00");
public static final boolean IS_19_26_OR_GREATER = isVersionOrGreater("19.26.00");
public static final boolean IS_19_29_OR_GREATER = isVersionOrGreater("19.29.00");
public static final boolean IS_19_34_OR_GREATER = isVersionOrGreater("19.34.00");
public static final boolean IS_19_46_OR_GREATER = isVersionOrGreater("19.46.00");
} }

View File

@@ -114,7 +114,7 @@ public class ReturnYouTubeDislike {
private static final Rect middleSeparatorBounds; private static final Rect middleSeparatorBounds;
/** /**
* Left separator horizontal padding for Rolling Number layout. * Horizontal padding between the left and middle separator.
*/ */
public static final int leftSeparatorShapePaddingPixels; public static final int leftSeparatorShapePaddingPixels;
private static final ShapeDrawable leftSeparatorShape; private static final ShapeDrawable leftSeparatorShape;
@@ -129,7 +129,7 @@ public class ReturnYouTubeDislike {
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp); (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3.7f, dp);
middleSeparatorBounds = new Rect(0, 0, middleSeparatorSize, middleSeparatorSize); middleSeparatorBounds = new Rect(0, 0, middleSeparatorSize, middleSeparatorSize);
leftSeparatorShapePaddingPixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10.0f, dp); leftSeparatorShapePaddingPixels = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8.4f, dp);
leftSeparatorShape = new ShapeDrawable(new RectShape()); leftSeparatorShape = new ShapeDrawable(new RectShape());
leftSeparatorShape.setBounds(leftSeparatorBounds); leftSeparatorShape.setBounds(leftSeparatorBounds);
@@ -238,7 +238,7 @@ public class ReturnYouTubeDislike {
String leftSeparatorString = getTextDirectionString(); String leftSeparatorString = getTextDirectionString();
final Spannable leftSeparatorSpan; final Spannable leftSeparatorSpan;
if (isRollingNumber) { if (isRollingNumber) {
leftSeparatorSpan = new SpannableString(leftSeparatorString); leftSeparatorSpan = new SpannableString(leftSeparatorString);
} else { } else {
leftSeparatorString += " "; leftSeparatorString += " ";
leftSeparatorSpan = new SpannableString(leftSeparatorString); leftSeparatorSpan = new SpannableString(leftSeparatorString);
@@ -623,7 +623,7 @@ public class ReturnYouTubeDislike {
userVote = vote; userVote = vote;
clearUICache(); clearUICache();
} }
if (future.isDone()) { if (future.isDone()) {
// Update the fetched vote data. // Update the fetched vote data.
RYDVoteData voteData = getFetchData(MAX_MILLISECONDS_TO_BLOCK_UI_WAITING_FOR_FETCH); RYDVoteData voteData = getFetchData(MAX_MILLISECONDS_TO_BLOCK_UI_WAITING_FOR_FETCH);

View File

@@ -10,7 +10,6 @@ import static app.revanced.extension.youtube.patches.ChangeFormFactorPatch.FormF
import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.StartPage; import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.StartPage;
import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode; import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode;
import static app.revanced.extension.youtube.patches.ForceOriginalAudioPatch.ForceOriginalAudioAvailability; import static app.revanced.extension.youtube.patches.ForceOriginalAudioPatch.ForceOriginalAudioAvailability;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideExpandCloseAvailability;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType;
import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL;
@@ -40,6 +39,7 @@ import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.DeArrow
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability;
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption;
import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime;
import app.revanced.extension.youtube.patches.MiniplayerPatch;
import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings;
public class Settings extends BaseSettings { public class Settings extends BaseSettings {
@@ -156,7 +156,7 @@ public class Settings extends BaseSettings {
public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN);
public static final BooleanSetting MINIPLAYER_DRAG_AND_DROP = new BooleanSetting("revanced_miniplayer_drag_and_drop", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_DRAG_AND_DROP = new BooleanSetting("revanced_miniplayer_drag_and_drop", TRUE, true, MINIPLAYER_ANY_MODERN);
public static final BooleanSetting MINIPLAYER_HORIZONTAL_DRAG = new BooleanSetting("revanced_miniplayer_horizontal_drag", FALSE, true, new MiniplayerHorizontalDragAvailability()); public static final BooleanSetting MINIPLAYER_HORIZONTAL_DRAG = new BooleanSetting("revanced_miniplayer_horizontal_drag", FALSE, true, new MiniplayerHorizontalDragAvailability());
public static final BooleanSetting MINIPLAYER_HIDE_EXPAND_CLOSE = new BooleanSetting("revanced_miniplayer_hide_expand_close", FALSE, true, new MiniplayerHideExpandCloseAvailability()); public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability());
public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3)); public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3));
public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, MINIPLAYER_TYPE.availability(MODERN_1)); public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, MINIPLAYER_TYPE.availability(MODERN_1));
public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN);

View File

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

View File

@@ -776,8 +776,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/TextPref
} }
public final class app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatchKt { 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;)Lapp/revanced/patcher/patch/BytecodePatch; 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;ILjava/lang/Object;)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 final class app/revanced/patches/shared/misc/spoof/UserAgentClientSpoofPatchKt {
@@ -820,6 +820,10 @@ public final class app/revanced/patches/spotify/misc/UnlockPremiumPatchKt {
public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }
public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt {
public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
}
public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt {
public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch;
} }
@@ -1181,17 +1185,7 @@ public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPa
} }
public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatchKt { public final class app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatchKt {
public static final fun getFloatyBarButtonTopMargin ()J
public static final fun getMiniplayerMaxSize ()J
public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getMiniplayerPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
public static final fun getModernMiniplayerClose ()J
public static final fun getModernMiniplayerExpand ()J
public static final fun getModernMiniplayerForwardButton ()J
public static final fun getModernMiniplayerRewindButton ()J
public static final fun getPlayerOverlays ()J
public static final fun getScrimOverlay ()J
public static final fun getYtOutlinePictureInPictureWhite24 ()J
public static final fun getYtOutlineXWhite24 ()J
} }
public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt { public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatchKt {
@@ -1386,6 +1380,12 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat
public static final fun is_19_46_or_greater ()Z public static final fun is_19_46_or_greater ()Z
public static final fun is_19_47_or_greater ()Z public static final fun is_19_47_or_greater ()Z
public static final fun is_19_49_or_greater ()Z public static final fun is_19_49_or_greater ()Z
public static final fun is_20_02_or_greater ()Z
public static final fun is_20_03_or_greater ()Z
public static final fun is_20_05_or_greater ()Z
public static final fun is_20_07_or_greater ()Z
public static final fun is_20_09_or_greater ()Z
public static final fun is_20_10_or_greater ()Z
} }
public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt {

View File

@@ -145,7 +145,25 @@ internal val patchIncludedExtensionMethodFingerprint = fingerprint {
internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L
internal val mediaFetchHotConfigFingerprint = fingerprint { internal val mediaFetchHotConfigFingerprint = fingerprint {
literal { literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG }
MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG }
}
// 20.10+
internal const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L
internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint {
literal { MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG }
}
// Feature flag that enables different code for parsing and starting video playback,
// but it's exact purpose is not known. If this flag is enabled while stream spoofing
// then videos will never start playback and load forever.
// Flag does not seem to affect playback if spoofing is off.
internal const val PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG = 45665455L
internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters()
returns("Z")
literal { PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG }
} }

View File

@@ -10,6 +10,7 @@ import app.revanced.patcher.patch.BytecodePatchContext
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.util.findFreeRegister
import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
@@ -31,7 +32,9 @@ internal const val EXTENSION_CLASS_DESCRIPTOR =
fun spoofVideoStreamsPatch( fun spoofVideoStreamsPatch(
block: BytecodePatchBuilder.() -> Unit = {}, block: BytecodePatchBuilder.() -> Unit = {},
applyMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false }, fixMediaFetchHotConfigChanges: BytecodePatchBuilder.() -> Boolean = { false },
fixMediaFetchHotConfigAlternativeChanges: BytecodePatchBuilder.() -> Boolean = { false },
fixParsePlaybackResponseFeatureFlag: BytecodePatchBuilder.() -> Boolean = { false },
executeBlock: BytecodePatchContext.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {},
) = bytecodePatch( ) = bytecodePatch(
name = "Spoof video streams", name = "Spoof video streams",
@@ -92,14 +95,14 @@ fun spoofVideoStreamsPatch(
getReference<MethodReference>()?.name == "newUrlRequestBuilder" getReference<MethodReference>()?.name == "newUrlRequestBuilder"
} }
val urlRegister = getInstruction<FiveRegisterInstruction>(newRequestBuilderIndex).registerD val urlRegister = getInstruction<FiveRegisterInstruction>(newRequestBuilderIndex).registerD
val freeRegister = getInstruction<OneRegisterInstruction>(newRequestBuilderIndex + 1).registerA val freeRegister = findFreeRegister(newRequestBuilderIndex, urlRegister)
addInstructions( addInstructions(
newRequestBuilderIndex, newRequestBuilderIndex,
""" """
move-object v$freeRegister, p1 move-object v$freeRegister, p1
invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V
""", """
) )
} }
@@ -241,13 +244,27 @@ fun spoofVideoStreamsPatch(
// region turn off stream config replacement feature flag. // region turn off stream config replacement feature flag.
if (applyMediaFetchHotConfigChanges()) { if (fixMediaFetchHotConfigChanges()) {
mediaFetchHotConfigFingerprint.method.insertFeatureFlagBooleanOverride( mediaFetchHotConfigFingerprint.method.insertFeatureFlagBooleanOverride(
MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG, MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z"
) )
} }
if (fixMediaFetchHotConfigAlternativeChanges()) {
mediaFetchHotConfigAlternativeFingerprint.method.insertFeatureFlagBooleanOverride(
MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z"
)
}
if (fixParsePlaybackResponseFeatureFlag()) {
playbackStartDescriptorFeatureFlagFingerprint.method.insertFeatureFlagBooleanOverride(
PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG,
"$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z"
)
}
// endregion // endregion
executeBlock() executeBlock()

View File

@@ -10,6 +10,7 @@ import org.w3c.dom.Element
val customThemePatch = resourcePatch( val customThemePatch = resourcePatch(
name = "Custom theme", name = "Custom theme",
description = "Applies a custom theme.", description = "Applies a custom theme.",
use = false,
) { ) {
compatibleWith("com.spotify.music") compatibleWith("com.spotify.music")

View File

@@ -0,0 +1,5 @@
package app.revanced.patches.spotify.misc.extension
import app.revanced.patches.shared.misc.extension.sharedExtensionPatch
val sharedExtensionPatch = sharedExtensionPatch("spotify", spotifyMainActivityOnCreate)

View File

@@ -0,0 +1,10 @@
package app.revanced.patches.spotify.misc.extension
import app.revanced.patches.shared.misc.extension.extensionHook
internal val spotifyMainActivityOnCreate = extensionHook {
custom { method, classDef ->
classDef.type == "Lcom/spotify/music/SpotifyMainActivity;" &&
method.name == "onCreate"
}
}

View File

@@ -10,7 +10,13 @@ val dynamicColorPatch = resourcePatch(
name = "Dynamic color", name = "Dynamic color",
description = "Replaces the default X (Formerly Twitter) Blue with the user's Material You palette.", description = "Replaces the default X (Formerly Twitter) Blue with the user's Material You palette.",
) { ) {
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
"10.84.0-release.0",
"10.60.0-release.0",
"10.48.0-release.0"
)
)
execute { execute {
val resDirectory = get("res") val resDirectory = get("res")

View File

@@ -11,7 +11,15 @@ fun hookPatch(
) = bytecodePatch(name) { ) = bytecodePatch(name) {
dependsOn(jsonHookPatch) dependsOn(jsonHookPatch)
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
// 10.85+ uses Pairip and requires additional changes to work.
"10.84.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"
)
)
execute { execute {
addJsonHook(JsonHook(hookClassDescriptor)) addJsonHook(JsonHook(hookClassDescriptor))

View File

@@ -37,7 +37,13 @@ val changeLinkSharingDomainPatch = bytecodePatch(
sharedExtensionPatch, sharedExtensionPatch,
) )
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
"10.84.0-release.0",
"10.60.0-release.0",
"10.48.0-release.0"
)
)
val domainName by stringOption( val domainName by stringOption(
key = "domainName", key = "domainName",

View File

@@ -8,7 +8,13 @@ val sanitizeSharingLinksPatch = bytecodePatch(
name = "Sanitize sharing links", name = "Sanitize sharing links",
description = "Removes the tracking query parameters from links before they are shared.", description = "Removes the tracking query parameters from links before they are shared.",
) { ) {
compatibleWith("com.twitter.android") compatibleWith(
"com.twitter.android"(
"10.84.0-release.0",
"10.60.0-release.0",
"10.48.0-release.0"
)
)
execute { execute {
sanitizeSharingLinksFingerprint.method.addInstructions( sanitizeSharingLinksFingerprint.method.addInstructions(

View File

@@ -82,9 +82,8 @@ val hideAdsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -29,9 +29,8 @@ val hideGetPremiumPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -27,9 +27,8 @@ val videoAdsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -57,9 +57,8 @@ val copyVideoUrlPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val removeViewerDiscretionDialogPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -72,9 +72,8 @@ val downloadsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -27,9 +27,8 @@ val disablePreciseSeekingGesturePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -30,9 +30,8 @@ val enableSeekbarTappingPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -39,9 +39,8 @@ val enableSlideToSeekPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val seekbarThumbnailsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -84,9 +84,8 @@ val swipeControlsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -26,9 +26,8 @@ val autoCaptionsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -47,9 +47,8 @@ val customBrandingPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -45,9 +45,8 @@ val changeHeaderPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -26,9 +26,8 @@ val hideButtonsPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -44,9 +44,8 @@ val navigationButtonsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -58,9 +58,8 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -37,9 +37,8 @@ val changeFormFactorPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -63,9 +63,8 @@ val hideEndscreenCardsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -35,9 +35,8 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val disableFullscreenAmbientModePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -15,7 +15,21 @@ internal val hideShowMoreButtonFingerprint = fingerprint {
literal { expandButtonDownId } literal { expandButtonDownId }
} }
/**
* 20.07+
*/
internal val parseElementFromBufferFingerprint = fingerprint { internal val parseElementFromBufferFingerprint = fingerprint {
parameters("L", "L", "[B", "L", "L")
opcodes(
Opcode.IGET_OBJECT,
Opcode.IGET_BOOLEAN,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
)
strings("Failed to parse Element") // String is a partial match.
}
internal val parseElementFromBufferLegacyFingerprint = fingerprint {
parameters("L", "L", "[B", "L", "L") parameters("L", "L", "[B", "L", "L")
opcodes( opcodes(
Opcode.IGET_OBJECT, Opcode.IGET_OBJECT,
@@ -110,7 +124,6 @@ internal val showFloatingMicrophoneButtonFingerprint = fingerprint {
opcodes( opcodes(
Opcode.IGET_BOOLEAN, Opcode.IGET_BOOLEAN,
Opcode.IF_EQZ, Opcode.IF_EQZ,
Opcode.RETURN_VOID,
) )
literal { fabButtonId } literal { fabButtonId }
} }

View File

@@ -20,12 +20,14 @@ import app.revanced.patches.shared.misc.settings.preference.*
import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter
import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch
import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch
import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater 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.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.findFreeRegister
import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.findInstructionIndicesReversedOrThrow
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstLiteralInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
@@ -120,7 +122,6 @@ val hideLayoutComponentsPatch = bytecodePatch(
addResourcesPatch, addResourcesPatch,
hideLayoutComponentsResourcePatch, hideLayoutComponentsResourcePatch,
navigationBarHookPatch, navigationBarHookPatch,
versionCheckPatch
) )
compatibleWith( compatibleWith(
@@ -132,6 +133,7 @@ val hideLayoutComponentsPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -247,29 +249,31 @@ val hideLayoutComponentsPatch = bytecodePatch(
// region Mix playlists // region Mix playlists
parseElementFromBufferFingerprint.method.apply { (if (is_20_07_or_greater) parseElementFromBufferFingerprint
val startIndex = parseElementFromBufferFingerprint.patternMatch!!.startIndex else parseElementFromBufferLegacyFingerprint).let {
// Target code is a mess with a lot of register moves. it.method.apply {
// There is no simple way to find a free register for all versions so this is hard coded. val byteArrayParameter = "p3"
val freeRegister = if (is_19_47_or_greater) 6 else 0 val startIndex = it.patternMatch!!.startIndex
val byteArrayParameter = "p3" val conversionContextRegister = getInstruction<TwoRegisterInstruction>(startIndex).registerA
val conversionContextRegister = getInstruction<TwoRegisterInstruction>(startIndex).registerA val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC }
val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC
val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC val insertIndex = startIndex + 1
val freeRegister = findFreeRegister(insertIndex, conversionContextRegister, returnEmptyComponentRegister)
addInstructionsWithLabels( addInstructionsWithLabels(
startIndex + 1, insertIndex,
""" """
invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z
move-result v$freeRegister move-result v$freeRegister
if-eqz v$freeRegister, :show if-eqz v$freeRegister, :show
move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 move-object v$returnEmptyComponentRegister, p1 # Required for 19.47
goto :return_empty_component goto :return_empty_component
:show :show
const/4 v$freeRegister, 0x0 # Restore register, required for 19.16 const/4 v$freeRegister, 0x0 # Restore register, required for 19.16
""", """,
ExternalLabel("return_empty_component", returnEmptyComponentInstruction), ExternalLabel("return_empty_component", returnEmptyComponentInstruction),
) )
}
} }
// endregion // endregion
@@ -345,19 +349,18 @@ val hideLayoutComponentsPatch = bytecodePatch(
// region hide floating microphone // region hide floating microphone
showFloatingMicrophoneButtonFingerprint.let { showFloatingMicrophoneButtonFingerprint.method.apply {
it.method.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow(fabButtonId)
val startIndex = it.patternMatch!!.startIndex val booleanIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.IGET_BOOLEAN)
val register = getInstruction<TwoRegisterInstruction>(startIndex).registerA val register = getInstruction<TwoRegisterInstruction>(booleanIndex).registerA
addInstructions( addInstructions(
startIndex + 1, booleanIndex + 1,
""" """
invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z
move-result v$register move-result v$register
""", """
) )
}
} }
// endregion // endregion

View File

@@ -61,9 +61,8 @@ val hideInfoCardsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val disableRollingNumberAnimationPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -29,9 +29,8 @@ val hideSeekbarPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -176,9 +176,8 @@ val hideShortsComponentsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -25,9 +25,8 @@ val hideTimestampPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -30,7 +30,7 @@ internal val miniplayerModernAddViewListenerFingerprint = fingerprint {
internal val miniplayerModernCloseButtonFingerprint = fingerprint { internal val miniplayerModernCloseButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerClose } literal { modernMiniplayerClose }
} }
@@ -62,7 +62,7 @@ internal val miniplayerOnCloseHandlerFingerprint = fingerprint {
*/ */
internal val miniplayerModernExpandButtonFingerprint = fingerprint { internal val miniplayerModernExpandButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerExpand } literal { modernMiniplayerExpand }
} }
@@ -82,7 +82,7 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint {
*/ */
internal val miniplayerModernForwardButtonFingerprint = fingerprint { internal val miniplayerModernForwardButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerForwardButton } literal { modernMiniplayerForwardButton }
} }
@@ -92,7 +92,6 @@ internal val miniplayerModernForwardButtonFingerprint = fingerprint {
*/ */
internal val miniplayerModernOverlayViewFingerprint = fingerprint { internal val miniplayerModernOverlayViewFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V")
parameters() parameters()
literal { scrimOverlay } literal { scrimOverlay }
} }
@@ -102,7 +101,7 @@ internal val miniplayerModernOverlayViewFingerprint = fingerprint {
*/ */
internal val miniplayerModernRewindButtonFingerprint = fingerprint { internal val miniplayerModernRewindButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Landroid/widget/ImageView;") returns("L")
parameters() parameters()
literal { modernMiniplayerRewindButton } literal { modernMiniplayerRewindButton }
} }
@@ -114,6 +113,13 @@ internal val miniplayerModernViewParentFingerprint = fingerprint {
strings("player_overlay_modern_mini_player_controls") strings("player_overlay_modern_mini_player_controls")
} }
internal val miniplayerModernActionButtonFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("L")
parameters()
literal { modernMiniPlayerOverlayActionButton }
}
internal val miniplayerMinimumSizeFingerprint = fingerprint { internal val miniplayerMinimumSizeFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
custom { method, _ -> custom { method, _ ->

View File

@@ -34,27 +34,29 @@ import com.android.tools.smali.dexlib2.iface.reference.TypeReference
import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
var floatyBarButtonTopMargin = -1L internal var floatyBarButtonTopMargin = -1L
private set private set
// Only available in 19.15 and upwards. // Only available in 19.15 and upwards.
var ytOutlineXWhite24 = -1L internal var ytOutlineXWhite24 = -1L
private set private set
var ytOutlinePictureInPictureWhite24 = -1L internal var ytOutlinePictureInPictureWhite24 = -1L
private set private set
var scrimOverlay = -1L internal var scrimOverlay = -1L
private set private set
var modernMiniplayerClose = -1L internal var modernMiniplayerClose = -1L
private set private set
var modernMiniplayerExpand = -1L internal var modernMiniplayerExpand = -1L
private set private set
var modernMiniplayerRewindButton = -1L internal var modernMiniplayerRewindButton = -1L
private set private set
var modernMiniplayerForwardButton = -1L internal var modernMiniplayerForwardButton = -1L
private set private set
var playerOverlays = -1L internal var modernMiniPlayerOverlayActionButton = -1L
private set private set
var miniplayerMaxSize = -1L internal var playerOverlays = -1L
private set
internal var miniplayerMaxSize = -1L
private set private set
private val miniplayerResourcePatch = resourcePatch { private val miniplayerResourcePatch = resourcePatch {
@@ -100,6 +102,11 @@ private val miniplayerResourcePatch = resourcePatch {
"modern_miniplayer_forward_button", "modern_miniplayer_forward_button",
] ]
modernMiniPlayerOverlayActionButton = resourceMappings[
"id",
"modern_miniplayer_overlay_action_button"
]
// Resource id is not used during patching, but is used by extension. // Resource id is not used during patching, but is used by extension.
// Verify the resource is present while patching. // Verify the resource is present while patching.
resourceMappings[ resourceMappings[
@@ -167,6 +174,7 @@ val miniplayerPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -175,19 +183,25 @@ val miniplayerPatch = bytecodePatch(
val preferences = mutableSetOf<BasePreference>() val preferences = mutableSetOf<BasePreference>()
preferences += preferences +=
if (is_19_43_or_greater) { if (is_20_03_or_greater) {
ListPreference( ListPreference(
"revanced_miniplayer_type", "revanced_miniplayer_type",
summaryKey = null, summaryKey = null,
) )
} else if (is_19_43_or_greater) {
ListPreference(
"revanced_miniplayer_type",
summaryKey = null,
entriesKey = "revanced_miniplayer_type_legacy_19_43_entries",
entryValuesKey = "revanced_miniplayer_type_legacy_19_43_entry_values",
)
} else { } else {
ListPreference( ListPreference(
"revanced_miniplayer_type", "revanced_miniplayer_type",
summaryKey = null, summaryKey = null,
entriesKey = "revanced_miniplayer_type_legacy_entries", entriesKey = "revanced_miniplayer_type_legacy_19_16_entries",
entryValuesKey = "revanced_miniplayer_type_legacy_entry_values", entryValuesKey = "revanced_miniplayer_type_legacy_19_16_entry_values",
) )
} }
@@ -209,13 +223,13 @@ val miniplayerPatch = bytecodePatch(
preferences += SwitchPreference("revanced_miniplayer_hide_subtext") preferences += SwitchPreference("revanced_miniplayer_hide_subtext")
preferences += if (is_19_26_or_greater) { preferences += if (is_19_26_or_greater) {
SwitchPreference("revanced_miniplayer_hide_expand_close") SwitchPreference("revanced_miniplayer_hide_overlay_buttons")
} else { } else {
SwitchPreference( SwitchPreference(
key = "revanced_miniplayer_hide_expand_close", key = "revanced_miniplayer_hide_overlay_buttons",
titleKey = "revanced_miniplayer_hide_expand_close_legacy_title", titleKey = "revanced_miniplayer_hide_overlay_buttons_legacy_title",
summaryOnKey = "revanced_miniplayer_hide_expand_close_legacy_summary_on", summaryOnKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_on",
summaryOffKey = "revanced_miniplayer_hide_expand_close_legacy_summary_off", summaryOffKey = "revanced_miniplayer_hide_overlay_buttons_legacy_summary_off",
) )
} }
@@ -365,7 +379,7 @@ val miniplayerPatch = bytecodePatch(
if (is_19_23_or_greater) { if (is_19_23_or_greater) {
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_DRAG_DROP_FEATURE_KEY, MINIPLAYER_DRAG_DROP_FEATURE_KEY,
"enableMiniplayerDragAndDrop", "getMiniplayerDragAndDrop",
) )
} }
@@ -382,7 +396,7 @@ val miniplayerPatch = bytecodePatch(
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_DOUBLE_TAP_FEATURE_KEY, MINIPLAYER_DOUBLE_TAP_FEATURE_KEY,
"enableMiniplayerDoubleTapAction", "getMiniplayerDoubleTapAction",
) )
} }
@@ -398,7 +412,7 @@ val miniplayerPatch = bytecodePatch(
addInstructions( addInstructions(
targetIndex + 1, targetIndex + 1,
""" """
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setMiniplayerDefaultSize(I)I invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getMiniplayerDefaultSize(I)I
move-result v$register move-result v$register
""", """,
) )
@@ -421,7 +435,7 @@ val miniplayerPatch = bytecodePatch(
if (is_19_36_or_greater) { if (is_19_36_or_greater) {
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY, MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY,
"setRoundedCorners", "getRoundedCorners",
) )
} }
@@ -433,7 +447,7 @@ val miniplayerPatch = bytecodePatch(
miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride(
MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY,
"setHorizontalDrag", "getHorizontalDrag",
) )
} }
@@ -473,6 +487,11 @@ val miniplayerPatch = bytecodePatch(
modernMiniplayerClose, modernMiniplayerClose,
"hideMiniplayerExpandClose", "hideMiniplayerExpandClose",
), ),
Triple(
miniplayerModernActionButtonFingerprint,
modernMiniPlayerOverlayActionButton,
"hideMiniplayerActionButton"
),
Triple( Triple(
miniplayerModernRewindButtonFingerprint, miniplayerModernRewindButtonFingerprint,
modernMiniplayerRewindButton, modernMiniplayerRewindButton,
@@ -490,12 +509,25 @@ val miniplayerPatch = bytecodePatch(
), ),
).forEach { (fingerprint, literalValue, methodName) -> ).forEach { (fingerprint, literalValue, methodName) ->
fingerprint.match( fingerprint.match(
miniplayerModernViewParentFingerprint.classDef, miniplayerModernViewParentFingerprint.originalClassDef
).method.hookInflatedView( ).method.apply {
literalValue, val literalIndex = indexOfFirstLiteralInstructionOrThrow(literalValue)
"Landroid/widget/ImageView;", val checkCastIndex = indexOfFirstInstruction(literalIndex) {
"$EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/widget/ImageView;)V", opcode == Opcode.CHECK_CAST &&
) getReference<TypeReference>()?.type == "Landroid/widget/ImageView;"
}
val viewIndex = if (checkCastIndex >= 0) {
checkCastIndex
} else {
indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT)
}
val viewRegister = getInstruction<OneRegisterInstruction>(viewIndex).registerA
addInstruction(
viewIndex + 1,
"invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V"
)
}
} }
miniplayerModernAddViewListenerFingerprint.match( miniplayerModernAddViewListenerFingerprint.match(
@@ -510,33 +542,40 @@ val miniplayerPatch = bytecodePatch(
// Modern 2 uses the same overlay controls as the regular video player, // Modern 2 uses the same overlay controls as the regular video player,
// and the overlay views are added at runtime. // and the overlay views are added at runtime.
// Add a hook to the overlay class, and pass the added views to extension. // Add a hook to the overlay class, and pass the added views to extension.
// Problem is fixed in 19.21+
// //
// NOTE: Modern 2 uses the same video UI as the regular player except resized to smaller. // NOTE: Modern 2 uses the same video UI as the regular player except resized to smaller.
// This patch code could be used to hide other player overlays that do not use Litho. // This patch code could be used to hide other player overlays that do not use Litho.
playerOverlaysLayoutFingerprint.classDef.methods.add( if (!is_19_17_or_greater) {
ImmutableMethod( playerOverlaysLayoutFingerprint.classDef.methods.add(
YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, ImmutableMethod(
"addView", YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME,
listOf( "addView",
ImmutableMethodParameter("Landroid/view/View;", null, null), listOf(
ImmutableMethodParameter("I", null, null), ImmutableMethodParameter("Landroid/view/View;", null, null),
ImmutableMethodParameter("Landroid/view/ViewGroup\$LayoutParams;", null, null), ImmutableMethodParameter("I", null, null),
), ImmutableMethodParameter(
"V", "Landroid/view/ViewGroup\$LayoutParams;",
AccessFlags.PUBLIC.value, null,
null, null
null, ),
MutableMethodImplementation(4), ),
).toMutable().apply { "V",
addInstructions( AccessFlags.PUBLIC.value,
""" null,
invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V null,
invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V MutableMethodImplementation(4),
return-void ).toMutable().apply {
""" addInstructions(
) """
} invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V
) invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V
return-void
"""
)
}
)
}
// endregion // endregion
} }

View File

@@ -25,9 +25,8 @@ val playerPopupPanelsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -16,9 +16,8 @@ val playerControlsBackgroundPatch = resourcePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -25,9 +25,8 @@ internal val exitFullscreenPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -27,6 +27,7 @@ val openVideosFullscreenPatch = bytecodePatch(
"com.google.android.youtube"( "com.google.android.youtube"(
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -56,9 +56,8 @@ val customPlayerOverlayOpacityPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -12,6 +12,7 @@ import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter
import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.addSettingPreference import app.revanced.patches.youtube.misc.settings.addSettingPreference
import app.revanced.patches.youtube.misc.settings.newIntent import app.revanced.patches.youtube.misc.settings.newIntent
@@ -56,9 +57,8 @@ val returnYouTubeDislikePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -121,7 +121,7 @@ val returnYouTubeDislikePatch = bytecodePatch(
val tempRegister: Int val tempRegister: Int
val charSequenceRegister: Int val charSequenceRegister: Int
if (is_19_33_or_greater) { if (is_19_33_or_greater && !is_20_10_or_greater) {
insertIndex = indexOfFirstInstructionOrThrow { insertIndex = indexOfFirstInstructionOrThrow {
(opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE)
&& getReference<MethodReference>()?.returnType == textDataClassType && getReference<MethodReference>()?.returnType == textDataClassType

View File

@@ -33,9 +33,8 @@ val wideSearchbarPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -37,12 +37,25 @@ internal val shortsSeekbarColorFingerprint = fingerprint {
literal { reelTimeBarPlayedColorId } literal { reelTimeBarPlayedColorId }
} }
internal val playerSeekbarHandleColorFingerprint = fingerprint { internal val playerSeekbarHandle1ColorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("Landroid/content/Context;") parameters("Landroid/content/Context;")
literal { ytStaticBrandRedId } custom { method, _ ->
method.containsLiteralInstruction(ytTextSecondaryId) &&
method.containsLiteralInstruction(ytStaticBrandRedId)
}
} }
internal val playerSeekbarHandle2ColorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
parameters("Landroid/content/Context;")
custom { method, _ ->
method.containsLiteralInstruction(inlineTimeBarLiveSeekableRangeId) &&
method.containsLiteralInstruction(ytStaticBrandRedId)
}
}
internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("V") returns("V")

View File

@@ -53,6 +53,10 @@ internal var ytYoutubeMagentaColorId = -1L
private set private set
internal var ytStaticBrandRedId = -1L internal var ytStaticBrandRedId = -1L
private set private set
internal var ytTextSecondaryId = -1L
private set
internal var inlineTimeBarLiveSeekableRangeId = -1L
private set
internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color"
@@ -76,6 +80,18 @@ private val seekbarColorResourcePatch = resourcePatch {
"color", "color",
"inline_time_bar_played_not_highlighted_color", "inline_time_bar_played_not_highlighted_color",
] ]
ytStaticBrandRedId = resourceMappings[
"attr",
"ytStaticBrandRed"
]
ytTextSecondaryId = resourceMappings[
"attr",
"ytTextSecondary"
]
inlineTimeBarLiveSeekableRangeId = resourceMappings[
"color",
"inline_time_bar_live_seekable_range"
]
// Modify the resume playback drawable and replace the progress bar with a custom drawable. // Modify the resume playback drawable and replace the progress bar with a custom drawable.
document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> document("res/drawable/resume_playback_progressbar_drawable.xml").use { document ->
@@ -211,7 +227,7 @@ val seekbarColorPatch = bytecodePatch(
) )
execute { execute {
fun MutableMethod.addColorChangeInstructions(resourceId: Long, methodName: String) { fun MutableMethod.addColorChangeInstructions(resourceId: Long) {
val index = indexOfFirstLiteralInstructionOrThrow(resourceId) val index = indexOfFirstLiteralInstructionOrThrow(resourceId)
val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT) val insertIndex = indexOfFirstInstructionOrThrow(index, Opcode.MOVE_RESULT)
val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA val register = getInstruction<OneRegisterInstruction>(insertIndex).registerA
@@ -219,19 +235,19 @@ val seekbarColorPatch = bytecodePatch(
addInstructions( addInstructions(
insertIndex + 1, insertIndex + 1,
""" """
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(I)I invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I
move-result v$register move-result v$register
""" """
) )
} }
playerSeekbarColorFingerprint.method.apply { playerSeekbarColorFingerprint.method.apply {
addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId, "getVideoPlayerSeekbarColor") addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId)
addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId, "getVideoPlayerSeekbarColor") addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId)
} }
shortsSeekbarColorFingerprint.method.apply { shortsSeekbarColorFingerprint.method.apply {
addColorChangeInstructions(reelTimeBarPlayedColorId, "getVideoPlayerSeekbarColor") addColorChangeInstructions(reelTimeBarPlayedColorId)
} }
setSeekbarClickedColorFingerprint.originalMethod.let { setSeekbarClickedColorFingerprint.originalMethod.let {
@@ -257,8 +273,11 @@ val seekbarColorPatch = bytecodePatch(
// 19.25+ changes // 19.25+ changes
playerSeekbarHandleColorFingerprint.method.apply { arrayOf(
addColorChangeInstructions(ytStaticBrandRedId, "getVideoPlayerSeekbarColor") playerSeekbarHandle1ColorFingerprint,
playerSeekbarHandle2ColorFingerprint
).forEach {
it.method.addColorChangeInstructions(ytStaticBrandRedId)
} }
// If hiding feed seekbar thumbnails, then turn off the cairo gradient // If hiding feed seekbar thumbnails, then turn off the cairo gradient

View File

@@ -37,9 +37,8 @@ val shortsAutoplayPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -16,9 +16,9 @@ import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint
import app.revanced.util.findFreeRegister
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -45,9 +45,8 @@ val openShortsInRegularPlayerPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -107,11 +106,12 @@ val openShortsInRegularPlayerPatch = bytecodePatch(
getReference<MethodReference>()?.returnType == getReference<MethodReference>()?.returnType ==
"Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;"
} }
val freeRegister = getInstruction<FiveRegisterInstruction>(index).registerC
val playbackStartRegister = getInstruction<OneRegisterInstruction>(index + 1).registerA val playbackStartRegister = getInstruction<OneRegisterInstruction>(index + 1).registerA
val insertIndex = index + 2
val freeRegister = findFreeRegister(insertIndex, playbackStartRegister)
addInstructionsWithLabels( addInstructionsWithLabels(
index + 2, insertIndex,
extensionInstructions(playbackStartRegister, freeRegister) extensionInstructions(playbackStartRegister, freeRegister)
) )
} }

View File

@@ -110,9 +110,8 @@ val sponsorBlockPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -62,9 +62,8 @@ val spoofAppVersionPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -33,9 +33,8 @@ val changeStartPagePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -7,11 +7,14 @@ import app.revanced.patches.all.misc.resources.addResources
import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.all.misc.resources.addResourcesPatch
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.addInstructionsAtControlFlowLabel
import app.revanced.util.findFreeRegister
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -38,6 +41,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -48,25 +52,47 @@ val disableResumingShortsOnStartupPatch = bytecodePatch(
SwitchPreference("revanced_disable_resuming_shorts_player"), SwitchPreference("revanced_disable_resuming_shorts_player"),
) )
userWasInShortsFingerprint.method.apply { if (is_20_02_or_greater) {
val listenableInstructionIndex = indexOfFirstInstructionOrThrow { userWasInShortsAlternativeFingerprint.let {
opcode == Opcode.INVOKE_INTERFACE && it.method.apply {
getReference<MethodReference>()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && val stringIndex = it.stringMatches!!.first().index
getReference<MethodReference>()?.name == "isDone" val booleanValueIndex = indexOfFirstInstructionReversedOrThrow(stringIndex) {
} opcode == Opcode.INVOKE_VIRTUAL &&
val freeRegister = getInstruction<OneRegisterInstruction>(listenableInstructionIndex + 1).registerA getReference<MethodReference>()?.name == "booleanValue"
}
val booleanValueRegister =
getInstruction<OneRegisterInstruction>(booleanValueIndex + 1).registerA
addInstructionsAtControlFlowLabel( addInstructions(
listenableInstructionIndex, booleanValueIndex + 2, """
""" invoke-static {v$booleanValueRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z
invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z move-result v$booleanValueRegister
move-result v$freeRegister """
if-eqz v$freeRegister, :show_startup_shorts_player )
return-void }
:show_startup_shorts_player }
nop } else {
""", userWasInShortsLegacyFingerprint.method.apply {
) val listenableInstructionIndex = indexOfFirstInstructionOrThrow {
val reference = getReference<MethodReference>()
opcode == Opcode.INVOKE_INTERFACE &&
reference?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" &&
reference.name == "isDone"
}
val freeRegister = findFreeRegister(listenableInstructionIndex)
addInstructionsAtControlFlowLabel(
listenableInstructionIndex,
"""
invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z
move-result v$freeRegister
if-eqz v$freeRegister, :show
return-void
:show
nop
"""
)
}
} }
userWasInShortsConfigFingerprint.method.addInstructions( userWasInShortsConfigFingerprint.method.addInstructions(

View File

@@ -4,7 +4,17 @@ import app.revanced.patcher.fingerprint
import app.revanced.util.literal import app.revanced.util.literal
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
internal val userWasInShortsFingerprint = fingerprint { /**
* YouTube 20.02.08 ~
*/
internal val userWasInShortsAlternativeFingerprint = fingerprint {
returns("V")
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("Ljava/lang/Object;")
strings("userIsInShorts: ")
}
internal val userWasInShortsLegacyFingerprint = fingerprint {
returns("V") returns("V")
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
parameters("Ljava/lang/Object;") parameters("Ljava/lang/Object;")

View File

@@ -221,9 +221,8 @@ val themePatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -37,9 +37,8 @@ val alternativeThumbnailsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -31,9 +31,8 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -27,9 +27,8 @@ val announcementsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val autoRepeatPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -52,9 +52,8 @@ val backgroundPlaybackPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -38,9 +38,8 @@ val enableDebuggingPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -28,9 +28,8 @@ val spoofDeviceDimensionsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -25,9 +25,8 @@ val checkWatchHistoryDomainNameResolutionPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -8,6 +8,7 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.util.findFreeRegister
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
@@ -42,13 +43,14 @@ val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch{
} }
playbackSpeedInFeedsFingerprint.method.apply { playbackSpeedInFeedsFingerprint.method.apply {
val freeRegister = implementation!!.registerCount - parameters.size - 2
val playbackSpeedIndex = indexOfGetPlaybackSpeedInstruction(this) val playbackSpeedIndex = indexOfGetPlaybackSpeedInstruction(this)
val playbackSpeedRegister = getInstruction<TwoRegisterInstruction>(playbackSpeedIndex).registerA val playbackSpeedRegister = getInstruction<TwoRegisterInstruction>(playbackSpeedIndex).registerA
val returnIndex = indexOfFirstInstructionOrThrow(playbackSpeedIndex, Opcode.RETURN_VOID) val returnIndex = indexOfFirstInstructionOrThrow(playbackSpeedIndex, Opcode.RETURN_VOID)
val insertIndex = playbackSpeedIndex + 1
val freeRegister = findFreeRegister(insertIndex, playbackSpeedRegister)
addInstructionsWithLabels( addInstructionsWithLabels(
playbackSpeedIndex + 1, insertIndex,
""" """
invoke-static { v$playbackSpeedRegister }, $EXTENSION_CLASS_DESCRIPTOR->playbackSpeedChanged(F)Z invoke-static { v$playbackSpeedRegister }, $EXTENSION_CLASS_DESCRIPTOR->playbackSpeedChanged(F)Z
move-result v$freeRegister move-result v$freeRegister

View File

@@ -39,9 +39,8 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
} }

View File

@@ -13,9 +13,11 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstruction import app.revanced.util.indexOfFirstInstruction
import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import com.android.tools.smali.dexlib2.iface.reference.TypeReference
val bypassURLRedirectsPatch = bytecodePatch( val bypassURLRedirectsPatch = bytecodePatch(
name = "Bypass URL redirects", name = "Bypass URL redirects",
@@ -37,6 +39,7 @@ val bypassURLRedirectsPatch = bytecodePatch(
"19.45.38", "19.45.38",
"19.46.42", "19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -80,3 +83,8 @@ internal fun Method.findUriParseIndex() = indexOfFirstInstruction {
val reference = getReference<MethodReference>() val reference = getReference<MethodReference>()
reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse" reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse"
} }
internal fun Method.findWebViewCheckCastIndex() = indexOfFirstInstruction {
val reference = getReference<TypeReference>()
opcode == Opcode.CHECK_CAST && reference?.type?.endsWith("/WebviewEndpointOuterClass${'$'}WebviewEndpoint;") == true
}

View File

@@ -11,12 +11,21 @@ internal val abUriParserFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("Ljava/lang/Object") returns("Ljava/lang/Object")
parameters("Ljava/lang/Object") parameters("Ljava/lang/Object")
strings(
"Found entityKey=`",
"` that does not contain a PlaylistVideoEntityId message as it's identifier.",
)
custom { method, _ -> custom { method, _ ->
method.findUriParseIndex() >= 0 method.findUriParseIndex() >= 0 && method.findWebViewCheckCastIndex() >= 0
}
}
/**
* Target 19.33+
*/
internal val httpUriParserFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Landroid/net/Uri")
parameters("Ljava/lang/String")
strings("https", "://", "https:")
custom { methodDef, _ ->
methodDef.findUriParseIndex() >= 0
} }
} }
@@ -47,19 +56,6 @@ internal val abUriParserLegacyFingerprint = fingerprint {
} }
} }
/**
* Target 19.33+
*/
internal val httpUriParserFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Landroid/net/Uri")
parameters("Ljava/lang/String")
strings("https", "https:", "://")
custom { methodDef, _ ->
methodDef.findUriParseIndex() >= 0
}
}
internal val httpUriParserLegacyFingerprint = fingerprint { internal val httpUriParserLegacyFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("Landroid/net/Uri") returns("Landroid/net/Uri")

View File

@@ -45,9 +45,8 @@ val openLinksExternallyPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -10,7 +10,11 @@ import com.android.tools.smali.dexlib2.Opcode
* In 19.18+ this resolves to a different method. * In 19.18+ this resolves to a different method.
*/ */
internal val componentContextParserFingerprint = fingerprint { internal val componentContextParserFingerprint = fingerprint {
strings("Component was not found %s because it was removed due to duplicate converter bindings.") strings(
"TreeNode result must be set.",
// String is a partial match and changed slightly in 20.03+
"it was removed due to duplicate converter bindings."
)
} }
internal val lithoFilterFingerprint = fingerprint { internal val lithoFilterFingerprint = fingerprint {

View File

@@ -8,19 +8,21 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.patch.PatchException
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_18_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_18_or_greater
import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_05_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.util.findFreeRegister
import app.revanced.util.getReference import app.revanced.util.getReference
import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionOrThrow
import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.iface.instruction.* import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.FieldReference
import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference
@@ -190,17 +192,7 @@ val lithoFilterPatch = bytecodePatch(
}, },
).registerA ).registerA
// Find a free temporary register. val freeRegister = findFreeRegister(insertHookIndex, identifierRegister, stringBuilderRegister)
val freeRegister = getInstruction<OneRegisterInstruction>(
// Immediately before is a StringBuilder append constant character.
indexOfFirstInstructionReversedOrThrow(insertHookIndex, Opcode.CONST_16),
).registerA
// Verify the temp register will not clobber the method result register.
if (stringBuilderRegister == freeRegister) {
throw PatchException("Free register will clobber StringBuilder register")
}
val invokeFilterInstructions = """ val invokeFilterInstructions = """
invoke-static { v$identifierRegister, v$stringBuilderRegister }, $EXTENSION_CLASS_DESCRIPTOR->filter(Ljava/lang/String;Ljava/lang/StringBuilder;)Z invoke-static { v$identifierRegister, v$stringBuilderRegister }, $EXTENSION_CLASS_DESCRIPTOR->filter(Ljava/lang/String;Ljava/lang/StringBuilder;)Z
move-result v$freeRegister move-result v$freeRegister
@@ -235,7 +227,10 @@ val lithoFilterPatch = bytecodePatch(
// Turn off native code that handles litho component names. If this feature is on then nearly // Turn off native code that handles litho component names. If this feature is on then nearly
// all litho components have a null name and identifier/path filtering is completely broken. // all litho components have a null name and identifier/path filtering is completely broken.
if (is_19_25_or_greater) { //
// Flag was removed in 20.05. It appears a new flag might be used instead (45660109L),
// but if the flag is forced on then litho filtering still works correctly.
if (is_19_25_or_greater && !is_20_05_or_greater) {
lithoComponentNameUpbFeatureFlagFingerprint.method.apply { lithoComponentNameUpbFeatureFlagFingerprint.method.apply {
// Don't use return early, so the debug patch logs if this was originally on. // Don't use return early, so the debug patch logs if this was originally on.
val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN) val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN)

View File

@@ -46,6 +46,18 @@ var is_19_47_or_greater = false
private set private set
var is_19_49_or_greater = false var is_19_49_or_greater = false
private set private set
var is_20_02_or_greater = false
private set
var is_20_03_or_greater = false
private set
var is_20_05_or_greater = false
private set
var is_20_07_or_greater = false
private set
var is_20_09_or_greater = false
private set
var is_20_10_or_greater = false
private set
val versionCheckPatch = resourcePatch( val versionCheckPatch = resourcePatch(
description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.",
@@ -80,5 +92,11 @@ val versionCheckPatch = resourcePatch(
is_19_46_or_greater = 244705000 <= playStoreServicesVersion is_19_46_or_greater = 244705000 <= playStoreServicesVersion
is_19_47_or_greater = 244799000 <= playStoreServicesVersion is_19_47_or_greater = 244799000 <= playStoreServicesVersion
is_19_49_or_greater = 245005000 <= playStoreServicesVersion is_19_49_or_greater = 245005000 <= playStoreServicesVersion
is_20_02_or_greater = 250299000 <= playStoreServicesVersion
is_20_03_or_greater = 250405000 <= playStoreServicesVersion
is_20_05_or_greater = 250605000 <= playStoreServicesVersion
is_20_07_or_greater = 250805000 <= playStoreServicesVersion
is_20_09_or_greater = 251006000 <= playStoreServicesVersion
is_20_10_or_greater = 251105000 <= playStoreServicesVersion
} }
} }

View File

@@ -34,9 +34,8 @@ val removeTrackingQueryParameterPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -7,6 +7,8 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch
import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_03_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.PreferenceScreen
import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.settings.settingsPatch
@@ -18,9 +20,8 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )
@@ -31,6 +32,10 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch({
) )
}, { }, {
is_19_34_or_greater is_19_34_or_greater
}, {
is_20_10_or_greater
}, {
is_20_03_or_greater
}, { }, {
addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch") addResources("youtube", "misc.fix.playback.spoofVideoStreamsPatch")

View File

@@ -25,9 +25,8 @@ val zoomHapticsPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -45,9 +45,8 @@ val forceOriginalAudioPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -32,9 +32,8 @@ val disableHdrPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
), ),
) )

View File

@@ -2,11 +2,65 @@ package app.revanced.patches.youtube.video.playerresponse
import app.revanced.patcher.fingerprint import app.revanced.patcher.fingerprint
import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.AccessFlags
import org.stringtemplate.v4.compiler.Bytecode.instructions
/** /**
* For targets 19.25 and later. * For targets 20.10 and later.
*/ */
internal val playerParameterBuilderFingerprint = fingerprint { internal val playerParameterBuilderFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("L")
parameters(
"Ljava/lang/String;", // VideoId.
"[B",
"Ljava/lang/String;", // Player parameters proto buffer.
"Ljava/lang/String;",
"I",
"Z",
"I",
"L",
"Ljava/util/Set;",
"Ljava/lang/String;",
"Ljava/lang/String;",
"L",
"Z", // Appears to indicate if the video id is being opened or is currently playing.
"Z",
"Z",
"Z"
)
strings("psps")
}
/**
* For targets 20.02 to 20.09.
*/
internal val playerParameterBuilder2002Fingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("L")
parameters(
"Ljava/lang/String;", // VideoId.
"[B",
"Ljava/lang/String;", // Player parameters proto buffer.
"Ljava/lang/String;",
"I",
"I",
"L", // 19.25+ parameter
"Ljava/util/Set;",
"Ljava/lang/String;",
"Ljava/lang/String;",
"L",
"Z", // Appears to indicate if the video id is being opened or is currently playing.
"Z",
"Z",
"Z",
)
strings("psps")
}
/**
* For targets 19.25 to 19.50.
*/
internal val playerParameterBuilder1925Fingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
returns("L") returns("L")
parameters( parameters(

View File

@@ -1,11 +1,14 @@
package app.revanced.patches.youtube.video.playerresponse package app.revanced.patches.youtube.video.playerresponse
import app.revanced.patcher.Fingerprint
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.bytecodePatch
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater
import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater
import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.playservice.versionCheckPatch
private val hooks = mutableSetOf<Hook>() private val hooks = mutableSetOf<Hook>()
@@ -35,15 +38,21 @@ val playerResponseMethodHookPatch = bytecodePatch {
) )
execute { execute {
playerResponseMethod = if (is_19_23_or_greater) { val fingerprint : Fingerprint
if (is_20_10_or_greater) {
parameterIsShortAndOpeningOrPlaying = 13
fingerprint = playerParameterBuilderFingerprint
} else if (is_20_02_or_greater) {
parameterIsShortAndOpeningOrPlaying = 12 parameterIsShortAndOpeningOrPlaying = 12
fingerprint = playerParameterBuilder2002Fingerprint
playerParameterBuilderFingerprint } else if (is_19_23_or_greater) {
parameterIsShortAndOpeningOrPlaying = 12
fingerprint = playerParameterBuilder1925Fingerprint
} else { } else {
parameterIsShortAndOpeningOrPlaying = 11 parameterIsShortAndOpeningOrPlaying = 11
fingerprint = playerParameterBuilderLegacyFingerprint
playerParameterBuilderLegacyFingerprint }
}.method playerResponseMethod = fingerprint.method
// On some app targets the method has too many registers pushing the parameters past v15. // On some app targets the method has too many registers pushing the parameters past v15.
// If needed, move the parameters to 4-bit registers, so they can be passed to the extension. // If needed, move the parameters to 4-bit registers, so they can be passed to the extension.

View File

@@ -27,9 +27,8 @@ val videoQualityPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -32,9 +32,8 @@ val playbackSpeedPatch = bytecodePatch(
"19.25.37", "19.25.37",
"19.34.42", "19.34.42",
"19.43.41", "19.43.41",
"19.45.38",
"19.46.42",
"19.47.53", "19.47.53",
"20.07.39",
) )
) )

View File

@@ -22,14 +22,6 @@ internal val speedArrayGeneratorFingerprint = fingerprint {
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
returns("[L") returns("[L")
parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;")
opcodes(
Opcode.IF_NEZ,
Opcode.SGET_OBJECT,
Opcode.GOTO_16,
Opcode.INVOKE_INTERFACE,
Opcode.MOVE_RESULT_OBJECT,
Opcode.IGET_OBJECT,
)
strings("0.0#") strings("0.0#")
} }

View File

@@ -15,13 +15,135 @@ import app.revanced.patches.shared.misc.mapping.get
import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch
import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.mapping.resourceMappings
import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode
import com.android.tools.smali.dexlib2.Opcode.*
import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.Method
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.Instruction import com.android.tools.smali.dexlib2.iface.instruction.Instruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
import com.android.tools.smali.dexlib2.iface.instruction.RegisterRangeInstruction
import com.android.tools.smali.dexlib2.iface.instruction.ThreeRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction
import com.android.tools.smali.dexlib2.iface.reference.Reference import com.android.tools.smali.dexlib2.iface.reference.Reference
import com.android.tools.smali.dexlib2.util.MethodUtil import com.android.tools.smali.dexlib2.util.MethodUtil
import java.util.EnumSet
/**
* Starting from and including the instruction at index [startIndex],
* finds the next register that is wrote to and not read from. If a return instruction
* is encountered, then the lowest unused register is returned.
*
* This method can return a non 4-bit register, and the calling code may need to temporarily
* swap register contents if a 4-bit register is required.
*
* @param startIndex Inclusive starting index.
* @param registersToExclude Registers to exclude, and consider as used. For most use cases,
* all registers used in injected code should be specified.
* @throws IllegalArgumentException If a branch or conditional statement is encountered
* before a suitable register is found.
*/
internal fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): Int {
if (implementation == null) {
throw IllegalArgumentException("Method has no implementation: $this")
}
if (startIndex < 0 || startIndex >= instructions.count()) {
throw IllegalArgumentException("startIndex out of bounds: $startIndex")
}
// All registers used by an instruction.
fun Instruction.getRegistersUsed() = when (this) {
is FiveRegisterInstruction -> listOf(registerC, registerD, registerE, registerF, registerG)
is ThreeRegisterInstruction -> listOf(registerA, registerB, registerC)
is TwoRegisterInstruction -> listOf(registerA, registerB)
is OneRegisterInstruction -> listOf(registerA)
is RegisterRangeInstruction -> (startRegister until (startRegister + registerCount)).toList()
else -> emptyList()
}
// Register that is written to by an instruction.
fun Instruction.getRegisterWritten() = when (this) {
is ThreeRegisterInstruction -> registerA
is TwoRegisterInstruction -> registerA
is OneRegisterInstruction -> registerA
else -> throw IllegalStateException("Not a write instruction: $this")
}
val writeOpcodes = EnumSet.of(
NEW_INSTANCE, NEW_ARRAY,
MOVE, MOVE_FROM16, MOVE_16, MOVE_WIDE, MOVE_WIDE_FROM16, MOVE_WIDE_16, MOVE_OBJECT,
MOVE_OBJECT_FROM16, MOVE_OBJECT_16, MOVE_RESULT, MOVE_RESULT_WIDE, MOVE_RESULT_OBJECT, MOVE_EXCEPTION,
IGET, IGET_WIDE, IGET_OBJECT, IGET_BOOLEAN, IGET_BYTE, IGET_CHAR, IGET_SHORT,
SGET, SGET_WIDE, SGET_OBJECT, SGET_BOOLEAN, SGET_BYTE, SGET_CHAR, SGET_SHORT,
)
val branchOpcodes = EnumSet.of(
GOTO, GOTO_16, GOTO_32,
IF_EQ, IF_NE, IF_LT, IF_GE, IF_GT, IF_LE,
IF_EQZ, IF_NEZ, IF_LTZ, IF_GEZ, IF_GTZ, IF_LEZ,
)
val returnOpcodes = EnumSet.of(
RETURN_VOID, RETURN, RETURN_WIDE, RETURN_OBJECT,
)
// Highest 4-bit register available, exclusive. Ideally return a free register less than this.
val maxRegister4Bits = 16
var bestFreeRegisterFound: Int? = null
val usedRegisters = registersToExclude.toMutableSet()
for (i in startIndex until instructions.count()) {
val instruction = getInstruction(i)
if (instruction.opcode in returnOpcodes) {
// Method returns. Use lowest register that hasn't been encountered.
val freeRegister = (0 until implementation!!.registerCount).find {
it !in usedRegisters
}
if (freeRegister != null) {
return freeRegister
}
if (bestFreeRegisterFound != null) {
return bestFreeRegisterFound;
}
// Somehow every method register was read from before any register was wrote to.
// In practice this never occurs.
throw IllegalArgumentException("Could not find a free register from startIndex: " +
"$startIndex excluding: $registersToExclude")
}
if (instruction.opcode in branchOpcodes) {
if (bestFreeRegisterFound != null) {
return bestFreeRegisterFound;
}
// This method is simple and does not follow branching.
throw IllegalArgumentException("Encountered a branch statement before a free register could be found")
}
if (instruction.opcode in writeOpcodes) {
val freeRegister = instruction.getRegisterWritten()
if (freeRegister !in usedRegisters) {
if (freeRegister < maxRegister4Bits) {
// Found an ideal register.
return freeRegister
}
// Continue searching for a 4-bit register if available.
if (bestFreeRegisterFound == null || freeRegister < bestFreeRegisterFound) {
bestFreeRegisterFound = freeRegister
}
}
}
usedRegisters.addAll(instruction.getRegistersUsed())
}
// Cannot be reached since a branch or return statement will
// be encountered before the end of the method.
throw IllegalStateException()
}
/** /**
* Find the [MutableMethod] from a given [Method] in a [MutableClass]. * Find the [MutableMethod] from a given [Method] in a [MutableClass].
@@ -395,7 +517,7 @@ fun Method.findInstructionIndicesReversedOrThrow(opcode: Opcode): List<Int> {
internal fun MutableMethod.insertFeatureFlagBooleanOverride(literal: Long, extensionsMethod: String) { internal fun MutableMethod.insertFeatureFlagBooleanOverride(literal: Long, extensionsMethod: String) {
val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal)
val index = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT) val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT)
val register = getInstruction<OneRegisterInstruction>(index).registerA val register = getInstruction<OneRegisterInstruction>(index).registerA
val operation = if (register < 16) { val operation = if (register < 16) {
@@ -423,7 +545,7 @@ fun BytecodePatchContext.forEachLiteralValueInstruction(
classes.forEach { classDef -> classes.forEach { classDef ->
classDef.methods.forEach { method -> classDef.methods.forEach { method ->
method.implementation?.instructions?.forEachIndexed { index, instruction -> method.implementation?.instructions?.forEachIndexed { index, instruction ->
if (instruction.opcode == Opcode.CONST && if (instruction.opcode == CONST &&
(instruction as WideLiteralInstruction).wideLiteral == literal (instruction as WideLiteralInstruction).wideLiteral == literal
) { ) {
val mutableMethod = proxy(classDef).mutableClass.findMutableMethodOf(method) val mutableMethod = proxy(classDef).mutableClass.findMutableMethodOf(method)

View File

@@ -22,7 +22,7 @@ Second \"item\" text"</string>
<resources> <resources>
<app id="shared"> <app id="shared">
<patch id="misc.checks.checkEnvironmentPatch"> <patch id="misc.checks.checkEnvironmentPatch">
<string name="revanced_check_environment_failed_title">ŲØ´Ų„ØĒ ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĒØ­Ų‚Ų‚</string> <string name="revanced_check_environment_failed_title">ŲØ´Ų„ØĒ Ø§Ų„ŲØ­ŲˆØĩاØĒ</string>
<string name="revanced_check_environment_dialog_open_official_source_button">؁ØĒØ­ Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØąØŗŲ…ŲŠ</string> <string name="revanced_check_environment_dialog_open_official_source_button">؁ØĒØ­ Ø§Ų„Ų…ŲˆŲ‚Øš Ø§Ų„ØąØŗŲ…ŲŠ</string>
<string name="revanced_check_environment_dialog_ignore_button">ØĒØŦØ§Ų‡Ų„</string> <string name="revanced_check_environment_dialog_ignore_button">ØĒØŦØ§Ų‡Ų„</string>
<string name="revanced_check_environment_failed_message">&lt;h5&gt;Ų„Ø§ ŲŠØ¨Ø¯Ųˆ ØŖŲ† Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ų‚Ø¯ ØĒŲ… ØĒØšØ¯ŲŠŲ„Ų‡ Ų…Ų† Ų‚Ø¨Ų„Ųƒ.&lt;/h5&gt;&lt;br&gt;Ų‚Ø¯ Ų„Ø§ ŲŠØšŲ…Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ø¨Ø´ŲƒŲ„ ØĩØ­ŲŠØ­ØŒ &lt;b&gt;Ų‚Ø¯ ŲŠŲƒŲˆŲ† ØļØ§ØąŲ‹Ø§ ØŖŲˆ Ø­ØĒŲ‰ ØŽØˇŲŠØąŲ‹Ø§ Ų„Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…&lt;/b&gt;.&lt;br&gt;&lt;br&gt;ØĒØ´ŲŠØą Ų‡Ø°Ų‡ Ø§Ų„ŲØ­ŲˆØĩاØĒ ØĨŲ„Ų‰ ØŖŲ† Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ ØĒŲ… ØĒØšØ¯ŲŠŲ„Ų‡ Ų…ØŗØ¨Ų‚Ų‹Ø§ ØŖŲˆ ØĒŲ… Ø§Ų„Ø­ØĩŲˆŲ„ ØšŲ„ŲŠŲ‡ Ų…Ų† Ø´ØŽØĩ ØĸØŽØą:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;؊؈ØĩŲ‰ بشد؊ Ø¨Ų€ &lt;b&gt;ØĨŲ„ØēØ§ØĄ ØĒØĢØ¨ŲŠØĒ Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ ؈ØĒØšØ¯ŲŠŲ„Ų‡ Ø¨Ų†ŲØŗŲƒ&lt;/b&gt; Ų„Ų„ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØŗØĒØŽØ¯Ų… ØĒØˇØ¨ŲŠŲ‚Ų‹Ø§ Ų…ØšØĒŲ…Ø¯Ų‹Ø§ ؈ØĸŲ…Ų†Ų‹Ø§.&lt;p&gt;&lt;br&gt;؁؊ Ø­Ø§Ų„ØŠ ØĒØŦØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĒØ­Ø°ŲŠØąØŒ ØŗŲŠØĒŲ… ØšØąØļŲ‡ Ų…ØąØĒŲŠŲ† ŲŲ‚Øˇ.</string> <string name="revanced_check_environment_failed_message">&lt;h5&gt;Ų„Ø§ ŲŠØ¨Ø¯Ųˆ ØŖŲ† Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ų‚Ø¯ ØĒŲ… ØĒØšØ¯ŲŠŲ„Ų‡ Ų…Ų† Ų‚Ø¨Ų„Ųƒ.&lt;/h5&gt;&lt;br&gt;Ų‚Ø¯ Ų„Ø§ ŲŠØšŲ…Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ Ø¨Ø´ŲƒŲ„ ØĩØ­ŲŠØ­ØŒ &lt;b&gt;Ų‚Ø¯ ŲŠŲƒŲˆŲ† ØļØ§ØąŲ‹Ø§ ØŖŲˆ Ø­ØĒŲ‰ ØŽØˇŲŠØąŲ‹Ø§ Ų„Ų„Ø§ØŗØĒØŽØ¯Ø§Ų…&lt;/b&gt;.&lt;br&gt;&lt;br&gt;ØĒØ´ŲŠØą Ų‡Ø°Ų‡ Ø§Ų„ŲØ­ŲˆØĩاØĒ ØĨŲ„Ų‰ ØŖŲ† Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ ØĒŲ… ØĒØšØ¯ŲŠŲ„Ų‡ Ų…ØŗØ¨Ų‚Ų‹Ø§ ØŖŲˆ ØĒŲ… Ø§Ų„Ø­ØĩŲˆŲ„ ØšŲ„ŲŠŲ‡ Ų…Ų† Ø´ØŽØĩ ØĸØŽØą:&lt;br&gt;&lt;br&gt;&lt;small&gt;%1$s&lt;/small&gt;&lt;br&gt;؊؈ØĩŲ‰ بشد؊ Ø¨Ų€ &lt;b&gt;ØĨŲ„ØēØ§ØĄ ØĒØĢØ¨ŲŠØĒ Ų‡Ø°Ø§ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚ ؈ØĒØšØ¯ŲŠŲ„Ų‡ Ø¨Ų†ŲØŗŲƒ&lt;/b&gt; Ų„Ų„ØĒØŖŲƒØ¯ Ų…Ų† ØŖŲ†Ųƒ ØĒØŗØĒØŽØ¯Ų… ØĒØˇØ¨ŲŠŲ‚Ų‹Ø§ Ų…ØšØĒŲ…Ø¯Ų‹Ø§ ؈ØĸŲ…Ų†Ų‹Ø§.&lt;p&gt;&lt;br&gt;؁؊ Ø­Ø§Ų„ØŠ ØĒØŦØ§Ų‡Ų„ Ų‡Ø°Ø§ Ø§Ų„ØĒØ­Ø°ŲŠØąØŒ ØŗŲŠØĒŲ… ØšØąØļŲ‡ Ų…ØąØĒŲŠŲ† ŲŲ‚Øˇ.</string>
@@ -30,13 +30,13 @@ Second \"item\" text"</string>
<string name="revanced_check_environment_manager_not_expected_installer">Ų„Ų… ؊ØĒŲ… ØĒØĢØ¨ŲŠØĒŲ‡ Ø¨ŲˆØ§ØŗØˇØŠ ReVanced Manager</string> <string name="revanced_check_environment_manager_not_expected_installer">Ų„Ų… ؊ØĒŲ… ØĒØĢØ¨ŲŠØĒŲ‡ Ø¨ŲˆØ§ØŗØˇØŠ ReVanced Manager</string>
<string name="revanced_check_environment_not_near_patch_time">ØĒŲ… ØĒØšØ¯ŲŠŲ„Ų‡ Ų‚Ø¨Ų„ ØŖŲƒØĢØą Ų…Ų† 10 Ø¯Ų‚Ø§ØĻŲ‚</string> <string name="revanced_check_environment_not_near_patch_time">ØĒŲ… ØĒØšØ¯ŲŠŲ„Ų‡ Ų‚Ø¨Ų„ ØŖŲƒØĢØą Ų…Ų† 10 Ø¯Ų‚Ø§ØĻŲ‚</string>
<string name="revanced_check_environment_not_near_patch_time_days">ØĒŲ… Ø§Ų„ØĒØšØ¯ŲŠŲ„ Ų…Ų†Ø° %s ŲŠŲˆŲ…</string> <string name="revanced_check_environment_not_near_patch_time_days">ØĒŲ… Ø§Ų„ØĒØšØ¯ŲŠŲ„ Ų…Ų†Ø° %s ŲŠŲˆŲ…</string>
<string name="revanced_check_environment_not_near_patch_time_invalid">ØĒØ§ØąŲŠØŽ ØĨŲ†Ø´Ø§ØĄ APK ØĒØ§Ų„Ų</string> <string name="revanced_check_environment_not_near_patch_time_invalid">ØĒØ§ØąŲŠØŽ Ø¨Ų†Ø§ØĄ APK ØĒØ§Ų„Ų</string>
</patch> </patch>
<patch id="misc.settings.settingsResourcePatch"> <patch id="misc.settings.settingsResourcePatch">
<string name="revanced_settings_submenu_title">Ø§Ų„ØĨؚداداØĒ</string> <string name="revanced_settings_submenu_title">Ø§Ų„ØĨؚداداØĒ</string>
<string name="revanced_settings_confirm_user_dialog_title">Ų‡Ų„ ØĒØąØēب ؁؊ Ø§Ų„Ų…ØĒابؚ؊؟</string> <string name="revanced_settings_confirm_user_dialog_title">Ų‡Ų„ ØĒØąØēب ؁؊ Ø§Ų„Ų…ØĒابؚ؊؟</string>
<string name="revanced_settings_reset">ØĨؚاد؊ Ø§Ų„ØĒØšŲŠŲŠŲ†</string> <string name="revanced_settings_reset">ØĨؚاد؊ Ø§Ų„ØĒØšŲŠŲŠŲ†</string>
<string name="revanced_settings_restart_title">ØĒØ­Ø¯ŲŠØĢ ؈ØĨؚاد؊ ØĒØ´ØēŲŠŲ„</string> <string name="revanced_settings_restart_title">ØĒØ­Ø¯ŲŠØĢ ؈ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„</string>
<string name="revanced_settings_restart">ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„</string> <string name="revanced_settings_restart">ØĨؚاد؊ Ø§Ų„ØĒØ´ØēŲŠŲ„</string>
<string name="revanced_settings_import">Ø§ØŗØĒŲŠØąØ§Ø¯</string> <string name="revanced_settings_import">Ø§ØŗØĒŲŠØąØ§Ø¯</string>
<string name="revanced_settings_import_copy">Ų†ØŗØŽ</string> <string name="revanced_settings_import_copy">Ų†ØŗØŽ</string>
@@ -106,9 +106,9 @@ Second \"item\" text"</string>
<string name="revanced_debug_protobuffer_title">ØŗØŦŲ„ Ø¨ØąŲˆØĒŲˆŲƒŲˆŲ„ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ</string> <string name="revanced_debug_protobuffer_title">ØŗØŦŲ„ Ø¨ØąŲˆØĒŲˆŲƒŲˆŲ„ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ</string>
<string name="revanced_debug_protobuffer_summary_on">ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ</string> <string name="revanced_debug_protobuffer_summary_on">ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ</string>
<string name="revanced_debug_protobuffer_summary_off">Ų„Ø§ ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ</string> <string name="revanced_debug_protobuffer_summary_off">Ų„Ø§ ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ Ø§Ų„ØĒØŽØ˛ŲŠŲ† Ø§Ų„Ų…Ø¤Ų‚ØĒ</string>
<string name="revanced_debug_stacktrace_title">ØŗØŦŲ„ ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string> <string name="revanced_debug_stacktrace_title">ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_stacktrace_summary_on">ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗŲØŦؐ؄ ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string> <string name="revanced_debug_stacktrace_summary_on">ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_stacktrace_summary_off">Ų„Ø§ ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗŲØŦؐ؄ ØšŲ…Ų„ŲŠØ§ØĒ Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string> <string name="revanced_debug_stacktrace_summary_off">Ų„Ø§ ØĒØĒØļŲ…Ų† ØŗØŦŲ„Ø§ØĒ Ø§Ų„ØĒØĩØ­ŲŠØ­ ØŗØŦŲ„ ØĒØĒبؚ Ø§Ų„Ų…ŲƒØ¯Øŗ</string>
<string name="revanced_debug_toast_on_error_title">ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØšŲ†Ø¯ ؈ØŦŲˆØ¯ ØŽØˇØŖ ؁؊ ReVanced</string> <string name="revanced_debug_toast_on_error_title">ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØšŲ†Ø¯ ؈ØŦŲˆØ¯ ØŽØˇØŖ ؁؊ ReVanced</string>
<string name="revanced_debug_toast_on_error_summary_on">؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string> <string name="revanced_debug_toast_on_error_summary_on">؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string>
<string name="revanced_debug_toast_on_error_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string> <string name="revanced_debug_toast_on_error_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ؁؊ Ø­Ø§Ų„ØŠ Ø­Ø¯ŲˆØĢ ØŽØˇØŖ</string>
@@ -214,9 +214,9 @@ Second \"item\" text"</string>
<string name="revanced_hide_related_videos_title">ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ ؁؊ Ø§Ų„ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„ØŗØąŲŠØšØŠ</string> <string name="revanced_hide_related_videos_title">ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ ؁؊ Ø§Ų„ØĨØŦØąØ§ØĄØ§ØĒ Ø§Ų„ØŗØąŲŠØšØŠ</string>
<string name="revanced_hide_related_videos_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_related_videos_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_hide_related_videos_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_related_videos_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_hide_image_shelf_title">ØĨØŽŲØ§ØĄ ØąŲŲˆŲ Ø§Ų„ØĩŲˆØą ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_image_shelf_title">ØĨØŽŲØ§ØĄ ØąŲ Ø§Ų„ØĩŲˆØąØŠ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_image_shelf_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØąŲŲˆŲ Ø§Ų„ØĩŲˆØąØŠ</string> <string name="revanced_hide_image_shelf_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØąŲ Ø§Ų„ØĩŲˆØąØŠ</string>
<string name="revanced_hide_image_shelf_summary_off">؊ØĒŲ… ØšØąØļ ØąŲŲˆŲ Ø§Ų„ØĩŲˆØąØŠ</string> <string name="revanced_hide_image_shelf_summary_off">؊ØĒŲ… ØšØąØļ ØąŲ Ø§Ų„ØĩŲˆØąØŠ</string>
<string name="revanced_hide_latest_posts_ads_title">ØĨØŽŲØ§ØĄ ØĸØŽØą Ø§Ų„Ų…Ø´Ø§ØąŲƒØ§ØĒ</string> <string name="revanced_hide_latest_posts_ads_title">ØĨØŽŲØ§ØĄ ØĸØŽØą Ø§Ų„Ų…Ø´Ø§ØąŲƒØ§ØĒ</string>
<string name="revanced_hide_latest_posts_ads_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØŖØ­Ø¯ØĢ Ø§Ų„Ų…Ø´Ø§ØąŲƒØ§ØĒ</string> <string name="revanced_hide_latest_posts_ads_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØŖØ­Ø¯ØĢ Ø§Ų„Ų…Ø´Ø§ØąŲƒØ§ØĒ</string>
<string name="revanced_hide_latest_posts_ads_summary_off">؊ØĒŲ… ØšØąØļ ØŖØ­Ø¯ØĢ Ø§Ų„Ų…Ø´Ø§ØąŲƒØ§ØĒ</string> <string name="revanced_hide_latest_posts_ads_summary_off">؊ØĒŲ… ØšØąØļ ØŖØ­Ø¯ØĢ Ø§Ų„Ų…Ø´Ø§ØąŲƒØ§ØĒ</string>
@@ -226,7 +226,7 @@ Second \"item\" text"</string>
<string name="revanced_hide_artist_cards_title">ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ŲŲ†Ø§Ų†</string> <string name="revanced_hide_artist_cards_title">ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ŲŲ†Ø§Ų†</string>
<string name="revanced_hide_artist_cards_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ŲŲ†Ø§Ų†</string> <string name="revanced_hide_artist_cards_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ŲŲ†Ø§Ų†</string>
<string name="revanced_hide_artist_cards_summary_off">؊ØĒŲ… ØšØąØļ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ŲŲ†Ø§Ų†</string> <string name="revanced_hide_artist_cards_summary_off">؊ØĒŲ… ØšØąØļ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ŲŲ†Ø§Ų†</string>
<string name="revanced_hide_ai_generated_video_summary_section_title">ØĨØŽŲØ§ØĄ \"Ų…Ų„ØŽØĩ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø°ŲŠ ØĒŲ… ØĨŲ†Ø´Ø§Ø¤Ų‡ Ø¨ŲˆØ§ØŗØˇØŠ Ø§Ų„Ø°ŲƒØ§ØĄ Ø§Ų„Ø§ØĩØˇŲ†Ø§ØšŲŠ\"</string> <string name="revanced_hide_ai_generated_video_summary_section_title">ØĨØŽŲØ§ØĄ \'Ų…Ų„ØŽØĩ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø°ŲŠ ØĒŲ… ØĨŲ†Ø´Ø§Ø¤Ų‡ Ø¨ŲˆØ§ØŗØˇØŠ Ø§Ų„Ø°ŲƒØ§ØĄ Ø§Ų„Ø§ØĩØˇŲ†Ø§ØšŲŠ\'</string>
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ų…Ų„ØŽØĩ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_ai_generated_video_summary_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ų…Ų„ØŽØĩ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… Ų…Ų„ØŽØĩ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_ai_generated_video_summary_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… Ų…Ų„ØŽØĩ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_attributes_section_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĩŲØ§ØĒ</string> <string name="revanced_hide_attributes_section_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĩŲØ§ØĒ</string>
@@ -253,31 +253,31 @@ Second \"item\" text"</string>
<string name="revanced_hide_description_components_screen_title">؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_description_components_screen_title">؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_description_components_screen_summary">ØĨØŽŲØ§ØĄ ØŖŲˆ ØšØąØļ Ų…ŲƒŲˆŲ†Ø§ØĒ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_description_components_screen_summary">ØĨØŽŲØ§ØĄ ØŖŲˆ ØšØąØļ Ų…ŲƒŲˆŲ†Ø§ØĒ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_filter_bar_screen_title">Ø´ØąŲŠØˇ Ø§Ų„ØĒØĩŲŲŠØŠ</string> <string name="revanced_hide_filter_bar_screen_title">Ø´ØąŲŠØˇ Ø§Ų„ØĒØĩŲŲŠØŠ</string>
<string name="revanced_hide_filter_bar_screen_summary">ØĨØŽŲØ§ØĄ ØŖŲˆ ØĨØ¸Ų‡Ø§Øą Ø´ØąŲŠØˇ Ø§Ų„ŲŲ„ØĒØą ؁؊ Ø§Ų„ØŽŲ„Ø§ØĩØŠ ŲˆŲ†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ ŲˆŲ…Ų‚Ø§ØˇØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_filter_bar_screen_summary">ØĨØŽŲØ§ØĄ ØŖŲˆ ØšØąØļ Ø´ØąŲŠØˇ Ø§Ų„ŲŲ„ØĒØą ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛ ŲˆŲ†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_hide_filter_bar_feed_in_feed_title">ØĨØŽŲØ§ØĄ ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛</string> <string name="revanced_hide_filter_bar_feed_in_feed_title">ØĨØŽŲØ§ØĄ ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Ų…ØŽŲŲŠ ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛</string> <string name="revanced_hide_filter_bar_feed_in_feed_summary_on">Ų…ØŽŲŲŠ ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛</string>
<string name="revanced_hide_filter_bar_feed_in_feed_summary_off">ŲŠØšØąØļ ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛</string> <string name="revanced_hide_filter_bar_feed_in_feed_summary_off">ŲŠŲØšØąØļ ؁؊ Ø§Ų„Ų…ŲˆØŦØ˛</string>
<string name="revanced_hide_filter_bar_feed_in_search_title">ØĨØŽŲØ§ØĄ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_filter_bar_feed_in_search_title">ØĨØŽŲØ§ØĄ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_on">Ų…ØŽŲŲŠ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_filter_bar_feed_in_search_summary_on">Ų…ØŽŲŲŠ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_filter_bar_feed_in_search_summary_off">ŲŠØ¸Ų‡Øą ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_filter_bar_feed_in_search_summary_off">ŲŠŲØšØąØļ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_title">ØĨØŽŲØ§ØĄ ؁؊ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_filter_bar_feed_in_related_videos_title">ØĨØŽŲØ§ØĄ ؁؊ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">Ų…ØŽŲŲŠ ؁؊ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_filter_bar_feed_in_related_videos_summary_on">Ų…ØŽŲŲŠ ؁؊ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">ŲŠØšØąØļ ؁؊ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">ŲŠŲØšØąØļ ؁؊ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_comments_screen_title">Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string> <string name="revanced_comments_screen_title">Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_comments_screen_summary">ØĨØŽŲØ§ØĄ ØŖŲˆ ØšØąØļ Ų…ŲƒŲˆŲ†Ø§ØĒ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string> <string name="revanced_comments_screen_summary">ØĨØŽŲØ§ØĄ ØŖŲˆ ØšØąØļ Ų…ŲƒŲˆŲ†Ø§ØĒ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_ai_chat_summary_title">ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ Ø¯ØąØ¯Ø´ØŠ Ø§Ų„Ø°ŲƒØ§ØĄ Ø§Ų„Ø§ØĩØˇŲ†Ø§ØšŲŠ</string> <string name="revanced_hide_comments_ai_chat_summary_title">ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ Ų…Ø­Ø§Ø¯ØĢاØĒ Ø§Ų„Ø°ŲƒØ§ØĄ Ø§Ų„Ø§ØĩØˇŲ†Ø§ØšŲŠ</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ Ø§Ų„Ų…Ø­Ø§Ø¯ØĢاØĒ</string> <string name="revanced_hide_comments_ai_chat_summary_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ Ø§Ų„Ų…Ø­Ø§Ø¯ØĢاØĒ</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_off">؊ØĒŲ… ØšØąØļ Ų…Ų„ØŽØĩ Ø§Ų„Ų…Ø­Ø§Ø¯ØĢاØĒ</string> <string name="revanced_hide_comments_ai_chat_summary_summary_off">؊ØĒŲ… ØšØąØļ Ų…Ų„ØŽØĩ Ø§Ų„Ų…Ø­Ø§Ø¯ØĢاØĒ</string>
<string name="revanced_hide_comments_ai_summary_title">ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ø§Ų„Ø°ŲƒØ§ØĄ Ø§Ų„Ø§ØĩØˇŲ†Ø§ØšŲŠ</string> <string name="revanced_hide_comments_ai_summary_title">ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ø§Ų„Ø°ŲƒØ§ØĄ Ø§Ų„Ø§ØĩØˇŲ†Ø§ØšŲŠ</string>
<string name="revanced_hide_comments_ai_summary_summary_on">Ų…Ų„ØŽØĩ Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…ØŽŲŲŠ</string> <string name="revanced_hide_comments_ai_summary_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų…Ų„ØŽØĩ Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_ai_summary_summary_off">Ų…Ų„ØŽØĩ Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…ØšØąŲˆØļ</string> <string name="revanced_hide_comments_ai_summary_summary_off">؊ØĒŲ… ØšØąØļ Ų…Ų„ØŽØĩ Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_by_members_header_title">ØĨØŽŲØ§ØĄ ØąØŖØŗ \'ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ø§Ų„ØŖØšØļØ§ØĄ\'</string> <string name="revanced_hide_comments_by_members_header_title">ØĨØŽŲØ§ØĄ ØąØŖØŗ \'ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ø§Ų„ØŖØšØļØ§ØĄ\'</string>
<string name="revanced_hide_comments_by_members_header_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØšŲ„Ø§Ų…ØŠ ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…Ų† Ø§Ų„ØŖØšØļØ§ØĄ</string> <string name="revanced_hide_comments_by_members_header_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØšŲ„Ø§Ų…ØŠ ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…Ų† Ø§Ų„ØŖØšØļØ§ØĄ</string>
<string name="revanced_hide_comments_by_members_header_summary_off">؊ØĒŲ… ØšØąØļ ØšŲ„Ø§Ų…ØŠ ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…Ų† Ø§Ų„ØŖØšØļØ§ØĄ</string> <string name="revanced_hide_comments_by_members_header_summary_off">؊ØĒŲ… ØšØąØļ ØšŲ„Ø§Ų…ØŠ ØĒØšŲ„ŲŠŲ‚Ø§ØĒ Ų…Ų† Ø§Ų„ØŖØšØļØ§ØĄ</string>
<string name="revanced_hide_comments_section_title">ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string> <string name="revanced_hide_comments_section_title">ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string> <string name="revanced_hide_comments_section_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string> <string name="revanced_hide_comments_section_summary_off">؊ØĒŲ… ØšØąØļ Ų‚ØŗŲ… Ø§Ų„ØĒØšŲ„ŲŠŲ‚Ø§ØĒ</string>
<string name="revanced_hide_comments_create_a_short_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \'ØĨŲ†Ø´Ø§ØĄ Ų…Ų‚ØˇØš Short\'</string> <string name="revanced_hide_comments_create_a_short_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \'ØĨŲ†Ø´Ø§ØĄ Short\'</string>
<string name="revanced_hide_comments_create_a_short_button_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą ØĨŲ†Ø´Ø§ØĄ Short</string> <string name="revanced_hide_comments_create_a_short_button_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą ØĨŲ†Ø´Ø§ØĄ Short</string>
<string name="revanced_hide_comments_create_a_short_button_summary_off">؊ØĒŲ… ØšØąØļ Ø˛Øą ØĨŲ†Ø´Ø§ØĄ Short</string> <string name="revanced_hide_comments_create_a_short_button_summary_off">؊ØĒŲ… ØšØąØļ Ø˛Øą ØĨŲ†Ø´Ø§ØĄ Short</string>
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ØąŲ…ŲˆØ˛ Ø§Ų„ØĒØšØ¨ŲŠØąŲŠØŠ ŲˆØ§Ų„ØˇŲˆØ§Ø¨Øš Ø§Ų„Ø˛Ų…Ų†ŲŠØŠ</string> <string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ØąŲ…ŲˆØ˛ Ø§Ų„ØĒØšØ¨ŲŠØąŲŠØŠ ŲˆØ§Ų„ØˇŲˆØ§Ø¨Øš Ø§Ų„Ø˛Ų…Ų†ŲŠØŠ</string>
@@ -305,7 +305,7 @@ Second \"item\" text"</string>
<!-- 'Component path builder strings' is the technical name for identifying the Litho UI layout items to hide. This is an advanced feature and most users will never use this. --> <!-- 'Component path builder strings' is the technical name for identifying the Litho UI layout items to hide. This is an advanced feature and most users will never use this. -->
<string name="revanced_custom_filter_strings_summary">Ų‚Ø§ØĻŲ…ØŠ ØŗŲ„Ø§ØŗŲ„ Ų…Ų†Ø´ØĻ Ų…ØŗØ§Øą Ø§Ų„Ų…ŲƒŲˆŲ†Ø§ØĒ Ø§Ų„Ų…ØąØ§Ø¯ ØĒØĩ؁؊ØĒŲ‡Ø§ ؅؁ØĩŲˆŲ„ØŠ Ø¨ØŗØˇØą ØŦØ¯ŲŠØ¯</string> <string name="revanced_custom_filter_strings_summary">Ų‚Ø§ØĻŲ…ØŠ ØŗŲ„Ø§ØŗŲ„ Ų…Ų†Ø´ØĻ Ų…ØŗØ§Øą Ø§Ų„Ų…ŲƒŲˆŲ†Ø§ØĒ Ø§Ų„Ų…ØąØ§Ø¯ ØĒØĩ؁؊ØĒŲ‡Ø§ ؅؁ØĩŲˆŲ„ØŠ Ø¨ØŗØˇØą ØŦØ¯ŲŠØ¯</string>
<string name="revanced_custom_filter_toast_invalid_syntax">؁؄ØĒØą Ų…ØŽØĩØĩ ØēŲŠØą ØĩØ§Ų„Ø­: %s</string> <string name="revanced_custom_filter_toast_invalid_syntax">؁؄ØĒØą Ų…ØŽØĩØĩ ØēŲŠØą ØĩØ§Ų„Ø­: %s</string>
<string name="revanced_hide_keyword_content_screen_title">ØĨØŽŲØ§ØĄ Ų…Ø­ØĒŲˆŲ‰ Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ</string> <string name="revanced_hide_keyword_content_screen_title">ØĨØŽŲØ§ØĄ Ų…Ø­ØĒŲˆŲ‰ Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string>
<string name="revanced_hide_keyword_content_screen_summary">ØĨØŽŲØ§ØĄ ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Ø§Ų„Ø¨Ø­ØĢ ŲˆØ§Ų„Ų…ŲˆØŦØ˛ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ŲŲ„Ø§ØĒØą Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string> <string name="revanced_hide_keyword_content_screen_summary">ØĨØŽŲØ§ØĄ ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Ø§Ų„Ø¨Ø­ØĢ ŲˆØ§Ų„Ų…ŲˆØŦØ˛ Ø¨Ø§ØŗØĒØŽØ¯Ø§Ų… ŲŲ„Ø§ØĒØą Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string>
<string name="revanced_hide_keyword_content_home_title">ØĨØŽŲØ§ØĄ ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ø¨ŲˆØ§ØŗØˇØŠ Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string> <string name="revanced_hide_keyword_content_home_title">ØĨØŽŲØ§ØĄ ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ø¨ŲˆØ§ØŗØˇØŠ Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string>
<string name="revanced_hide_keyword_content_home_summary_on">ØĒØĒŲ… ØĒØĩŲŲŠØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ؁؊ ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨ \"Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ\" Ø­ØŗØ¨ Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string> <string name="revanced_hide_keyword_content_home_summary_on">ØĒØĒŲ… ØĒØĩŲŲŠØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ؁؊ ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨ \"Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ\" Ø­ØŗØ¨ Ø§Ų„ŲƒŲ„Ų…Ø§ØĒ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ</string>
@@ -335,11 +335,11 @@ Second \"item\" text"</string>
<!-- Translations _must_ use a localized example. For languages that do not use spaces between words (Chinese, Japanese, etc.) the English AI example should be used since no localized examples exist. Or if using machine translations, or if nobody wants to think of a localized example, then the English 'ai' example should be left as-is. --> <!-- Translations _must_ use a localized example. For languages that do not use spaces between words (Chinese, Japanese, etc.) the English AI example should be used since no localized examples exist. Or if using machine translations, or if nobody wants to think of a localized example, then the English 'ai' example should be left as-is. -->
<string name="revanced_hide_keyword_content_about_whole_words_summary">ØŗŲŠØ¤Ø¯ŲŠ ؈ØļØš ØšŲ„Ø§Ų…ØŠ Ø§Ų‚ØĒØ¨Ø§Øŗ Ų…Ø˛Ø¯ŲˆØŦØŠ Ø­ŲˆŲ„ ŲƒŲ„Ų…ØŠ ØąØĻŲŠØŗŲŠØŠ/ØšØ¨Ø§ØąØŠ ØĨŲ„Ų‰ Ų…Ų†Øš Ø§Ų„ØĒØˇØ§Ø¨Ų‚Ø§ØĒ Ø§Ų„ØŦØ˛ØĻŲŠØŠ Ų„ØšŲ†Ø§ŲˆŲŠŲ† Ø§Ų„ŲŲŠØ¯ŲŠŲˆ ŲˆØŖØŗŲ…Ø§ØĄ Ø§Ų„Ų‚Ų†ŲˆØ§ØĒ.&lt;br&gt;&lt;br&gt;ØšŲ„Ų‰ ØŗØ¨ŲŠŲ„ Ø§Ų„Ų…ØĢØ§Ų„ØŒ&lt;br&gt;&lt;b&gt;\"ai\"&lt;/b&gt; ØŗŲŠØŽŲŲŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ: &lt;b&gt;How does AI work?&lt;/b&gt;&lt;br&gt;ŲˆŲ„ŲƒŲ† Ų„Ų† ŲŠØŽŲŲŠ: &lt;b&gt;What does fair use mean?&lt;/b&gt;</string> <string name="revanced_hide_keyword_content_about_whole_words_summary">ØŗŲŠØ¤Ø¯ŲŠ ؈ØļØš ØšŲ„Ø§Ų…ØŠ Ø§Ų‚ØĒØ¨Ø§Øŗ Ų…Ø˛Ø¯ŲˆØŦØŠ Ø­ŲˆŲ„ ŲƒŲ„Ų…ØŠ ØąØĻŲŠØŗŲŠØŠ/ØšØ¨Ø§ØąØŠ ØĨŲ„Ų‰ Ų…Ų†Øš Ø§Ų„ØĒØˇØ§Ø¨Ų‚Ø§ØĒ Ø§Ų„ØŦØ˛ØĻŲŠØŠ Ų„ØšŲ†Ø§ŲˆŲŠŲ† Ø§Ų„ŲŲŠØ¯ŲŠŲˆ ŲˆØŖØŗŲ…Ø§ØĄ Ø§Ų„Ų‚Ų†ŲˆØ§ØĒ.&lt;br&gt;&lt;br&gt;ØšŲ„Ų‰ ØŗØ¨ŲŠŲ„ Ø§Ų„Ų…ØĢØ§Ų„ØŒ&lt;br&gt;&lt;b&gt;\"ai\"&lt;/b&gt; ØŗŲŠØŽŲŲŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ: &lt;b&gt;How does AI work?&lt;/b&gt;&lt;br&gt;ŲˆŲ„ŲƒŲ† Ų„Ų† ŲŠØŽŲŲŠ: &lt;b&gt;What does fair use mean?&lt;/b&gt;</string>
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. --> <!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
<string name="revanced_hide_keyword_toast_invalid_common">Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ: %s</string> <string name="revanced_hide_keyword_toast_invalid_common">Ų„Ø§ ŲŠŲ…ŲƒŲ† Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ: %s</string>
<string name="revanced_hide_keyword_toast_invalid_common_whole_word_required">ØĨØļØ§ŲØŠ Ø§Ų‚ØĒØ¨Ø§ØŗØ§ØĒ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ: %s</string> <string name="revanced_hide_keyword_toast_invalid_common_whole_word_required">ØĨØļØ§ŲØŠ Ø§Ų‚ØĒØ¨Ø§ØŗØ§ØĒ Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ: %s</string>
<string name="revanced_hide_keyword_toast_invalid_conflicting">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų„Ų‡Ø§ Ø¨ŲŠØ§Ų†Ø§ØĒ Ų…ØĒØļØ§ØąØ¨ØŠ: %s</string> <string name="revanced_hide_keyword_toast_invalid_conflicting">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ Ų„Ų‡Ø§ Ø¨ŲŠØ§Ų†Ø§ØĒ Ų…ØĒØļØ§ØąØ¨ØŠ: %s</string>
<string name="revanced_hide_keyword_toast_invalid_length">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ Ų‚ØĩŲŠØąØŠ ØŦØ¯Ų‹Ø§ ؈ØĒØĒØˇŲ„Ø¨ Ø§Ų‚ØĒØ¨Ø§ØŗØ§ØĒ: %s</string> <string name="revanced_hide_keyword_toast_invalid_length">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ Ų‚ØĩŲŠØąØŠ ØŦØ¯Ų‹Ø§ ؈ØĒØĒØˇŲ„Ø¨ Ø§Ų‚ØĒØ¨Ø§ØŗØ§ØĒ: %s</string>
<string name="revanced_hide_keyword_toast_invalid_broad">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ØŗŲˆŲ ØĒØŽŲŲŠ ØŦŲ…ŲŠØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ: %s</string> <string name="revanced_hide_keyword_toast_invalid_broad">Ø§Ų„ŲƒŲ„Ų…ØŠ Ø§Ų„Ų…ŲØĒØ§Ø­ŲŠØŠ ØŗŲˆŲ ØĒØŽŲŲŠ ØŦŲ…ŲŠØš Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ: %s</string>
</patch> </patch>
<patch id="ad.general.hideAdsResourcePatch"> <patch id="ad.general.hideAdsResourcePatch">
<string name="revanced_hide_general_ads_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„ØšØ§Ų…ØŠ</string> <string name="revanced_hide_general_ads_title">ØĨØŽŲØ§ØĄ Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„ØšØ§Ų…ØŠ</string>
@@ -359,20 +359,20 @@ Second \"item\" text"</string>
<string name="revanced_hide_self_sponsor_ads_title">ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØąØšØ§ŲŠØŠ Ø§Ų„Ø°Ø§ØĒŲŠØŠ</string> <string name="revanced_hide_self_sponsor_ads_title">ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØąØšØ§ŲŠØŠ Ø§Ų„Ø°Ø§ØĒŲŠØŠ</string>
<string name="revanced_hide_self_sponsor_ads_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØąØšØ§ŲŠØŠ Ø§Ų„Ø°Ø§ØĒŲŠØŠ</string> <string name="revanced_hide_self_sponsor_ads_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØąØšØ§ŲŠØŠ Ø§Ų„Ø°Ø§ØĒŲŠØŠ</string>
<string name="revanced_hide_self_sponsor_ads_summary_off">؊ØĒŲ… ØšØąØļ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØąØšØ§ŲŠØŠ Ø§Ų„Ø°Ø§ØĒŲŠØŠ</string> <string name="revanced_hide_self_sponsor_ads_summary_off">؊ØĒŲ… ØšØąØļ Ø¨ØˇØ§Ų‚Ø§ØĒ Ø§Ų„ØąØšØ§ŲŠØŠ Ø§Ų„Ø°Ø§ØĒŲŠØŠ</string>
<string name="revanced_hide_products_banner_title">ØĨØŽŲØ§ØĄ Ų„Ø§ŲØĒØŠ \"ØšØąØļ Ø§Ų„Ų…Ų†ØĒØŦاØĒ\"</string> <string name="revanced_hide_products_banner_title">ØĨØŽŲØ§ØĄ Ų„Ø§ŲØĒØŠ \'ØšØąØļ Ø§Ų„Ų…Ų†ØĒØŦاØĒ\'</string>
<string name="revanced_hide_products_banner_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ø¨Ø§Ų†Øą</string> <string name="revanced_hide_products_banner_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ø¨Ø§Ų†Øą</string>
<string name="revanced_hide_products_banner_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ø¨Ø§Ų†Øą</string> <string name="revanced_hide_products_banner_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ø¨Ø§Ų†Øą</string>
<string name="revanced_hide_end_screen_store_banner_title">ØĨØŽŲØ§ØĄ Ų„Ø§ŲØĒØŠ شاش؊ Ø§Ų„Ų…ØĒØŦØą Ø§Ų„Ų†Ų‡Ø§ØĻŲŠØŠ</string> <string name="revanced_hide_end_screen_store_banner_title">ØĨØŽŲØ§ØĄ Ų„Ø§ŲØĒØŠ شاش؊ Ø§Ų„Ų…ØĒØŦØą Ø§Ų„Ų†Ų‡Ø§ØĻŲŠØŠ</string>
<string name="revanced_hide_end_screen_store_banner_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų„Ø§ŲØĒØŠ Ø§Ų„Ų…ØĒØŦØą</string> <string name="revanced_hide_end_screen_store_banner_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ų„Ø§ŲØĒØŠ Ø§Ų„Ų…ØĒØŦØą</string>
<string name="revanced_hide_end_screen_store_banner_summary_off">؊ØĒŲ… ØšØąØļ Ų„Ø§ŲØĒØŠ Ø§Ų„Ų…ØĒØŦØą</string> <string name="revanced_hide_end_screen_store_banner_summary_off">؊ØĒŲ… ØšØąØļ Ų„Ø§ŲØĒØŠ Ø§Ų„Ų…ØĒØŦØą</string>
<string name="revanced_hide_player_store_shelf_title">ØĨØŽŲØ§ØĄ ØąŲ Ų…Ø´ØēŲ„ Ø§Ų„ØĒØŗŲˆŲ‚</string> <string name="revanced_hide_player_store_shelf_title">ØĨØŽŲØ§ØĄ ØąŲ Ų…Ø´ØēŲ„ Ø§Ų„ØĒØŗŲˆŲ‚</string>
<string name="revanced_hide_player_store_shelf_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØąŲŲˆŲ Ø§Ų„ØĒØŗŲˆŲ‚</string> <string name="revanced_hide_player_store_shelf_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØąŲ Ø§Ų„ØĒØŗŲˆŲ‚</string>
<string name="revanced_hide_player_store_shelf_summary_off">؊ØĒŲ… ØšØąØļ ØąŲŲˆŲ Ø§Ų„ØĒØŗŲˆŲ‚</string> <string name="revanced_hide_player_store_shelf_summary_off">؊ØĒŲ… ØšØąØļ ØąŲ Ø§Ų„ØĒØŗŲˆŲ‚</string>
<string name="revanced_hide_shopping_links_title">ØĨØŽŲØ§ØĄ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØĒØŗŲˆŲ‚ ؁؊ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_shopping_links_title">ØĨØŽŲØ§ØĄ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØĒØŗŲˆŲ‚ ؁؊ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_shopping_links_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØĒØŗŲˆŲ‚ ؁؊ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_shopping_links_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØĒØŗŲˆŲ‚ ؁؊ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_shopping_links_summary_off">؊ØĒŲ… ØšØąØļ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØĒØŗŲˆŲ‚ ؁؊ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_shopping_links_summary_off">؊ØĒŲ… ØšØąØļ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ØĒØŗŲˆŲ‚ ؁؊ ؈Øĩ؁ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<!-- 'Visit store' should be translated with the same localized wording that YouTube displays. --> <!-- 'Visit store' should be translated with the same localized wording that YouTube displays. -->
<string name="revanced_hide_visit_store_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \"Ø˛ŲŠØ§ØąØŠ Ø§Ų„Ų…ØĒØŦØą\" ØšŲ„Ų‰ ØĩŲØ­Ø§ØĒ Ø§Ų„Ų‚Ų†Ø§ØŠ</string> <string name="revanced_hide_visit_store_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą \'Ø˛ŲŠØ§ØąØŠ Ø§Ų„Ų…ØĒØŦØą\' ØšŲ„Ų‰ ØĩŲØ­Ø§ØĒ Ø§Ų„Ų‚Ų†Ø§ØŠ</string>
<string name="revanced_hide_visit_store_button_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ø˛Øą ؁؊ ØĩŲØ­ØŠ Ø§Ų„Ų‚Ų†Ø§ØŠ</string> <string name="revanced_hide_visit_store_button_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ø˛Øą ؁؊ ØĩŲØ­ØŠ Ø§Ų„Ų‚Ų†Ø§ØŠ</string>
<string name="revanced_hide_visit_store_button_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ø˛Øą ؁؊ ØĩŲØ­ØŠ Ø§Ų„Ų‚Ų†Ø§ØŠ</string> <string name="revanced_hide_visit_store_button_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ø˛Øą ؁؊ ØĩŲØ­ØŠ Ø§Ų„Ų‚Ų†Ø§ØŠ</string>
<string name="revanced_hide_web_search_results_title">ØĨØŽŲØ§ØĄ Ų†ØĒاØĻØŦ بحØĢ Ø§Ų„ŲˆŲŠØ¨</string> <string name="revanced_hide_web_search_results_title">ØĨØŽŲØ§ØĄ Ų†ØĒاØĻØŦ بحØĢ Ø§Ų„ŲˆŲŠØ¨</string>
@@ -387,7 +387,7 @@ Second \"item\" text"</string>
<patch id="ad.getpremium.hideGetPremiumPatch"> <patch id="ad.getpremium.hideGetPremiumPatch">
<string name="revanced_hide_get_premium_title">ØĨØŽŲØ§ØĄ ØĒØąŲ‚ŲŠØŠ YouTube Premium</string> <string name="revanced_hide_get_premium_title">ØĨØŽŲØ§ØĄ ØĒØąŲ‚ŲŠØŠ YouTube Premium</string>
<string name="revanced_hide_get_premium_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØšØąŲˆØļ YouTube Premium Ø§Ų„ØĒØąŲˆŲŠØŦŲŠØŠ ØĒØ­ØĒ Ų…Ø´ØēŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_get_premium_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØšØąŲˆØļ YouTube Premium Ø§Ų„ØĒØąŲˆŲŠØŦŲŠØŠ ØĒØ­ØĒ Ų…Ø´ØēŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_hide_get_premium_summary_off">؊ØĒŲ… ØšØąØļ ØšØąŲˆØļ YouTube Premium Ø§Ų„ØĒØąŲˆŲŠØŦŲŠØŠ ØĒØ­ØĒ Ų…Ø´ØēŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_get_premium_summary_off">؊ØĒŲ… ØĨØ¸Ų‡Ø§Øą ØšØąŲˆØļ YouTube Premium Ø§Ų„ØĒØąŲˆŲŠØŦŲŠØŠ ØĒØ­ØĒ Ų…Ø´ØēŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
</patch> </patch>
<patch id="ad.video.videoAdsPatch"> <patch id="ad.video.videoAdsPatch">
<string name="revanced_hide_video_ads_title">ØĨØŽŲØ§ØĄ ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_hide_video_ads_title">ØĨØŽŲØ§ØĄ ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
@@ -430,9 +430,9 @@ Second \"item\" text"</string>
<string name="revanced_disable_precise_seeking_gesture_summary_off">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØĨŲŠŲ…Ø§ØĄØŠ</string> <string name="revanced_disable_precise_seeking_gesture_summary_off">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† Ø§Ų„ØĨŲŠŲ…Ø§ØĄØŠ</string>
</patch> </patch>
<patch id="interaction.seekbar.enableSeekbarTappingPatch"> <patch id="interaction.seekbar.enableSeekbarTappingPatch">
<string name="revanced_seekbar_tapping_title">ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ų†Ų‚Øą Ų„Ų„Ø¨Ø­ØĢ</string> <string name="revanced_seekbar_tapping_title">ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ų†Ų‚Øą Ų„Ų„ØĒŲ…ØąŲŠØą</string>
<string name="revanced_seekbar_tapping_summary_on">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ų†Ų‚Øą Ų„Ų„ØĒŲ†Ų‚Ų„</string> <string name="revanced_seekbar_tapping_summary_on">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ų†Ų‚Øą Ų„Ų„ØĒŲ…ØąŲŠØą</string>
<string name="revanced_seekbar_tapping_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ Ø§Ų„Ų†Ų‚Øą Ų„Ų„Ø¨Ø­ØĢ</string> <string name="revanced_seekbar_tapping_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ Ø§Ų„Ų†Ų‚Øą Ų„Ų„ØĒŲ…ØąŲŠØą</string>
</patch> </patch>
<patch id="interaction.swipecontrols.swipeControlsResourcePatch"> <patch id="interaction.swipecontrols.swipeControlsResourcePatch">
<string name="revanced_swipe_brightness_title">Ø§Ų„ØĒØ­ŲƒŲ… Ø¨Ø§Ų„ØŗØˇŲˆØš ØšŲ† ØˇØąŲŠŲ‚ Ø§ŲŠŲ…Ø§ØĄØŠ Ø§Ų„ØĒŲ…ØąŲŠØą</string> <string name="revanced_swipe_brightness_title">Ø§Ų„ØĒØ­ŲƒŲ… Ø¨Ø§Ų„ØŗØˇŲˆØš ØšŲ† ØˇØąŲŠŲ‚ Ø§ŲŠŲ…Ø§ØĄØŠ Ø§Ų„ØĒŲ…ØąŲŠØą</string>
@@ -555,6 +555,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_translucent_status_bar_title">ØĒØšØˇŲŠŲ„ Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ø§Ų„Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_status_bar_title">ØĒØšØˇŲŠŲ„ Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ø§Ų„Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_status_bar_summary_on">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ ØēŲŠØą Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_status_bar_summary_on">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ ØēŲŠØą Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_status_bar_summary_off">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ų…ØšØĒŲ… ØŖŲˆ Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_status_bar_summary_off">Ø´ØąŲŠØˇ Ø§Ų„Ø­Ø§Ų„ØŠ Ų…ØšØĒŲ… ØŖŲˆ Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">؁؊ بؚØļ Ø§Ų„ØŖØŦŲ‡Ø˛ØŠØŒ Ų‚Ø¯ ŲŠØ¤Ø¯ŲŠ ØĒŲ…ŲƒŲŠŲ† Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ ØĨŲ„Ų‰ ØĒØēŲŠŲŠØą Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„Ų†Ø¸Ø§Ų… ØĨŲ„Ų‰ Ø´ŲØ§Ų.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">ØĒØšØˇŲŠŲ„ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„Ø´ŲØ§Ų Ø§Ų„ŲØ§ØĒØ­</string> <string name="revanced_disable_translucent_navigation_bar_light_title">ØĒØšØˇŲŠŲ„ Ø§Ų„Ø´ØąŲŠØˇ Ø§Ų„Ø´ŲØ§Ų Ø§Ų„ŲØ§ØĒØ­</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ ØēŲŠØą Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ ØēŲŠØą Ø´ŲØ§Ų</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ Ų…ØšØĒŲ… Ø§Ųˆ Ø´ŲØ§Ų</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ†Ų‚Ų„ ؁؊ Ø§Ų„ŲˆØļØš Ø§Ų„ŲØ§ØĒØ­ Ų…ØšØĒŲ… Ø§Ųˆ Ø´ŲØ§Ų</string>
@@ -666,17 +667,17 @@ Second \"item\" text"</string>
<!-- 'home' should be translated using the same localized wording YouTube displays for the home tab. --> <!-- 'home' should be translated using the same localized wording YouTube displays for the home tab. -->
<string name="revanced_hide_shorts_home_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ</string> <string name="revanced_hide_shorts_home_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ</string>
<string name="revanced_hide_shorts_home_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_shorts_home_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<string name="revanced_hide_shorts_home_summary_off">ØĒØšØąØļ ؁؊ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string> <string name="revanced_hide_shorts_home_summary_off">ØĒŲØšØąØļ ؁؊ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ ŲˆØ§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ ذاØĒ Ø§Ų„ØĩŲ„ØŠ</string>
<!-- 'subscription' should be translated using the same localized wording YouTube displays for the subscription tab. --> <!-- 'subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
<string name="revanced_hide_shorts_subscriptions_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string> <string name="revanced_hide_shorts_subscriptions_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string>
<string name="revanced_hide_shorts_subscriptions_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string> <string name="revanced_hide_shorts_subscriptions_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string>
<string name="revanced_hide_shorts_subscriptions_summary_off">ØĒØšØąØļ ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string> <string name="revanced_hide_shorts_subscriptions_summary_off">ØĒŲØšØąØļ ؁؊ Ų…ŲˆØŦØ˛ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string>
<string name="revanced_hide_shorts_search_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_shorts_search_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_shorts_search_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_shorts_search_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_shorts_search_summary_off">ØĒØšØąØļ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string> <string name="revanced_hide_shorts_search_summary_off">ØĒŲØšØąØļ ؁؊ Ų†ØĒاØĻØŦ Ø§Ų„Ø¨Ø­ØĢ</string>
<string name="revanced_hide_shorts_history_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ</string> <string name="revanced_hide_shorts_history_title">ØĨØŽŲØ§ØĄ Shorts ؁؊ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ</string>
<string name="revanced_hide_shorts_history_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ</string> <string name="revanced_hide_shorts_history_summary_on">Ų…ØŽŲŲŠØŠ ؁؊ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ</string>
<string name="revanced_hide_shorts_history_summary_off">ØĒØšØąØļ ؁؊ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ</string> <string name="revanced_hide_shorts_history_summary_off">ØĒŲØšØąØļ ؁؊ ØŗØŦŲ„ Ø§Ų„Ų…Ø´Ø§Ų‡Ø¯ØŠ</string>
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. --> <!-- 'join' should be translated using the same localized wording YouTube displays for the button. -->
<string name="revanced_hide_shorts_join_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„Ø§Ų†ØļŲ…Ø§Ų…</string> <string name="revanced_hide_shorts_join_button_title">ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„Ø§Ų†ØļŲ…Ø§Ų…</string>
<string name="revanced_hide_shorts_join_button_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„Ø§Ų†ØļŲ…Ø§Ų…</string> <string name="revanced_hide_shorts_join_button_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„Ø§Ų†ØļŲ…Ø§Ų…</string>
@@ -765,7 +766,7 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch"> <patch id="layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch">
<string name="revanced_end_screen_suggested_video_title">ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…Ų‚ØĒØąØ­ ؁؊ شاش؊ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ</string> <string name="revanced_end_screen_suggested_video_title">ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…Ų‚ØĒØąØ­ ؁؊ شاش؊ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ</string>
<string name="revanced_end_screen_suggested_video_summary_on">"؊ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…Ų‚ØĒØąØ­ ؁؊ شاش؊ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ ØšŲ†Ø¯ ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ <string name="revanced_end_screen_suggested_video_summary_on">"ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…Ų‚ØĒØąØ­ ؁؊ شاش؊ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ ØšŲ†Ø¯ ØĨŲŠŲ‚Ø§Ų Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊
ŲŠŲ…ŲƒŲ† ØĒØēŲŠŲŠØą Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ؁؊ ØĨؚداداØĒ YouTube: ŲŠŲ…ŲƒŲ† ØĒØēŲŠŲŠØą Ø§Ų„ØĒØ´ØēŲŠŲ„ Ø§Ų„ØĒŲ„Ų‚Ø§ØĻ؊ ؁؊ ØĨؚداداØĒ YouTube:
Ø§Ų„ØĨؚداداØĒ ← Ø§Ų„ØĒØ´ØēŲŠŲ„ ← ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ØĒØ§Ų„ŲŠ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§"</string> Ø§Ų„ØĨؚداداØĒ ← Ø§Ų„ØĒØ´ØēŲŠŲ„ ← ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„ØĒØ§Ų„ŲŠ ØĒŲ„Ų‚Ø§ØĻŲŠŲ‹Ø§"</string>
@@ -863,7 +864,7 @@ Second \"item\" text"</string>
Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… ØŗŲˆŲ ØĒØŗØĒØŽØ¯Ų… Ų†ŲØŗ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø­Ø§Ų„ŲŠ. Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… ØŗŲˆŲ ØĒØŗØĒØŽØ¯Ų… Ų†ŲØŗ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø­Ø§Ų„ŲŠ.
ØĒØšŲ…Ų„ Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ Ø¨Ø´ŲƒŲ„ ØŖŲØļŲ„ Ų…Øš ØŦŲˆØ¯ØŠ ŲŲŠØ¯ŲŠŲˆ 720p ØŖŲˆ ØŖŲ‚Ų„ ŲˆØšŲ†Ø¯ Ø§ØŗØĒØŽØ¯Ø§Ų… اØĒØĩØ§Ų„ ØĨŲ†ØĒØąŲ†ØĒ ØŗØąŲŠØš ØŦØ¯Ø§Ų‹."</string> ØĒØšŲ…Ų„ Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠ Ø¨Ø´ŲƒŲ„ ØŖŲØļŲ„ Ų…Øš ØŦŲˆØ¯ØŠ ŲŲŠØ¯ŲŠŲˆ 720p ØŖŲˆ ØŖŲ‚Ų„ ŲˆØšŲ†Ø¯ Ø§ØŗØĒØŽØ¯Ø§Ų… اØĒØĩØ§Ų„ ØĨŲ†ØĒØąŲ†ØĒ ØŗØąŲŠØš ØŦØ¯Ų‹Ø§."</string>
<string name="revanced_restore_old_seekbar_thumbnails_title">Ø§ØŗØĒؚاد؊ Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… Ø§Ų„Ų‚Ø¯ŲŠŲ…ØŠ</string> <string name="revanced_restore_old_seekbar_thumbnails_title">Ø§ØŗØĒؚاد؊ Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… Ø§Ų„Ų‚Ø¯ŲŠŲ…ØŠ</string>
<string name="revanced_restore_old_seekbar_thumbnails_summary_on">Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… ØŗØĒØ¸Ų‡Øą ŲŲˆŲ‚ Ø´ØąŲŠØˇ ØĒŲ‚Ø¯Ų… Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string> <string name="revanced_restore_old_seekbar_thumbnails_summary_on">Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… ØŗØĒØ¸Ų‡Øą ŲŲˆŲ‚ Ø´ØąŲŠØˇ ØĒŲ‚Ø¯Ų… Ø§Ų„ŲŲŠØ¯ŲŠŲˆ</string>
<string name="revanced_restore_old_seekbar_thumbnails_summary_off">Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… ØŗØĒØ¸Ų‡Øą ؁؊ Ų…Ų„ØĄ Ø§Ų„Ø´Ø§Ø´ØŠ</string> <string name="revanced_restore_old_seekbar_thumbnails_summary_off">Ų…ØĩØēØąØ§ØĒ Ø´ØąŲŠØˇ Ø§Ų„ØĒŲ‚Ø¯Ų… ØŗØĒØ¸Ų‡Øą ؁؊ Ų…Ų„ØĄ Ø§Ų„Ø´Ø§Ø´ØŠ</string>
@@ -936,15 +937,15 @@ Second \"item\" text"</string>
<string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Ų„Ø§ ØĒØšØąØļ Ų…ØąØŠ ØŖØŽØąŲ‰</string> <string name="revanced_sb_settings_revanced_export_user_id_warning_dismiss">Ų„Ø§ ØĒØšØąØļ Ų…ØąØŠ ØŖØŽØąŲ‰</string>
<string name="revanced_sb_diff_segments">ØĒØēŲŠŲŠØą ØŗŲ„ŲˆŲƒ Ø§Ų„Ų…Ų‚ØˇØš</string> <string name="revanced_sb_diff_segments">ØĒØēŲŠŲŠØą ØŗŲ„ŲˆŲƒ Ø§Ų„Ų…Ų‚ØˇØš</string>
<string name="revanced_sb_segments_sponsor">Ø§Ų„ØąØ§ØšŲŠ</string> <string name="revanced_sb_segments_sponsor">Ø§Ų„ØąØ§ØšŲŠ</string>
<string name="revanced_sb_segments_sponsor_sum">Ø§Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ų…Ø¯ŲŲˆØš Ø§Ų„ØŖØŦØąØŒ ŲˆØ§Ų„ØĨØ­Ø§Ų„Ø§ØĒ Ø§Ų„Ų…Ø¯ŲŲˆØšØŠ Ø§Ų„ØŖØŦØą ŲˆØ§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„Ų…Ø¨Ø§Ø´ØąØŠ. Ų„ŲŠØŗ Ų„Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ø°Ø§ØĒ؊ ØŖŲˆ Ų„ØĩØąØ§ØšØ§ØĒ Ų…ØŦØ§Ų†ŲŠØŠ Ų„Ų„Ų‚ØļØ§ŲŠØ§/Ø§Ų„Ų…Ø¨Ø¯ØšŲŠŲ†/Ø§Ų„Ų…ŲˆØ§Ų‚Øš Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠØŠ/Ø§Ų„Ų…Ų†ØĒØŦاØĒ Ø§Ų„ØĒ؊ ŲŠØ­Ø¨ŲˆŲ† Ø§Ų„Ø­ØĩŲˆŲ„ ØšŲ„ŲŠŲ‡Ø§</string> <string name="revanced_sb_segments_sponsor_sum">Ø§Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ų…Ø¯ŲŲˆØšØŒ ŲˆØ§Ų„ØĨØ­Ø§Ų„Ø§ØĒ Ø§Ų„Ų…Ø¯ŲŲˆØšØŠØŒ ŲˆØ§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ Ø§Ų„Ų…Ø¨Ø§Ø´ØąØŠ. Ų„ŲŠØŗ Ų„Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ø°Ø§ØĒ؊ ØŖŲˆ Ø§Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ų…ØŦØ§Ų†ŲŠ Ų„Ų„Ų‚ØļØ§ŲŠØ§/Ø§Ų„Ų…Ø¨Ø¯ØšŲŠŲ†/Ø§Ų„Ų…ŲˆØ§Ų‚Øš Ø§Ų„ØĨŲ„ŲƒØĒØąŲˆŲ†ŲŠØŠ/Ø§Ų„Ų…Ų†ØĒØŦاØĒ Ø§Ų„ØĒ؊ ؊؁ØļŲ„ŲˆŲ†Ų‡Ø§</string>
<string name="revanced_sb_segments_selfpromo">ØĒØąŲˆŲŠØŦ Ø´ØŽØĩ؊/ØēŲŠØą Ų…Ø¯ŲŲˆØš Ø§Ų„ØŖØŦØą</string> <string name="revanced_sb_segments_selfpromo">ØĒØąŲˆŲŠØŦ Ø´ØŽØĩ؊/ØēŲŠØą Ų…Ø¯ŲŲˆØš Ø§Ų„ØŖØŦØą</string>
<string name="revanced_sb_segments_selfpromo_sum">Ų…Ø´Ø§Ø¨Ų‡ØŠ Ų„Ų€ \"Ø§Ų„ØąØ§ØšŲŠ\" Ø¨Ø§ØŗØĒØĢŲ†Ø§ØĄ Ų…Ø§ ؊ØĒØšŲ„Ų‚ Ø¨Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ ØēŲŠØą Ø§Ų„Ų…Ø¯ŲŲˆØšØŠ Ø§Ų„ØŖØŦØą ØŖŲˆ Ø§Ų„Ø°Ø§ØĒŲŠØŠ. ŲˆŲŠØ´Ų…Ų„ Ø°Ų„Ųƒ ØŖŲ‚ØŗØ§Ų… ØšŲ† Ø§Ų„ØŗŲ„Øš ØŖŲˆ Ø§Ų„ØĒØ¨ØąØšØ§ØĒ ØŖŲˆ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø§Ų„Ų…ØĒØšŲ„Ų‚ØŠ Ø¨Ų…Ų† ØĒØšØ§ŲˆŲ†ŲˆØ§ Ų…Øš Ų†Ø§Ø´Øą Ø§Ų„Ų…Ø­ØĒŲˆŲ‰</string> <string name="revanced_sb_segments_selfpromo_sum">Ų…Ø´Ø§Ø¨Ų‡ØŠ Ų„Ų€ \'Ø§Ų„ØąØ§ØšŲŠ\' Ø¨Ø§ØŗØĒØĢŲ†Ø§ØĄ Ų…Ø§ ؊ØĒØšŲ„Ų‚ Ø¨Ø§Ų„ØĨØšŲ„Ø§Ų†Ø§ØĒ ØēŲŠØą Ø§Ų„Ų…Ø¯ŲŲˆØšØŠ Ø§Ų„ØŖØŦØą ØŖŲˆ Ø§Ų„Ø°Ø§ØĒŲŠØŠ. ŲˆŲŠØ´Ų…Ų„ Ø°Ų„Ųƒ ØŖŲ‚ØŗØ§Ų… ØšŲ† Ø§Ų„ØŗŲ„Øš ØŖŲˆ Ø§Ų„ØĒØ¨ØąØšØ§ØĒ ØŖŲˆ Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ Ø§Ų„Ų…ØĒØšŲ„Ų‚ØŠ Ø¨Ų…Ų† ØĒØšØ§ŲˆŲ†ŲˆØ§ Ų…Øš Ų†Ø§Ø´Øą Ø§Ų„Ų…Ø­ØĒŲˆŲ‰</string>
<string name="revanced_sb_segments_interaction">ØĒØ°ŲƒŲŠØą Ø¨Ø§Ų„ØĒŲØ§ØšŲ„ (اشØĒØąØ§Ųƒ)</string> <string name="revanced_sb_segments_interaction">ØĒØ°ŲƒŲŠØą Ø¨Ø§Ų„ØĒŲØ§ØšŲ„ (اشØĒØąØ§Ųƒ)</string>
<string name="revanced_sb_segments_interaction_sum">ØĒØ°ŲƒŲŠØą Ų‚ØĩŲŠØą Ų„Ų„ØĨØšØŦاب ØŖŲˆ Ø§Ų„Ø§Ø´ØĒØąØ§Ųƒ ØŖŲˆ Ø§Ų„Ų…ØĒابؚ؊ ؁؊ Ų…Ų†ØĒØĩ؁ Ø§Ų„Ų…Ø­ØĒŲˆŲ‰. ØĨذا ŲƒØ§Ų†ØĒ ØˇŲˆŲŠŲ„ØŠ ØŖŲˆ ØĒØĒØšŲ„Ų‚ Ø¨Ø´ŲŠØĄ Ų…Ø­Ø¯Ø¯ØŒ ؁؊ØŦب ØŖŲ† ØĒŲƒŲˆŲ† ؎اØļؚ؊ Ų„Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ø´ØŽØĩ؊ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø°Ų„Ųƒ</string> <string name="revanced_sb_segments_interaction_sum">ØĒØ°ŲƒŲŠØą Ų‚ØĩŲŠØą Ų„Ų„ØĨØšØŦاب ØŖŲˆ Ø§Ų„Ø§Ø´ØĒØąØ§Ųƒ ØŖŲˆ Ø§Ų„Ų…ØĒابؚ؊ ؁؊ Ų…Ų†ØĒØĩ؁ Ø§Ų„Ų…Ø­ØĒŲˆŲ‰. ØĨذا ŲƒØ§Ų†ØĒ ØˇŲˆŲŠŲ„ØŠ ØŖŲˆ ØĒØĒØšŲ„Ų‚ Ø¨Ø´ŲŠØĄ Ų…Ø­Ø¯Ø¯ØŒ ؁؊ØŦب ØŖŲ† ØĒŲƒŲˆŲ† ؎اØļؚ؊ Ų„Ų„ØĒØąŲˆŲŠØŦ Ø§Ų„Ø´ØŽØĩ؊ Ø¨Ø¯Ų„Ø§Ų‹ Ų…Ų† Ø°Ų„Ųƒ</string>
<string name="revanced_sb_segments_highlight">Ø§Ų„ØŖØ¨ØąØ˛</string> <string name="revanced_sb_segments_highlight">Ø§Ų„ØŖØ¨ØąØ˛</string>
<string name="revanced_sb_segments_highlight_sum">Ø§Ų„ØŦØ˛ØĄ Ų…Ų† Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø°ŲŠ ŲŠØ¨Ø­ØĢ ØšŲ†Ų‡ Ų…ØšØ¸Ų… Ø§Ų„Ų†Ø§Øŗ</string> <string name="revanced_sb_segments_highlight_sum">Ø§Ų„ØŦØ˛ØĄ Ų…Ų† Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ø°ŲŠ ŲŠØ¨Ø­ØĢ ØšŲ†Ų‡ Ų…ØšØ¸Ų… Ø§Ų„Ų†Ø§Øŗ</string>
<string name="revanced_sb_segments_intro">Ø§Ų„Ų…Ų‚Ø¯Ų…ØŠ/ŲØ§ØĩŲ„</string> <string name="revanced_sb_segments_intro">Ø§Ų„Ų…Ų‚Ø¯Ų…ØŠ/ŲØ§ØĩŲ„</string>
<string name="revanced_sb_segments_intro_sum">ŲØ§ØĩŲ„ Ø˛Ų…Ų†ŲŠ Ø¨Ø¯ŲˆŲ† Ų…Ø­ØĒŲˆŲ‰ ŲØšŲ„ŲŠ. ŲŠŲ…ŲƒŲ† ØŖŲ† ŲŠŲƒŲˆŲ† ŲˆŲ‚ŲØ§Ų‹ Ų…Ø¤Ų‚ØĒØ§Ų‹ØŒ ØŖŲˆ ØĨØˇØ§ØąŲ‹Ø§ ØĢابØĒØ§Ų‹ØŒ ØŖŲˆ ØĒŲƒØąØ§ØąŲ‹Ø§. Ų„Ø§ ؊ØĒØļŲ…Ų† Ø§Ų„ØĒØ­ŲˆŲ„Ø§ØĒ Ø§Ų„ØĒ؊ ØĒØ­ØĒ؈؊ ØšŲ„Ų‰ Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string> <string name="revanced_sb_segments_intro_sum">ŲØ§ØĩŲ„ Ø˛Ų…Ų†ŲŠ Ø¨Ø¯ŲˆŲ† Ų…Ø­ØĒŲˆŲ‰ ŲØšŲ„ŲŠ. Ų‚Ø¯ ŲŠŲƒŲˆŲ† ØĒŲˆŲ‚ŲŲ‹Ø§ Ų…Ø¤Ų‚ØĒŲ‹Ø§ØŒ ØŖŲˆ ØĨØˇØ§ØąŲ‹Ø§ ØĢابØĒŲ‹Ø§ØŒ ØŖŲˆ ØąØŗŲˆŲ…Ų‹Ø§ Ų…ØĒØ­ØąŲƒØŠ Ų…ØĒŲƒØąØąØŠ. Ų„Ø§ ؊ØĒØļŲ…Ų† Ø§Ų†ØĒŲ‚Ø§Ų„Ø§ØĒ ØĒØ­ØĒ؈؊ ØšŲ„Ų‰ Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string>
<string name="revanced_sb_segments_outro">Ø§Ų„ØŽØ§ØĒŲ…ØŠ/ØĒØĒØąØ§ØĒ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ</string> <string name="revanced_sb_segments_outro">Ø§Ų„ØŽØ§ØĒŲ…ØŠ/ØĒØĒØąØ§ØĒ Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ</string>
<string name="revanced_sb_segments_outro_sum">ØĒØĒØą Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ ØŖŲˆ ØšŲ†Ø¯Ų…Ø§ ØĒØ¸Ų‡Øą Ø¨ØˇØ§Ų‚Ø§ØĒ Ų†Ų‡Ø§ŲŠØŠ YouTube، Ų†Ų‡Ø§ŲŠØ§ØĒ ØēŲŠØą Ų…Ų†ØˇŲˆŲ‚ØŠ. Ų„ŲŠØŗ Ų„Ų„Ø§ØŗØĒŲ†ØĒاØŦاØĒ Ų…Øš Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string> <string name="revanced_sb_segments_outro_sum">ØĒØĒØą Ø§Ų„Ų†Ų‡Ø§ŲŠØŠ ØŖŲˆ ØšŲ†Ø¯Ų…Ø§ ØĒØ¸Ų‡Øą Ø¨ØˇØ§Ų‚Ø§ØĒ Ų†Ų‡Ø§ŲŠØŠ YouTube، Ų†Ų‡Ø§ŲŠØ§ØĒ ØēŲŠØą Ų…Ų†ØˇŲˆŲ‚ØŠ. Ų„ŲŠØŗ Ų„Ų„Ø§ØŗØĒŲ†ØĒاØŦاØĒ Ų…Øš Ø§Ų„Ų…ØšŲ„ŲˆŲ…Ø§ØĒ</string>
<string name="revanced_sb_segments_preview">Ų…ØšØ§ŲŠŲ†ØŠ/Ų…ŲˆØŦØ˛/ØąØ¨Øˇ</string> <string name="revanced_sb_segments_preview">Ų…ØšØ§ŲŠŲ†ØŠ/Ų…ŲˆØŦØ˛/ØąØ¨Øˇ</string>
@@ -1078,9 +1079,9 @@ Second \"item\" text"</string>
ØĒØĩŲ…ŲŠŲ… Ø§Ų„ØŦŲ‡Ø§Ø˛ Ø§Ų„Ų„ŲˆØ­ŲŠ ØĒØĩŲ…ŲŠŲ… Ø§Ų„ØŦŲ‡Ø§Ø˛ Ø§Ų„Ų„ŲˆØ­ŲŠ
â€ĸ Ų…Ø´Ø§ØąŲƒØ§ØĒ Ø§Ų„Ų…ØŦØĒŲ…Øš Ų…ØŽŲŲŠØŠ â€ĸ Ų…Ø´Ø§ØąŲƒØ§ØĒ Ø§Ų„Ų…ØŦØĒŲ…Øš Ų…ØŽŲŲŠØŠ
ØĒØĩŲ…ŲŠŲ… Ø§Ų„ØŗŲŠØ§ØąØŠ ØĒØĩŲ…ŲŠŲ… Automotive
â€ĸ ؊ØĒŲ… ؁ØĒØ­ Shorts ؁؊ Ø§Ų„Ų…Ø´ØēŲ„ Ø§Ų„ØšØ§Ø¯ŲŠ â€ĸ ؊ØĒŲ… ؁ØĒØ­ Shorts ؁؊ Ø§Ų„Ų…Ø´ØēŲ„ Ø§Ų„ØšØ§Ø¯ŲŠ
â€ĸ ؊ØĒŲ… ØĒŲ†Ø¸ŲŠŲ… Ø§Ų„ØŽŲ„Ø§ØĩØŠ Ø­ØŗØ¨ Ø§Ų„Ų…ŲˆØ§ØļŲŠØš ŲˆØ§Ų„Ų‚Ų†ŲˆØ§ØĒ"</string> â€ĸ ؊ØĒŲ… ØĒŲ†Ø¸ŲŠŲ… Ø§Ų„Ų…ŲˆØŦØ˛ Ø­ØŗØ¨ Ø§Ų„Ų…ŲˆØ§ØļŲŠØš ŲˆØ§Ų„Ų‚Ų†ŲˆØ§ØĒ"</string>
</patch> </patch>
<patch id="layout.spoofappversion.spoofAppVersionPatch"> <patch id="layout.spoofappversion.spoofAppVersionPatch">
<string name="revanced_spoof_app_version_title">ØŽŲØ¯Ø§Øš ØĨØĩØ¯Ø§Øą Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string> <string name="revanced_spoof_app_version_title">ØŽŲØ¯Ø§Øš ØĨØĩØ¯Ø§Øą Ø§Ų„ØĒØˇØ¨ŲŠŲ‚</string>
@@ -1154,6 +1155,7 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_type_entry_4">Ø­Ø¯ŲŠØĢ 1</string> <string name="revanced_miniplayer_type_entry_4">Ø­Ø¯ŲŠØĢ 1</string>
<string name="revanced_miniplayer_type_entry_5">Ø­Ø¯ŲŠØĢ 2</string> <string name="revanced_miniplayer_type_entry_5">Ø­Ø¯ŲŠØĢ 2</string>
<string name="revanced_miniplayer_type_entry_6">Ø­Ø¯ŲŠØĢ 3</string> <string name="revanced_miniplayer_type_entry_6">Ø­Ø¯ŲŠØĢ 3</string>
<string name="revanced_miniplayer_type_entry_7">Ø­Ø¯ŲŠØĢ 4</string>
<string name="revanced_miniplayer_rounded_corners_title">ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ø˛ŲˆØ§ŲŠØ§ Ø§Ų„Ų…ØŗØĒØ¯ŲŠØąØŠ</string> <string name="revanced_miniplayer_rounded_corners_title">ØĒŲ…ŲƒŲŠŲ† Ø§Ų„Ø˛ŲˆØ§ŲŠØ§ Ø§Ų„Ų…ØŗØĒØ¯ŲŠØąØŠ</string>
<string name="revanced_miniplayer_rounded_corners_summary_on">Ø§Ų„Ø˛ŲˆØ§ŲŠØ§ Ų…ØŗØĒØ¯ŲŠØąØŠ</string> <string name="revanced_miniplayer_rounded_corners_summary_on">Ø§Ų„Ø˛ŲˆØ§ŲŠØ§ Ų…ØŗØĒØ¯ŲŠØąØŠ</string>
<string name="revanced_miniplayer_rounded_corners_summary_off">Ø§Ų„Ø˛ŲˆØ§ŲŠØ§ Ų…ØąØ¨ØšØŠ</string> <string name="revanced_miniplayer_rounded_corners_summary_off">Ø§Ų„Ø˛ŲˆØ§ŲŠØ§ Ų…ØąØ¨ØšØŠ</string>
@@ -1173,14 +1175,14 @@ Second \"item\" text"</string>
ŲŠŲ…ŲƒŲ† ØŗØ­Ø¨ Ø§Ų„Ų…Ø´ØēŲ„ Ø§Ų„Ų…ØĩØēØą ØŽØ§ØąØŦ Ø§Ų„Ø´Ø§Ø´ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲŠØŗØ§Øą ØŖŲˆ Ø§Ų„ŲŠŲ…ŲŠŲ†"</string> ŲŠŲ…ŲƒŲ† ØŗØ­Ø¨ Ø§Ų„Ų…Ø´ØēŲ„ Ø§Ų„Ų…ØĩØēØą ØŽØ§ØąØŦ Ø§Ų„Ø´Ø§Ø´ØŠ ØĨŲ„Ų‰ Ø§Ų„ŲŠØŗØ§Øą ØŖŲˆ Ø§Ų„ŲŠŲ…ŲŠŲ†"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĨŲŠŲ…Ø§ØĄØŠ Ø§Ų„ØŗØ­Ø¨ Ø§Ų„ØŖŲŲ‚ŲŠØŠ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">ØĒŲ… ØĒØšØˇŲŠŲ„ ØĨŲŠŲ…Ø§ØĄØŠ Ø§Ų„ØŗØ­Ø¨ Ø§Ų„ØŖŲŲ‚ŲŠØŠ</string>
<string name="revanced_miniplayer_hide_expand_close_title">ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ŲˆØ§ØŦŲ‡ØŠ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ŲˆØ§ØŦŲ‡ØŠ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">؊ØĒŲ… ØšØąØļ Ø˛Øą Ø§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">؊ØĒŲ… ØšØąØļ ØŖØ˛ØąØ§Øą Ø§Ų„ŲˆØ§ØŦŲ‡ØŠ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">ØĨØŽŲØ§ØĄ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">ØĨØŽŲØ§ØĄ Ø˛ØąŲŠ Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ØŖØ˛ØąØ§Øą <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„ØŖØ˛ØąØ§Øą
Ų…ØąØą Ų„Ų„ØĒŲˆØŗŲŠØš ØŖŲˆ Ø§Ų„ØĨØēŲ„Ø§Ų‚"</string> Ø§ØŗØ­Ø¨ Ų„Ų„ØĒŲˆØŗŲŠØš ØŖŲˆ Ø§Ų„ØĨØēŲ„Ø§Ų‚"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">؊ØĒŲ… ØšØąØļ ØŖØ˛ØąØ§Øą Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">؊ØĒŲ… ØšØąØļ Ø˛ØąŲŠ Ø§Ų„ØĒŲˆØŗŲŠØš ŲˆØ§Ų„ØĨØēŲ„Ø§Ų‚</string>
<string name="revanced_miniplayer_hide_subtext_title">ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string> <string name="revanced_miniplayer_hide_subtext_title">ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string> <string name="revanced_miniplayer_hide_subtext_summary_on">ØĒŲ… ØĨØŽŲØ§ØĄ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string> <string name="revanced_miniplayer_hide_subtext_summary_off">؊ØĒŲ… ØšØąØļ Ø§Ų„Ų†Øĩ؈Øĩ Ø§Ų„ŲØąØšŲŠØŠ</string>
@@ -1216,7 +1218,7 @@ Second \"item\" text"</string>
</patch> </patch>
<patch id="layout.thumbnails.alternativeThumbnailsPatch"> <patch id="layout.thumbnails.alternativeThumbnailsPatch">
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. --> <!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
<string name="revanced_alt_thumbnail_home_title">ØšŲ„Ø§Ų…ØŠ ØĒØ¨ŲˆŲŠØ¨ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ</string> <string name="revanced_alt_thumbnail_home_title">ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨ Ø§Ų„ØĩŲØ­ØŠ Ø§Ų„ØąØĻŲŠØŗŲŠØŠ</string>
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. --> <!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
<string name="revanced_alt_thumbnail_subscription_title">ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string> <string name="revanced_alt_thumbnail_subscription_title">ØšŲ„Ø§Ų…ØŠ Ø§Ų„ØĒØ¨ŲˆŲŠØ¨ Ø§Ų„Ø§Ø´ØĒØąØ§ŲƒØ§ØĒ</string>
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. --> <!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. -->
@@ -1227,11 +1229,11 @@ Second \"item\" text"</string>
<string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Ø§Ų„Ų…ØĩŲ‘ØēØąØ§ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ</string> <string name="revanced_alt_thumbnail_options_entry_2">DeArrow &amp; Ø§Ų„Ų…ØĩŲ‘ØēØąØ§ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ</string>
<string name="revanced_alt_thumbnail_options_entry_3">DeArrow &amp; Ø§Ų„Ų„Ų‚ØˇØ§ØĒ Ø§Ų„ØĢابØĒØŠ</string> <string name="revanced_alt_thumbnail_options_entry_3">DeArrow &amp; Ø§Ų„Ų„Ų‚ØˇØ§ØĒ Ø§Ų„ØĢابØĒØŠ</string>
<string name="revanced_alt_thumbnail_options_entry_4">Ø§Ų„Ų„Ų‚ØˇØ§ØĒ Ø§Ų„ØĢابØĒØŠ</string> <string name="revanced_alt_thumbnail_options_entry_4">Ø§Ų„Ų„Ų‚ØˇØ§ØĒ Ø§Ų„ØĢابØĒØŠ</string>
<string name="revanced_alt_thumbnail_dearrow_about_summary">"ŲŠŲˆŲØą DeArrow Ų…ØĩØēØąØ§ØĒ ŲŲŠØ¯ŲŠŲˆ Ų…Ų† Ų…ØĩØ§Ø¯Øą ØŦŲ…Ø§ØšŲŠØŠ Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ YouTube. Ų‡Ø°Ų‡ Ø§Ų„Ų…ØĩØēØąØ§ØĒ ØēØ§Ų„Ø¨Ø§ Ų…Ø§ ØĒŲƒŲˆŲ† ØŖŲƒØĢØą ØĩŲ„ØŠ Ų…Ų† ØĒŲ„Ųƒ Ø§Ų„Ų…Ų‚Ø¯Ų…ØŠ Ų…Ų† YouTube <string name="revanced_alt_thumbnail_dearrow_about_summary">"ŲŠŲˆŲØą DeArrow Ų…ØĩØēØąØ§ØĒ ŲŲŠØ¯ŲŠŲˆ Ų…Ų† Ų…ØĩØ§Ø¯Øą ØŦŲ…Ø§ØšŲŠØŠ Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ YouTube. Ų‡Ø°Ų‡ Ø§Ų„Ų…ØĩØēØąØ§ØĒ ØēØ§Ų„Ø¨Ų‹Ø§ Ų…Ø§ ØĒŲƒŲˆŲ† ØŖŲƒØĢØą ØĩŲ„ØŠ Ų…Ų† ØĒŲ„Ųƒ Ø§Ų„Ų…Ų‚Ø¯Ų…ØŠ Ų…Ų† YouTube
ØĨذا ØĒŲ… ØĒŲØšŲŠŲ„Ų‡Ø§ØŒ ØŗŲŠØĒŲ… ØĨØąØŗØ§Ų„ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ ØĨŲ„Ų‰ ØŽØ§Ø¯Ų… API ŲˆŲ„Ų† ؊ØĒŲ… ØĨØąØŗØ§Ų„ ØŖŲŠ Ø¨ŲŠØ§Ų†Ø§ØĒ ØŖØŽØąŲ‰. ØĨذا ŲƒØ§Ų† Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ų„Ø§ ŲŠØ­ØĒ؈؊ ØšŲ„Ų‰ Ų…ØĩØēØąØ§ØĒ DArrow، ØŗŲŠØĒŲ… ØšØąØļ Ø§Ų„Ų…Ų‚Ø§ØˇØš Ø§Ų„ØŖØĩŲ„ŲŠØŠ ØŖŲˆ Ø§Ų„Ų„Ų‚ØˇØ§ØĒ Ø§Ų„ØĢابØĒØŠ ØĨذا ØĒŲ… ØĒŲØšŲŠŲ„Ų‡Ø§ØŒ ØŗŲŠØĒŲ… ØĨØąØŗØ§Ų„ ØąŲˆØ§Ø¨Øˇ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ ØĨŲ„Ų‰ ØŽØ§Ø¯Ų… API ŲˆŲ„Ų† ؊ØĒŲ… ØĨØąØŗØ§Ų„ ØŖŲŠ Ø¨ŲŠØ§Ų†Ø§ØĒ ØŖØŽØąŲ‰. ØĨذا ŲƒØ§Ų† Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ų„Ø§ ŲŠØ­ØĒ؈؊ ØšŲ„Ų‰ Ų…ØĩØēØąØ§ØĒ DeArrow، ØŗŲŠØĒŲ… ØšØąØļ Ø§Ų„Ų…Ų‚Ø§ØˇØš Ø§Ų„ØŖØĩŲ„ŲŠØŠ ØŖŲˆ Ø§Ų„Ų„Ų‚ØˇØ§ØĒ Ø§Ų„ØĢابØĒØŠ
اØļØēØˇ Ų‡Ų†Ø§ Ų„Ų…ØšØąŲØŠ Ø§Ų„Ų…Ø˛ŲŠØ¯ ØšŲ† DArrow"</string> اØļØēØˇ Ų‡Ų†Ø§ Ų„Ų…ØšØąŲØŠ Ø§Ų„Ų…Ø˛ŲŠØ¯ ØšŲ† DeArrow"</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_title">ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØĨذا ŲƒØ§Ų† API ØēŲŠØą Ų…ØĒاح</string> <string name="revanced_alt_thumbnail_dearrow_connection_toast_title">ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØĨذا ŲƒØ§Ų† API ØēŲŠØą Ų…ØĒاح</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØĨذا ŲƒØ§Ų† DeArrow ØēŲŠØą Ų…ØĒŲˆŲØą</string> <string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_on">؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØĨذا ŲƒØ§Ų† DeArrow ØēŲŠØą Ų…ØĒŲˆŲØą</string>
<string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØĨذا ŲƒØ§Ų† DeArrow ØēŲŠØą Ų…ØĒŲˆŲØą</string> <string name="revanced_alt_thumbnail_dearrow_connection_toast_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų…Ų„Ø§Ø­Ø¸ØŠ ØĨذا ŲƒØ§Ų† DeArrow ØēŲŠØą Ų…ØĒŲˆŲØą</string>
@@ -1307,7 +1309,7 @@ Second \"item\" text"</string>
<string name="revanced_force_original_audio_summary_on">Ø§ØŗØĒØŽØ¯Ø§Ų… Ų„ØēØŠ Ø§Ų„Øĩ؈ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ</string> <string name="revanced_force_original_audio_summary_on">Ø§ØŗØĒØŽØ¯Ø§Ų… Ų„ØēØŠ Ø§Ų„Øĩ؈ØĒ Ø§Ų„ØŖØĩŲ„ŲŠØŠ</string>
<string name="revanced_force_original_audio_summary_off">Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Øĩ؈ØĒ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊</string> <string name="revanced_force_original_audio_summary_off">Ø§ØŗØĒØŽØ¯Ø§Ų… Ø§Ų„Øĩ؈ØĒ Ø§Ų„Ø§ŲØĒØąØ§Øļ؊</string>
<!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title --> <!-- 'Spoof video streams' should be the same translation used for revanced_spoof_video_streams_screen_title -->
<string name="revanced_force_original_audio_not_available">Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠØŒ ØēŲŠŲ‘Øą \"Ø§Ų†ØĒØ­Ø§Ų„ Ø¯ŲŲ‚Ø§ØĒ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ\" ØĨŲ„Ų‰ iOS TV</string> <string name="revanced_force_original_audio_not_available">Ų„Ø§ØŗØĒØŽØ¯Ø§Ų… Ų‡Ø°Ų‡ Ø§Ų„Ų…ŲŠØ˛ØŠØŒ ØēŲŠŲ‘Øą \'Spoof Video Streams\' ØĨŲ„Ų‰ iOS TV</string>
</patch> </patch>
<patch id="video.quality.rememberVideoQualityPatch"> <patch id="video.quality.rememberVideoQualityPatch">
<!-- Translations should use the same text as revanced_custom_playback_speeds_auto --> <!-- Translations should use the same text as revanced_custom_playback_speeds_auto -->
@@ -1321,7 +1323,7 @@ Second \"item\" text"</string>
<string name="revanced_remember_shorts_quality_last_selected_summary_on">ØĒŲ†ØˇØ¨Ų‚ ØĒØēŲŠŲŠØąØ§ØĒ Ø§Ų„ØŦŲˆØ¯ØŠ ØšŲ„Ų‰ ØŦŲ…ŲŠØš ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Shorts</string> <string name="revanced_remember_shorts_quality_last_selected_summary_on">ØĒŲ†ØˇØ¨Ų‚ ØĒØēŲŠŲŠØąØ§ØĒ Ø§Ų„ØŦŲˆØ¯ØŠ ØšŲ„Ų‰ ØŦŲ…ŲŠØš ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Shorts</string>
<string name="revanced_remember_shorts_quality_last_selected_summary_off">ØĒŲ†ØˇØ¨Ų‚ ØĒØēŲŠŲŠØąØ§ØĒ Ø§Ų„ØŦŲˆØ¯ØŠ ŲŲ‚Øˇ ØšŲ„Ų‰ ŲŲŠØ¯ŲŠŲˆ Short Ø§Ų„Ø­Ø§Ų„ŲŠ</string> <string name="revanced_remember_shorts_quality_last_selected_summary_off">ØĒŲ†ØˇØ¨Ų‚ ØĒØēŲŠŲŠØąØ§ØĒ Ø§Ų„ØŦŲˆØ¯ØŠ ŲŲ‚Øˇ ØšŲ„Ų‰ ŲŲŠØ¯ŲŠŲˆ Short Ø§Ų„Ø­Ø§Ų„ŲŠ</string>
<string name="revanced_shorts_quality_default_wifi_title">ØŦŲˆØ¯ØŠ Shorts Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ ØšŲ„Ų‰ Ø´Ø¨ŲƒØŠ Wi-Fi</string> <string name="revanced_shorts_quality_default_wifi_title">ØŦŲˆØ¯ØŠ Shorts Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ ØšŲ„Ų‰ Ø´Ø¨ŲƒØŠ Wi-Fi</string>
<string name="revanced_shorts_quality_default_mobile_title">ØŦŲˆØ¯ØŠ Shorts Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ ØšŲ„Ų‰ Ø´Ø¨ŲƒØŠ Ø§Ų„ØŦŲˆØ§Ų„</string> <string name="revanced_shorts_quality_default_mobile_title">ØŦŲˆØ¯ØŠ Shorts Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ ØšŲ„Ų‰ Ø´Ø¨ŲƒØŠ Ø§Ų„ØŦŲˆŲ‘Ø§Ų„</string>
<string name="revanced_remember_video_quality_mobile">Ø§Ų„ØŦŲˆŲ‘Ø§Ų„</string> <string name="revanced_remember_video_quality_mobile">Ø§Ų„ØŦŲˆŲ‘Ø§Ų„</string>
<string name="revanced_remember_video_quality_wifi">Wi-Fi</string> <string name="revanced_remember_video_quality_wifi">Wi-Fi</string>
<string name="revanced_remember_video_quality_toast">ØĒŲ… ØĒØēŲŠŲŠØą ØŦŲˆØ¯ØŠ %1$s Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ ØĨŲ„Ų‰: %2$s</string> <string name="revanced_remember_video_quality_toast">ØĒŲ… ØĒØēŲŠŲŠØą ØŦŲˆØ¯ØŠ %1$s Ø§Ų„Ø§ŲØĒØąØ§ØļŲŠØŠ ØĨŲ„Ų‰: %2$s</string>
@@ -1357,7 +1359,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_hdr_video_summary_off">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† ŲŲŠØ¯ŲŠŲˆ HDR</string> <string name="revanced_disable_hdr_video_summary_off">ØĒŲ… ØĒŲ…ŲƒŲŠŲ† ŲŲŠØ¯ŲŠŲˆ HDR</string>
</patch> </patch>
<patch id="video.quality.advancedVideoQualityMenuPatch"> <patch id="video.quality.advancedVideoQualityMenuPatch">
<string name="revanced_advanced_video_quality_menu_title">ØĨØ¸Ų‡Ø§Øą Ų‚Ø§ØĻŲ…ØŠ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲ‚Ø¯Ų…ØŠ</string> <string name="revanced_advanced_video_quality_menu_title">ØšØąØļ Ų‚Ø§ØĻŲ…ØŠ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲ‚Ø¯Ų…ØŠ</string>
<string name="revanced_advanced_video_quality_menu_summary_on">؊ØĒŲ… ØšØąØļ Ų‚Ø§ØĻŲ…ØŠ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲ‚Ø¯Ų…ØŠ</string> <string name="revanced_advanced_video_quality_menu_summary_on">؊ØĒŲ… ØšØąØļ Ų‚Ø§ØĻŲ…ØŠ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲ‚Ø¯Ų…ØŠ</string>
<string name="revanced_advanced_video_quality_menu_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų‚Ø§ØĻŲ…ØŠ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲ‚Ø¯Ų…ØŠ</string> <string name="revanced_advanced_video_quality_menu_summary_off">Ų„Ø§ ؊ØĒŲ… ØšØąØļ Ų‚Ø§ØĻŲ…ØŠ ØŦŲˆØ¯ØŠ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ Ø§Ų„Ų…ØĒŲ‚Ø¯Ų…ØŠ</string>
</patch> </patch>
@@ -1391,7 +1393,7 @@ AVC Ų„Ø¯ŲŠŲ‡ حد ØŖŲ‚ØĩŲ‰ Ų„Ų„Ø¯Ų‚ØŠ 1080p، Ų„Ø§ ؊ØĒŲˆŲØą ØĒØąŲ…ŲŠØ˛ Ø§Ų„Øĩ
â€ĸ Ų…ØŗØĒŲˆŲ‰ Ø§Ų„Øĩ؈ØĒ Ø§Ų„ØĢابØĒ ØēŲŠØą Ų…ØĒاح â€ĸ Ų…ØŗØĒŲˆŲ‰ Ø§Ų„Øĩ؈ØĒ Ø§Ų„ØĢابØĒ ØēŲŠØą Ų…ØĒاح
â€ĸ ŲØąØļ Ø§Ų„Øĩ؈ØĒ Ø§Ų„ØŖØĩŲ„ŲŠ ØēŲŠØą Ų…ØĒŲˆŲØą"</string> â€ĸ ŲØąØļ Ø§Ų„Øĩ؈ØĒ Ø§Ų„ØŖØĩŲ„ŲŠ ØēŲŠØą Ų…ØĒŲˆŲØą"</string>
<string name="revanced_spoof_video_streams_about_no_av1">â€ĸ Ų„Ø§ ؊؈ØŦد ØĒØąŲ…ŲŠØ˛ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ AV1</string> <string name="revanced_spoof_video_streams_about_no_av1">â€ĸ Ų„Ø§ ؊؈ØŦد ØĒØąŲ…ŲŠØ˛ Ø§Ų„ŲŲŠØ¯ŲŠŲˆ AV1</string>
<string name="revanced_spoof_video_streams_about_kids_videos">â€ĸ Ø§Ų„ŲŲŠØ¯ŲŠŲˆØ§ØĒ Ø§Ų„ØšØąØ¨ŲŠØŠ Ų„Ø§ ŲŠŲ…ŲƒŲ† ØĒØ´ØēŲŠŲ„ ØŖŲˆ ؁؊ ؈ØļØš Ø§Ų„ØĒØ´ØēŲŠŲ„ ØŖŲˆ ؁؊ Ø­Ø§Ų„ØŠ Ø§Ų„ØŽŲŲŠØŠ</string> <string name="revanced_spoof_video_streams_about_kids_videos">â€ĸ Ų‚Ø¯ Ų„Ø§ ؊ØĒŲ… ØĒØ´ØēŲŠŲ„ Ø§Ų„ŲŲŠØ¯ŲŠŲˆŲ‡Ø§ØĒ Ø§Ų„Ų…ØŽØĩØĩØŠ Ų„Ų„ØŖØˇŲØ§Ų„ ØšŲ†Ø¯ ØĒØŗØŦŲŠŲ„ Ø§Ų„ØŽØąŲˆØŦ ØŖŲˆ ØšŲ†Ø¯ Ø§ØŗØĒØŽØ¯Ø§Ų… ؈ØļØš Ø§Ų„ØĒØĩŲØ­ Ø§Ų„Ų…ØĒØŽŲŲŠ</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_title">ØšØąØļ ؁؊ ØĨØ­ØĩØ§ØĄØ§ØĒ ØĒŲ‚Ų†ŲŠØŠ</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_title">ØšØąØļ ؁؊ ØĨØ­ØĩØ§ØĄØ§ØĒ ØĒŲ‚Ų†ŲŠØŠ</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">؊ØĒŲ… ØšØąØļ Ų†ŲˆØš Ø§Ų„ØšŲ…ŲŠŲ„ ؁؊ ØĨØ­ØĩØ§ØĄØ§ØĒ ØĒŲ‚Ų†ŲŠØŠ</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_on">؊ØĒŲ… ØšØąØļ Ų†ŲˆØš Ø§Ų„ØšŲ…ŲŠŲ„ ؁؊ ØĨØ­ØĩØ§ØĄØ§ØĒ ØĒŲ‚Ų†ŲŠØŠ</string>
<string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">ØĒŲ… ØĨØŽŲØ§ØĄ Ų†ŲˆØš Ø§Ų„ØšŲ…ŲŠŲ„ ؁؊ ØĨØ­ØĩØ§ØĄØ§ØĒ ØĒŲ‚Ų†ŲŠØŠ</string> <string name="revanced_spoof_streaming_data_stats_for_nerds_summary_off">ØĒŲ… ØĨØŽŲØ§ØĄ Ų†ŲˆØš Ø§Ų„ØšŲ…ŲŠŲ„ ؁؊ ØĨØ­ØĩØ§ØĄØ§ØĒ ØĒŲ‚Ų†ŲŠØŠ</string>

View File

@@ -226,6 +226,9 @@ GÃļzlənilməz hallardan xəbərdar olmayacaqsÄąnÄąz."</string>
<string name="revanced_hide_artist_cards_title">Sənətçi kartlarÄąnÄą gizlət</string> <string name="revanced_hide_artist_cards_title">Sənətçi kartlarÄąnÄą gizlət</string>
<string name="revanced_hide_artist_cards_summary_on">Sənətçi kartlarÄą gizlidir</string> <string name="revanced_hide_artist_cards_summary_on">Sənətçi kartlarÄą gizlidir</string>
<string name="revanced_hide_artist_cards_summary_off">Sənətçi kartlarÄą gÃļstərilir</string> <string name="revanced_hide_artist_cards_summary_off">Sənətçi kartlarÄą gÃļstərilir</string>
<string name="revanced_hide_ai_generated_video_summary_section_title">\"AI ilə yaradÄąlan video xÃŧlasəsini\" gizlət</string>
<string name="revanced_hide_ai_generated_video_summary_section_summary_on">Video xÃŧlasə bÃļlməsi gizlədilib</string>
<string name="revanced_hide_ai_generated_video_summary_section_summary_off">Video xÃŧlasə bÃļlməsi gÃļstərilir</string>
<string name="revanced_hide_attributes_section_title">Atributları Gizlət</string> <string name="revanced_hide_attributes_section_title">Atributları Gizlət</string>
<string name="revanced_hide_attributes_section_summary_on">Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bÃļlmələri gizlədilir</string> <string name="revanced_hide_attributes_section_summary_on">Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bÃļlmələri gizlədilir</string>
<string name="revanced_hide_attributes_section_summary_off">Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bÃļlmələri gÃļrÃŧnÃŧr</string> <string name="revanced_hide_attributes_section_summary_off">Seçilən yerlər, Oyunlar, Musiqi və qeyd edilən insanlar bÃļlmələri gÃļrÃŧnÃŧr</string>
@@ -262,8 +265,12 @@ GÃļzlənilməz hallardan xəbərdar olmayacaqsÄąnÄąz."</string>
<string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Əlaqəli videolarda gÃļrÃŧnÃŧr</string> <string name="revanced_hide_filter_bar_feed_in_related_videos_summary_off">Əlaqəli videolarda gÃļrÃŧnÃŧr</string>
<string name="revanced_comments_screen_title">Şərhlər</string> <string name="revanced_comments_screen_title">Şərhlər</string>
<string name="revanced_comments_screen_summary">Şərhlər bÃļlməsi elementlərin gizlət və ya gÃļstər</string> <string name="revanced_comments_screen_summary">Şərhlər bÃļlməsi elementlərin gizlət və ya gÃļstər</string>
<string name="revanced_hide_comments_ai_chat_summary_title">AI SÃļhbət XÃŧlasəsini Gizlət</string>
<string name="revanced_hide_comments_ai_chat_summary_summary_on">SÃļhbət yekunu gizlidir </string> <string name="revanced_hide_comments_ai_chat_summary_summary_on">SÃļhbət yekunu gizlidir </string>
<string name="revanced_hide_comments_ai_chat_summary_summary_off">SÃļhbət yekunu gÃļrÃŧnÃŧr</string> <string name="revanced_hide_comments_ai_chat_summary_summary_off">SÃļhbət yekunu gÃļrÃŧnÃŧr</string>
<string name="revanced_hide_comments_ai_summary_title">AI ášĸərhlər XÃŧlasəsini Gizlət</string>
<string name="revanced_hide_comments_ai_summary_summary_on">ášĸərh yekunu gizlidir </string>
<string name="revanced_hide_comments_ai_summary_summary_off">Şərh yekunu gÃļrÃŧnÃŧr</string>
<string name="revanced_hide_comments_by_members_header_title">\'Üzvlərin şərhləri\' başlığınÄą gizlət</string> <string name="revanced_hide_comments_by_members_header_title">\'Üzvlərin şərhləri\' başlığınÄą gizlət</string>
<string name="revanced_hide_comments_by_members_header_summary_on">Üzvlərin şərhləri başlığı gizlidir</string> <string name="revanced_hide_comments_by_members_header_summary_on">Üzvlərin şərhləri başlığı gizlidir</string>
<string name="revanced_hide_comments_by_members_header_summary_off">Üzvlərin şərhləri başlığı gÃļrÃŧnÃŧr</string> <string name="revanced_hide_comments_by_members_header_summary_off">Üzvlərin şərhləri başlığı gÃļrÃŧnÃŧr</string>
@@ -423,6 +430,9 @@ Bu xÃŧsusiyyət yalnÄąz kÃļhnə cihazlar ÃŧçÃŧn mÃļvcuddur"</string>
<string name="revanced_disable_precise_seeking_gesture_summary_off">Jest aktivləşdirilib</string> <string name="revanced_disable_precise_seeking_gesture_summary_off">Jest aktivləşdirilib</string>
</patch> </patch>
<patch id="interaction.seekbar.enableSeekbarTappingPatch"> <patch id="interaction.seekbar.enableSeekbarTappingPatch">
<string name="revanced_seekbar_tapping_title">Axtarmaq ÃŧçÃŧn toxun\'u aktivləşdir</string>
<string name="revanced_seekbar_tapping_summary_on">Axtarmaq ÃŧçÃŧn toxun, aktivdir</string>
<string name="revanced_seekbar_tapping_summary_off">Axtarmaq ÃŧçÃŧn toxun qapalÄądÄąr</string>
</patch> </patch>
<patch id="interaction.swipecontrols.swipeControlsResourcePatch"> <patch id="interaction.swipecontrols.swipeControlsResourcePatch">
<string name="revanced_swipe_brightness_title">ParlaqlÄąq jestini aktivləşdir</string> <string name="revanced_swipe_brightness_title">ParlaqlÄąq jestini aktivləşdir</string>
@@ -435,6 +445,9 @@ EkranÄąn sol tərəfində dikinə sÃŧrÃŧşdÃŧrərək parlaqlığı tənzimləyin
EkranÄąn sağ tərəfində dÃŧzÃŧnə sÃŧrÃŧşdÃŧrərək səs səviyyəsini tənzimlə"</string> EkranÄąn sağ tərəfində dÃŧzÃŧnə sÃŧrÃŧşdÃŧrərək səs səviyyəsini tənzimlə"</string>
<string name="revanced_swipe_volume_summary_off">Tam ekran səs sÃŧrÃŧşdÃŧrməsi qapalÄądÄąr</string> <string name="revanced_swipe_volume_summary_off">Tam ekran səs sÃŧrÃŧşdÃŧrməsi qapalÄądÄąr</string>
<string name="revanced_swipe_press_to_engage_title">SÃŧrÃŧşdÃŧrmə jesti ÃŧçÃŧn sÄąxmanÄą aktiv et</string>
<string name="revanced_swipe_press_to_engage_summary_on">SÃŧrÃŧşdÃŧrmə ÃŧçÃŧn sÄąxma aktivdir</string>
<string name="revanced_swipe_press_to_engage_summary_off">SÃŧrÃŧşdÃŧrmə ÃŧçÃŧn sÄąxma qapalÄądÄąr</string>
<string name="revanced_swipe_haptic_feedback_title">Əks-əlaqə reaksiyasÄąnÄą aktivləşdir</string> <string name="revanced_swipe_haptic_feedback_title">Əks-əlaqə reaksiyasÄąnÄą aktivləşdir</string>
<string name="revanced_swipe_haptic_feedback_summary_on">Əks-əlaqə reaksiyasÄą aktivləşdirilib</string> <string name="revanced_swipe_haptic_feedback_summary_on">Əks-əlaqə reaksiyasÄą aktivləşdirilib</string>
<string name="revanced_swipe_haptic_feedback_summary_off">Əks-əlaqə reaksiyasÄą qeyri-aktivdir</string> <string name="revanced_swipe_haptic_feedback_summary_off">Əks-əlaqə reaksiyasÄą qeyri-aktivdir</string>
@@ -542,6 +555,7 @@ Bu seçimi dəyişdirmə işə dÃŧşmÃŧrsə, Gizli rejimə keçməyə çalÄąÅŸÄą
<string name="revanced_disable_translucent_status_bar_title">YarÄąmşəffaf mÃļvqe cizgisin qapat</string> <string name="revanced_disable_translucent_status_bar_title">YarÄąmşəffaf mÃļvqe cizgisin qapat</string>
<string name="revanced_disable_translucent_status_bar_summary_on">MÃļvqe cizgisi qeyri-şəffafdÄąr</string> <string name="revanced_disable_translucent_status_bar_summary_on">MÃļvqe cizgisi qeyri-şəffafdÄąr</string>
<string name="revanced_disable_translucent_status_bar_summary_off">MÃļvqe cizgisi qeyri-şəffaf və ya şəffafdÄąr</string> <string name="revanced_disable_translucent_status_bar_summary_off">MÃļvqe cizgisi qeyri-şəffaf və ya şəffafdÄąr</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">Bəzi cihazlarda bu xÃŧsusiyyət aktivləşməsi sistem fəaliyyət cərgəsini şəffaf-a dəyişə bilər.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">AÃ§Äąq temada şəffaf cizgini qapat</string> <string name="revanced_disable_translucent_navigation_bar_light_title">AÃ§Äąq temada şəffaf cizgini qapat</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">Ä°ÅŸÄąqlÄą rejim fəaliyyət cərgəsi qeyri-şəffafdÄąr</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">Ä°ÅŸÄąqlÄą rejim fəaliyyət cərgəsi qeyri-şəffafdÄąr</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">Ä°ÅŸÄąqlÄą rejim fəaliyyət cərgəsi qeyri-şəffaf və ya şəffafdÄąr</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">Ä°ÅŸÄąqlÄą rejim fəaliyyət cərgəsi qeyri-şəffaf və ya şəffafdÄąr</string>
@@ -1140,6 +1154,7 @@ Sonradan qapadÄąlarsa, UI səhvlərin Ãļnləmək ÃŧçÃŧn tətbiq məlumatlarÄąn
<string name="revanced_miniplayer_type_entry_4">MÃŧasir 1</string> <string name="revanced_miniplayer_type_entry_4">MÃŧasir 1</string>
<string name="revanced_miniplayer_type_entry_5">MÃŧasir 2</string> <string name="revanced_miniplayer_type_entry_5">MÃŧasir 2</string>
<string name="revanced_miniplayer_type_entry_6">MÃŧasir 3</string> <string name="revanced_miniplayer_type_entry_6">MÃŧasir 3</string>
<string name="revanced_miniplayer_type_entry_7">MÃŧasir 4</string>
<string name="revanced_miniplayer_rounded_corners_title">Dairəvi kÃŧncləri aktivləşdir</string> <string name="revanced_miniplayer_rounded_corners_title">Dairəvi kÃŧncləri aktivləşdir</string>
<string name="revanced_miniplayer_rounded_corners_summary_on">KÃŧnclər dairəvidir</string> <string name="revanced_miniplayer_rounded_corners_summary_on">KÃŧnclər dairəvidir</string>
<string name="revanced_miniplayer_rounded_corners_summary_off">KÃŧnclər kvadratdÄąr</string> <string name="revanced_miniplayer_rounded_corners_summary_off">KÃŧnclər kvadratdÄąr</string>
@@ -1159,14 +1174,14 @@ Kiçik oynadÄącÄą ekranÄąn istənilən kÃŧncÃŧnə sÃŧrÃŧklənə bilər"</string>
Kiçik oynadÄącÄą ekrandan sola və ya sağa sÃŧrÃŧklənə bilər"</string> Kiçik oynadÄącÄą ekrandan sola və ya sağa sÃŧrÃŧklənə bilər"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">ÜfÃŧqi sÃŧrÃŧkləmə jesti qapatÄąldÄą</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">ÜfÃŧqi sÃŧrÃŧkləmə jesti qapatÄąldÄą</string>
<string name="revanced_miniplayer_hide_expand_close_title">\"Bağla\" dÃŧyməsini gizlət</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ÖrtÃŧk dÃŧymələrini gizlət</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">\"Bağla\" dÃŧyməsi gizlidir</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">ÖrtÃŧk dÃŧymələri gizlidir</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">\"Bağla\" dÃŧyməsi gÃļstərilir</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">ÖrtÃŧk dÃŧymələri gÃļrÃŧnÃŧr</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">Genişləndir və bağla dÃŧymələrini gizlət</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">Genişləndir və bağla dÃŧymələrini gizlət</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"DÃŧymələr gizlidir <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"DÃŧymələr gizlidir
Genişləndirmək və ya bağlamaq ÃŧçÃŧn sÃŧrÃŧşdÃŧr"</string> Genişləndirmək və ya bağlamaq ÃŧçÃŧn sÃŧrÃŧşdÃŧr"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">Genişləndir və bağla dÃŧymələri gÃļstərilir</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Genişləndir və bağla dÃŧymələri gÃļstərilir</string>
<string name="revanced_miniplayer_hide_subtext_title">Alt mətnləri gizlət</string> <string name="revanced_miniplayer_hide_subtext_title">Alt mətnləri gizlət</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">Alt mətnlər gizlədilir</string> <string name="revanced_miniplayer_hide_subtext_summary_on">Alt mətnlər gizlədilir</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">Alt mətnlər gÃļstərilir</string> <string name="revanced_miniplayer_hide_subtext_summary_off">Alt mətnlər gÃļstərilir</string>

View File

@@ -555,6 +555,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_translucent_status_bar_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃</string> <string name="revanced_disable_translucent_status_bar_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃</string>
<string name="revanced_disable_translucent_status_bar_summary_on">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string> <string name="revanced_disable_translucent_status_bar_summary_on">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string>
<string name="revanced_disable_translucent_status_bar_summary_off">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string> <string name="revanced_disable_translucent_status_bar_summary_off">ПаĐŊŅĐģҌ ŅŅ‚Đ°ĐŊ҃ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">На ĐŊĐĩĐēĐ°Ņ‚ĐžŅ€Ņ‹Ņ… ĐŋҀҋĐģĐ°Đ´Đ°Ņ… ҃ĐēĐģŅŽŅ‡ŅĐŊĐŊĐĩ ĐŗŅŅ‚Đ°Đš Ņ„ŅƒĐŊĐē҆ҋҖ ĐŧĐžĐļа СĐŧŅĐŊŅ–Ņ†ŅŒ ĐŋаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– ŅŅ–ŅŅ‚ŅĐŧŅ‹ ĐŊа ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅĐ˛ĐĩŅ‚ĐģŅƒŅŽ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ</string> <string name="revanced_disable_translucent_navigation_bar_light_title">АдĐēĐģŅŽŅ‡Ņ‹Ņ†ŅŒ ŅĐ˛ĐĩŅ‚ĐģŅƒŅŽ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚ŅƒŅŽ ĐŋаĐŊŅĐģҌ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģŅ‹Đŧ Ņ€ŅĐļŅ‹ĐŧĐĩ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģŅ‹Đŧ Ņ€ŅĐļŅ‹ĐŧĐĩ ĐŊĐĩĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģаК Ņ‚ŅĐŧĐĩ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">ПаĐŊŅĐģҌ ĐŊĐ°Đ˛Ņ–ĐŗĐ°Ņ†Ņ‹Ņ– Ņž ŅĐ˛ĐĩŅ‚ĐģаК Ņ‚ŅĐŧĐĩ ĐŊŅĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ ҆Җ ĐŋŅ€Đ°ĐˇŅ€Ņ‹ŅŅ‚Đ°Ņ.</string>
@@ -1155,6 +1156,7 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_type_entry_4">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 1</string> <string name="revanced_miniplayer_type_entry_4">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 1</string>
<string name="revanced_miniplayer_type_entry_5">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 2</string> <string name="revanced_miniplayer_type_entry_5">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 2</string>
<string name="revanced_miniplayer_type_entry_6">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 3</string> <string name="revanced_miniplayer_type_entry_6">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 3</string>
<string name="revanced_miniplayer_type_entry_7">ĐĄŅƒŅ‡Đ°ŅĐŊŅ‹ 4</string>
<string name="revanced_miniplayer_rounded_corners_title">ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ СаĐēŅ€ŅƒĐŗĐģĐĩĐŊĐŊŅ‹Đĩ ŅƒĐŗĐģŅ‹</string> <string name="revanced_miniplayer_rounded_corners_title">ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ СаĐēŅ€ŅƒĐŗĐģĐĩĐŊĐŊŅ‹Đĩ ŅƒĐŗĐģŅ‹</string>
<string name="revanced_miniplayer_rounded_corners_summary_on">ĐŖĐŗĐģŅ‹ СаĐēŅ€ŅƒĐŗĐģĐĩĐŊŅ‹</string> <string name="revanced_miniplayer_rounded_corners_summary_on">ĐŖĐŗĐģŅ‹ СаĐēŅ€ŅƒĐŗĐģĐĩĐŊŅ‹</string>
<string name="revanced_miniplayer_rounded_corners_summary_off">ĐŖĐŗĐģŅ‹ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊŅ‹Đĩ</string> <string name="revanced_miniplayer_rounded_corners_summary_off">ĐŖĐŗĐģŅ‹ ĐēĐ˛Đ°Đ´Ņ€Đ°Ņ‚ĐŊŅ‹Đĩ</string>
@@ -1174,14 +1176,14 @@ Second \"item\" text"</string>
ĐœŅ–ĐŊŅ–-ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐģҌĐŊŅ–Đē ĐŧĐžĐļĐŊа ĐŋĐĩŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ Са ĐŧĐĩĐļŅ‹ ŅĐēŅ€Đ°ĐŊа ŅžĐģĐĩва ҆Җ ŅžĐŋŅ€Đ°Đ˛Đ°"</string> ĐœŅ–ĐŊŅ–-ĐŋŅ€Đ°ĐšĐŗŅ€Đ°Đ˛Đ°ĐģҌĐŊŅ–Đē ĐŧĐžĐļĐŊа ĐŋĐĩŅ€Đ°Ņ†ŅĐŗĐŊŅƒŅ†ŅŒ Са ĐŧĐĩĐļŅ‹ ŅĐēŅ€Đ°ĐŊа ŅžĐģĐĩва ҆Җ ŅžĐŋŅ€Đ°Đ˛Đ°"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">Đ“ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đš ĐļĐĩҁ҂ ĐŋĐĩŅ€ĐĩŅ‚Đ°ŅĐēиваĐŊĐ¸Ņ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">Đ“ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đš ĐļĐĩҁ҂ ĐŋĐĩŅ€ĐĩŅ‚Đ°ŅĐēиваĐŊĐ¸Ņ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ</string>
<string name="revanced_miniplayer_hide_expand_close_title">ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐēĐŊĐžĐŋĐē҃ СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐēŅ– ĐŊаĐēĐģадаĐŊĐŊŅ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">КĐŊĐžĐŋĐēа СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ ҁĐēŅ€Ņ‹Ņ‚Đ°</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">КĐŊĐžĐŋĐēŅ– ĐŊаĐēĐģадаĐŊĐŊŅ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹Ņ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">КĐŊĐžĐŋĐēа СаĐēŅ€Ņ‹Ņ‚Đ¸Ņ ĐžŅ‚ĐžĐąŅ€Đ°ĐļаĐĩŅ‚ŅŅ</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">КĐŊĐžĐŋĐēŅ– ĐŊаĐēĐģадаĐŊĐŊŅ ĐŋаĐēаСаĐŊŅ‹</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐžŅ€Ņ‚Đ˛Đ°ĐŊĐŊŅ Ņ– СаĐēŅ€Ņ‹Ņ†Ņ†Ņ</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐžŅ€Ņ‚Đ˛Đ°ĐŊĐŊŅ Ņ– СаĐēŅ€Ņ‹Ņ†Ņ†Ņ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"КĐŊĐžĐŋĐēŅ– ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹ <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"КĐŊĐžĐŋĐēŅ– ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹Ņ
ĐŸŅ€Đ°Ņ†ŅĐŗĐ˛Đ°ĐšŅ†Đĩ ĐŋаĐģŅŒŅ†Đ°Đŧ, Đēай Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ айО СаĐēŅ€Ņ‹Ņ†ŅŒ"</string> ĐŸŅ€Đ°Đ˛ŅĐ´ĐˇŅ–Ņ†Đĩ ĐŋаĐģŅŒŅ†Đ°Đŧ, Đēай Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ ҆Җ СаĐēŅ€Ņ‹Ņ†ŅŒ"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐēĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐ°Ņ€ĐŊŅƒŅ†ŅŒ Ņ– СаĐēŅ€Ņ‹Ņ†ŅŒ</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">КĐŊĐžĐŋĐēŅ– Ņ€Đ°ĐˇĐŗĐžŅ€Ņ‚Đ˛Đ°ĐŊĐŊŅ Ņ– СаĐēŅ€Ņ‹Ņ†Ņ†Ņ ĐŋаĐēаСаĐŊŅ‹</string>
<string name="revanced_miniplayer_hide_subtext_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string> <string name="revanced_miniplayer_hide_subtext_title">ĐĄŅ…Đ°Đ˛Đ°Ņ†ŅŒ ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ĐŸĐ°Đ´Ņ‚ŅĐēҁ҂ҋ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹Ņ</string> <string name="revanced_miniplayer_hide_subtext_summary_on">ĐŸĐ°Đ´Ņ‚ŅĐēҁ҂ҋ ŅŅ…Đ°Đ˛Đ°ĐŊŅ‹Ņ</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string> <string name="revanced_miniplayer_hide_subtext_summary_off">ПаĐēĐ°ĐˇĐ˛Đ°ŅŽŅ†Ņ†Đ° ĐŋĐ°Đ´Ņ‚ŅĐēҁ҂ҋ</string>

View File

@@ -555,6 +555,7 @@ Second \"item\" text"</string>
<string name="revanced_disable_translucent_status_bar_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž</string> <string name="revanced_disable_translucent_status_bar_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ĐŊа ŅŅŠŅŅ‚ĐžŅĐŊиĐĩŅ‚Đž</string>
<string name="revanced_disable_translucent_status_bar_summary_on">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_status_bar_summary_on">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
<string name="revanced_disable_translucent_status_bar_summary_off">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_status_bar_summary_off">ĐĄŅ‚Đ°Ņ‚ŅƒŅĐŊĐ°Ņ ĐģĐĩĐŊŅ‚Đ° Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">На ĐŊŅĐēОи ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ° аĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊĐĩŅ‚Đž ĐŊа Ņ‚Đ°ĐˇĐ¸ Ņ„ŅƒĐŊĐēŅ†Đ¸Ņ ĐŧĐžĐļĐĩ да ĐŋŅ€ĐžĐŧĐĩĐŊи ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸ĐžĐŊĐŊĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° ĐŊа ŅĐ¸ŅŅ‚ĐĩĐŧĐ°Ņ‚Đ° ĐŊа ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа.</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ŅĐ˛ĐĩŅ‚Đģа ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string> <string name="revanced_disable_translucent_navigation_bar_light_title">ДĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°Đš ĐŋĐžĐģ҃ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊĐ°Ņ‚Đ° ŅĐ˛ĐĩŅ‚Đģа ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">ХвĐĩŅ‚ĐģĐ°Ņ‚Đ° ĐģĐĩĐŊŅ‚Đ° Са ĐŊĐ°Đ˛Đ¸ĐŗĐ°Ņ†Đ¸Ņ Đĩ ĐŊĐĩĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа иĐģи ĐŋŅ€ĐžĐˇŅ€Đ°Ņ‡ĐŊа</string>
@@ -1154,6 +1155,7 @@ Second \"item\" text"</string>
<string name="revanced_miniplayer_type_entry_4">МодĐĩŅ€ĐĩĐŊ 1</string> <string name="revanced_miniplayer_type_entry_4">МодĐĩŅ€ĐĩĐŊ 1</string>
<string name="revanced_miniplayer_type_entry_5">МодĐĩŅ€ĐĩĐŊ 2</string> <string name="revanced_miniplayer_type_entry_5">МодĐĩŅ€ĐĩĐŊ 2</string>
<string name="revanced_miniplayer_type_entry_6">МодĐĩŅ€ĐĩĐŊ 3</string> <string name="revanced_miniplayer_type_entry_6">МодĐĩŅ€ĐĩĐŊ 3</string>
<string name="revanced_miniplayer_type_entry_7">МодĐĩŅ€ĐĩĐŊ 4</string>
<string name="revanced_miniplayer_rounded_corners_title">АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐšŅ‚Đĩ СаОйĐģĐĩĐŊи ŅŠĐŗĐģи</string> <string name="revanced_miniplayer_rounded_corners_title">АĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐšŅ‚Đĩ СаОйĐģĐĩĐŊи ŅŠĐŗĐģи</string>
<string name="revanced_miniplayer_rounded_corners_summary_on">ĐĒĐŗĐģĐ¸Ņ‚Đĩ ŅĐ° СаОйĐģĐĩĐŊи</string> <string name="revanced_miniplayer_rounded_corners_summary_on">ĐĒĐŗĐģĐ¸Ņ‚Đĩ ŅĐ° СаОйĐģĐĩĐŊи</string>
<string name="revanced_miniplayer_rounded_corners_summary_off">ĐĒĐŗĐģĐ¸Ņ‚Đĩ ŅĐ° ĐŊĐžŅ€ĐŧаĐģĐŊи</string> <string name="revanced_miniplayer_rounded_corners_summary_off">ĐĒĐŗĐģĐ¸Ņ‚Đĩ ŅĐ° ĐŊĐžŅ€ĐŧаĐģĐŊи</string>
@@ -1173,14 +1175,14 @@ Second \"item\" text"</string>
МиĐŊи ĐŋĐģĐĩĐšŅŠŅ€ŅŠŅ‚ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊ Đ¸ĐˇĐ˛ŅŠĐŊ ĐĩĐēŅ€Đ°ĐŊа ĐŊаĐģŅĐ˛Đž иĐģи ĐŊĐ°Đ´ŅŅĐŊĐž"</string> МиĐŊи ĐŋĐģĐĩĐšŅŠŅ€ŅŠŅ‚ ĐŧĐžĐļĐĩ да ĐąŅŠĐ´Đĩ ĐŋĐģŅŠĐˇĐŗĐ°ĐŊ Đ¸ĐˇĐ˛ŅŠĐŊ ĐĩĐēŅ€Đ°ĐŊа ĐŊаĐģŅĐ˛Đž иĐģи ĐŊĐ°Đ´ŅŅĐŊĐž"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">ЖĐĩŅŅ‚ŅŠŅ‚ Са Ņ…ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊĐž ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">ЖĐĩŅŅ‚ŅŠŅ‚ Са Ņ…ĐžŅ€Đ¸ĐˇĐžĐŊŅ‚Đ°ĐģĐŊĐž ĐŋĐģŅŠĐˇĐŗĐ°ĐŊĐĩ Đĩ Đ´ĐĩаĐēŅ‚Đ¸Đ˛Đ¸Ņ€Đ°ĐŊ</string>
<string name="revanced_miniplayer_hide_expand_close_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊа Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ Са ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">Đ‘ŅƒŅ‚ĐžĐŊŅŠŅ‚ Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ Đĩ ҁĐēŅ€Đ¸Ņ‚</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ Са ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">ПоĐēаСаĐŊ Đĩ ĐąŅƒŅ‚ĐžĐŊ Са ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ Са ĐŊĐ°ŅĐģĐ°ĐŗĐ˛Đ°ĐŊĐĩ ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">ĐĄĐēŅ€Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐąŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ Са Ņ€Đ°ĐˇĐŗŅŠĐ˛Đ°ĐŊĐĩ и ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸ <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ ŅĐ° ҁĐēŅ€Đ¸Ņ‚Đ¸
ПĐģŅŠĐˇĐŊĐĩŅ‚Đĩ, Са да Ņ€Đ°ĐˇĐŗŅŠĐŊĐĩŅ‚Đĩ иĐģи ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ"</string> ПĐģŅŠĐˇĐŊĐĩŅ‚Đĩ, Са да Ņ€Đ°ĐˇĐŗŅŠĐŊĐĩŅ‚Đĩ иĐģи ĐˇĐ°Ņ‚Đ˛ĐžŅ€Đ¸Ņ‚Đĩ"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">Đ‘ŅƒŅ‚ĐžĐŊи Са Ņ€Đ°ĐˇŅˆĐ¸Ņ€ŅĐ˛Đ°ĐŊĐĩ и ŅĐ˛Đ¸Đ˛Đ°ĐŊĐĩ ĐŊа ĐĩĐēŅ€Đ°ĐŊа ŅĐ° видиĐŧи</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">Đ‘ŅƒŅ‚ĐžĐŊĐ¸Ņ‚Đĩ Са Ņ€Đ°ĐˇĐŗŅŠĐ˛Đ°ĐŊĐĩ и ĐˇĐ°Ņ‚Đ˛Đ°Ņ€ŅĐŊĐĩ ŅĐ° ĐŋĐžĐēаСаĐŊи</string>
<string name="revanced_miniplayer_hide_subtext_title">ЕĐēŅ€Đ°ĐŊĐŊи Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đĩ, ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸</string> <string name="revanced_miniplayer_hide_subtext_title">ЕĐēŅ€Đ°ĐŊĐŊи Ņ‚ĐĩĐēŅŅ‚ĐžĐ˛Đĩ, ĐĩŅ‚Đ¸ĐēĐĩŅ‚Đ¸</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ¸</string> <string name="revanced_miniplayer_hide_subtext_summary_on">ĐĄĐēŅ€Đ¸Ņ‚Đ¸</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">ПоĐēĐ°ĐˇĐ˛Đ°Ņ‚ ҁĐĩ</string> <string name="revanced_miniplayer_hide_subtext_summary_off">ПоĐēĐ°ĐˇĐ˛Đ°Ņ‚ ҁĐĩ</string>

View File

@@ -555,6 +555,7 @@ MicroG-āĻāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻžāϟāĻžāϰāĻŋ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ
<string name="revanced_disable_translucent_status_bar_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string> <string name="revanced_disable_translucent_status_bar_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string>
<string name="revanced_disable_translucent_status_bar_summary_on">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_status_bar_summary_on">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string>
<string name="revanced_disable_translucent_status_bar_summary_off">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_status_bar_summary_off">āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string>
<string name="revanced_disable_translucent_status_bar_user_dialog_message">āĻ•āĻŋāϛ⧁ āĻĄāĻŋāĻ­āĻžāχāϏ⧇, āĻāχ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāϟāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϞ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻ¸ā§āĻŦāĻšā§āĻ› āĻšā§Ÿā§‡ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤</string>
<string name="revanced_disable_translucent_navigation_bar_light_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻšāĻžāϞāĻ•āĻž āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string> <string name="revanced_disable_translucent_navigation_bar_light_title">āĻ…āĻ°ā§āϧāĻ¸ā§āĻŦāĻšā§āĻ› āĻšāĻžāϞāĻ•āĻž āĻŦāĻžāϰ āύāĻŋāĻˇā§āĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰ⧁āύ</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_on">āĻšāĻžāϞāĻ•āĻž āĻŽā§‹āĻĄ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_on">āĻšāĻžāϞāĻ•āĻž āĻŽā§‹āĻĄ āύ⧇āĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ›</string>
<string name="revanced_disable_translucent_navigation_bar_light_summary_off">āϞāĻžāχāϟ āĻŽā§‹āĻĄ āĻ¨ā§āϝāĻžāĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string> <string name="revanced_disable_translucent_navigation_bar_light_summary_off">āϞāĻžāχāϟ āĻŽā§‹āĻĄ āĻ¨ā§āϝāĻžāĻ­āĻŋāϗ⧇āĻļāύ āĻŦāĻžāϰāϟāĻŋ āĻ…āĻ¸ā§āĻŦāĻšā§āĻ› āĻŦāĻž āĻ¸ā§āĻŦāĻšā§āĻ›</string>
@@ -1154,6 +1155,7 @@ YouTube āϏ⧇āϟāĻŋāĻ‚āϏ⧇ āĻ…āĻŸā§‹ āĻĒā§āϞ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ
<string name="revanced_miniplayer_type_entry_4">āĻŽāĻ°ā§āĻĄāĻžāύ ā§§</string> <string name="revanced_miniplayer_type_entry_4">āĻŽāĻ°ā§āĻĄāĻžāύ ā§§</string>
<string name="revanced_miniplayer_type_entry_5">āĻŽāĻ°ā§āĻĄāĻžāύ ⧍</string> <string name="revanced_miniplayer_type_entry_5">āĻŽāĻ°ā§āĻĄāĻžāύ ⧍</string>
<string name="revanced_miniplayer_type_entry_6">āĻŽāĻ°ā§āĻĄāĻžāύ ā§Š</string> <string name="revanced_miniplayer_type_entry_6">āĻŽāĻ°ā§āĻĄāĻžāύ ā§Š</string>
<string name="revanced_miniplayer_type_entry_7">āφāϧ⧁āύāĻŋāĻ• ā§Ē</string>
<string name="revanced_miniplayer_rounded_corners_title">āĻ—ā§‹āϞāĻžāĻ•āĻžāϰ āϕ⧋āĻŖ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ</string> <string name="revanced_miniplayer_rounded_corners_title">āĻ—ā§‹āϞāĻžāĻ•āĻžāϰ āϕ⧋āĻŖ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ</string>
<string name="revanced_miniplayer_rounded_corners_summary_on">āϕ⧋āĻŖāϗ⧁āϞāĻŋ āĻ—ā§‹āϞāĻžāĻ•āĻžāϰ</string> <string name="revanced_miniplayer_rounded_corners_summary_on">āϕ⧋āĻŖāϗ⧁āϞāĻŋ āĻ—ā§‹āϞāĻžāĻ•āĻžāϰ</string>
<string name="revanced_miniplayer_rounded_corners_summary_off">āϕ⧋āĻŖāϗ⧁āϞāĻŋ āĻŦāĻ°ā§āĻ—āĻžāĻ•āĻžāϰ</string> <string name="revanced_miniplayer_rounded_corners_summary_off">āϕ⧋āĻŖāϗ⧁āϞāĻŋ āĻŦāĻ°ā§āĻ—āĻžāĻ•āĻžāϰ</string>
@@ -1173,14 +1175,14 @@ Miniplayer āĻ¸ā§āĻ•ā§āϰāĻŋāύ⧇āϰ āϝ⧇āϕ⧋āύ⧋ āϕ⧋āϪ⧇ āϟāĻžāύ
Miniplayer āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻŽā§‡ āĻŦāĻž āĻĄāĻžāύ⧇ āϟāĻžāύāĻž āϝāĻžāĻŦ⧇"</string> Miniplayer āĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻĨ⧇āϕ⧇ āĻŦāĻžāĻŽā§‡ āĻŦāĻž āĻĄāĻžāύ⧇ āϟāĻžāύāĻž āϝāĻžāĻŦ⧇"</string>
<string name="revanced_miniplayer_horizontal_drag_summary_off">āĻ…āύ⧁āĻ­ā§‚āĻŽāĻŋāĻ• āĻĄā§āĻ°ā§āϝāĻžāĻ— āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ āĻ…āĻ•ā§āώāĻŽ</string> <string name="revanced_miniplayer_horizontal_drag_summary_off">āĻ…āύ⧁āĻ­ā§‚āĻŽāĻŋāĻ• āĻĄā§āĻ°ā§āϝāĻžāĻ— āĻ…āĻ™ā§āĻ—āĻ­āĻ™ā§āĻ—āĻŋ āĻ…āĻ•ā§āώāĻŽ</string>
<string name="revanced_miniplayer_hide_expand_close_title">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string> <string name="revanced_miniplayer_hide_overlay_buttons_title">āĻ“āĻ­āĻžāϰāϞ⧇ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_miniplayer_hide_expand_close_summary_on">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_on">āĻ“āĻ­āĻžāϰāϞ⧇ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇</string>
<string name="revanced_miniplayer_hide_expand_close_summary_off">āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string> <string name="revanced_miniplayer_hide_overlay_buttons_summary_off">āĻ“āĻ­āĻžāϰāϞ⧇ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_title">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ“ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻžāϰ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_title">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_on">"āĻŦā§‹āϤāĻžāĻŽāϗ⧁āϞāĻŋ āϞ⧁āĻ•āĻžāύ⧋ āĻšāϝāĻŧ <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_on">"āĻŦā§‹āϤāĻžāĻŽ āϞ⧁āĻ•āĻžāύ⧋ āφāϛ⧇
āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ•āϰāϤ⧇ āĻŦāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āϏ⧋āϝāĻŧāĻžāχāĻĒ āĻ•āϰ⧁āύ"</string> āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻ•āϰāϤ⧇ āĻŦāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āĻ¸ā§‹ā§ŸāĻžāχāĻĒ āĻ•āϰ⧁āύ"</string>
<string name="revanced_miniplayer_hide_expand_close_legacy_summary_off">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āϧ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻšā§āϛ⧇</string> <string name="revanced_miniplayer_hide_overlay_buttons_legacy_summary_off">āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻžāϰ āĻŦā§‹āϤāĻžāĻŽ āĻĻ⧇āĻ–āĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇</string>
<string name="revanced_miniplayer_hide_subtext_title">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻžāύ</string> <string name="revanced_miniplayer_hide_subtext_title">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻžāύ</string>
<string name="revanced_miniplayer_hide_subtext_summary_on">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻŋā§Ÿā§‡ āĻ°ā§Ÿā§‡āϛ⧇</string> <string name="revanced_miniplayer_hide_subtext_summary_on">āωāĻĒāĻĒāĻžāĻ  āϞ⧁āĻ•āĻŋā§Ÿā§‡ āĻ°ā§Ÿā§‡āϛ⧇</string>
<string name="revanced_miniplayer_hide_subtext_summary_off">āωāĻĒāĻĒāĻžāĻ  āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string> <string name="revanced_miniplayer_hide_subtext_summary_off">āωāĻĒāĻĒāĻžāĻ  āĻĒā§āϰāĻĻāĻ°ā§āĻļāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇</string>

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