1
0
mirror of https://github.com/TeamNewPipe/NewPipe synced 2026-01-13 18:22:41 +00:00

Compare commits

..

59 Commits

Author SHA1 Message Date
Christian Schabesberger
2a45a13f73 move on to version v0.13.5 2018-06-03 12:36:35 +02:00
Christian Schabesberger
067b15c300 Merge branch 'dev' of https://github.com/DafabHoid/NewPipe into test 2018-06-03 12:20:43 +02:00
Christian Schabesberger
8a1c283542 Merge branch 'media-session-fix' of https://github.com/karyogamy/NewPipe into test 2018-06-03 12:12:54 +02:00
Christian Schabesberger
93d1e8b2ff Merge pull request #1441 from DafabHoid/fixdownloadercrashrelease
Downloader: Fix crash on loading unfinished downloads from .giga files (Fixup for release builds)
2018-06-03 12:08:20 +02:00
Christian Schabesberger
c60d5b54fa Merge branch 'remeber_brightness' of https://github.com/acrosca/NewPipe into test 2018-06-03 11:02:49 +02:00
Andrei.Rosca
ef180f082e Remember brightness for the session 2018-06-02 09:06:40 +02:00
Rex_sa
f52741cc37 Translated using Weblate (Arabic)
Currently translated at 100.0% (373 of 373 strings)
2018-06-02 07:34:24 +02:00
DafabHoid
2a2661f066 Downloader: Fix crash on loading unfinished downloads from .giga files
This is a fixup, which fixes the crash in release builds, too. It keeps proguard from removing the new method "private void readObject(ObjectInputStream)", which is only called by the VM, but not from the code.
2018-06-01 14:35:03 +02:00
Rex_sa
b521903138 Translated using Weblate (Arabic)
Currently translated at 100.0% (373 of 373 strings)
2018-06-01 07:02:51 +02:00
Ali Toor
acbd699d95 Translated using Weblate (Urdu)
Currently translated at 2.9% (11 of 373 strings)
2018-05-31 06:43:02 +02:00
Andrea Troiano
6b8928becb Translated using Weblate (Italiano)
Currently translated at 100,0% (373 of 373 strings)
2018-05-30 11:14:38 +02:00
Víctor Manuel Tapia Ramírez
e393bdb1e5 Translated using Weblate (Spanish)
Currently translated at 99.7% (372 of 373 strings)
2018-05-30 10:43:28 +02:00
Osoitz
bba6b96765 Translated using Weblate (Basque)
Currently translated at 100.0% (373 of 373 strings)
2018-05-29 16:58:04 +02:00
John Zhen Mo
740116356c -Fixed media session activation.
-Removed redundant setShuffle call in media session callback and its user.
-Removed unused dummy playback preparer.
2018-05-28 20:02:02 -07:00
monolifed
2f6e4fa4a3 Translated using Weblate (Turkish)
Currently translated at 100.0% (373 of 373 strings)
2018-05-28 20:44:52 +02:00
Allan Nordhøy
fb3f6721b2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 95.9% (358 of 373 strings)
2018-05-28 17:41:18 +02:00
AB
4e7bd21e5c Translated using Weblate (Ukrainian)
Currently translated at 100.0% (373 of 373 strings)
2018-05-28 17:07:13 +02:00
Jeff Huang
219c2030b9 Translated using Weblate (漢語(正體字))
Currently translated at 100.0% (373 of 373 strings)
2018-05-28 08:56:18 +02:00
Marc Riera
b75fdb4566 Translated using Weblate (català)
Currently translated at 100,0% (373 of 373 strings)
2018-05-28 08:41:52 +02:00
Nathan Follens
4584b14a31 Translated using Weblate (Vlaams)
Currently translated at 100,0% (373 of 373 strings)
2018-05-28 07:53:32 +02:00
thami simo
814ddb5932 Translated using Weblate (Arabic)
Currently translated at 100.0% (373 of 373 strings)
2018-05-28 07:45:58 +02:00
DafabHoid
6ea0f6290a Downloader: Notify the progress every 64K instead of every 512 Bytes
This improves downloading performance dramatically when cpu bound:
Before, even a high-end cpu from 2013 can't download faster than around 1MB/s.
The bigger read buffer size removes the need for a dedicated BufferedInputStream.
2018-05-28 01:07:30 +02:00
monolifed
c796fe1fe6 Translated using Weblate (Turkish)
Currently translated at 100.0% (373 of 373 strings)
2018-05-27 19:49:08 +02:00
Heimen Stoffels
a452a164e6 Translated using Weblate (Dutch)
Currently translated at 100.0% (373 of 373 strings)
2018-05-27 18:00:16 +02:00
ssantos
0d9dd69b19 Translated using Weblate (Deutsch)
Currently translated at 100,0% (373 of 373 strings)
2018-05-27 17:51:41 +02:00
Eduardo Caron
d7b73c18f1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (373 of 373 strings)
2018-05-27 15:14:19 +02:00
Weblate
07f66c0e45 Merge branch 'dev' into weblate-merge-tmp 2018-05-27 15:11:40 +02:00
monolifed
d449acbf86 Translated using Weblate (Turkish)
Currently translated at 99.4% (369 of 371 strings)
2018-05-27 15:11:40 +02:00
Allan Nordhøy
fce416ba76 Translated using Weblate (Norwegian Bokmål)
Currently translated at 96.2% (357 of 371 strings)
2018-05-27 15:11:35 +02:00
dadosch
cb6bfe8556 Translated using Weblate (German)
Currently translated at 100.0% (371 of 371 strings)
2018-05-27 15:11:35 +02:00
Florian
d7b31e1d25 Translated using Weblate (French)
Currently translated at 98.6% (366 of 371 strings)
2018-05-27 15:11:34 +02:00
Eduardo Caron
85057376d6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (371 of 371 strings)
2018-05-27 15:11:31 +02:00
Christian Schabesberger
c43ac7c869 fix conflict 2018-05-27 13:30:23 +02:00
Heimen Stoffels
b2657315f1 Translated using Weblate (Dutch)
Currently translated at 100.0% (371 of 371 strings)
2018-05-27 12:36:08 +02:00
ezjerry liao
de5ed9717c Translated using Weblate (漢語(正體字))
Currently translated at 100.0% (371 of 371 strings)
2018-05-27 01:18:13 +02:00
Ali Demirtas
e17a6cbb9f Translated using Weblate (Turkish)
Currently translated at 100.0% (371 of 371 strings)
2018-05-27 00:07:08 +02:00
Marc Riera
8e783b774b Translated using Weblate (català)
Currently translated at 100,0% (371 of 371 strings)
2018-05-27 00:03:34 +02:00
AB
733663f40d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (371 of 371 strings)
2018-05-26 22:34:26 +02:00
Ali Demirtas
4b2a792a62 Translated using Weblate (Türkçe)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 21:01:30 +02:00
dadosch
f7aa171d01 Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)

informal "du"
2018-05-26 15:14:27 +02:00
dadosch
5eafefb683 Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 15:12:02 +02:00
dadosch
5d1b02a856 Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)

informal "du"
2018-05-26 15:08:29 +02:00
dadosch
4acda3d9ae Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 15:07:50 +02:00
dadosch
643e10ace2 Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)

informal "du"
2018-05-26 15:04:45 +02:00
dadosch
7b64a232de Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 15:00:23 +02:00
dadosch
d7472d837d Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)

informal "du"
2018-05-26 14:57:32 +02:00
dadosch
94b473ab4b Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 14:56:36 +02:00
dadosch
4a05bbb6c8 Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 14:45:26 +02:00
Linux User
0343659b35 Translated using Weblate (Deutsch)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 14:45:21 +02:00
Nathan Follens
f38eadbe30 Translated using Weblate (Vlaams)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 09:32:42 +02:00
Nathan Follens
eb29a53ac5 Translated using Weblate (Nederlands)
Currently translated at 100,0% (371 of 371 strings)
2018-05-26 09:29:31 +02:00
Weblate
bc71e260e2 Merge branch 'dev' into weblate-merge-tmp 2018-05-26 08:38:30 +02:00
Bogdan Khomutsky
ddf23a3443 Translated using Weblate (Russian)
Currently translated at 100.0% (365 of 365 strings)
2018-05-26 08:38:30 +02:00
Dual Natan
d41b248d1c Translated using Weblate (Macedonian)
Currently translated at 100.0% (365 of 365 strings)
2018-05-26 08:38:29 +02:00
SN
a025b25933 Translated using Weblate (Hindi)
Currently translated at 83.0% (303 of 365 strings)
2018-05-26 08:38:28 +02:00
Charlotte Lewer
c9a52a6088 Translated using Weblate (Esperanto)
Currently translated at 25.2% (92 of 365 strings)
2018-05-26 08:38:28 +02:00
My Account
0276dca406 Translated using Weblate (Hindi)
Currently translated at 83.0% (303 of 365 strings)
2018-05-26 08:38:22 +02:00
James Straub
646fa877ba Update to mobile data limiting
- Moved non-key strings from string_keys.xml to strings.xml
- Code style changes
- Replaced a hard coded key string with resource constant
2018-04-22 10:20:19 -04:00
James Straub
d1b0cd74be Added the ability to limit video quality if using mobile data.
* Added a dropdown to video & audio settings
* Changes to ListHelper:
** Limits resolution when code requests the default video resolution
** Limits audio bitrate when code requests the default audio bitrate
** Removed some dead code and did some cleanup
** Make methods private/protected to help understand what was in use
** The code now chooses one format over an other using a simple raking system defined in array constants. I realized I needed to do this in order to choose the most efficient video stream. I did my best to evaluate the video and audio formats based on quality and efficiency. It's not an exact science.
** Made changes to the tests to support my changes
2018-04-21 12:35:04 -04:00
37 changed files with 802 additions and 306 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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);
}
/*//////////////////////////////////////////////////////////////////////////

View File

@@ -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();
}
}

View File

@@ -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);
}
}
}

View File

@@ -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) {
}
}

View File

@@ -13,5 +13,4 @@ public interface MediaSessionCallback {
void onPlay();
void onPause();
void onSetShuffle(final boolean isShuffled);
}

View File

@@ -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);
}
}

View File

@@ -69,9 +69,4 @@ public class BasePlayerMediaSession implements MediaSessionCallback {
public void onPause() {
player.onPause();
}
@Override
public void onSetShuffle(boolean isShuffled) {
player.onShuffleModeEnabledChanged(isShuffled);
}
}

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 lhistorique 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 dinstellingen 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.
\nt Privacybeleid van NewPipe legd in detail uit welke gegevens da der worden verzonden en opgeslagen wanneer da geen crashrappor indiend.</string>
<string name="read_privacy_policy">Privacybeleid lezen</string>
<string name="start_accept_privacy_policy">Voor dEuropese privacywet (ook wel GDPR genoemd) na te leven, wijzen wu 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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">ı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">ılır pencere boyutunu ve yerini anımsa</string>
<string name="popup_remember_size_pos_summary">ılır pencerenin ayarlandığı son boyutu ve yeri anımsa</string>
<string name="popup_remember_size_pos_title">ılır pencere boyutunu ve konumunu hatırla</string>
<string name="popup_remember_size_pos_summary">ılır pencerenin ayarlandığı son boyutu ve konumu hatırla</string>
<string name="settings_category_popup_title">ı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">ı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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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"

View File

@@ -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));
}
}

View 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