mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2026-01-13 18:22:41 +00:00
Compare commits
59 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a45a13f73 | ||
|
|
067b15c300 | ||
|
|
8a1c283542 | ||
|
|
93d1e8b2ff | ||
|
|
c60d5b54fa | ||
|
|
ef180f082e | ||
|
|
f52741cc37 | ||
|
|
2a2661f066 | ||
|
|
b521903138 | ||
|
|
acbd699d95 | ||
|
|
6b8928becb | ||
|
|
e393bdb1e5 | ||
|
|
bba6b96765 | ||
|
|
740116356c | ||
|
|
2f6e4fa4a3 | ||
|
|
fb3f6721b2 | ||
|
|
4e7bd21e5c | ||
|
|
219c2030b9 | ||
|
|
b75fdb4566 | ||
|
|
4584b14a31 | ||
|
|
814ddb5932 | ||
|
|
6ea0f6290a | ||
|
|
c796fe1fe6 | ||
|
|
a452a164e6 | ||
|
|
0d9dd69b19 | ||
|
|
d7b73c18f1 | ||
|
|
07f66c0e45 | ||
|
|
d449acbf86 | ||
|
|
fce416ba76 | ||
|
|
cb6bfe8556 | ||
|
|
d7b31e1d25 | ||
|
|
85057376d6 | ||
|
|
c43ac7c869 | ||
|
|
b2657315f1 | ||
|
|
de5ed9717c | ||
|
|
e17a6cbb9f | ||
|
|
8e783b774b | ||
|
|
733663f40d | ||
|
|
4b2a792a62 | ||
|
|
f7aa171d01 | ||
|
|
5eafefb683 | ||
|
|
5d1b02a856 | ||
|
|
4acda3d9ae | ||
|
|
643e10ace2 | ||
|
|
7b64a232de | ||
|
|
d7472d837d | ||
|
|
94b473ab4b | ||
|
|
4a05bbb6c8 | ||
|
|
0343659b35 | ||
|
|
f38eadbe30 | ||
|
|
eb29a53ac5 | ||
|
|
bc71e260e2 | ||
|
|
ddf23a3443 | ||
|
|
d41b248d1c | ||
|
|
a025b25933 | ||
|
|
c9a52a6088 | ||
|
|
0276dca406 | ||
|
|
646fa877ba | ||
|
|
d1b0cd74be |
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "org.schabi.newpipe"
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 27
|
||||
versionCode 63
|
||||
versionName "0.13.4"
|
||||
versionCode 64
|
||||
versionName "0.13.5"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
|
||||
6
app/proguard-rules.pro
vendored
6
app/proguard-rules.pro
vendored
@@ -42,3 +42,9 @@
|
||||
-dontwarn javax.annotation.**
|
||||
# A resource is loaded with a relative path so the package of this class must be preserved.
|
||||
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
|
||||
-keepclassmembers class * implements java.io.Serializable {
|
||||
static final long serialVersionUID;
|
||||
!static !transient <fields>;
|
||||
private void writeObject(java.io.ObjectOutputStream);
|
||||
private void readObject(java.io.ObjectInputStream);
|
||||
}
|
||||
|
||||
@@ -271,6 +271,7 @@ public abstract class BasePlayer implements
|
||||
if (audioReactor != null) audioReactor.dispose();
|
||||
if (playbackManager != null) playbackManager.dispose();
|
||||
if (databaseUpdateReactor != null) databaseUpdateReactor.dispose();
|
||||
if (mediaSessionManager != null) mediaSessionManager.dispose();
|
||||
|
||||
if (playQueueAdapter != null) {
|
||||
playQueueAdapter.unsetSelectedListener();
|
||||
|
||||
@@ -119,6 +119,10 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) getWindow().setStatusBarColor(Color.BLACK);
|
||||
setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
||||
|
||||
WindowManager.LayoutParams lp = getWindow().getAttributes();
|
||||
lp.screenBrightness = PlayerHelper.getScreenBrightness(getApplicationContext());
|
||||
getWindow().setAttributes(lp);
|
||||
|
||||
hideSystemUi();
|
||||
setContentView(R.layout.activity_main_player);
|
||||
playerImpl = new VideoPlayerImpl(this);
|
||||
@@ -205,6 +209,9 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||
if (DEBUG) Log.d(TAG, "onStop() called");
|
||||
super.onStop();
|
||||
playerImpl.destroy();
|
||||
|
||||
PlayerHelper.setScreenBrightness(getApplicationContext(),
|
||||
getWindow().getAttributes().screenBrightness);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
@@ -647,7 +654,7 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||
@Override
|
||||
protected int getOverrideResolutionIndex(final List<VideoStream> sortedVideos,
|
||||
final String playbackQuality) {
|
||||
return ListHelper.getDefaultResolutionIndex(context, sortedVideos, playbackQuality);
|
||||
return ListHelper.getResolutionIndex(context, sortedVideos, playbackQuality);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
@@ -884,7 +891,9 @@ public final class MainVideoPlayer extends AppCompatActivity
|
||||
private final boolean isPlayerGestureEnabled = PlayerHelper.isPlayerGestureEnabled(getApplicationContext());
|
||||
|
||||
private final float stepsBrightness = 15, stepBrightness = (1f / stepsBrightness), minBrightness = .01f;
|
||||
private float currentBrightness = .5f;
|
||||
private float currentBrightness = getWindow().getAttributes().screenBrightness > 0
|
||||
? getWindow().getAttributes().screenBrightness
|
||||
: 0.5f;
|
||||
|
||||
private int currentVolume, maxVolume = playerImpl.getAudioReactor().getMaxVolume();
|
||||
private final float stepsVolume = 15, stepVolume = (float) Math.ceil(maxVolume / stepsVolume), minVolume = 0;
|
||||
|
||||
@@ -517,7 +517,7 @@ public final class PopupVideoPlayer extends Service {
|
||||
@Override
|
||||
protected int getOverrideResolutionIndex(final List<VideoStream> sortedVideos,
|
||||
final String playbackQuality) {
|
||||
return ListHelper.getPopupDefaultResolutionIndex(context, sortedVideos, playbackQuality);
|
||||
return ListHelper.getPopupResolutionIndex(context, sortedVideos, playbackQuality);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -11,7 +11,6 @@ import android.view.KeyEvent;
|
||||
import com.google.android.exoplayer2.Player;
|
||||
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
|
||||
|
||||
import org.schabi.newpipe.player.mediasession.DummyPlaybackPreparer;
|
||||
import org.schabi.newpipe.player.mediasession.MediaSessionCallback;
|
||||
import org.schabi.newpipe.player.mediasession.PlayQueueNavigator;
|
||||
import org.schabi.newpipe.player.mediasession.PlayQueuePlaybackController;
|
||||
@@ -26,10 +25,12 @@ public class MediaSessionManager {
|
||||
@NonNull final Player player,
|
||||
@NonNull final MediaSessionCallback callback) {
|
||||
this.mediaSession = new MediaSessionCompat(context, TAG);
|
||||
this.mediaSession.setActive(true);
|
||||
|
||||
this.sessionConnector = new MediaSessionConnector(mediaSession,
|
||||
new PlayQueuePlaybackController(callback));
|
||||
this.sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, callback));
|
||||
this.sessionConnector.setPlayer(player, new DummyPlaybackPreparer());
|
||||
this.sessionConnector.setPlayer(player, null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -37,4 +38,11 @@ public class MediaSessionManager {
|
||||
public KeyEvent handleMediaButtonIntent(final Intent intent) {
|
||||
return MediaButtonReceiver.handleIntent(mediaSession, intent);
|
||||
}
|
||||
|
||||
public void dispose() {
|
||||
this.sessionConnector.setPlayer(null, null);
|
||||
this.sessionConnector.setQueueNavigator(null);
|
||||
this.mediaSession.setActive(false);
|
||||
this.mediaSession.release();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ import android.support.annotation.Nullable;
|
||||
import android.view.accessibility.CaptioningManager;
|
||||
|
||||
import com.google.android.exoplayer2.SeekParameters;
|
||||
import com.google.android.exoplayer2.text.CaptionStyleCompat;
|
||||
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
|
||||
import com.google.android.exoplayer2.trackselection.TrackSelection;
|
||||
import com.google.android.exoplayer2.text.CaptionStyleCompat;
|
||||
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
|
||||
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
@@ -37,6 +37,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FILL;
|
||||
import static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIT;
|
||||
@@ -260,6 +261,16 @@ public class PlayerHelper {
|
||||
|
||||
return captioningManager.getFontScale();
|
||||
}
|
||||
|
||||
public static float getScreenBrightness(@NonNull final Context context) {
|
||||
//a value of less than 0, the default, means to use the preferred screen brightness
|
||||
return getScreenBrightness(context, -1);
|
||||
}
|
||||
|
||||
public static void setScreenBrightness(@NonNull final Context context, final float setScreenBrightness) {
|
||||
setScreenBrightness(context, setScreenBrightness, System.currentTimeMillis());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Private helpers
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
@@ -292,4 +303,23 @@ public class PlayerHelper {
|
||||
private static boolean isAutoQueueEnabled(@NonNull final Context context, final boolean b) {
|
||||
return getPreferences(context).getBoolean(context.getString(R.string.auto_queue_key), b);
|
||||
}
|
||||
|
||||
private static void setScreenBrightness(@NonNull final Context context, final float screenBrightness, final long timestamp) {
|
||||
SharedPreferences.Editor editor = getPreferences(context).edit();
|
||||
editor.putFloat(context.getString(R.string.screen_brightness_key), screenBrightness);
|
||||
editor.putLong(context.getString(R.string.screen_brightness_timestamp_key), timestamp);
|
||||
editor.apply();
|
||||
}
|
||||
|
||||
private static float getScreenBrightness(@NonNull final Context context, final float screenBrightness) {
|
||||
SharedPreferences sp = getPreferences(context);
|
||||
long timestamp = sp.getLong(context.getString(R.string.screen_brightness_timestamp_key), 0);
|
||||
// hypothesis: 4h covers a viewing block, eg evening. External lightning conditions will change in the next
|
||||
// viewing block so we fall back to the default brightness
|
||||
if ((System.currentTimeMillis() - timestamp) > TimeUnit.HOURS.toMillis(4)) {
|
||||
return screenBrightness;
|
||||
} else {
|
||||
return sp.getFloat(context.getString(R.string.screen_brightness_key), screenBrightness);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
package org.schabi.newpipe.player.mediasession;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.ResultReceiver;
|
||||
|
||||
import com.google.android.exoplayer2.Player;
|
||||
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
|
||||
|
||||
public class DummyPlaybackPreparer implements MediaSessionConnector.PlaybackPreparer {
|
||||
@Override
|
||||
public long getSupportedPrepareActions() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepare() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareFromMediaId(String mediaId, Bundle extras) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareFromSearch(String query, Bundle extras) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepareFromUri(Uri uri, Bundle extras) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getCommands() {
|
||||
return new String[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCommand(Player player, String command, Bundle extras, ResultReceiver cb) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -13,5 +13,4 @@ public interface MediaSessionCallback {
|
||||
|
||||
void onPlay();
|
||||
void onPause();
|
||||
void onSetShuffle(final boolean isShuffled);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package org.schabi.newpipe.player.mediasession;
|
||||
|
||||
import android.support.v4.media.session.PlaybackStateCompat;
|
||||
|
||||
import com.google.android.exoplayer2.Player;
|
||||
import com.google.android.exoplayer2.ext.mediasession.DefaultPlaybackController;
|
||||
|
||||
@@ -22,10 +20,4 @@ public class PlayQueuePlaybackController extends DefaultPlaybackController {
|
||||
public void onPause(Player player) {
|
||||
callback.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSetShuffleMode(Player player, int shuffleMode) {
|
||||
callback.onSetShuffle(shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_ALL
|
||||
|| shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_GROUP);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,9 +69,4 @@ public class BasePlayerMediaSession implements MediaSessionCallback {
|
||||
public void onPause() {
|
||||
player.onPause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSetShuffle(boolean isShuffled) {
|
||||
player.onShuffleModeEnabledChanged(isShuffled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.schabi.newpipe.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.StringRes;
|
||||
|
||||
@@ -13,56 +14,38 @@ import org.schabi.newpipe.extractor.stream.VideoStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
public final class ListHelper {
|
||||
|
||||
// Video format in order of quality. 0=lowest quality, n=highest quality
|
||||
private static final List<MediaFormat> VIDEO_FORMAT_QUALITY_RANKING =
|
||||
Arrays.asList(MediaFormat.v3GPP, MediaFormat.WEBM, MediaFormat.MPEG_4);
|
||||
|
||||
// Audio format in order of quality. 0=lowest quality, n=highest quality
|
||||
private static final List<MediaFormat> AUDIO_FORMAT_QUALITY_RANKING =
|
||||
Arrays.asList(MediaFormat.MP3, MediaFormat.WEBMA, MediaFormat.M4A);
|
||||
// Audio format in order of efficiency. 0=most efficient, n=least efficient
|
||||
private static final List<MediaFormat> AUDIO_FORMAT_EFFICIENCY_RANKING =
|
||||
Arrays.asList(MediaFormat.WEBMA, MediaFormat.M4A, MediaFormat.MP3);
|
||||
|
||||
private static final List<String> HIGH_RESOLUTION_LIST = Arrays.asList("1440p", "2160p", "1440p60", "2160p60");
|
||||
|
||||
/**
|
||||
* Return the index of the default stream in the list, based on the parameters
|
||||
* defaultResolution and defaultFormat
|
||||
*
|
||||
* @return index of the default resolution&format
|
||||
*/
|
||||
public static int getDefaultResolutionIndex(String defaultResolution, String bestResolutionKey, MediaFormat defaultFormat, List<VideoStream> videoStreams) {
|
||||
if (videoStreams == null || videoStreams.isEmpty()) return -1;
|
||||
|
||||
sortStreamList(videoStreams, false);
|
||||
if (defaultResolution.equals(bestResolutionKey)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int defaultStreamIndex = getDefaultStreamIndex(defaultResolution, defaultFormat, videoStreams);
|
||||
if (defaultStreamIndex == -1 && defaultResolution.contains("p60")) {
|
||||
defaultStreamIndex = getDefaultStreamIndex(defaultResolution.replace("p60", "p"), defaultFormat, videoStreams);
|
||||
}
|
||||
|
||||
// this is actually an error,
|
||||
// but maybe there is really no stream fitting to the default value.
|
||||
if (defaultStreamIndex == -1) return 0;
|
||||
|
||||
return defaultStreamIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #getDefaultResolutionIndex(String, String, MediaFormat, List)
|
||||
*/
|
||||
public static int getDefaultResolutionIndex(Context context, List<VideoStream> videoStreams) {
|
||||
SharedPreferences defaultPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if (defaultPreferences == null) return 0;
|
||||
|
||||
String defaultResolution = defaultPreferences.getString(context.getString(R.string.default_resolution_key), context.getString(R.string.default_resolution_value));
|
||||
return getDefaultResolutionIndex(context, videoStreams, defaultResolution);
|
||||
String defaultResolution = computeDefaultResolution(context,
|
||||
R.string.default_resolution_key, R.string.default_resolution_value);
|
||||
return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #getDefaultResolutionIndex(String, String, MediaFormat, List)
|
||||
*/
|
||||
public static int getDefaultResolutionIndex(Context context, List<VideoStream> videoStreams, String defaultResolution) {
|
||||
public static int getResolutionIndex(Context context, List<VideoStream> videoStreams, String defaultResolution) {
|
||||
return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);
|
||||
}
|
||||
|
||||
@@ -70,69 +53,29 @@ public final class ListHelper {
|
||||
* @see #getDefaultResolutionIndex(String, String, MediaFormat, List)
|
||||
*/
|
||||
public static int getPopupDefaultResolutionIndex(Context context, List<VideoStream> videoStreams) {
|
||||
SharedPreferences defaultPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if (defaultPreferences == null) return 0;
|
||||
|
||||
String defaultResolution = defaultPreferences.getString(context.getString(R.string.default_popup_resolution_key), context.getString(R.string.default_popup_resolution_value));
|
||||
return getPopupDefaultResolutionIndex(context, videoStreams, defaultResolution);
|
||||
String defaultResolution = computeDefaultResolution(context,
|
||||
R.string.default_popup_resolution_key, R.string.default_popup_resolution_value);
|
||||
return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #getDefaultResolutionIndex(String, String, MediaFormat, List)
|
||||
*/
|
||||
public static int getPopupDefaultResolutionIndex(Context context, List<VideoStream> videoStreams, String defaultResolution) {
|
||||
public static int getPopupResolutionIndex(Context context, List<VideoStream> videoStreams, String defaultResolution) {
|
||||
return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);
|
||||
}
|
||||
|
||||
public static int getDefaultAudioFormat(Context context, List<AudioStream> audioStreams) {
|
||||
MediaFormat defaultFormat = getDefaultFormat(context, R.string.default_audio_format_key, R.string.default_audio_format_value);
|
||||
return getHighestQualityAudioIndex(defaultFormat, audioStreams);
|
||||
}
|
||||
MediaFormat defaultFormat = getDefaultFormat(context, R.string.default_audio_format_key,
|
||||
R.string.default_audio_format_value);
|
||||
|
||||
public static int getHighestQualityAudioIndex(List<AudioStream> audioStreams) {
|
||||
if (audioStreams == null || audioStreams.isEmpty()) return -1;
|
||||
|
||||
int highestQualityIndex = 0;
|
||||
if (audioStreams.size() > 1) for (int i = 1; i < audioStreams.size(); i++) {
|
||||
AudioStream audioStream = audioStreams.get(i);
|
||||
if (audioStream.getAverageBitrate() >= audioStreams.get(highestQualityIndex).getAverageBitrate()) highestQualityIndex = i;
|
||||
// If the user has chosen to limit resolution to conserve mobile data
|
||||
// usage then we should also limit our audio usage.
|
||||
if (isLimitingDataUsage(context)) {
|
||||
return getMostCompactAudioIndex(defaultFormat, audioStreams);
|
||||
} else {
|
||||
return getHighestQualityAudioIndex(defaultFormat, audioStreams);
|
||||
}
|
||||
return highestQualityIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the audio from the list with the highest bitrate
|
||||
*
|
||||
* @param audioStreams list the audio streams
|
||||
* @return audio with highest average bitrate
|
||||
*/
|
||||
public static AudioStream getHighestQualityAudio(List<AudioStream> audioStreams) {
|
||||
if (audioStreams == null || audioStreams.isEmpty()) return null;
|
||||
|
||||
return audioStreams.get(getHighestQualityAudioIndex(audioStreams));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the audio from the list with the highest bitrate
|
||||
*
|
||||
* @param audioStreams list the audio streams
|
||||
* @return index of the audio with the highest average bitrate of the default format
|
||||
*/
|
||||
public static int getHighestQualityAudioIndex(MediaFormat defaultFormat, List<AudioStream> audioStreams) {
|
||||
if (audioStreams == null || audioStreams.isEmpty() || defaultFormat == null) return -1;
|
||||
|
||||
int highestQualityIndex = -1;
|
||||
for (int i = 0; i < audioStreams.size(); i++) {
|
||||
AudioStream audioStream = audioStreams.get(i);
|
||||
if (highestQualityIndex == -1 && audioStream.getFormat() == defaultFormat) highestQualityIndex = i;
|
||||
|
||||
if (highestQualityIndex != -1 && audioStream.getFormat() == defaultFormat
|
||||
&& audioStream.getAverageBitrate() > audioStreams.get(highestQualityIndex).getAverageBitrate()) {
|
||||
highestQualityIndex = i;
|
||||
}
|
||||
}
|
||||
if (highestQualityIndex == -1) highestQualityIndex = getHighestQualityAudioIndex(audioStreams);
|
||||
return highestQualityIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -154,6 +97,50 @@ public final class ListHelper {
|
||||
return getSortedStreamVideosList(defaultFormat, showHigherResolutions, videoStreams, videoOnlyStreams, ascendingOrder);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Utils
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
private static String computeDefaultResolution(Context context, int key, int value) {
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
|
||||
// Load the prefered resolution otherwise the best available
|
||||
String resolution = preferences != null
|
||||
? preferences.getString(context.getString(key), context.getString(value))
|
||||
: context.getString(R.string.best_resolution_key);
|
||||
|
||||
String maxResolution = getResolutionLimit(context);
|
||||
if (maxResolution != null && compareVideoStreamResolution(maxResolution, resolution) < 1){
|
||||
resolution = maxResolution;
|
||||
}
|
||||
return resolution;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the index of the default stream in the list, based on the parameters
|
||||
* defaultResolution and defaultFormat
|
||||
*
|
||||
* @return index of the default resolution&format
|
||||
*/
|
||||
static int getDefaultResolutionIndex(String defaultResolution, String bestResolutionKey,
|
||||
MediaFormat defaultFormat, List<VideoStream> videoStreams) {
|
||||
if (videoStreams == null || videoStreams.isEmpty()) return -1;
|
||||
|
||||
sortStreamList(videoStreams, false);
|
||||
if (defaultResolution.equals(bestResolutionKey)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int defaultStreamIndex = getVideoStreamIndex(defaultResolution, defaultFormat, videoStreams);
|
||||
|
||||
// this is actually an error,
|
||||
// but maybe there is really no stream fitting to the default value.
|
||||
if (defaultStreamIndex == -1) {
|
||||
return 0;
|
||||
}
|
||||
return defaultStreamIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Join the two lists of video streams (video_only and normal videos), and sort them according with default format
|
||||
* chosen by the user
|
||||
@@ -165,7 +152,7 @@ public final class ListHelper {
|
||||
* @param ascendingOrder true -> smallest to greatest | false -> greatest to smallest @return the sorted list
|
||||
* @return the sorted list
|
||||
*/
|
||||
public static List<VideoStream> getSortedStreamVideosList(MediaFormat defaultFormat, boolean showHigherResolutions, List<VideoStream> videoStreams, List<VideoStream> videoOnlyStreams, boolean ascendingOrder) {
|
||||
static List<VideoStream> getSortedStreamVideosList(MediaFormat defaultFormat, boolean showHigherResolutions, List<VideoStream> videoStreams, List<VideoStream> videoOnlyStreams, boolean ascendingOrder) {
|
||||
ArrayList<VideoStream> retList = new ArrayList<>();
|
||||
HashMap<String, VideoStream> hashMap = new HashMap<>();
|
||||
|
||||
@@ -215,36 +202,138 @@ public final class ListHelper {
|
||||
* @param videoStreams list that the sorting will be applied
|
||||
* @param ascendingOrder true -> smallest to greatest | false -> greatest to smallest
|
||||
*/
|
||||
public static void sortStreamList(List<VideoStream> videoStreams, final boolean ascendingOrder) {
|
||||
Collections.sort(videoStreams, new Comparator<VideoStream>() {
|
||||
@Override
|
||||
public int compare(VideoStream o1, VideoStream o2) {
|
||||
int res1 = Integer.parseInt(o1.getResolution().replace("0p60", "1").replaceAll("[^\\d.]", ""));
|
||||
int res2 = Integer.parseInt(o2.getResolution().replace("0p60", "1").replaceAll("[^\\d.]", ""));
|
||||
|
||||
return ascendingOrder ? res1 - res2 : res2 - res1;
|
||||
}
|
||||
private static void sortStreamList(List<VideoStream> videoStreams, final boolean ascendingOrder) {
|
||||
Collections.sort(videoStreams, (o1, o2) -> {
|
||||
int result = compareVideoStreamResolution(o1, o2, VIDEO_FORMAT_QUALITY_RANKING);
|
||||
return result == 0 ? 0 : (ascendingOrder ? result : -result);
|
||||
});
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Utils
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
/**
|
||||
* Get the audio from the list with the highest quality. Format will be ignored if it yields
|
||||
* no results.
|
||||
*
|
||||
* @param audioStreams list the audio streams
|
||||
* @return index of the audio with the highest average bitrate of the default format
|
||||
*/
|
||||
static int getHighestQualityAudioIndex(MediaFormat format, List<AudioStream> audioStreams) {
|
||||
int result = -1;
|
||||
if (audioStreams != null) {
|
||||
while(result == -1) {
|
||||
AudioStream prevStream = null;
|
||||
for (int idx = 0; idx < audioStreams.size(); idx++) {
|
||||
AudioStream stream = audioStreams.get(idx);
|
||||
if ((format == null || stream.getFormat() == format) &&
|
||||
(prevStream == null || compareAudioStreamBitrate(prevStream, stream,
|
||||
AUDIO_FORMAT_QUALITY_RANKING) < 0)) {
|
||||
prevStream = stream;
|
||||
result = idx;
|
||||
}
|
||||
}
|
||||
if (result == -1 && format == null) {
|
||||
break;
|
||||
}
|
||||
format = null;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int getDefaultStreamIndex(String defaultResolution, MediaFormat defaultFormat, List<VideoStream> videoStreams) {
|
||||
int defaultStreamIndex = -1;
|
||||
for (int i = 0; i < videoStreams.size(); i++) {
|
||||
VideoStream stream = videoStreams.get(i);
|
||||
if (defaultStreamIndex == -1 && stream.getResolution().equals(defaultResolution)) defaultStreamIndex = i;
|
||||
/**
|
||||
* Get the audio from the list with the lowest bitrate and efficient format. Format will be
|
||||
* ignored if it yields no results.
|
||||
*
|
||||
* @param format The target format type or null if it doesn't matter
|
||||
* @param audioStreams list the audio streams
|
||||
* @return index of the audio stream that can produce the most compact results or -1 if not found.
|
||||
*/
|
||||
static int getMostCompactAudioIndex(MediaFormat format, List<AudioStream> audioStreams) {
|
||||
int result = -1;
|
||||
if (audioStreams != null) {
|
||||
while(result == -1) {
|
||||
AudioStream prevStream = null;
|
||||
for (int idx = 0; idx < audioStreams.size(); idx++) {
|
||||
AudioStream stream = audioStreams.get(idx);
|
||||
if ((format == null || stream.getFormat() == format) &&
|
||||
(prevStream == null || compareAudioStreamBitrate(prevStream, stream,
|
||||
AUDIO_FORMAT_EFFICIENCY_RANKING) > 0)) {
|
||||
prevStream = stream;
|
||||
result = idx;
|
||||
}
|
||||
}
|
||||
if (result == -1 && format == null) {
|
||||
break;
|
||||
}
|
||||
format = null;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
if (stream.getFormat() == defaultFormat && stream.getResolution().equals(defaultResolution)) {
|
||||
return i;
|
||||
/**
|
||||
* Locates a possible match for the given resolution and format in the provided list.
|
||||
* In this order:
|
||||
* 1. Find a format and resolution match
|
||||
* 2. Find a format and resolution match and ignore the refresh
|
||||
* 3. Find a resolution match
|
||||
* 4. Find a resolution match and ignore the refresh
|
||||
* 5. Find a resolution just below the requested resolution and ignore the refresh
|
||||
* 6. Give up
|
||||
*/
|
||||
static int getVideoStreamIndex(String targetResolution, MediaFormat targetFormat,
|
||||
List<VideoStream> videoStreams) {
|
||||
int fullMatchIndex = -1;
|
||||
int fullMatchNoRefreshIndex = -1;
|
||||
int resMatchOnlyIndex = -1;
|
||||
int resMatchOnlyNoRefreshIndex = -1;
|
||||
int lowerResMatchNoRefreshIndex = -1;
|
||||
String targetResolutionNoRefresh = targetResolution.replaceAll("p\\d+$", "p");
|
||||
|
||||
for (int idx = 0; idx < videoStreams.size(); idx++) {
|
||||
MediaFormat format = targetFormat == null ? null : videoStreams.get(idx).getFormat();
|
||||
String resolution = videoStreams.get(idx).getResolution();
|
||||
String resolutionNoRefresh = resolution.replaceAll("p\\d+$", "p");
|
||||
|
||||
if (format == targetFormat && resolution.equals(targetResolution)) {
|
||||
fullMatchIndex = idx;
|
||||
}
|
||||
|
||||
if (format == targetFormat && resolutionNoRefresh.equals(targetResolutionNoRefresh)) {
|
||||
fullMatchNoRefreshIndex = idx;
|
||||
}
|
||||
|
||||
if (resMatchOnlyIndex == -1 && resolution.equals(targetResolution)) {
|
||||
resMatchOnlyIndex = idx;
|
||||
}
|
||||
|
||||
if (resMatchOnlyNoRefreshIndex == -1 && resolutionNoRefresh.equals(targetResolutionNoRefresh)) {
|
||||
resMatchOnlyNoRefreshIndex = idx;
|
||||
}
|
||||
|
||||
if (lowerResMatchNoRefreshIndex == -1 && compareVideoStreamResolution(resolutionNoRefresh, targetResolutionNoRefresh) < 0) {
|
||||
lowerResMatchNoRefreshIndex = idx;
|
||||
}
|
||||
}
|
||||
|
||||
return defaultStreamIndex;
|
||||
if (fullMatchIndex != -1) {
|
||||
return fullMatchIndex;
|
||||
}
|
||||
if (fullMatchNoRefreshIndex != -1) {
|
||||
return fullMatchNoRefreshIndex;
|
||||
}
|
||||
if (resMatchOnlyIndex != -1) {
|
||||
return resMatchOnlyIndex;
|
||||
}
|
||||
if (resMatchOnlyNoRefreshIndex != -1) {
|
||||
return resMatchOnlyNoRefreshIndex;
|
||||
}
|
||||
return lowerResMatchNoRefreshIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the desired resolution or returns the default if it is not found. The resolution
|
||||
* will be reduced if video chocking is active.
|
||||
*/
|
||||
private static int getDefaultResolutionWithDefaultFormat(Context context, String defaultResolution, List<VideoStream> videoStreams) {
|
||||
MediaFormat defaultFormat = getDefaultFormat(context, R.string.default_video_format_key, R.string.default_video_format_value);
|
||||
return getDefaultResolutionIndex(defaultResolution, context.getString(R.string.best_resolution_key), defaultFormat, videoStreams);
|
||||
@@ -280,4 +369,85 @@ public final class ListHelper {
|
||||
}
|
||||
return format;
|
||||
}
|
||||
|
||||
// Compares the quality of two audio streams
|
||||
private static int compareAudioStreamBitrate(AudioStream streamA, AudioStream streamB,
|
||||
List<MediaFormat> formatRanking) {
|
||||
if (streamA == null) {
|
||||
return -1;
|
||||
}
|
||||
if (streamB == null) {
|
||||
return 1;
|
||||
}
|
||||
if (streamA.getAverageBitrate() < streamB.getAverageBitrate()) {
|
||||
return -1;
|
||||
}
|
||||
if (streamA.getAverageBitrate() > streamB.getAverageBitrate()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Same bitrate and format
|
||||
return formatRanking.indexOf(streamA.getFormat()) - formatRanking.indexOf(streamB.getFormat());
|
||||
}
|
||||
|
||||
private static int compareVideoStreamResolution(String r1, String r2) {
|
||||
int res1 = Integer.parseInt(r1.replaceAll("0p\\d+$", "1")
|
||||
.replaceAll("[^\\d.]", ""));
|
||||
int res2 = Integer.parseInt(r2.replaceAll("0p\\d+$", "1")
|
||||
.replaceAll("[^\\d.]", ""));
|
||||
return res1 - res2;
|
||||
}
|
||||
|
||||
// Compares the quality of two video streams.
|
||||
private static int compareVideoStreamResolution(VideoStream streamA, VideoStream streamB,
|
||||
List<MediaFormat> formatRanking) {
|
||||
if (streamA == null) {
|
||||
return -1;
|
||||
}
|
||||
if (streamB == null) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int resComp = compareVideoStreamResolution(streamA.getResolution(), streamB.getResolution());
|
||||
if (resComp != 0) {
|
||||
return resComp;
|
||||
}
|
||||
|
||||
// Same bitrate and format
|
||||
return formatRanking.indexOf(streamA.getFormat()) - formatRanking.indexOf(streamB.getFormat());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static boolean isLimitingDataUsage(Context context) {
|
||||
return getResolutionLimit(context) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The maximum resolution allowed
|
||||
* @param context App context
|
||||
* @return maximum resolution allowed or null if there is no maximum
|
||||
*/
|
||||
private static String getResolutionLimit(Context context) {
|
||||
String resolutionLimit = null;
|
||||
if (!isWifiActive(context)) {
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
String defValue = context.getString(R.string.limit_data_usage_none_key);
|
||||
String value = preferences.getString(
|
||||
context.getString(R.string.limit_mobile_data_usage_key), defValue);
|
||||
resolutionLimit = value.equals(defValue) ? null : value;
|
||||
}
|
||||
return resolutionLimit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Are we connected to wifi?
|
||||
* @param context App context
|
||||
* @return True if connected to wifi
|
||||
*/
|
||||
private static boolean isWifiActive(Context context)
|
||||
{
|
||||
ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
return manager.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package us.shandian.giga.get;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
@@ -104,11 +103,11 @@ public class DownloadRunnable implements Runnable {
|
||||
|
||||
RandomAccessFile f = new RandomAccessFile(mMission.location + "/" + mMission.name, "rw");
|
||||
f.seek(start);
|
||||
BufferedInputStream ipt = new BufferedInputStream(conn.getInputStream());
|
||||
byte[] buf = new byte[512];
|
||||
java.io.InputStream ipt = conn.getInputStream();
|
||||
byte[] buf = new byte[64*1024];
|
||||
|
||||
while (start < end && mMission.running) {
|
||||
int len = ipt.read(buf, 0, 512);
|
||||
int len = ipt.read(buf, 0, buf.length);
|
||||
|
||||
if (len == -1) {
|
||||
break;
|
||||
|
||||
@@ -10,15 +10,15 @@
|
||||
<string name="detail_likes_img_view_description">الإعجابات</string>
|
||||
<string name="detail_thumbnail_view_description">صور معاينة الفيديو</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">الصورة المصغرة الشخصية</string>
|
||||
<string name="did_you_mean">"هل تعني: %1$s ?"</string>
|
||||
<string name="did_you_mean">هل تقصد: %1$s ?</string>
|
||||
<string name="download">تنزيل</string>
|
||||
<string name="download_dialog_title">تنزيل</string>
|
||||
<string name="download_path_audio_dialog_title">أدخل مسار تنزيل الملفات الصوتية</string>
|
||||
<string name="download_path_audio_summary">مسار حفظ التنزيلات الصوتية</string>
|
||||
<string name="download_path_audio_title">مسار تنزيل ملفات الصوت</string>
|
||||
<string name="download_path_audio_title">مسار ملفات الصوت المحفوظة</string>
|
||||
<string name="download_path_dialog_title">أدخل مسار التنزيل لملفات الفيديو</string>
|
||||
<string name="download_path_summary">مسار حفظ تنزيلات الفيديو في</string>
|
||||
<string name="download_path_title">مسار تنزيل الفيديو</string>
|
||||
<string name="download_path_title">مسار ملفات الفيديو المحفوظة</string>
|
||||
<string name="err_dir_create">"لا يمكن إنشاء مجلد للتنزيلات في '%1$s'"</string>
|
||||
<string name="info_dir_created">"تم إنشاء مجلد تنزيلات في '%1$s'"</string>
|
||||
<string name="install">تثبيت</string>
|
||||
@@ -38,7 +38,7 @@
|
||||
<string name="search_language_title">اللغة الإفتراضية للمحتوى</string>
|
||||
<string name="settings">الإعدادات</string>
|
||||
<string name="settings_category_appearance_title">المظهر</string>
|
||||
<string name="settings_category_other_title">أخرئ</string>
|
||||
<string name="settings_category_other_title">اخرى</string>
|
||||
<string name="settings_category_video_audio_title">الفيديو والصوتيات</string>
|
||||
<string name="share">مشاركة</string>
|
||||
<string name="share_dialog_title">مشاركة بواسطة</string>
|
||||
@@ -46,7 +46,7 @@
|
||||
<string name="show_play_with_kodi_summary">عرض خيار لتشغيل الفيديو بواسطة Kodi Media Center</string>
|
||||
<string name="show_play_with_kodi_title">عرض خيار التشغيل بواسطة Kodi</string>
|
||||
<string name="theme_title">السمة</string>
|
||||
<string name="upload_date_text">نشرت يوم %1$s</string>
|
||||
<string name="upload_date_text">تم النشر يوم %1$s</string>
|
||||
<string name="url_not_supported_toast">الرابط غير مدعوم</string>
|
||||
<string name="use_external_audio_player_title">استخدام مشغل صوت خارجي</string>
|
||||
<string name="use_external_video_player_title">استخدام مشغل فيديو خارجي</string>
|
||||
@@ -77,29 +77,29 @@
|
||||
<string name="downloads">التنزيلات</string>
|
||||
<string name="downloads_title">التنزيلات</string>
|
||||
<string name="all">الكل</string>
|
||||
<string name="channel">قناة</string>
|
||||
<string name="channel">القناة</string>
|
||||
<string name="video">فيديو</string>
|
||||
<string name="settings_category_downloads_title">التنزيل</string>
|
||||
<string name="action_about">عن التطبيق</string>
|
||||
<string name="tab_about">عن التطبيق</string>
|
||||
<string name="title_activity_history">التأريخ</string>
|
||||
<string name="action_history">التأريخ</string>
|
||||
<string name="title_activity_history">التاريخ</string>
|
||||
<string name="action_history">التاريخ</string>
|
||||
<string name="open_in_popup_mode">فتح في وضع النوافذ المنبثقة</string>
|
||||
<string name="use_external_video_player_summary">"بعض القرارات لن يكون الصوت عند تمكين هذا الخيار "</string>
|
||||
<string name="popup_mode_share_menu_title">"وضع النوافذ المنبثقة NewPipe "</string>
|
||||
<string name="popup_mode_share_menu_title">وضع النوافذ المنبثقة NewPipe</string>
|
||||
<string name="channel_unsubscribed">تم إلغاء اشتراك القناة</string>
|
||||
<string name="subscription_change_failed">تعذر تغيير في الاشتراك</string>
|
||||
<string name="subscription_update_failed">تعذر تحديث الاشتراك</string>
|
||||
|
||||
<string name="controls_popup_title">نافذة</string>
|
||||
|
||||
<string name="autoplay_by_calling_app_summary">تشغيل مقطع الفيديو عند استدعاء NewPipe من تطبيق آخر</string>
|
||||
<string name="autoplay_by_calling_app_summary">تشغيل مقطع الفيديو عند إستدعاء NewPipe من تطبيق آخر</string>
|
||||
<string name="default_popup_resolution_title">"دقة النوافذ المنبثقة الافتراضية "</string>
|
||||
<string name="show_higher_resolutions_title">"عرض أعلى جودة "</string>
|
||||
<string name="show_higher_resolutions_summary">بعض الأجهزة فقط تدعم تشغيل مقاطع الفيديو 2K / 4K</string>
|
||||
<string name="default_video_format_title">تنسيق الفيديو الافتراضي</string>
|
||||
<string name="popup_remember_size_pos_title">تذكر حجم النافذة و وضعها</string>
|
||||
<string name="popup_remember_size_pos_summary">تذكر آخر حجم ومكان النافذة</string>
|
||||
<string name="popup_remember_size_pos_summary">تذكر آخر حجم ومكان للنافذة</string>
|
||||
<string name="player_gesture_controls_title">اعدادات إيماءة المشغل</string>
|
||||
<string name="player_gesture_controls_summary">استخدم إيماءات للتحكم في سطوع وحجم المشغل</string>
|
||||
<string name="show_search_suggestions_title">اقتراحات البحث</string>
|
||||
@@ -107,7 +107,7 @@
|
||||
<string name="enable_search_history_title">سجل البحث</string>
|
||||
<string name="enable_search_history_summary">تخزين طلبات البحث محليا</string>
|
||||
<string name="enable_watch_history_summary">تتبع مقاطع الفيديو التي تمت مشاهدتها</string>
|
||||
<string name="resume_on_audio_focus_gain_title">استئناف عند اكساب التركيز</string>
|
||||
<string name="resume_on_audio_focus_gain_title">استئناف عند اكتساب التركيز</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية)</string>
|
||||
<string name="show_hold_to_append_title">عرض\"عقد لإلحاق\"عنوان</string>
|
||||
<string name="show_hold_to_append_summary">عرض تلميح أو زر منبثق عند الضغط على خلفية على صفحة تفاصيل الفيديو</string>
|
||||
@@ -123,7 +123,7 @@
|
||||
<string name="error_report_title">تقرير الخطأ</string>
|
||||
<string name="playlist">قائمة التشغيل</string>
|
||||
<string name="yes">نعم</string>
|
||||
<string name="later">لاحقًا</string>
|
||||
<string name="later">لاحقاً</string>
|
||||
<string name="disabled">مُعطل</string>
|
||||
<string name="filter">فلتر</string>
|
||||
<string name="refresh">تحديث</string>
|
||||
@@ -145,7 +145,7 @@
|
||||
<string name="could_not_load_image">تعذر تحميل الصورة</string>
|
||||
<string name="app_ui_crash">تعطل التطبيق / واجهة المستخدم</string>
|
||||
<string name="player_stream_failure">لا يمكن تشغيل هذا البث</string>
|
||||
<string name="player_unrecoverable_failure">حدث خطأ المشغل غير قابل للاسترداد</string>
|
||||
<string name="player_unrecoverable_failure">حدث خطأ للمشغل غير قابل للاسترداد</string>
|
||||
<string name="player_recoverable_failure">استرداد المشغل من الخطأ</string>
|
||||
|
||||
<string name="sorry_string">عذرا، لا ينبغي أن يحدث ذلك.</string>
|
||||
@@ -192,7 +192,7 @@
|
||||
<string name="delete">حذف</string>
|
||||
<string name="checksum">التوقيع</string>
|
||||
|
||||
<string name="add">قطعة</string>
|
||||
<string name="add">مهمة جديدة</string>
|
||||
<string name="finish">حسنا</string>
|
||||
|
||||
<string name="msg_name">اسم الملف</string>
|
||||
@@ -241,11 +241,11 @@
|
||||
<string name="title_history_view">شاهد</string>
|
||||
<string name="history_disabled">تم تعطيل السجل</string>
|
||||
<string name="history_empty">التاريخ فارغ</string>
|
||||
<string name="history_cleared">تم تنظيف التأريخ</string>
|
||||
<string name="history_cleared">تم مسح التاريخ</string>
|
||||
<string name="item_deleted">تم حذف العنصر</string>
|
||||
<string name="delete_item_search_history">هل تريد حذف هذا العنصر من سجل البحث؟</string>
|
||||
|
||||
<string name="main_page_content">المحتوى</string>
|
||||
<string name="main_page_content">محتوى الشاشة الرئيسية</string>
|
||||
<string name="blank_page_summary">صفحة فارغة</string>
|
||||
<string name="subscription_page_summary">صفحة الاشتراك</string>
|
||||
<string name="feed_page_summary">صفحة الخلاصة</string>
|
||||
@@ -308,7 +308,7 @@
|
||||
<string name="no_player_found_toast">لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله)</string>
|
||||
<string name="import_data_title">استيراد قاعدة البيانات</string>
|
||||
<string name="export_data_title">تصدير قاعدة البيانات</string>
|
||||
<string name="import_data_summary">"سيتجاوز سجل التاريخ والاشتراكات الحالية "</string>
|
||||
<string name="import_data_summary">"سيقوم بالكتابة على سجل التاريخ والاشتراكات الحالية "</string>
|
||||
<string name="export_data_summary">تصدير سجل, الاشتراكات وقوائم التشغيل.</string>
|
||||
<string name="show_info">عرض المعلومات</string>
|
||||
|
||||
@@ -333,10 +333,10 @@
|
||||
<string name="drawer_header_action_paceholder_text">سوف يظهر شيء هنا قريبا ;D</string>
|
||||
|
||||
|
||||
<string name="video_player">قارئ الفيديوهات</string>
|
||||
<string name="always_ask_open_action">أُطلُب دائمًا</string>
|
||||
<string name="video_player">مشغل الفديو</string>
|
||||
<string name="always_ask_open_action">السؤال دائمًا</string>
|
||||
|
||||
<string name="preferred_player_fetcher_notification_title">عملية تحميل المعلومات جارية …</string>
|
||||
<string name="preferred_player_fetcher_notification_title">الحصول على المعلومات …</string>
|
||||
<string name="preferred_player_fetcher_notification_message">تحميل المحتوى المطلوب</string>
|
||||
|
||||
<string name="create_playlist">إنشاء قائمة تشغيل جديدة</string>
|
||||
@@ -359,12 +359,12 @@
|
||||
|
||||
<string name="live_sync">مُزامَنة</string>
|
||||
|
||||
<string name="controls_download_desc">تنزيل الملف المتدفق.</string>
|
||||
<string name="tab_bookmarks">إشارات مرجعية</string>
|
||||
<string name="controls_download_desc">تنزيل الملف البث.</string>
|
||||
<string name="tab_bookmarks">الإشارات مرجعية</string>
|
||||
|
||||
<string name="use_inexact_seek_title">استعمال التقديم السريع الغير دقيق</string>
|
||||
<string name="use_inexact_seek_summary">"التقديم الغير دقيق يسمح للمشغل بالإطلاع الى الأماكن بشكل اسرع مع دقة اقل "</string>
|
||||
<string name="download_thumbnail_title">تحميل الصور الصغيرة</string>
|
||||
<string name="download_thumbnail_title">تحميل الصور المصغرة</string>
|
||||
<string name="thumbnail_cache_wipe_complete_notice">تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور</string>
|
||||
<string name="file">الملف</string>
|
||||
|
||||
@@ -393,19 +393,19 @@
|
||||
<string name="metadata_cache_wipe_title">امسح البيانات الوصفية المخزنة مؤقتًا</string>
|
||||
<string name="metadata_cache_wipe_summary">إزالة جميع بيانات صفحات الويب المخزنة مؤقتًا</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">تم محو ذاكرة التخزين المؤقت للبيانات الوصفية</string>
|
||||
<string name="auto_queue_title">صف تيار المقبل تلقائي</string>
|
||||
<string name="auto_queue_summary">إلحاق تلقائي بالدفق ذي الصلة عند تشغيل آخر مجموعة في قائمة انتظار غير متكررة</string>
|
||||
<string name="set_as_playlist_thumbnail">إضافة إلى قائمة التشغيل صورة مصغرة</string>
|
||||
<string name="auto_queue_title">وضع البث القادم تلقائيا في قائمة الإنتظار</string>
|
||||
<string name="auto_queue_summary">رفض البث المشابه في حال كون البث السابق يعمل في حالة عدم التكرار.</string>
|
||||
<string name="set_as_playlist_thumbnail">إضافة إلى قائمة التشغيل كصورة مصغرة</string>
|
||||
|
||||
<string name="bookmark_playlist">قائمة التشغيل الإشارات المرجعية</string>
|
||||
<string name="playlist_thumbnail_change_success">تغيير الصورة المصغرة لقائمة التشغيل</string>
|
||||
<string name="caption_none">لا تعليق</string>
|
||||
<string name="bookmark_playlist">قائمة التشغيل المخزنة</string>
|
||||
<string name="playlist_thumbnail_change_success">تم تغيير الصورة المصغرة لقائمة التشغيل</string>
|
||||
<string name="caption_none">بدون تسميات توضيحية</string>
|
||||
|
||||
<string name="caption_setting_title">تسميات توضيحية</string>
|
||||
<string name="caption_setting_description">تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق ليصبح ساري المفعول.</string>
|
||||
|
||||
<string name="enable_leak_canary_title">تمكين LeakCanary</string>
|
||||
<string name="enable_leak_canary_summary">قد يتسبب مراقبة في تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ الكومة</string>
|
||||
<string name="enable_leak_canary_summary">قد يتسبب مراقبة في تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات</string>
|
||||
|
||||
<string name="enable_disposed_exceptions_title">تقرير الأخطاء خارج دورة الحياة</string>
|
||||
<string name="enable_disposed_exceptions_summary">فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها</string>
|
||||
@@ -427,16 +427,16 @@
|
||||
|
||||
<string name="toast_no_player">لم يتم تثبيت أي تطبيق لتشغيل هذا الملف</string>
|
||||
|
||||
<string name="app_license">NewPipe هو برنامج مفتوح المصدر حقوق متروكة: يمكنك استخدام حصة الدراسة وتحسينه في إرادتك. على وجه التحديد يمكنك إعادة توزيع و / أو تعديله تحت شروط رخصة تحت شروط GNU والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار لاحق.</string>
|
||||
<string name="app_license">NewPipe هو برنامج مفتوح المصدر حقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه بإرادتك. و على وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار لاحق.</string>
|
||||
<string name="delete_stream_history_prompt">هل تريد حذف هذا العنصر من سجل المشاهدة؟</string>
|
||||
<string name="delete_all_history_prompt">هل أنت متأكد من أنك تريد حذف كل العناصر من السجل؟</string>
|
||||
<string name="title_last_played">"اخر ما تم تشغيله "</string>
|
||||
<string name="title_last_played">آخر ما تم تشغيله</string>
|
||||
<string name="title_most_played">الأكثر تشغيلا</string>
|
||||
|
||||
<string name="override_current_data">هذا سوف يتجاوز الإعداد الحالي الخاص بك.</string>
|
||||
|
||||
<string name="preferred_open_action_settings_title">المفضل \'لفتح\' العمل</string>
|
||||
<string name="preferred_open_action_settings_summary">"لإجراء الافتراضي عند فتح المحتوى — %s"</string>
|
||||
<string name="preferred_open_action_settings_title">طريقة \'التشغيل\' المفضلة</string>
|
||||
<string name="preferred_open_action_settings_summary">"الإجراء الافتراضي عند فتح المحتوى — %s"</string>
|
||||
|
||||
<string name="background_player">مشغل الخلفية</string>
|
||||
<string name="popup_player">المشغل المنبثق</string>
|
||||
@@ -467,4 +467,15 @@
|
||||
<string name="playback_nightcore">تعديل الايقاع Nightcore</string>
|
||||
<string name="import_settings">هل تريد أيضا استيراد الإعدادات؟</string>
|
||||
|
||||
<string name="privacy_policy_title">"سياسة الخصوصية في NewPipe "</string>
|
||||
<string name="privacy_policy_encouragement">يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك ، لا يجمع التطبيق أي بيانات دون موافقتك.
|
||||
\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال.</string>
|
||||
<string name="read_privacy_policy">قراءة سياسة الخصوصية</string>
|
||||
<string name="start_accept_privacy_policy">من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR) ، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية.
|
||||
\nو يجب عليك قبولها لإرسال تقرير الأخطاء إلينا.</string>
|
||||
<string name="accept">قبول</string>
|
||||
<string name="decline">رفض</string>
|
||||
|
||||
<string name="limit_data_usage_none_description">لا حدود</string>
|
||||
<string name="limit_mobile_data_usage_title">الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول</string>
|
||||
</resources>
|
||||
|
||||
@@ -442,4 +442,14 @@
|
||||
<string name="app_license">NewPipe és programari lliure sota llicència copyleft: podeu fer-lo servir, estudiar-lo, compartir-lo i millorar-lo al vostre gust. En concret, podeu redistribuir-lo i/o modificar-lo d\'acord amb els termes de la llicència GNU GPL publicada per la Free Software Foundation, ja sigui la versió 3 o (segons vulgueu) qualsevol altra versió posterior.</string>
|
||||
<string name="import_settings">Voleu importar també la configuració?</string>
|
||||
|
||||
<string name="privacy_policy_title">Política de privacitat del NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">El projecte NewPipe es pren molt seriosament la vostra privacitat. Per aquesta raó, l\'aplicació no emmagatzema cap mena de dades sense el vostre consentiment.
|
||||
\nLa política de privacitat del NewPipe descriu detalladament quines dades s\'envien i s\'emmagatzemen quan envieu un informe d\'error.</string>
|
||||
<string name="read_privacy_policy">Llegeix la política de privacitat</string>
|
||||
<string name="start_accept_privacy_policy">Per tal de complir amb el Reglament General de Protecció de Dades europeu (GDPR), us demanem que poseu atenció a la política de privacitat del NewPipe. Llegiu-la detingudament.
|
||||
\nSi voleu enviar-nos un informe d\'error, l\'haureu d\'acceptar.</string>
|
||||
<string name="accept">Accepta</string>
|
||||
<string name="decline">Rebutja</string>
|
||||
<string name="limit_data_usage_none_description">Sense restriccions</string>
|
||||
<string name="limit_mobile_data_usage_title">Restringeix la resolució quan es facin servir dades mòbils</string>
|
||||
</resources>
|
||||
|
||||
@@ -12,14 +12,14 @@
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="did_you_mean">Meintest du: %1$s ?</string>
|
||||
<string name="share_dialog_title">Teilen mit</string>
|
||||
<string name="choose_browser">Browser</string>
|
||||
<string name="choose_browser">Browser auswählen</string>
|
||||
<string name="screen_rotation">Drehen des Geräts</string>
|
||||
<string name="download_path_title">Download-Verzeichnis für Videos</string>
|
||||
<string name="download_path_summary">Verzeichnis für heruntergeladene Videos</string>
|
||||
<string name="download_path_dialog_title">Download-Verzeichnis für Videos angeben</string>
|
||||
<string name="default_resolution_title">Standardauflösung</string>
|
||||
<string name="play_with_kodi_title">Mit Kodi abspielen</string>
|
||||
<string name="kore_not_found">Kore App wurde nicht gefunden. Möchten Sie Kore jetzt installieren?</string>
|
||||
<string name="kore_not_found">Kore App wurde nicht gefunden. Kore jetzt installieren?</string>
|
||||
<string name="show_play_with_kodi_title">Zeige \"Mit Kodi abspielen\" Option</string>
|
||||
<string name="show_play_with_kodi_summary">Zeigt eine Option an, über die man Videos mit Kodi abspielen kann</string>
|
||||
<string name="play_audio">Audio</string>
|
||||
@@ -67,7 +67,7 @@
|
||||
|
||||
<string name="content">Inhalt</string>
|
||||
<string name="show_age_restricted_content_title">Altersbeschränkte Inhalte anzeigen</string>
|
||||
<string name="video_is_age_restricted">Video ist altersbeschränkt. Schalten Sie erst altersbeschränkte Videos in den Einstellungen ein.</string>
|
||||
<string name="video_is_age_restricted">Video ist altersbeschränkt. Schalte erst altersbeschränkte Videos in den Einstellungen ein.</string>
|
||||
|
||||
<string name="could_not_setup_download_menu">Konnte Download-Menü nicht einrichten</string>
|
||||
<string name="live_streams_not_supported">Dies ist ein LIVESTREAM. Diese werden noch nicht unterstützt.</string>
|
||||
@@ -115,7 +115,7 @@
|
||||
<string name="msg_exists">Datei existiert bereits</string>
|
||||
<string name="msg_wait">Bitte warten…</string>
|
||||
<string name="msg_copied">In Zwischenablage kopiert</string>
|
||||
<string name="no_available_dir">Bitte wählen Sie ein verfügbares Download-Verzeichnis</string>
|
||||
<string name="no_available_dir">Bitte wähle ein verfügbares Download-Verzeichnis</string>
|
||||
|
||||
<string name="start">Starten</string>
|
||||
<string name="pause">Pause</string>
|
||||
@@ -134,7 +134,7 @@
|
||||
<string name="black_theme_title">Schwarz</string>
|
||||
|
||||
<string name="reCaptcha_title">reCAPTCHA-Aufgabe</string>
|
||||
<string name="recaptcha_request_toast">reCAPTCHA-Herausforderung angefordert</string>
|
||||
<string name="recaptcha_request_toast">reCAPTCHA-Aufgabe angefordert</string>
|
||||
|
||||
<string name="later">Später</string>
|
||||
|
||||
@@ -185,14 +185,14 @@
|
||||
<string name="error_unable_to_load_license">Lizenz konnte nicht geladen werden</string>
|
||||
<string name="copyright" formatted="true">© %1$s von %2$s unter %3$s</string>
|
||||
<string name="tab_about">Über</string>
|
||||
<string name="app_description">Eine freie, schlanke Streaming App für Android.</string>
|
||||
<string name="app_description">Eine freie, schlanke Streaming-App für Android.</string>
|
||||
<string name="app_license_title">NewPipes Lizenz</string>
|
||||
<string name="contribution_encouragement">Ob Ideen, Übersetzung, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen - Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe!</string>
|
||||
<string name="contribution_encouragement">Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen – Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe!</string>
|
||||
<string name="title_licenses">Drittanbieter-Lizenzen</string>
|
||||
<string name="view_on_github">Auf GitHub ansehen</string>
|
||||
<string name="contribution_title">Beitragen</string>
|
||||
<string name="settings_category_downloads_title">Download</string>
|
||||
<string name="settings_file_charset_title">Erlaubt Zeichen im Dateinamen</string>
|
||||
<string name="settings_file_charset_title">Erlaubte Zeichen im Dateinamen</string>
|
||||
<string name="settings_file_replacement_character_summary">Ungültige Zeichen werden durch dieses Zeichen ersetzt</string>
|
||||
<string name="settings_file_replacement_character_title">Ersetzungszeichen</string>
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
<string name="resume_on_audio_focus_gain_summary">Nach Unterbrechungen (z.B. Telefonaten) Wiedergabe fortsetzen</string>
|
||||
|
||||
|
||||
<string name="notification_channel_name">NewPipe Benachrichtigung</string>
|
||||
<string name="notification_channel_name">NewPipe-Benachrichtigung</string>
|
||||
<string name="notification_channel_description">Benachrichtigungen für NewPipe-Hintergrund- und Pop-up Player</string>
|
||||
|
||||
<string name="tab_main">Hauptmenü</string>
|
||||
@@ -255,7 +255,7 @@
|
||||
<string name="item_deleted">Element gelöscht</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Fortsetzen bei erneutem Fokussieren</string>
|
||||
<string name="settings_category_player_title">Player</string>
|
||||
<string name="empty_subscription_feed_subtitle">Nichts hier außer Grillen</string>
|
||||
<string name="empty_subscription_feed_subtitle">Nichts hier außer das Zirpen der Grillen</string>
|
||||
|
||||
<string name="delete_item_search_history">Möchtest du dieses Element aus dem Suchverlauf löschen?</string>
|
||||
<string name="blank_page_summary">Leere Seite</string>
|
||||
@@ -266,7 +266,7 @@
|
||||
<string name="play_all">Alles abspielen</string>
|
||||
|
||||
<string name="play_queue_remove">Entfernen</string>
|
||||
<string name="play_queue_audio_settings">Audio Einstellungen</string>
|
||||
<string name="play_queue_audio_settings">Audio-Einstellungen</string>
|
||||
<string name="player_stream_failure">Konnte diesen Stream nicht abspielen</string>
|
||||
<string name="main_page_content">Inhalt der Hauptseite</string>
|
||||
<string name="subscription_page_summary">Abonnement-Seite</string>
|
||||
@@ -298,10 +298,10 @@
|
||||
<string name="donation_title">Spenden</string>
|
||||
<string name="give_back">Zurückgeben</string>
|
||||
<string name="website_title">Website</string>
|
||||
<string name="website_encouragement">Besuchen Sie die NewPipe Website für weitere Informationen und Neuigkeiten.</string>
|
||||
<string name="donation_encouragement">NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür aufbringen, die beste Nutzererfahrung zu bieten. Geben Sie etwas zurück, um Entwicklern zu helfen, NewPipe bei einer Tasse Kaffee noch besser zu machen.</string>
|
||||
<string name="website_encouragement">Besuche die NewPipe Website für weitere Informationen und Neuigkeiten.</string>
|
||||
<string name="donation_encouragement">NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür aufbringen, die beste Nutzererfahrung zu bieten. Gib etwas zurück, um Entwicklern zu helfen, NewPipe bei einer Tasse Kaffee noch besser zu machen.</string>
|
||||
<string name="service_title">Service</string>
|
||||
<string name="no_player_found_toast">Kein Streamplayer gefunden (Du kannst VLC installieren, um den Stream abzuspielen)</string>
|
||||
<string name="no_player_found_toast">Keinen Streamplayer gefunden (du kannst VLC installieren, um den Stream abzuspielen)</string>
|
||||
<string name="default_content_country_title">Standard-Land des Inhalts</string>
|
||||
<string name="always">Immer</string>
|
||||
<string name="just_once">Nur einmal</string>
|
||||
@@ -373,8 +373,8 @@
|
||||
<string name="caption_font_size_settings_title">Schriftgröße der Untertitel</string>
|
||||
<string name="dismiss">Abbrechen</string>
|
||||
<string name="normal_caption_font_size">Normale Schriftgröße</string>
|
||||
<string name="controls_download_desc">Stream-Datei herunterladen</string>
|
||||
<string name="use_inexact_seek_title">Benutze schnelle ungenaue Suche</string>
|
||||
<string name="controls_download_desc">Stream-Datei herunterladen.</string>
|
||||
<string name="use_inexact_seek_title">Benutze schnelle, ungenaue Suche</string>
|
||||
<string name="use_inexact_seek_summary">Mit ungenauem Suchen kann die Abspielposition schneller erreicht werden, aber auf Kosten der Genauigkeit</string>
|
||||
<string name="file">Datei</string>
|
||||
|
||||
@@ -397,13 +397,13 @@
|
||||
<string name="import_file_title">Datei importieren</string>
|
||||
<string name="previous_export">Vorheriger Export</string>
|
||||
|
||||
<string name="import_network_expensive_warning">Beachten Sie, dass diese Aktion das Netzwerk stark belasten kann.
|
||||
<string name="import_network_expensive_warning">Beachte, dass diese Aktion das Netzwerk stark belasten kann.
|
||||
\n
|
||||
\nMöchten Sie fortfahren?</string>
|
||||
\nMöchtest du fortfahren?</string>
|
||||
<string name="download_thumbnail_title">Vorschaubilder laden</string>
|
||||
<string name="thumbnail_cache_wipe_complete_notice">Bildercache gelöscht</string>
|
||||
<string name="metadata_cache_wipe_title">Leere die gecachten Metadaten</string>
|
||||
<string name="metadata_cache_wipe_summary">Entfene alle gecachten Website-Daten</string>
|
||||
<string name="metadata_cache_wipe_summary">Entferne alle gecachten Website-Daten</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">Metadatencache gelöscht</string>
|
||||
<string name="settings_category_debug_title">Debug</string>
|
||||
<string name="invalid_source">Ungültige Datei-/Inhaltsquelle</string>
|
||||
@@ -421,7 +421,7 @@
|
||||
<string name="unhook_checkbox">Aushaken (kann zu Verzerrungen führen)</string>
|
||||
<string name="playback_nightcore">Nightcore</string>
|
||||
<string name="playback_default">Standard</string>
|
||||
<string name="download_thumbnail_summary">Deaktivieren Sie diese Option, um das Laden aller Miniaturansichten zu stoppen und Daten und Speicherverbrauch zu sparen. Wenn Sie dies ändern, wird sowohl der In-Memory- als auch der On-Disk-Image-Cache gelöscht.</string>
|
||||
<string name="download_thumbnail_summary">Deaktiviere diese Option, um das Laden aller Miniaturansichten zu stoppen und Daten und Speicherverbrauch zu sparen. Wenn du dies änderst, wird sowohl der In-Memory- als auch der On-Disk-Image-Cache gelöscht.</string>
|
||||
<string name="auto_queue_title">Nächsten Stream automatisch einreihen</string>
|
||||
<string name="auto_queue_summary">Automatisches Anhängen eines verwandten Streams beim Abspielen des letzten Streams in einer nicht wiederholten Warteschlange.</string>
|
||||
<string name="drawer_header_action_paceholder_text">Hier wird bald etwas stehen ;D</string>
|
||||
@@ -470,7 +470,17 @@
|
||||
<string name="search_history_deleted">Suchverlauf gelöscht.</string>
|
||||
<string name="one_item_deleted">1 Element gelöscht.</string>
|
||||
|
||||
<string name="app_license">NewPipe ist copyleft libre Software: Sie können es nach Belieben benutzen, studieren, mit anderen teilen und verbessern. Insbesondere können Sie sie unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder unter Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren Version.</string>
|
||||
<string name="import_settings">Möchten Sie auch Einstellungen importieren?</string>
|
||||
<string name="app_license">NewPipe ist freie Copyleft-Software: Du kannst es nach Belieben benutzen, studieren, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder unter Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version.</string>
|
||||
<string name="import_settings">Möchtest du auch Einstellungen importieren?</string>
|
||||
|
||||
<string name="privacy_policy_title">NewPipe-Datenschutzbestimmungen</string>
|
||||
<string name="privacy_policy_encouragement">Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung.
|
||||
\nNewPipes Datenschutzbestimmungen erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden.</string>
|
||||
<string name="read_privacy_policy">Lies die Datenschutzbestimmungen</string>
|
||||
<string name="accept">Akzeptieren</string>
|
||||
<string name="decline">Ablehnen</string>
|
||||
<string name="start_accept_privacy_policy">Um den Anforderungen der Datenschutz-Grundverordnung (DSGVO) genüge zu tun, möchten wir dich hiermit auf die Datenschutzbedingungen von NewPipe aufmerksam machen. Bitte lies sie sorgfältig durch.
|
||||
\nDu musst ihr zustimmen, um einen Bugreport an uns zu senden.</string>
|
||||
<string name="limit_data_usage_none_description">Unbegrenzt</string>
|
||||
<string name="limit_mobile_data_usage_title">Auflösung bei Verwendung mobiler Daten begrenzen</string>
|
||||
</resources>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<string name="detail_dislikes_img_view_description">Malŝatoj</string>
|
||||
<string name="use_tor_title">Uzi la programon Tor</string>
|
||||
<string name="no_player_found">Neniu elsendlflua ludilo trovita. Ĉu instali la aplikaĵon VLC?</string>
|
||||
<string name="kore_not_found">La aplikaĵo Kore ne estas trovita. Ĉu instali la aplikaĵon Kore?</string>
|
||||
<string name="kore_not_found">La aplikaĵo Kore ne estas trovita. Ĉu instali ĝin?</string>
|
||||
<string name="show_next_and_similar_title">Montri la sekvan videon kaj similajn videojn</string>
|
||||
<string name="could_not_load_thumbnails">Ĉiuj miniaturoj ne ŝargeblas</string>
|
||||
<string name="youtube_signature_decryption_error">La subskribo de la ligilo de la video ne malĉifreblas.</string>
|
||||
@@ -59,12 +59,12 @@
|
||||
<string name="download_path_audio_title">Elŝutujo por muziko</string>
|
||||
<string name="use_tor_summary">(Eksperimenta) Devigi elŝuttrafikon tra Tor por pli bona privateco (elsendfluaj videoj estas ankoraŭ ne subtenitaj).</string>
|
||||
|
||||
<string name="show_play_with_kodi_summary">Montri opcion por ludi videon per la aplikaĵo Kodi.</string>
|
||||
<string name="download_path_summary">Dosierujo por konservi elŝutitajn videojn.</string>
|
||||
<string name="show_play_with_kodi_summary">Montri opcion por ludi videon per la aplikaĵo Kodi</string>
|
||||
<string name="download_path_summary">Dosierujo por konservi elŝutitajn videojn</string>
|
||||
<string name="download_path_audio_summary">Dosierujo por konservi elŝutitan muzikon</string>
|
||||
<string name="download_path_dialog_title">Elektu lokon por konservi elŝutitajn videojn</string>
|
||||
|
||||
<string name="download_path_audio_dialog_title">Elektu lokon por konservi elŝutitan muzikon.</string>
|
||||
<string name="download_path_audio_dialog_title">Elektu lokon por konservi elŝutitan muzikon</string>
|
||||
|
||||
<string name="content">Enhavo</string>
|
||||
<string name="error_report_button_text">Raporti eraron per retpoŝto</string>
|
||||
@@ -77,13 +77,39 @@
|
||||
<string name="report_error">Raporti eraron</string>
|
||||
<string name="video">Video</string>
|
||||
<string name="retry">Reprovi</string>
|
||||
<string name="main_bg_subtitle">Alklaku serĉon por ekkomenci</string>
|
||||
<string name="main_bg_subtitle">Tapu serĉo por komenci</string>
|
||||
<string name="no_player_found_toast">Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin)</string>
|
||||
<string name="open_in_popup_mode">Malferu per fenestreta maniero</string>
|
||||
<string name="use_external_video_player_summary">Iuj rezolucioj NE havos aŭdion kiam ĉi tiu eblo estas ebligita.</string>
|
||||
<string name="popup_mode_share_menu_title">Fenestreta maniero de NewPipe</string>
|
||||
<string name="open_in_popup_mode">Malfermi en ŝprucfenestron modon</string>
|
||||
<string name="use_external_video_player_summary">Iuj rezolucioj NE havos aŭdion kiam ĉi tiu eblo estas ebligita</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe ŝprucfenestron modon</string>
|
||||
<string name="subscribe_button_title">Aboni</string>
|
||||
<string name="subscribed_button_title">Abonita</string>
|
||||
<string name="channel_unsubscribed">Kanalo malabonita</string>
|
||||
<string name="subscription_change_failed">Neebla ŝanĝi abonon</string>
|
||||
<string name="controls_download_desc">Elŝutu dosieron.</string>
|
||||
<string name="subscription_update_failed">Ne eblas ĝisdatigi abonon</string>
|
||||
<string name="show_info">Montri informon</string>
|
||||
|
||||
<string name="tab_main">Ĉefa</string>
|
||||
<string name="tab_subscriptions">Abonoj</string>
|
||||
<string name="tab_bookmarks">Legosigno</string>
|
||||
|
||||
<string name="fragment_whats_new">Kio novas</string>
|
||||
|
||||
<string name="controls_background_title">Fono</string>
|
||||
<string name="controls_popup_title">ŝprucfenestron</string>
|
||||
<string name="controls_add_to_playlist_title">Aldonu al</string>
|
||||
|
||||
<string name="autoplay_by_calling_app_title">Aŭtomata play</string>
|
||||
<string name="autoplay_by_calling_app_summary">Ludas video kiam NewPipe vokas de alia programo</string>
|
||||
<string name="default_popup_resolution_title">Defaŭlta popup rezolucio</string>
|
||||
<string name="show_higher_resolutions_title">Montri pli altajn rezoluciojn</string>
|
||||
<string name="show_higher_resolutions_summary">Nur kelkaj aparatoj subtenas ludante 2K / 4K filmetojn</string>
|
||||
<string name="default_video_format_title">Defaŭlta video-formato</string>
|
||||
<string name="black_theme_title">Nigra</string>
|
||||
<string name="popup_remember_size_pos_title">Memoru ŝprucfenestron kaj pozicion</string>
|
||||
<string name="popup_remember_size_pos_summary">Memoru lastan grandecon kaj pozicion de ŝprucfenestro</string>
|
||||
<string name="use_inexact_seek_title">Uzu rapide, ne preciza serĉon</string>
|
||||
<string name="use_inexact_seek_summary">Ne preciza serĉo permesas al la ludanto serĉi poziciojn pli rapide kun malalta precizeco</string>
|
||||
<string name="download_thumbnail_title">Ŝarĝi bildetojn</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="view_count_text">%1$s visualizaciones</string>
|
||||
<string name="view_count_text">%1$s de visualizaciones</string>
|
||||
<string name="upload_date_text">Publicado el %1$s</string>
|
||||
<string name="no_player_found">No se encontró ningún reproductor de vídeo. ¿Desea instalar VLC?</string>
|
||||
<string name="install">Instalar</string>
|
||||
@@ -112,7 +112,7 @@
|
||||
<string name="finish">OK</string>
|
||||
|
||||
<string name="msg_name">Nombre del archivo</string>
|
||||
<string name="msg_threads">Threads</string>
|
||||
<string name="msg_threads">Trapos</string>
|
||||
<string name="msg_error">Error</string>
|
||||
<string name="msg_server_unsupported">Servidor no soportado</string>
|
||||
<string name="msg_exists">El archivo ya existe</string>
|
||||
@@ -479,4 +479,13 @@ abrir en modo popup</string>
|
||||
<string name="app_license">NewPipe es un software copyleft libre: puedes usarlo, estudiarlo, compartirlo y mejorarlo a tu antojo. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a tu elección) cualquier versión posterior.</string>
|
||||
<string name="import_settings">¿Desea importar también los ajustes?</string>
|
||||
|
||||
<string name="privacy_policy_title">Política de Privacidad de NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">El proyecto NewPipe toma su privacidad muy en serio. Por lo tanto, la aplicación no recopila ningún dato sin su consentimiento. La política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan cuando envía un informe de fallas.</string>
|
||||
<string name="read_privacy_policy">Leer la Política de Privacidad</string>
|
||||
<string name="start_accept_privacy_policy">Para cumplir con el Reglamento general europeo de protección de datos (GDPR), podemos llamar su atención sobre la política de privacidad de NewPipe. Por favor léelo cuidadosamente. Debe aceptarlo para enviarnos el informe de error.</string>
|
||||
<string name="accept">Aceptar</string>
|
||||
<string name="decline">Declinar</string>
|
||||
|
||||
<string name="limit_data_usage_none_description">Sin límite</string>
|
||||
<string name="limit_mobile_data_usage_title">Limitar resolución cuando se use Datos Móviles</string>
|
||||
</resources>
|
||||
|
||||
@@ -457,4 +457,15 @@
|
||||
<string name="app_license">NewPipe Software Librea eta Copyleft da: Nahi eran erabili, ikertu, partekatu eta hobetu dezakezu. Zehazki, elkarbanatzea eta aldatzea Free Software Foundation-ek argitaratutako GNU General Public License-ren 3. bertsioa edo berriagoren baten terminoen arabera egiteko baimena duzu.</string>
|
||||
<string name="enable_disposed_exceptions_summary">Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena</string>
|
||||
|
||||
<string name="privacy_policy_title">NewPipe pribatutasun politika</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe proiektuak aintzat hartzen du zure pribatutasuna. Aplikazioak ez du zure baimenik gabe daturik jasotzen.
|
||||
\nNewPipe pribatutasun politikak azaltzen du zehazki bidali eta gordetako informazioa zein den kraskatze txosten bat bidaltzen duzunean.</string>
|
||||
<string name="read_privacy_policy">Irakurri pribatutasun politika</string>
|
||||
<string name="start_accept_privacy_policy">"European General Data Protection Regulation (GDPR) legea betetzeko, NewPipe pribatutasun politika irakurtzera gonbidaatzen zaitugu.
|
||||
\nAkats txosten bat bidali ahal izateko onartu behar duzu."</string>
|
||||
<string name="accept">Onartu</string>
|
||||
<string name="decline">Ukatu</string>
|
||||
|
||||
<string name="limit_data_usage_none_description">Mugagabea</string>
|
||||
<string name="limit_mobile_data_usage_title">Mugatu bereizmena datu mugikorrak erabiltzean</string>
|
||||
</resources>
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
<string name="start_here_on_background">Démarrer ici en arrière-plan</string>
|
||||
<string name="start_here_on_popup">Démarrer ici en fenêtré</string>
|
||||
<string name="donation_title">Donner</string>
|
||||
<string name="donation_encouragement">NewPipe est développé par des volontaires sur leur temps libre afin de vous proposer la meilleure expérience possible. Vous pouvez leur offrir un café pour les soutenir dans leurs efforts et rendre NewPipe encore meilleur !</string>
|
||||
<string name="donation_encouragement">NewPipe est développé par des volontaires sur leur temps libre afin de vous proposer la meilleure expérience possible. Vous pouvez leur offrir un café pour les soutenir dans leurs efforts et rendre NewPipe encore meilleur.</string>
|
||||
<string name="website_title">Site</string>
|
||||
<string name="website_encouragement">Visitez le site internet de NewPipe pour plus d\'informations et de nouvelles.</string>
|
||||
<string name="give_back">Donner en retour</string>
|
||||
@@ -468,9 +468,15 @@
|
||||
<string name="view_history_deleted">Voir l’historique supprimé.</string>
|
||||
<string name="clear_search_history_title">Supprimer l\'historique des recherches</string>
|
||||
<string name="clear_search_history_summary">Supprimer l\'historique de recherche par mot clef.</string>
|
||||
<string name="delete_search_history_alert">"Supprimer tout l\'historique de recherche. "</string>
|
||||
<string name="delete_search_history_alert">Supprimer tout l\'historique de recherche.</string>
|
||||
<string name="search_history_deleted">Historique des recherches effacé.</string>
|
||||
<string name="one_item_deleted">1 élément supprimé.</string>
|
||||
|
||||
<string name="app_license">"NewPipe est un logiciel sous licence libre : Vous pouvez l\'utiliser, l\'étudier, le partager et l\'améliorer comme bon vous semble. Vous pouvez le redistribuer et/ou le modifier sous les termes de la licence générale publique GNU, comme publiée par la Free Software Foundation, dans sa version 3, ou, à votre convenance, dans une version plus récente. "</string>
|
||||
</resources>
|
||||
<string name="app_license">"NewPipe est un logiciel sous licence libre : Vous pouvez l\'utiliser, l\'étudier, le partager et l\'améliorer comme bon vous semble. Vous pouvez le redistribuer et/ou le modifier sous les termes de la licence générale publique GNU, comme publiée par la Free Software Foundation, dans sa version 3, ou, à votre convenance, dans une version plus récente."</string>
|
||||
<string name="privacy_policy_title">Politique de confidentialité de NewPipe</string>
|
||||
<string name="read_privacy_policy">Lire la politique de confidentialité</string>
|
||||
<string name="import_settings">Voulez-vous également importer des paramètres ?</string>
|
||||
|
||||
<string name="accept">Accepter</string>
|
||||
<string name="decline">Refuser</string>
|
||||
</resources>
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<string name="download_path_audio_summary">डाउनलोड किये गए ऑडियो फाइल की जगह</string>
|
||||
<string name="download_path_audio_dialog_title">ऑडियो फाइल डाउनलोड करने के लिए जगह दर्ज करें</string>
|
||||
|
||||
<string name="autoplay_by_calling_app_summary">जब NewPipe को दुसरे एप्प से बुलावा आये तो विडियो अपनी स्वेच्छा से चले</string>
|
||||
<string name="autoplay_by_calling_app_summary">अन्य अप्प के द्वारा NewPipe के आह्वान पर वीडियो तुरंत चले</string>
|
||||
<string name="default_resolution_title">वीडियो का डिफ़ॉल्ट रिज़ॉल्यूशन</string>
|
||||
<string name="default_popup_resolution_title">विडियो पॉपअप का डिफ़ॉल्ट रिज़ॉल्यूशन</string>
|
||||
<string name="show_higher_resolutions_title">उच्च रिज़ॉल्यूशन दिखाएं</string>
|
||||
@@ -93,8 +93,8 @@
|
||||
<string name="dark_theme_title">काला</string>
|
||||
<string name="popup_remember_size_pos_title">विडियो पॉपअप की आकर और उसकी स्थति को याद रखे</string>
|
||||
<string name="popup_remember_size_pos_summary">विडियो पॉपअप के पहले वाली आकर और उसकी स्थिति को याद रखे</string>
|
||||
<string name="player_gesture_controls_title">विडियो प्लेयर के gesture कण्ट्रोल</string>
|
||||
<string name="player_gesture_controls_summary">विडियो प्लेयर की ब्राइटनेस और ध्वनी को नियंत्रण के लिए फ़ोन में gesture से इशारो का प्रयोग करे</string>
|
||||
<string name="player_gesture_controls_title">प्लेयर इशारा नियंत्रण</string>
|
||||
<string name="player_gesture_controls_summary">विडियो प्लेयर की ब्राइटनेस और ध्वनी को नियंत्रण के लिए फ़ोन में इशारो का प्रयोग करे</string>
|
||||
<string name="show_search_suggestions_title">खोज के सुझाव देखे</string>
|
||||
<string name="show_search_suggestions_summary">जब कुछ ढूंड रहे हो तो सुझाव दिखाये</string>
|
||||
<string name="enable_search_history_title">खोज के इतिहास को देखे</string>
|
||||
@@ -377,4 +377,15 @@
|
||||
|
||||
<string name="enable_disposed_exceptions_title">Out-of-Lifecycle त्रुटियों की रिपोर्ट करें</string>
|
||||
<string name="download_thumbnail_title">छायाप्रारुप लोड करें</string>
|
||||
<string name="use_inexact_seek_title">तेजी से अचूक तलाश का प्रयोग करें</string>
|
||||
<string name="use_inexact_seek_summary">अचूक खोज प्लेयर को कम परिशुद्धता के साथ तेजी से पदों की तलाश करने की अनुमति देता है</string>
|
||||
<string name="download_thumbnail_summary">सभी थंबनेल को डेटा और मेमोरी उपयोग पर लोड करने और सहेजने से रोकने के लिए अक्षम करें। इसे बदलने से इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों साफ़ हो जाएंगे।</string>
|
||||
<string name="thumbnail_cache_wipe_complete_notice">छवि कैश मिटा दिया</string>
|
||||
<string name="metadata_cache_wipe_title">कैश मेटाडेटा वाइप करें</string>
|
||||
<string name="metadata_cache_wipe_summary">सभी कैश किए गए वेबपृष्ठ डेटा हटाएं</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">मेटाडाटा कैश मिटा दिया गया</string>
|
||||
<string name="auto_queue_title">अगली स्ट्रीम को स्वचालित रूप से जोड़ें</string>
|
||||
<string name="auto_queue_summary">गैर-दोहराने वाली कतार में अंतिम स्ट्रीम चलाते समय संबंधित स्ट्रीम को स्वतः संलग्न करें।</string>
|
||||
<string name="file">फाइल</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -480,4 +480,15 @@
|
||||
<string name="app_license">NewPipe è un software libero con licenza copyleft: puoi usarlo, studiarlo, condividerlo e migliorarlo a tuo piacimento. In particolare, è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License pubblicata dalla Free Software Foundation, sia nella versione 3 della Licenza, sia (a propria discrezione) in qualsiasi versione successiva.</string>
|
||||
<string name="import_settings">Vuoi anche importare le impostazioni?</string>
|
||||
|
||||
<string name="privacy_policy_title">Informativa sulla privacy</string>
|
||||
<string name="privacy_policy_encouragement">Il progetto NewPipe tiene molto alla tua privacy. Perciò, l\'app non raccoglie alcun dato senza il tuo consenso.
|
||||
\nL\'informativa sulla privacy di NewPipe spiega in dettaglio quali dati vengono inviati e memorizzati quando si invia un rapporto sugli arresti anomali.</string>
|
||||
<string name="read_privacy_policy">Leggi l\'informativa sulla privacy</string>
|
||||
<string name="start_accept_privacy_policy">Per rispettare il regolamento europeo sulla protezione dei dati (GDPR), attiriamo la vostra attenzione riguardo l\'informativa sulla privacy di NewPipe. Si prega di leggerla attentamente.
|
||||
\nDevi accettarla per inviarci il bug report.</string>
|
||||
<string name="accept">Accetto</string>
|
||||
<string name="decline">Rifiuto</string>
|
||||
|
||||
<string name="limit_data_usage_none_description">Senza limiti</string>
|
||||
<string name="limit_mobile_data_usage_title">Limita la risoluzione quando si utilizzano dati mobili</string>
|
||||
</resources>
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
<string name="settings_category_debug_title">Дебагирање</string>
|
||||
<string name="background_player_playing_toast">Пуштено во позадина</string>
|
||||
<string name="popup_playing_toast">Пуштено во прозорче</string>
|
||||
<string name="background_player_append">Ставено на листа, за заднинско пуштање</string>
|
||||
<string name="background_player_append">Ставено на листата за заднинско пуштање</string>
|
||||
<string name="popup_playing_append">Ставено на листа, за пуштање во прозорче</string>
|
||||
<string name="play_btn_text">Пушти</string>
|
||||
<string name="content">Содржина</string>
|
||||
@@ -438,7 +438,7 @@
|
||||
<string name="app_license">NewPipe е „copyleft“ слободен софтвер: Можеш да ја користиш, истражуваш и подобруваш по твоја желба. Можеш да ја редистрибуираш и/или да ја промениш под условите на GNU GPL лиценцата, публикувана од фондацијата FSF - или верзија 3 од лиценцата, или (по можност) понова верзија.</string>
|
||||
<string name="import_settings">Дали сакаш да се внесат и подесувањата?</string>
|
||||
|
||||
<string name="preferred_open_action_settings_title">Преферирана акција за „отворање“</string>
|
||||
<string name="preferred_open_action_settings_title">Претпочитана акција за „отворање“</string>
|
||||
<string name="preferred_open_action_settings_summary">Стандардна акција при отворање видеа — %s</string>
|
||||
|
||||
<string name="caption_setting_title">Преводи</string>
|
||||
|
||||
@@ -467,4 +467,14 @@
|
||||
|
||||
<string name="unhook_checkbox">Avhekt (kan forårsake forvrenging)</string>
|
||||
<string name="playback_nightcore">Nightcore</string>
|
||||
<string name="privacy_policy_title">NewPipes personvernspraksis</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke programmet inn data uten ditt samtykke.
|
||||
\nNewPipes personvernspraksis forklarer i detalj hvilken deta som sendes og lagres når du sender en kræsjrapport.</string>
|
||||
<string name="read_privacy_policy">Les personvernspraksis</string>
|
||||
<string name="start_accept_privacy_policy">For å overholde Europeisk Generell Data Proteksjons-Regularing (GDPR), vil vi rette oppmerksomheten din mot NewPipes personvernspraksis. Les den nøye.
|
||||
\nDu må godta den for å sende oss feilrapporten.</string>
|
||||
<string name="accept">Godta</string>
|
||||
<string name="decline">Avslå</string>
|
||||
<string name="limit_data_usage_none_description">Ubegrenset</string>
|
||||
<string name="limit_mobile_data_usage_title">Begrens oppløsning når mobildata brukes</string>
|
||||
</resources>
|
||||
|
||||
@@ -438,4 +438,14 @@
|
||||
<string name="app_license">NewPipe is vrije software: ge kund het gebruiken, bestuderen, delen en verbeteren zoveel als da’ ge maar wild. Ge kund het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) gelijk welke latere versie.</string>
|
||||
<string name="import_settings">Wild ge d’instellingen ook importeren?</string>
|
||||
|
||||
<string name="privacy_policy_title">Privacybeleid van NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">’t NewPipe-project neemt uw privacy ter harte. Daarom verzameld den app geen gegevens zonder uw toestemming.
|
||||
\n’t Privacybeleid van NewPipe legd in detail uit welke gegevens da’ der worden verzonden en opgeslagen wanneer da’ g’een crashrappor indiend.</string>
|
||||
<string name="read_privacy_policy">Privacybeleid lezen</string>
|
||||
<string name="start_accept_privacy_policy">Voor d’Europese privacywet (ook wel GDPR genoemd) na te leven, wijzen w’u op ’t nieuw privacybeleid van NewPipe. Leesd ’t aandachtig.
|
||||
\nGe moet ’t aanvaarden voor ons ’t bugrapport te sturen.</string>
|
||||
<string name="accept">Aanvaarden</string>
|
||||
<string name="decline">Weigeren</string>
|
||||
<string name="limit_data_usage_none_description">Onbeperkt</string>
|
||||
<string name="limit_mobile_data_usage_title">Resolutie beperken bij gebruik van mobiele gegevens</string>
|
||||
</resources>
|
||||
|
||||
@@ -475,4 +475,14 @@ te openen in pop-upmodus</string>
|
||||
<string name="app_license">NewPipe is vrije software: je kan het gebruiken, bestuderen, delen en verbeteren zoveel je maar wil. Je kan het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) om het even welke latere versie.</string>
|
||||
<string name="import_settings">Wil je ook de instellingen importeren?</string>
|
||||
|
||||
<string name="privacy_policy_title">NewPipe\'s privacybeleid</string>
|
||||
<string name="privacy_policy_encouragement">Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder jouw toestemming.
|
||||
\nNewPipe\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als je een crashrapport verstuurd.</string>
|
||||
<string name="read_privacy_policy">Privacybeleid lezen</string>
|
||||
<string name="start_accept_privacy_policy">Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we je op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig.
|
||||
\nJe moet het beleid accepteren om ons het bugrapport te kunnen sturen.</string>
|
||||
<string name="accept">Accepteren</string>
|
||||
<string name="decline">Weigeren</string>
|
||||
<string name="limit_data_usage_none_description">Ongelimiteerd</string>
|
||||
<string name="limit_mobile_data_usage_title">Resolutie beperken bij gebruik van mobiele gegevens</string>
|
||||
</resources>
|
||||
|
||||
@@ -457,4 +457,14 @@ abrir em modo popup</string>
|
||||
<string name="app_license">NewPipe is copyleft libre software: Você pode usar, estudar, compartilhar e melhorar ele a vontade. Mais especificamente você pode redistribuir e/ou modificar ele sob os termos da GNU General Public License como publicada pela Free Software Foundation, tanto a versão 3 dessa Licença, ou (a sua escolha) qualquer outra versão posterior.</string>
|
||||
<string name="import_settings">Você também quer importar as configurações?</string>
|
||||
|
||||
<string name="privacy_policy_title">Política de privacidade do NewPipe</string>
|
||||
<string name="privacy_policy_encouragement">O projeto NewPipe leva a sua privacidade muito a sério. Sendo assim, o aplicativo não coleta nenhum dado sem seu consentimento.
|
||||
\nA polícia de privacidade do NewPipe explica em detalhes qual dado é enviado e salvo quando você envia um relatório de erros.</string>
|
||||
<string name="read_privacy_policy">Ler a política de privacidade</string>
|
||||
<string name="start_accept_privacy_policy">A fim de cumprir com o European General Data Protection Regulation (GDPR), em português, Regulamento Geral sobre a Proteção de Dados (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por vafor, leia-a cuidadosamente.
|
||||
\nVocê tem que aceitá-la para nos enviar relatório de erros.</string>
|
||||
<string name="accept">Aceitar</string>
|
||||
<string name="decline">Recusar</string>
|
||||
<string name="limit_data_usage_none_description">Ilimitado</string>
|
||||
<string name="limit_mobile_data_usage_title">Limitar resolução quando dados móveis estiverem em uso</string>
|
||||
</resources>
|
||||
|
||||
@@ -125,7 +125,7 @@
|
||||
<string name="controls_background_title">В фоне</string>
|
||||
<string name="controls_popup_title">В окне</string>
|
||||
|
||||
<string name="show_higher_resolutions_summary">Только некоторые устройства могут воспроизводить видео в 2K/4K</string>
|
||||
<string name="show_higher_resolutions_summary">Только некоторые устройства могут воспроизводить 2K/4K видео</string>
|
||||
<string name="default_video_format_title">Формат видео по умолчанию</string>
|
||||
<string name="black_theme_title">Чёрная</string>
|
||||
<string name="popup_remember_size_pos_title">Запоминать размер и положение всплывающего окна</string>
|
||||
@@ -436,9 +436,9 @@
|
||||
\n4. Скопируйте адрес из адресной строки.</string>
|
||||
<string name="import_soundcloud_instructions_hint">вашID, soundcloud.com/вашID</string>
|
||||
|
||||
<string name="import_network_expensive_warning">Помните, что за выход в интернет может взиматься плата.
|
||||
\n
|
||||
\nВы хотите продолжить?</string>
|
||||
<string name="import_network_expensive_warning">Эта операция может использовать большие объемы сетевого трафика.
|
||||
\n
|
||||
\nПродолжить?</string>
|
||||
<string name="download_thumbnail_title">Загружать миниатюры</string>
|
||||
<string name="download_thumbnail_summary">Отключите, чтобы перестать загружать миниатюры и начать экономить трафик и память. Изменение настройки очистит кеш изображений в памяти и на диске.</string>
|
||||
<string name="thumbnail_cache_wipe_complete_notice">Кеш изображений очищен</string>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="main_bg_subtitle">Başlamak için aramaya dokunun</string>
|
||||
<string name="main_bg_subtitle">Başlamak için aramaya dokun</string>
|
||||
<string name="view_count_text">%1$s görüntüleme</string>
|
||||
<string name="upload_date_text">Yayımlanma: %1$s</string>
|
||||
<string name="no_player_found">Akış oynatıcı bulunamadı. VLC\'yi kurmak ister misiniz?</string>
|
||||
@@ -31,12 +31,12 @@
|
||||
<string name="default_resolution_title">Öntanımlı çözünürlük</string>
|
||||
<string name="play_with_kodi_title">Kodi ile oynat</string>
|
||||
<string name="kore_not_found">Kore uygulaması bulunamadı. Kurulsun mu?</string>
|
||||
<string name="show_play_with_kodi_title">\"Kodi ile Oynat\" seçeneğini göster</string>
|
||||
<string name="show_play_with_kodi_title">\"Kodi ile oynat\" seçeneğini göster</string>
|
||||
<string name="show_play_with_kodi_summary">Kodi ortam merkezi aracılığıyla video oynatmak için bir seçenek görüntüler</string>
|
||||
<string name="default_audio_format_title">Öntanımlı ses biçimi</string>
|
||||
<string name="webm_description">WebM — özgür biçim</string>
|
||||
<string name="m4a_description">M4A — daha iyi nitelik</string>
|
||||
<string name="theme_title">Gövde</string>
|
||||
<string name="m4a_description">M4A — daha iyi kalite</string>
|
||||
<string name="theme_title">Tema</string>
|
||||
<string name="dark_theme_title">Koyu</string>
|
||||
<string name="light_theme_title">Açık</string>
|
||||
|
||||
@@ -52,8 +52,8 @@
|
||||
<string name="background_player_playing_toast">Arka planda oynatıyor</string>
|
||||
<string name="play_btn_text">Oynat</string>
|
||||
<string name="content">İçerik</string>
|
||||
<string name="show_age_restricted_content_title">Yaş kısıtlamalı içerik göster</string>
|
||||
<string name="video_is_age_restricted">Yaş Kısıtlamalı Video. Bu gibi materyallere Ayarlar\'dan izin verilebilir.</string>
|
||||
<string name="show_age_restricted_content_title">Yaş sınırlı içeriği göster</string>
|
||||
<string name="video_is_age_restricted">Yaş Sınırlı Video. Bu gibi materyallere Ayarlar\'dan izin verilebilir.</string>
|
||||
<string name="duration_live">canlı</string>
|
||||
<string name="downloads">İndirilenler</string>
|
||||
<string name="downloads_title">İndirilenler</string>
|
||||
@@ -67,10 +67,10 @@
|
||||
<string name="light_parsing_error">Web sitesi tümüyle ayrıştırılamadı</string>
|
||||
<string name="content_not_available">İçerik kullanılabilir değil</string>
|
||||
<string name="blocked_by_gema">GEMA tarafından engellendi</string>
|
||||
<string name="live_streams_not_supported">Bu bir CANLI AKIŞ ve henüz desteklenmiyor.</string>
|
||||
<string name="live_streams_not_supported">Bu, henüz desteklenmeyen, bir CANLI AKIŞ.</string>
|
||||
<string name="could_not_get_stream">Herhangi bir akış alınamadı</string>
|
||||
<string name="could_not_load_image">Resim yüklenemedi</string>
|
||||
<string name="app_ui_crash">Uygulama/Kullanıcı arayüzü çöktü</string>
|
||||
<string name="app_ui_crash">Uygulama/arayüz çöktü</string>
|
||||
<string name="sorry_string">Üzgünüz, bu olmamalıydı.</string>
|
||||
<string name="error_report_button_text">Hatayı e-postayla bildir</string>
|
||||
<string name="error_snackbar_message">Üzgünüz, bazı hatalar oluştu.</string>
|
||||
@@ -162,8 +162,8 @@
|
||||
<string name="refresh">Yenile</string>
|
||||
<string name="clear">Temizle</string>
|
||||
|
||||
<string name="popup_remember_size_pos_title">Açılır pencere boyutunu ve yerini anımsa</string>
|
||||
<string name="popup_remember_size_pos_summary">Açılır pencerenin ayarlandığı son boyutu ve yeri anımsa</string>
|
||||
<string name="popup_remember_size_pos_title">Açılır pencere boyutunu ve konumunu hatırla</string>
|
||||
<string name="popup_remember_size_pos_summary">Açılır pencerenin ayarlandığı son boyutu ve konumu hatırla</string>
|
||||
|
||||
<string name="settings_category_popup_title">Açılır Pencere</string>
|
||||
<string name="popup_resizing_indicator_title">Boyutlandırılıyor</string>
|
||||
@@ -172,7 +172,7 @@
|
||||
<string name="player_gesture_controls_summary">Oynatıcının parlaklığını ve sesini yönetmek için el hareketlerini kullan</string>
|
||||
<string name="player_gesture_controls_title">Oynatıcı el hareketi denetimleri</string>
|
||||
<string name="show_search_suggestions_title">Arama önerileri</string>
|
||||
<string name="show_search_suggestions_summary">Ararken önerileri göster</string>
|
||||
<string name="show_search_suggestions_summary">Aramada önerileri göster</string>
|
||||
|
||||
<string name="best_resolution">En iyi çözünürlük</string>
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
<string name="tab_about">Hakkında</string>
|
||||
<string name="tab_contributors">Katkıda bulunanlar</string>
|
||||
<string name="tab_licenses">Lisanslar</string>
|
||||
<string name="app_description">Android için özgür, hafif akış oynatıcı.</string>
|
||||
<string name="app_description">Android\'de özgür, hafif akış oynatımı.</string>
|
||||
<string name="view_on_github">GitHub\'da gör</string>
|
||||
<string name="app_license_title">NewPipe\'ın Lisansı</string>
|
||||
<string name="contribution_encouragement">Fikirleriniz; çeviri, tasarım değişiklikleri, kod temizliği ya da gerçek köklü kod değişikleri olsun yardımınıza her zaman açığız. Ne kadar çok yapılırsa o kadar iyi olur!</string>
|
||||
@@ -206,13 +206,13 @@
|
||||
<string name="subscription_change_failed">Abonelik değiştirilemiyor</string>
|
||||
<string name="subscription_update_failed">Abonelik güncellenemiyor</string>
|
||||
|
||||
<string name="tab_main">Temel</string>
|
||||
<string name="tab_main">Ana</string>
|
||||
<string name="tab_subscriptions">Abonelikler</string>
|
||||
|
||||
<string name="fragment_whats_new">Neler Yeni</string>
|
||||
|
||||
<string name="enable_search_history_title">Arama geçmişi</string>
|
||||
<string name="enable_search_history_summary">Arama sorgularını yerel olarak biriktir</string>
|
||||
<string name="enable_search_history_summary">Arama sorgularını yerel olarak sakla</string>
|
||||
<string name="enable_watch_history_title">Geçmiş ve Önbellek</string>
|
||||
<string name="enable_watch_history_summary">İzlenen videoların kaydını tut</string>
|
||||
<string name="resume_on_audio_focus_gain_title">Odaklanıldığında sürdür</string>
|
||||
@@ -221,7 +221,7 @@
|
||||
<string name="settings_category_player_behavior_title">Davranış</string>
|
||||
<string name="settings_category_history_title">Geçmiş ve Önbellek</string>
|
||||
<string name="playlist">Oynatma Listesi</string>
|
||||
<string name="undo">Geri al</string>
|
||||
<string name="undo">Geri Al</string>
|
||||
|
||||
<string name="notification_channel_name">NewPipe Bildirimi</string>
|
||||
<string name="notification_channel_description">NewPipe Arka Plan ve Açılır Pencere Oynatıcıları için Bildirimler</string>
|
||||
@@ -256,7 +256,7 @@
|
||||
<string name="history_cleared">Geçmiş temizlendi</string>
|
||||
<string name="item_deleted">Öge silindi</string>
|
||||
<string name="delete_item_search_history">Bu içeriği arama geçmişinden silmek istiyor musunuz?</string>
|
||||
<string name="show_hold_to_append_title">\"Sardırmak için tut\" ipucunu göster</string>
|
||||
<string name="show_hold_to_append_title">\"Kuyruğa almak İçin bas\" ipucunu göster</string>
|
||||
<string name="show_hold_to_append_summary">Video ayrıntıları sayfasında arka plan veya açılır pencere düğmesine basıldığında ipucu göster</string>
|
||||
<string name="background_player_append">Arka plan oynatıcıda kuyruğa eklendi</string>
|
||||
<string name="popup_playing_append">Açılır pencere oynatıcıda kuyruğa eklendi</string>
|
||||
@@ -274,7 +274,7 @@
|
||||
<string name="subscription_page_summary">Abonelik Sayfası</string>
|
||||
<string name="feed_page_summary">Besleme Sayfası</string>
|
||||
<string name="channel_page_summary">Kanal Sayfası</string>
|
||||
<string name="select_a_channel">Kanal seç</string>
|
||||
<string name="select_a_channel">Bir kanal seç</string>
|
||||
<string name="no_channel_subscribed_yet">Henüz abone olunan kanal yok</string>
|
||||
<string name="select_a_kiosk">Köşk seç</string>
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
<string name="start_here_on_popup">Burada Açılır Pencerede Başlat</string>
|
||||
<string name="donation_title">Bağış yapın</string>
|
||||
<string name="donation_encouragement">NewPipe, size en iyi deneyimi sunmak için zamanını harcayan gönüllüler tarafından geliştirilmiştir. Bir fincan kahveyi yudumlarken NewPipe\'ı daha da iyi yapmaları için geliştiricilere yardımcı olun.</string>
|
||||
<string name="give_back">Karşılığını ver</string>
|
||||
<string name="give_back">Geri ver</string>
|
||||
<string name="website_title">Web sitesi</string>
|
||||
<string name="website_encouragement">Daha çok bilgi ve haber için NewPipe Web Sitesini ziyaret edin.</string>
|
||||
<string name="default_content_country_title">Öntanımlı içerik ülkesi</string>
|
||||
@@ -325,13 +325,13 @@
|
||||
<string name="preferred_player_fetcher_notification_message">İstenen içerik yükleniyor</string>
|
||||
<string name="import_data_title">Veri tabanını içe aktar</string>
|
||||
<string name="export_data_title">Veri tabanını dışa aktar</string>
|
||||
<string name="import_data_summary">Şimdiki geçmişinizi ve aboneliklerinizi geçersiz kılacak</string>
|
||||
<string name="import_data_summary">Şu anki geçmişinizi ve aboneliklerinizi geçersiz kılar</string>
|
||||
<string name="export_data_summary">Geçmişi, abonelikleri ve oynatma listelerini dışa aktar.</string>
|
||||
<string name="export_complete_toast">Dışa aktarım bitti</string>
|
||||
<string name="import_complete_toast">İçe aktarım bitti</string>
|
||||
<string name="no_valid_zip_file">Geçerli ZIP dosyası yok</string>
|
||||
<string name="could_not_import_all_files">Uyarı: Tüm dosyalar içe aktarılamadı.</string>
|
||||
<string name="override_current_data">Bu şimdiki kurulumunuzu geçersiz kılacak.</string>
|
||||
<string name="override_current_data">Bu, şu anki kurulumunuzu geçersiz kılacak.</string>
|
||||
|
||||
<string name="controls_download_desc">Akış dosyasını indir.</string>
|
||||
<string name="show_info">Bilgileri göster</string>
|
||||
@@ -382,10 +382,10 @@
|
||||
<string name="normal_caption_font_size">Normal yazı tipi</string>
|
||||
<string name="larger_caption_font_size">Daha büyük yazı tipi</string>
|
||||
<string name="settings_category_debug_title">Hata Ayıklama</string>
|
||||
<string name="drawer_header_action_paceholder_text">Yakında burada bir şeyler gözükecek ;D</string>
|
||||
<string name="drawer_header_action_paceholder_text">Yakında burada bir şeyler görünecek ;D</string>
|
||||
|
||||
|
||||
<string name="caption_auto_generated">Kendiliğinden Oluşturulmuş</string>
|
||||
<string name="caption_auto_generated">Kendiliğinden Üretilmiş</string>
|
||||
<string name="enable_leak_canary_title">LeakCanary\'i Etkinleştir</string>
|
||||
<string name="enable_leak_canary_summary">Bellek sızıntı gözlemlemesi, yığın boşaltımı sırasında uygulamanın tepkisiz kalmasına neden olabilir</string>
|
||||
|
||||
@@ -393,9 +393,9 @@
|
||||
<string name="enable_disposed_exceptions_summary">Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsündeki teslim edilemeyen Rx beklentilerinin bildirimini zorla</string>
|
||||
|
||||
<string name="use_inexact_seek_title">Hızlı isabetsiz konumlama kullan</string>
|
||||
<string name="use_inexact_seek_summary">İsabetsiz konumlama, oynatıcının konumları düşürülmüş duyarlıkla saptamasını sağlar</string>
|
||||
<string name="use_inexact_seek_summary">İsabetsiz konumlama, oynatıcının azaltılmış kesinlikle daha hızlı konumlama yapmasını sağlar</string>
|
||||
<string name="auto_queue_title">Sonraki akışı kendiliğinden kuyruğa ekle</string>
|
||||
<string name="auto_queue_summary">Yinelemeyen kuyruktaki son akış oynatılırken ilgili akışı sonuna kendiliğinden ekle.</string>
|
||||
<string name="auto_queue_summary">Yinelemeyen bir kuyruktaki son akış oynatılırken ilgili bir akışı kendiliğinden sonuna ekle.</string>
|
||||
<string name="live_sync">EŞZAMANLA</string>
|
||||
|
||||
<string name="file">Dosya</string>
|
||||
@@ -433,28 +433,28 @@
|
||||
\n4. Yönlendirildiğiniz profil URL\'sini kopyalayın.</string>
|
||||
<string name="import_soundcloud_instructions_hint">kimliginiz, soundcloud.com/kimliginiz</string>
|
||||
|
||||
<string name="import_network_expensive_warning">Bu sürecin ağ masrafına neden olabileceğini unutmayın.
|
||||
\n
|
||||
<string name="import_network_expensive_warning">Bu sürecin ağa yük olabileceğini unutmayın.
|
||||
\n
|
||||
\nDevam etmek istiyor musunuz?</string>
|
||||
<string name="download_thumbnail_title">Önizlemeleri yükle</string>
|
||||
<string name="download_thumbnail_summary">Bellek ve veri kullanımını azaltmak için önizleme yüklemelerini devre dışı bırakın. Bunu değiştirmek, hem bellek hem de disk üzerindeki önbelleği temizleyecektir.</string>
|
||||
<string name="download_thumbnail_title">Küçük resimleri yükle</string>
|
||||
<string name="download_thumbnail_summary">Küçük resimlerin hepsinin yüklenmesini engellemek ve bellek ve veri kullanımını azaltmak için devre dışı bırakın. Bunu değiştirmek, hem bellekteki hem de diskteki resim önbelleğini temizler.</string>
|
||||
<string name="thumbnail_cache_wipe_complete_notice">Resim önbelleği temizlendi</string>
|
||||
<string name="metadata_cache_wipe_title">Önbellek verisini temizle</string>
|
||||
<string name="metadata_cache_wipe_summary">Önbelleklenmiş tüm web içeriği verisini kaldır</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">Veri önbelleği temizlendi</string>
|
||||
<string name="metadata_cache_wipe_title">Önbelleklenmiş üst veriyi temizle</string>
|
||||
<string name="metadata_cache_wipe_summary">Önbelleklenmiş tüm web sayfası verisini kaldır</string>
|
||||
<string name="metadata_cache_wipe_complete_notice">Üst veri önbelleği temizlendi</string>
|
||||
<string name="playback_speed_control">Oynatım Hızı Denetimleri</string>
|
||||
<string name="playback_tempo">Hız</string>
|
||||
<string name="playback_default">Varsayılan</string>
|
||||
<string name="playback_default">Öntanımlı</string>
|
||||
<string name="playback_pitch">Ses titreşimi</string>
|
||||
<string name="unhook_checkbox">Çengelini Çıkar (bozukluğa neden olabilir)</string>
|
||||
<string name="unhook_checkbox">Çengeli Çıkar (bozukluğa neden olabilir)</string>
|
||||
<string name="playback_nightcore">Nightcore</string>
|
||||
<string name="no_streams_available_download">İndirmeye uygun akış yok</string>
|
||||
|
||||
<string name="preferred_open_action_settings_title">Yeğlenen \'açma\' eylemi</string>
|
||||
<string name="preferred_open_action_settings_title">Yeğlenen \'aç\' eylemi</string>
|
||||
<string name="preferred_open_action_settings_summary">İçerik açılırken öntanımlı eylem — %s</string>
|
||||
|
||||
<string name="caption_setting_title">Ek Açıklamalar</string>
|
||||
<string name="caption_setting_description">Oynatıcıdaki ek açıklamalar metninin ölçeğini ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir.</string>
|
||||
<string name="caption_setting_description">Oynatıcı ek açıklamalar metin boyutunu ve arka plan biçimlerini düzenle. Etki için uygulamayı yeniden başlatmak gerekir.</string>
|
||||
|
||||
<string name="toast_no_player">Bu dosyayı oynatmak için kurulan uygulama yok</string>
|
||||
|
||||
@@ -469,6 +469,16 @@
|
||||
<string name="one_item_deleted">1 öge silindi.</string>
|
||||
|
||||
<string name="app_license">NewPipe, telif müsaadeli özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir, iyileştirebilirsiniz. Özellikle; Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı\'nın, lisansın 3. sürümüyle veya (isterseniz) daha sonraki sürümünün koşulları altında yeniden dağıtabilir ve/veya düzenleyebilirsiniz.</string>
|
||||
<string name="import_settings">Ayrıca ayarları içe aktarmak istiyor musunuz?</string>
|
||||
<string name="import_settings">Ayarları da içe aktarmak istiyor musunuz?</string>
|
||||
|
||||
<string name="privacy_policy_title">NewPipe\'ın Gizlilik İlkesi</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe projesi, gizliliğinizi çok ciddiye alır. Bu nedenle, uygulama sizin izniniz olmadan herhangi bir veri toplamaz.
|
||||
\nNewPipe\'ın gizlilik ilkesi, bir çökme bildirimi gönderdiğinizde hangi verilerin gönderilip saklandığını ayrıntılı olarak açıklar.</string>
|
||||
<string name="read_privacy_policy">Gizlilik ilkesini oku</string>
|
||||
<string name="start_accept_privacy_policy">Avrupa Genel Veri Koruma Yönetmeliğine (GDPR) uymak için, dikkatinizi NewPipe\'ın gizlilik ilkesine çekiyoruz. Lütfen dikkatlice okuyun.
|
||||
\nBize hata bildirimini göndermek için kabul etmelisiniz.</string>
|
||||
<string name="accept">Kabul et</string>
|
||||
<string name="decline">Kabul etme</string>
|
||||
<string name="limit_data_usage_none_description">Sınırsız</string>
|
||||
<string name="limit_mobile_data_usage_title">Mobil veri kullanırken çözünürlüğü sınırla</string>
|
||||
</resources>
|
||||
|
||||
@@ -463,4 +463,14 @@
|
||||
<string name="app_license">"NewPipe є вільною копілефт програмою: Ви можете використовувати її, поширювати та вдосконавлювати за власним розсудом. Зокрема ви можете перерозподіляти та/або змінювати її за умов використання GNU General Public License, опублікованою Free Software Foundation, під 3-ю версією ліцензії, або (на ваш вибір) будь-якою пізнішою версією."</string>
|
||||
<string name="import_settings">Чи ви також бажаєте імпортувати налаштування?</string>
|
||||
|
||||
<string name="privacy_policy_title">Політика приватності NewPip\'у</string>
|
||||
<string name="privacy_policy_encouragement">Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому цей застосунок не збирає ніяких даних без вашої згоди
|
||||
\nПолітика приватності NewPipe поясняє у деталях які дані було відіслано та збережено, під час відсилання крахового звіту.</string>
|
||||
<string name="read_privacy_policy">Читати політику приватності</string>
|
||||
<string name="start_accept_privacy_policy">Аби дотриматися Норм загального захисту даних ЄС (General Data Protection Regulation, GDPR), ми просимо звернути вашу увагу на NewPipe\'ову політику приватності. Будь ласка, прочитайте уважно
|
||||
\nВи маєте підтвердити її аби надіслати нам баґового звіту.</string>
|
||||
<string name="accept">Ухвалити</string>
|
||||
<string name="decline">Відхилити</string>
|
||||
<string name="limit_data_usage_none_description">Безмежно</string>
|
||||
<string name="limit_mobile_data_usage_title">Обмежити роздільну здатність під час користування мобільним інтернетом</string>
|
||||
</resources>
|
||||
|
||||
@@ -8,4 +8,6 @@
|
||||
<string name="download">ڈاؤن لوڈکریں</string>
|
||||
<string name="search">تلاش کریں</string>
|
||||
<string name="did_you_mean">نتائج دکھارہاہےبرائے</string>
|
||||
<string name="open_in_browser">انٹرنیٹ میں کھولیں</string>
|
||||
<string name="settings">ترتیبات</string>
|
||||
</resources>
|
||||
|
||||
@@ -458,4 +458,14 @@
|
||||
<string name="app_license">NewPipe 是一個 Copyleft 的自由軟體:您可以隨意使用、研究、分享並改進它。您可以在遵守由自由軟體基金會所發佈的 GNU 通用公共授權條款的狀況下自由地再散佈及/或修改它,授權條款預設使用第三版,但您也可以選擇更新的版本。</string>
|
||||
<string name="import_settings">您是否同時的匯入設定?</string>
|
||||
|
||||
<string name="privacy_policy_title">NewPipe 的隱私政策</string>
|
||||
<string name="privacy_policy_encouragement">NewPipe 專案非常重視您的隱私。因此,未經您的同意應用程式不會收集任何的資料。
|
||||
\nNewPipe 的隱私權政策,詳細說明了當您發送錯誤回報時,什麼資料才會進行傳送及儲存。</string>
|
||||
<string name="read_privacy_policy">閱讀隱私政策</string>
|
||||
<string name="start_accept_privacy_policy">為了符合歐洲通用資料保護條例 ( GDPR ) ,我們請您注意 NewPipe 的隱私政策。請您務必仔細閱讀。
|
||||
\n您必須接受它才能向我們發送錯誤報告。</string>
|
||||
<string name="accept">接受</string>
|
||||
<string name="decline">下降</string>
|
||||
<string name="limit_data_usage_none_description">沒有限制</string>
|
||||
<string name="limit_mobile_data_usage_title">當您使用行動網路時限制解析度</string>
|
||||
</resources>
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
<string name="popup_remember_size_pos_key" translatable="false">popup_remember_size_pos_key</string>
|
||||
<string name="use_inexact_seek_key" translatable="false">use_inexact_seek_key</string>
|
||||
<string name="auto_queue_key" translatable="false">auto_queue_key</string>
|
||||
<string name="screen_brightness_key" translatable="false">screen_brightness_key</string>
|
||||
<string name="screen_brightness_timestamp_key" translatable="false">screen_brightness_timestamp_key</string>
|
||||
|
||||
<string name="default_resolution_key" translatable="false">default_resolution</string>
|
||||
<string name="default_resolution_value" translatable="false">360p</string>
|
||||
@@ -853,4 +855,22 @@
|
||||
<item>ZM</item>
|
||||
<item>ZW</item>
|
||||
</string-array>
|
||||
|
||||
<!-- Limit mobile data usage -->
|
||||
<string name="limit_mobile_data_usage_key" translatable="false">limit_mobile_data_usage</string>
|
||||
<string name="limit_data_usage_none_key" translatable="false">limit_data_usage_none</string>
|
||||
|
||||
<string-array name="limit_data_usage_values_list">
|
||||
<item>@string/limit_data_usage_none_key</item>
|
||||
<item>1080p60</item>
|
||||
<item>1080p</item>
|
||||
<item>720p60</item>
|
||||
<item>720p</item>
|
||||
<item>480p</item>
|
||||
<item>360p</item>
|
||||
<item>240p</item>
|
||||
<item>144p</item>
|
||||
</string-array>
|
||||
|
||||
|
||||
</resources>
|
||||
@@ -483,8 +483,25 @@
|
||||
<string name="playback_nightcore">Nightcore</string>
|
||||
<string name="playback_default">Default</string>
|
||||
|
||||
<!-- Start dialogs -->
|
||||
<!-- GDPR dialog -->
|
||||
<string name="start_accept_privacy_policy">In order to comply with the European General Data Protection Regulation (GDPR), we herby draw your attention to NewPipe\'s privacy policy. Please read it carefully.\nYou must accept it to send us the bug report.</string>
|
||||
<string name="accept">Accept</string>
|
||||
<string name="decline">Decline</string>
|
||||
|
||||
<!-- Limit mobile data usage -->
|
||||
<string name="limit_data_usage_none_description">No limit</string>
|
||||
<string name="limit_mobile_data_usage_title">Limit resolution when using mobile data</string>
|
||||
<string name="limit_mobile_data_usage_value" translatable="false">@string/limit_data_usage_none_key</string>
|
||||
<string-array name="limit_data_usage_description_list">
|
||||
<item>@string/limit_data_usage_none_description</item>
|
||||
<item>1080p60</item>
|
||||
<item>1080p</item>
|
||||
<item>720p60</item>
|
||||
<item>720p</item>
|
||||
<item>480p</item>
|
||||
<item>360p</item>
|
||||
<item>240p</item>
|
||||
<item>144p</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -19,6 +19,14 @@
|
||||
android:summary="%s"
|
||||
android:title="@string/default_popup_resolution_title"/>
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="@string/limit_mobile_data_usage_value"
|
||||
android:entries="@array/limit_data_usage_description_list"
|
||||
android:entryValues="@array/limit_data_usage_values_list"
|
||||
android:key="@string/limit_mobile_data_usage_key"
|
||||
android:summary="%s"
|
||||
android:title="@string/limit_mobile_data_usage_title" />
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/show_higher_resolutions_key"
|
||||
@@ -39,7 +47,7 @@
|
||||
android:entryValues="@array/audio_format_values_list"
|
||||
android:key="@string/default_audio_format_key"
|
||||
android:summary="%s"
|
||||
android:title="@string/default_audio_format_title"/>
|
||||
android:title="@string/default_audio_format_title" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:layout="@layout/settings_category_header_layout"
|
||||
|
||||
@@ -129,11 +129,6 @@ public class ListHelperTest {
|
||||
assertEquals(MediaFormat.MPEG_4, result.getFormat());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHighestQualityAudioTest() throws Exception {
|
||||
assertEquals(320, ListHelper.getHighestQualityAudio(audioStreamsTestList).average_bitrate);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHighestQualityAudioFormatTest() throws Exception {
|
||||
AudioStream stream = audioStreamsTestList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.M4A, audioStreamsTestList));
|
||||
@@ -174,19 +169,20 @@ public class ListHelperTest {
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 192),
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 192),
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 192),
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 192)));
|
||||
// List doesn't contains this format, it should fallback to the highest bitrate audio no matter what format it is
|
||||
// and as it have multiple with the same high value, the last one wins
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 192),
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 192)));
|
||||
// List doesn't contains this format, it should fallback to the highest bitrate audio and
|
||||
// the highest quality format.
|
||||
stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList));
|
||||
assertEquals(192, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.M4A, stream.getFormat());
|
||||
|
||||
|
||||
// Again with a new element
|
||||
// Adding a new format and bitrate. Adding another stream will have no impact since
|
||||
// it's not a prefered format.
|
||||
testList.add(new AudioStream("", MediaFormat.WEBMA, /**/ 192));
|
||||
stream = testList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.MP3, testList));
|
||||
assertEquals(192, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.WEBMA, stream.getFormat());
|
||||
assertEquals(MediaFormat.M4A, stream.getFormat());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -195,5 +191,111 @@ public class ListHelperTest {
|
||||
assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, new ArrayList<AudioStream>()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLowestQualityAudioFormatTest() throws Exception {
|
||||
AudioStream stream = audioStreamsTestList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.M4A, audioStreamsTestList));
|
||||
assertEquals(128, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.M4A, stream.getFormat());
|
||||
|
||||
stream = audioStreamsTestList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.WEBMA, audioStreamsTestList));
|
||||
assertEquals(64, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.WEBMA, stream.getFormat());
|
||||
|
||||
stream = audioStreamsTestList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, audioStreamsTestList));
|
||||
assertEquals(64, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.MP3, stream.getFormat());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLowestQualityAudioFormatPreferredAbsent() throws Exception {
|
||||
|
||||
//////////////////////////////////////////
|
||||
// Doesn't contain the preferred format //
|
||||
////////////////////////////////////////
|
||||
|
||||
List<AudioStream> testList = new ArrayList<>(Arrays.asList(
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 128),
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 192)));
|
||||
// List doesn't contains this format, it should fallback to the most compact audio no matter what format it is.
|
||||
AudioStream stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList));
|
||||
assertEquals(128, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.M4A, stream.getFormat());
|
||||
|
||||
// WEBMA is more compact than M4A
|
||||
testList.add(new AudioStream("", MediaFormat.WEBMA, /**/ 128));
|
||||
stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList));
|
||||
assertEquals(128, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.WEBMA, stream.getFormat());
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
// Multiple not-preferred-formats and equal bitrates //
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
testList = new ArrayList<>(Arrays.asList(
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 192),
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 192),
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 256),
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 192),
|
||||
new AudioStream("", MediaFormat.WEBMA, /**/ 192),
|
||||
new AudioStream("", MediaFormat.M4A, /**/ 192)));
|
||||
// List doesn't contains this format, it should fallback to the most compact audio no matter what format it is.
|
||||
stream = testList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.MP3, testList));
|
||||
assertEquals(192, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.WEBMA, stream.getFormat());
|
||||
|
||||
// Should be same as above
|
||||
stream = testList.get(ListHelper.getMostCompactAudioIndex(null, testList));
|
||||
assertEquals(192, stream.average_bitrate);
|
||||
assertEquals(MediaFormat.WEBMA, stream.getFormat());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLowestQualityAudioNull() throws Exception {
|
||||
assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, null));
|
||||
assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, new ArrayList<AudioStream>()));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getVideoDefaultStreamIndexCombinations() throws Exception {
|
||||
List<VideoStream> testList = Arrays.asList(
|
||||
new VideoStream("", MediaFormat.MPEG_4, /**/ "1080p"),
|
||||
new VideoStream("", MediaFormat.MPEG_4, /**/ "720p60"),
|
||||
new VideoStream("", MediaFormat.MPEG_4, /**/ "720p"),
|
||||
new VideoStream("", MediaFormat.WEBM, /**/ "480p"),
|
||||
new VideoStream("", MediaFormat.MPEG_4, /**/ "360p"),
|
||||
new VideoStream("", MediaFormat.WEBM, /**/ "360p"),
|
||||
new VideoStream("", MediaFormat.v3GPP, /**/ "240p60"),
|
||||
new VideoStream("", MediaFormat.WEBM, /**/ "144p"));
|
||||
|
||||
// exact matches
|
||||
assertEquals(1, ListHelper.getVideoStreamIndex("720p60", MediaFormat.MPEG_4, testList));
|
||||
assertEquals(2, ListHelper.getVideoStreamIndex("720p", MediaFormat.MPEG_4, testList));
|
||||
|
||||
// match but not refresh
|
||||
assertEquals(0, ListHelper.getVideoStreamIndex("1080p60", MediaFormat.MPEG_4, testList));
|
||||
assertEquals(6, ListHelper.getVideoStreamIndex("240p", MediaFormat.v3GPP, testList));
|
||||
|
||||
// match but not format
|
||||
assertEquals(1, ListHelper.getVideoStreamIndex("720p60", MediaFormat.WEBM, testList));
|
||||
assertEquals(2, ListHelper.getVideoStreamIndex("720p", MediaFormat.WEBM, testList));
|
||||
assertEquals(1, ListHelper.getVideoStreamIndex("720p60", null, testList));
|
||||
assertEquals(2, ListHelper.getVideoStreamIndex("720p", null, testList));
|
||||
|
||||
// match but not format and not refresh
|
||||
assertEquals(0, ListHelper.getVideoStreamIndex("1080p60", MediaFormat.WEBM, testList));
|
||||
assertEquals(6, ListHelper.getVideoStreamIndex("240p", MediaFormat.WEBM, testList));
|
||||
assertEquals(0, ListHelper.getVideoStreamIndex("1080p60", null, testList));
|
||||
assertEquals(6, ListHelper.getVideoStreamIndex("240p", null, testList));
|
||||
|
||||
// match closest lower resolution
|
||||
assertEquals(7, ListHelper.getVideoStreamIndex("200p", MediaFormat.WEBM, testList));
|
||||
assertEquals(7, ListHelper.getVideoStreamIndex("200p60", MediaFormat.WEBM, testList));
|
||||
assertEquals(7, ListHelper.getVideoStreamIndex("200p", MediaFormat.MPEG_4, testList));
|
||||
assertEquals(7, ListHelper.getVideoStreamIndex("200p60", MediaFormat.MPEG_4, testList));
|
||||
assertEquals(7, ListHelper.getVideoStreamIndex("200p", null, testList));
|
||||
assertEquals(7, ListHelper.getVideoStreamIndex("200p60", null, testList));
|
||||
|
||||
// Can't find a match
|
||||
assertEquals(-1, ListHelper.getVideoStreamIndex("100p", null, testList));
|
||||
}
|
||||
}
|
||||
8
fastlane/metadata/android/en-US/changelogs/64.txt
Normal file
8
fastlane/metadata/android/en-US/changelogs/64.txt
Normal file
@@ -0,0 +1,8 @@
|
||||
### Improvements
|
||||
- Added the ability to limit video quality if using mobile data. #1339
|
||||
- Remember brightness for the session #1442
|
||||
- Improve download performance for weaker CPUs #1431
|
||||
- add (working) support for media session #1433
|
||||
|
||||
### Fix
|
||||
- Fix crash on opening downloads (fix now available for release builds) #1441
|
||||
Reference in New Issue
Block a user