mirror of
https://github.com/ReVanced/revanced-patches.git
synced 2026-01-24 03:01:03 +00:00
Compare commits
3 Commits
v5.33.0-de
...
v5.33.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e60ac6963 | ||
|
|
1adbd563b2 | ||
|
|
9ccf13b680 |
@@ -1,3 +1,10 @@
|
|||||||
|
# [5.33.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.33.0-dev.5...v5.33.0-dev.6) (2025-07-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Video quality:** Use 1080p enhanced bitrate for Premium users ([#5565](https://github.com/ReVanced/revanced-patches/issues/5565)) ([bd3ace0](https://github.com/ReVanced/revanced-patches/commit/bd3ace0bd04ccd0369adb49d63aa0cf986402346))
|
||||||
|
|
||||||
# [5.33.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.33.0-dev.4...v5.33.0-dev.5) (2025-07-31)
|
# [5.33.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.33.0-dev.4...v5.33.0-dev.5) (2025-07-31)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import static app.revanced.extension.shared.Utils.NetworkType;
|
|||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import com.google.android.libraries.youtube.innertube.model.media.VideoQuality;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.ArrayList;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import app.revanced.extension.shared.Logger;
|
import app.revanced.extension.shared.Logger;
|
||||||
@@ -20,6 +20,14 @@ import app.revanced.extension.youtube.shared.ShortsPlayerState;
|
|||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class RememberVideoQualityPatch {
|
public class RememberVideoQualityPatch {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface to use obfuscated methods.
|
||||||
|
*/
|
||||||
|
public interface VideoQualityMenuInterface {
|
||||||
|
void patch_setMenuIndexFromQuality(VideoQuality quality);
|
||||||
|
}
|
||||||
|
|
||||||
private static final int AUTOMATIC_VIDEO_QUALITY_VALUE = -2;
|
private static final int AUTOMATIC_VIDEO_QUALITY_VALUE = -2;
|
||||||
private static final IntegerSetting videoQualityWifi = Settings.VIDEO_QUALITY_DEFAULT_WIFI;
|
private static final IntegerSetting videoQualityWifi = Settings.VIDEO_QUALITY_DEFAULT_WIFI;
|
||||||
private static final IntegerSetting videoQualityMobile = Settings.VIDEO_QUALITY_DEFAULT_MOBILE;
|
private static final IntegerSetting videoQualityMobile = Settings.VIDEO_QUALITY_DEFAULT_MOBILE;
|
||||||
@@ -30,7 +38,8 @@ public class RememberVideoQualityPatch {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* If the user selected a new quality from the flyout menu,
|
* If the user selected a new quality from the flyout menu,
|
||||||
* and {@link Settings#REMEMBER_VIDEO_QUALITY_LAST_SELECTED} is enabled.
|
* and {@link Settings#REMEMBER_VIDEO_QUALITY_LAST_SELECTED}
|
||||||
|
* or {@link Settings#REMEMBER_SHORTS_QUALITY_LAST_SELECTED} is enabled.
|
||||||
*/
|
*/
|
||||||
private static boolean userChangedDefaultQuality;
|
private static boolean userChangedDefaultQuality;
|
||||||
|
|
||||||
@@ -40,10 +49,10 @@ public class RememberVideoQualityPatch {
|
|||||||
private static int userSelectedQualityIndex;
|
private static int userSelectedQualityIndex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The available qualities of the current video in human readable form: [1080, 720, 480]
|
* The available qualities of the current video.
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
private static List<Integer> videoQualities;
|
private static List<VideoQuality> videoQualities;
|
||||||
|
|
||||||
private static boolean shouldRememberVideoQuality() {
|
private static boolean shouldRememberVideoQuality() {
|
||||||
BooleanSetting preference = ShortsPlayerState.isOpen() ?
|
BooleanSetting preference = ShortsPlayerState.isOpen() ?
|
||||||
@@ -52,23 +61,27 @@ public class RememberVideoQualityPatch {
|
|||||||
return preference.get();
|
return preference.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void changeDefaultQuality(int defaultQuality) {
|
private static void changeDefaultQuality(int qualityResolution) {
|
||||||
|
final boolean shortPlayerOpen = ShortsPlayerState.isOpen();
|
||||||
String networkTypeMessage;
|
String networkTypeMessage;
|
||||||
boolean useShortsPreference = ShortsPlayerState.isOpen();
|
IntegerSetting qualitySetting;
|
||||||
if (Utils.getNetworkType() == NetworkType.MOBILE) {
|
if (Utils.getNetworkType() == NetworkType.MOBILE) {
|
||||||
if (useShortsPreference) shortsQualityMobile.save(defaultQuality);
|
|
||||||
else videoQualityMobile.save(defaultQuality);
|
|
||||||
networkTypeMessage = str("revanced_remember_video_quality_mobile");
|
networkTypeMessage = str("revanced_remember_video_quality_mobile");
|
||||||
|
qualitySetting = shortPlayerOpen ? shortsQualityMobile : videoQualityMobile;
|
||||||
} else {
|
} else {
|
||||||
if (useShortsPreference) shortsQualityWifi.save(defaultQuality);
|
|
||||||
else videoQualityWifi.save(defaultQuality);
|
|
||||||
networkTypeMessage = str("revanced_remember_video_quality_wifi");
|
networkTypeMessage = str("revanced_remember_video_quality_wifi");
|
||||||
|
qualitySetting = shortPlayerOpen ? shortsQualityWifi : videoQualityWifi;
|
||||||
}
|
}
|
||||||
|
qualitySetting.save(qualityResolution);
|
||||||
|
|
||||||
if (Settings.REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST.get())
|
if (Settings.REMEMBER_VIDEO_QUALITY_LAST_SELECTED_TOAST.get())
|
||||||
Utils.showToastShort(str(
|
Utils.showToastShort(str(
|
||||||
useShortsPreference ? "revanced_remember_video_quality_toast_shorts" : "revanced_remember_video_quality_toast",
|
shortPlayerOpen
|
||||||
networkTypeMessage, (defaultQuality + "p")
|
? "revanced_remember_video_quality_toast_shorts"
|
||||||
));
|
: "revanced_remember_video_quality_toast",
|
||||||
|
networkTypeMessage,
|
||||||
|
(qualityResolution + "p"))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -77,9 +90,11 @@ public class RememberVideoQualityPatch {
|
|||||||
* @param qualities Video qualities available, ordered from largest to smallest, with index 0 being the 'automatic' value of -2
|
* @param qualities Video qualities available, ordered from largest to smallest, with index 0 being the 'automatic' value of -2
|
||||||
* @param originalQualityIndex quality index to use, as chosen by YouTube
|
* @param originalQualityIndex quality index to use, as chosen by YouTube
|
||||||
*/
|
*/
|
||||||
public static int setVideoQuality(Object[] qualities, final int originalQualityIndex, Object qInterface, String qIndexMethod) {
|
public static int setVideoQuality(VideoQuality[] qualities, VideoQualityMenuInterface menu, int originalQualityIndex) {
|
||||||
try {
|
try {
|
||||||
boolean useShortsPreference = ShortsPlayerState.isOpen();
|
Utils.verifyOnMainThread();
|
||||||
|
|
||||||
|
final boolean useShortsPreference = ShortsPlayerState.isOpen();
|
||||||
final int preferredQuality = Utils.getNetworkType() == NetworkType.MOBILE
|
final int preferredQuality = Utils.getNetworkType() == NetworkType.MOBILE
|
||||||
? (useShortsPreference ? shortsQualityMobile : videoQualityMobile).get()
|
? (useShortsPreference ? shortsQualityMobile : videoQualityMobile).get()
|
||||||
: (useShortsPreference ? shortsQualityWifi : videoQualityWifi).get();
|
: (useShortsPreference ? shortsQualityWifi : videoQualityWifi).get();
|
||||||
@@ -89,16 +104,8 @@ public class RememberVideoQualityPatch {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (videoQualities == null || videoQualities.size() != qualities.length) {
|
if (videoQualities == null || videoQualities.size() != qualities.length) {
|
||||||
videoQualities = new ArrayList<>(qualities.length);
|
videoQualities = Arrays.asList(qualities);
|
||||||
for (Object streamQuality : qualities) {
|
|
||||||
for (Field field : streamQuality.getClass().getFields()) {
|
|
||||||
if (field.getType().isAssignableFrom(Integer.TYPE)
|
|
||||||
&& field.getName().length() <= 2) {
|
|
||||||
videoQualities.add(field.getInt(streamQuality));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// After changing videos the qualities can initially be for the prior video.
|
// After changing videos the qualities can initially be for the prior video.
|
||||||
// So if the qualities have changed an update is needed.
|
// So if the qualities have changed an update is needed.
|
||||||
qualityNeedsUpdating = true;
|
qualityNeedsUpdating = true;
|
||||||
@@ -107,9 +114,9 @@ public class RememberVideoQualityPatch {
|
|||||||
|
|
||||||
if (userChangedDefaultQuality) {
|
if (userChangedDefaultQuality) {
|
||||||
userChangedDefaultQuality = false;
|
userChangedDefaultQuality = false;
|
||||||
final int quality = videoQualities.get(userSelectedQualityIndex);
|
VideoQuality quality = videoQualities.get(userSelectedQualityIndex);
|
||||||
Logger.printDebug(() -> "User changed default quality to: " + quality);
|
Logger.printDebug(() -> "User changed default quality to: " + quality);
|
||||||
changeDefaultQuality(quality);
|
changeDefaultQuality(quality.patch_getResolution());
|
||||||
return userSelectedQualityIndex;
|
return userSelectedQualityIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,65 +126,86 @@ public class RememberVideoQualityPatch {
|
|||||||
qualityNeedsUpdating = false;
|
qualityNeedsUpdating = false;
|
||||||
|
|
||||||
// Find the highest quality that is equal to or less than the preferred.
|
// Find the highest quality that is equal to or less than the preferred.
|
||||||
int qualityToUse = videoQualities.get(0); // first element is automatic mode
|
VideoQuality qualityToUse = videoQualities.get(0); // First element is automatic mode.
|
||||||
int qualityIndexToUse = 0;
|
int qualityIndexToUse = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Integer quality : videoQualities) {
|
for (VideoQuality quality : videoQualities) {
|
||||||
if (quality <= preferredQuality && qualityToUse < quality) {
|
final int qualityResolution = quality.patch_getResolution();
|
||||||
|
if (qualityResolution > qualityToUse.patch_getResolution() && qualityResolution <= preferredQuality) {
|
||||||
qualityToUse = quality;
|
qualityToUse = quality;
|
||||||
qualityIndexToUse = i;
|
qualityIndexToUse = i;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the desired quality index is equal to the original index,
|
// If the desired quality index is equal to the original index,
|
||||||
// then the video is already set to the desired default quality.
|
// then the video is already set to the desired default quality.
|
||||||
final int qualityToUseFinal = qualityToUse;
|
String qualityToUseName = qualityToUse.patch_getQualityName();
|
||||||
if (qualityIndexToUse == originalQualityIndex) {
|
if (qualityIndexToUse == originalQualityIndex) {
|
||||||
// On first load of a new video, if the UI video quality flyout menu
|
Logger.printDebug(() -> "Video is already preferred quality: " + qualityToUseName);
|
||||||
// is not updated then it will still show 'Auto' (ie: Auto (480p)),
|
|
||||||
// even though it's already set to the desired resolution.
|
|
||||||
//
|
|
||||||
// To prevent confusion, set the video index anyways (even if it matches the existing index)
|
|
||||||
// as that will force the UI picker to not display "Auto".
|
|
||||||
Logger.printDebug(() -> "Video is already preferred quality: " + qualityToUseFinal);
|
|
||||||
} else {
|
} else {
|
||||||
Logger.printDebug(() -> "Changing video quality from: "
|
Logger.printDebug(() -> "Changing video quality from: "
|
||||||
+ videoQualities.get(originalQualityIndex) + " to: " + qualityToUseFinal);
|
+ videoQualities.get(originalQualityIndex).patch_getQualityName()
|
||||||
|
+ " to: " + qualityToUseName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Method m = qInterface.getClass().getMethod(qIndexMethod, Integer.TYPE);
|
// On first load of a new video, if the video is already the desired quality
|
||||||
m.invoke(qInterface, qualityToUse);
|
// then the quality flyout will show 'Auto' (ie: Auto (720p)).
|
||||||
|
//
|
||||||
|
// To prevent user confusion, set the video index even if the
|
||||||
|
// quality is already correct so the UI picker will not display "Auto".
|
||||||
|
menu.patch_setMenuIndexFromQuality(qualities[qualityIndexToUse]);
|
||||||
|
|
||||||
return qualityIndexToUse;
|
return qualityIndexToUse;
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Logger.printException(() -> "Failed to set quality", ex);
|
Logger.printException(() -> "setVideoQuality failure", ex);
|
||||||
return originalQualityIndex;
|
return originalQualityIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injection point. Old quality menu.
|
* Injection point. Fixes bad data used by YouTube.
|
||||||
*/
|
*/
|
||||||
public static void userChangedQuality(int selectedQualityIndex) {
|
public static int fixVideoQualityResolution(String name, int quality) {
|
||||||
|
final int correctQuality = 480;
|
||||||
|
if (name.equals("480p") && quality != correctQuality) {
|
||||||
|
Logger.printDebug(() -> "Fixing bad data of " + name + " from: " + quality
|
||||||
|
+ " to: " + correctQuality);
|
||||||
|
return correctQuality;
|
||||||
|
}
|
||||||
|
|
||||||
|
return quality;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injection point.
|
||||||
|
* @param qualityIndex Element index of {@link #videoQualities}.
|
||||||
|
*/
|
||||||
|
public static void userChangedQuality(int qualityIndex) {
|
||||||
if (shouldRememberVideoQuality()) {
|
if (shouldRememberVideoQuality()) {
|
||||||
userSelectedQualityIndex = selectedQualityIndex;
|
userSelectedQualityIndex = qualityIndex;
|
||||||
userChangedDefaultQuality = true;
|
userChangedDefaultQuality = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injection point. New quality menu.
|
* Injection point.
|
||||||
|
* @param videoResolution Human readable resolution: 480, 720, 1080.
|
||||||
*/
|
*/
|
||||||
public static void userChangedQualityInNewFlyout(int selectedQuality) {
|
public static void userChangedQualityInFlyout(int videoResolution) {
|
||||||
|
Utils.verifyOnMainThread();
|
||||||
if (!shouldRememberVideoQuality()) return;
|
if (!shouldRememberVideoQuality()) return;
|
||||||
|
|
||||||
changeDefaultQuality(selectedQuality); // Quality is human readable resolution (ie: 1080).
|
changeDefaultQuality(videoResolution);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Injection point.
|
* Injection point.
|
||||||
*/
|
*/
|
||||||
public static void newVideoStarted(VideoInformation.PlaybackController ignoredPlayerController) {
|
public static void newVideoStarted(VideoInformation.PlaybackController ignoredPlayerController) {
|
||||||
|
Utils.verifyOnMainThread();
|
||||||
|
|
||||||
Logger.printDebug(() -> "newVideoStarted");
|
Logger.printDebug(() -> "newVideoStarted");
|
||||||
qualityNeedsUpdating = true;
|
qualityNeedsUpdating = true;
|
||||||
videoQualities = null;
|
videoQualities = null;
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.google.android.libraries.youtube.innertube.model.media;
|
||||||
|
|
||||||
|
public class VideoQuality {
|
||||||
|
public final String patch_getQualityName() {
|
||||||
|
throw new UnsupportedOperationException("Stub");
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int patch_getResolution() {
|
||||||
|
throw new UnsupportedOperationException("Stub");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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.33.0-dev.5
|
version = 5.33.0-dev.6
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ internal val subtitleButtonControllerFingerprint = fingerprint {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal val newVideoQualityChangedFingerprint = fingerprint {
|
internal val videoQualityChangedFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
returns("L")
|
returns("L")
|
||||||
parameters("L")
|
parameters("L")
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package app.revanced.patches.youtube.video.information
|
package app.revanced.patches.youtube.video.information
|
||||||
|
|
||||||
import app.revanced.patcher.fingerprint
|
import app.revanced.patcher.fingerprint
|
||||||
import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint
|
import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
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
|
||||||
@@ -110,7 +110,7 @@ internal val seekRelativeFingerprint = fingerprint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves with the class found in [newVideoQualityChangedFingerprint].
|
* Resolves with the class found in [videoQualityChangedFingerprint].
|
||||||
*/
|
*/
|
||||||
internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint {
|
internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
|||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable
|
||||||
import app.revanced.patcher.util.smali.toInstructions
|
import app.revanced.patcher.util.smali.toInstructions
|
||||||
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch
|
||||||
import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint
|
import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint
|
||||||
import app.revanced.patches.youtube.video.playerresponse.Hook
|
import app.revanced.patches.youtube.video.playerresponse.Hook
|
||||||
import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook
|
import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook
|
||||||
import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch
|
import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch
|
||||||
@@ -263,7 +263,7 @@ val videoInformationPatch = bytecodePatch(
|
|||||||
|
|
||||||
// Handle new playback speed menu.
|
// Handle new playback speed menu.
|
||||||
playbackSpeedMenuSpeedChangedFingerprint.match(
|
playbackSpeedMenuSpeedChangedFingerprint.match(
|
||||||
newVideoQualityChangedFingerprint.originalClassDef,
|
videoQualityChangedFingerprint.originalClassDef,
|
||||||
).method.apply {
|
).method.apply {
|
||||||
val index = indexOfFirstInstructionOrThrow(Opcode.IGET)
|
val index = indexOfFirstInstructionOrThrow(Opcode.IGET)
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,21 @@ import app.revanced.util.literal
|
|||||||
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
|
||||||
|
|
||||||
|
internal const val YOUTUBE_VIDEO_QUALITY_CLASS_TYPE = "Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"
|
||||||
|
|
||||||
|
internal val videoQualityFingerprint = fingerprint {
|
||||||
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
|
||||||
|
parameters(
|
||||||
|
"I", // Resolution.
|
||||||
|
"Ljava/lang/String;", // Human readable resolution: "480p", "1080p Premium", etc
|
||||||
|
"Z",
|
||||||
|
"L"
|
||||||
|
)
|
||||||
|
custom { _, classDef ->
|
||||||
|
classDef.type == YOUTUBE_VIDEO_QUALITY_CLASS_TYPE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Matches with the class found in [videoQualitySetterFingerprint].
|
* Matches with the class found in [videoQualitySetterFingerprint].
|
||||||
*/
|
*/
|
||||||
@@ -23,6 +38,22 @@ internal val videoQualityItemOnClickParentFingerprint = fingerprint {
|
|||||||
strings("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT")
|
strings("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves to class found in [videoQualityItemOnClickFingerprint].
|
||||||
|
*/
|
||||||
|
internal val videoQualityItemOnClickFingerprint = fingerprint {
|
||||||
|
returns("V")
|
||||||
|
parameters(
|
||||||
|
"Landroid/widget/AdapterView;",
|
||||||
|
"Landroid/view/View;",
|
||||||
|
"I",
|
||||||
|
"J"
|
||||||
|
)
|
||||||
|
custom { method, _ ->
|
||||||
|
method.name == "onItemClick"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal val videoQualitySetterFingerprint = fingerprint {
|
internal val videoQualitySetterFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL)
|
||||||
returns("V")
|
returns("V")
|
||||||
@@ -37,7 +68,6 @@ internal val videoQualitySetterFingerprint = fingerprint {
|
|||||||
strings("menu_item_video_quality")
|
strings("menu_item_video_quality")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal val videoQualityMenuOptionsFingerprint = fingerprint {
|
internal val videoQualityMenuOptionsFingerprint = fingerprint {
|
||||||
accessFlags(AccessFlags.STATIC)
|
accessFlags(AccessFlags.STATIC)
|
||||||
returns("[L")
|
returns("[L")
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ package app.revanced.patches.youtube.video.quality
|
|||||||
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.extensions.InstructionExtensions.getInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
import app.revanced.patcher.patch.PatchException
|
|
||||||
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.patches.all.misc.resources.addResources
|
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.ListPreference
|
import app.revanced.patches.shared.misc.settings.preference.ListPreference
|
||||||
@@ -12,15 +12,21 @@ 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.playertype.playerTypeHookPatch
|
import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch
|
||||||
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
import app.revanced.patches.youtube.misc.settings.settingsPatch
|
||||||
import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint
|
import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint
|
||||||
import app.revanced.patches.youtube.video.information.onCreateHook
|
import app.revanced.patches.youtube.video.information.onCreateHook
|
||||||
import app.revanced.patches.youtube.video.information.videoInformationPatch
|
import app.revanced.patches.youtube.video.information.videoInformationPatch
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation
|
||||||
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.TwoRegisterInstruction
|
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.immutable.ImmutableMethod
|
||||||
|
import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter
|
||||||
|
|
||||||
private const val EXTENSION_CLASS_DESCRIPTOR =
|
private const val EXTENSION_CLASS_DESCRIPTOR =
|
||||||
"Lapp/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch;"
|
"Lapp/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch;"
|
||||||
|
private const val EXTENSION_VIDEO_QUALITY_MENU_INTERFACE =
|
||||||
|
"Lapp/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch\$VideoQualityMenuInterface;"
|
||||||
|
|
||||||
val rememberVideoQualityPatch = bytecodePatch {
|
val rememberVideoQualityPatch = bytecodePatch {
|
||||||
dependsOn(
|
dependsOn(
|
||||||
@@ -70,72 +76,151 @@ val rememberVideoQualityPatch = bytecodePatch {
|
|||||||
*/
|
*/
|
||||||
onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted")
|
onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted")
|
||||||
|
|
||||||
|
videoQualityFingerprint.let {
|
||||||
|
// Fix bad data used by YouTube.
|
||||||
|
it.method.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static { p2, p1 }, $EXTENSION_CLASS_DESCRIPTOR->fixVideoQualityResolution(Ljava/lang/String;I)I
|
||||||
|
move-result p1
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
// Add methods to access obfuscated quality fields.
|
||||||
|
it.classDef.apply {
|
||||||
|
methods.add(
|
||||||
|
ImmutableMethod(
|
||||||
|
type,
|
||||||
|
"patch_getQualityName",
|
||||||
|
listOf(),
|
||||||
|
"Ljava/lang/String;",
|
||||||
|
AccessFlags.PUBLIC.value or AccessFlags.FINAL.value,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
MutableMethodImplementation(2),
|
||||||
|
).toMutable().apply {
|
||||||
|
// Only one string field.
|
||||||
|
val qualityNameField = fields.single { field ->
|
||||||
|
field.type == "Ljava/lang/String;"
|
||||||
|
}
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
iget-object v0, p0, $qualityNameField
|
||||||
|
return-object v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
methods.add(
|
||||||
|
ImmutableMethod(
|
||||||
|
type,
|
||||||
|
"patch_getResolution",
|
||||||
|
listOf(),
|
||||||
|
"I",
|
||||||
|
AccessFlags.PUBLIC.value or AccessFlags.FINAL.value,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
MutableMethodImplementation(2),
|
||||||
|
).toMutable().apply {
|
||||||
|
val resolutionField = fields.single { field ->
|
||||||
|
field.type == "I"
|
||||||
|
}
|
||||||
|
|
||||||
|
addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
iget v0, p0, $resolutionField
|
||||||
|
return v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Inject a call to set the remembered quality once a video loads.
|
// Inject a call to set the remembered quality once a video loads.
|
||||||
setQualityByIndexMethodClassFieldReferenceFingerprint.match(
|
setQualityByIndexMethodClassFieldReferenceFingerprint.match(
|
||||||
videoQualitySetterFingerprint.originalClassDef,
|
videoQualitySetterFingerprint.originalClassDef
|
||||||
).let { match ->
|
).let { match ->
|
||||||
// This instruction refers to the field with the type that contains the setQualityByIndex method.
|
// This instruction refers to the field with the type that contains the setQualityByIndex method.
|
||||||
val instructions = match.method.implementation!!.instructions
|
val instructions = match.method.implementation!!.instructions
|
||||||
|
val onItemClickListenerClassReference =
|
||||||
val getOnItemClickListenerClassReference =
|
|
||||||
(instructions.elementAt(0) as ReferenceInstruction).reference
|
(instructions.elementAt(0) as ReferenceInstruction).reference
|
||||||
val getSetQualityByIndexMethodClassFieldReference =
|
val setQualityFieldReference =
|
||||||
(instructions.elementAt(1) as ReferenceInstruction).reference
|
((instructions.elementAt(1) as ReferenceInstruction).reference) as FieldReference
|
||||||
|
|
||||||
val setQualityByIndexMethodClassFieldReference =
|
proxy(
|
||||||
getSetQualityByIndexMethodClassFieldReference as FieldReference
|
classes.find { classDef ->
|
||||||
|
classDef.type == setQualityFieldReference.type
|
||||||
|
}!!
|
||||||
|
).mutableClass.apply {
|
||||||
|
// Add interface and helper methods to allow extension code to call obfuscated methods.
|
||||||
|
interfaces.add(EXTENSION_VIDEO_QUALITY_MENU_INTERFACE)
|
||||||
|
|
||||||
val setQualityByIndexMethodClass = classes
|
// Get the name of the setQualityByIndex method.
|
||||||
.find { classDef -> classDef.type == setQualityByIndexMethodClassFieldReference.type }!!
|
val setQualityMenuIndexMethod = methods.single {
|
||||||
|
method -> method.parameterTypes.firstOrNull() == YOUTUBE_VIDEO_QUALITY_CLASS_TYPE
|
||||||
|
}
|
||||||
|
|
||||||
// Get the name of the setQualityByIndex method.
|
methods.add(
|
||||||
val setQualityByIndexMethod = setQualityByIndexMethodClass.methods
|
ImmutableMethod(
|
||||||
.find { method -> method.parameterTypes.first() == "I" }
|
type,
|
||||||
?: throw PatchException("Could not find setQualityByIndex method")
|
"patch_setMenuIndexFromQuality",
|
||||||
|
listOf(
|
||||||
|
ImmutableMethodParameter(YOUTUBE_VIDEO_QUALITY_CLASS_TYPE, null, null)
|
||||||
|
),
|
||||||
|
"V",
|
||||||
|
AccessFlags.PUBLIC.value or AccessFlags.FINAL.value,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
MutableMethodImplementation(2),
|
||||||
|
).toMutable().apply {
|
||||||
|
addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-virtual { p0, p1 }, $setQualityMenuIndexMethod
|
||||||
|
return-void
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
videoQualitySetterFingerprint.method.addInstructions(
|
videoQualitySetterFingerprint.method.addInstructions(
|
||||||
0,
|
0,
|
||||||
"""
|
"""
|
||||||
# Get the object instance to invoke the setQualityByIndex method on.
|
# Get the object instance to invoke the setQualityByIndex method on.
|
||||||
iget-object v0, p0, $getOnItemClickListenerClassReference
|
iget-object v0, p0, $onItemClickListenerClassReference
|
||||||
iget-object v0, v0, $getSetQualityByIndexMethodClassFieldReference
|
iget-object v0, v0, $setQualityFieldReference
|
||||||
|
|
||||||
# Get the method name.
|
invoke-static { p1, v0, p2 }, $EXTENSION_CLASS_DESCRIPTOR->setVideoQuality([$YOUTUBE_VIDEO_QUALITY_CLASS_TYPE${EXTENSION_VIDEO_QUALITY_MENU_INTERFACE}I)I
|
||||||
const-string v1, "${setQualityByIndexMethod.name}"
|
|
||||||
|
|
||||||
# Set the quality.
|
|
||||||
# The first parameter is the array list of video qualities.
|
|
||||||
# The second parameter is the index of the selected quality.
|
|
||||||
# The register v0 stores the object instance to invoke the setQualityByIndex method on.
|
|
||||||
# The register v1 stores the name of the setQualityByIndex method.
|
|
||||||
invoke-static { p1, p2, v0, v1 }, $EXTENSION_CLASS_DESCRIPTOR->setVideoQuality([Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/String;)I
|
|
||||||
move-result p2
|
move-result p2
|
||||||
""",
|
"""
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inject a call to remember the selected quality.
|
// Inject a call to remember the selected quality.
|
||||||
videoQualityItemOnClickParentFingerprint.classDef.methods.find { it.name == "onItemClick" }
|
videoQualityItemOnClickFingerprint.match(
|
||||||
?.apply {
|
videoQualityItemOnClickParentFingerprint.classDef
|
||||||
val listItemIndexParameter = 3
|
).method.addInstruction(
|
||||||
|
0,
|
||||||
|
"invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->userChangedQuality(I)V"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Inject a call to remember the user selected quality.
|
||||||
|
videoQualityChangedFingerprint.let {
|
||||||
|
it.method.apply {
|
||||||
|
val index = it.patternMatch!!.startIndex
|
||||||
|
val register = getInstruction<TwoRegisterInstruction>(index).registerA
|
||||||
|
|
||||||
addInstruction(
|
addInstruction(
|
||||||
0,
|
index + 1,
|
||||||
"invoke-static { p$listItemIndexParameter }, " +
|
"invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->userChangedQualityInFlyout(I)V",
|
||||||
"$EXTENSION_CLASS_DESCRIPTOR->userChangedQuality(I)V",
|
|
||||||
)
|
)
|
||||||
} ?: throw PatchException("Failed to find onItemClick method")
|
}
|
||||||
|
|
||||||
// Remember video quality if not using old layout menu.
|
|
||||||
newVideoQualityChangedFingerprint.method.apply {
|
|
||||||
val index = newVideoQualityChangedFingerprint.patternMatch!!.startIndex
|
|
||||||
val qualityRegister = getInstruction<TwoRegisterInstruction>(index).registerA
|
|
||||||
|
|
||||||
addInstruction(
|
|
||||||
index + 1,
|
|
||||||
"invoke-static { v$qualityRegister }, " +
|
|
||||||
"$EXTENSION_CLASS_DESCRIPTOR->userChangedQualityInNewFlyout(I)V",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1469,6 +1469,9 @@ Tämä voi avata korkealaatuisemmat videot"</string>
|
|||||||
<string name="revanced_custom_speed_menu_title">Mukautettu toistonopeusvalikko</string>
|
<string name="revanced_custom_speed_menu_title">Mukautettu toistonopeusvalikko</string>
|
||||||
<string name="revanced_custom_speed_menu_summary_on">Mukautettu nopeusvalikko näytetään</string>
|
<string name="revanced_custom_speed_menu_summary_on">Mukautettu nopeusvalikko näytetään</string>
|
||||||
<string name="revanced_custom_speed_menu_summary_off">Mukautettua nopeusvalikkoa ei näytetä</string>
|
<string name="revanced_custom_speed_menu_summary_off">Mukautettua nopeusvalikkoa ei näytetä</string>
|
||||||
|
<string name="revanced_restore_old_speed_menu_title">Palauta vanha toistonopeusvalikko</string>
|
||||||
|
<string name="revanced_restore_old_speed_menu_summary_on">Vanha nopeusvalikko näytetään</string>
|
||||||
|
<string name="revanced_restore_old_speed_menu_summary_off">Moderni nopeusvalikko näytetään</string>
|
||||||
<string name="revanced_custom_playback_speeds_title">Mukautetut toistonopeudet</string>
|
<string name="revanced_custom_playback_speeds_title">Mukautetut toistonopeudet</string>
|
||||||
<string name="revanced_custom_playback_speeds_summary">Lisää tai muuta mukautettuja toistonopeuksia</string>
|
<string name="revanced_custom_playback_speeds_summary">Lisää tai muuta mukautettuja toistonopeuksia</string>
|
||||||
<string name="revanced_custom_playback_speeds_invalid">Mukautettujen nopeuksien tulee olla alle %s</string>
|
<string name="revanced_custom_playback_speeds_invalid">Mukautettujen nopeuksien tulee olla alle %s</string>
|
||||||
|
|||||||
@@ -299,28 +299,28 @@ Bir Doodle şu anda bölgenizde gösteriliyorsa ve bu gizleme ayarı açıksa, a
|
|||||||
<string name="revanced_hide_for_you_shelf_title">\'Sizin için\' rafını gizle</string>
|
<string name="revanced_hide_for_you_shelf_title">\'Sizin için\' rafını gizle</string>
|
||||||
<string name="revanced_hide_for_you_shelf_summary_on">Sizin İçin rafı gizli</string>
|
<string name="revanced_hide_for_you_shelf_summary_on">Sizin İçin rafı gizli</string>
|
||||||
<string name="revanced_hide_for_you_shelf_summary_off">Sizin İçin rafı görünür</string>
|
<string name="revanced_hide_for_you_shelf_summary_off">Sizin İçin rafı görünür</string>
|
||||||
<string name="revanced_hide_links_preview_title">Bağlantı önizlemesini gizle</string>
|
<string name="revanced_hide_links_preview_title">Bağlantı ön izlemesini gizle</string>
|
||||||
<string name="revanced_hide_links_preview_summary_on">Bağlantı önizlemesi gizli</string>
|
<string name="revanced_hide_links_preview_summary_on">Bağlantı ön izlemesi gizli</string>
|
||||||
<string name="revanced_hide_links_preview_summary_off">Bağlantı önizlemesi görünür</string>
|
<string name="revanced_hide_links_preview_summary_off">Bağlantı ön izlemesi görünür</string>
|
||||||
<string name="revanced_hide_members_shelf_title">Üyeler rafını gizle</string>
|
<string name="revanced_hide_members_shelf_title">Üyeler rafını gizle</string>
|
||||||
<string name="revanced_hide_members_shelf_summary_on">Üyeler rafı gizli</string>
|
<string name="revanced_hide_members_shelf_summary_on">Üyeler rafı gizli</string>
|
||||||
<string name="revanced_hide_members_shelf_summary_off">Üyeler rafı gösteriliyor</string>
|
<string name="revanced_hide_members_shelf_summary_off">Üyeler rafı görünür</string>
|
||||||
<!-- 'Visit Community' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Visit Community' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_visit_community_button_title">\'Topluluğu Ziyaret Et\' düğmesini gizle</string>
|
<string name="revanced_hide_visit_community_button_title">\'Topluluğu Ziyaret Et\' düğmesini gizle</string>
|
||||||
<string name="revanced_hide_visit_community_button_summary_on">Topluluğu Ziyaret Et düğmesi gizli</string>
|
<string name="revanced_hide_visit_community_button_summary_on">Topluluğu Ziyaret Et düğmesi gizli</string>
|
||||||
<string name="revanced_hide_visit_community_button_summary_off">Topluluğu Ziyaret Et düğmesi görünür</string>
|
<string name="revanced_hide_visit_community_button_summary_off">Topluluğu Ziyaret Et düğmesi görünür</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">Kanal sayfalarındaki \'Mağazayı ziyaret et\' düğmesini gizle</string>
|
<string name="revanced_hide_visit_store_button_title">\'Mağazayı ziyaret et\' düğmesini gizle</string>
|
||||||
<string name="revanced_hide_visit_store_button_summary_on">Mağazayı Ziyaret Et düğmesi gizli</string>
|
<string name="revanced_hide_visit_store_button_summary_on">Mağazayı ziyaret et düğmesi gizli</string>
|
||||||
<string name="revanced_hide_visit_store_button_summary_off">Mağazayı Ziyaret Et düğmesi görünür</string>
|
<string name="revanced_hide_visit_store_button_summary_off">Mağazayı ziyaret et düğmesi görünür</string>
|
||||||
<string name="revanced_comments_screen_title">Yorumlar</string>
|
<string name="revanced_comments_screen_title">Yorumlar</string>
|
||||||
<string name="revanced_comments_screen_summary">Yorumlar kısmı bileşenlerini gizle veya göster</string>
|
<string name="revanced_comments_screen_summary">Yorumlar kısmı bileşenlerini gizle veya göster</string>
|
||||||
<string name="revanced_hide_comments_ai_chat_summary_title">Yapay zeka sohbet özetini gizle</string>
|
<string name="revanced_hide_comments_ai_chat_summary_title">Yapay zeka sohbet özetini gizle</string>
|
||||||
<string name="revanced_hide_comments_ai_chat_summary_summary_on">Yapay zeka sohbet özeti gizli</string>
|
<string name="revanced_hide_comments_ai_chat_summary_summary_on">Yapay zeka sohbet özeti gizli</string>
|
||||||
<string name="revanced_hide_comments_ai_chat_summary_summary_off">Yapay zeka sohbet özeti gösteriliyor</string>
|
<string name="revanced_hide_comments_ai_chat_summary_summary_off">Yapay zeka sohbet özeti görünür</string>
|
||||||
<string name="revanced_hide_comments_ai_summary_title">Yapay zeka yorumlar özetini gizle</string>
|
<string name="revanced_hide_comments_ai_summary_title">Yapay zeka yorumların özetini gizle</string>
|
||||||
<string name="revanced_hide_comments_ai_summary_summary_on">Yapay zeka yorum özeti gizli</string>
|
<string name="revanced_hide_comments_ai_summary_summary_on">Yapay zeka yorumların özeti gizli</string>
|
||||||
<string name="revanced_hide_comments_ai_summary_summary_off">Yapay zeka yorum özeti gösteriliyor</string>
|
<string name="revanced_hide_comments_ai_summary_summary_off">Yapay zeka yorumların özeti görünür</string>
|
||||||
<string name="revanced_hide_comments_channel_guidelines_title">Kanal yönergelerini gizle</string>
|
<string name="revanced_hide_comments_channel_guidelines_title">Kanal yönergelerini gizle</string>
|
||||||
<string name="revanced_hide_comments_channel_guidelines_summary_on">Kanal yönergeleri gizli</string>
|
<string name="revanced_hide_comments_channel_guidelines_summary_on">Kanal yönergeleri gizli</string>
|
||||||
<string name="revanced_hide_comments_channel_guidelines_summary_off">Kanal yönergeleri görünür</string>
|
<string name="revanced_hide_comments_channel_guidelines_summary_off">Kanal yönergeleri görünür</string>
|
||||||
@@ -342,7 +342,7 @@ Bir Doodle şu anda bölgenizde gösteriliyorsa ve bu gizleme ayarı açıksa, a
|
|||||||
<string name="revanced_hide_comments_thanks_button_title">Teşekkürler düğmesini gizle</string>
|
<string name="revanced_hide_comments_thanks_button_title">Teşekkürler düğmesini gizle</string>
|
||||||
<string name="revanced_hide_comments_thanks_button_summary_on">Teşekkürler düğmesi gizli</string>
|
<string name="revanced_hide_comments_thanks_button_summary_on">Teşekkürler düğmesi gizli</string>
|
||||||
<string name="revanced_hide_comments_thanks_button_summary_off">Teşekkürler düğmesi görünür</string>
|
<string name="revanced_hide_comments_thanks_button_summary_off">Teşekkürler düğmesi görünür</string>
|
||||||
<string name="revanced_hide_comments_timestamp_button_title">Zaman Damgası düğmesini gizle</string>
|
<string name="revanced_hide_comments_timestamp_button_title">Zaman damgası düğmesini gizle</string>
|
||||||
<string name="revanced_hide_comments_timestamp_button_summary_on">Zaman damgası düğmesi gizli</string>
|
<string name="revanced_hide_comments_timestamp_button_summary_on">Zaman damgası düğmesi gizli</string>
|
||||||
<string name="revanced_hide_comments_timestamp_button_summary_off">Zaman damgası düğmesi görünür</string>
|
<string name="revanced_hide_comments_timestamp_button_summary_off">Zaman damgası düğmesi görünür</string>
|
||||||
<string name="revanced_custom_filter_screen_title">Özel filtre</string>
|
<string name="revanced_custom_filter_screen_title">Özel filtre</string>
|
||||||
@@ -555,43 +555,43 @@ Ekranın sağ tarafında dikey olarak kaydırarak sesi ayarlayın"</string>
|
|||||||
<string name="revanced_hide_like_dislike_button_summary_on">Beğenme ve Beğenmeme düğmeleri gizli</string>
|
<string name="revanced_hide_like_dislike_button_summary_on">Beğenme ve Beğenmeme düğmeleri gizli</string>
|
||||||
<string name="revanced_hide_like_dislike_button_summary_off">Beğenme ve Beğenmeme düğmeleri görünür</string>
|
<string name="revanced_hide_like_dislike_button_summary_off">Beğenme ve Beğenmeme düğmeleri görünür</string>
|
||||||
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_share_button_title">Paylaşmayı gizle</string>
|
<string name="revanced_hide_share_button_title">Paylaş\'ı gizle</string>
|
||||||
<string name="revanced_hide_share_button_summary_on">Paylaşma düğmesi gizli</string>
|
<string name="revanced_hide_share_button_summary_on">Paylaş düğmesi gizli</string>
|
||||||
<string name="revanced_hide_share_button_summary_off">Paylaşma düğmesi görünür</string>
|
<string name="revanced_hide_share_button_summary_off">Paylaş düğmesi görünür</string>
|
||||||
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Stop ads' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_stop_ads_button_title">Reklamları Durdur\'u Gizle</string>
|
<string name="revanced_hide_stop_ads_button_title">Reklamları durdur\'u Gizle</string>
|
||||||
<string name="revanced_hide_stop_ads_button_summary_on">Reklamları durdur düğmesi gizlendi</string>
|
<string name="revanced_hide_stop_ads_button_summary_on">Reklamları durdur düğmesi gizli</string>
|
||||||
<string name="revanced_hide_stop_ads_button_summary_off">Reklamları durdur düğmesi gösterildi</string>
|
<string name="revanced_hide_stop_ads_button_summary_off">Reklamları durdur düğmesi görünür</string>
|
||||||
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
|
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
|
||||||
This button usually appears only on live streams. -->
|
This button usually appears only on live streams. -->
|
||||||
<string name="revanced_hide_report_button_title">Bildirmeyi gizle</string>
|
<string name="revanced_hide_report_button_title">Bildir\'i gizle</string>
|
||||||
<string name="revanced_hide_report_button_summary_on">Bildirme düğmesi gizli</string>
|
<string name="revanced_hide_report_button_summary_on">Bildir düğmesi gizli</string>
|
||||||
<string name="revanced_hide_report_button_summary_off">Bildirme düğmesi görünür</string>
|
<string name="revanced_hide_report_button_summary_off">Bildir düğmesi görünür</string>
|
||||||
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_remix_button_title">Remix düğmesini gizle</string>
|
<string name="revanced_hide_remix_button_title">Remix\'i gizle</string>
|
||||||
<string name="revanced_hide_remix_button_summary_on">Remix düğmesi gizli</string>
|
<string name="revanced_hide_remix_button_summary_on">Remix düğmesi gizli</string>
|
||||||
<string name="revanced_hide_remix_button_summary_off">Remix düğmesi görünür</string>
|
<string name="revanced_hide_remix_button_summary_off">Remix düğmesi görünür</string>
|
||||||
<!-- 'Download' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Download' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_download_button_title">İndirmeyi gizle</string>
|
<string name="revanced_hide_download_button_title">İndir\'i gizle</string>
|
||||||
<string name="revanced_hide_download_button_summary_on">İndirme düğmesi gizli</string>
|
<string name="revanced_hide_download_button_summary_on">İndir düğmesi gizli</string>
|
||||||
<string name="revanced_hide_download_button_summary_off">İndirme düğmesi görünür</string>
|
<string name="revanced_hide_download_button_summary_off">İndir düğmesi görünür</string>
|
||||||
<!-- 'Thanks' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Thanks' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_thanks_button_title">Teşekkürler düğmesini gizle</string>
|
<string name="revanced_hide_thanks_button_title">Teşekkürler\'i gizle</string>
|
||||||
<string name="revanced_hide_thanks_button_summary_on">Teşekkürler düğmesi gizli</string>
|
<string name="revanced_hide_thanks_button_summary_on">Teşekkürler düğmesi gizli</string>
|
||||||
<string name="revanced_hide_thanks_button_summary_off">Teşekkürler düğmesi görünür</string>
|
<string name="revanced_hide_thanks_button_summary_off">Teşekkürler düğmesi görünür</string>
|
||||||
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
<!-- 'Ask' should be translated with the same localized wording that YouTube displays.
|
||||||
This button only shows up if the user ip is from specific region such as the USA or EU. -->
|
This button only shows up if the user ip is from specific region such as the USA or EU. -->
|
||||||
<string name="revanced_hide_ask_button_title">\'Sor\'u gizle</string>
|
<string name="revanced_hide_ask_button_title">Sor\'u gizle</string>
|
||||||
<string name="revanced_hide_ask_button_summary_on">Sor düğmesi gizli</string>
|
<string name="revanced_hide_ask_button_summary_on">Sor düğmesi gizli</string>
|
||||||
<string name="revanced_hide_ask_button_summary_off">Sor düğmesi görünür</string>
|
<string name="revanced_hide_ask_button_summary_off">Sor düğmesi görünür</string>
|
||||||
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_clip_button_title">Klip düğmesini gizle</string>
|
<string name="revanced_hide_clip_button_title">Klip\'i gizle</string>
|
||||||
<string name="revanced_hide_clip_button_summary_on">Klip düğmesi gizli</string>
|
<string name="revanced_hide_clip_button_summary_on">Klip düğmesi gizli</string>
|
||||||
<string name="revanced_hide_clip_button_summary_off">Klip düğmesi görünür</string>
|
<string name="revanced_hide_clip_button_summary_off">Klip düğmesi görünür</string>
|
||||||
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_save_button_title">Kaydet\'i Gizle</string>
|
<string name="revanced_hide_save_button_title">Kaydet\'i Gizle</string>
|
||||||
<string name="revanced_hide_save_button_summary_on">Kaydet düğmesi gizlendi</string>
|
<string name="revanced_hide_save_button_summary_on">Kaydet düğmesi gizli</string>
|
||||||
<string name="revanced_hide_save_button_summary_off">Kaydet düğmesi gösterildi</string>
|
<string name="revanced_hide_save_button_summary_off">Kaydet düğmesi görünür</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
<patch id="layout.buttons.navigation.navigationButtonsPatch">
|
||||||
<string name="revanced_navigation_buttons_screen_title">Gezinme düğmeleri</string>
|
<string name="revanced_navigation_buttons_screen_title">Gezinme düğmeleri</string>
|
||||||
@@ -722,8 +722,8 @@ Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayar
|
|||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
<patch id="layout.hide.fullscreenambientmode.disableFullscreenAmbientModePatch">
|
||||||
<string name="revanced_disable_fullscreen_ambient_mode_title">Tam ekranda ambiyans modunu devre dışı bırak</string>
|
<string name="revanced_disable_fullscreen_ambient_mode_title">Tam ekranda ambiyans modunu devre dışı bırak</string>
|
||||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">Tam ekranda ambiyans modu devre dışı</string>
|
<string name="revanced_disable_fullscreen_ambient_mode_summary_on">Ambiyans modu devre dışı</string>
|
||||||
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Tam ekranda ambiyans modu etkin</string>
|
<string name="revanced_disable_fullscreen_ambient_mode_summary_off">Ambiyans modu etkin</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.infocards.hideInfocardsResourcePatch">
|
<patch id="layout.hide.infocards.hideInfocardsResourcePatch">
|
||||||
<string name="revanced_hide_info_cards_title">Bilgi kartlarını gizle</string>
|
<string name="revanced_hide_info_cards_title">Bilgi kartlarını gizle</string>
|
||||||
@@ -736,13 +736,13 @@ Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayar
|
|||||||
<string name="revanced_disable_rolling_number_animations_summary_off">Kayan sayı animasyonları etkin</string>
|
<string name="revanced_disable_rolling_number_animations_summary_off">Kayan sayı animasyonları etkin</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.seekbar.hideSeekbarPatch">
|
<patch id="layout.hide.seekbar.hideSeekbarPatch">
|
||||||
<string name="revanced_hide_seekbar_title">Video oynatıcı kaydırma çubuğunu gizle</string>
|
<string name="revanced_hide_seekbar_title">Video oynatıcısı zaman çubuğunu gizle</string>
|
||||||
<string name="revanced_hide_seekbar_summary_on">Video oynatıcısındaki zaman çubuğu gizli</string>
|
<string name="revanced_hide_seekbar_summary_on">Video oynatıcısı zaman çubuğu gizli</string>
|
||||||
<string name="revanced_hide_seekbar_summary_off">Video oynatıcısındaki zaman çubuğu görünür</string>
|
<string name="revanced_hide_seekbar_summary_off">Video oynatıcısı zaman çubuğu görünür</string>
|
||||||
<!-- Seekbar shown inside video thumbnails found the home/feed/search/history. The seekbar shows the prior watch progress when the video was last open. -->
|
<!-- Seekbar shown inside video thumbnails found the home/feed/search/history. The seekbar shows the prior watch progress when the video was last open. -->
|
||||||
<string name="revanced_hide_seekbar_thumbnail_title">Video küçük resimleri kaydırma çubuğunu gizle</string>
|
<string name="revanced_hide_seekbar_thumbnail_title">Video kapak fotoğrafı zaman çubuğunu gizle</string>
|
||||||
<string name="revanced_hide_seekbar_thumbnail_summary_on">Video küçük resimleri kaydırma çubuğu gizli</string>
|
<string name="revanced_hide_seekbar_thumbnail_summary_on">Video kapak fotoğrafı zaman çubuğu gizli</string>
|
||||||
<string name="revanced_hide_seekbar_thumbnail_summary_off">Video küçük resimleri kaydırma çubuğu gösteriliyor</string>
|
<string name="revanced_hide_seekbar_thumbnail_summary_off">Video kapak fotoğrafı zaman çubuğu gösteriliyor</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.shorts.hideShortsComponentsResourcePatch">
|
<patch id="layout.hide.shorts.hideShortsComponentsResourcePatch">
|
||||||
<string name="revanced_shorts_player_screen_title">Shorts oynatıcı</string>
|
<string name="revanced_shorts_player_screen_title">Shorts oynatıcı</string>
|
||||||
@@ -751,22 +751,22 @@ Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayar
|
|||||||
<string name="revanced_hide_shorts_home_title">Ana Sayfa akışında Shorts\'u gizle</string>
|
<string name="revanced_hide_shorts_home_title">Ana Sayfa akışında Shorts\'u gizle</string>
|
||||||
<string name="revanced_hide_shorts_home_summary_on">Ana Sayfa akışında ve ilgili videolarda gizli</string>
|
<string name="revanced_hide_shorts_home_summary_on">Ana Sayfa akışında ve ilgili videolarda gizli</string>
|
||||||
<string name="revanced_hide_shorts_home_summary_off">Ana Sayfa akışında ve ilgili videolarda görünür</string>
|
<string name="revanced_hide_shorts_home_summary_off">Ana Sayfa akışında ve ilgili videolarda görünür</string>
|
||||||
<string name="revanced_hide_shorts_search_title">Arama sonuçlarında Shorts videolarını gizle</string>
|
<string name="revanced_hide_shorts_search_title">Arama sonuçlarında Shorts\'u gizle</string>
|
||||||
<string name="revanced_hide_shorts_search_summary_on">Arama sonuçlarında gizli</string>
|
<string name="revanced_hide_shorts_search_summary_on">Arama sonuçlarında gizli</string>
|
||||||
<string name="revanced_hide_shorts_search_summary_off">Arama sonuçlarında görünür</string>
|
<string name="revanced_hide_shorts_search_summary_off">Arama sonuçlarında görünür</string>
|
||||||
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
|
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the Subscriptions tab. -->
|
||||||
<string name="revanced_hide_shorts_subscriptions_title">Abonelikler akışında Shorts\'u gizle</string>
|
<string name="revanced_hide_shorts_subscriptions_title">Abonelikler akışında Shorts\'u gizle</string>
|
||||||
<string name="revanced_hide_shorts_subscriptions_summary_on">Abonelikler akışında gizli</string>
|
<string name="revanced_hide_shorts_subscriptions_summary_on">Abonelikler akışında gizli</string>
|
||||||
<string name="revanced_hide_shorts_subscriptions_summary_off">Abonelikler akışında görünür</string>
|
<string name="revanced_hide_shorts_subscriptions_summary_off">Abonelikler akışında görünür</string>
|
||||||
<string name="revanced_hide_shorts_history_title">Shorts\'u izleme geçmişinde gizle</string>
|
<string name="revanced_hide_shorts_history_title">İzleme geçmişinde Shorts\'u gizle</string>
|
||||||
<string name="revanced_hide_shorts_history_summary_on">İzleme geçmişinde gizli</string>
|
<string name="revanced_hide_shorts_history_summary_on">İzleme geçmişinde gizli</string>
|
||||||
<string name="revanced_hide_shorts_history_summary_off">İzleme geçmişinde görünür</string>
|
<string name="revanced_hide_shorts_history_summary_off">İzleme geçmişinde görünür</string>
|
||||||
<string name="revanced_hide_shorts_super_thanks_button_title">Süper Teşekkürler düğmesini gizle</string>
|
<string name="revanced_hide_shorts_super_thanks_button_title">Süper Teşekkürler düğmesini gizle</string>
|
||||||
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Süper Teşekkürler satın al düğmesi gizli</string>
|
<string name="revanced_hide_shorts_super_thanks_button_summary_on">Süper Teşekkürler düğmesi gizli</string>
|
||||||
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Süper Teşekkürler satın al düğmesi görünür</string>
|
<string name="revanced_hide_shorts_super_thanks_button_summary_off">Süper Teşekkürler düğmesi görünür</string>
|
||||||
<string name="revanced_hide_shorts_effect_button_title">Efekt düğmesini gizle</string>
|
<string name="revanced_hide_shorts_effect_button_title">Efekt düğmesini gizle</string>
|
||||||
<string name="revanced_hide_shorts_effect_button_summary_on">Efekt düğmesi gizli</string>
|
<string name="revanced_hide_shorts_effect_button_summary_on">Efekt düğmesi gizli</string>
|
||||||
<string name="revanced_hide_shorts_effect_button_summary_off">Efekt düğmesi gösteriliyor</string>
|
<string name="revanced_hide_shorts_effect_button_summary_off">Efekt düğmesi görünür</string>
|
||||||
<string name="revanced_hide_shorts_green_screen_button_title">Yeşil ekran düğmesini gizle</string>
|
<string name="revanced_hide_shorts_green_screen_button_title">Yeşil ekran düğmesini gizle</string>
|
||||||
<string name="revanced_hide_shorts_green_screen_button_summary_on">Yeşil ekran düğmesi gizli</string>
|
<string name="revanced_hide_shorts_green_screen_button_summary_on">Yeşil ekran düğmesi gizli</string>
|
||||||
<string name="revanced_hide_shorts_green_screen_button_summary_off">Yeşil ekran düğmesi görünür</string>
|
<string name="revanced_hide_shorts_green_screen_button_summary_off">Yeşil ekran düğmesi görünür</string>
|
||||||
@@ -849,9 +849,9 @@ Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayar
|
|||||||
<string name="revanced_hide_shorts_video_title_summary_on">Video başlığı gizli</string>
|
<string name="revanced_hide_shorts_video_title_summary_on">Video başlığı gizli</string>
|
||||||
<string name="revanced_hide_shorts_video_title_summary_off">Video başlığı görünür</string>
|
<string name="revanced_hide_shorts_video_title_summary_off">Video başlığı görünür</string>
|
||||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Ses bilgisi etiketini gizle</string>
|
<string name="revanced_hide_shorts_sound_metadata_label_title">Ses bilgisi etiketini gizle</string>
|
||||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Ses meta veri etiketi gizli</string>
|
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Ses bilgisi etiketi gizli</string>
|
||||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Ses meta veri etiketi görünür</string>
|
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Ses bilgisi etiketi görünür</string>
|
||||||
<string name="revanced_hide_shorts_full_video_link_label_title">Video bağlantı etiketini gizle</string>
|
<string name="revanced_hide_shorts_full_video_link_label_title">Video bağlantısı etiketini gizle</string>
|
||||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video bağlantısı etiketi gizli</string>
|
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video bağlantısı etiketi gizli</string>
|
||||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video bağlantısı etiketi görünür</string>
|
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video bağlantısı etiketi görünür</string>
|
||||||
<string name="revanced_hide_shorts_navigation_bar_title">Gezinme çubuğunu gizle</string>
|
<string name="revanced_hide_shorts_navigation_bar_title">Gezinme çubuğunu gizle</string>
|
||||||
@@ -864,12 +864,12 @@ Ses parçası menüsünü göstermek için 'Video akışlarını taklit et' ayar
|
|||||||
|
|
||||||
Otomatik oynatma YouTube ayarlarından değiştirilebilir:
|
Otomatik oynatma YouTube ayarlarından değiştirilebilir:
|
||||||
Ayarlar → Oynatma → Sonraki videoyu otomatik oynat"</string>
|
Ayarlar → Oynatma → Sonraki videoyu otomatik oynat"</string>
|
||||||
<string name="revanced_end_screen_suggested_video_summary_off">Bitiş ekranı önerilen videosu gösteriliyor</string>
|
<string name="revanced_end_screen_suggested_video_summary_off">Bitiş ekranı önerilen videosu görünür</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
<patch id="layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch">
|
||||||
<string name="revanced_hide_related_videos_overlay_title">İlgili videolar bindirmesini gizle</string>
|
<string name="revanced_hide_related_videos_overlay_title">İlgili videolar katmanını gizle</string>
|
||||||
<string name="revanced_hide_related_videos_overlay_summary_on">Tam ekrandaki ilgili videolar bindirmesi gizli</string>
|
<string name="revanced_hide_related_videos_overlay_summary_on">Tam ekrandaki ilgili videolar katmanı gizli</string>
|
||||||
<string name="revanced_hide_related_videos_overlay_summary_off">Tam ekrandaki ilgili videolar bindirmesi görünür</string>
|
<string name="revanced_hide_related_videos_overlay_summary_off">Tam ekrandaki ilgili videolar katmanı görünür</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.time.hideTimestampPatch">
|
<patch id="layout.hide.time.hideTimestampPatch">
|
||||||
<string name="revanced_hide_timestamp_title">Video zaman damgasını gizle</string>
|
<string name="revanced_hide_timestamp_title">Video zaman damgasını gizle</string>
|
||||||
@@ -894,7 +894,7 @@ Ayarlar → Oynatma → Sonraki videoyu otomatik oynat"</string>
|
|||||||
<string name="revanced_open_videos_fullscreen_portrait_summary_off">Videolar tam ekranda açılmaz</string>
|
<string name="revanced_open_videos_fullscreen_portrait_summary_off">Videolar tam ekranda açılmaz</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.player.overlay.customPlayerOverlayOpacityResourcePatch">
|
<patch id="layout.player.overlay.customPlayerOverlayOpacityResourcePatch">
|
||||||
<string name="revanced_player_overlay_opacity_title">Oynatıcı paneli opaklığı</string>
|
<string name="revanced_player_overlay_opacity_title">Oynatıcı katmanı opaklığı</string>
|
||||||
<string name="revanced_player_overlay_opacity_summary">0-100 arasında opaklık değeri, 0 şeffaftır</string>
|
<string name="revanced_player_overlay_opacity_summary">0-100 arasında opaklık değeri, 0 şeffaftır</string>
|
||||||
<string name="revanced_player_overlay_opacity_invalid_toast">Oynatıcı katmanı opaklığı 0-100 arasında olmalıdır</string>
|
<string name="revanced_player_overlay_opacity_invalid_toast">Oynatıcı katmanı opaklığı 0-100 arasında olmalıdır</string>
|
||||||
</patch>
|
</patch>
|
||||||
@@ -984,13 +984,13 @@ Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet
|
|||||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Atlama düğmesini otomatik olarak gizle</string>
|
<string name="revanced_sb_enable_auto_hide_skip_segment_button">Atlama düğmesini otomatik olarak gizle</string>
|
||||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Atlama düğmesi birkaç saniye sonra gizlenir</string>
|
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_on">Atlama düğmesi birkaç saniye sonra gizlenir</string>
|
||||||
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Atlama düğmesi bütün kısım boyunca gösterilir</string>
|
<string name="revanced_sb_enable_auto_hide_skip_segment_button_sum_off">Atlama düğmesi bütün kısım boyunca gösterilir</string>
|
||||||
<string name="revanced_sb_auto_hide_skip_button_duration">Atla düğmesi süresi</string>
|
<string name="revanced_sb_auto_hide_skip_button_duration">Atlama düğmesi süresi</string>
|
||||||
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Atla ve öne çıkanlara atla düğmelerini otomatik olarak gizlemeden önce ne kadar süreyle göster</string>
|
<string name="revanced_sb_auto_hide_skip_button_duration_sum">Atla ve vurguya atla düğmelerinin otomatik olarak gizlenmeden önce ne kadar süre gösterileceği</string>
|
||||||
<string name="revanced_sb_general_skiptoast">Atlamayı geri al bildirimini göster</string>
|
<string name="revanced_sb_general_skiptoast">Atlamayı geri al bildirimini göster</string>
|
||||||
<string name="revanced_sb_general_skiptoast_sum_on">Bildirim, bir segment otomatik olarak atlandığında gösterilir. Atlamayı geri almak için bildirimine dokunun</string>
|
<string name="revanced_sb_general_skiptoast_sum_on">Bir kısım otomatik olarak atlandığında bildirim gösterilir. Atlamayı geri almak için bildirime dokunun</string>
|
||||||
<string name="revanced_sb_general_skiptoast_sum_off">Toast gösterilmiyor</string>
|
<string name="revanced_sb_general_skiptoast_sum_off">Bildirim gösterilmez</string>
|
||||||
<string name="revanced_sb_toast_on_skip_duration">Atlama toast süresi</string>
|
<string name="revanced_sb_toast_on_skip_duration">Atlama bildirimi süresi</string>
|
||||||
<string name="revanced_sb_toast_on_skip_duration_sum">Geri al atla bildirimini ne kadar süreyle göster</string>
|
<string name="revanced_sb_toast_on_skip_duration_sum">Atlamayı geri alma bildiriminin ne kadar süre gösterileceği</string>
|
||||||
<string name="revanced_sb_duration_1s">1 saniye</string>
|
<string name="revanced_sb_duration_1s">1 saniye</string>
|
||||||
<string name="revanced_sb_duration_2s">2 saniye</string>
|
<string name="revanced_sb_duration_2s">2 saniye</string>
|
||||||
<string name="revanced_sb_duration_3s">3 saniye</string>
|
<string name="revanced_sb_duration_3s">3 saniye</string>
|
||||||
@@ -1001,14 +1001,14 @@ Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet
|
|||||||
<string name="revanced_sb_duration_8s">8 saniye</string>
|
<string name="revanced_sb_duration_8s">8 saniye</string>
|
||||||
<string name="revanced_sb_duration_9s">9 saniye</string>
|
<string name="revanced_sb_duration_9s">9 saniye</string>
|
||||||
<string name="revanced_sb_duration_10s">10 saniye</string>
|
<string name="revanced_sb_duration_10s">10 saniye</string>
|
||||||
<string name="revanced_sb_general_time_without">Kısımlar çıkarıldığında kalan video süresini göster</string>
|
<string name="revanced_sb_general_time_without">Kısımlar olmadan video süresini göster</string>
|
||||||
<string name="revanced_sb_general_time_without_sum_on">Tüm segmentler çıkarıldıktan sonra video uzunluğu arama çubuğunda gösterilir</string>
|
<string name="revanced_sb_general_time_without_sum_on">Video süresi eksi bütün kısımların süresi zaman çubuğunda görünür</string>
|
||||||
<string name="revanced_sb_general_time_without_sum_off">Tam video uzunluğu gösterilir</string>
|
<string name="revanced_sb_general_time_without_sum_off">Tam video süresi görünür</string>
|
||||||
<string name="revanced_sb_create_segment_category">Yeni kısım oluşturma</string>
|
<string name="revanced_sb_create_segment_category">Yeni kısım oluşturma</string>
|
||||||
<string name="revanced_sb_enable_create_segment">Yeni kısım oluşturma düğmesini göster</string>
|
<string name="revanced_sb_enable_create_segment">Yeni kısım oluşturma düğmesini göster</string>
|
||||||
<string name="revanced_sb_enable_create_segment_sum_on">Yeni kısım oluşturma düğmesi gösterilir</string>
|
<string name="revanced_sb_enable_create_segment_sum_on">Yeni kısım oluşturma düğmesi gösterilir</string>
|
||||||
<string name="revanced_sb_enable_create_segment_sum_off">Yeni kısım oluşturma düğmesi gösterilmez</string>
|
<string name="revanced_sb_enable_create_segment_sum_off">Yeni kısım oluşturma düğmesi gösterilmez</string>
|
||||||
<string name="revanced_sb_general_adjusting">Yeni kısım oluştururken atlama süresi</string>
|
<string name="revanced_sb_general_adjusting">Yeni kısım oluştururkenki atlama süresi</string>
|
||||||
<string name="revanced_sb_general_adjusting_sum">Yeni bölüm oluştururkenki atlama düğmelerinin atlayacağı milisaniye miktarı</string>
|
<string name="revanced_sb_general_adjusting_sum">Yeni bölüm oluştururkenki atlama düğmelerinin atlayacağı milisaniye miktarı</string>
|
||||||
<string name="revanced_sb_general_adjusting_invalid">Değer pozitif bir sayı olmalıdır</string>
|
<string name="revanced_sb_general_adjusting_invalid">Değer pozitif bir sayı olmalıdır</string>
|
||||||
<string name="revanced_sb_guidelines_preference_title">Yönergeleri görüntüle</string>
|
<string name="revanced_sb_guidelines_preference_title">Yönergeleri görüntüle</string>
|
||||||
@@ -1018,10 +1018,10 @@ Bu özellik, 720p veya daha düşük video kalitesi ve çok hızlı bir internet
|
|||||||
<string name="revanced_sb_guidelines_popup_already_read">Okudum</string>
|
<string name="revanced_sb_guidelines_popup_already_read">Okudum</string>
|
||||||
<string name="revanced_sb_guidelines_popup_open">Göster</string>
|
<string name="revanced_sb_guidelines_popup_open">Göster</string>
|
||||||
<string name="revanced_sb_general">Genel</string>
|
<string name="revanced_sb_general">Genel</string>
|
||||||
<string name="revanced_sb_toast_on_connection_error_title">API kullanılamadığında bir tost bildirimi göster</string>
|
<string name="revanced_sb_toast_on_connection_error_title">API kullanılamadığında bir bildirim göster</string>
|
||||||
<string name="revanced_sb_toast_on_connection_error_summary_on">SponsorBlock kullanılamadığında tost bildirimi gösterilir</string>
|
<string name="revanced_sb_toast_on_connection_error_summary_on">SponsorBlock kullanılamadığında bir bildirim gösterilir</string>
|
||||||
<string name="revanced_sb_toast_on_connection_error_summary_off">SponsorBlock kullanılamadığında tost bildirimi gösterilmez</string>
|
<string name="revanced_sb_toast_on_connection_error_summary_off">SponsorBlock kullanılamadığında bildirim gösterilmez</string>
|
||||||
<string name="revanced_sb_general_skipcount">Atlama sayısı izlemeyi etkinleştir</string>
|
<string name="revanced_sb_general_skipcount">Atlama sayısı takibini etkinleştir</string>
|
||||||
<string name="revanced_sb_general_skipcount_sum_on">SponsorBlock liderlik tablosunun ne kadar zaman kazanıldığını bilmesini sağlar. Her bir kısım atlandığında liderlik tablosuna bir mesaj gönderilir</string>
|
<string name="revanced_sb_general_skipcount_sum_on">SponsorBlock liderlik tablosunun ne kadar zaman kazanıldığını bilmesini sağlar. Her bir kısım atlandığında liderlik tablosuna bir mesaj gönderilir</string>
|
||||||
<string name="revanced_sb_general_skipcount_sum_off">Atlama sayısı izleme etkin değil</string>
|
<string name="revanced_sb_general_skipcount_sum_off">Atlama sayısı izleme etkin değil</string>
|
||||||
<string name="revanced_sb_general_min_duration">En az kısım süresi</string>
|
<string name="revanced_sb_general_min_duration">En az kısım süresi</string>
|
||||||
@@ -1103,7 +1103,7 @@ Kullanıcı kimliğiniz bir parola gibidir ve asla paylaşılmamalıdır.
|
|||||||
<string name="revanced_sb_skip_seekbaronly">Zaman çubuğunda göster</string>
|
<string name="revanced_sb_skip_seekbaronly">Zaman çubuğunda göster</string>
|
||||||
<string name="revanced_sb_skip_ignore">Devre dışı bırak</string>
|
<string name="revanced_sb_skip_ignore">Devre dışı bırak</string>
|
||||||
<string name="revanced_sb_submit_failed_invalid">Kısım gönderilemedi: %s</string>
|
<string name="revanced_sb_submit_failed_invalid">Kısım gönderilemedi: %s</string>
|
||||||
<string name="revanced_sb_submit_failed_timeout">SponsorBlock geçici olarak kullanılamıyor</string>
|
<string name="revanced_sb_submit_failed_timeout">SponsorBlock geçici olarak kapalı</string>
|
||||||
<string name="revanced_sb_submit_failed_unknown_error">Kısım gönderilemedi (durum: %1$d %2$s)</string>
|
<string name="revanced_sb_submit_failed_unknown_error">Kısım gönderilemedi (durum: %1$d %2$s)</string>
|
||||||
<string name="revanced_sb_submit_failed_rate_limit">Kısım gönderilemiyor. Kullanıcı veya IP\'den çok fazla istek</string>
|
<string name="revanced_sb_submit_failed_rate_limit">Kısım gönderilemiyor. Kullanıcı veya IP\'den çok fazla istek</string>
|
||||||
<string name="revanced_sb_submit_failed_forbidden">Kısım gönderilemiyor: %s</string>
|
<string name="revanced_sb_submit_failed_forbidden">Kısım gönderilemiyor: %s</string>
|
||||||
@@ -1120,7 +1120,7 @@ Aynısı mevcut"</string>
|
|||||||
<string name="revanced_sb_vote_upvote">Olumlu oy</string>
|
<string name="revanced_sb_vote_upvote">Olumlu oy</string>
|
||||||
<string name="revanced_sb_vote_downvote">Olumsuz oy</string>
|
<string name="revanced_sb_vote_downvote">Olumsuz oy</string>
|
||||||
<string name="revanced_sb_vote_category">Kategori değiştir</string>
|
<string name="revanced_sb_vote_category">Kategori değiştir</string>
|
||||||
<string name="revanced_sb_vote_no_segments">Oylanılacak bir kısım yok</string>
|
<string name="revanced_sb_vote_no_segments">Oylanılacak kısım bulunmuyor</string>
|
||||||
<!-- A segment start and end time, such as "02:10 to 03:40". -->
|
<!-- A segment start and end time, such as "02:10 to 03:40". -->
|
||||||
<string name="revanced_sb_vote_segment_time_to_from">%1$s - %2$s</string>
|
<string name="revanced_sb_vote_segment_time_to_from">%1$s - %2$s</string>
|
||||||
<string name="revanced_sb_new_segment_choose_category">Kısım kategorisini seçin</string>
|
<string name="revanced_sb_new_segment_choose_category">Kısım kategorisini seçin</string>
|
||||||
@@ -1218,7 +1218,7 @@ Daha sonra kapatılırsa, arayüz hatalarını önlemek için uygulama verilerin
|
|||||||
<string name="revanced_change_start_page_entry_live">Canlı yayın</string>
|
<string name="revanced_change_start_page_entry_live">Canlı yayın</string>
|
||||||
<string name="revanced_change_start_page_entry_movies">Filmler</string>
|
<string name="revanced_change_start_page_entry_movies">Filmler</string>
|
||||||
<string name="revanced_change_start_page_entry_music">Müzik</string>
|
<string name="revanced_change_start_page_entry_music">Müzik</string>
|
||||||
<string name="revanced_change_start_page_entry_news">Habercilik</string>
|
<string name="revanced_change_start_page_entry_news">Haberler</string>
|
||||||
<string name="revanced_change_start_page_entry_notifications">Bildirimler</string>
|
<string name="revanced_change_start_page_entry_notifications">Bildirimler</string>
|
||||||
<string name="revanced_change_start_page_entry_playlists">Oynatma listeleri</string>
|
<string name="revanced_change_start_page_entry_playlists">Oynatma listeleri</string>
|
||||||
<string name="revanced_change_start_page_entry_search">Arama</string>
|
<string name="revanced_change_start_page_entry_search">Arama</string>
|
||||||
@@ -1228,7 +1228,7 @@ Daha sonra kapatılırsa, arayüz hatalarını önlemek için uygulama verilerin
|
|||||||
<string name="revanced_change_start_page_entry_trending">Trendler</string>
|
<string name="revanced_change_start_page_entry_trending">Trendler</string>
|
||||||
<string name="revanced_change_start_page_entry_virtual_reality">Sanal Gerçeklik</string>
|
<string name="revanced_change_start_page_entry_virtual_reality">Sanal Gerçeklik</string>
|
||||||
<string name="revanced_change_start_page_entry_watch_later">Daha sonra izle</string>
|
<string name="revanced_change_start_page_entry_watch_later">Daha sonra izle</string>
|
||||||
<string name="revanced_change_start_page_entry_your_clips">Sizin klipleriniz</string>
|
<string name="revanced_change_start_page_entry_your_clips">Klipleriniz</string>
|
||||||
<string name="revanced_change_start_page_always_title">Başlangıç sayfasını her zaman değiştir</string>
|
<string name="revanced_change_start_page_always_title">Başlangıç sayfasını her zaman değiştir</string>
|
||||||
<string name="revanced_change_start_page_always_summary_on">"Başlangıç sayfası her zaman değiştirilir
|
<string name="revanced_change_start_page_always_summary_on">"Başlangıç sayfası her zaman değiştirilir
|
||||||
|
|
||||||
@@ -1248,8 +1248,8 @@ Kısıtlama: Araç çubuğundaki geri düğmesini kullanmak işe yaramayabilir"<
|
|||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.shortsautoplay.shortsAutoplayPatch">
|
<patch id="layout.shortsautoplay.shortsAutoplayPatch">
|
||||||
<string name="revanced_shorts_autoplay_title">Shorts\'u otomatik oynat</string>
|
<string name="revanced_shorts_autoplay_title">Shorts\'u otomatik oynat</string>
|
||||||
<string name="revanced_shorts_autoplay_summary_on">Sıradaki Shorts videosu otomatik olarak oynatılacak</string>
|
<string name="revanced_shorts_autoplay_summary_on">Shorts otomatik oynatılacak</string>
|
||||||
<string name="revanced_shorts_autoplay_summary_off">Aynı Shorts videosu sürekli döngü yapacak</string>
|
<string name="revanced_shorts_autoplay_summary_off">Aynı Shorts videosu sürekli yeniden oynayacak</string>
|
||||||
<string name="revanced_shorts_autoplay_background_title">Arka planda Shorts\'u otomatik oynat</string>
|
<string name="revanced_shorts_autoplay_background_title">Arka planda Shorts\'u otomatik oynat</string>
|
||||||
<string name="revanced_shorts_autoplay_background_summary_on">Shorts arka planda otomatik oynatılacak</string>
|
<string name="revanced_shorts_autoplay_background_summary_on">Shorts arka planda otomatik oynatılacak</string>
|
||||||
<string name="revanced_shorts_autoplay_background_summary_off">Shorts arka planda döngüde olacak</string>
|
<string name="revanced_shorts_autoplay_background_summary_off">Shorts arka planda döngüde olacak</string>
|
||||||
@@ -1476,7 +1476,7 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir"</string>
|
|||||||
<string name="revanced_custom_speed_menu_title">Özel oynatma hızı menüsü</string>
|
<string name="revanced_custom_speed_menu_title">Özel oynatma hızı menüsü</string>
|
||||||
<string name="revanced_custom_speed_menu_summary_on">Özel oynatma hızı menüsü gösterilir</string>
|
<string name="revanced_custom_speed_menu_summary_on">Özel oynatma hızı menüsü gösterilir</string>
|
||||||
<string name="revanced_custom_speed_menu_summary_off">Özel oynatma hızı menüsü gösterilmez</string>
|
<string name="revanced_custom_speed_menu_summary_off">Özel oynatma hızı menüsü gösterilmez</string>
|
||||||
<string name="revanced_restore_old_speed_menu_title">Eski oynatma hızı menüsünü geri yükle</string>
|
<string name="revanced_restore_old_speed_menu_title">Eski oynatma hızı menüsünü geri getir</string>
|
||||||
<string name="revanced_restore_old_speed_menu_summary_on">Eski hız menüsü gösterilir</string>
|
<string name="revanced_restore_old_speed_menu_summary_on">Eski hız menüsü gösterilir</string>
|
||||||
<string name="revanced_restore_old_speed_menu_summary_off">Modern hız menüsü gösterilir</string>
|
<string name="revanced_restore_old_speed_menu_summary_off">Modern hız menüsü gösterilir</string>
|
||||||
<string name="revanced_custom_playback_speeds_title">Özel oynatma hızları</string>
|
<string name="revanced_custom_playback_speeds_title">Özel oynatma hızları</string>
|
||||||
@@ -1490,10 +1490,10 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir"</string>
|
|||||||
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
<patch id="video.speed.remember.rememberPlaybackSpeedPatch">
|
||||||
<string name="revanced_remember_playback_speed_last_selected_title">Oynatma hızı değişikliklerini hatırla</string>
|
<string name="revanced_remember_playback_speed_last_selected_title">Oynatma hızı değişikliklerini hatırla</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_summary_on">Oynatma hızı değişiklikleri tüm videolara uygulanır</string>
|
<string name="revanced_remember_playback_speed_last_selected_summary_on">Oynatma hızı değişiklikleri tüm videolara uygulanır</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_summary_off">Oynatma hızı değişiklikleri yalnızca geçerli videoya uygulanır</string>
|
<string name="revanced_remember_playback_speed_last_selected_summary_off">Oynatma hızı değişiklikleri yalnızca mevcut videoya uygulanır</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_toast_title">Oynatma hızı değişikliklerinde bildirim göster</string>
|
<string name="revanced_remember_playback_speed_last_selected_toast_title">Oynatma hızı değişikliklerinde bildirim göster</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilir</string>
|
<string name="revanced_remember_playback_speed_last_selected_toast_summary_on">Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilir</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilmez.</string>
|
<string name="revanced_remember_playback_speed_last_selected_toast_summary_off">Varsayılan oynatma hızı değiştirildiğinde bir bildirim gösterilmez</string>
|
||||||
<string name="revanced_playback_speed_default_title">Varsayılan oynatma hızı</string>
|
<string name="revanced_playback_speed_default_title">Varsayılan oynatma hızı</string>
|
||||||
<string name="revanced_remember_playback_speed_toast">Varsayılan hız %s olarak ayarlandı</string>
|
<string name="revanced_remember_playback_speed_toast">Varsayılan hız %s olarak ayarlandı</string>
|
||||||
</patch>
|
</patch>
|
||||||
|
|||||||
Reference in New Issue
Block a user